jM
½{"name":"EncodedFiles","files":[{"name":"ContractsManagerAD6.html","size":36208,"type":"text/html","content":"Y2xhc3MgQ29udGFjdHNNYW5hZ2VyIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIC8vIExvYWQgZnJvbSBsb2NhbFN0b3JhZ2Ugb3IgZGVmYXVsdCB0byBlbXB0eSBvYmplY3QKICAgIHRoaXMuY29udGFjdHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb250YWN0cyIpIHx8ICJ7fSIpOwogICAgdGhpcy5pbml0U3R5bGVzKCk7CiAgfQoKLy8gRGVmaW5lIGVtb2ppIGNvZGVzIGFuZCBmb2xkZXIgY29uZmlnCiAgICB0aGlzLkVNT0pJX0NPREVTID0gewogICAgICBJTkJPWDogIvCfk6UiLAogICAgICBTRU5UOiAi8J+TpCIsCiAgICAgIEFSQ0hJVkU6ICLwn5OmIiwKICAgICAgVFJBU0g6ICLwn5eR77iPIgogICAgfTsKICAgIAogICAgdGhpcy5TWVNURU1fRk9MREVSUyA9IHsKICAgICAgSU5CT1g6ICJSIiwKICAgICAgU0VOVDogIlMiLAogICAgICBBUkNISVZFOiAiQSIsCiAgICAgIFRSQVNIOiAiVCIKICAgIH07CiAgfQoKICAvLyBBZGQgdHdlbW9qaSBoZWxwZXIgaWYgbm90IHVzaW5nIHRoZSBsaWJyYXJ5CiAgcmVuZGVyRW1vamkoY29udGVudCkgewogICAgcmV0dXJuIGNvbnRlbnQ7IC8vIFNpbXBsZSBmYWxsYmFjayBpZiB0d2Vtb2ppIGlzbid0IGF2YWlsYWJsZQogIH0KICAvLyAtLS0tLS0tLS0tIDEuIFNUWUxFUyAtLS0tLS0tLS0tCiAgaW5pdFN0eWxlcygpIHsKICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIHN0eWxlLnRleHRDb250ZW50ID0gYAogICAgICAvKiBCYXNpYyBidXR0b24gJiBtb2RhbCBzdHlsZXMgKi8KICAgICAgLmJ0biB7CiAgICAgICAgcGFkZGluZzogMC41cmVtIDFyZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTsKICAgICAgfQogICAgICAuYnRuLXByaW1hcnkgewogICAgICAgIGJhY2tncm91bmQ6ICMzYjgyZjY7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgIC5idG4tc2Vjb25kYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjOWNhM2FmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgICAuYnRuLWRhbmdlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2VmNDQ0NDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5tb2RhbCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgfQogICAgICAubW9kYWwtY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgcGFkZGluZzogMS41cmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTsKICAgICAgICB3aWR0aDogOTAlOwogICAgICAgIG1heC13aWR0aDogNjAwcHg7CiAgICAgICAgbWF4LWhlaWdodDogOTB2aDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5pbnB1dC1ncm91cCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICAgICAgfQogICAgICAuaW5wdXQtZ3JvdXAgbGFiZWwgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAjMzc0MTUxOwogICAgICB9CiAgICAgIC5pbnB1dC1ncm91cCBpbnB1dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcGFkZGluZzogMC41cmVtOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTsKICAgICAgICBmb250LXNpemU6IDFyZW07CiAgICAgIH0KICAgICAgLmJ0bi1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGdhcDogMC41cmVtOwogICAgICB9CgogICAgICAvKiBDb250YWN0cyBsaXN0ICovCiAgICAgIC5jb250YWN0cy1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDFyZW07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTdlYjsKICAgICAgfQogICAgICAuY29udGFjdC1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAxcmVtOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlN2ViOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuY29udGFjdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiOwogICAgICB9CiAgICAgIC5jb250YWN0LW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIG1hcmdpbi1ib3R0b206IDAuMjVyZW07CiAgICAgIH0KICAgICAgLmNvbnRhY3QtYWRkcmVzcywKICAgICAgLmNvbnRhY3QtZW1haWwsCiAgICAgIC5jb250YWN0LXBob25lLAogICAgICAuY29udGFjdC1wcm9maWxlIHsKICAgICAgICBmb250LXNpemU6IDAuODVyZW07CiAgICAgICAgY29sb3I6ICM2YjcyODA7CiAgICAgIH0KICAgIGA7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsKICB9CgogIC8vIC0tLS0tLS0tLS0gMi4gSU5JVElBTElaRSAtLS0tLS0tLS0tCiAgaW5pdGlhbGl6ZSgpIHsKICAgIGNvbnNvbGUubG9nKCJDb250YWN0c01hbmFnZXI6IGxvYWRpbmcgZnJvbSBsb2NhbFN0b3JhZ2UiKTsKICAgIHRoaXMuY29udGFjdHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb250YWN0cyIpIHx8ICJ7fSIpOwoKICAgIC8vIEV4cG9zZSBnbG9iYWxseSBmb3IgZWFzeSBhY2Nlc3MKICAgIHdpbmRvdy51bmlmaWVkQ29udGFjdHNNYW5hZ2VyID0gdGhpczsKICAgIHdpbmRvdy5zaG93Q29udGFjdHMgPSAoKSA9PiB0aGlzLnNob3dDb250YWN0c0xpc3QoKTsKICAgIGNvbnNvbGUubG9nKCJDb250YWN0c01hbmFnZXI6IEluaXRpYWxpemVkIik7CgogICAgLy8gQ2hlY2sgZm9yIHdhbGxldCBpbmZvIGFuZCBhdXRvbWF0aWNhbGx5IHNldCB1cCB0aGUgc2VsZiBjb250YWN0LgogICAgdGhpcy5zZXR1cFNlbGZDb250YWN0KCk7CgogICAgLy8gVXBkYXRlIHRoZSBoZWFkZXIgcHJvZmlsZSBhY2NvcmRpbmdseS4KICAgIHRoaXMudXBkYXRlSGVhZGVyUHJvZmlsZSgpOwogIH0KCiAgLyoqCiAgICogc2V0dXBTZWxmQ29udGFjdDoKICAgKiBDaGVja3MgaWYgYSB3YWxsZXQgZXhpc3RzIGluIGxvY2FsU3RvcmFnZS4gSWYgeWVzLCB0aGVuIHZlcmlmaWVzIHdoZXRoZXIgYSBzZWxmCiAgICogY29udGFjdCAodHlwZSAiUyIpIGFscmVhZHkgZXhpc3RzLiBJZiBub3QsIGl0IGNyZWF0ZXMgb25lIGF1dG9tYXRpY2FsbHkuCiAgICovCiAgc2V0dXBTZWxmQ29udGFjdCgpIHsKICAgIGNvbnN0IHdhbGxldCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ3YWxsZXRBZGRyZXNzIik7CiAgICBpZiAoIXdhbGxldCkgewogICAgICBhbGVydCgiTm8gd2FsbGV0IGZvdW5kLiBQbGVhc2UgY3JlYXRlIG9yIHJlc3RvcmUgYSB3YWxsZXQgdG8gc2V0IHVwIHlvdXIgcHJvZmlsZS4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IHByaXZhdGVLZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmF0ZUtleSIpIHx8ICIiOwogICAgaWYgKCF0aGlzLmNvbnRhY3RzW3dhbGxldF0gfHwgdGhpcy5jb250YWN0c1t3YWxsZXRdLnR5cGUgIT09ICJTIikgewogICAgICB0aGlzLmNvbnRhY3RzW3dhbGxldF0gPSB7CiAgICAgICAgYWRkcmVzczogd2FsbGV0LAogICAgICAgIG5hbWU6ICJNeSBXYWxsZXQiLAogICAgICAgIHR5cGU6ICJTIiwKICAgICAgICBwcml2YXRlS2V5OiBwcml2YXRlS2V5LAogICAgICAgIGVtYWlsOiAiIiwKICAgICAgICBwaG9uZTogIiIsCiAgICAgICAgcHJvZmlsZTogIiIsCiAgICAgICAgaW1hZ2U6ICIiLAogICAgICAgIG1lc3NhZ2VCbG9ja3M6IFtdIC8vIHN0b3JlIGRlcGxveWVkIGJsb2NrIHR4aWRzCiAgICAgIH07CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb250YWN0cyIsIEpTT04uc3RyaW5naWZ5KHRoaXMuY29udGFjdHMpKTsKICAgICAgY29uc29sZS5sb2coIlNlbGYgY29udGFjdCBjcmVhdGVkIGZvciB3YWxsZXQiLCB3YWxsZXQpOwogICAgfSBlbHNlIHsKICAgICAgLy8gT3B0aW9uYWxseSB1cGRhdGUgcHJpdmF0ZSBrZXkgaWYgY2hhbmdlZC4KICAgICAgaWYgKHByaXZhdGVLZXkgJiYgdGhpcy5jb250YWN0c1t3YWxsZXRdLnByaXZhdGVLZXkgIT09IHByaXZhdGVLZXkpIHsKICAgICAgICB0aGlzLmNvbnRhY3RzW3dhbGxldF0ucHJpdmF0ZUtleSA9IHByaXZhdGVLZXk7CiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbnRhY3RzIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5jb250YWN0cykpOwogICAgICAgIGNvbnNvbGUubG9nKCJTZWxmIGNvbnRhY3QgdXBkYXRlZCB3aXRoIG5ldyBwcml2YXRlIGtleSBmb3Igd2FsbGV0Iiwgd2FsbGV0KTsKICAgICAgfQogICAgfQogIH0KCgogIC8vIC0tLS0tLS0tLS0gMy4gSEVBREVSIFBST0ZJTEUgVVBEQVRFIC0tLS0tLS0tLS0KICB1cGRhdGVIZWFkZXJQcm9maWxlKCkgewogICAgY29uc3QgYWRkcmVzcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ3YWxsZXRBZGRyZXNzIik7CiAgICBpZiAoIWFkZHJlc3MpIHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVzZXJQcm9maWxlQ29udGFpbmVyIikuaW5uZXJIVE1MID0gIiI7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvbnRhY3QgPSB0aGlzLmNvbnRhY3RzW2FkZHJlc3NdOwogICAgaWYgKCFjb250YWN0IHx8IGNvbnRhY3QudHlwZSAhPT0gIlMiKSB7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1c2VyUHJvZmlsZUNvbnRhaW5lciIpLmlubmVySFRNTCA9ICIiOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGNvbnRhY3QubmFtZSB8fCAiTXkgV2FsbGV0IjsKICAgIGNvbnN0IHNob3J0QWRkciA9IGFkZHJlc3Muc3Vic3RyaW5nKDAsIDYpICsgIi4uLiI7CiAgICBjb25zdCB1c2VySW1hZ2UgPSBjb250YWN0LmltYWdlCiAgICAgID8gY29udGFjdC5pbWFnZQogICAgICA6ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMG5OakFuSUdobGFXZG9kRDBuTmpBbklIWnBaWGRDYjNnOUp6QWdNQ0F4TWpnZ01USTRKeUJtYVd4c1BTY2pZMk5qWTJOakp6NDhZMmx5WTJ4bElHTjRQU2MyTkNjZ1kzazlKelkwSnlCeVBTYzJOQ2N2UGp3dmMzWm5QZz09IjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1c2VyUHJvZmlsZUNvbnRhaW5lciIpLmlubmVySFRNTCA9IGAKICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgY3Vyc29yOiBwb2ludGVyOyIKICAgICAgICAgICBvbmNsaWNrPSJ1bmlmaWVkQ29udGFjdHNNYW5hZ2VyLnNob3dDb250YWN0TW9kYWwoJyR7YWRkcmVzc30nLCAnUycpIj4KICAgICAgICA8aW1nIHNyYz0iJHt1c2VySW1hZ2V9IiBhbHQ9IlByb2ZpbGUiIHN0eWxlPSJ3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4OyBib3JkZXItcmFkaXVzOiA1MCU7IG1hcmdpbi1yaWdodDogOHB4OyI+CiAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsiPgogICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMXJlbTsiPiR7ZGlzcGxheU5hbWV9PC9zcGFuPgogICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2U1ZTdlYjsiPiR7c2hvcnRBZGRyfTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KCiAgLy8gLS0tLS0tLS0tLSA0LiBDT05UQUNUIExJU1QgRElTUExBWSAtLS0tLS0tLS0tCiAgc2hvd0NvbnRhY3RzTGlzdCgpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZXNzYWdlTGlzdCIpOwogICAgaWYgKCFjb250YWluZXIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRWxlbWVudCAjbWVzc2FnZUxpc3Qgbm90IGZvdW5kIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBodG1sID0gYAogICAgICA8ZGl2IGNsYXNzPSJjb250YWN0cy1oZWFkZXIiPgogICAgICAgIDxoMj5Db250YWN0czwvaDI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJ1bmlmaWVkQ29udGFjdHNNYW5hZ2VyLnNob3dDb250YWN0TW9kYWwoJycsICdDJykiPkFkZCBDb250YWN0PC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJ1bmlmaWVkQ29udGFjdHNNYW5hZ2VyLnNob3dDb250YWN0TW9kYWwoJycsICdTJykiPkFkZCBTZWxmPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIGNvbnN0IGFkZHJlc3NlcyA9IE9iamVjdC5rZXlzKHRoaXMuY29udGFjdHMpOwogICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHsKICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IHBhZGRpbmc6MXJlbTsgY29sb3I6IzZiNzI4MDsiPk5vIGNvbnRhY3RzIGZvdW5kPC9kaXY+YDsKICAgIH0gZWxzZSB7CiAgICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9ImNvbnRhY3RzLWxpc3QiPmA7CiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBhZGRyZXNzZXMpIHsKICAgICAgICBjb25zdCBjID0gdGhpcy5jb250YWN0c1thZGRyZXNzXTsKICAgICAgICBjb25zdCBsYWJlbCA9IChjLnR5cGUgPT09ICJTIikgPyAiW1NlbGZdIiA6ICIiOwogICAgICAgIGh0bWwgKz0gYAogICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFjdC1pdGVtIiBvbmNsaWNrPSJ1bmlmaWVkQ29udGFjdHNNYW5hZ2VyLnNob3dDb250YWN0RGV0YWlscygnJHthZGRyZXNzfScpIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFjdC1uYW1lIj4ke2MubmFtZSB8fCBhZGRyZXNzfSAke2xhYmVsfTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWN0LWFkZHJlc3MiPiR7YWRkcmVzc308L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgIH0KICAgICAgaHRtbCArPSBgPC9kaXY+YDsKICAgIH0KICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwogIH0KCiAgc2hvd0NvbnRhY3REZXRhaWxzKGFkZHJlc3MpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZXNzYWdlTGlzdCIpOwogICAgaWYgKCFjb250YWluZXIpIHJldHVybjsKICAgIGNvbnN0IGNvbnRhY3QgPSB0aGlzLmNvbnRhY3RzW2FkZHJlc3NdOwogICAgaWYgKCFjb250YWN0KSByZXR1cm47CiAgICBsZXQgaHRtbCA9IGAKICAgICAgPGRpdiBjbGFzcz0iY29udGFjdHMtaGVhZGVyIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgb25jbGljaz0idW5pZmllZENvbnRhY3RzTWFuYWdlci5zaG93Q29udGFjdHNMaXN0KCkiPkJhY2s8L2J1dHRvbj4KICAgICAgICA8aDI+JHtjb250YWN0Lm5hbWUgfHwgYWRkcmVzc308L2gyPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgb25jbGljaz0idW5pZmllZENvbnRhY3RzTWFuYWdlci5zaG93Q29udGFjdE1vZGFsKCcke2FkZHJlc3N9JywgJyR7Y29udGFjdC50eXBlfScpIj5FZGl0PC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOjFyZW07Ij4KICAgICAgICA8ZGl2PjxzdHJvbmc+QWRkcmVzczo8L3N0cm9uZz4gJHthZGRyZXNzfTwvZGl2PgogICAgICAgICR7Y29udGFjdC5lbWFpbCA/IGA8ZGl2PjxzdHJvbmc+RW1haWw6PC9zdHJvbmc+ICR7Y29udGFjdC5lbWFpbH08L2Rpdj5gIDogIiJ9CiAgICAgICAgJHtjb250YWN0LnBob25lID8gYDxkaXY+PHN0cm9uZz5QaG9uZTo8L3N0cm9uZz4gJHtjb250YWN0LnBob25lfTwvZGl2PmAgOiAiIn0KICAgICAgICAke2NvbnRhY3QucHJvZmlsZSA/IGA8ZGl2PjxzdHJvbmc+UHJvZmlsZTo8L3N0cm9uZz4gJHtjb250YWN0LnByb2ZpbGV9PC9kaXY+YCA6ICIifQogICAgICAgICR7Y29udGFjdC50eXBlID09PSAiUyIgPyBgPGRpdj48c3Ryb25nPlNlbGYgLyBXYWxsZXQgUHJpdmF0ZUtleTo8L3N0cm9uZz4gJHtjb250YWN0LnByaXZhdGVLZXkgfHwgIiJ9PC9kaXY+YCA6ICIifQogICAgICAgICR7Y29udGFjdC5pbWFnZSA/IGA8aW1nIHNyYz0iJHtjb250YWN0LmltYWdlfSIgYWx0PSJDb250YWN0IiBzdHlsZT0id2lkdGg6ODBweDsgaGVpZ2h0OjgwcHg7IGJvcmRlci1yYWRpdXM6NTAlOyBtYXJnaW4tdG9wOjFyZW07Ij5gIDogIiJ9CiAgICAgICAgJHsKICAgICAgICAgIGNvbnRhY3QudHlwZSA9PT0gIlMiICYmIGNvbnRhY3QubWVzc2FnZUJsb2NrcwogICAgICAgICAgICA/IGA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjFyZW07Ij48c3Ryb25nPkFyY2hpdmVkIEJsb2Nrczo8L3N0cm9uZz48YnI+JHtjb250YWN0Lm1lc3NhZ2VCbG9ja3MubWFwKGIgPT4gYi50eGlkKS5qb2luKCI8YnI+Iil9PC9kaXY+YAogICAgICAgICAgICA6ICIiCiAgICAgICAgfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKICB9CgogIC8vIC0tLS0tLS0tLS0gNS4gQ09OVEFDVCBNT0RBTCAoQUREL0VESVQpIC0tLS0tLS0tLS0KICBzaG93Q29udGFjdE1vZGFsKGFkZHJlc3MgPSAiIiwgY29udGFjdFR5cGUgPSAiQyIpIHsKICAgIGxldCBjb250YWN0ID0ge307CiAgICBpZiAoYWRkcmVzcyAmJiB0aGlzLmNvbnRhY3RzW2FkZHJlc3NdKSB7CiAgICAgIGNvbnRhY3QgPSB0aGlzLmNvbnRhY3RzW2FkZHJlc3NdOwogICAgICBjb250YWN0VHlwZSA9IGNvbnRhY3QudHlwZSB8fCAiQyI7CiAgICB9CiAgICBjb25zdCBpc1NlbGYgPSAoY29udGFjdFR5cGUgPT09ICJTIik7CiAgICBjb25zdCBtb2RhbEhUTUwgPSBgCiAgICAgIDxkaXYgaWQ9ImNvbnRhY3RNb2RhbCIgY2xhc3M9Im1vZGFsIiBzdHlsZT0iZGlzcGxheTpmbGV4OyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICA8aDI+JHthZGRyZXNzID8gIkVkaXQgQ29udGFjdCIgOiAoaXNTZWxmID8gIkFkZCBTZWxmIiA6ICJBZGQgQ29udGFjdCIpfTwvaDI+CiAgICAgICAgICAkewogICAgICAgICAgICBpc1NlbGYgJiYgIWFkZHJlc3MgPyBgCiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMS41cmVtOyBwYWRkaW5nOiAxcmVtOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNGY2OyBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViOyBib3JkZXItcmFkaXVzOiAwLjVyZW07Ij4KICAgICAgICAgICAgICAgIDxoMyBzdHlsZT0iZm9udC1zaXplOiAxcmVtOyBmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAwLjVyZW07Ij5JbXBvcnRhbnQgSW5mb3JtYXRpb246PC9oMz4KICAgICAgICAgICAgICAgIDx1bCBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEuMjVyZW07IGxpc3Qtc3R5bGUtdHlwZTogZGlzYzsiPgogICAgICAgICAgICAgICAgICA8bGkgc3R5bGU9Im1hcmdpbi1ib3R0b206IDAuNXJlbSI+QWxyZWFkeSBoYXZlIGEgQlNWIGFkZHJlc3M/IENsaWNrICJSZXN0b3JlIFdhbGxldCIgYmVsb3cgdG8gaW1wb3J0IGl0LjwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaSBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMC41cmVtIj5DcmVhdGluZyBhIG5ldyBhZGRyZXNzIGVzdGFibGlzaGVzIGEgbmV3IGlkZW50aXR5IGFjY291bnQuPC9saT4KICAgICAgICAgICAgICAgICAgPGxpPk5ldyBhY2NvdW50cyByZWNlaXZlIDE1MDAgc2F0b3NoaXMgdG8gc3RhcnQgdXNpbmcgQmxvY2ttYWlsIGltbWVkaWF0ZWx5LjwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogJycKICAgICAgICAgIH0KICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgICAgPGxhYmVsPlR5cGU8L2xhYmVsPgogICAgICAgICAgICA8c2VsZWN0IGlkPSJjb250YWN0VHlwZUlucHV0Ij4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJDIiAke2NvbnRhY3RUeXBlID09PSAnQycgPyAnc2VsZWN0ZWQnIDogJyd9PkNvbnRhY3Q8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTIiAke2NvbnRhY3RUeXBlID09PSAnUycgPyAnc2VsZWN0ZWQnIDogJyd9PlNlbGYgKFdhbGxldCk8L29wdGlvbj4KICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgICAgPGxhYmVsPkJsb2NrY2hhaW4gQWRkcmVzcyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+Kjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImNvbnRhY3RBZGRyZXNzSW5wdXQiIHZhbHVlPSIke2FkZHJlc3N9IiAke2FkZHJlc3MgPyAicmVhZG9ubHkiIDogIiJ9PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICAgIDxsYWJlbD5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjb250YWN0TmFtZUlucHV0IiB2YWx1ZT0iJHtjb250YWN0Lm5hbWUgfHwgIiJ9Ij4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAiPgogICAgICAgICAgICA8bGFiZWw+RW1haWw8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iZW1haWwiIGlkPSJjb250YWN0RW1haWxJbnB1dCIgdmFsdWU9IiR7Y29udGFjdC5lbWFpbCB8fCAiIn0iPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICAgIDxsYWJlbD5QaG9uZTwvbGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZWwiIGlkPSJjb250YWN0UGhvbmVJbnB1dCIgdmFsdWU9IiR7Y29udGFjdC5waG9uZSB8fCAiIn0iPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICAgIDxsYWJlbD5Qcm9maWxlPC9sYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjb250YWN0UHJvZmlsZUlucHV0IiB2YWx1ZT0iJHtjb250YWN0LnByb2ZpbGUgfHwgIiJ9Ij4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAiPgogICAgICAgICAgICA8bGFiZWw+UHJvZmlsZSBJbWFnZTwvbGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iY29udGFjdEltYWdlSW5wdXQiIGFjY2VwdD0iaW1hZ2UvKiI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICR7CiAgICAgICAgICAgIGlzU2VsZgogICAgICAgICAgICAgID8gYDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgICAgICAgICAgPGxhYmVsPlByaXZhdGUgS2V5IChXSUYpPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjb250YWN0UHJpdmF0ZUtleUlucHV0IiB2YWx1ZT0iJHtjb250YWN0LnByaXZhdGVLZXkgfHwgIiJ9IiBwbGFjZWhvbGRlcj0iT3B0aW9uYWwiPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tZ3JvdXAiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjFyZW07Ij4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJ1bmlmaWVkQ29udGFjdHNNYW5hZ2VyLmNyZWF0ZVdhbGxldCgpIj5DcmVhdGUgV2FsbGV0PC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgb25jbGljaz0idW5pZmllZENvbnRhY3RzTWFuYWdlci5yZXN0b3JlV2FsbGV0KCkiPlJlc3RvcmUgV2FsbGV0PC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgb25jbGljaz0idW5pZmllZENvbnRhY3RzTWFuYWdlci5zYXZlV2FsbGV0RmlsZSgpIj5TYXZlIFdhbGxldDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWRhbmdlciIgb25jbGljaz0idW5pZmllZENvbnRhY3RzTWFuYWdlci5kZWxldGVXYWxsZXQoKSI+RGVsZXRlIFdhbGxldDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgb25jbGljaz0idW5pZmllZENvbnRhY3RzTWFuYWdlci5zYXZlQW5kRGVwbG95TWVzc2FnZXMoKSI+RGVwbG95IEFyY2hpdmU8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PmAKICAgICAgICAgICAgICA6ICIiCiAgICAgICAgICB9CiAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tZ3JvdXAiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgb25jbGljaz0idW5pZmllZENvbnRhY3RzTWFuYWdlci5oaWRlQ29udGFjdE1vZGFsKCkiPkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9InVuaWZpZWRDb250YWN0c01hbmFnZXIuc2F2ZUNvbnRhY3RNb2RhbCgpIj5TYXZlPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFjdE1vZGFsIik7CiAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpOwogICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsIG1vZGFsSFRNTCk7CiAgfQoKICBoaWRlQ29udGFjdE1vZGFsKCkgewogICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFjdE1vZGFsIik7CiAgICBpZiAobW9kYWwpIG1vZGFsLnJlbW92ZSgpOwogIH0KCiAgLy8gLS0tLS0tLS0tLSA2LiBJTUFHRSBDT05WRVJTSU9OIC0tLS0tLS0tLS0KICBjb252ZXJ0SW1hZ2VUb1dlYlAoZmlsZSwgcXVhbGl0eSA9IDAuNywgbWF4V2lkdGggPSA4MCwgbWF4SGVpZ2h0ID0gODApIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0OwogICAgICByZWFkZXIub25sb2FkID0gKCkgPT4gewogICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpOwogICAgICAgIGltZy5vbmVycm9yID0gcmVqZWN0OwogICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICBsZXQgd2lkdGggPSBpbWcud2lkdGg7CiAgICAgICAgICBsZXQgaGVpZ2h0ID0gaW1nLmhlaWdodDsKICAgICAgICAgIGNvbnN0IHJhdGlvID0gTWF0aC5taW4obWF4V2lkdGggLyB3aWR0aCwgbWF4SGVpZ2h0IC8gaGVpZ2h0LCAxKTsKICAgICAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIHJhdGlvKTsKICAgICAgICAgIGhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0ICogcmF0aW8pOwogICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgIGNvbnN0IGRhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKCJpbWFnZS93ZWJwIiwgcXVhbGl0eSk7CiAgICAgICAgICByZXNvbHZlKGRhdGFVUkwpOwogICAgICAgIH07CiAgICAgICAgaW1nLnNyYyA9IHJlYWRlci5yZXN1bHQ7CiAgICAgIH07CiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpOwogICAgfSk7CiAgfQoKICAvLyAtLS0tLS0tLS0tIDcuIFNBVkUgLyBVUERBVEUgQ09OVEFDVCAtLS0tLS0tLS0tCiAgc2F2ZUNvbnRhY3RNb2RhbCgpIHsKICAgIGNvbnN0IHR5cGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250YWN0VHlwZUlucHV0Iik7CiAgICBjb25zdCBhZGRyZXNzSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFjdEFkZHJlc3NJbnB1dCIpOwogICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhY3ROYW1lSW5wdXQiKTsKICAgIGNvbnN0IGVtYWlsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFjdEVtYWlsSW5wdXQiKTsKICAgIGNvbnN0IHBob25lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFjdFBob25lSW5wdXQiKTsKICAgIGNvbnN0IHByb2ZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250YWN0UHJvZmlsZUlucHV0Iik7CiAgICBjb25zdCBpbWFnZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhY3RJbWFnZUlucHV0Iik7CgogICAgY29uc3QgY29udGFjdFR5cGUgPSAodHlwZUlucHV0LnZhbHVlIHx8ICJDIikudHJpbSgpOwogICAgY29uc3QgYWRkcmVzcyA9IGFkZHJlc3NJbnB1dC52YWx1ZS50cmltKCk7CiAgICBpZiAoIWFkZHJlc3MpIHsKICAgICAgYWxlcnQoIkJsb2NrY2hhaW4gYWRkcmVzcyBpcyByZXF1aXJlZCIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgbmV3Q29udGFjdCA9IHsKICAgICAgYWRkcmVzcywKICAgICAgbmFtZTogbmFtZUlucHV0LnZhbHVlLnRyaW0oKSwKICAgICAgZW1haWw6IGVtYWlsSW5wdXQudmFsdWUudHJpbSgpLAogICAgICBwaG9uZTogcGhvbmVJbnB1dC52YWx1ZS50cmltKCksCiAgICAgIHByb2ZpbGU6IHByb2ZpbGVJbnB1dC52YWx1ZS50cmltKCksCiAgICAgIHR5cGU6IGNvbnRhY3RUeXBlCiAgICB9OwoKICAgIGlmIChjb250YWN0VHlwZSA9PT0gIlMiKSB7CiAgICAgIGNvbnN0IHByaXZhdGVLZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250YWN0UHJpdmF0ZUtleUlucHV0Iik7CiAgICAgIG5ld0NvbnRhY3QucHJpdmF0ZUtleSA9IHByaXZhdGVLZXlJbnB1dC52YWx1ZS50cmltKCkgfHwgIiI7CiAgICAgIGlmICghdGhpcy5jb250YWN0c1thZGRyZXNzXT8udXVpZCkgewogICAgICAgIG5ld0NvbnRhY3QudXVpZCA9IHRoaXMuZ2VuZXJhdGVVVUlEKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3Q29udGFjdC51dWlkID0gdGhpcy5jb250YWN0c1thZGRyZXNzXS51dWlkOwogICAgICB9CiAgICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIG1lc3NhZ2VCbG9ja3MgaWYgdGhleSBleGlzdAogICAgICBpZiAodGhpcy5jb250YWN0c1thZGRyZXNzXT8ubWVzc2FnZUJsb2NrcykgewogICAgICAgIG5ld0NvbnRhY3QubWVzc2FnZUJsb2NrcyA9IHRoaXMuY29udGFjdHNbYWRkcmVzc10ubWVzc2FnZUJsb2NrczsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdDb250YWN0Lm1lc3NhZ2VCbG9ja3MgPSBbXTsKICAgICAgfQogICAgfQoKICAgIGlmIChpbWFnZUlucHV0ICYmIGltYWdlSW5wdXQuZmlsZXMgJiYgaW1hZ2VJbnB1dC5maWxlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGZpbGUgPSBpbWFnZUlucHV0LmZpbGVzWzBdOwogICAgICB0aGlzLmNvbnZlcnRJbWFnZVRvV2ViUChmaWxlLCAwLjcsIDgwLCA4MCkKICAgICAgICAudGhlbigoZGF0YVVSTCkgPT4gewogICAgICAgICAgbmV3Q29udGFjdC5pbWFnZSA9IGRhdGFVUkw7CiAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlQ29udGFjdChuZXdDb250YWN0KTsKICAgICAgICAgIHRoaXMuaGlkZUNvbnRhY3RNb2RhbCgpOwogICAgICAgIH0pCiAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGNvbnZlcnRpbmcgaW1hZ2U6IiwgZXJyKTsKICAgICAgICAgIGFsZXJ0KCJGYWlsZWQgdG8gY29udmVydCBpbWFnZS4gU2F2aW5nIGNvbnRhY3Qgd2l0aG91dCBpbWFnZS4iKTsKICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVDb250YWN0KG5ld0NvbnRhY3QpOwogICAgICAgICAgdGhpcy5oaWRlQ29udGFjdE1vZGFsKCk7CiAgICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmFkZE9yVXBkYXRlQ29udGFjdChuZXdDb250YWN0KTsKICAgICAgdGhpcy5oaWRlQ29udGFjdE1vZGFsKCk7CiAgICB9CiAgfQoKICBhZGRPclVwZGF0ZUNvbnRhY3QoY29udGFjdCkgewogICAgdGhpcy5jb250YWN0c1tjb250YWN0LmFkZHJlc3NdID0gY29udGFjdDsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb250YWN0cyIsIEpTT04uc3RyaW5naWZ5KHRoaXMuY29udGFjdHMpKTsKICAgIHRoaXMuc2hvd0NvbnRhY3RzTGlzdCgpOwogICAgdGhpcy51cGRhdGVIZWFkZXJQcm9maWxlKCk7CiAgfQoKICBnZW5lcmF0ZVVVSUQoKSB7CiAgICByZXR1cm4gInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCIucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4gewogICAgICBjb25zdCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDsKICAgICAgY29uc3QgdiA9IChjID09PSAieCIpID8gciA6IChyICYgMHgzIHwgMHg4KTsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICAvLyAtLS0tLS0tLS0tIDguIFNJTkdMRSBERVBMT1lNRU5UIEZMT1cgLS0tLS0tLS0tLQovKioKICogc2F2ZUFuZERlcGxveU1lc3NhZ2VzKCk6CiAqIDEuIFByb21wdCB0aGUgdXNlciB0byBleHBvcnQgKHNhdmUpIHRoZSBjdXJyZW50IGxvY2FsIG1lc3NhZ2VzLgogKiAyLiBBc2sgZm9yIGNvbmZpcm1hdGlvbiB0byBkZXBsb3kuCiAqIDMuIERlcGxveSB0aGUgbWVzc2FnZXMgYXMgYW4gT1BfUkVUVVJOIHRyYW5zYWN0aW9uLgogKiA0LiBTYXZlIHRoZSByZXR1cm5lZCBUWElEIGludG8gc2VsZkNvbnRhY3QubWVzc2FnZUJsb2Nrcy4KICogNS4gQ2xlYXIgdGhlIGxvY2FsIG1lc3NhZ2Ugc3RvcmFnZSBmb3IgYSBmcmVzaCBibG9jay4KICovCmFzeW5jIHNhdmVBbmREZXBsb3lNZXNzYWdlcygpIHsKICB0cnkgewogICAgY29uc3Qgd2FsbGV0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIndhbGxldEFkZHJlc3MiKTsKICAgIGlmICghd2FsbGV0KSB7CiAgICAgIGFsZXJ0KCJObyB3YWxsZXQgZm91bmQuIFBsZWFzZSBjcmVhdGUgb3IgcmVzdG9yZSBhIHdhbGxldCBmaXJzdC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qga2V5ID0gYE1lc3NhZ2VfJHt3YWxsZXR9YDsKICAgIGNvbnN0IG1lc3NhZ2VzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgIGlmICghbWVzc2FnZXMpIHsKICAgICAgYWxlcnQoIk5vIG1lc3NhZ2VzIGZvdW5kIGluIGxvY2FsIHN0b3JhZ2UgZm9yIHRoaXMgd2FsbGV0LiIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gMS4gUHJvbXB0IHVzZXIgdG8gYmFjayB1cCAoZXhwb3J0KSB0aGUgbWVzc2FnZXMuCiAgICBjb25zdCB1c2VyQ29uZmlybWVkU2F2ZSA9IGNvbmZpcm0oCiAgICAgICJCZWZvcmUgZGVwbG95aW5nLCBwbGVhc2Ugc2F2ZSAoZXhwb3J0KSB0aGUgY3VycmVudCBtZXNzYWdlcyBmb3IgYmFja3VwLiBQcmVzcyBPSyB0byBjb250aW51ZS4iCiAgICApOwogICAgaWYgKCF1c2VyQ29uZmlybWVkU2F2ZSkgcmV0dXJuOwogICAgdGhpcy5zYXZlTWVzc2FnZXNUb0Rpc2sobWVzc2FnZXMsIHdhbGxldCk7CgogICAgLy8gMi4gRmluYWwgY29uZmlybWF0aW9uIHRvIGRlcGxveSB0aGUgbWVzc2FnZSBibG9jay4KICAgIGNvbnN0IHByb2NlZWQgPSBjb25maXJtKCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVwbG95IHRoaXMgbWVzc2FnZSBibG9jayB0byB0aGUgYmxvY2tjaGFpbj8iKTsKICAgIGlmICghcHJvY2VlZCkgcmV0dXJuOwoKICAgIC8vIDMuIERlcGxveSB0aGUgSlNPTiBkYXRhIHRvIGNoYWluIHVzaW5nIHRoZSBhcmNoaXZlIHByb3RvY29sLgogICAgY29uc3QgdHhpZCA9IGF3YWl0IHRoaXMuZGVwbG95QXJjaGl2ZVRvQ2hhaW4obWVzc2FnZXMpOwogICAgaWYgKCF0eGlkKSB0aHJvdyBuZXcgRXJyb3IoIkRlcGxveW1lbnQgZmFpbGVkOiBubyBUWElEIHJldHVybmVkLiIpOwoKICAgIC8vIDQuIFJldHJpZXZlIHRoZSBzZWxmIGNvbnRhY3QgYW5kIGVuc3VyZSBtZXNzYWdlQmxvY2tzIGV4aXN0cy4KICAgIGNvbnN0IHNlbGZDb250YWN0ID0gdGhpcy5jb250YWN0c1t3YWxsZXRdOwogICAgaWYgKCFzZWxmQ29udGFjdCkgewogICAgICBhbGVydCgiU2VsZiBjb250YWN0IG5vdCBmb3VuZC4gUGxlYXNlIGNyZWF0ZSBvciByZXN0b3JlIGEgd2FsbGV0IGZpcnN0LiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsZkNvbnRhY3QubWVzc2FnZUJsb2NrcykpIHsKICAgICAgc2VsZkNvbnRhY3QubWVzc2FnZUJsb2NrcyA9IFtdOwogICAgfQogICAgLy8gQXBwZW5kIHRoZSBuZXcgYmxvY2sgcmVjb3JkLgogICAgc2VsZkNvbnRhY3QubWVzc2FnZUJsb2Nrcy5wdXNoKHsKICAgICAgdHhpZDogdHhpZCwKICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICBub3RlOiBgQmxvY2sgb2YgbWVzc2FnZXMgZGVwbG95ZWQgYXQgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9YAogICAgfSk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29udGFjdHMiLCBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbnRhY3RzKSk7CiAgICBhbGVydChgU3VjY2Vzc2Z1bGx5IGRlcGxveWVkLiBUWElEID0gJHt0eGlkfWApOwoKICAgIC8vIDUuIENsZWFyIHRoZSBsb2NhbCBtZXNzYWdlIHN0b3JhZ2Ugc28gYSBuZXcgYmxvY2sgY2FuIGJlZ2luLgogICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsKICAgIGFsZXJ0KCJMb2NhbCBzdG9yYWdlIG1lc3NhZ2UgZmlsZSBjbGVhcmVkLiBOZXcgYmxvY2sgd2lsbCBiZWdpbiBub3cuIik7CgogICAgLy8gT3B0aW9uYWxseSByZWZyZXNoIHRoZSBVSSAoZS5nLiB1cGRhdGUgaGVhZGVyIHByb2ZpbGUgYW5kIG5hdmlnYXRpb24pCiAgICB0aGlzLnVwZGF0ZUhlYWRlclByb2ZpbGUoKTsKICAgIHdpbmRvdy5jb3JlR2xvYmFscz8uc2V0dXBOYXZpZ2F0aW9uKCk7CgogIH0gY2F0Y2ggKGVycikgewogICAgY29uc29sZS5lcnJvcigic2F2ZUFuZERlcGxveU1lc3NhZ2VzIGVycm9yOiIsIGVycik7CiAgICBhbGVydCgiRmFpbGVkIHRvIGRlcGxveSBtZXNzYWdlczogIiArIGVyci5tZXNzYWdlKTsKICB9Cn0KICAvKioKICAgKiBzYXZlTWVzc2FnZXNUb0Rpc2s6CiAgICogSGVscGVyIHRvIGxldCB1c2VyIGRvd25sb2FkIHRoZSBtZXNzYWdlcyBhcyBhIEpTT04gZmlsZSBmb3IgYmFja3VwLgogICAqLwogIHNhdmVNZXNzYWdlc1RvRGlzayhqc29uU3RyaW5nLCB3YWxsZXRBZGRyZXNzKSB7CiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2pzb25TdHJpbmddLCB7IHR5cGU6ICJhcHBsaWNhdGlvbi9qc29uIiB9KTsKICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgYS5ocmVmID0gdXJsOwogICAgYS5kb3dubG9hZCA9IGBtZXNzYWdlc18ke3dhbGxldEFkZHJlc3N9XyR7RGF0ZS5ub3coKX0uanNvbmA7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgYS5jbGljaygpOwogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICB9CgogIC8qKgogICAqIGRlcGxveUFyY2hpdmVUb0NoYWluOgogICAqIEFjdHVhbGx5IHdyaXRlcyB0aGUgSlNPTiBkYXRhIGFzIGFuIE9QX1JFVFVSTiB1c2luZyB5b3VyIHNlbmRNZXNzYWdlQW5kUGF5bWVudCBmbG93LAogICAqIHdpdGggemVybyBwYXltZW50LiBSZXR1cm5zIHRoZSBUWElEIG9uIHN1Y2Nlc3MuCiAgICovCmFzeW5jIGRlcGxveUFyY2hpdmVUb0NoYWluKGpzb25EYXRhKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHByaXZhdGVLZXlXSUYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmF0ZUtleSIpOwogICAgICAgIGlmICghcHJpdmF0ZUtleVdJRikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIHByaXZhdGUga2V5IGZvdW5kIGluIGxvY2FsU3RvcmFnZS4iKTsKICAgICAgICB9CgogICAgICAgIC8vIEZpcnN0IHBhcnNlIHRoZSBKU09OIGRhdGEgZnJvbSBsb2NhbFN0b3JhZ2UKICAgICAgICBjb25zdCBzdG9yZWRNZXNzYWdlcyA9IEpTT04ucGFyc2UoanNvbkRhdGEpOwoKICAgICAgICAvLyBDcmVhdGUgcHJvcGVyIGFyY2hpdmUgYmxvY2sgc3RydWN0dXJlCiAgICAgICAgY29uc3QgYXJjaGl2ZUJsb2NrID0gewogICAgICAgICAgICBwcm90b2NvbDogIkJTVl9CTE9DS01BSUxfQkxPQ0tfMV8wIiwgIC8vIENvcnJlY3QgcHJvdG9jb2wKICAgICAgICAgICAgdmVyc2lvbjogIjEuMCIsCiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgdHlwZTogIm1lc3NhZ2VfYmxvY2siLAogICAgICAgICAgICBtZXNzYWdlczogc3RvcmVkTWVzc2FnZXMgICAgIC8vIFBsYWNlIG1lc3NhZ2VzIGluIGNvcnJlY3QgZmllbGQKICAgICAgICB9OwoKICAgICAgICBjb25zdCB0eGlkID0gYXdhaXQgc2VuZE1lc3NhZ2VBbmRQYXltZW50KAogICAgICAgICAgICBhcmNoaXZlQmxvY2ssCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ3YWxsZXRBZGRyZXNzIiksIC8vIFNlbmQgdG8gc2VsZgogICAgICAgICAgICA2MDAsICAgIC8vIFN0YW5kYXJkIHBheW1lbnQKICAgICAgICAgICAgcHJpdmF0ZUtleVdJRiwKICAgICAgICAgICAgMCAgICAgICAvLyBObyByZXdhcmQgZm9yIGFyY2hpdmUgYmxvY2tzCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHhpZDsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiZGVwbG95QXJjaGl2ZVRvQ2hhaW4gZXJyb3I6IiwgZXJyb3IpOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQp9CgogIC8vIC0tLS0tLS0tLS0gOS4gV0FMTEVUIEZVTkNUSU9OUyBGT1IgU0VMRiBDT05UQUNUUyAtLS0tLS0tLS0tCiAgYXN5bmMgY2hlY2tCYWxhbmNlKCkgewogICAgY29uc3Qgc3RvcmVkQWRkcmVzcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ3YWxsZXRBZGRyZXNzIik7CiAgICBpZiAoIXN0b3JlZEFkZHJlc3MpIHsKICAgICAgYWxlcnQoIlBsZWFzZSBjcmVhdGUgb3IgcmVzdG9yZSBhIHdhbGxldCBmaXJzdC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkud2hhdHNvbmNoYWluLmNvbS92MS9ic3YvbWFpbi9hZGRyZXNzLyR7c3RvcmVkQWRkcmVzc30vYmFsYW5jZWApOwogICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBmZXRjaCBiYWxhbmNlIik7CiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGRhdGEuY29uZmlybWVkIC8gMWU4OwogICAgICBjb25zdCB1bmNvbmZpcm1lZCA9IGRhdGEudW5jb25maXJtZWQgLyAxZTg7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ3YWxsZXRCYWxhbmNlIikuaW5uZXJUZXh0ID0KICAgICAgICBgQ29uZmlybWVkOiAke2NvbmZpcm1lZC50b0ZpeGVkKDgpfSBCU1ZcblVuY29uZmlybWVkOiAke3VuY29uZmlybWVkLnRvRml4ZWQoOCl9IEJTVmA7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ3YWxsZXRBZGRyZXNzRGlzcGxheSIpLmlubmVyVGV4dCA9IHN0b3JlZEFkZHJlc3M7CiAgICAgIGlmICh1bmNvbmZpcm1lZCA+IDApIHsKICAgICAgICBhbGVydChgVW5jb25maXJtZWQgQmFsYW5jZTogJHt1bmNvbmZpcm1lZC50b0ZpeGVkKDgpfSBCU1ZgKTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZmV0Y2hpbmcgYmFsYW5jZToiLCBlcnJvcik7CiAgICAgIGFsZXJ0KCJGYWlsZWQgdG8gZmV0Y2ggYmFsYW5jZS4gUGxlYXNlIHRyeSBhZ2Fpbi4iKTsKICAgIH0KICB9Cgphc3luYyBjcmVhdGVXYWxsZXQoKSB7CiAgdHJ5IHsKICAgIC8vIENoZWNrIGZvciBleGlzdGluZyB3YWxsZXQKICAgIGNvbnN0IGV4aXN0aW5nV2FsbGV0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIndhbGxldEFkZHJlc3MiKTsKICAgIGlmIChleGlzdGluZ1dhbGxldCkgewogICAgICBhbGVydCgiQSB3YWxsZXQgYWxyZWFkeSBleGlzdHMuIFBsZWFzZSBkZWxldGUgaXQgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEdldCB1c2VyIGlucHV0cwogICAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250YWN0TmFtZUlucHV0Iik/LnZhbHVlIHx8ICJNeSBXYWxsZXQiOwogICAgY29uc3QgZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFjdEVtYWlsSW5wdXQiKT8udmFsdWUgfHwgIiI7CgogICAgLy8gQ3JlYXRlIG5ldyBCU1Ygd2FsbGV0CiAgICBjb25zdCBwcml2YXRlS2V5ID0gbmV3IGJzdi5Qcml2YXRlS2V5KCk7CiAgICBjb25zdCBhZGRyZXNzID0gcHJpdmF0ZUtleS50b0FkZHJlc3MoKS50b1N0cmluZygpOwoKICAgIC8vIFNhdmUgd2FsbGV0IGluZm8gbG9jYWxseQogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oIndhbGxldEFkZHJlc3MiLCBhZGRyZXNzKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2YXRlS2V5IiwgcHJpdmF0ZUtleS50b1dJRigpKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJ1dWlkIiwgdGhpcy5nZW5lcmF0ZVVVSUQoKSk7CgogICAgLy8gU2V0dXAgc2VsZiBjb250YWN0IHdpdGggZGVmYXVsdCBwcm9maWxlCiAgICB0aGlzLmNvbnRhY3RzW2FkZHJlc3NdID0gewogICAgICBhZGRyZXNzOiBhZGRyZXNzLAogICAgICBuYW1lOiBuYW1lLAogICAgICB0eXBlOiAiUyIsCiAgICAgIHByaXZhdGVLZXk6IHByaXZhdGVLZXkudG9XSUYoKSwKICAgICAgZW1haWw6IGVtYWlsLAogICAgICBwaG9uZTogIiIsCiAgICAgIHByb2ZpbGU6ICIiLAogICAgICBpbWFnZTogIiIsCiAgICAgIG1lc3NhZ2VCbG9ja3M6IFtdCiAgICB9OwogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbnRhY3RzIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5jb250YWN0cykpOwoKICAgIC8vIFVwZGF0ZSBVSQogICAgdGhpcy5oaWRlQ29udGFjdE1vZGFsKCk7CiAgICB0aGlzLnVwZGF0ZUhlYWRlclByb2ZpbGUoKTsKCiAgICAvLyBTaG93IHN1Y2Nlc3MgbWVzc2FnZSB3aXRoIGluc3RydWN0aW9ucwogICAgYWxlcnQoYFdhbGxldCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcblxuWW91ciBCU1YgQWRkcmVzczogJHthZGRyZXNzfVxuXG5JTVBPUlRBTlQ6IFBsZWFzZSBzYXZlIHlvdXIgd2FsbGV0IGZpbGUgdXNpbmcgdGhlICJTYXZlIFdhbGxldCIgYnV0dG9uIGZvciBiYWNrdXAuYCk7CgogICAgLy8gT3B0aW9uYWw6IEF1dG8tdHJpZ2dlciB3YWxsZXQgc2F2ZQogICAgdGhpcy5zYXZlV2FsbGV0RmlsZSgpOwoKICAgIHJldHVybiBhZGRyZXNzOwoKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcigiY3JlYXRlV2FsbGV0IGVycm9yOiIsIGVycm9yKTsKICAgIGFsZXJ0KCJGYWlsZWQgdG8gY3JlYXRlIHdhbGxldDogIiArIGVycm9yLm1lc3NhZ2UpOwogICAgdGhyb3cgZXJyb3I7CiAgfQp9CgogIGFzeW5jIHJlc3RvcmVXYWxsZXQoKSB7CiAgICBjb25zdCBmaWxlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgZmlsZUlucHV0LnR5cGUgPSAnZmlsZSc7CiAgICBmaWxlSW5wdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmlsZUlucHV0KTsKICAgIGZpbGVJbnB1dC5vbmNoYW5nZSA9IGFzeW5jIChlKSA9PiB7CiAgICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTsKICAgICAgaWYgKCFmaWxlKSByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpOwogICAgICAgIGNvbnN0IHdhbGxldERhdGEgPSBKU09OLnBhcnNlKHRleHQpOwogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJ1dWlkIiwgd2FsbGV0RGF0YS51dWlkKTsKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgid2FsbGV0QWRkcmVzcyIsIHdhbGxldERhdGEuYWRkcmVzcyk7CiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZhdGVLZXkiLCB3YWxsZXREYXRhLnByaXZhdGVLZXkpOwogICAgICAgIGFsZXJ0KGBXYWxsZXQgcmVzdG9yZWQ6XG5BZGRyZXNzOiAke3dhbGxldERhdGEuYWRkcmVzc31gKTsKICAgICAgICB0aGlzLnNldHVwU2VsZkNvbnRhY3QoKTsKICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlclByb2ZpbGUoKTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigicmVzdG9yZVdhbGxldCBlcnJvcjoiLCBlcnIpOwogICAgICAgIGFsZXJ0KCJGYWlsZWQgdG8gcmVzdG9yZSB3YWxsZXQuIEludmFsaWQgZmlsZT8iKTsKICAgICAgfQogICAgfTsKICAgIGZpbGVJbnB1dC5jbGljaygpOwogIH0KCiAgYXN5bmMgc2F2ZVdhbGxldEZpbGUoKSB7CiAgICBjb25zdCB3YWxsZXREYXRhID0gewogICAgICB1dWlkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXVpZCIpLAogICAgICBhZGRyZXNzOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgid2FsbGV0QWRkcmVzcyIpLAogICAgICBwcml2YXRlS2V5OiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmF0ZUtleSIpCiAgICB9OwogICAgaWYgKCF3YWxsZXREYXRhLmFkZHJlc3MpIHsKICAgICAgYWxlcnQoIk5vIHdhbGxldCBmb3VuZCB0byBzYXZlLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHdhbGxldERhdGEpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7CiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgIGEuaHJlZiA9IHVybDsKICAgIGEuZG93bmxvYWQgPSBgd2FsbGV0XyR7d2FsbGV0RGF0YS51dWlkIHx8ICJ1bm5hbWVkIn0uanNvbmA7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgYS5jbGljaygpOwogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICB9CgogIGFzeW5jIGRlbGV0ZVdhbGxldCgpIHsKICAgIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oIndhbGxldEFkZHJlc3MiKSkgewogICAgICBhbGVydCgiTm8gd2FsbGV0IHRvIGRlbGV0ZS4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgb2sgPSBjb25maXJtKCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSB3YWxsZXQ/Iik7CiAgICBpZiAoIW9rKSByZXR1cm47CiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgidXVpZCIpOwogICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oIndhbGxldEFkZHJlc3MiKTsKICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJwcml2YXRlS2V5Iik7CiAgICBhbGVydCgiV2FsbGV0IGRlbGV0ZWQuIik7CiAgfQoKICAvLyAtLS0tLS0tLS0tIDEwLiBVVElMSVRZIE1FVEhPRFMgRk9SIEZPTERFUiBNQU5BR0VNRU5UIC0tLS0tLS0tLS0KICAvLyAoVGhlIGZvbGxvd2luZyBtZXRob2RzIHJlbWFpbiB1bmNoYW5nZWQgZnJvbSB5b3VyIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLikKCiAgdXBkYXRlRm9sZGVyQ29kZXMoKSB7CiAgICBjb25zdCB3YWxsZXQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgid2FsbGV0QWRkcmVzcyIpOwogICAgaWYgKCF3YWxsZXQpIHsKICAgICAgYWxlcnQoIk5vIHdhbGxldCBhZGRyZXNzIGZvdW5kLiBQbGVhc2UgY3JlYXRlIG9yIHJlc3RvcmUgYSB3YWxsZXQgZmlyc3QuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGtleSA9IGdldE1lc3NhZ2VzS2V5KCk7CiAgICBsZXQgbWVzc2FnZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgIltdIik7CiAgICBsZXQgdXBkYXRlZENvdW50ID0gMDsKICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMubWFwKChtc2cpID0+IHsKICAgICAgaWYgKG1zZy5zZW5kZXIgPT09IHdhbGxldCkgewogICAgICAgIGlmIChtc2cuZm9sZGVyQ29kZSAhPT0gIlMiKSB7CiAgICAgICAgICB1cGRhdGVkQ291bnQrKzsKICAgICAgICB9CiAgICAgICAgbXNnLmZvbGRlckNvZGUgPSAiUyI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG1zZy5mb2xkZXJDb2RlICE9PSAiUiIpIHsKICAgICAgICAgIHVwZGF0ZWRDb3VudCsrOwogICAgICAgIH0KICAgICAgICBtc2cuZm9sZGVyQ29kZSA9ICJSIjsKICAgICAgfQogICAgICByZXR1cm4gbXNnOwogICAgfSk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7CiAgICBjb25zdCBpbmJveE1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKChtc2cpID0+IG1zZy5mb2xkZXJDb2RlID09PSAiUiIpOwogICAgY29uc3Qgc2VudE1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKChtc2cpID0+IG1zZy5mb2xkZXJDb2RlID09PSAiUyIpOwogICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiaW5ib3hNZXNzYWdlcyIsIEpTT04uc3RyaW5naWZ5KGluYm94TWVzc2FnZXMpKTsKICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oInNlbnRNZXNzYWdlcyIsIEpTT04uc3RyaW5naWZ5KHNlbnRNZXNzYWdlcykpOwogICAgYWxlcnQoYEZvbGRlciBjb2RlcyB1cGRhdGVkIGZvciAke3VwZGF0ZWRDb3VudH0gbWVzc2FnZXMuIFRlbXBvcmFyeSBJbmJveCBhbmQgU2VudCBmb2xkZXJzIGhhdmUgYmVlbiBjcmVhdGVkLmApOwogICAgdGhpcy5yZWZyZXNoTmF2aWdhdGlvbigpOwogIH0KCiAgc2V0dXBOYXZpZ2F0aW9uKCkgewogICAgY29uc3QgbmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigibmF2Iik7CiAgICBpZiAoIW5hdikgcmV0dXJuOwogICAgY29uc3QgaW5ib3hNZXNzYWdlcyA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiaW5ib3hNZXNzYWdlcyIpIHx8ICJbXSIpOwogICAgY29uc3Qgc2VudE1lc3NhZ2VzID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJzZW50TWVzc2FnZXMiKSB8fCAiW10iKTsKICAgIGNvbnN0IG5hdkhUTUwgPSBgCiAgICAgIDxhIGNsYXNzPSJuYXYtaXRlbSIgaWQ9ImluYm94LW5hdiI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImZvbGRlci1pY29uIj4ke3RoaXMucmVuZGVyRW1vamkodGhpcy5FTU9KSV9DT0RFUy5JTkJPWCl9PC9zcGFuPgogICAgICAgIEluYm94ICgke2luYm94TWVzc2FnZXMubGVuZ3RofSkKICAgICAgPC9hPgogICAgICA8YSBjbGFzcz0ibmF2LWl0ZW0iIGlkPSJzZW50LW5hdiI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImZvbGRlci1pY29uIj4ke3RoaXMucmVuZGVyRW1vamkodGhpcy5FTU9KSV9DT0RFUy5TRU5UKX08L3NwYW4+CiAgICAgICAgU2VudCAoJHtzZW50TWVzc2FnZXMubGVuZ3RofSkKICAgICAgPC9hPgogICAgYDsKICAgIG5hdi5pbm5lckhUTUwgPSBuYXZIVE1MOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImluYm94LW5hdiIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gdGhpcy5zZXR1cEZvbGRlcigiUiIpKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZW50LW5hdiIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gdGhpcy5zZXR1cEZvbGRlcigiUyIpKTsKICAgIGlmICh3aW5kb3cuZ2xvYmFsU3RhdGUuY3VycmVudEZvbGRlcikgewogICAgICBjb25zdCBjdXJyZW50ID0gd2luZG93Lmdsb2JhbFN0YXRlLmN1cnJlbnRGb2xkZXIgPT09ICJTIiA/ICJTZW50IiA6ICJJbmJveCI7CiAgICAgIEFycmF5LmZyb20obmF2LnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYtaXRlbSIpKS5mb3JFYWNoKChpdGVtKSA9PiB7CiAgICAgICAgaWYgKGl0ZW0udGV4dENvbnRlbnQuaW5jbHVkZXMoY3VycmVudCkpIHsKICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIHJlZnJlc2hOYXZpZ2F0aW9uKCkgewogICAgdGhpcy5zZXR1cE5hdmlnYXRpb24oKTsKICB9CgogIHNldHVwRm9sZGVyKGZvbGRlckNvZGUpIHsKICAgIGxldCBtZXNzYWdlcyA9IFtdOwogICAgaWYgKGZvbGRlckNvZGUgPT09ICJSIikgewogICAgICBtZXNzYWdlcyA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiaW5ib3hNZXNzYWdlcyIpIHx8ICJbXSIpOwogICAgfSBlbHNlIGlmIChmb2xkZXJDb2RlID09PSAiUyIpIHsKICAgICAgbWVzc2FnZXMgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oInNlbnRNZXNzYWdlcyIpIHx8ICJbXSIpOwogICAgfSBlbHNlIHsKICAgICAgbWVzc2FnZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldE1lc3NhZ2VzS2V5KCkpIHx8ICJbXSIpLmZpbHRlcigKICAgICAgICAobXNnKSA9PiBtc2cuZm9sZGVyQ29kZSA9PT0gZm9sZGVyQ29kZQogICAgICApOwogICAgfQogICAgd2luZG93Lmdsb2JhbFN0YXRlLmN1cnJlbnRGb2xkZXIgPSBmb2xkZXJDb2RlOwogICAgY29uc3QgbWVzc2FnZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVzc2FnZUxpc3QiKTsKICAgIGlmICghbWVzc2FnZUxpc3QpIHJldHVybjsKICAgIGNvbnN0IGhlYWRlckhUTUwgPSB0aGlzLmNyZWF0ZUZvbGRlckhlYWRlcihmb2xkZXJDb2RlLCBtZXNzYWdlcy5sZW5ndGgpOwogICAgY29uc3QgbWVzc2FnZXNIVE1MID0gdGhpcy5jcmVhdGVNZXNzYWdlTGlzdChtZXNzYWdlcyk7CiAgICBtZXNzYWdlTGlzdC5pbm5lckhUTUwgPSBgCiAgICAgICR7aGVhZGVySFRNTH0KICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiPgogICAgICAgICR7bWVzc2FnZXNIVE1MfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICBjb25zdCBuYXZJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYtaXRlbSIpOwogICAgbmF2SXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gewogICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpOwogICAgICBjb25zdCBsYWJlbCA9IGZvbGRlckNvZGUgPT09ICJTIiA/ICJTZW50IiA6ICJJbmJveCI7CiAgICAgIGlmIChpdGVtLnRleHRDb250ZW50LmluY2x1ZGVzKGxhYmVsKSkgewogICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgY3JlYXRlRm9sZGVySGVhZGVyKGZvbGRlckNvZGUsIG1lc3NhZ2VDb3VudCkgewogICAgY29uc3QgZm9sZGVyTmFtZSA9IGZvbGRlckNvZGUgPT09ICJTIiA/ICJTZW50IiA6ICJJbmJveCI7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJmb2xkZXItaGVhZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJmb2xkZXItaW5mbyI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9sZGVyLWljb24iPiR7Zm9sZGVyQ29kZSA9PT0gIlMiID8gdGhpcy5yZW5kZXJFbW9qaSh0aGlzLkVNT0pJX0NPREVTLlNFTlQpIDogdGhpcy5yZW5kZXJFbW9qaSh0aGlzLkVNT0pJX0NPREVTLklOQk9YKX08L3NwYW4+CiAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbjogMDsiPiR7Zm9sZGVyTmFtZX0gKCR7bWVzc2FnZUNvdW50fSk8L2gyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBvbmNsaWNrPSJ3aW5kb3cucmVmcmVzaEluYm94KCkiPlJlZnJlc2g8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KCiAgY3JlYXRlTWVzc2FnZUxpc3QobWVzc2FnZXMpIHsKICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJuby1tZXNzYWdlcyI+Tm8gbWVzc2FnZXMgZm91bmQ8L2Rpdj5gOwogICAgfQogICAgcmV0dXJuIG1lc3NhZ2VzCiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnRpbWVzdGFtcCAtIGEudGltZXN0YW1wKQogICAgICAubWFwKChtc2cpID0+IHRoaXMuY3JlYXRlTWVzc2FnZUl0ZW0obXNnKSkKICAgICAgLmpvaW4oIiIpOwogIH0KCiAgY3JlYXRlTWVzc2FnZUl0ZW0obXNnKSB7CiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZShtc2cudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpOwogICAgY29uc3QgcHJldmlldyA9IG1zZy5tZXNzYWdlcz8uWzBdIHx8ICJObyBwcmV2aWV3IGF2YWlsYWJsZSI7CiAgICBjb25zdCBhZGRyZXNzID0gbXNnLmZvbGRlckNvZGUgPT09ICJTIiA/IG1zZy5yZWNpcGllbnQgOiBtc2cuc2VuZGVyOwogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1pdGVtIiBvbmNsaWNrPSJ3aW5kb3cubWVzc2FnZUhhbmRsZXIub3Blbk1lc3NhZ2UoJyR7bXNnLnR4aWR9JykiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBwYWRkaW5nOiAwLjc1cmVtOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTdlYjsiPgogICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtY29udGVudCIgc3R5bGU9ImZsZXg6IDE7IG1pbi13aWR0aDogMDsgbWFyZ2luLXJpZ2h0OiAxcmVtOyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLXNlbmRlciIgc3R5bGU9ImZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDAuMjVyZW07Ij4ke21zZy5mb2xkZXJDb2RlID09PSAiUyIgPyAiVG86ICIgOiAiRnJvbTogIn0ke2FkZHJlc3MgfHwgIlVua25vd24ifTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS10aW1lIiBzdHlsZT0iY29sb3I6ICM2YjcyODA7IGZvbnQtc2l6ZTogMC44NzVyZW07Ij4ke3RpbWVzdGFtcH08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtcHJldmlldyIgc3R5bGU9Im1hcmdpbi10b3A6IDAuMjVyZW07Ij4ke3ByZXZpZXd9PC9kaXY+CiAgICAgICAgICAke21zZy5tZXNzYWdlRGF0YT8ucmV3YXJkRGF0YSA/IGAKICAgICAgICAgICAgPGRpdiBjbGFzcz0icmV3YXJkLWJhZGdlIiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRDcwMDsgY29sb3I6ICMwMDA7IHBhZGRpbmc6IDJweCA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMC44NzVyZW07Ij4KICAgICAgICAgICAgICBSZXdhcmQ6ICR7bXNnLm1lc3NhZ2VEYXRhLnJld2FyZERhdGEuYWN0dWFsUmV3YXJkfSBzYXRzCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtYWN0aW9ucyIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogMC41cmVtOyI+CiAgICAgICAgICAke21zZy5mb2xkZXJDb2RlID09PSAiUyIgPwogICAgICAgICAgICBgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIG9uY2xpY2s9ImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB3aW5kb3cubWVzc2FnZUhhbmRsZXIuZGVsZXRlU2VudE1lc3NhZ2UoJyR7bXNnLnR4aWR9JykiPkRlbGV0ZTwvYnV0dG9uPmAgOgogICAgICAgICAgICBgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIG9uY2xpY2s9ImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB3aW5kb3cuY29yZUdsb2JhbHMuc2hvd01vdmVNZW51KGV2ZW50LCAnJHttc2cudHhpZH0nKSI+TW92ZTwvYnV0dG9uPgogICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIG9uY2xpY2s9ImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB3aW5kb3cuY29yZUdsb2JhbHMuZGVsZXRlTWVzc2FnZSgnJHttc2cudHhpZH0nKSI+RGVsZXRlPC9idXR0b24+YAogICAgICAgICAgfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQoKICBzaG93TW92ZU1lbnUoZXZlbnQsIHR4aWQpIHsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tb3ZlLW1lbnUiKS5mb3JFYWNoKChtZW51KSA9PiBtZW51LnJlbW92ZSgpKTsKICAgIGNvbnN0IG1lbnUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIG1lbnUuY2xhc3NOYW1lID0gIm1vdmUtbWVudSI7CiAgICBtZW51LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIG1lbnUuc3R5bGUucmlnaHQgPSAiMCI7CiAgICBtZW51LnN0eWxlLnRvcCA9ICIxMDAlIjsKICAgIG1lbnUuc3R5bGUuYmFja2dyb3VuZCA9ICJ3aGl0ZSI7CiAgICBtZW51LnN0eWxlLmJvcmRlciA9ICIxcHggc29saWQgI2U1ZTdlYiI7CiAgICBtZW51LnN0eWxlLmJvcmRlclJhZGl1cyA9ICI0cHgiOwogICAgbWVudS5zdHlsZS5ib3hTaGFkb3cgPSAiMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xKSI7CiAgICBtZW51LnN0eWxlLnpJbmRleCA9ICI1MCI7CiAgICBjb25zdCBvcHRpb25zID0gWwogICAgICB7IGNvZGU6ICJSIiwgbmFtZTogIkluYm94IiwgaWNvbjogdGhpcy5FTU9KSV9DT0RFUy5JTkJPWCB9LAogICAgICB7IGNvZGU6ICJTIiwgbmFtZTogIlNlbnQiLCBpY29uOiB0aGlzLkVNT0pJX0NPREVTLlNFTlQgfQogICAgXTsKICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0KSA9PiB7CiAgICAgIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgaXRlbS5jbGFzc05hbWUgPSAibW92ZS1tZW51LWl0ZW0iOwogICAgICBpdGVtLnN0eWxlLnBhZGRpbmcgPSAiOHB4IDE2cHgiOwogICAgICBpdGVtLnN0eWxlLmN1cnNvciA9ICJwb2ludGVyIjsKICAgICAgaXRlbS5pbm5lckhUTUwgPSBgJHt0aGlzLnJlbmRlckVtb2ppKG9wdC5pY29uKX0gJHtvcHQubmFtZX1gOwogICAgICBpdGVtLm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5tb3ZlTWVzc2FnZSh0eGlkLCBvcHQuY29kZSk7CiAgICAgICAgbWVudS5yZW1vdmUoKTsKICAgICAgfTsKICAgICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKICAgIH0pOwogICAgZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobWVudSk7CiAgfQoKICBtb3ZlTWVzc2FnZSh0eGlkLCB0YXJnZXRGb2xkZXIpIHsKICAgIGNvbnN0IGtleSA9IGdldE1lc3NhZ2VzS2V5KCk7CiAgICBsZXQgbWVzc2FnZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgIltdIik7CiAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7CiAgICAgIGlmIChtc2cudHhpZCA9PT0gdHhpZCkgewogICAgICAgIG1zZy5mb2xkZXJDb2RlID0gdGFyZ2V0Rm9sZGVyOwogICAgICB9CiAgICAgIHJldHVybiBtc2c7CiAgICB9KTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTsKICAgIHRoaXMudXBkYXRlRm9sZGVyQ29kZXMoKTsKICAgIHRoaXMuc2V0dXBGb2xkZXIodGFyZ2V0Rm9sZGVyID09PSAiUyIgPyAiUyIgOiAiUiIpOwogIH0KCiAgZGVsZXRlTWVzc2FnZSh0eGlkKSB7CiAgICBjb25zdCBrZXkgPSBnZXRNZXNzYWdlc0tleSgpOwogICAgbGV0IG1lc3NhZ2VzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIHx8ICJbXSIpOwogICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5maWx0ZXIoKG1zZykgPT4gbXNnLnR4aWQgIT09IHR4aWQpOwogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgdGhpcy51cGRhdGVGb2xkZXJDb2RlcygpOwogICAgdGhpcy5zZXR1cEZvbGRlcigiUiIpOwogIH0KCiAgZGVsZXRlU2VudE1lc3NhZ2UodHhpZCkgewogICAgY29uc3Qgc2VudE1lc3NhZ2VzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgic2VudE1lc3NhZ2VzIikgfHwgIltdIik7CiAgICBjb25zdCB1cGRhdGVkID0gc2VudE1lc3NhZ2VzLmZpbHRlcigobXNnKSA9PiBtc2cudHhpZCAhPT0gdHhpZCk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgic2VudE1lc3NhZ2VzIiwgSlNPTi5zdHJpbmdpZnkodXBkYXRlZCkpOwogICAgY29uc3Qga2V5ID0gZ2V0TWVzc2FnZXNLZXkoKTsKICAgIGxldCBtZXNzYWdlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAiW10iKTsKICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKChtc2cpID0+IG1zZy50eGlkICE9PSB0eGlkKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTsKICAgIHRoaXMuc2V0dXBGb2xkZXIoIlMiKTsKICB9CgogIGNyZWF0ZUZvbGRlcihuYW1lLCBpY29uKSB7CiAgICBjb25zdCBjb2RlID0gdGhpcy5mb2xkZXJDb25maWcubmV4dENvZGUudG9TdHJpbmcoKTsKICAgIHRoaXMuZm9sZGVyQ29uZmlnLmZvbGRlcnNbY29kZV0gPSB7CiAgICAgIG5hbWU6IG5hbWUsCiAgICAgIGljb246IGljb24sCiAgICAgIHN5c3RlbTogZmFsc2UKICAgIH07CiAgICB0aGlzLmZvbGRlckNvbmZpZy5uZXh0Q29kZSsrOwogICAgdGhpcy5zYXZlRm9sZGVyQ29uZmlnKCk7CiAgICB0aGlzLnNldHVwTmF2aWdhdGlvbigpOwogIH0KCiAgZGVsZXRlRm9sZGVyKGNvZGUpIHsKICAgIGlmICh0aGlzLmZvbGRlckNvbmZpZy5mb2xkZXJzW2NvZGVdLnN5c3RlbSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBkZWxldGUgc3lzdGVtIGZvbGRlciIpOwogICAgfQogICAgY29uc3Qga2V5ID0gZ2V0TWVzc2FnZXNLZXkoKTsKICAgIGxldCBtZXNzYWdlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAiW10iKTsKICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMubWFwKChtc2cpID0+IHsKICAgICAgaWYgKG1zZy5mb2xkZXJDb2RlID09PSBjb2RlKSB7CiAgICAgICAgbXNnLmZvbGRlckNvZGUgPSB0aGlzLlNZU1RFTV9GT0xERVJTLklOQk9YOwogICAgICB9CiAgICAgIHJldHVybiBtc2c7CiAgICB9KTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTsKICAgIGRlbGV0ZSB0aGlzLmZvbGRlckNvbmZpZy5mb2xkZXJzW2NvZGVdOwogICAgdGhpcy5zYXZlRm9sZGVyQ29uZmlnKCk7CiAgICB0aGlzLnNldHVwTmF2aWdhdGlvbigpOwogIH0KCiAgcmVuZGVyRW1vamkoY29udGVudCkgewogICAgcmV0dXJuIHRoaXMudHdlbW9qaS5wYXJzZShjb250ZW50KTsKICB9Cn0KCi8vIEV4cG9zZSB0aGUgZ2V0TWVzc2FnZXNLZXkgaGVscGVyIGdsb2JhbGx5IGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCmlmICh0eXBlb2YgZ2V0TWVzc2FnZXNLZXkgIT09ICJmdW5jdGlvbiIpIHsKICB3aW5kb3cuZ2V0TWVzc2FnZXNLZXkgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHdhbGxldCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ3YWxsZXRBZGRyZXNzIik7CiAgICByZXR1cm4gd2FsbGV0ID8gYE1lc3NhZ2VfJHt3YWxsZXR9YCA6ICJtZXNzYWdlcyI7CiAgfTsKfQoKLy8gV2hlbiBET00gaXMgcmVhZHksIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgQ29yZUdsb2JhbHMgaW5zdGFuY2UuCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCAoKSA9PiB7CiAgY29uc3QgY29yZUdsb2JhbHMgPSBuZXcgQ29yZUdsb2JhbHMoKTsKICBjb3JlR2xvYmFscy5pbml0aWFsaXplKCk7Cn0pOw=="}]}
https://whatsonchain.com/tx/686be19d2da677fbf44a5d4fbb929adfb0b4e6522d4f30f6a647a3b8d9c2db64