Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_(改)网盘直链下载助手@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJiwovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N5aHl6MTk5MC9iYWlkdXl1bgovLyBAdmVyc2lvbiAgICAgICAgICAgMS4wLjcuOAovLyBAYXV0aG9yICAgICAgICAgICAgSG1qejEwMOOAgeayueWwj+eMtAovLyBAaWNvbiAgICAgICAgICAgICAgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXhNamdnTVRJNElqNDhjR0YwYUNCa1BTSk5NVEF6TGpZZ01UQTNMalJqTXk0MUxUSXVNaUE0TGprdE5pNHhJREV6TGpndE1USXVOWE0zTGpNdE1USXVOU0E0TGpVdE1UWXVOV011TlMweExqY2dNaTR5TFRjdU5TQXlMakl0TVRRdU55QXdMVEV3TGpFdE15NHpMVEkxTGpFdE1UVXVOQzB6Tmk0NExURTBMalV0TVRRdE16SXVNUzB4TkM0ekxUTTFMamN0TVRRdU15MDRJREF0TVRVdU55QXhMamt0TWpJdU5pQTFMakpETkRRZ01qTWdNelV1TnlBek1TNDBJRE13TGpnZ05ERXVOMk10TVM0eklESXVPQzAwSURRdU55MDNMakVnTlMwMElDNHpMVGN1TlNBMExqUXRPQzQ1SURrdU5pMHVOU0F4TGprdE1TNDJJRE11TlMwekxqRWdOQzQzUXpRdU5DQTJOaTQ0SURBZ056VXVOeUF3SURnMVl6QWdOaTQ0SURJdU15QXhNeTR4SURZdU1TQXhPQzR5SURVdU5TQTNMalFnTVRRdU1pQXhNaTR5SURJMElERXlMakpvTkRjdU1XTTBMalFnTUNBeE1TMHVOU0F4T0M0ekxUTXVOU0F6TGpJdE1TNDBJRFV1T1MweklEZ3VNUzAwTGpWNklpQm1hV3hzUFNJak5EUTBJaTgrUEhCaGRHZ2daRDBpVFRFeE9TNDRJRFkwTGpOakxqRXRNVGN1TVMweE1DNDBMVEk0TFRFeUxqVXRNekF1TVVNNU5TQXlNaTR4SURjNUxqa2dNakV1T0NBM05pNDVJREl4TGpoakxURTNMallnTUMwek15NHpJREV3TGpVdE16a3VPU0F5Tmk0M0xTNDJJREV1TXkweExqZ2dNaTR6TFRNdU5DQXlMak5vTFM0MFl5MDFMamdnTUMweE1DNDJJRFF1T0MweE1DNDJJREV3TGpkMkxqVmpNQ0F4TGpRdExqZ2dNaTQyTFRFdU9TQXpMak5ETVRNdU5DQTJPU0E0TGpnZ056WXVPQ0E0TGpnZ09EVmpNQ0F4TWk0eUlEa3VPU0F5TWk0eklESXlMaklnTWpJdU0yZzBOUzR5WXpNdU5pMHVNU0F4Tnk0MkxTNDVJREk1TGpZdE1USWdNaTQ1TFRJdU9DQXhNeTQ1TFRFekxqY2dNVFF0TXpGNklpQm1hV3hzUFNJak1UTTVOMlE0SWk4K1BIQmhkR2dnWkQwaVRURXhNQzQ0SURVM0xqUnNMaklnTXk0ell6QWdNUzR6TFRFdU1TQXlMalF0TWk0eklESXVOQzB4TGpNZ01DMHlMak10TVM0eExUSXVNeTB5TGpSc0xTNHhMVEl1T0hZdExqTmpNQzB4TGpJdU9TMHlMaklnTWk0eExUSXVNMmd1TTJNdU55QXdJREV1TXk0eklERXVOeTQzTFM0eUxqRXVNeTQxTGpRZ01TNDBlbTB0TXk0ekxURXdMak5qTUNBeExqSXRNU0F5TGpNdE1pNHlJREl1TTJndExqRmpMUzQ0SURBdE1TNDJMUzQxTFRJdE1TNHlMVFF1TmkwNExqTXRNVE11TXkweE15NDFMVEl5TGpndE1UTXVOUzB4TGpJZ01DMHlMak10TVMweUxqTXRNaTR5ZGkwdU1XTXdMVEV1TWlBeExUSXVNeUF5TGpJdE1pNHphQzR4WVRNd0xqTTNJRE13TGpNM0lEQWdNQ0F4SURFMUxqZ2dOQzQwWXpRdU5pQXlMamdnT0M0MElEWXVPQ0F4TVM0eElERXhMalV1TVM0ekxqSXVOeTR5SURFdU1YcE5PRGd1TXlBM015NDRURGN6TGpVZ09UTXVNbU10TVM0MUlERXVPUzB6TGpVZ015NHhMVFV1TnlBekxqVm9MUzR5WXkwdU5DNHhMUzQ0TGpFdE1TNHlMakV0TGpZZ01DMHhMakV0TGpFdE1TNDJMUzR5TFRJdU1pMHVOQzAwTGpJdE1TNDNMVFV1TmkwekxqVk1ORFF1TXlBM015NDVZeTB5TFRJdU5pMHlMalV0TlM0MExURXVOQzAzTGpjdU1TMHVNUzR4TFM0eUxqSXRMaklnTVM0eUxUSWdNeTQxTFRNdU1pQTJMalF0TXk0eWFEWXVObll0TlM0M1l6QXROaTQ0SURRdU55MHhNaUF4TUM0NUxURXlJRFF1T0NBd0lEZ3VOU0F5TGpZZ01UQXVNeUEzTGpJdU5TQXhMak10TGpJZ01pNDNMVEV1TlNBekxqSnpMVEl1T0MwdU1TMHpMak10TVM0MFl5MHhMakV0TWk0M0xUSXVPUzAwTFRVdU5TMDBMVE11TlNBd0xUWWdNeTAySURkMk9DNHhZekFnTGpVdExqSWdNUzB1TmlBeExqUXRMall1TnkweExqY2dNUzR4TFRJdU5pQXhMakZvTFRndU5HTXRNUzR6SURBdE1pQXVOQzB5TGpFdU55MHVNaTQwSURBZ01TNHpMamtnTWk0MFREWXpMakVnT1RCakxqa2dNUzR5SURJdU1TQXhMamdnTXk0eklERXVPSE15TGpNdExqWWdNeTR4TFRFdU4yd3hOQzQ0TFRFNUxqTmpMamt0TVM0eElERXVNUzB5SUM0NUxUSXVOQzB1TWkwdU15MHVPUzB1TnkweUxqRXRMamRvTFRjdU5tTXRMamtnTUMweExqY3RMalV0TWk0eExURXVNaTB1TXkwdU5DMHVOQzB1T0MwdU5DMHhMak1nTUMweExqUWdNUzR4TFRJdU5TQXlMalV0TWk0MWFEY3VObU16TGpFZ01DQTFMalVnTVM0eklEWXVOaUF6TGpWc0xqTXVOMk11TnlBeUxqRXVNU0EwTGpZdE1TNDNJRFl1T1hvaUlHWnBiR3c5SWlNME5EUWlMejQ4TDNOMlp6ND0KLy8gQGRlc2NyaXB0aW9uICAgICAgIOWPr+S7peiOt+WPlue9keebmOaWh+S7tuecn+WunuS4i+i9veWcsOWdgOOAgueOsOW3suaUr+aMgeeZvuW6pumYv+mHjOWkqee/vOi/hembt+WkuOWFi+enu+WKqOWFreWkp+e9keebmO+8jOWfuuS6juOAkOe9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkeS/ruaUueiHqjYuMS4y54mI5pysLOiHqueUqCzljrvmjqjlub8s5L+u5Y6f5pyJQlVHLOS/ruaUueeVjOmdoiznlJroh7Pmr5Tljp/niYjov5jlpb3nlKjvvIEKLy8gQGxpY2Vuc2UgICAgICAgICAgIEFHUEwtMy4wLW9yLWxhdGVyCi8vIEBob21lcGFnZSAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvCi8vIEBzdXBwb3J0VVJMICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvaXNzdWVzCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL2Jhc2UqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL2Jhc2UqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS93YXAvaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3dhcC9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vd2FwL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS93YXAvbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vYWlwYW4vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9haXBhbi8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zaGFyZS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuYWxpeXVuZHJpdmUuY29tL2RyaXZlKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL2Nsb3VkLjE4OS5jbi93ZWIvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi54dW5sZWkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4ucXVhcmsuY24vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi4xMzkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9jYWl5dW4uMTM5LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vKi55b3V4aWFvaG91LmNvbS8qCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL3VucGtnLmNvbS9qcXVlcnlAMy42LjAvZGlzdC9qcXVlcnkubWluLmpzCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL3VucGtnLmNvbS9zd2VldGFsZXJ0MkAxMS9kaXN0L3N3ZWV0YWxlcnQyLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly91bnBrZy5jb20vanMtbWQ1QDAuNy4zL2J1aWxkL21kNS5taW4uanMKLy8gQHJlc291cmNlIFN3YWwgICAgIGh0dHBzOi8vdW5wa2cuY29tL3N3ZWV0YWxlcnQyQDExL2Rpc3Qvc3dlZXRhbGVydDIubWluLmNzcwovLyBAcmVzb3VyY2UgU3dhbERhcmsgaHR0cHM6Ly91bnBrZy5jb20vQHN3ZWV0YWxlcnQyL3RoZW1lLWRhcmtANS4wLjE1L2RhcmsubWluLmNzcwovLyBAY29ubmVjdCAgICAgICAgICAgYmFpZHUuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBiYWlkdXBjcy5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGFsaXl1bmRyaXZlLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYWxpeXVuZHJpdmUubmV0Ci8vIEBjb25uZWN0ICAgICAgICAgICAxODkuY24KLy8gQGNvbm5lY3QgICAgICAgICAgIHh1bmxlaS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIHF1YXJrLmNuCi8vIEBjb25uZWN0ICAgICAgICAgICB5b3V4aWFvaG91LmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgZ2hwcm94eS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGxvY2FsaG9zdAovLyBAY29ubmVjdCAgICAgICAgICAgKgovLyBAcnVuLWF0ICAgICAgICAgICAgZG9jdW1lbnQtaWRsZQovLyBAY29tcGF0aWJsZQkgICAgICBDaHJvbWUKLy8gQGNvbXBhdGlibGUJICAgICAgRWRnZQovLyBAY29tcGF0aWJsZQkgICAgICBGaXJlZm94Ci8vIEBjb21wYXRpYmxlCSAgICAgIFNhZmFyaQovLyBAY29tcGF0aWJsZQkgICAgICBPcGVyYQovLyBAZ3JhbnQgICAgICAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgICAgICAgR01faW5mbwovLyBAZ3JhbnQgICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fY29va2llCi8vIEBncmFudCAgICAgICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZ2V0UmVzb3VyY2VUZXh0Ci8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uICgpIHsKCSd1c2Ugc3RyaWN0JzsKCgkvLyDnlYzpnaLlj4LmlbAKCWxldCBwdCA9ICcnLCBzZWxlY3RMaXN0ID0gW10sIHBhcmFtcyA9IHt9LCBtb2RlID0gJycsIHdpZHRoID0gJycsIHBhbiA9IHt9LCBjb2xvciA9ICcnLAoJdXBkYXRlID0gJycsIHVwZGF0ZV9iYWlkdSA9ICcnLCB1cGRhdGVfYmFpZHVYID0gJycsCglkb2MgPSAkKGRvY3VtZW50KSwgcHJvZ3Jlc3MgPSB7fSwgcmVxdWVzdCA9IHt9LCBpbnMgPSB7fSwgaWRtID0ge307CgoKCS8vIOWHhuWkh+WlveWvueW6lOeahOWFg+e0oAoJY29uc3QgY3VzdG9tQ2xhc3MgPSB7CgkJcG9wdXA6ICdwbC1wb3B1cCcsCgkJaGVhZGVyOiAncGwtaGVhZGVyJywKCQl0aXRsZTogJ3BsLXRpdGxlJywKCQljbG9zZUJ1dHRvbjogJ3BsLWNsb3NlJywKCQljb250ZW50OiAncGwtY29udGVudCcsCgkJaW5wdXQ6ICdwbC1pbnB1dCcsCgkJZm9vdGVyOiAncGwtZm9vdGVyJwoJfTsKCgoJLy8g5YeG5aSH5aW9U2hlbGznsbvlnovvvIjnlKjkuo5jdXJs5LiL6L2977yJCgljb25zdCB0ZXJtaW5hbFR5cGUgPSB7CgkJd2M6ICJNaWNyb3NvZnQgV2luZG93cyDlkb3ku6Tmj5DnpLrnrKYiLAoJCXdwOiAiTWljcm9zb2Z0IFdpbmRvd3MgUG93ZXJTaGVsbCIsCgkJbHQ6ICJMaW51eCDnu4jnq68iLAoJCWxzOiAiTGludXggU2hlbGwiLAoJCW10OiAiQXBwbGUgTWFjT1Mg57uI56uvIiwKCX07CgoJLy/lh4blpIflpb3kv6Hmga/nlYzpnaLnmoTorr7nva7pgInpobkKCWxldCB1cGRhdGVjaGVjayA9IHsKCQl5ZXM6ICLoh6rliqjmo4Dmn6Xmm7TmlrAiLAoJCW5vOiAi5LiN5qOA5p+l5pu05pawIgoJfQoJbGV0IHlvdXNlcnZlciA9IHsKCQl2MTogIuS9v+eUqO+8iOS9v+eUqOayueWwj+eMtOacjeWKoeWZqFYx5o6l5Y+j6I635Y+W5L+h5oGv77yJIiwKCQl2MjogIuS9v+eUqO+8iOS9v+eUqOayueWwj+eMtOacjeWKoeWZqFYy5o6l5Y+j6I635Y+W5L+h5oGv77yJIiwKCQlubzogIuS4jeS9v+eUqO+8iOS9v+eUqEdoUHJveHnov57mjqVHaXRodWLku5PlupPojrflj5bkv6Hmga8s5pu05paw5Y+v6IO95LiN5Y+K5pe277yJIgoJfTsKCWxldCBoaWRlaWRtID0gewoJCXllczogIumakOiXjyIsCgkJbm86ICLmmL7npLoiCgl9OwoJbGV0IGJhaWR1dGhlbWUgPSB7CgkJeWVzOiAi5L+u5pS55Li76aKY6ImyIiwKCQlubzogIuS4jeS/ruaUueS4u+mimOiJsiIKCX07CgoJLy/lh4blpIflpb3lj7PkuIrop5LnmoRUb2FzdOaPkOekugoJbGV0IHRvYXN0ID0gU3dhbC5taXhpbih7CgkJdG9hc3Q6IHRydWUsCgkJcG9zaXRpb246ICd0b3AtZW5kJywKCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJdGltZXI6IDM1MDAsCgkJdGltZXJQcm9ncmVzc0JhcjogdHJ1ZSwKCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJZGlkT3BlbjogKHRvYXN0KSA9PiB7CgkJCXRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBTd2FsLnN0b3BUaW1lcik7CgkJCXRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBTd2FsLnJlc3VtZVRpbWVyKTsKCQl9Cgl9KTsKCgkvL+aPkOekuueahOS/oeaBr+WGheWuuQoJY29uc3QgbWVzc2FnZSA9IHsKCQlzdWNjZXNzOiAodGV4dCkgPT4gewoJCQl0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3N1Y2Nlc3MnfSk7CgkJfSwKCQllcnJvcjogKHRleHQpID0+IHsKCQkJdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdlcnJvcid9KTsKCQl9LAoJCXdhcm5pbmc6ICh0ZXh0KSA9PiB7CgkJCXRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnd2FybmluZyd9KTsKCQl9LAoJCWluZm86ICh0ZXh0KSA9PiB7CgkJCXRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnaW5mbyd9KTsKCQl9LAoJCXF1ZXN0aW9uOiAodGV4dCkgPT4gewoJCQl0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3F1ZXN0aW9uJ30pOwoJCX0KCX07CgoJLy8g5bCB6KOF5aW96KaB55So55qE5Ye95pWwCglsZXQgYmFzZSA9IHsKCQkvLyDpu5jorqToj5zljZUKCQlyZWdpc3Rlck1lbnVDb21tYW5kKCkgewoJCQlHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfimpnvuI8g6K6+572uJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn8J+TgyDmm7TmlrAnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ/Cfm6DvuI8g6LCD6K+VJywgKCkgPT4gewoJCQkJYmFzZS5zaG93SW5mbygpOwoJCQl9KTsKCQl9LAoKCQkvLyDlr7nkuo7pnZ7nvZHnm5jnmoToj5zljZUKCQlyZWdpc3RlclBhbk1lbnVDb21tYW5kKCkgewoJCQlHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfimpnvuI8g6K6+572uJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn8J+TgyDmm7TmlrAnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ/Cfm6DvuI8g6LCD6K+VJywgKCkgPT4gewoJCQkJYmFzZS5zaG93UGFuSW5mbygpOwoJCQl9KTsKCQl9LAoKCQkvLyDlj5bmtojngrnkuq7mjInpkq7mjInkuIvlkI7ov5DooYznmoQKCQlyZWdpc3RlckluaXRDb2RlKHZhbHVlKSB7CgkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuato+WcqOazqOWFpeWPlua2iOeCueS6ruaMiemSruiuvue9rumhueebri4uLiIpOwoJCQltZXNzYWdlLndhcm5pbmcoIuato+WcqOazqOWFpeWPlua2iOeCueS6ruaMiemSruiuvue9rumhueebri4uLijmgqjlj6/ku6Xlho3mrKHngrnkuq7mjInpkq4pIik7CgkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgdmFsdWUpOwoJCQloaXN0b3J5LmdvKDApCgkJfSwKCgkJLy8g6I635Y+WQ29va2llCgkJZ2V0Q29va2llKG5hbWUpIHsKCQkJbGV0IGFyciA9IGRvY3VtZW50LmNvb2tpZS5yZXBsYWNlKC9ccy9nLCAiIikuc3BsaXQoJzsnKTsKCQkJZm9yIChsZXQgaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCQlsZXQgdGVtcEFyciA9IGFycltpXS5zcGxpdCgnPScpOwoJCQkJaWYgKHRlbXBBcnJbMF0gPT09IG5hbWUpIHsKCQkJCQlyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHRlbXBBcnJbMV0pOwoJCQkJfQoJCQl9CgkJCXJldHVybiAnJzsKCQl9LAoKCQkvKi0tIOWvueixoeexu+Wei+WIpOaWrQoJCeekuuS+i++8mgoJCQlpc1R5cGUoW10pIC8vIOi+k+WHuiJhcnJheSIKCQkJaXNUeXBlKDEyMykgLy8g6L6T5Ye6Im51bWJlciIKCQkJaXNUeXBlKG51bGwpIC8vIOi+k+WHuiJudWxsIgoJCQlpc1R5cGUobmV3IERhdGUoKSkgLy8g6L6T5Ye6ImRhdGUiCgkJKi8KCQlpc1R5cGUob2JqKSB7CgkJCXJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5yZXBsYWNlKC9eXFtvYmplY3QgKC4rKVxdJC8sICckMScpLnRvTG93ZXJDYXNlKCk7CgkJfSwKCgoJCS8vIOiOt+WPluacrOWcsOS/neWtmOeahOaVsOWAvO+8iOS7heeUqOS6jiBHcmVhc2Vtb25rZXnvvIkKCQlnZXRWYWx1ZShuYW1lKSB7CgkJCXJldHVybiBHTV9nZXRWYWx1ZShuYW1lKTsKCQl9LAoKCQkvLyDkv67mlLnmnKzlnLDkv53lrZjnmoTmlbDlgLzvvIjku4XnlKjkuo4gR3JlYXNlbW9ua2V577yJCgkJc2V0VmFsdWUobmFtZSwgdmFsdWUpIHsKCQkJR01fc2V0VmFsdWUobmFtZSwgdmFsdWUpOwoJCX0sCgoJCS8vIOiOt+WPluacrOWcsOS/neWtmOeahOaVsOWAvAoJCWdldFN0b3JhZ2Uoa2V5KSB7CgkJCXRyeSB7CgkJCQlyZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpKTsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7CgkJCX0KCQl9LAoKCQkvLyDkv67mlLnmnKzlnLDkv53lrZjnmoTmlbDlgLwKCQlzZXRTdG9yYWdlKGtleSwgdmFsdWUpIHsKCQkJaWYgKHRoaXMuaXNUeXBlKHZhbHVlKSA9PT0gJ29iamVjdCcgfHwgdGhpcy5pc1R5cGUodmFsdWUpID09PSAnYXJyYXknKSB7CgkJCQlyZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOwoJCQl9CgkJCXJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsKCQl9LAoKCQkvLyDorr7nva7liarotLTmnb/vvIjku4XnlKjkuo4gR3JlYXNlbW9ua2V577yJCgkJc2V0Q2xpcGJvYXJkKHRleHQpIHsKCQkJR01fc2V0Q2xpcGJvYXJkKHRleHQsICd0ZXh0Jyk7CgkJfSwKCgkJLy8g5Yqg5a+G5oiQYmFzZTY077yI5YWI6L2s5o2i5oiQVVJM57yW56CB77yJCgkJZW5jb2RlKHN0cikgewoJCQlyZXR1cm4gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpOwoJCX0sCgoJCS8vIOS7jmJhc2U2NOino+WvhgoJCWRlY29kZShzdHIpIHsKCQkJcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYXRvYihzdHIpKSk7CgkJfSwKCgkJLy/mlbDlrZfooaXpm7YKCQlyZXBhaXJUaW1lcihpKXsKCQkJaWYgKGkgPj0gMCAmJiBpIDw9IDkpIHsKCQkJCXJldHVybiAiMCIgKyBpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9LAoKCQkvLyDmjqXlj5fmlofku7blkI3lubbov5Tlm57lpKflhpnmianlsZXlkI0KCQlnZXRFeHRlbnNpb24obmFtZSkgewoJCQljb25zdCByZWcgPSAvKD8hXC4pXHcrJC87CgkJCWlmIChyZWcudGVzdChuYW1lKSkgewoJCQkJbGV0IG1hdGNoID0gbmFtZS5tYXRjaChyZWcpOwoJCQkJcmV0dXJuIG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7CgkJCX0KCQkJcmV0dXJuICcnOwoJCX0sCgoJCS8vIOaWh+S7tuWkp+Wwj+i9rOaNou+8iOS7peWtl+iKguS4uuWNleS9je+8iQoJCXNpemVGb3JtYXQodmFsdWUpIHsKCQkJaWYgKHZhbHVlID09PSArdmFsdWUpIHsKCQkJbGV0IHVuaXQgPSBbIuWtl+iKgihCKSIsICLljYPlrZfoioIoS0IpIiwgIuWFhuWtl+iKgihNQikiLCAi5ZCJ5a2X6IqCKEdCKSIsICLlpKrlrZfoioIoVEIpIiwgIuaLjeWtl+iKgihQQikiLCAi6Im+5a2X6IqCKEVCKSIsICLms73lrZfoioIoWkIpIiwgIuWwp+Wtl+iKgihZQikiXTsKCQkJaWYgKHZhbHVlID09PSAwKSB7CgkJCQlyZXR1cm4gIjDlrZfoioIoQikiOwoJCQl9IGVsc2UgewoJCQkJbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLmxvZygxMDI0KSk7CgkJCQlsZXQgc2l6ZSA9IHZhbHVlIC8gTWF0aC5wb3coMTAyNCwgaW5kZXgpOwoJCQkJc2l6ZSA9IHNpemUudG9GaXhlZCgxKTsKCQkJCXJldHVybiBzaXplICsgdW5pdFtpbmRleF07CgkJCX0KCQl9CgkJCXJldHVybiAnJzsKCQl9LAoKCQkvLyDmoLnmja7mlbDnu4TkuK3nmoTmr4/kuKrmlofku7blkI3ov5vooYzmjpLluo/vvIzkvb/nlKjkuoZsb2NhbGVDb21wYXJl5pa55rOV5p2l5q+U6L6D5Lit5paH5a2X56ym5Liy55qE6aG65bqP44CCCgkJc29ydEJ5TmFtZShhcnIpIHsKCQkJY29uc3QgaGFuZGxlID0gKCkgPT4gewoJCQkJcmV0dXJuIChhLCBiKSA9PiB7CgkJCQkJY29uc3QgcDEgPSBhLmZpbGVuYW1lID8gYS5maWxlbmFtZSA6IGEuc2VydmVyX2ZpbGVuYW1lOwoJCQkJCWNvbnN0IHAyID0gYi5maWxlbmFtZSA/IGIuZmlsZW5hbWUgOiBiLnNlcnZlcl9maWxlbmFtZTsKCQkJCQlyZXR1cm4gcDEubG9jYWxlQ29tcGFyZShwMiwgInpoLUNOIik7CgkJCQl9OwoJCQl9OwoJCQlhcnIuc29ydChoYW5kbGUoKSk7CgkJfSwKCgkJLy8g5pu/5o2i54m55q6K5a2X56ym5Li65LiL5YiS57q/CgkJZml4RmlsZW5hbWUobmFtZSkgewoJCQlsZXQgcmVwbGFjZSA9IC9bIT8mfGAiJypcLzo8PlxcXS9nCgkJCXJldHVybiBuYW1lLnJlcGxhY2UocmVwbGFjZSwgJ18nKTsKCQl9LAoKCQkvLyDmjqXlj5dCbG9i5a+56LGh5ZKM5paH5Lu25ZCN77yM54S25ZCO5Yib5bu65Li05pe26ZO+5o6l5oyH5ZCRYmxvYuWvueixoe+8jOS5i+WQjuWIm+W7umHmoIfnrb7mjIflkJHkuLTml7bpk77mjqXlkozorr7nva7mlofku7blkI3vvIzmnIDlkI7mqKHmi5/ngrnlh7th5qCH562+5a6e546w5LiL6L295ZKM6YeK5pS+5Li05pe26ZO+5o6lCgkJYmxvYkRvd25sb2FkKGJsb2IsIGZpbGVuYW1lKSB7CgkJCWlmIChibG9iIGluc3RhbmNlb2YgQmxvYikgewoJCQkJY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKCQkJCWNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CgkJCQlhLmhyZWYgPSB1cmw7CgkJCQlhLmRvd25sb2FkID0gZmlsZW5hbWU7CgkJCQlhLmNsaWNrKCk7CgkJCQlVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CgkJCX0KCQl9LAoKCQkvLyDkvb/nlKhQb3N05Y+R6YCB6K+35rGCCgkJcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIHR5cGUsIG1heFJldHJpZXMgPSAxMCwgY3VycmVudFJldHJ5ID0gMCkgewoJCQlpZiAodGhpcy5pc1R5cGUoZGF0YSkgPT09ICdvYmplY3QnKSB7CgkJCQlkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7CgkJCX0KCQkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJCWNvbnN0IHNlbmRSZXF1ZXN0ID0gKCkgPT4gewoJCQkJCUdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCQkJbWV0aG9kOiAiUE9TVCIsIHVybCwgaGVhZGVycywgZGF0YSwKCQkJCQkJcmVzcG9uc2VUeXBlOiB0eXBlIHx8ICdqc29uJywKCQkJCQkJb25sb2FkOiAocmVzKSA9PiB7CgkJCQkJCQlpZiAoL15bQS1aYS16MC05Ky89XHNdKyQvLnRlc3QocmVzLnJlc3BvbnNlKSAmJiAvXltBLVphLXowLTkrLz1cc10rJC8udGVzdChyZXMucmVzcG9uc2VUZXh0KSkgewoJCQkJCQkJCWlmIChyZXMucmVzcG9uc2UpIHsKCQkJCQkJCQkJcmVzLmRlY29kZWRSZXNwb25zZSA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzLnJlc3BvbnNlKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChyZXMucmVzcG9uc2VUZXh0KSB7CgkJCQkJCQkJCXJlcy5kZWNvZGVkUmVzcG9uc2VUZXh0ID0gYmFzZS5kZWNvZGUocmVzLnJlc3BvbnNlVGV4dCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3Rcbuivt+axguWcsOWdgO+8micgKyB1cmwgKyAnXG7or7fmsYLlpLTpg6jvvJonICsgSlNPTi5zdHJpbmdpZnkoaGVhZGVycykgKyAnXG7or7fmsYLnu5PmnpzvvJonLCByZXMpOwoJCQkJCQkJdHlwZSA9PT0gJ2Jsb2InID8gcmVzb2x2ZShyZXMpIDogcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7CgkJCQkJCX0sCgkJCQkJCW9uZXJyb3I6IChlcnIpID0+IHsKCQkJCQkJCWlmIChjdXJyZW50UmV0cnkgPCBtYXhSZXRyaWVzKSB7CgkJCQkJCQkJY3VycmVudFJldHJ5Kys7CgkJCQkJCQkJY29uc29sZS5lcnJvcihg44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRUG9zdFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG4156eS5ZCO5bCG6YeN6K+VICjplJnor6/mrKHmlbDvvJoke2N1cnJlbnRSZXRyeX0vJHttYXhSZXRyaWVzfSkuLi5gLCBlcnIpOwoJCQkJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQkJCQkJCQkJY29uc29sZS5sb2coYOOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3RcbumHjeaWsOWwneivleivt+axgi4uLmApOwoJCQkJCQkJCQlzZW5kUmVxdWVzdCgpOyAvLyDph43mlrDlj5HpgIHor7fmsYIKCQkJCQkJCQl9LDUwMDApCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXJlamVjdCgn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRUG9zdFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG7ml6Dms5Xnu6fnu63or7fmsYLvvIzovr7liLDmnIDlpKfplJnor6/mrKHmlbDjgIInLCBlcnIpOyAvLyDovr7liLDmnIDlpKfph43or5XmrKHmlbDvvIzmi5Lnu50gUHJvbWlzZQoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCX0pOwoJCQkJfTsKCQkJCXNlbmRSZXF1ZXN0KCk7IC8vIOWIneWni+ivt+axggoJCQl9KTsKCQl9LAoKCQkvLyDkvb/nlKhHZXTlj5HpgIHor7fmsYIKCQlnZXQodXJsLCBoZWFkZXJzLCB0eXBlLCBleHRyYSwgbWF4UmV0cmllcyA9IDEwLCBjdXJyZW50UmV0cnkgPSAwKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQljb25zdCBzZW5kUmVxdWVzdCA9ICgpID0+IHsKCQkJCQlsZXQgcmVxdWVzdE9iaiA9IEdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCQkJbWV0aG9kOiAiR0VUIiwgdXJsLCBoZWFkZXJzLAoJCQkJCQlyZXNwb25zZVR5cGU6IHR5cGUgfHwgJ2pzb24nLAoJCQkJCQlvbmxvYWQ6IChyZXMpID0+IHsKCQkJCQkJCWNvbnNvbGUubG9nKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXQgT25sb2FkXG7or7fmsYLlnLDlnYDvvJonICsgdXJsICsgJ1xu6K+35rGC5aS06YOo77yaJyArIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpICsgJ1xu6K+35rGC57uT5p6c77yaJywgcmVzKTsKCQkJCQkJCWlmIChyZXMuc3RhdHVzID09PSAyMDQpIHsKCQkJCQkJCQlyZXF1ZXN0T2JqLmFib3J0KCk7CgkJCQkJCQkJaWRtW2V4dHJhLmluZGV4XSA9IHRydWU7CgkJCQkJCQl9CgkJCQkJCQlpZiAodHlwZSA9PT0gJ2Jsb2InKSB7CgkJCQkJCQkJcmVzLnN0YXR1cyA9PT0gMjAwICYmIGJhc2UuYmxvYkRvd25sb2FkKHJlcy5yZXNwb25zZSwgZXh0cmEuZmlsZW5hbWUpOwoJCQkJCQkJCXJlc29sdmUocmVzKTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7CgkJCQkJCQl9CgkJCQkJCX0sCgkJCQkJCW9ucHJvZ3Jlc3M6IChyZXMpID0+IHsKCQkJCQkJCWlmIChleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCkgewoJCQkJCQkJCXJlcy50b3RhbCA+IDAgPyBwcm9ncmVzc1tleHRyYS5pbmRleF0gPSAocmVzLmxvYWRlZCAqIDEwMCAvIHJlcy50b3RhbCkudG9GaXhlZCgyKSA6IHByb2dyZXNzW2V4dHJhLmluZGV4XSA9IDAuMDA7CgkJCQkJCQl9CgkJCQkJCX0sCgkJCQkJCW9ubG9hZHN0YXJ0KCkgewoJCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUdldCBPbmxvYWRTdGFydFxu6K+35rGC5Zyw5Z2A77yaJyArIHVybCArICdcbuivt+axguWktOmDqO+8micgKyBKU09OLnN0cmluZ2lmeShoZWFkZXJzKSk7CgkJCQkJCQlleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCAmJiAocmVxdWVzdFtleHRyYS5pbmRleF0gPSByZXF1ZXN0T2JqKTsKCQkJCQkJfSwKCQkJCQkJb25lcnJvcjogKGVycikgPT4gewoJCQkJCQkJaWYgKGN1cnJlbnRSZXRyeSA8IG1heFJldHJpZXMpIHsKCQkJCQkJCQljdXJyZW50UmV0cnkrKzsKCQkJCQkJCQljb25zb2xlLmVycm9yKGDjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXRcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxuNeenkuWQjuWwhumHjeivlSAo6ZSZ6K+v5qyh5pWw77yaJHtjdXJyZW50UmV0cnl9LyR7bWF4UmV0cmllc30pLi4uYCwgZXJyKTsKCQkJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJCQkJCWNvbnNvbGUubG9nKGDjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXRcbumHjeaWsOWwneivleivt+axgi4uLmApOwoJCQkJCQkJCQlzZW5kUmVxdWVzdCgpOyAvLyDph43mlrDlj5HpgIHor7fmsYIKCQkJCQkJCQl9LDUwMDApCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXJlamVjdCgn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0XG7or7fmsYLlh7rnjrDplJnor6/vvIzlj6/og73mmK/nvZHnu5zpl67pophcbuaXoOazlee7p+e7reivt+axgu+8jOi+vuWIsOacgOWkp+mUmeivr+asoeaVsOOAgicsIGVycik7IC8vIOi+vuWIsOacgOWkp+mHjeivleasoeaVsO+8jOaLkue7nSBQcm9taXNlCgkJCQkJCQl9CgkJCQkJCX0sCgkJCQkJfSk7CgkJCQl9OwoKCQkJCXNlbmRSZXF1ZXN0KCk7IC8vIOWIneWni+ivt+axggoJCQl9KTsKCQl9LAoKCQkvLyDojrflj5bmnIDnu4jpk77mjqUKCQlnZXRGaW5hbFVybCh1cmwsIGhlYWRlcnMsIG1heFJldHJpZXMgPSAxMCwgY3VycmVudFJldHJ5ID0gMCkgewoJCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQkJY29uc3Qgc2VuZFJlcXVlc3QgPSAoKSA9PiB7CgkJCQkJbGV0IHJlcXVlc3RPYmogPSBHTV94bWxodHRwUmVxdWVzdCh7CgkJCQkJCW1ldGhvZDogIkdFVCIsIHVybCwgaGVhZGVycywKCQkJCQkJb25sb2FkOiAocmVzKSA9PiB7CgkJCQkJCQljb25zb2xlLmxvZygn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0IEZpbmFsVXJsXG7or7fmsYLlnLDlnYDvvJonICsgdXJsICsgJ1xu6K+35rGC5aS06YOo77yaJyArIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpICsgJ1xu6L+U5Zue57uT5p6c77yaJywgcmVzKTsKCQkJCQkJCXJlc29sdmUocmVzLmZpbmFsVXJsKTsKCQkJCQkJfSwKCQkJCQkJb25lcnJvcjogKGVycikgPT4gewoJCQkJCQkJaWYgKGN1cnJlbnRSZXRyeSA8IG1heFJldHJpZXMpIHsKCQkJCQkJCQljdXJyZW50UmV0cnkrKzsKCQkJCQkJCQljb25zb2xlLmVycm9yKGDjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXQgRmluYWxVcmxcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxuNeenkuWQjuWwhumHjeivlSAo6ZSZ6K+v5qyh5pWw77yaJHtjdXJyZW50UmV0cnl9LyR7bWF4UmV0cmllc30pLi4uYCk7CgkJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCQkJCQljb25zb2xlLmxvZyhg44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0IEZpbmFsVXJsXG7ph43mlrDlsJ3or5Xor7fmsYIuLi5gKTsKCQkJCQkJCQkJc2VuZFJlcXVlc3QoKTsgLy8g6YeN5paw5Y+R6YCB6K+35rGCCgkJCQkJCQkJfSw1MDAwKQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlyZWplY3QoJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUdldCBGaW5hbFVybFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG7ml6Dms5Xnu6fnu63or7fmsYLvvIzovr7liLDmnIDlpKfplJnor6/mrKHmlbDjgIInLCBlcnIpOyAvLyDovr7liLDmnIDlpKfph43or5XmrKHmlbDvvIzmi5Lnu50gUHJvbWlzZQoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCX0pOwoJCQkJfTsKCgkJCQlzZW5kUmVxdWVzdCgpOyAvLyDliJ3lp4vor7fmsYIKCQkJfSk7CgkJfSwKCgkJLy8g6I635Y+W6ISa5pys5L+h5oGvCgkJZmV0Y2hTY3JpcHRJbmZvKHVybCwgcmV0cnlDb3VudCkgewoJCQlyZXR1cm4gZmV0Y2godXJsKQoJCQkudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpCgkJCS50aGVuKGRhdGEgPT4gewoJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUZldGNoXG7or7fmsYLlnLDlnYDvvJonICsgdXJsICsgJyAoR3JlYXN5Rm9yaylcbui/lOWbnue7k+aenO+8micsIGRhdGEpOwoJCQkJcmV0dXJuIGRhdGE7CgkJCX0pCgkJCS5jYXRjaChlcnJvciA9PiB7CgkJCQljb25zb2xlLmVycm9yKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFGZXRjaFxu6I635Y+W6ISa5pys54mI5pys5pe25Y+R55Sf6ZSZ6K+vJywgZXJyb3IpOwoJCQkJaWYgKHJldHJ5Q291bnQgPiAwKSB7CgkJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUZldGNoXG4156eS5ZCO5bCG6YeN5paw5bCd6K+V6I635Y+W54mI5pysIik7CgkJCQkJcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDAwKSkKCQkJCQkJLnRoZW4oKCkgPT4gewoJCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUZldGNoXG7ph43mlrDlsJ3or5Xojrflj5bohJrmnKzkv6Hmga8uLi4nKTsKCQkJCQkJCXJldHVybiBmZXRjaFNjcmlwdEluZm8odXJsLCByZXRyeUNvdW50IC0gMSk7CgkJCQkJCX0pOwoJCQkJfSBlbHNlIHsKCQkJCQljb25zb2xlLmVycm9yKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFGZXRjaFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG7ml6Dms5Xojrflj5bohJrmnKzkv6Hmga/vvIzovr7liLDmnIDlpKflsJ3or5XmrKHmlbDjgIInKTsKCQkJCQl0aHJvdyBlcnJvcjsKCQkJCX0KCQkJfSk7CgkJfSwKCgkJYXN5bmMgcnBjVGVzdChkb21haW4sIHBvcnQsIHBhdGgsIHRva2VuKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQlsZXQgcnBjID0geyBkb21haW4sIHBvcnQsIHBhdGgsIHRva2VuIH07CgkJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCQlsZXQgcnBjRGF0YSA9IHsKCQkJCQlpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCgkJCQkJanNvbnJwYzogJzIuMCcsCgkJCQkJbWV0aG9kOiAnc3lzdGVtLmxpc3RNZXRob2RzJywKCQkJCQlwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YF0sCgkJCQl9OwoJCQkJR01feG1saHR0cFJlcXVlc3QoewoJCQkJCW1ldGhvZDogIlBPU1QiLCB1cmwsIGhlYWRlcnM6IHt9LCBkYXRhOiBKU09OLnN0cmluZ2lmeShycGNEYXRhKSwKCQkJCQlyZXNwb25zZVR5cGU6ICdqc29uJywKCQkJCQlvbmxvYWQ6IChyZXMpID0+IHsKCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3QgUlBDVGVzdFxu6K+35rGC5Zyw5Z2A77yaJyArIHVybCArICdcbuivt+axgue7k+aenO+8micsIHJlcyk7CgkJCQkJCWlmKHJlcy5yZXNwb25zZSl7CgkJCQkJCQlyZXNvbHZlKCJzdWNjZXNzIik7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXNvbHZlKCJmYWlsIik7CgkJCQkJCX0KCQkJCQl9LAoJCQkJCW9uZXJyb3I6IChlcnIpID0+IHsKCQkJCQkJY29uc29sZS5lcnJvcign44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRUG9zdCBSUENUZXN0XG7or7fmsYLlpLHotKUnLCBlcnIpOwoJCQkJCQlyZXNvbHZlKCJmYWlsIik7CgkJCQkJfSwKCQkJCX0pOwoJCQl9KTsKCQl9LAoKCQlzdHJpbmdpZnkob2JqKSB7CgkJCWxldCBzdHIgPSAnJzsKCQkJZm9yICh2YXIga2V5IGluIG9iaikgewoJCQkJaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CgkJCQkJdmFyIHZhbHVlID0gb2JqW2tleV07CgkJCQkJaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CgkJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKCQkJCQkJCXN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZVtpXSkgKyAnJic7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlzdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpICsgJyYnOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gc3RyLnNsaWNlKDAsIC0xKTsgLy8g5Y675o6J5pyr5bC+55qEICImIgoJCX0sCgoJCWFkZFN0eWxlKGlkLCB0YWcsIGNzcykgewoJCQl0YWcgPSB0YWcgfHwgJ3N0eWxlJzsKCQkJbGV0IGRvYyA9IGRvY3VtZW50LCBzdHlsZURvbSA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7CgkJCWlmIChzdHlsZURvbSkgc3R5bGVEb20ucmVtb3ZlKCk7CgkJCWxldCBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7CgkJCXN0eWxlLnJlbCA9ICdzdHlsZXNoZWV0JzsKCQkJc3R5bGUuaWQgPSBpZDsKCQkJdGFnID09PSAnc3R5bGUnID8gc3R5bGUuaW5uZXJIVE1MID0gY3NzIDogc3R5bGUuaHJlZiA9IGNzczsKCQkJZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQoc3R5bGUpOwoJCX0sCgoJCXNsZWVwKHRpbWUpIHsKCQkJcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lKSk7CgkJfSwKCgkJZmluZFJlYWN0KGRvbSwgdHJhdmVyc2VVcCA9IDApIHsKCQkJY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZG9tKS5maW5kKGtleSA9PiB7CgkJCQlyZXR1cm4ga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RGaWJlciQiKQoJCQkJfHwga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCIpOwoJCQl9KTsKCQkJY29uc3QgZG9tRmliZXIgPSBkb21ba2V5XTsKCQkJaWYgKGRvbUZpYmVyID09IG51bGwpIHJldHVybiBudWxsOwoKCQkJaWYgKGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudCkgewoJCQkJbGV0IGNvbXBGaWJlciA9IGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudC5fb3duZXI7CgkJCQlmb3IgKGxldCBpID0gMDsgaSA8IHRyYXZlcnNlVXA7IGkrKykgewoJCQkJCWNvbXBGaWJlciA9IGNvbXBGaWJlci5fY3VycmVudEVsZW1lbnQuX293bmVyOwoJCQkJfQoJCQkJcmV0dXJuIGNvbXBGaWJlci5faW5zdGFuY2U7CgkJCX0KCgkJCWNvbnN0IEdldENvbXBGaWJlciA9IGZpYmVyID0+IHsKCQkJCWxldCBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjsKCQkJCXdoaWxlICh0eXBlb2YgcGFyZW50RmliZXIudHlwZSA9PSAic3RyaW5nIikgewoJCQkJCXBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuOwoJCQkJfQoJCQkJcmV0dXJuIHBhcmVudEZpYmVyOwoJCQl9OwoJCQlsZXQgY29tcEZpYmVyID0gR2V0Q29tcEZpYmVyKGRvbUZpYmVyKTsKCQkJZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsKCQkJCWNvbXBGaWJlciA9IEdldENvbXBGaWJlcihjb21wRmliZXIpOwoJCQl9CgkJCXJldHVybiBjb21wRmliZXIuc3RhdGVOb2RlIHx8IGNvbXBGaWJlcjsKCQl9LAoKCQkvL+azqOWGjOm7mOiupOiuvue9rgoJCWluaXREZWZhdWx0Q29uZmlnKCkgewoJCQlsZXQgdmFsdWUgPSBbewoJCQkJbmFtZTogJ3NldHRpbmdfcnBjX2RvbWFpbicsCgkJCQl2YWx1ZTogJ2h0dHA6Ly9sb2NhbGhvc3QnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY19wb3J0JywKCQkJCXZhbHVlOiAnMTY4MDAnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY19wYXRoJywKCQkJCXZhbHVlOiAnL2pzb25ycGMnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY190b2tlbicsCgkJCQl2YWx1ZTogJycKCQkJfSwgewoJCQkJbmFtZTogJ3NldHRpbmdfcnBjX2RpcicsCgkJCQl2YWx1ZTogJ0Q6JwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ190ZXJtaW5hbF90eXBlJywKCQkJCXZhbHVlOiAnd2MnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3RoZW1lX2NvbG9yJywKCQkJCXZhbHVlOiAnIzU3NEFCOCcKCQkJfSwgewoJCQkJbmFtZTogJ3NldHRpbmdfaW5pdF9jb2RlJywKCQkJCXZhbHVlOiAnJwoJCQl9LCB7CgkJCQluYW1lOiAnbGljZW5zZScsCgkJCQl2YWx1ZTogJycKCQkJfSwgLyp7CgkJCQluYW1lOiAnc2V0dGluZ191cGRhdGVfY2hlY2snLAoJCQkJdmFsdWU6ICd5ZXMnCgkJCX0sKi8gewoJCQkJbmFtZTogJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLAoJCQkJdmFsdWU6ICd2MicKCQkJfSwgewoJCQkJbmFtZTogJ3NldHRpbmdfaGlkZV9pZG0nLAoJCQkJdmFsdWU6ICdubycKCQkJfSwgewoJCQkJbmFtZTogJ3NldHRpbmdfYmFpZHVfdGhlbWUnLAoJCQkJdmFsdWU6ICdubycKCQkJfV07CgoJCQl2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7CgkJCQkvLyDmsqHmnInlr7nlupTnmoTpobnnm67lsLHmt7vliqDkuIrpobnnm64KCQkJCWJhc2UuZ2V0VmFsdWUodi5uYW1lKSA9PT0gdW5kZWZpbmVkICYmIGJhc2Uuc2V0VmFsdWUodi5uYW1lLCB2LnZhbHVlKTsKCQkJfSk7CgkJfSwKCgkJLy8g6K6+572u55WM6Z2iCgkJc2hvd1NldHRpbmcoKSB7CgkJCWxldCBkb20gPSAnJywKCQkJCWJ0biA9ICcnLAoJCQkJY29sb3JMaXN0ID0gWycjMDlBQUZGJywnI2NjMzIzNScsJyM2MzdkZjgnLCcjNTE4YzE3JywnI2VkOTQ0YicsJyNmOTY5YTUnLCcjYmNhMjgwJywnIzU3NEFCOCcsJyMwZDUzZmYnLCcjNjM3ZGZmJywnIzMxODFmOScsJyNmOGQ4MDAnLCcjMDM5NmZmJywnIzMyY2NiYycsJyNmNjQxNmMnLCcjMjI3MWIxJywnIzU5NTI0YycsJyMxMDE3MWQnLCcjMWQyMzI3JywnIzE4YTQ5NyddLAoJCQkJY29sb3JOYW1lTGlzdCA9IFsn5bqm55uYPGJyPue7j+WFuOiTnScsJ+W6puebmDxicj7lubPlronnuqInLCfluqbnm5g8YnI+6Zye5YWJ57SrJywn5bqm55uYPGJyPuebjueEtue7vycsJ+W6puebmDxicj7lkajlubTmqZknLCfluqbnm5g8YnI+5bm45Lya57KJJywn5bqm55uYPGJyPuWNiOWQjuajlScsJ+W6puebmDxicj7mmJ/nqbrntKsnLCflpLjlhYs8YnI+5piO5Lqu6JOdJywn6Zi/6YeMPGJyPuS6keebmOe0qycsJ+enu+WKqDxicj7lvankupHok50nLCfmnpzmoLg8YnI+5p+g5qqs6buEJywn5p6c5qC4PGJyPum7mOiupOiTnScsJ+aenOaguDxicj7noqfms6Lnu78nLCfmnpzmoLg8YnI+546r55Gw57qiJywn5paH5rS+PGJyPum7mOiupOiTnScsJ+aWh+a0vjxicj7lkpbllaHngbAnLCfmlofmtL48YnI+6buY6K6k6buRJywnT3BlbkFJPGJyPum7mOiupOm7kScsJ09wZW5BSTxicj7pu5jorqTpnZInXTsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPkuLvmnLo8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgIHBsYWNlaG9sZGVyPSLkuLvmnLrlnLDlnYDvvIzpnIDluKbkuIpodHRwKHMpOi8v77yM5L2G5LiN6ZyA6KaB5YaZ56uv5Y+j5LiO6Lev5b6EIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItZG9tYWluIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPnq6/lj6M8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iuerr+WPo+WPt++8jOS+i+Wmgu+8mk1vdHJpeOS4i+i9veWZqOS4ujE2ODAwIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItcG9ydCIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+i3r+W+hDwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i6Lev5b6E77yM6buY6K6k5Li6L2pzb25ycGMiIGNsYXNzPSJzd2FsMi1pbnB1dCBwbC1pbnB1dCBsaXN0ZW5lci1wYXRoIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD5a+G6ZKlPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLml6Dlr4bpkqXml6DpnIDloavlhpkiIGNsYXNzPSJzd2FsMi1pbnB1dCBwbC1pbnB1dCBsaXN0ZW5lci10b2tlbiIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kv53lrZjot6/lvoQ8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IuaWh+S7tuS4i+i9veWQjuS/neWtmOi3r+W+hO+8jOS+i+Wmgu+8mkQ6IiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItZGlyIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7lvZPliY1SUEM8L2Rpdj48ZGl2PjxzcGFuIGlkPSJwbC1ycGNEb21haW4iPiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyl9PC9zcGFuPjo8c3BhbiBpZD0icGwtcnBjUG9ydCI+JHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0Jyl9PC9zcGFuPjxzcGFuIGlkPSJwbC1ycGNQYXRoIj4ke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKX08L3NwYW4+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJwbC1idXR0b24tbWluaSBzd2FsMi1jb25maXJtIHN3YWwyLXN0eWxlZCBsaXN0ZW5lci1ycGMtdGVzdCI+5rWL6K+VPC9idXR0b24+PC9kaXY+PC9sYWJlbD5gOwoKCQkJY29sb3JMaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWJ0biArPSBgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogJHt2fTtib3JkZXI6IDFweCBzb2xpZCAke3Z9IiBjbGFzcz0icGwtY29sb3ItYm94ICR7diA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpID8gJ2xpc3RlbmVyLWNvbG9yJyA6ICdsaXN0ZW5lci1jb2xvcid9Ij4KCQkJCTxkaXYgZGF0YS1jb2xvcj0iJHt2fSIgY2xhc3M9InBsLW1hc2siPiR7Y29sb3JOYW1lTGlzdFtpXX0gJHt2ID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJykgPyAnPHNwYW4gaWQ9InBsLXRoaXNDb2xvciI+KOW9k+WJjSk8L3NwYW4+JyA6ICcnfTwvZGl2PgoJCQk8L2Rpdj5gOwoJCQl9KTsKCgoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPue7iOerr+exu+WeizwvZGl2PjxzZWxlY3QgY2xhc3M9InN3YWwyLXNlbGVjdCBwbC1pbnB1dCBsaXN0ZW5lci10ZXJtaW5hbCI+YDsKCQkJT2JqZWN0LmtleXModGVybWluYWxUeXBlKS5mb3JFYWNoKGsgPT4gewoJCQkJZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke2t9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpID09PSBrID8gJ3NlbGVjdGVkJyA6ICcnfT4ke3Rlcm1pbmFsVHlwZVtrXX08L29wdGlvbj5gOwoJCQl9KTsKCQkJZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7CgoJCQkvKmRvbSArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7mo4Dmn6Xmm7TmlrA8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgdXBkYXRlX2NoZWNrIj5gOwoJCQlPYmplY3Qua2V5cyh1cGRhdGVjaGVjaykuZm9yRWFjaCh2YWx1ZSA9PiB7ZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3VwZGF0ZV9jaGVjaycpID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ30+JHt1cGRhdGVjaGVja1t2YWx1ZV19PC9vcHRpb24+YDt9KTsKCQkJZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7Ki8KCgkJCWRvbSArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7mnKrmib7liLBJRE3mj5DnpLo8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgaGlkZV9pZG0iPmA7CgkJCU9iamVjdC5rZXlzKGhpZGVpZG0pLmZvckVhY2godmFsdWUgPT4ge2RvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHt2YWx1ZX0iICR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19oaWRlX2lkbScpID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ30+JHtoaWRlaWRtW3ZhbHVlXX08L29wdGlvbj5gO30pOwoJCQlkb20gKz0gYDwvc2VsZWN0PjwvbGFiZWw+YDsKCgkJCWRvbSArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kv67mlLnnmb7luqbnvZHnm5jnlYzpnaLkuLrkuLvpopjoibJb5a6e6aqMXTwvZGl2PjxzZWxlY3QgY2xhc3M9InN3YWwyLXNlbGVjdCBwbC1pbnB1dCBiYWlkdV90aGVtZSI+YDsKCQkJT2JqZWN0LmtleXMoYmFpZHV0aGVtZSkuZm9yRWFjaCh2YWx1ZSA9PiB7ZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2JhaWR1X3RoZW1lJykgPT09IHZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnfT4ke2JhaWR1dGhlbWVbdmFsdWVdfTwvb3B0aW9uPmA7fSk7CgkJCWRvbSArPSBgPC9zZWxlY3Q+PC9sYWJlbD5gOwoKCQkJZG9tICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS9v+eUqOayueWwj+eMtOacjeWKoeWZqDwvZGl2PjxzZWxlY3QgY2xhc3M9InN3YWwyLXNlbGVjdCBwbC1pbnB1dCB5b3V4aWFvaG91X3NlcnZlciI+YDsKCQkJT2JqZWN0LmtleXMoeW91c2VydmVyKS5mb3JFYWNoKHZhbHVlID0+IHtkb20gKz0gYDxvcHRpb24gdmFsdWU9IiR7dmFsdWV9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gdmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9PiR7eW91c2VydmVyW3ZhbHVlXX08L29wdGlvbj5gO30pOwoJCQlkb20gKz0gYDwvc2VsZWN0PjwvbGFiZWw+YDsKCgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Li76aKY6aKc6ImyPC9kaXY+IDxkaXYgY2xhc3M9InBsLWNvbG9yIj4ke2J0bn08L2Rpdj48L2xhYmVsPmA7CgoJCQlkb20gKz0gYDxidXR0b24gdHlwZT0iYnV0dG9uIiBzdHlsZT0ibWFyZ2luLXRvcDogMzBweDsiIGNsYXNzPSJwbC1idXR0b24tbWluaSBzd2FsMi1kZW55IHN3YWwyLXN0eWxlZCBsaXN0ZW5lci1yZWdpc3RlciI+54aE54Gt5bey57uP54K55Lqu55qE5oyJ6ZKuPC9idXR0b24+YAoKCQkJZG9tID0gJzxkaXY+JyArIGRvbSArICc8L2Rpdj4nOwoKCQkJU3dhbC5maXJlKHsKCQkJCXRpdGxlOiAn5Yqp5omL6K6+572uJywKCQkJCWh0bWw6IGRvbSwKCQkJCWljb246ICdpbmZvJywKCQkJCWljb25IdG1sOiAn4pqZJywKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQlmb290ZXI6IHBhbi5mb290ZXIsCgkJCX0pLnRoZW4oKHJlc3VsdCkgPT4gewoJCQkJU3dhbC5maXJlKHsKCQkJCQl0aXRsZTogIuiuvue9ruW3suS/neWtmCIsCgkJCQkJaWNvbjogJ3N1Y2Nlc3MnLAoJCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQkJc2hvd0RlbnlCdXR0b246IHRydWUsCgkJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfliLfmlrAnLAoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCWh0bWw6IGDlt7Lnu4/kv53lrZjorr7nva7kuoblk6Z+IOWIt+aWsOWwseeUn+aViOWVpiFgLAoJCQkJCWRlbnlCdXR0b25UZXh0OiAn5Y+W5raIJwoJCQkJfSkudGhlbigocmVzdWx0KSA9PiB7CgkJCQkJaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCl7CgkJCQkJCW1lc3NhZ2Uuc3VjY2Vzcygn5Yi35paw5LitJyk7CgkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJfQoJCQkJfSk7CgkJCX0pOwoJCQkKCgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJlZ2lzdGVyJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2UucmVnaXN0ZXJJbml0Q29kZSgxMTExMTEpOwoJCQl9KTsKCQkJZG9jLm9mZignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10ZXN0Jykub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGVzdCcsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlsZXQgZG9tYWluID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0ID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJcGF0aCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKSwKCQkJCXRva2VuID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKTsKCQkJCWUudGFyZ2V0LmlubmVySFRNTCA9ICLnrYnlvoUiOwoJCQkJbGV0IHJlc3VsdCA9IGF3YWl0IGJhc2UucnBjVGVzdChkb21haW4sIHBvcnQsIHBhdGgsIHRva2VuKTsKCQkJCWlmIChyZXN1bHQgPT09ICJzdWNjZXNzIikgewoJCQkJCWUudGFyZ2V0LmlubmVySFRNTCA9ICLmiJDlip8iOwoJCQkJCWUudGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjNTJjNDFhIjsKCQkJCX0gZWxzZSB7CgkJCQkJZS50YXJnZXQuaW5uZXJIVE1MID0gIuWksei0pSI7CgkJCQkJZS50YXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNjYjE2MTYiOwoJCQkJfQoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCWUudGFyZ2V0LmlubmVySFRNTCA9ICLmtYvor5UiOwoJCQkJCWUudGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKTsKCQkJCX0sNTAwMCkKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWNvbG9yJywgYXN5bmMgKGUpID0+IHsKCQkJCWlmKGUudGFyZ2V0LmRhdGFzZXQuY29sb3IpewoJCQkJCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtdGhpc0NvbG9yIikpewoJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtdGhpc0NvbG9yIikucmVtb3ZlKCk7CgkJCQkJfQoJCQkJCWUudGFyZ2V0LmlubmVySFRNTCArPSAnPHNwYW4gaWQ9InBsLXRoaXNDb2xvciI+KOW9k+WJjSk8L3NwYW4+JzsKCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJywgZS50YXJnZXQuZGF0YXNldC5jb2xvcik7CgkJCQkJYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItZG9tYWluJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1ycGNEb21haW4iKS5pbm5lckhUTUwgPSBlLnRhcmdldC52YWx1ZTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXBvcnQnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcsIGUudGFyZ2V0LnZhbHVlKTsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1ycGNQb3J0IikuaW5uZXJIVE1MID0gZS50YXJnZXQudmFsdWU7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wYXRoJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnLCBlLnRhcmdldC52YWx1ZSk7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtcnBjUGF0aCIpLmlubmVySFRNTCA9IGUudGFyZ2V0LnZhbHVlOwoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItdG9rZW4nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kaXInLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLmxpc3RlbmVyLXRlcm1pbmFsJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignY2hhbmdlJywgJy51cGRhdGVfY2hlY2snLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ191cGRhdGVfY2hlY2snLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NoYW5nZScsICcuaGlkZV9pZG0nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19oaWRlX2lkbScsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignY2hhbmdlJywgJy5iYWlkdV90aGVtZScsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2JhaWR1X3RoZW1lJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLnlvdXhpYW9ob3Vfc2VydmVyJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCX0sCgoJCS8vIOaJi+acuueJiOiuvue9rueVjOmdogoJCXNob3dXYXBTZXR0aW5nKCkgewoJCQlsZXQgZG9tID0gJycsCgkJCQlidG4gPSAnJywKCQkJCWNvbG9yTGlzdCA9IFsnIzA5QUFGRicsJyNjYzMyMzUnLCcjNjM3ZGY4JywnIzUxOGMxNycsJyNlZDk0NGInLCcjZjk2OWE1JywnI2JjYTI4MCcsJyM1NzRBQjgnLCcjMGQ1M2ZmJywnIzYzN2RmZicsJyMzMTgxZjknXSwKCQkJCWNvbG9yTmFtZUxpc3QgPSBbJ+W6puebmDxicj7nu4/lhbjok50nLCfluqbnm5g8YnI+5bmz5a6J57qiJywn5bqm55uYPGJyPumcnuWFiee0qycsJ+W6puebmDxicj7nm47nhLbnu78nLCfluqbnm5g8YnI+5ZGo5bm05qmZJywn5bqm55uYPGJyPuW5uOS8mueyiScsJ+W6puebmDxicj7ljYjlkI7mo5UnLCfluqbnm5g8YnI+5pif56m657SrJywn5aS45YWLPGJyPuaYjuS6ruiTnScsJ+mYv+mHjDxicj7kupHnm5jntKsnLCfnp7vliqg8YnI+5b2p5LqR6JOdJ107CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD5Li75py6PC9kaXY+PGlucHV0IHR5cGU9InRleHQiICBwbGFjZWhvbGRlcj0i5Li75py65Zyw5Z2A77yM6ZyA5bim5LiKaHR0cChzKTovLyIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLWRvbWFpbiIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD56uv5Y+jPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLnq6/lj6Plj7fvvIzkvovlpoLvvJpNb3RyaXjkuLoxNjgwMCIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLXBvcnQiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPot6/lvoQ8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iui3r+W+hO+8jOm7mOiupOS4ui9qc29ucnBjIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItcGF0aCIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+WvhumSpTwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i5peg5a+G6ZKl5peg6ZyA5aGr5YaZIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItdG9rZW4iIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5L+d5a2Y6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLmlofku7bkuIvovb3lkI7kv53lrZjot6/lvoTvvIzkvovlpoLvvJpEOiIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLWRpciIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5b2T5YmNUlBDPC9kaXY+PGRpdj48c3BhbiBpZD0icGwtcnBjRG9tYWluIj4ke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpfTwvc3Bhbj46PHNwYW4gaWQ9InBsLXJwY1BvcnQiPiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpfTwvc3Bhbj48c3BhbiBpZD0icGwtcnBjUGF0aCI+JHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyl9PC9zcGFuPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icGwtYnV0dG9uLW1pbmkgc3dhbDItY29uZmlybSBzd2FsMi1zdHlsZWQgbGlzdGVuZXItcnBjLXRlc3QiPua1i+ivlTwvYnV0dG9uPjwvZGl2PjwvbGFiZWw+YDsKCgkJCWNvbG9yTGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlidG4gKz0gYDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICR7dn07Ym9yZGVyOiAxcHggc29saWQgJHt2fSIgY2xhc3M9InBsLWNvbG9yLWJveCAke3YgPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKSA/ICdsaXN0ZW5lci1jb2xvcicgOiAnbGlzdGVuZXItY29sb3InfSI+CgkJCQk8ZGl2IGRhdGEtY29sb3I9IiR7dn0iIGNsYXNzPSJwbC1tYXNrIj4ke2NvbG9yTmFtZUxpc3RbaV19ICR7diA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpID8gJzxzcGFuIGlkPSJwbC10aGlzQ29sb3IiPijlvZPliY0pPC9zcGFuPicgOiAnJ308L2Rpdj4KCQkJPC9kaXY+YDsKCQkJfSk7CgoKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7nu4jnq6/nsbvlnos8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgbGlzdGVuZXItdGVybWluYWwiPmA7CgkJCU9iamVjdC5rZXlzKHRlcm1pbmFsVHlwZSkuZm9yRWFjaChrID0+IHsKCQkJCWRvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHtrfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKSA9PT0gayA/ICdzZWxlY3RlZCcgOiAnJ30+JHt0ZXJtaW5hbFR5cGVba119PC9vcHRpb24+YDsKCQkJfSk7CgkJCWRvbSArPSBgPC9zZWxlY3Q+PC9sYWJlbD5gOwoKCQkJLypkb20gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5qOA5p+l5pu05pawPC9kaXY+PHNlbGVjdCBjbGFzcz0ic3dhbDItc2VsZWN0IHBsLWlucHV0IHVwZGF0ZV9jaGVjayI+YDsKCQkJT2JqZWN0LmtleXModXBkYXRlY2hlY2spLmZvckVhY2godmFsdWUgPT4ge2RvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHt2YWx1ZX0iICR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ191cGRhdGVfY2hlY2snKSA9PT0gdmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9PiR7dXBkYXRlW3ZhbHVlXX08L29wdGlvbj5gO30pOwoJCQlkb20gKz0gYDwvc2VsZWN0PjwvbGFiZWw+YDsqLwoKCQkJZG9tICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS/ruaUueeZvuW6pue9keebmOeVjOmdouS4uuS4u+mimOiJslvlrp7pqoxdPC9kaXY+PHNlbGVjdCBjbGFzcz0ic3dhbDItc2VsZWN0IHBsLWlucHV0IGJhaWR1X3RoZW1lIj5gOwoJCQlPYmplY3Qua2V5cyhoaWRlaWRtKS5mb3JFYWNoKHZhbHVlID0+IHtkb20gKz0gYDxvcHRpb24gdmFsdWU9IiR7dmFsdWV9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfYmFpZHVfdGhlbWUnKSA9PT0gdmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9PiR7YmFpZHV0aGVtZVt2YWx1ZV19PC9vcHRpb24+YDt9KTsKCQkJZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7CgoJCQlkb20gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5L2/55So5rK55bCP54y05pyN5Yqh5ZmoPC9kaXY+PHNlbGVjdCBjbGFzcz0ic3dhbDItc2VsZWN0IHBsLWlucHV0IHlvdXhpYW9ob3Vfc2VydmVyIj5gOwoJCQlPYmplY3Qua2V5cyh5b3VzZXJ2ZXIpLmZvckVhY2godmFsdWUgPT4ge2RvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHt2YWx1ZX0iICR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ30+JHt5b3VzZXJ2ZXJbdmFsdWVdfTwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+YDt9KTsKCgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Li76aKY6aKc6ImyPC9kaXY+IDxkaXYgY2xhc3M9InBsLWNvbG9yIj4ke2J0bn08L2Rpdj48L2xhYmVsPmA7CgoJCQlkb20gKz0gYDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icGwtYnV0dG9uLW1pbmkgc3dhbDItZGVueSBzd2FsMi1zdHlsZWQgbGlzdGVuZXItcmVnaXN0ZXIiPueGhOeBreW3sue7j+eCueS6rueahOaMiemSrjwvYnV0dG9uPmAKCgkJCWRvbSA9ICc8ZGl2PicgKyBkb20gKyAnPC9kaXY+JzsKCgkJCVN3YWwuZmlyZSh7CgkJCQl0aXRsZTogJ+WKqeaJi+iuvue9ricsCgkJCQlodG1sOiBkb20sCgkJCQlpY29uOiAnaW5mbycsCgkJCQlpY29uSHRtbDogJ+KamScsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJZm9vdGVyOiBwYW4uZm9vdGVyLAoJCQl9KS50aGVuKChyZXN1bHQpID0+IHsKCQkJCVN3YWwuZmlyZSh7CgkJCQkJdGl0bGU6ICLorr7nva7lt7Lkv53lrZgiLAoJCQkJCWljb246ICdzdWNjZXNzJywKCQkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJCXNob3dEZW55QnV0dG9uOiB0cnVlLAoJCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn5Yi35pawJywKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlodG1sOiBg5bey57uP5L+d5a2Y6K6+572u5LqG5ZOmfiDliLfmlrDlsLHnlJ/mlYjllaYhYCwKCQkJCQlkZW55QnV0dG9uVGV4dDogJ+WPlua2iCcKCQkJCX0pLnRoZW4oKHJlc3VsdCkgPT4gewoJCQkJCWlmIChyZXN1bHQuaXNDb25maXJtZWQpewoJCQkJCQltZXNzYWdlLnN1Y2Nlc3MoJ+WIt+aWsOS4rScpOwoJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCX0KCQkJCX0pOwoJCQl9KTsKCgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJlZ2lzdGVyJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2UucmVnaXN0ZXJJbml0Q29kZSgxMTExMTEpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItY29sb3InLCBhc3luYyAoZSkgPT4gewoJCQkJaWYoZS50YXJnZXQuZGF0YXNldC5jb2xvcil7CgkJCQkJaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC10aGlzQ29sb3IiKSl7CgkJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC10aGlzQ29sb3IiKS5yZW1vdmUoKTsKCQkJCQl9CgkJCQkJZS50YXJnZXQuaW5uZXJIVE1MICs9ICc8c3BhbiBpZD0icGwtdGhpc0NvbG9yIj4o5b2T5YmNKTwvc3Bhbj4nOwoJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InLCBlLnRhcmdldC5kYXRhc2V0LmNvbG9yKTsKCQkJCQliYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CgkJCQl9CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kb21haW4nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItcG9ydCcsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItcGF0aCcsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItdG9rZW4nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kaXInLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLmxpc3RlbmVyLXRlcm1pbmFsJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignY2hhbmdlJywgJy51cGRhdGVfY2hlY2snLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ191cGRhdGVfY2hlY2snLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NoYW5nZScsICcuaGlkZV9pZG0nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19oaWRlX2lkbScsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignY2hhbmdlJywgJy5iYWlkdV90aGVtZScsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2JhaWR1X3RoZW1lJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLnlvdXhpYW9ob3Vfc2VydmVyJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCX0sCgoJCXNob3dJbmZvKCkgewoJCQlsZXQgaGlkZWluZm89Jyc7CgkJCWhpZGVpbmZvICs9YDxzcGFuPuS7peS4i+WGheWuuemDveaYr+iEmuacrOiHquW3seajgOa1i+WIsOeahOS/oeaBrzxicj7mnKzpobXpnaLku4XkvZzkuLrosIPor5Xkvb/nlKg8c3Bhbj5gOwoJCQloaWRlaW5mbyArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7niYjmnKw8L2Rpdj4ke3JlYWx2ZXJzaW9ufTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+6Jma5YGH54mI5pysPC9kaXY+JHt2ZXJzaW9ufTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+6ISa5pys5L2c6ICFPC9kaXY+JHtyZWFsYXV0aG9yfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+6Jma5YGH5L2c6ICFPC9kaXY+JHthdXRob3J9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Yid5aeL5YyW5pqX5Y+3PC9kaXY+JHtwYW4ubnVtfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuWIneWni+WMluWNj+iurjwvZGl2PiR7cGFuLmxpY2Vuc2V9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+VUHku6PnkIY8L2Rpdj4ke3Bhbi51YX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7lhazkvJflj7flnLDlnYA8L2Rpdj4ke3Bhbi5pbWd9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+572R55uY5LiH6IO95Yqp5omLPC9kaXY+JHtwYW4uYXNzaXN0YW50fTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPue9keebmOmVnOWDjzwvZGl2PiR7cGFuLm1pcnJvcn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPnrqHnkIY8L2Rpdj4ke3Bhbi5kfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPklETeS7i+e7jTwvZGl2PiR7cGFuLmlkbX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7mj5DnpLrmlofmnKw8L2Rpdj4w44CBJHtwYW4uaW5pdFswXX08YnI+MeOAgSR7cGFuLmluaXRbMV19PGJyPjLjgIEke3Bhbi5pbml0WzJdfTxicj4z44CBJHtwYW4uaW5pdFszXX08YnI+NOOAgSR7cGFuLmluaXRbNF19PGJyPjXjgIEke3Bhbi5pbml0WzVdfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPumhteiEmjwvZGl2PiR7cGFuLmZvb3Rlcn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvID0gJzxkaXY+JyArIGhpZGVpbmZvICsgJzwvZGl2Pic7CgoJCQlTd2FsLmZpcmUoewoJCQkJaWNvbjogJ2luZm8nLAoJCQkJdGl0bGU6ICfosIPor5Xkv6Hmga8nLAoJCQkJaHRtbDogaGlkZWluZm8sCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nCgkJCX0pOwoJCX0sCgoJCXNob3dQYW5JbmZvKCkgewoJCQlsZXQgaGlkZWluZm89Jyc7CgkJCWhpZGVpbmZvICs9YDxzcGFuPuacrOmhtemdouS7heS9nOS4uuiwg+ivleS9v+eUqDxzcGFuPmA7CgkJCWhpZGVpbmZvICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPueJiOacrDwvZGl2PiR7cmVhbHZlcnNpb259PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kvZzogIU8L2Rpdj4ke3JlYWxhdXRob3J9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Yid5aeL5YyW5pqX5Y+3PC9kaXY+JHtwYW4ubnVtfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuWIneWni+WMluWNj+iurjwvZGl2PiR7cGFuLmxpY2Vuc2V9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5YWs5LyX5Y+35Zyw5Z2APC9kaXY+JHtwYW4uaW1nfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPue9keebmOS4h+iDveWKqeaJizwvZGl2PiR7cGFuLmFzc2lzdGFudH08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPnrqHnkIY8L2Rpdj4ke3Bhbi5kfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPklETeS7i+e7jTwvZGl2PiR7cGFuLmlkbX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvID0gJzxkaXY+JyArIGhpZGVpbmZvICsgJzwvZGl2Pic7CgoJCQlTd2FsLmZpcmUoewoJCQkJaWNvbjogJ2luZm8nLAoJCQkJdGl0bGU6ICfosIPor5Xkv6Hmga8nLAoJCQkJaHRtbDogaGlkZWluZm8sCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nCgkJCX0pOwoJCX0sCgoJCXNob3dVcGRhdGVMb2coKSB7CgkJCVN3YWwuZmlyZSh7CgkJCQlpY29uOiAnaW5mbycsCgkJCQl0aXRsZTogJ+abtOaWsOaXpeW/lyjlhbPpl63mjInpkq7lnKjkuIvpnaLlk6YpJywKCQkJCWh0bWw6IGA8c3Bhbj4KCQkJCVYxLjAuNy44PGJyPjHjgIHot5/ov5vlrpjmlrlWNi4xLjLvvIzliqDlhaVWMuaOpeWPo++8mzxicj4y44CB5L+u5aSN55m+5bqm572R55uY5LiL6L295pe25Zug5Li66I635Y+W5LiN5YiwYWNjZXNzVG9rZW7ogIzkuIDnm7TovazlnIjjgII8YnI+PGJyPgoJCQkJVjEuMC43Ljc8YnI+MeOAgeS/ruWkjeeZvuW6pue9keebmOeahOaMiemSruS8muWboOS4uuS4u+mimOS4jeWQjOiAjOiiq+aUueWPmOminOiJsueahEJ1Z++8mzxicj4y44CB5pu05paw5aS45YWL572R55uY5oyJ6ZKu5LiO55WM6Z2i44CCPGJyPjxicj4KCQkJCVYxLjAuNy42PGJyPjHjgIHkv67lpI3igJzms6jlhaXigJ3lip/og73vvJs8YnI+MuOAgem7keaal+aooeW8j+aUr+aMgemaj+iuvue9rueDreWIh+aNouOAgjxicj48YnI+CgkJCQlWMS4wLjcuNTxicj4x44CB5L+u5aSN6Zi/6YeM5LqR55uY5LiL6L296YC76L6R77ybPGJyPjLjgIHnsr7nroDku6PnoIHvvJs8YnI+M+OAgeaUr+aMgea3seiJsuaooeW8j++8mzxicj4044CB5L+u5pS56YOo5YiG5o+Q56S65paH5pys77ybPGJyPjXjgIHkv67mlLnpg6jliIZDU1PvvJs8YnI+NuOAgeiuvue9ruWPr+a1i+ivlVJQQ+i/nuaOpeOAgjxicj48YnI+CgkJCQlWMS4wLjcuNDxicj4x44CB5LyY5YyW5LiL6L296YC76L6R77ybPGJyPjLjgIHkv67lpI3pmL/ph4zkupHnm5jml6Dms5Xkvb/nlKhBUEnkuIvovb3jgII8YnI+PGJyPgoJCQkJVjEuMC43LjM8YnI+MeOAgeWmguaenOWHuueOsOe9kee7nOivt+axgumUmeivr+aXtuaUr+aMgeiHquWKqOmHjeaWsOivt+axgu+8mzxicj4y44CB5Y+v6YCJ5oup5piv5ZCm5L2/55So5rK55bCP54y05pyN5Yqh5Zmo44CCPGJyPjxicj4KCQkJCVYxLjAuNy4yPGJyPjHjgIHkv67lpI3kvb/nlKhSUEPkuIvovb3ml7bkvJrph43lpI3lj5HpgIHpk77mjqXnmoRCdWfjgII8YnI+PGJyPgoJCQkJVjEuMC43LjE8YnI+MeOAgVvlrp7pqozlip/og73vvIzkuI3lvbHlk43mraPluLjkvb/nlKhd5pSv5oyB55m+5bqm572R55uY5omL5py6572R6aG154mI77yM5Yu+6YCJ5paH5Lu25ZCO5Y+v5Zyo6aG25qCP5om+5Yiw4oCc5LiL6L295Yqp5omL4oCd5oyJ6ZKu44CCPGJyPjxicj4KCQkJCVYxLjAuNzxicj4x44CB6YeN5p6E5aS45YWL572R55uY44CB6Zi/6YeM5LqR55uY5oyJ6ZKu44CCPGJyPjxicj4KCQkJCVYxLjAuNi45PGJyPjHjgIHkuIvovb3nqpflj6PliqDlhaXlhbPpl63mjInpkq7jgII8YnI+PGJyPgoJCQkJVjEuMC42Ljg8YnI+MeOAgeS/ruWkjeWkuOWFi+e9keebmOaMiemSrumUmeS9jeOAgjxicj48YnI+CgkJCQlWMS4wLjYuNzxicj4x44CB5bCG55m+5bqm572R55uY55WM6Z2i5L+u5pS55Li65Li76aKY6Imy77yM5Y+v5Zyo6K6+572u6YCJ5oup5piv5ZCm5L+u5pS577ybPGJyPjLjgIHlop7liqDkuLvpopjoibLlkI3np7DvvIzmm7TmlLnpg6jliIblhoXlrrnpopzoibLvvJs8YnI+M+OAgeenu+WKqOS6keebmEFQSeS4i+i9veaUr+aMgeaJuemHj+WkjeWItu+8mzxicj4044CB5LyY5YyW5o6n5Yi25Y+w6L6T5Ye657uT5p6c77ybPGJyPjXjgIHnmb7luqbnvZHnm5hBUEnkuIvovb3kuI3kvb/nlKhJRE3ml7blj6/ku6XmmL7npLrliankvZnml7bpl7TvvJs8YnI+NuOAgeKAnOWPlua2iOeCueS6ruaMiemSruKAneaMiemSrueahOS9jee9rueOsOW3suenu+WKqOWIsOiuvue9rumhtemdouOAgjxicj4344CBaG9tb+eJueacieeahOW9qeibi+WPiOWbnuadpeWKmyjllpwp44CCPGJyPjxicj4KCQkJCVYxLjAuNi42PGJyPjHjgIHkv67lpI3mmpflj7fplJnor6/jgII8YnI+PGJyPgoJCQkJVjEuMC42LjU8YnI+MeOAgeS/ruWkjeWNs+S9v+i+k+WFpeato+ehruaal+WPt+S5n+S4jeiDveaIkOWKn+eCueS6ruaMiemSrueahOacjeWKoeWZqOmUmeivr+OAgjxicj48YnI+CgkJCQlWMS4wLjYuNDxicj4x44CB6Lef6L+b5a6Y5pa5VjYuMS4x54mI5pys77yM5L+u5aSN6Zi/6YeM5LqR55uY6I635Y+W5LiL6L296ZO+5o6l5pe255qE6Zeu6aKY44CCPGJyPjxicj4KCQkJCVYxLjAuNi4zPGJyPjHjgIHnhafpob7lsI/lsY/luZXnlKjmiLfvvIzlsIblp4vnu4jmmL7npLrlpI3liLblhajpg6jpk77mjqXnmoTmjInpkq7vvJs8YnI+MuOAgeWinuWKoOWPlua2iOS4i+i9veaXtueahOWKqOeUu+OAgjxicj48YnI+CgkJCQlWMS4wLjYuMjxicj4x44CB5L+u5aSN6YOo5YiG55WM6Z2i6ZSZ5L2N77yM5a6e546wQ1NT5YaF572u77ybPGJyPjLjgIHnmb7luqbnvZHnm5jnlYzpnaLlsIblj5jlvpfmm7TliqDnroDmtIHjgII8YnI+PGJyPgoJCQkJVjEuMC42LjE8YnI+MeOAgeaWsOWinueZvuW6puS6keebmEFQSeS4i+i9veaUr+aMgeWkjeWItumTvuaOpe+8mzxicj4y44CB5Li65LqG54Wn6aG+5omL5py65rWP6KeI5Zmo55So5oi377yM5aKe5aSn6aG555uu5LmL6Ze06Ze06ZqZ77yM5paw5aKe6ZqQ6JePSURN5o+Q56S66YCJ6aG577yM5Y+v5Zyo5Yqp5omL6K6+572u5Lit5ZCv55So77ybPGJyPjPjgIHkv67mlLlDU1PvvIznlYzpnaLkvJrlh7rnjrDmm7TlpJrnmoTkuLvpopjoibLvvJs8YnI+NOOAgeaUr+aMgeWcqOa4uOWwj+eMtOWumOe9keafpeeci+aal+WPt++8mzxicj4144CB5L+u5aSN6YOo5YiG6K+t5rOV6ZSZ6K+v44CCPGJyPjxicj4KCQkJCVYxLjAuNjxicj4x44CB5L+u5aSN5LqG5omT5byA6Zi/6YeM5LqR55uY5YiG5Lqr6L+e5o6l5pe25Zug5LiL6L2956e75Yqo56uv5bm/5ZGK5a+86Ie05Y+q6IO954K55Ye7QVBJ5LiL6L2977ybPGJyPjLjgIHot5/ov5vlrpjmlrk2LjAuNOeJiOacrO+8jOS/ruWkjeWkuOWFi+e9keebmOiOt+WPluS4i+i9vemTvuaOpeWkseaViOOAgeaUr+aMgeenu+WKqOS6keebmOOAgjxicj48YnI+CgkJCQlWMS4wLjUuNTxicj4x44CB5oSf6LCiPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL05pZ2h0LXN0YXJzLTEiPk5pZ2h0LXN0YXJzLTE8L2E+55qE5biu5Yqp77yM5L+u5aSN5Zug5Li65Y6f5L2c6ICF5pyN5Yqh5Zmo5a+86Ie055qE5Yid5aeL5YyW5pqX5Y+36K+G5Yir6ZSZ6K+v77ybPGJyPjLjgIHkv67mlLnkuIDkupvmlofmnKzku6Xlj4rmj5Dkvpvnu5nmnI3liqHlmajnmoTkv6Hmga/jgII8YnI+PGJyPgoJCQkJVjEuMC41LjQ8YnI+MeOAgeWwj+S/ruWwj+aUuWNzc++8jOiuqeS4u+mimOiJsuWHuueOsOWcqOabtOWkmuWcsOaWue+8mzxicj4y44CB5L+u5pS55LiL6L296ZO+5o6l6I635Y+W5aSx6LSl55qE5o+Q56S677ybPGJyPjPjgIHlop7liqDmm7TlpJrnmoTkuLvpopjoibLvvIzlj6/lnKjliqnmiYvorr7nva7mn6XnnIvvvJs8YnI+NOOAgWhvbW/lvanom4vooqvliKDljrvlipvvvIjmgrLvvInjgII8YnI+PGJyPgoJCQkJVjEuMC41LjM8YnI+MeOAgeS/ruWVpuS/ruWVpu+8jOmYv+mHjOS6keebmOWPr+S7peaRuOWIsOS4i+i9veiPnOWNleS6huOAgjxicj48YnI+CgkJCQlWMS4wLjUuMjxicj4x44CB5aKe5Yqg6ISa5pys5L+h5oGv6I+c5Y2V77yI5rKh5pyJ55So77yJ77ybPGJyPjLjgIHkvJjljJbpmL/ph4zkupHnm5jmmL7npLpzdmflm77niYfvvJs8YnI+M+OAgeS/ruaUueW8ueeql+aMiemSruminOiJsuOAgjxicj48YnI+CgkJCQlWMS4wLjUuMTxicj4x44CB5L+u5aSN5Zyo5YiH5o2i5oyJ6ZKu5Li76aKY5ZCO5aS45YWL572R55uY5LiN6IO95q2j5bi45pi+56S65oyJ6ZKu44CCPGJyPjxicj4KCQkJCVYxLjAuNTxicj4x44CB6Lef6L+b5a6Y5pa5VjUuMC4054mI5pys77ybPGJyPjLjgIHlsI/mlLnliqjvvIznhafnnYDlrpjmlrnniYjmnKzmm7TmraPmlofku7blkI3np7Dmo4DmtYvvvJs8YnI+M+OAgeS/neeVmeW9qeibi++8jOS9huW/hemhu+iIjeW8g+WumOaWueaal+WPt+OAgjxicj48YnI+CgkJCQlWMS4wLjQ8YnI+5aSn5pS577yBPGJyPjHjgIHkv67lpI3kuobljp/kvZzogIXnlZnkuIvnmoTlpLjlhYvnvZHnm5jliIfmjaLmlofku7blpLnlsLHlpJrkuIDkuKrigJzkuIvovb3liqnmiYvigJ3mjInpkq7nmoTlpKdCVUfvvJs8YnI+MuOAgee7iOS6juadpeS6hu+8jOWcqOS4i+i9veiPnOWNleWinuWKoOKAnOWKqeaJi+iuvue9ruKAneKAnOabtOaWsOaXpeW/l+KAneaMiemSru+8mzxicj7jgJDlho3kuZ/kuI3nlKjngrnov5vmsrnnjLTnrqHnkIblho3ov5vorr7nva7kuoYo5L+d55WZ5rK554y0566h55CG5YaF6K6+572uKeOAkTxicj4z44CB5L+u5pS56Zi/6YeM5LqR55uY5ZKM5aS45YWL572R55uY5LiL6L295Yqp5omL5oyJ6ZKu5qC35byP77ybPGJyPjTjgIHlop7liqDigJzlj5bmtojngrnkuq7mjInpkq7igJ3msrnnjLToj5zljZXvvJs8YnI+NeOAgeS/ruaUuemDqOWIhmNzc++8jOS9v+WFtuS4jumAieaLqeeahOS4u+mimOabtOi0tOWIh+OAgjxicj48YnI+CgkJCQlWMS4wLjM8YnI+MeOAgeWinuWKoOS4gOS4quWwj+W9qeibi++8myDmj5DnpLrvvJo8YnI+aG9tb++8iOmcgOWcqOacqueCueS6ruaMiemSrueKtuaAgeinpuWPke+8iTxicj7jgJDpnIDopoHph43mlrDmgaLlpI3mjInpkq7kuLrmnKrngrnkuq7nirbmgIHor7fov5vlhaUg5bey5a6J6KOF6ISa5pysLT7nvJbovpEtPuW8gOWPkeiAhS0+6YeN572u5Yiw5Ye65Y6CLT7noa7lrprjgJE8YnI+MuOAgeS/ruaUuS/lop7liqDpu5jorqTkuLvpopjoibLjgII8YnI+PGJyPgoJCQkJVjEuMC4yPGJyPjHjgIHkv67mlLnlubbliqDlrr3nlYzpnaLvvIzosIPmlbTpg6jliIZjc3PvvIzkvb9Td2VldGFsZXJ0MueVjOmdouabtOe+juingu+8jOabtOS4juWOn+eJiOebuOi/ke+8mzxicj4y44CB5L+u5pS56YOo5YiG5o+Q56S65paH5a2X77yM5L2/5paH5a2X5pu05a655piT5aSN5Yi244CCIDxicj48YnI+CgkJCQlWMS4wLjE8YnI+MeOAgeWOu+mZpOabtOaWsOaPkOekuu+8mzxicj4y44CB5pu05pawU3dlZXRhbGVydDLoh7MxMeeJiOacrO+8mzxicj4z44CB6YOo5YiGQ0RO6IqC54K55pu05o2i5Li6anNkZWxpdnLjgII8YnI+PGJyPgoJCQkJVjEuMC4wPGJyPjHjgIHlop7liqDigJzms6jlhaXigJ3lip/og73vvIhidXNoae+8ie+8mzxicj4y44CB5Y676Zmk5bm/5ZGK44CCCgkJCQk8L3NwYW4+YCwKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogZmFsc2UsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfmiJHlt7LpmIUnLAoJCQl9KTsKCQl9LAoKCQljcmVhdGVUaXAoKSB7CgkJCSQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgY2xhc3M9InBsLXRvb2x0aXAiPjwvZGl2PicpOwoKCQkJZG9jLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCAnLmxpc3RlbmVyLXRpcCcsIChlKSA9PiB7CgkJCQlpZiAoZS50eXBlID09PSAnbW91c2VlbnRlcicpIHsKCQkJCQlsZXQgZmlsZW5hbWUgPSBlLmN1cnJlbnRUYXJnZXQuaW5uZXJUZXh0OwoJCQkJCWxldCBzaXplID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuc2l6ZTsKCQkJCQlsZXQgdGlwID0gYCR7ZmlsZW5hbWV9PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2NvbG9yOiAke2NvbG9yfSI+JHtzaXplfTwvc3Bhbj5gOwoJCQkJCSQoZS5jdXJyZW50VGFyZ2V0KS5jc3Moe29wYWNpdHk6ICcwLjUnfSk7CgkJCQkJJCgnLnBsLXRvb2x0aXAnKS5odG1sKHRpcCkuY3NzKHsKCQkJCQkJJ2xlZnQnOiBlLnBhZ2VYICsgMTAgKyAncHgnLAoJCQkJCQkndG9wJzogZS5wYWdlWSAtIGUuY3VycmVudFRhcmdldC5vZmZzZXRUb3AgPiAxNCA/IGUucGFnZVkgKyAncHgnIDogZS5wYWdlWSArIDIwICsgJ3B4JwoJCQkJCX0pLnNob3coKTsKCQkJCX0gZWxzZSB7CgkJCQkJJChlLmN1cnJlbnRUYXJnZXQpLmNzcyh7b3BhY2l0eTogJzEnfSk7CgkJCQkJJCgnLnBsLXRvb2x0aXAnKS5oaWRlKDApOwoJCQkJfQoJCQl9KTsKCQl9LAoKCQljcmVhdGVMb2FkaW5nKCkgewoJCQlyZXR1cm4gJCgnPGRpdiBjbGFzcz0icGwtbG9hZGluZyI+PGRpdiBjbGFzcz0icGwtbG9hZGluZy1ib3giPjxkaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpOwoJCX0sCgoJCWNyZWF0ZURvd25sb2FkSWZyYW1lKCkgewoJCQlsZXQgJGRpdiA9ICQoJzxkaXYgc3R5bGU9InBhZGRpbmc6MDttYXJnaW46MDtkaXNwbGF5OmJsb2NrIj48L2Rpdj4nKTsKCQkJbGV0ICRpZnJhbWUgPSAkKCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDo7IiBpZD0iZG93bmxvYWRJZnJhbWUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPicpOwoJCQkkZGl2LmFwcGVuZCgkaWZyYW1lKTsKCQkJJCgnYm9keScpLmFwcGVuZCgkZGl2KTsKCQl9LAoKCQlnZXRNaXJyb3JMaXN0KGxpbmssIG1pcnJvciwgdGhyZWFkID0gMikgewoJCQlsZXQgaG9zdCA9IG5ldyBVUkwobGluaykuaG9zdDsKCQkJbGV0IG1pcnJvcnMgPSBbXTsKCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBtaXJyb3IubGVuZ3RoOyBpKyspIHsKCQkJCWZvciAobGV0IGogPSAwOyBqIDwgdGhyZWFkOyBqKyspIHsKCQkJCQlsZXQgaXRlbSA9IGxpbmsucmVwbGFjZShob3N0LCBtaXJyb3JbaV0pICsgJyYnLnJlcGVhdChqKTsKCQkJCQltaXJyb3JzLnB1c2goaXRlbSk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIG1pcnJvcnMuam9pbignXG4nKTsKCQl9LAoKCQlsaXN0ZW5FbGVtZW50KGVsZW1lbnQsIGNhbGxiYWNrKSB7CgkJCWxldCBjaGVja0ludGVydmFsID0gNTAwOyAvLyDmo4Dmn6XlhYPntKDnmoTpl7TpmpTml7bpl7TvvIjmr6vnp5LvvIkKCQkJbGV0IHdhc0VsZW1lbnRGb3VuZCA9IGZhbHNlOyAvLyDnlKjkuo7ot5/ouKrlhYPntKDmmK/lkKbkuYvliY3lt7Lnu4/mib7liLAKCQkJCgkJCWZ1bmN0aW9uIGNoZWNrRWxlbWVudCgpIHsKCQkJCWlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpKSB7CgkJCQkJd2FzRWxlbWVudEZvdW5kID0gdHJ1ZTsKCQkJCQljYWxsYmFjaygpOwoJCQkJfSBlbHNlIGlmICh3YXNFbGVtZW50Rm91bmQpIHsKCQkJCQl3YXNFbGVtZW50Rm91bmQgPSBmYWxzZTsgLy8g5YWD57Sg5raI5aSx5ZCO6YeN572u5qCH5b+XCgkJCQl9CgkJCQoJCQkJc2V0VGltZW91dChjaGVja0VsZW1lbnQsIGNoZWNrSW50ZXJ2YWwpOwoJCQl9CgkJCWNoZWNrRWxlbWVudCgpOwoJCX0sCgoJCWFkZFBhbkxpbmtlclN0eWxlKCkgewoJCQljb2xvciA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKTsKCgkJCWxldCBzd2FsY3NzID0gYAoJCQkuc3dhbDItbG9hZGVye2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyLjJlbTtoZWlnaHQ6Mi4yZW07bWFyZ2luOjAgMS44NzVlbTstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDtib3JkZXItd2lkdGg6LjI1ZW07Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXItY29sb3I6JHtjb2xvcn0gdHJhbnNwYXJlbnQgJHtjb2xvcn0gdHJhbnNwYXJlbnQgfQoJCQkuc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm17Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjoke2NvbG9yfTtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxZW19CgkJCS5zd2FsMi1zdHlsZWQuc3dhbDItY29uZmlybTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDNweCAke2NvbG9yfTgwIH0KCQkJLnN3YWwyLXRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7Z3JpZC1jb2x1bW46YXV0bztvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NXB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NXB4fQoJCQkuc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFye3dpZHRoOjEwMCU7aGVpZ2h0Oi4yNWVtO2JhY2tncm91bmQ6JHtjb2xvcn0zMyB9CgkJCS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcHt6LWluZGV4OjIwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6MmVtO2hlaWdodDoyZW07Ym9yZGVyLXJhZGl1czoyZW07YmFja2dyb3VuZDoke2NvbG9yfTtjb2xvcjojZmZmO2xpbmUtaGVpZ2h0OjJlbTt0ZXh0LWFsaWduOmNlbnRlcn0KCQkJLnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwe2JhY2tncm91bmQ6JHtjb2xvcn0gfQoJCQkuc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXt6LWluZGV4OjEwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6Mi41ZW07aGVpZ2h0Oi40ZW07bWFyZ2luOjAgLTFweDtiYWNrZ3JvdW5kOiR7Y29sb3J9IH0KCQkJLnN3YWwyLXBvcHVwIHtwYWRkaW5nOiAwIDAgMS4yNWVtO30KCQkJZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1odG1sLWNvbnRhaW5lcnttYXJnaW46IDFlbSAxLjNlbSAwLjNlbTt9CgkJCWA7CgoJCQkvLyDlhYjnm5HlkKzpopzoibLmlrnmoYjlj5jljJYgUGFubGlua2VyLVN3ZWV0QWxlcnQyLURlZmF1bHQKCQkJd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRMaXN0ZW5lcigoZSkgPT4gewoJCQkJaWYgKGUubWF0Y2hlcykgewoJCQkJCS8vIOWIh+aNouWIsOaal+iJsuS4u+mimAoJCQkJCXRoaXMuYWRkU3R5bGUoJ3N3YWwtcHViLXN0eWxlJywgJ3N0eWxlJywgR01fZ2V0UmVzb3VyY2VUZXh0KCdTd2FsRGFyaycpKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8g5YiH5o2i5Yiw5rWF6Imy5Li76aKYCgkJCQkJdGhpcy5hZGRTdHlsZSgnc3dhbC1wdWItc3R5bGUnLCAnc3R5bGUnLCBHTV9nZXRSZXNvdXJjZVRleHQoJ1N3YWwnKSk7CgkJCQl9CgkJCQl0aGlzLmFkZFN0eWxlKCdQYW5saW5rZXItU3dlZXRBbGVydDItVXNlcicsICdzdHlsZScsIHN3YWxjc3MpOwoJCQl9KTsKCQkJLy8g5YaN5L+u5pS55Li76aKYIFBhbmxpbmtlci1Td2VldEFsZXJ0Mi1EZWZhdWx0CgkJCWlmICh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMpIHsKCQkJCS8vIOWIh+aNouWIsOaal+iJsuS4u+mimAoJCQkJdGhpcy5hZGRTdHlsZSgnc3dhbC1wdWItc3R5bGUnLCAnc3R5bGUnLCBHTV9nZXRSZXNvdXJjZVRleHQoJ1N3YWxEYXJrJykpOwoJCQl9IGVsc2UgewoJCQkJLy8g5YiH5o2i5Yiw5rWF6Imy5Li76aKYCgkJCQl0aGlzLmFkZFN0eWxlKCdzd2FsLXB1Yi1zdHlsZScsICdzdHlsZScsIEdNX2dldFJlc291cmNlVGV4dCgnU3dhbCcpKTsKCQkJfQoJCQl0aGlzLmFkZFN0eWxlKCdQYW5saW5rZXItU3dlZXRBbGVydDItVXNlcicsICdzdHlsZScsIHN3YWxjc3MpOwoKCgkJCWxldCB1aWNzcyA9IGAKCQkJYm9keTo6LXdlYmtpdC1zY3JvbGxiYXIgeyBkaXNwbGF5OiBub25lIH0KCQkJOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiA2cHg7IGhlaWdodDogMTBweCB9CgkJCTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgeyBib3JkZXItcmFkaXVzOiAwOyBiYWNrZ3JvdW5kOiBub25lIH0KCQkJOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoODUsODUsODUsLjQpIH0KCQkJOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsgYm9yZGVyLXJhZGl1czogNXB4OyAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCA2cHggcmdiYSgwLDAsMCwuMikgfQoJCQk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg4NSw4NSw4NSwuMykgfQoJCQkuc3dhbDItcG9wdXAgeyBmb250LXNpemU6IDE2cHggfQoJCQkucGwtcG9wdXAgeyBmb250LXNpemU6IDEycHg7IHdpZHRoOiA5MCU7fQoJCQkucGwtcG9wdXAgYSB7IGNvbG9yOiAke2NvbG9yfTsgfQoJCQkucGwtaGVhZGVyIHsgcGFkZGluZzogMDthbGlnbi1pdGVtczogZmxleC1zdGFydDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7IG1hcmdpbjogMCAwIDEwcHg7IHBhZGRpbmc6IDAgMCA1cHg7IH0KCQkJLnBsLXRpdGxlIHsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTt3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczt9CgkJCS5wbC1jb250ZW50IHsgcGFkZGluZzogMDsgZm9udC1zaXplOiAxMnB4OyB9CgkJCS5wbC1tYWluIHsgYmFja2dyb3VuZC1jb2xvcjoke2NvbG9yfTE1O292ZXJmbG93OmF1dG87IGJvcmRlci1yYWRpdXM6IDVweDsgbWF4LWhlaWdodDpjYWxjKCR7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodH1weCAtIDI1MHB4KTt9CgkJCS5wbC1mb290ZXIge2ZvbnQtc2l6ZTogMTVweDsgbWFyZ2luLXRvcDogMTBweDsgcGFkZGluZy10b3A6IDVweDsgY29sb3I6ICNmNTZjNmM7IHRleHQtYWxpZ246IGNlbnRlcjt9CgkJCS5wbC1pdGVtIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbGluZS1oZWlnaHQ6IDIycHg7IGhlaWdodDogNTBweDsgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn0zMDsgYm9yZGVyLXJhZGl1czogNXB4OyBtYXJnaW46IDhweCA2cHg7IH0KCQkJLnBsLWl0ZW0tbmFtZSB7IGZsZXg6IDAgMCAxNzBweDsgdGV4dC1hbGlnbjogbGVmdDttYXJnaW46IDZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IGN1cnNvcjpkZWZhdWx0OyBoZWlnaHQ6IDMwcHg7fQoJCQkucGwtaXRlbS1saW5rIHsgZmxleDogMTsgdGV4dC1hbGlnbjogbGVmdDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Y3Vyc29yOnBvaW50ZXI7IG92ZXJmbG93OiBoaWRkZW47IH0KCQkJLnBsLWl0ZW0tYnRuIHsgYmFja2dyb3VuZDogJHtjb2xvcn07IGJvcmRlci1yYWRpdXM6IDNweDsgY29sb3I6ICNmZmZmZmY7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxMnB4OyBvdXRsaW5lOiBub25lOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWFyZ2luOiA2cHggNnB4OyBwYWRkaW5nOiAwLjYyNWVtIDEuMWVtOyB9CgkJCS5wbC1pdGVtLXRpcCB7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtmbGV4OiAxOyB9CgkJCS5wbC1iYWNrIHsgd2lkdGg6IDcwcHg7IGJhY2tncm91bmQ6ICNkZGQ7IGJvcmRlci1yYWRpdXM6IDNweDsgY3Vyc29yOnBvaW50ZXI7IG1hcmdpbjoxcHggNnB4OyBjb2xvcjogIzAwMDsgfQoJCQkucGwtZXh0IHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNDRweDsgYmFja2dyb3VuZDogIzk5OTsgY29sb3I6ICNmZmY7IGhlaWdodDogMTZweDsgbGluZS1oZWlnaHQ6IDE2cHg7IGZvbnQtc2l6ZTogMTJweDsgYm9yZGVyLXJhZGl1czogM3B4O30KCQkJLnBsLXJldHJ5IHtwYWRkaW5nOiAzcHggMTBweDsgYmFja2dyb3VuZDogI2NjMzIzNTsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweDsgY3Vyc29yOiBwb2ludGVyO30KCQkJLnBsLWJyb3dzZXJkb3dubG9hZCB7IHBhZGRpbmc6IDNweCAxMHB4OyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweDsgY3Vyc29yOiBwb2ludGVyO30KCQkJLnBsLWl0ZW0tcHJvZ3Jlc3MgeyBkaXNwbGF5OmZsZXg7ZmxleDogMTthbGlnbi1pdGVtczpjZW50ZXJ9CgkJCS5wbC1wcm9ncmVzcyB7IGRpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO3dpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94O2xpbmUtaGVpZ2h0OiAxO3Bvc2l0aW9uOiByZWxhdGl2ZTtoZWlnaHQ6MTVweDsgZmxleDogMX0KCQkJLnBsLXByb2dyZXNzLW91dGVyIHsgaGVpZ2h0OiAxNXB4O2JvcmRlci1yYWRpdXM6IDEwMHB4O2JhY2tncm91bmQtY29sb3I6ICNjMWMxYzFhMTtvdmVyZmxvdzogaGlkZGVuO3Bvc2l0aW9uOiByZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30KCQkJLnBsLXByb2dyZXNzLWlubmVyeyBwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMDt0b3A6IDA7YmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn07dGV4dC1hbGlnbjogY2VudGVyO2JvcmRlci1yYWRpdXM6IDEwMHB4O2xpbmUtaGVpZ2h0OiAxO3doaXRlLXNwYWNlOiBub3dyYXA7dHJhbnNpdGlvbjogd2lkdGggLjZzIGVhc2U7aGVpZ2h0OiAxNXB4fQoJCQkucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2NvbG9yOiAjZmZmZmZmO2ZvbnQtc2l6ZTogMTJweDttYXJnaW46IDAgNXB4O2hlaWdodDogMTVweH0KCQkJLnBsLXByb2dyZXNzLXRpcHsgZmxleDoxOyB0ZXh0LWFsaWduOnJpZ2h0fQoJCQkucGwtcHJvZ3Jlc3MtaG93eyBmbGV4OiAwIDAgMTAwcHg7IGJhY2tncm91bmQ6ICNkZGQ7IGJvcmRlci1yYWRpdXM6IDNweDsgbWFyZ2luLWxlZnQ6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjojMDAwO30KCQkJLnBsLXByb2dyZXNzLXN0b3B7IGZsZXg6IDAgMCA4MHB4OyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyBjdXJzb3I6IHBvaW50ZXI7IG1hcmdpbjogNnB4IDZweCA2cHggMTBweDsgZm9udC1zaXplOiAxMnB4OyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICNmZmZmZmY7IG91dGxpbmU6IG5vbmU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwYWRkaW5nOiAwLjYyNWVtIDEuMWVtO30KCQkJLnBsLXByb2dyZXNzLWlubmVyLXRleHQ6YWZ0ZXIgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Y29udGVudDogIiI7aGVpZ2h0OiAxMDAlO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7fQoJCQkucGwtYnRuLXByaW1hcnkgeyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGNvbG9yOiAjZmZmZmZmOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTJweDsgb3V0bGluZTogbm9uZTsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWFyZ2luOiA2cHggNnB4OyBwYWRkaW5nOiAwLjYyNWVtIDEuMWVtO3RyYW5zaXRpb246IDAuM3Mgb3BhY2l0eTsgfQoJCQkucGwtYnRuLXByaW1hcnk6aG92ZXIgeyBvcGFjaXR5OiAwLjk7dHJhbnNpdGlvbjogMC4zcyBvcGFjaXR5OyB9CgkJCS5wbC1idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICM1NWFmMjg7IGFuaW1hdGlvbjogZWFzZU9wYWNpdHkgMS4ycyAyOyBhbmltYXRpb24tZmlsbC1tb2RlOmZvcndhcmRzIH0KCQkJLnBsLWJ0bi1pbmZvIHsgYmFja2dyb3VuZDogIzYwNjI2NjsgfQoJCQkucGwtYnRuLXdhcm5pbmcgeyBiYWNrZ3JvdW5kOiAjZGE5MzI4OyB9CgkJCS5wbC1idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkYTkzMjg7IH0KCQkJLnBsLWJ0bi1kYW5nZXIgeyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyB9CgkJCS5wbC1idXR0b24tbWluaSB7cGFkZGluZzogNXB4IDEwcHg7IH0KCQkJLnBsLWRyb3Bkb3duLW1lbnUtaXRlbSB7aGVpZ2h0OiAzMHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogJHtjb2xvcn07IHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7fQoJCQkucGwtZHJvcGRvd24tbWVudS1pdGVtOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn0xNTt9CgkJCS5wbC1idXR0b24tbW9kZSB7cGFkZGluZzogMHA7IHBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7IGNvbG9yOiAke2NvbG9yfSAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO30KCQkJLnBsLWJ1dHRvbi1tb2RlOmhvdmVyIHtiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTMzICFpbXBvcnRhbnQ7fQoJCQkucGwtYnV0dG9uLCAucGwtZHJvcGRvd24tbWVudSB7IHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7fQoJCQkucGwtYnV0dG9uIC5wbC1kcm9wZG93bi1tZW51IHsgZGlzcGxheTogbm9uZTt9CgkJCS5wbC1idXR0b246aG92ZXIgLnBsLWRyb3Bkb3duLW1lbnUgeyBkaXNwbGF5OiBibG9jazsgfQoJCQkucGwtYnV0dG9uLWluaXQgeyBvcGFjaXR5OiAwLjU7IGFuaW1hdGlvbjogZWFzZUluaXRPcGFjaXR5IDEuMnMgMzsgYW5pbWF0aW9uLWZpbGwtbW9kZTpmb3J3YXJkcyB9CgkJCUBrZXlmcmFtZXMgZWFzZUluaXRPcGFjaXR5IHsgZnJvbSB7IG9wYWNpdHk6IDAuNTsgfSA1MCUgeyBvcGFjaXR5OiAxIH0gdG8geyBvcGFjaXR5OiAwLjU7IH0gfQoJCQlAa2V5ZnJhbWVzIGVhc2VPcGFjaXR5IHsgZnJvbSB7IG9wYWNpdHk6IDE7IH0gNTAlIHsgb3BhY2l0eTogMC4zNSB9IHRvIHsgb3BhY2l0eTogMTsgfSB9CgkJCS5iYWlkdS1idXR0b24ge2JhY2tncm91bmQ6ICR7Y29sb3J9ICFpbXBvcnRhbnQ7IGJvcmRlci1jb2xvcjogJHtjb2xvcn0gIWltcG9ydGFudDsgYm9yZGVyOiAxcHggc29saWQgJHtjb2xvcn0gIWltcG9ydGFudDt9CgkJCS5iYWlkdS1idXR0b246aG92ZXIgeyBiYWNrZ3JvdW5kOiAke2NvbG9yfWIwICFpbXBvcnRhbnQ7IGJvcmRlci1jb2xvcjogJHtjb2xvcn0gIWltcG9ydGFudDt9CgkJCWhlYWRlcltzdHlsZT0iZGlzcGxheTogbm9uZTsiXSB+ICNwbC1idXR0b24tbGluayB7CgkJCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJCQlwb3NpdGlvbjogZml4ZWQ7CgkJCQl0b3A6IDAuNmVtOwoJCQkJbGVmdDogNjUlOwoJCQkJei1pbmRleDogOTk5OTk7CgkJCX0KCQkJLmJhaWR1LXdhcC1idXR0b24ge2Rpc3BsYXk6IG5vbmU7IGNvbG9yOiAke2NvbG9yfTsgZm9udC1zaXplOiAuMjhyZW07IHBhZGRpbmc6IDAuM2VtO30KCQkJLmJhaWR1LXdhcC1idXR0b246YWZ0ZXIge2NvbnRlbnQ6ICLkuIvovb3liqnmiYsiO30KCQkJLmJhaWR1LXdhcC1tb2RlIHtwYWRkaW5nOiAxMHB4IDBweDt9CgkJCS5hbGktYnV0dG9uIHtib3JkZXI6IDAgc29saWQgdHJhbnNwYXJlbnQ7Zm9udC1zaXplOiAxNHB4O21hcmdpbi1sZWZ0OiAyMHB4O3BhZGRpbmc6IDFweCAxMnB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtoZWlnaHQ6IDMycHg7d2lkdGg6IDMycHg7YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEyOS4xMmRlZywgJHtjb2xvcn0gMCUsIHJnYmEoOTksIDEyNSwgMjU1LCAwLjc1KSAxMDAlKTtib3JkZXItcmFkaXVzOiAxMDBweDtkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7Y29sb3I6IHZhcigtLWJhc2ljX3doaXRlKTtjdXJzb3I6IHBvaW50ZXI7dHJhbnNpdGlvbjogYWxsIC4zcyBlYXNlO30KCQkJLmFsaS1idXR0b246aG92ZXIge2JhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMjkuMTJkZWcsICM0NDZkZmYgMCUsICR7Y29sb3J9IDEwMCUpO30KCQkJLmFsaS1idG4taWNvbiB7dmVydGljYWwtYWxpZ246IC0wLjJlbTt9CgkJCS50aWFueWktYnV0dG9uIHttYXJnaW4tcmlnaHQ6IDIwcHg7IHBhZGRpbmc6IDRweCAxMnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGNvbG9yOiAjZmZmOyBmb250LXNpemU6IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Y29sb3J9OyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgY3Vyc29yOiBwb2ludGVyOyBwb3NpdGlvbjogcmVsYXRpdmU7fQoJCQkudGlhbnlpLWJ1dHRvbjpob3ZlciB7Ym9yZGVyLWNvbG9yOiAke2NvbG9yfWIwOyBiYWNrZ3JvdW5kOiAke2NvbG9yfWIwO30KCQkJLnlpZG9uZy1idXR0b24ge2Zsb2F0OiBsZWZ0OyBwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbjogMjBweCAyNHB4IDIwcHggMDsgd2lkdGg6IDExMHB4OyBoZWlnaHQ6IDM2cHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBib3JkZXItcmFkaXVzOiAycHg7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6ICNmZmY7IGxpbmUtaGVpZ2h0OiAzOXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGN1cnNvcjogcG9pbnRlcjt9CgkJCS55aWRvbmctc2hhcmUtYnV0dG9uIHtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBvc2l0aW9uOiByZWxhdGl2ZTsgZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMzZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogI2ZmZjsgYm9yZGVyOiAxcHggc29saWQgJHtjb2xvcn07IGJvcmRlci1yYWRpdXM6IDJweDsgcGFkZGluZzogMCAyNHB4OyBiYWNrZ3JvdW5kOiAke2NvbG9yfTt9CgkJCS55aWRvbmctc2hhcmUtYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kOiAke2NvbG9yfWIwO30KCQkJLnlpZG9uZy1idXR0b246aG92ZXIge2JhY2tncm91bmQ6ICR7Y29sb3J9YjA7fQoJCQkueWlkb25nLWJ0biB7IGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNnQUFBQW9DQU1BQUFDN0lFaGZBQUFBQVhOU1IwSUIyY2tzZndBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBR05RVEZSRkFBQUEvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL21rVU5vQUFBQUNGMFVrNVRBQWJIUFA5QU1SdHI5UHdyVjh6cVhmbU5nRE9ESFRMRDRpSnhoR0pKOFoyNjltMGFEZ0FBQU1aSlJFRlVlSnpkMHNzT2d5QVFCVkRVSzc0cldxMFBGUDMvcnl4cVRNZEdxSnR1dkdIRDVDVERUR0RzM25GYzE3a0VQY0M3QkgzQXQvVGp2azVBWWJCVStOY3J3Z2hMNHVRRGszZ3RSU0YxS1dDQ1FFcGdoa2QrM2pwL0lDTlFvREFOVTBBUUNKUW1XQUozaDgrcTNtRmR2U3l3UWR0dHNHdlJXR0FQTFJlb0hYcmJHNldXQXpCb0orM0RhQ25XSTM5TkxiY3ZzenZMZXVUQjJmWW9xYk5CTm83c0dqemszMUJoTXNFSml0eG1pS2s4elNRd0U4Z0ZqQkdjTnVDek9tZHFQcmliNUEySlJRN3FLOWcraFFBQUFBQkpSVTVFcmtKZ2dnPT0pOyBoZWlnaHQ6IDIwcHg7IGxpbmUtaGVpZ2h0OiAyMHB4OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7IGJhY2tncm91bmQtc2l6ZTogMjBweCAyMHB4OyB0ZXh0LWluZGVudDogMjVweDt9CgkJCS54dW5sZWktYnV0dG9uIHtkaXNwbGF5OiBpbmxpbmUtZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyO2JvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOiA1cHg7Ym94LXNoYWRvdzogMCAwIDAgMCB0cmFuc3BhcmVudDt3aWR0aDogZml0LWNvbnRlbnQ7d2hpdGUtc3BhY2U6IG5vd3JhcDtmbGV4LXNocmluazogMDtmb250LXNpemU6IDE0cHg7bGluZS1oZWlnaHQ6IDEuNTtvdXRsaW5lOiAwO3RvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO3RyYW5zaXRpb246IGJhY2tncm91bmQgLjNzIGVhc2UsY29sb3IgLjNzIGVhc2UsYm9yZGVyIC4zcyBlYXNlLGJveC1zaGFkb3cgLjNzIGVhc2U7Y29sb3I6ICNmZmY7YmFja2dyb3VuZDogJHtjb2xvcn07bWFyZ2luLWxlZnQ6IDEycHg7cGFkZGluZzogMHB4IDEycHg7cG9zaXRpb246IHJlbGF0aXZlOyBjdXJzb3I6cG9pbnRlcjsgaGVpZ2h0OiAzNnB4O30KCQkJLnh1bmxlaS1idXR0b246aG92ZXIge2JhY2tncm91bmQ6ICR7Y29sb3J9YjA7fQoJCQkucXVhcmstYnV0dG9uIHtiYWNrZ3JvdW5kOiAke2NvbG9yfSAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kLWNvbG9yOiR7Y29sb3J9ICFpbXBvcnRhbnQ7fQoJCQkucXVhcmstYnV0dG9uOmhvdmVyIHsgYmFja2dyb3VuZDogJHtjb2xvcn1iMCAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kLWNvbG9yOiR7Y29sb3J9YjAgIWltcG9ydGFudDt9CgkJCS5xdWFyay1idG4taWNvbiB7d2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDsgdmVydGljYWwtYWxpZ246IC0wLjNlbTt9CgkJCS5lbGVtZW50LWNsaWNrZWQgeyBvcGFjaXR5OiAwLjU7IH0KCQkJLnBsLWV4dHJhIHsgbWFyZ2luLXRvcDogMTBweDtkaXNwbGF5OmZsZXh9CgkJCS5wbC1leHRyYSBidXR0b24geyBmbGV4OiAxfQoJCQkucG9pbnRlciB7IGN1cnNvcjpwb2ludGVyIH0KCQkJLnBsLXNldHRpbmctbGFiZWwgeyBkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO3BhZGRpbmctdG9wOiAxMHB4OyB9CgkJCS5wbC1sYWJlbCB7IGZsZXg6IDAgMCAxMDBweDt0ZXh0LWFsaWduOmxlZnQ7IH0KCQkJLnBsLWlucHV0IHsgZmxleDogMTsgcGFkZGluZzogOHB4IDEwcHggIWltcG9ydGFudDsgYm9yZGVyOiAxcHggc29saWQgI2MyYzJjMjsgYm9yZGVyLXJhZGl1czogNXB4OyBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsgbWluLXdpZHRoOiAzMDBweDsgbWFyZ2luOiAwO2Rhcmt0aGVtZX0KCQkJLmluaXQtaW5wdXQgewoJCQkJd2lkdGg6IDM3M3B4OwoJCQkJZm9udC1zaXplOiAyMHB4OwoJCQkJdGV4dC1hbGlnbjogY2VudGVyOwoJCQkJZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIFVidW50dSwgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKCQkJCWZvbnQtd2VpZ2h0OiAzMDA7CgkJCX0KCQkJLnBsLWNvbG9yIHtmbGV4OiAxOyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXB9CgkJCS5wbC1jb2xvci1ib3gge3dpZHRoOiA1NXB4OyBoZWlnaHQ6IDU1cHg7IG1hcmdpbjoxMHB4IDEwcHggMCAwOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBib3JkZXI6MXB4IHNvbGlkICNmZmY7IGN1cnNvcjpwb2ludGVyIH0KCQkJLnBsLW1hc2sgewoJCQkJd2lkdGg6IDUzcHg7CgkJCQloZWlnaHQ6IDUzcHg7CgkJCQlvcGFjaXR5OiAwOwoJCQkJdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzOwoJCQkJY29sb3I6ICNmZmY7CgkJCQlmb250LXNpemU6IDEzcHg7CgkJCQlkaXNwbGF5OiBmbGV4OwoJCQkJYWxpZ24taXRlbXM6IGNlbnRlcjsKCQkJCWp1c3RpZnktY29udGVudDogY2VudGVyOwoJCQkJZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKCQkJfQoJCQkucGwtY29sb3ItYm94OmhvdmVyIC5wbC1tYXNrIHsKCQkJCW9wYWNpdHk6IDE7CgkJCX0KCQkJLnBsLWNsb3NlOmZvY3VzIHsgb3V0bGluZTogMDsgYm94LXNoYWRvdzogbm9uZTsgfQoJCQkudGFnLWRhbmdlciB7Y29sb3I6I2NjMzIzNTttYXJnaW46IDAgNXB4O30KCQkJLnBsLXRvb2x0aXAgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGNvbG9yOiAjZmZmZmZmOyBtYXgtd2lkdGg6IDYwMHB4OyBmb250LXNpemU6IDEycHg7IHBhZGRpbmc6IDVweCAxMHB4OyBiYWNrZ3JvdW5kOiAjMzMzOyBib3JkZXItcmFkaXVzOiA1cHg7IHotaW5kZXg6IDExMDAwMDsgbGluZS1oZWlnaHQ6IDEuMzsgZGlzcGxheTpub25lOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7fQoJCQkgQGtleWZyYW1lcyBsb2FkIHsgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKSB9IDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0gfQoJCQkucGwtbG9hZGluZy1ib3ggPiBkaXYgPiBkaXYgeyBwb3NpdGlvbjogYWJzb2x1dGU7Ym9yZGVyLXJhZGl1czogNTAlO30KCQkJLnBsLWxvYWRpbmctYm94ID4gZGl2ID4gZGl2Om50aC1jaGlsZCgxKSB7IHRvcDogOXB4O2xlZnQ6IDlweDt3aWR0aDogODJweDtoZWlnaHQ6IDgycHg7YmFja2dyb3VuZDogI2ZmZmZmZjt9CgkJCS5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMikgeyB0b3A6IDE0cHg7bGVmdDogMzhweDt3aWR0aDogMjVweDtoZWlnaHQ6IDI1cHg7YmFja2dyb3VuZDogIzY2NjY2NjthbmltYXRpb246IGxvYWQgMXMgbGluZWFyIGluZmluaXRlO3RyYW5zZm9ybS1vcmlnaW46IDEycHggMzZweDt9CgkJCS5wbC1sb2FkaW5nIHsgd2lkdGg6IDE2cHg7aGVpZ2h0OiAxNnB4O2Rpc3BsYXk6IGlubGluZS1ibG9jaztvdmVyZmxvdzogaGlkZGVuO2JhY2tncm91bmQ6IG5vbmU7fQoJCQkucGwtbG9hZGluZy1ib3ggeyB3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7cG9zaXRpb246IHJlbGF0aXZlO3RyYW5zZm9ybTogdHJhbnNsYXRlWigwKSBzY2FsZSgwLjE2KTtiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47dHJhbnNmb3JtLW9yaWdpbjogMCAwO30KCQkJLnBsLWxvYWRpbmctYm94IGRpdiB7IGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyB9CgkJCS5wbC1kcm9wZG93bi1tZW51IHtwb3NpdGlvbjogYWJzb2x1dGU7cGFkZGluZzogNXB4IDA7Y29sb3I6ICR7Y29sb3J9O2JhY2tncm91bmQ6IHRoZW1lY29sb3I7ei1pbmRleDogOTk5O3dpZHRoOiAxMTBweDtib3JkZXItcmFkaXVzOiAxMHB4O2JveC1zaGFkb3c6IDAgMCAxcHggMXB4IHJnYigyOCAyOCAzMiAvIDUlKSwgMCA4cHggMjRweCByZ2IoMjggMjggMzIgLyAxMiUpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlcjogbm9uZTsgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTt9CgkJCS5zd2FsMi1jb250YWluZXIgeyB6LWluZGV4OjEwMDAwMDsgfQoJCQlib2R5LnN3YWwyLWhlaWdodC1hdXRvIHsgaGVpZ2h0OiBpbmhlcml0OyB9CgoJCQlAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSBbZGF0YS10aGVtZT1zeXN0ZW1dICogewoJCQkJY29sb3Itc2NoZW1lOiBkYXJrOwoJCQl9CgoJCQkvKiB3ZWJraXQsIG9wZXJhLCBJRTksIENocm9tZSovCgkJCTo6c2VsZWN0aW9uIHsKCQkJCWJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9IWltcG9ydGFudDsKCQkJCWJhY2tncm91bmQ6ICR7Y29sb3J9IWltcG9ydGFudDsKCQkJCWNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7CgkJCX0KCQkJLyogbW96aWxsYSBmaXJlZm94ICovCgkJCTo6LW1vei1zZWxlY3Rpb24gewoJCQkJYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn0haW1wb3J0YW50OwoJCQkJYmFja2dyb3VuZDogJHtjb2xvcn0haW1wb3J0YW50OwoJCQkJY29sb3I6IHdoaXRlIWltcG9ydGFudDsKCQkJfQoJCQkvKiDnmb7luqbnvZHnm5ggKi8KCQkJOm5vdChbY2xhc3MqPSJyd2wtZXhlbXB0Il0pIDo6c2VsZWN0aW9uIHsKCQkJCWJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9IWltcG9ydGFudDsKCQkJCWJhY2tncm91bmQ6ICR7Y29sb3J9IWltcG9ydGFudDsKCQkJCWNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7CgkJCX0KCQkJYDsKCQkJLy8g5YWI55uR5ZCs6aKc6Imy5pa55qGI5Y+Y5YyWCgkJCXdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykuYWRkTGlzdGVuZXIoKGUpID0+IHsKCQkJCWlmIChlLm1hdGNoZXMpIHsKCQkJCQkvLyDliIfmjaLliLDmmpfoibLkuLvpopgKCQkJCQlsZXQgZGFyayA9IHVpY3NzLnJlcGxhY2UoInRoZW1lY29sb3IiLCIjMTkxOTFhIikucmVwbGFjZSgiZGFya3RoZW1lIiwiY29sb3Itc2NoZW1lOiBkYXJrOyIpOwoJCQkJCXRoaXMuYWRkU3R5bGUoJ1Bhbmxpbmtlci1VSScsICdzdHlsZScsIGRhcmspOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyDliIfmjaLliLDmtYXoibLkuLvpopgKCQkJCQlsZXQgbGlnaHQgPSB1aWNzcy5yZXBsYWNlKCJ0aGVtZWNvbG9yIiwiI2ZmZiIpLnJlcGxhY2UoImRhcmt0aGVtZSIsIiIpOwoJCQkJCXRoaXMuYWRkU3R5bGUoJ1Bhbmxpbmtlci1VSScsICdzdHlsZScsIGxpZ2h0KTsKCQkJCX0KCQkJfSk7CgkJCS8vIOWGjeS/ruaUueS4u+mimAoJCQlpZiAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzKSB7CgkJCQlsZXQgZGFyayA9IHVpY3NzLnJlcGxhY2UoInRoZW1lY29sb3IiLCIjMTkxOTFhIikucmVwbGFjZSgiZGFya3RoZW1lIiwiY29sb3Itc2NoZW1lOiBkYXJrOyIpOwoJCQkJdGhpcy5hZGRTdHlsZSgnUGFubGlua2VyLVVJJywgJ3N0eWxlJywgZGFyayk7CgkJCX0gZWxzZSB7CgkJCQkvLyDliIfmjaLliLDmtYXoibLkuLvpopgKCQkJCWxldCBsaWdodCA9IHVpY3NzLnJlcGxhY2UoInRoZW1lY29sb3IiLCIjZmZmIikucmVwbGFjZSgiZGFya3RoZW1lIiwiIik7CgkJCQl0aGlzLmFkZFN0eWxlKCdQYW5saW5rZXItVUknLCAnc3R5bGUnLCBsaWdodCk7CgkJCX0KCgoJCQlsZXQgYmFpZHVjc3MgPSBgCgkJCS53cC1zLWFzaWRlLW5hdl9fZmlsZS1saXN0LWFsbC5pcy1hY3RpdmUuaXMtZXhhY3QtYWN0aXZlLCAud3Atcy1hc2lkZS1uYXZfX3N1Yi1jb250YWluZXIuaXMtYWN0aXZlLCAud3Atcy1hc2lkZS1uYXZfX3N1Yi1pdGVtLmlzLWFjdGl2ZSwgLndwLXMtYXNpZGUtbmF2X19tYWluLWl0ZW0uaXMtYWN0aXZlLCAud3Atcy1hZ2lsZS10b29sLWJhcl9faC1hY3Rpb24tYnV0dG9uOmhvdmVyLCAudS1idXR0b24tLXRleHQsIC53cC1zLXNlYXJjaCAudS1pbnB1dF9faW5uZXI6Zm9jdXMrLnUtaW5wdXRfX3N1ZmZpeCAud3Atcy1zZWFyY2hfX3NlYXJjaC10ZXh0LCAud3Atcy1zZWFyY2ggLnUtaW5wdXRfX2lubmVyOmhvdmVyKy51LWlucHV0X19zdWZmaXggLndwLXMtc2VhcmNoX19zZWFyY2gtdGV4dCwgLndwLXMtcGFuLWxpc3RfX2ZpbGUtbmFtZS10aXRsZS10ZXh0OmhvdmVyLCAuYWlUb29scy1hc2lkZV9faXRlbS0tYWN0aXZlLCAud3Atcy1wYW4tdGFibGVfX3NvcnQgLmljb24uYWN0aXZlLCAuZy1idXR0b24sIC51LWJ1dHRvbi0td2VlaywgLm5kLWxpc3QtbmFtZV9fdGl0bGUtdGV4dDpob3ZlciwgLk5IY0d3IC5vcGVuLWVuYWJsZSAuZmlsZS1uYW1lIGE6aG92ZXIsIC5OSGNHdyAub3Blbi1lbmFibGUgLmZpbGUtbmFtZSBhOmFjdGl2ZSwgLkJOZkl5UGIgLmNFZWZ5ei5vcGVuLWVuYWJsZSAuZmlsZS1uYW1lIGE6aG92ZXIsIC5CTmZJeVBiIC5jRWVmeXoub3Blbi1lbmFibGUgLmZpbGUtbmFtZSBhOmFjdGl2ZSwgLndwLXMtcGFuLWZpbGUtbWFpbl9fbmF2LWl0ZW0tdGl0bGUsIC50aGVtZS1wcmltYXJ5LXRleHQsIC5pY29uLmFjdGl2ZSwgLndyYXBwZXIgLmJsdWVCdG5bZGF0YS12LWM3NGNmYzc0XSwgLm1vZHVsZS10aW1lbGluZS1ydWxlciAuaG92ZXItZGF5LWRlc2MgLmRheS1kZXNjW2RhdGEtdi0wOGQ4YWJiZV0sIC5pbWMtZWRpdC1rZXl3b3JkX19icmVhZGNydW1iLWdvbGlzdCwgLmltYy1lZGl0LWtleXdvcmRfX2JvdHRvbS13cmFwcGVyIC51LWJ1dHRvbi0td2Vlay5pcy1kaXNhYmxlZCwgLmltYy1rZXl3b3JkLWxpc3RfX3RhYmxlLWxpc3QgLmFjdGlvbi1idG4gewoJCQkJY29sb3I6ICR7Y29sb3J9OwoJCQl9CgkJCS53cC1zLWFzaWRlLW5hdl9fZmlsZS1saXN0LWFsbC5pcy1hY3RpdmUuaXMtZXhhY3QtYWN0aXZlLCAud3Atcy1hZ2lsZS10b29sLWJhcl9faC1tb3JlLWdyb3VwLCAud3Atcy1wYW4tdGFibGVfX2JvZHktcm93OmhvdmVyLCAud3Atcy1hZ2lsZS10b29sLWJhcl9faC1hY3Rpb24sIC5haVRvb2xzLWFzaWRlX19pdGVtLS1hY3RpdmUsIC53cC1zLWFnaWxlLXRvb2wtYmFyX19oLWFjdGlvbi5pcy1uZWVkLWxlZnQtc2VwKy5pcy1uZWVkLWxlZnQtc2VwOmFmdGVyLCAud3Atcy1hc2lkZS1uYXZfX3N1Yi1pdGVtLmlzLWFjdGl2ZSwgLk5IY0d3IC5qbGlsUjlnbywgLk5IY0d3IC52enhybTRSLCAudS1idXR0b24tLXdlZWssIC51LWJ1dHRvbi0td2Vlazpmb2N1cywgLnUtYnV0dG9uLS13ZWVrOmhvdmVyLCAuZy1kcm9wZG93bi1idXR0b24gLm1lbnUgLmctYnV0dG9uLW1lbnU6aG92ZXIsIC54R0xNSWFiIC5mdWZIeUE6aG92ZXIsIC5tb2R1bGUtdGltZWxpbmUtcnVsZXIgLmhvdmVyLWRheS1kZXNjIC5kYXktZGVzY1tkYXRhLXYtMDhkOGFiYmVdLCAuaW1jLWVkaXQta2V5d29yZF9fYm90dG9tLXdyYXBwZXIgLnUtYnV0dG9uLS13ZWVrLmlzLWRpc2FibGVkLCAud3Atcy1wYW4tdGFibGVfX2JvZHktcm93LnNlbGVjdGVkLCAubmQtdGFibGVfX2JvZHktcm93LnNlbGVjdGVkIHsKCQkJCXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CgkJCQliYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTEwOwoJCQkJYmFja2dyb3VuZDogJHtjb2xvcn0xMDsKCQkJfQoJCQkubXpmX25ld19idG4sIC51LWJ1dHRvbi0tcHJpbWFyeSwgLndwLXMtYXNpZGUtbmF2X19xdW90YS1wcm9ncmVzcy1yYXRlLCAudS1jaGVja2JveF9faW5wdXQuaXMtY2hlY2tlZCAudS1jaGVja2JveF9faW5uZXIsIC51LWNoZWNrYm94X19pbnB1dC5pcy1pbmRldGVybWluYXRlIC51LWNoZWNrYm94X19pbm5lciwgLmctYnV0dG9uLWJsdWUsIC5nLWJ1dHRvbi1ibHVlLWxhcmdlLCAuc2VsZWN0LCAubS1idXR0b24sIC51LXRhYnNfX2FjdGl2ZS1iYXIsIC5tb2R1bGUtdGltZWxpbmUtcnVsZXIgLmxpbmUtY3VycmVudFtkYXRhLXYtMDhkOGFiYmVdLCAubW9kdWxlLXRpbWVsaW5lLXJ1bGVyIC5saW5lLWhvdmVyW2RhdGEtdi0wOGQ4YWJiZV0sIC5tb2R1bGUtdGltZWxpbmUtcnVsZXIgLmxpbmUtY3VycmVudFtkYXRhLXYtMDhkOGFiYmVdOmFmdGVyLCAubW9kdWxlLXRpbWVsaW5lLXJ1bGVyIC5saW5lLWhvdmVyW2RhdGEtdi0wOGQ4YWJiZV06YWZ0ZXIsIC51LXN3aXRjaC5pcy1jaGVja2VkIC51LXN3aXRjaF9fY29yZSB7CgkJCQl0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwoJCQkJYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn07CgkJCX0KCQkJLndwLXMtcGFuLXRhYmxlX19ib2R5LXJvdzpob3ZlciwgLndwLXMtc2VhcmNoIC51LWlucHV0LS1zbWFsbCAudS1pbnB1dF9faW5uZXI6aG92ZXIsIC51LWNoZWNrYm94X19pbnB1dC5pcy1jaGVja2VkIC51LWNoZWNrYm94X19pbm5lciwgLnUtY2hlY2tib3hfX2lubmVyOmhvdmVyLCAudS1jaGVja2JveF9faW5wdXQuaXMtaW5kZXRlcm1pbmF0ZSAudS1jaGVja2JveF9faW5uZXIsIC5uZC10YWJsZV9fYm9keS1yb3c6aG92ZXIgLnUtY2hlY2tib3hfX2lubmVyLCAuTkhjR3cgLmpsaWxSOWdvLCAuTkhjR3cgLnZ6eHJtNFIsIC51LWJ1dHRvbi0td2VlaywgLnUtYnV0dG9uLS1wcmltYXJ5LCAuZy1idXR0b24sIC51LXN3aXRjaC5pcy1jaGVja2VkIC51LXN3aXRjaF9fY29yZSB7CgkJCQl0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwoJCQkJYm9yZGVyLWNvbG9yOiAke2NvbG9yfTsKCQkJfQoJCQkud3Atcy1hc2lkZS1uYXZfX2ZpbGUtbGlzdC1jYXRlLmlzLWFjdGl2ZSB7CgkJCQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmIAoJCQl9CgkJCS5nLWJ1dHRvbjpob3ZlciwgLndwLXMtcGFuLWZpbGUtbWFpbl9fbmF2LWl0ZW0tc2VwIHsKCQkJCXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CgkJCQljb2xvcjogJHtjb2xvcn1kMDsKCQkJfQoJCQkuZy1idXR0b24tYmx1ZTpob3ZlciwgLmctYnV0dG9uLmctYnV0dG9uLWJsdWUtbGFyZ2U6aG92ZXIgewoJCQkJdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKCQkJCWNvbG9yOiAke2NvbG9yfWQwOwoJCQkJYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn1iMDsKCQkJfQoJCQkuZy1idXR0b246aG92ZXIgLmljb24gewoJCQkJY29sb3I6ICR7Y29sb3J9ZDA7CgkJCX0KCQkJLmJhY2stb2xkLXZlcnNpb24gewoJCQkJYmFja2dyb3VuZDogI2YxZjNmODsKCQkJCWJvcmRlci1yYWRpdXM6IDMycHg7CgkJCQl3aWR0aDogMzBweDsKCQkJCWhlaWdodDogMzBweDsKCQkJCWRpc3BsYXk6IGZsZXg7CgkJCQlqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKCQkJfQoJCQlgCgkJCWlmICgvKHBhbnx5dW4pLmJhaWR1LmNvbS8udGVzdChsb2NhdGlvbi5ob3N0KSAmJiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2JhaWR1X3RoZW1lJykgPT09ICd5ZXMnKSB7CgkJCQl0aGlzLmFkZFN0eWxlKCdQYW5saW5rZXItQmFpZHVVSScsICdzdHlsZScsIGJhaWR1Y3NzKTsKCQkJfTsKCQl9LAoKCQlhc3luYyBpbml0RGlhbG9nKCkgewoJCQlsZXQgc2VjcmV0ID0gIiIKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJc2VjcmV0ID0gIuW9k+WJjeaal+WPt+aYr++8muKAnCIgKyBwYW4ubnVtICsgIuKAneOAgiI7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjInKSB7CgkJCQlzZWNyZXQgPSAi5b2T5YmN5pqX5Y+35piv77ya4oCcIiArIHBhbi5udW0gKyAi4oCd77yM5byA5rqQ5Y2P6K6u5piv4oCcIiArIHBhbi5saWNlbnNlICsgIuKAneOAgiI7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAibm8iKSB7CgkJCQlzZWNyZXQgPSAi5b2T5YmN5pqX5Y+35piv77ya4oCcIiArIHBhbi5udW0gKyAi4oCd44CCIjsKCQkJfSBlbHNlIHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCAndjInKTsKCQkJCXNlY3JldCA9ICLlvZPliY3phY3nva7kuI3mraPnoa7vvIzor7fliLfmlrDpobXpnaLlho3nu6fnu60iOwoJCQl9CgkJCWxldCByZXN1bHQgPSBhd2FpdCBTd2FsLmZpcmUoewoJCQkJdGl0bGU6IHBhbi5pbml0WzBdLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJc2hvd0RlbnlCdXR0b246IHRydWUsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJaHRtbDogYDxkaXY+PGltZyBzdHlsZT0id2lkdGg6IDI1MHB4O21hcmdpbi1ib3R0b206IDEwcHg7IiBzcmM9IiR7cGFuLmltZ30iIGFsdD0iJHtwYW4uaW1nfSI+CgkJCQk8aW5wdXQgY2xhc3M9InN3YWwyLWlucHV0IGluaXQtaW5wdXQiIGlkPSJpbml0IiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iJHtwYW4uaW5pdFsxXX0iPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7kvaDlj6/ku6XpgInmi6ki5rOo5YWlIueri+WNs+eCueS6ruaMiemSrjwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+5oiW6ICF6L6T5YWlIOaal+WPty/lvIDmupDljY/orq4g54K55LquLi4uPC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj4ke3NlY3JldH08L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPuWOn+S9nOiAheW8gOWPkeW+iOi+m+iLpu+8jOaJgOS7peivt+aJq+eggeaUr+aMgeS4gOS4i+S7lueahOeahOWFrOS8l+WPtzwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+5oiW6ICF5p2l57uZ6L+Z5Liq5pS554mI54K55LiqPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50LyI+U3RhcjwvYT4uLi48L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPueCueS6ruWQjuWPr+S7peeyvueugOmDqOWIhue9keebmOeVjOmdouWTpiE8L3NwYW4+PC9kaXY+CgkJCQlgLAoJCQkJZGVueUJ1dHRvblRleHQ6ICfms6jlhaUo54K55Lqu5LiL6L295Yqp5omL5oyJ6ZKuKScKCQkJfSk7CgkJCWlmIChyZXN1bHQuaXNEZW5pZWQpIHsKCQkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuato+WcqOazqOWFpeeCueS6ruaMiemSruiuvue9rumhueebri4uLiIpOwoJCQkJbWVzc2FnZS53YXJuaW5nKCLmraPlnKjms6jlhaXngrnkuq7mjInpkq7orr7nva7pobnnm64uLi4iKTsKCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgcGFuLm51bSk7CgkJCQkJYmFzZS5zZXRWYWx1ZSgnbGljZW5zZScsIHBhbi5saWNlbnNlKTsKCQkJCQltZXNzYWdlLnN1Y2Nlc3MoIuazqOWFpeaIkOWKn+S6huasuCEiKTsKCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJbWVzc2FnZS5zdWNjZXNzKHBhbi5pbml0WzJdKTsKCQkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCQl9LCAzMDAwKTsKCQkJCQl9LCAzMDAwKTsKCQkJCX0sIDUwMDApOwoJCQl9OwoJCQlpZiAocmVzdWx0LmlzQ29uZmlybWVkKXsKCQkJCWlmIChwYW4ubnVtID09PSAkKCcjaW5pdCcpLnZhbCgpIHx8IHBhbi5saWNlbnNlID09PSAkKCcjaW5pdCcpLnZhbCgpKSB7CgkJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxu5pqX5Y+35oiW5Y2P6K6u5q2j56GuIikKCQkJCQltZXNzYWdlLnN1Y2Nlc3MocGFuLmluaXRbMl0pOwoJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScsIHBhbi5udW0pOwoJCQkJCQliYXNlLnNldFZhbHVlKCdsaWNlbnNlJywgcGFuLmxpY2Vuc2UpOwoJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCX0sIDMwMDApCgkJCQl9IGVsc2UgaWYgKCQoJyNpbml0JykudmFsKCkgPT09ICcxMTQ1MTQnIHx8ICQoJyNpbml0JykudmFsKCkgPT09ICcxOTE5ODEwJyB8fCAkKCcjaW5pdCcpLnZhbCgpID09PSAnMTE0NTE0MTkxOTgxMCcpIHsKCQkJCQkvKi0tLQoJCQkJCQlob21v5b2p6JuL5Y+I5Zue5p2l5Yqb77yI5Zac77yJCgkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9waWM0LnpoaW1nLmNvbS84MC92Mi0xYjk3YTA4OGUxNTZjMDE1MTA4ZGVjNjYzYmJhOGIwNC5qcGcnLAoJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vbGgxLmhldGFvdXNlcmNvbnRlbnQuY29tL2ltZy83ZDRjMWMwYjRhZGIwZTk1LmpwZycsCgkJCQkJKi8KCQkJCQlhd2FpdCBTd2FsLmZpcmUoewoJCQkJCQlpY29uOiAnZXJyb3InLAoJCQkJCQl0aXRsZTogJzExNDUxNDE5MTk4MTAnLAoJCQkJCQlodG1sOiAnPHNwYW4+aG9tb+eJueacieeahOaVsOWtl+W9k+eEtuS4jeihjOWVpjxicj7lk7zlk7zlk7zllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYo8L3NwYW4+JywKCQkJCQkJdGltZXI6IDgwMDAsCgkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9waWM0LnpoaW1nLmNvbS84MC92Mi0xYjk3YTA4OGUxNTZjMDE1MTA4ZGVjNjYzYmJhOGIwNC5qcGcnLAoJCQkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQkJCXRpbWVyUHJvZ3Jlc3NCYXI6IHRydWUsCgkJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQkJc2hvd0RlbnlCdXR0b246IHRydWUsCgkJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQkJZGVueUJ1dHRvblRleHQ6ICflk7zlk7zlk7zllYrllYrllYrllYrllYrllYrllYrllYrllYrllYonLAoJCQkJCX0pOwoJCQkJCW1lc3NhZ2UuaW5mbygi5oiQ5bCx77ya5L2g6Kem5Y+R5LqG5LiA5LiqaG9tb+eJueacieeahOW9qeibi++8gSIpOwoJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQlTd2FsLmZpcmUoewoJCQkJCQkJdGl0bGU6ICcxMTQ1MTQxOTE5ODEwJywKCQkJCQkJCXRleHQ6J2hvbW/nibnmnInnmoTmlbDlrZflvZPnhLbkuI3ooYzllaYuLi7lkJfvvJ8nLAoJCQkJCQkJaWNvbjogJ3F1ZXN0aW9uJywKCQkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9saDEuaGV0YW91c2VyY29udGVudC5jb20vaW1nLzdkNGMxYzBiNGFkYjBlOTUuanBnJywKCQkJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCQkJfSk7CgkJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKCQkJCQkJCW1lc3NhZ2Uuc3VjY2Vzcygi5oiQ5bCx77ya5ZO85ZO85ZO85ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5Zyw5rOo5YWl5oiQ5YqfKOWWnCkiKTsKCQkJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJCQl9LCAzMDAwKTsKCQkJCQkJfSwgMzAwMCkKCQkJCQl9LCA0MDAwKQoJCQkJfSBlbHNlIHsKCQkJCQljb25zb2xlLmxvZygi44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRXG7mmpflj7fplJnor68iKQoJCQkJCWF3YWl0IFN3YWwuZmlyZSh7CgkJCQkJCWltYWdlVXJsOiBwYW4uaW1nLAoJCQkJCQl0aXRsZTogcGFuLmluaXRbM10sCgkJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQkJaHRtbDogYDxkaXY+PHNwYW4+JHtwYW4uaW5pdFs0XX08YnI+5L2g5Y+v5Lul5Zyo6L+U5Zue5ZCO6YCJ5oup4oCc5rOo5YWl4oCd56uL5Y2z54K55Lqu5oyJ6ZKu77yMPGJyPuaIluiAheWcqOi+k+WFpeahhumUruWFpeS7peS4i+aal+WPt++8muKAnCR7cGFuLm51bX3igJ3jgII8L3NwYW4+PC9kaXY+YCwKCQkJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfph43mlrDovpPlhaUnLAoJCQkJCX0pOwoJCQkJCWF3YWl0IHRoaXMuaW5pdERpYWxvZygpOwoJCQkJCXJldHVybjsKCQkJCX07CgkJCX0KCQl9LAoKCQlhc3luYyBpbml0RGlhbG9nV2FwKCkgewoJCQlsZXQgc2VjcmV0ID0gIiIKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJc2VjcmV0ID0gIuW9k+WJjeaal+WPt+aYr++8muKAnCIgKyBwYW4ubnVtICsgIuKAneOAgiI7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjInKSB7CgkJCQlzZWNyZXQgPSAi5b2T5YmN5pqX5Y+35piv77ya4oCcIiArIHBhbi5udW0gKyAi4oCd77yM5byA5rqQ5Y2P6K6u5piv4oCcIiArIHBhbi5saWNlbnNlICsgIuKAneOAgiI7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAibm8iKSB7CgkJCQlzZWNyZXQgPSAi5b2T5YmN5pqX5Y+35piv77ya4oCcIiArIHBhbi5udW0gKyAi4oCd44CCIjsKCQkJfSBlbHNlIHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCAndjInKTsKCQkJCXNlY3JldCA9ICLlvZPliY3phY3nva7kuI3mraPnoa7vvIzor7fliLfmlrDpobXpnaLlho3nu6fnu60iOwoJCQl9CgkJCWxldCByZXN1bHQgPSBhd2FpdCBTd2FsLmZpcmUoewoJCQkJdGl0bGU6IHBhbi5pbml0WzBdLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJc2hvd0RlbnlCdXR0b246IHRydWUsCgkJCQlwb3NpdGlvbjogJ3RvcCcsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLAoJCQkJaHRtbDogYDxkaXY+PGltZyBzdHlsZT0id2lkdGg6IDI1MHB4O21hcmdpbi1ib3R0b206IDEwcHg7IiBzcmM9IiR7cGFuLmltZ30iIGFsdD0iJHtwYW4uaW1nfSI+CgkJCQk8aW5wdXQgY2xhc3M9InN3YWwyLWlucHV0IGluaXQtaW5wdXQiIGlkPSJpbml0IiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iJHtwYW4uaW5pdFsxXX0iPjxicj4KCQkJCTxkaXY+PHNwYW4+5L2g5Y+v5Lul6YCJ5oupIuazqOWFpSLnq4vljbPngrnkuq7mjInpkq48L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPuaIluiAhei+k+WFpSDmmpflj7cv5byA5rqQ5Y2P6K6uIOeCueS6ri4uLjwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+JHtzZWNyZXR9PC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7ljp/kvZzogIXlvIDlj5Hlvojovpvoi6bvvIzmiYDku6Xor7fmiavnoIHmlK/mjIHkuIDkuIvku5bnmoTnmoTlhazkvJflj7c8L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPuaIluiAheadpee7mei/meS4quaUueeJiOeCueS4qjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC8iPlN0YXI8L2E+Li4uPC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7ngrnkuq7lkI7lj6/ku6Xnsr7nroDpg6jliIbnvZHnm5jnlYzpnaLlk6YhPC9zcGFuPjwvZGl2PgoJCQkJPC9kaXY+YCwKCQkJCWRlbnlCdXR0b25UZXh0OiAn5rOo5YWlJwoJCQl9KTsKCQkJaWYgKHJlc3VsdC5pc0RlbmllZCkgewoJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxu5q2j5Zyo5rOo5YWl54K55Lqu5oyJ6ZKu6K6+572u6aG555uuLi4uIik7CgkJCQltZXNzYWdlLndhcm5pbmcoIuato+WcqOazqOWFpeeCueS6ruaMiemSruiuvue9rumhueebri4uLiIpOwoJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKCQkJCQltZXNzYWdlLnN1Y2Nlc3MoIuazqOWFpeaIkOWKn+S6huasuCEiKTsKCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJbWVzc2FnZS5zdWNjZXNzKHBhbi5pbml0WzJdKTsKCQkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCQl9LCAzMDAwKTsKCQkJCQl9LCAzMDAwKTsKCQkJCX0sIDUwMDApOwoJCQl9OwoJCQlpZiAocmVzdWx0LmlzQ29uZmlybWVkKXsKCQkJCWlmIChwYW4ubnVtID09PSAkKCcjaW5pdCcpLnZhbCgpKSB7CgkJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxu5pqX5Y+35q2j56GuIikKCQkJCQltZXNzYWdlLnN1Y2Nlc3MocGFuLmluaXRbMl0pOwoJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScsIHBhbi5udW0pOwoJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCX0sIDMwMDApCgkJCQl9IGVsc2UgaWYgKCQoJyNpbml0JykudmFsKCkgPT09ICcxMTQ1MTQnIHx8ICQoJyNpbml0JykudmFsKCkgPT09ICcxOTE5ODEwJyB8fCAkKCcjaW5pdCcpLnZhbCgpID09PSAnMTE0NTE0MTkxOTgxMCcpIHsKCQkJCQkvKi0tLQoJCQkJCQlob21v5b2p6JuL5Y+I5Zue5p2l5Yqb77yI5Zac77yJCgkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9waWM0LnpoaW1nLmNvbS84MC92Mi0xYjk3YTA4OGUxNTZjMDE1MTA4ZGVjNjYzYmJhOGIwNC5qcGcnLAoJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vbGgxLmhldGFvdXNlcmNvbnRlbnQuY29tL2ltZy83ZDRjMWMwYjRhZGIwZTk1LmpwZycsCgkJCQkJKi8KCQkJCQlhd2FpdCBTd2FsLmZpcmUoewoJCQkJCQlpY29uOiAnZXJyb3InLAoJCQkJCQl0aXRsZTogJzExNDUxNDE5MTk4MTAnLAoJCQkJCQlodG1sOiAnPHNwYW4+aG9tb+eJueacieeahOaVsOWtl+W9k+eEtuS4jeihjOWVpjxicj7lk7zlk7zlk7zllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYrllYo8L3NwYW4+JywKCQkJCQkJdGltZXI6IDgwMDAsCgkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9waWM0LnpoaW1nLmNvbS84MC92Mi0xYjk3YTA4OGUxNTZjMDE1MTA4ZGVjNjYzYmJhOGIwNC5qcGcnLAoJCQkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQkJCXRpbWVyUHJvZ3Jlc3NCYXI6IHRydWUsCgkJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQkJc2hvd0RlbnlCdXR0b246IHRydWUsCgkJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQkJZGVueUJ1dHRvblRleHQ6ICflk7zlk7zlk7zllYrllYrllYrllYrllYrllYrllYrllYrllYrllYonLAoJCQkJCX0pOwoJCQkJCW1lc3NhZ2UuaW5mbygi5oiQ5bCx77ya5L2g6Kem5Y+R5LqG5LiA5LiqaG9tb+eJueacieeahOW9qeibi++8gSIpOwoJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQlTd2FsLmZpcmUoewoJCQkJCQkJdGl0bGU6ICcxMTQ1MTQxOTE5ODEwJywKCQkJCQkJCXRleHQ6J2hvbW/nibnmnInnmoTmlbDlrZflvZPnhLbkuI3ooYzllaYuLi7lkJfvvJ8nLAoJCQkJCQkJaWNvbjogJ3F1ZXN0aW9uJywKCQkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9saDEuaGV0YW91c2VyY29udGVudC5jb20vaW1nLzdkNGMxYzBiNGFkYjBlOTUuanBnJywKCQkJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCQkJfSk7CgkJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKCQkJCQkJCW1lc3NhZ2Uuc3VjY2Vzcygi5oiQ5bCx77ya5ZO85ZO85ZO85ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5Zyw5rOo5YWl5oiQ5YqfKOWWnCkiKTsKCQkJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJCQl9LCAzMDAwKTsKCQkJCQkJfSwgMzAwMCkKCQkJCQl9LCA0MDAwKQoJCQkJfSBlbHNlIHsKCQkJCQljb25zb2xlLmxvZygi44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRXG7mmpflj7fplJnor68iKQoJCQkJCWF3YWl0IFN3YWwuZmlyZSh7CgkJCQkJCWltYWdlVXJsOiBwYW4uaW1nLAoJCQkJCQl0aXRsZTogcGFuLmluaXRbM10sCgkJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQkJaHRtbDogYDxkaXY+PHNwYW4+JHtwYW4uaW5pdFs0XX08YnI+5L2g5Y+v5Lul5Zyo6L+U5Zue5ZCO6YCJ5oup4oCc5rOo5YWl4oCd56uL5Y2z54K55Lqu5oyJ6ZKu77yMPGJyPuaIluiAheWcqOi+k+WFpeahhumUruWFpeS7peS4i+aal+WPt++8muKAnCR7cGFuLm51bX3igJ3jgII8L3NwYW4+PC9kaXY+YCwKCQkJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfph43mlrDovpPlhaUnLAoJCQkJCX0pOwoJCQkJCWF3YWl0IHRoaXMuaW5pdERpYWxvZygpOwoJCQkJCXJldHVybjsKCQkJCX07CgkJCX0KCQl9LAoJfTsKCgkvL+eZvuW6pue9keebmAoJbGV0IGJhaWR1ID0gewoKCQlfZ2V0RXh0cmEoKSB7CgkJCWxldCBzZUtleSA9IGRlY29kZVVSSUNvbXBvbmVudChiYXNlLmdldENvb2tpZSgnQkRDTE5EJykpOwoJCQlyZXR1cm4gJ3snICsgJyJzZWtleSI6IicgKyBzZUtleSArICciJyArICJ9IjsKCQl9LAoKCQlfZ2V0U3VybCgpIHsKCQkJbGV0IHJlZyA9IC8oPzw9c1wvfHN1cmw9KShbYS16QS1aMC05Xy1dKykvZzsKCQkJaWYgKHJlZy50ZXN0KGxvY2F0aW9uLmhyZWYpKSB7CgkJCQlyZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChyZWcpWzBdOwoJCQl9CgkJCXJldHVybiAnJzsKCQl9LAoKCQlfZ2V0RmlkTGlzdCgpIHsKCQkJbGV0IGZpZGxpc3QgPSBbXTsKCQkJc2VsZWN0TGlzdC5mb3JFYWNoKHYgPT4gewoJCQkJaWYgKCt2LmlzZGlyID09PSAxKSByZXR1cm47CgkJCQlmaWRsaXN0LnB1c2godi5mc19pZCk7CgkJCX0pOwoJCQlyZXR1cm4gJ1snICsgZmlkbGlzdCArICddJzsKCQl9LAoKCQlfcmVzZXREYXRhKCkgewoJCQlwcm9ncmVzcyA9IHt9OwoJCQkkLmVhY2gocmVxdWVzdCwgKGtleSkgPT4gewoJCQkJKHJlcXVlc3Rba2V5XSkuYWJvcnQoKTsKCQkJfSk7CgkJCSQuZWFjaChpbnMsIChrZXkpID0+IHsKCQkJCWNsZWFySW50ZXJ2YWwoaW5zW2tleV0pOwoJCQl9KTsKCQkJaWRtID0ge307CgkJCWlucyA9IHt9OwoJCQlyZXF1ZXN0ID0ge307CgkJfSwKCgkJc2V0QkRVU1MoKSB7CgkJCXRyeSB7CgkJCQlHTV9jb29raWUgJiYgR01fY29va2llKCdsaXN0Jywge25hbWU6ICdCRFVTUyd9LCAoY29va2llcywgZXJyb3IpID0+IHsKCQkJCQlpZiAoIWVycm9yKSB7CgkJCQkJCWJhc2Uuc2V0U3RvcmFnZSgiYmFpZHV5dW5QbHVnaW5fQkRVU1MiLCB7QkRVU1M6IGNvb2tpZXNbMF0udmFsdWV9KTsKCQkJCQl9CgkJCQl9KTsKCQkJfSBjYXRjaCAoZSkgewoJCQkJY29uc29sZS5lcnJvcigi44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRXG5zZXRCRFVTU1xu6ZSZ6K+v5L+h5oGv77yaIixlKQoJCQl9CgkJfSwKCgkJZ2V0QkRVU1MoKSB7CgkJCWxldCBiYWlkdXl1blBsdWdpbl9CRFVTUyA9IGJhc2UuZ2V0U3RvcmFnZSgnYmFpZHV5dW5QbHVnaW5fQkRVU1MnKSA/IGJhc2UuZ2V0U3RvcmFnZSgnYmFpZHV5dW5QbHVnaW5fQkRVU1MnKSA6ICd7ImJhaWR1eXVuUGx1Z2luX0JEVVNTIjoiIn0nOwoJCQlyZXR1cm4gYmFpZHV5dW5QbHVnaW5fQkRVU1MuQkRVU1MgfHwgJyc7CgkJfSwKCgkJY29udmVydExpbmtUb0FyaWEobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCBCRFVTUyA9IHRoaXMuZ2V0QkRVU1MoKTsKCQkJaWYgKCEhQkRVU1MpIHsKCQkJCWZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CgkJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSIgLS1oZWFkZXIgIlVzZXItQWdlbnQ6ICR7dWF9IiAtLWhlYWRlciAiQ29va2llOiBCRFVTUz0ke0JEVVNTfSJgKTsKCQkJfQoJCQlyZXR1cm4gewoJCQkJbGluazogcGFuLmFzc2lzdGFudCwKCQkJCXRleHQ6IHBhbi5pbml0WzVdCgkJCX07CgkJfSwKCgkJY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CgkJCWlmICghIUJEVVNTKSB7CgkJCQlsZXQgY29va2llID0gYEJEVVNTPSR7QkRVU1N9YDsKCQkJCWxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9JmNvb2tpZT0ke2VuY29kZVVSSUNvbXBvbmVudChjb29raWUpfSZ1c2VyX2FnZW50PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVhKX1aWmA7CgkJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmVuY29kZShiYyl9YCk7CgkJCX0KCQkJcmV0dXJuIHsKCQkJCWxpbms6IHBhbi5hc3Npc3RhbnQsCgkJCQl0ZXh0OiBwYW4uaW5pdFs1XQoJCQl9OwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CgkJCWlmICghIUJEVVNTKSB7CgkJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJCWZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CgkJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9IiAtQSAiJHt1YX0iIC1iICJCRFVTUz0ke0JEVVNTfSJgKTsKCQkJfQoJCQlyZXR1cm4gewoJCQkJbGluazogcGFuLmFzc2lzdGFudCwKCQkJCXRleHQ6IHBhbi5pbml0WzVdCgkJCX07CgkJfSwKCgkJYWRkUGFnZUxpc3RlbmVyKCkgewoJCQlmdW5jdGlvbiBfZmFjdG9yeShlKSB7CgkJCQlsZXQgdGFyZ2V0ID0gJChlLnRhcmdldCk7CgkJCQlsZXQgaXRlbSA9IHRhcmdldC5wYXJlbnRzKCcucGwtaXRlbScpOwoJCQkJbGV0IGxpbmsgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLWxpbmsnKTsKCQkJCWxldCBwcm9ncmVzcyA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tcHJvZ3Jlc3MnKTsKCQkJCWxldCB0aXAgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXRpcCcpOwoJCQkJbGV0IGNvcHkgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLWNvcHknKTsKCQkJCWxldCBob3dpZG0gPSBpdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1ob3cnKTsKCQkJCWxldCBiYWNrID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtYmFjaycpOwoJCQkJbGV0IHN0b3AgPSBpdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1zdG9wJyk7CgkJCQlyZXR1cm4gewoJCQkJCWl0ZW0sIGxpbmssIHByb2dyZXNzLCB0aXAsIGNvcHksIGhvd2lkbSwgYmFjaywgc3RvcCwgdGFyZ2V0LAoJCQkJfTsKCQkJfQoKCQkJZnVuY3Rpb24gX3Jlc2V0KGkpIHsKCQkJCWluc1tpXSAmJiBjbGVhckludGVydmFsKGluc1tpXSk7CgkJCQlyZXF1ZXN0W2ldICYmIHJlcXVlc3RbaV0uYWJvcnQoKTsKCQkJCXByb2dyZXNzW2ldID0gMDsKCQkJCWlkbVtpXSA9IGZhbHNlOwoJCQl9CgoJCQlkb2Mub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSBjbGljaycsICcucGwtYnV0dG9uLmctZHJvcGRvd24tYnV0dG9uJywgKGUpID0+IHsKCQkJCWlmIChlLnR5cGUgPT09ICdtb3VzZWxlYXZlJykgewoJCQkJCSQoZS5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygnYnV0dG9uLW9wZW4nKTsKCQkJCX0gZWxzZSB7CgkJCQkJJChlLmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCdidXR0b24tb3BlbicpOwoJCQkJCSQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCcucGwtZHJvcGRvd24tbWVudScpLnNob3coKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignbW91c2VsZWF2ZScsICcucGwtYnV0dG9uLmctZHJvcGRvd24tYnV0dG9uIC5wbC1kcm9wZG93bi1tZW51JywgKGUpID0+IHsKCQkJCSQoZS5jdXJyZW50VGFyZ2V0KS5oaWRlKCk7CgkJCX0pOwoKCQkJZG9jLm9mZignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJykub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CgkJCQltb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwoJCQkJU3dhbC5maXJlKHsKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJaHRtbDogYOmTvuaOpeiOt+WPluS4rWAsCgkJCQkJd2lsbE9wZW46IGZ1bmN0aW9uKCkgewoJCQkJCQlTd2FsLnNob3dMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSk7CgkJCQl0aGlzLmdldFBDU0xpbmsoKTsKCQkJfSk7CgkJCWRvYy5vZmYoJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScpLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCAkd2lkdGggPSBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyJyk7CgkJCQlsZXQgJHRleHQgPSBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyLXRleHQnKTsKCQkJCWxldCBmaWxlbmFtZSA9IG8ubGlua1swXS5kYXRhc2V0LmZpbGVuYW1lOwoJCQkJbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CgkJCQlfcmVzZXQoaW5kZXgpOwoJCQkJYmFzZS5nZXQoby5saW5rWzBdLmRhdGFzZXQubGluaywgeyJVc2VyLUFnZW50IjogcGFuLnVhfSwgJ2Jsb2InLCB7ZmlsZW5hbWUsIGluZGV4fSk7CgkJCQlsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsgLy8g6K6w5b2V5LiL6L295byA5aeL5pe26Ze0CgkJCQlsZXQgcHJldkxvYWRlZCA9IDA7IC8vIOS4iuS4gOasoeeahOW3suS4i+i9veaVsOaNrumHjwoJCQkJbGV0IHByZXZUaW1lID0gc3RhcnRUaW1lOyAvLyDkuIrkuIDmrKHnmoTml7bpl7QKCQkJCWxldCBzaXplID0gTnVtYmVyKG8ubGlua1swXS5kYXRhc2V0LnNpemUpOwoJCQkJaW5zW2luZGV4XSA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCQlsZXQgcHJvZyA9ICtwcm9ncmVzc1tpbmRleF0gfHwgMDsKCQkJCQlsZXQgaXNJRE0gPSBpZG1baW5kZXhdIHx8IGZhbHNlOwoKCQkJCQlpZiAoaXNJRE0pIHsKCQkJCQkJLy8g5aSE55CGSURN55qE5Luj56CBCgkJCQkJCW8udGlwLmhpZGUoKTsKCQkJCQkJby5wcm9ncmVzcy5oaWRlKCk7CgkJCQkJCW8uY29weS5zaG93KCk7CgkJCQkJCW8ubGluay50ZXh0KCfpk77mjqXlt7LooqtJRE3mjZXojrd+6K+35p+l55yLSURN5LiL6L2956qX5Y+j5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKS5zaG93KCk7CgkJCQkJCWNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CgkJCQkJCXNldFRpbWVvdXQoCgkJCQkJCQlmdW5jdGlvbiAoKXsKCQkJCQkJCQlvLmxpbmsudGV4dCgn6YeN5paw5LiL6L29JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJCX0sMjAwMAoJCQkJCQkpCgkJCQkJCWlkbVtpbmRleF0gPSBmYWxzZTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyDlpITnkIbmma7pgJrkuIvovb3nmoTmg4XlhrUuLi4KCQkJCQkJbGV0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTsKCQkJCQkJbGV0IGVsYXBzZWRUaW1lID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWU7CgkJCQkJCWxldCB0b3RhbFByb2dyZXNzID0gcHJvZyAvIDEwMDsKCQkJCQkJbGV0IHRvdGFsRWxhcHNlZFNlY29uZHMgPSBlbGFwc2VkVGltZSAvIDEwMDA7CgkJCQkJCWxldCBlc3RpbWF0ZWRUb3RhbFRpbWVTZWNvbmRzID0gdG90YWxFbGFwc2VkU2Vjb25kcyAvIHRvdGFsUHJvZ3Jlc3M7CgkJCQkJCWxldCByZW1haW5pbmdUaW1lU2Vjb25kcyA9IGVzdGltYXRlZFRvdGFsVGltZVNlY29uZHMgLSB0b3RhbEVsYXBzZWRTZWNvbmRzOwoKCQkJCQkJLy8g5bCG5Ymp5L2Z5pe26Ze06L2s5o2i5Li65aSp44CB5pe244CB5YiG44CB56eSCgkJCQkJCWxldCByZW1haW5pbmdEYXlzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvICg2MCAqIDYwICogMjQpKTsKCQkJCQkJcmVtYWluaW5nVGltZVNlY29uZHMgJT0gKDYwICogNjAgKiAyNCk7CgoJCQkJCQlsZXQgcmVtYWluaW5nSG91cnMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gKDYwICogNjApKTsKCQkJCQkJcmVtYWluaW5nVGltZVNlY29uZHMgJT0gKDYwICogNjApOwoKCQkJCQkJbGV0IHJlbWFpbmluZ01pbnV0ZXMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gNjApOwoJCQkJCQlsZXQgcmVtYWluaW5nU2Vjb25kcyA9IE1hdGguZmxvb3IocmVtYWluaW5nVGltZVNlY29uZHMgJSA2MCk7CgoJCQkJCQkvLyDorqHnrpfkuIvovb3pgJ/luqYKCQkJCQkJbGV0IGxvYWRlZCA9IHByb2cgKiBzaXplIC8gMTAwOyAvLyDlt7LkuIvovb3mlbDmja7ph48KCQkJCQkJbGV0IGN1cnJlbnRUaW1lRGlmZiA9IGN1cnJlbnRUaW1lIC0gcHJldlRpbWU7IC8vIOW9k+WJjeaXtumXtOS4juS4iuS4gOasoeaXtumXtOeahOW3ruWAvAoJCQkJCQlsZXQgbG9hZGVkRGlmZiA9IGxvYWRlZCAtIHByZXZMb2FkZWQ7IC8vIOW9k+WJjeW3suS4i+i9veaVsOaNrumHj+S4juS4iuS4gOasoeeahOW3ruWAvAoJCQkJCQlsZXQgZG93bmxvYWRTcGVlZCA9IChjdXJyZW50VGltZURpZmYgIT09IDApID8gbG9hZGVkRGlmZiAvIChjdXJyZW50VGltZURpZmYgLyAxMDAwKSA6IDA7IC8vIOS4i+i9vemAn+W6pu+8iOWNleS9je+8muWtl+iKgi/np5LvvIkKCgkJCQkJCS8vIOabtOaWsOS4iuS4gOasoeeahOaVsOaNrgoJCQkJCQlwcmV2TG9hZGVkID0gbG9hZGVkOwoJCQkJCQlwcmV2VGltZSA9IGN1cnJlbnRUaW1lOwoKCQkJCQkJLy8g5pu05pS555WM6Z2iCgkJCQkJCW8ubGluay5oaWRlKCk7CgkJCQkJCW8udGlwLmhpZGUoKTsKCQkJCQkJby5zdG9wLnNob3coKTsKCQkJCQkJby5jb3B5LmhpZGUoKTsKCQkJCQkJby5wcm9ncmVzcy5zaG93KCk7CgoJCQkJCQkvLyDmm7TmlrDov5vluqbmnaEKCQkJCQkJJHdpZHRoLmNzcygnd2lkdGgnLCBwcm9nICsgJyUnKTsKCgkJCQkJCS8vIOabtOaWsOi/m+W6puadoeaWh+acrAoJCQkJCQlsZXQgdGltZVRleHQgPSAnJzsKCQkJCQkJaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdEYXlzKSAmJiByZW1haW5pbmdEYXlzID4gMCkgewoJCQkJCQkJdGltZVRleHQgPSByZW1haW5pbmdEYXlzICsgJ+WkqSAnICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdIb3VycykgKyAn5pe2OicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ01pbnV0ZXMpICsgJ+WIhjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdTZWNvbmRzKSArICfnp5InOwoJCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdIb3VycykgJiYgcmVtYWluaW5nSG91cnMgPiAwKSB7CgkJCQkJCQl0aW1lVGV4dCA9IGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nSG91cnMpICsgJ+aXtjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nTWludXRlcykgJiYgcmVtYWluaW5nTWludXRlcyA+IDApIHsKCQkJCQkJCXRpbWVUZXh0ID0gYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nU2Vjb25kcykgJiYgcmVtYWluaW5nU2Vjb25kcyA+IDApIHsKCQkJCQkJCXRpbWVUZXh0ID0gcmVtYWluaW5nU2Vjb25kcyArICfnp5InOwoJCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdTZWNvbmRzKSAmJiByZW1haW5pbmdTZWNvbmRzID09PSAwKSB7CgkJCQkJCQl0aW1lVGV4dCA9ICfljbPlsIblrozmiJAnOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdGltZVRleHQgPSAn6K6h566X5LitLi4uJzsKCQkJCQkJfQoKCQkJCQkJbGV0IHNwZWVkVGV4dCA9Jyc7CgkJCQkJCXNwZWVkVGV4dCA9IGJhc2Uuc2l6ZUZvcm1hdChkb3dubG9hZFNwZWVkKQoKCQkJCQkJCgkJCQkJCWlmIChwdCA9PT0gJ3dhcCcpIHsKCQkJCQkJCSR0ZXh0LnRleHQocHJvZyArICclJyk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdGV4dC50ZXh0KHByb2cgKyAnJSB8IOWJqeS9meaXtumXtO+8micgKyB0aW1lVGV4dCArICcgfCDpgJ/luqbvvJonICsgc3BlZWRUZXh0ICsgJy/np5InKTsKCQkJCQkJfQoKCQkJCQkJaWYgKHByb2cgPT09IDEwMCkgewoJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKXsKCQkJCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCQkJCXByb2dyZXNzW2luZGV4XSA9IDA7CgkJCQkJCQkJby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1zdG9wJykuaGlkZSgpOwoJCQkJCQkJCW8uaG93aWRtLmhpZGUoKTsKCQkJCQkJCQkkdGV4dC50ZXh0KCfkuIvovb3lrozmiJDkuoYh5rWP6KeI5Zmo5LiL6L295qGG5bqU6K+l5by55Ye65p2l5LqG5ZOmficpOwoJCQkJCQkJCW8uYmFjay5zaG93KCkKCQkJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpewoJCQkJCQkJCQlvLmxpbmsudGV4dCgn6YeN5paw5LiL6L29JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJCQl9LDMwMDApCgkJCQkJCQl9LDMwMDApCgkJCQkJCX0KCQkJCQl9CgkJCQl9LCA1MDApOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcmV0cnknLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCW8udGlwLmhpZGUoKTsKCQkJCW8ubGluay5zaG93KCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ob3cnLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJaWYgKHJlcXVlc3RbaW5kZXhdKSB7CgkJCQkJcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJCW8udGlwLnNob3coKTsKCQkJCX0KCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zdG9wJywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsKCQkJCWlmIChyZXF1ZXN0W2luZGV4XSkgewoJCQkJCXJlcXVlc3RbaW5kZXhdLmFib3J0KCk7CgkJCQkJY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyLXRleHQnKS50ZXh0KCfmraPlnKjlj5bmtoguLi4nKTsKCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyJykuY3NzKCd3aWR0aCcsIDEwMCArICclJyk7CgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCQlvLnRpcC5oaWRlKCk7CgkJCQkJCW8uYmFjay5oaWRlKCk7CgkJCQkJCW8ubGluay5zaG93KDApOwoJCQkJCQlvLmNvcHkuc2hvdygpOwoJCQkJCQlvLnByb2dyZXNzLmhpZGUoKTsKCQkJCQkJby5zdG9wLmhpZGUoKTsKCQkJCQl9LDEwNTApCgkJCQl9CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1iYWNrJywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlvLnByb2dyZXNzLmhpZGUoKTsKCQkJCW8udGlwLmhpZGUoKTsKCQkJCW8ubGluay5zaG93KCk7CgkJCQlvLmNvcHkuc2hvdygpOwoJCQkJby5zdG9wLmhpZGUoKTsKCQkJCW8uYmFjay5oaWRlKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlpZiAoIWUudGFyZ2V0LmRhdGFzZXQubGluaykgewoJCQkJCSQoZS50YXJnZXQpLnJlbW92ZUNsYXNzKCdsaXN0ZW5lci1jb3B5LWFsbCcpLmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwoJCQkJfSBlbHNlIHsKCQkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkJJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJCXNldFRpbWVvdXQoCgkJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkJJChlLnRhcmdldCkudGV4dCgn6YeN5paw5aSN5Yi2JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJfSwyMDAwCgkJCQkJKQoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItY29weS1hbGwtYXBpJywgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWJhc2Uuc2V0Q2xpcGJvYXJkKGRlY29kZVVSSUNvbXBvbmVudChlLnRhcmdldC5kYXRhc2V0LmxpbmspKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub2ZmKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnKS5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstcnBjJywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7IAoKCQkJCXRhcmdldC5maW5kKCcuaWNvbicpLnJlbW92ZSgpOwoJCQkJdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQucHJlcGVuZChiYXNlLmNyZWF0ZUxvYWRpbmcoKSk7CgoJCQkJbGV0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZExpbmtUb1JQQyhlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5maWxlbmFtZSwgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCQlpZiAocmVzID09PSAnc3VjY2VzcycpIHsKCQkJCQkkKCcubGlzdGVuZXItcnBjLXRhc2snKS5zaG93KCk7CgkJCQkJdGFyZ2V0LnJlbW92ZUNsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbCgn5Y+R6YCB5oiQ5Yqf5LqGIeW/q+WOu+eci+eci+WQp34nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQl9IGVsc2UgaWYgKHJlcyA9PT0gJ2Fzc2lzdGFudCcpIHsKCQkJCQl0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKGAke3Bhbi5pbml0WzVdffCfkYk8YSBocmVmPSIke3Bhbi5hc3Npc3RhbnR9IiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9InBsLWEiPueCueWHu+atpOWkhOWuieijhTwvYT7wn5GIYCk7CgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOajgOafpeS4gOS4i+aCqOeahFJQQ+mFjee9ruS/oeaBr+WTpiEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQl9CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zZW5kLXJwYycsIChlKSA9PiB7CgkJCQkkKCcubGlzdGVuZXItbGluay1ycGMnKS5jbGljaygpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5Y+R6YCB5a6M5oiQ77yM5Y+R6YCB57uT5p6c6KeB5LiK5pa55oyJ6ZKu5ZOmficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLW9wZW4tc2V0dGluZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1NldHRpbmcoKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLW9wZW4td2Fwc2V0dGluZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1dhcFNldHRpbmcoKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93VXBkYXRlTG9nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGFzaycsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewoJCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lbmNvZGUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CgkJCQlHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CgkJCX0pOwoJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlKSA9PiB7CgkJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3BsLWEnKSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQl9CgkJCX0sIHRydWUpOwoJCX0sCgoJCWFkZEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53cC1zLWhlYWRlcl9fdmlwLWJ0bi10aXAiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIndwLXMtaGVhZGVyX192aXAtYnRuLXRpcCIpWzBdOwoJCQkJdmlwMS5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIuYXBwLXVzZXItdmlwLWNlbnRlci10aXAiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImFwcC11c2VyLXZpcC1jZW50ZXItdGlwIilbMF07CgkJCQl2aXAyLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53ZWItaGVhZGVyLXRleHQtcy00NSIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCB2aXAzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndlYi1oZWFkZXItdGV4dC1zLTQ1Iik7CgkJCQl2aXAzLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53cC1zLWhlYWRlcl9fdmlwLWJ0biIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCB2aXA0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgid3Atcy1oZWFkZXJfX3ZpcC1idG4iKVswXTsKCQkJCXZpcDQuaW5uZXJUZXh0ID0gIuS8muWRmOS4reW/gyI7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLktRY0h5QSIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCB2aXA1ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiS1FjSHlBIilbMF07CgkJCQl2aXA1LmlubmVyVGV4dCA9ICLkvJrlkZjkuK3lv4MiOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5nT0lielBiIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDYgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJnT0lielBiIilbMF07CgkJCQl2aXA2LnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5hcHAtdXNlci12aXAtY2VudGVyLWJveCIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCB2aXA3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXBwLXVzZXItdmlwLWNlbnRlci1ib3ggdmlwLWNlbnRlci10eXBlLTIiKVswXTsKCQkJCXZpcDcucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLnUtcG9wb3ZlciIsIGZ1bmN0aW9uICgpIHsKCQkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQkJbGV0IHZpcDggPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ3cC1zLWhlYWRlci11c2VyX192aXAtY2VudGVyIilbMF07CgkJCQkJbGV0IGFycm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicG9wcGVyX19hcnJvdyIpWzBdOwoJCQkJCWlmKHZpcDgpewoJCQkJCQl2aXA4LnJlbW92ZSgpOwoJCQkJCX0KCQkJCQlpZihhcnJvdyl7CgkJCQkJCWFycm93LnJlbW92ZSgpOwoJCQkJCX07CgkJCQl9LDEwKQoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53cC1zLWhlYWRlci11c2VyX19jcmVhdGUtdGVhbS10aXRsZSIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZDEgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ3cC1zLWhlYWRlci11c2VyX19jcmVhdGUtdGVhbS10aXRsZSIpWzBdOwoJCQkJYWQxLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53cC1zaWRlLW9wdGlvbnMgZy1jbGVhcmZpeCIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZDIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ3cC1zaWRlLW9wdGlvbnMgZy1jbGVhcmZpeCIpWzBdOwoJCQkJYWQyLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53ZWItaGVhZGVyLWFkLWl0ZW0iLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWQzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLndlYi1oZWFkZXItYWQtaXRlbSIpWzBdOwoJCQkJYWQzLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53cC1zLWhlYWRlcl9fZ2FtZS1lbnRyeSIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZDQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ3cC1zLWhlYWRlcl9fZ2FtZS1lbnRyeSIpWzBdOwoJCQkJYWQ0LnJlbW92ZSgpOwoJCQl9LHRydWUpCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLm9wZXJhdGUtZ3VpZGUtY2xvc2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWR3aW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJvcGVyYXRlLWd1aWRlLWNsb3NlIilbMF07CgkJCQlhZHdpbmRvdy5jbGljaygpOwoJCQl9LHRydWUpCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLm5kLW9wZXJhdGUtZ3VpZGFuY2VfX2Nsb3NlIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkd2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibmQtb3BlcmF0ZS1ndWlkYW5jZV9fY2xvc2UiKVswXTsKCQkJCWFkd2luZG93LmNsaWNrKCk7CgkJCX0sdHJ1ZSkKCQkJd2FpdEZvcktleUVsZW1lbnRzKCJjdHgtbWVudS1jb250YWluZXIiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgY3R4bWVudXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY3R4LW1lbnUtY29udGFpbmVyIik7CgkJCQljdHhtZW51cy5mb3JFYWNoKGN0eG1lbnUgPT4gY3R4bWVudS5yZW1vdmUoKSk7CgkJCX0sdHJ1ZSkKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIubmV3SWNvbiIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBuZXdpY29uMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5ld0ljb24iKVswXTsKCQkJCW5ld2ljb24xLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi51LWJhZGdlX19jb250ZW50IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IG5ld2ljb24yID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidS1iYWRnZV9fY29udGVudCBpcy1kb3QiKVswXTsKCQkJCWlmKG5ld2ljb24yKSB7CgkJCQkJbmV3aWNvbjIucmVtb3ZlKCk7CgkJCQl9CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndwLXNpZGUtb3B0aW9ucy1idG4iLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgcWl5ZTEgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ3cC1zaWRlLW9wdGlvbnMgZy1jbGVhcmZpeCIpWzBdOwoJCQkJcWl5ZTEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLmFwcC1kb3dubG9hZCIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhcHAxID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXBwLWRvd25sb2FkIilbMF07CgkJCQlhcHAxLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iZy1kcm9wZG93bi1idXR0b24gcG9pbnRlciBwbC1idXR0b24iIGlkPSJwbC1idXR0b24tbGluayI+PGRpdiBjbGFzcz0iYmFpZHUtYnV0dG9uIGctYnV0dG9uIGctYnV0dG9uLWJsdWUiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiIHN0eWxlPSJjb2xvcjojZmZmOyI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiA2MHB4OyI+5LiL6L295Yqp5omLPC9zcGFuPjwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJtZW51IiBzdHlsZT0iY29sb3I6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjogJHtjb2xvcn07d2lkdGg6YXV0bzt6LWluZGV4OjQxOyI+PGRpdiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgc3R5bGU9InBhZGRpbmc6IDBweDsiIGRhdGEtbW9kZT0iYXBpIiAiPkFQSeS4i+i9vTwvZGl2PjxkaXYgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIHN0eWxlPSJwYWRkaW5nOiAwcHg7IiBkYXRhLW1vZGU9ImFyaWEiICI+QXJpYeS4i+i9vTwvZGl2PjxkaXYgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIHN0eWxlPSJwYWRkaW5nOiAwcHg7IiBkYXRhLW1vZGU9InJwYyIgIj5SUEPkuIvovb08L2Rpdj48ZGl2IGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBzdHlsZT0icGFkZGluZzogMHB4OyIgZGF0YS1tb2RlPSJjdXJsIiAiPmNVUkzkuIvovb08L2Rpdj48ZGl2IGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBzdHlsZT0icGFkZGluZzogMHB4OyIgZGF0YS1tb2RlPSJiYyIgIj5CQ+S4i+i9vTwvZGl2PjxkaXYgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0icGFkZGluZzogMHB4OyIgIj7liqnmiYvorr7nva48L2Rpdj48ZGl2IGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIiBzdHlsZT0icGFkZGluZzogMHB4OyIgIj7mm7TmlrDml6Xlv5c8L2Rpdj4ke3VwZGF0ZV9iYWlkdX08L2Rpdj48L2Rpdj5gKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJfQoJCQlpZiAocHQgPT09ICdtYWluJykgewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLm1haW4pOwoJCQkJJGJ1dHRvbiA9ICQoYDwvZGl2PjxkaXYgY2xhc3M9InBsLWJ1dHRvbiIgaWQ9InBsLWJ1dHRvbi1saW5rIiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDogOHB4OyI+PGJ1dHRvbiBjbGFzcz0iYmFpZHUtYnV0dG9uIHUtYnV0dG9uIHUtYnV0dG9uLS1wcmltYXJ5IHUtYnV0dG9uLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiIgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgcGFkZGluZzogOHB4IDE2cHg7IGhlaWdodDogMzJweDsgYm9yZGVyOiBub25lOyI+PGkgY2xhc3M9InUtaWNvbiB1LWljb24tZG93bmxvYWQiPjwvaT48c3Bhbj7kuIvovb3liqnmiYs8L3NwYW4+PC9idXR0b24+PHVsIGNsYXNzPSJkcm9wZG93bi1saXN0IG5kLWNvbW1vbi1mbG9hdC1tZW51IHBsLWRyb3Bkb3duLW1lbnUiPjxsaSBjbGFzcz0icGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iYmMiPkJD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCBsaXN0ZW5lci1vcGVuLXNldHRpbmciIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPiR7dXBkYXRlX2JhaWR1WH08L3VsPjwvZGl2PmApOwoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJaWYgKHB0ID09PSAnd2FwJykgewoJCQkJJHRvb2xXcmFwID0gJCgnLm1haW4tY29udGFpbmVyJyk7CgkJCQkkYnV0dG9uID0gJChgPHNwYW4gaWQ9InBsLWJ1dHRvbi1saW5rIiBjbGFzcz0id2FwZm9udCBub25lLXBvaW50ZXIgcGwtYnV0dG9uIGJhaWR1LXdhcC1idXR0b24iPjxzcGFuPjwvc3Bhbj48dWwgY2xhc3M9ImRyb3Bkb3duLWxpc3QgbmQtY29tbW9uLWZsb2F0LW1lbnUgcGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogNDBweDsgcmlnaHQ6IDA7Ij48bGkgY2xhc3M9ImJhaWR1LXdhcC1tb2RlIHBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJiYWlkdS13YXAtbW9kZSBwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iYXJpYSI+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJiYWlkdS13YXAtbW9kZSBwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0iYmFpZHUtd2FwLW1vZGUgcGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0iYmFpZHUtd2FwLW1vZGUgcGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9ImJjIj5CQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJiYWlkdS13YXAtbW9kZSBwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAgbGlzdGVuZXItb3Blbi13YXBzZXR0aW5nIiI+5Yqp5omL6K6+572uPC9saT4ke3VwZGF0ZV9iYWlkdVh9PC91bD48L3NwYW4+YCk7CgkJCQkkKCdoZWFkZXIgaDFbZGF0YS12LTU5Nzc5ZTM0XScpLmNzcyh7ImxlZnQiOiI3NSUifSkKCQkJCSR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCX0gZWxzZSB7CgkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJfQoJCQl0aGlzLnNldEJEVVNTKCk7CgkJCXRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQlpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJCWJhaWR1LmFkZEJ1dHRvbigpOwoJCQkJfQoJCQl9LDUwMDApCgkJfSwKCgkJYWRkSW5pdEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iZy1kcm9wZG93bi1idXR0b24gcG9pbnRlciBwbC1idXR0b24taW5pdCIgaWQ9InBsLWJ1dHRvbi1saW5rIiBzdHlsZT0ib3BhY2l0eTowLjUiPjxkaXYgc3R5bGU9ImNvbG9yOiNmZmY7IiBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCIgc3R5bGU9ImNvbG9yOiNmZmY7Ij48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDYwcHg7Ij7kuIvovb3liqnmiYs8L3NwYW4+PC9zcGFuPjwvZGl2PjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwoJCQl9CgkJCWlmIChwdCA9PT0gJ21haW4nKSB7CgkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4ubWFpbik7CgkJCQkkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0icGwtYnV0dG9uLWluaXQiIGlkPSJwbC1idXR0b24tbGluayIgc3R5bGU9Im9wYWNpdHk6LjU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OiA4cHg7Ij48YnV0dG9uIGNsYXNzPSJiYWlkdS1idXR0b24gdS1idXR0b24gdS1idXR0b24tLXByaW1hcnkgdS1idXR0b24tLXNtYWxsIGlzLXJvdW5kIGlzLWhhcy1pY29uIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyBwYWRkaW5nOiA4cHggMTZweDsgaGVpZ2h0OiAzMnB4OyBib3JkZXI6IG5vbmU7Ij48aSBjbGFzcz0idS1pY29uIHUtaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmApOwoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJaWYgKHB0ID09PSAnd2FwJykgewoJCQkJJHRvb2xXcmFwID0gJCgnLm1haW4tY29udGFpbmVyJyk7CgkJCQkkYnV0dG9uID0gJChgPHNwYW4gaWQ9InBsLWJ1dHRvbi1saW5rIiBjbGFzcz0id2FwZm9udCBub25lLXBvaW50ZXIgcGwtYnV0dG9uLWluaXQgYmFpZHUtd2FwLWJ1dHRvbiI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5gKTsKCQkJCSQoJ2hlYWRlciBoMVtkYXRhLXYtNTk3NzllMzRdJykuY3NzKHsibGVmdCI6Ijc1JSJ9KQoJCQkJJHRvb2xXcmFwLmFwcGVuZCgkYnV0dG9uKTsKCQkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nV2FwKCkpOwoJCQl9IGVsc2UgewoJCQkJJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQkJfQoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCQliYWlkdS5hZGRJbml0QnV0dG9uKCkKCQkJCX0KCQkJfSwxMDAwKQoJCX0sCgoJCWFzeW5jIGdldFRva2VuKCkgewoJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzNdKTsKCQkJLy8g5aaC5p6c6L+U5Zue57uT5p6c5Lit5rKh5pyJ5YyF5ZCrJ2FjY2Vzc190b2tlbiflrZfnrKbkuLIKCQkJaWYgKHJlcy5pbmRleE9mKCdhY2Nlc3NfdG9rZW4nKSA9PT0gLTEpIHsKCgkJCQkvLyDkvb/nlKhhd2FpdOWFs+mUruWtl+etieW+hWJhc2UuZ2V05Ye95pWw55qE6L+U5Zue57uT5p6c77yM6I635Y+W572R6aG15YaF5a65CgkJCQlsZXQgaHRtbCA9IGF3YWl0IGJhc2UuZ2V0KHBhbi5wY3NbM10sIHt9LCAndGV4dCcpOwoKCQkJCS8vIOS9v+eUqOato+WImeihqOi+vuW8j+WMuemFjWh0bWzkuK3nmoQnYmRzdG9rZW4n5ZKMJ2NsaWVudF9pZCcKCQkJCWxldCBiZHN0b2tlbiA9IGh0bWwubWF0Y2goL25hbWU9ImJkc3Rva2VuIlxzK3ZhbHVlPSIoW14iXSspIi8pPy5bMV07CgkJCQlsZXQgY2xpZW50X2lkID0gaHRtbC5tYXRjaCgvbmFtZT0iY2xpZW50X2lkIlxzK3ZhbHVlPSIoW14iXSspIi8pPy5bMV07CgoJCQkJLy8g5p6E5bu65LiA5Liq5YyF5ZCr5omA6ZyA5Y+C5pWw55qE5pWw5o2u5a+56LGh77yM5YyF5ZCr55m+5bqm5o6I5p2D5omA6ZyA5Y+C5pWwCgkJCQlsZXQgZGF0YSA9IHsKCQkJCQlncmFudF9wZXJtaXNzaW9uc19hcnI6ICduZXRkaXNrJywKCQkJCQliZHN0b2tlbjogYmRzdG9rZW4sCgkJCQkJY2xpZW50X2lkOiBjbGllbnRfaWQsCgkJCQkJcmVzcG9uc2VfdHlwZTogInRva2VuIiwKCQkJCQlkaXNwbGF5OiAicGFnZSIsCgkJCQkJZ3JhbnRfcGVybWlzc2lvbnM6ICJiYXNpYyxuZXRkaXNrIgoJCQkJfQoKCQkJCS8vIOWQkeacjeWKoeWZqOWPkemAgVBPU1Tor7fmsYLvvIzlrp7njrDoh6rliqjmjojmnYMKCQkJCWF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzNdLCBiYXNlLnN0cmluZ2lmeShkYXRhKSwgewoJCQkJCSdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKCQkJCX0pCgoJCQkJLy8g5o6I5p2D5a6M5ZCO5YaN5qyh6I635Y+WJ2FjY2Vzc190b2tlbicKCQkJCWxldCByZXMyID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzNdKTsKCQkJCWxldCBhY2Nlc3NUb2tlbiA9IHJlczIubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXSspLyk/LlsxXTsKCQkJCWFjY2Vzc1Rva2VuICYmIGJhc2Uuc2V0U3RvcmFnZSgnYWNjZXNzVG9rZW4nLCBhY2Nlc3NUb2tlbik7CgkJCQlyZXR1cm4gYWNjZXNzVG9rZW47CgkJCX0KCQkJLy8g5aaC5p6c5bey5pyJJ2FjY2Vzc190b2tlbifvvIzliJnojrflj5bmlrDnmoQnYWNjZXNzX3Rva2VuJwoJCQlsZXQgYWNjZXNzVG9rZW4gPSByZXMubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXSspLyk/LlsxXTsKCQkJYWNjZXNzVG9rZW4gJiYgYmFzZS5zZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTsKCQkJcmV0dXJuIGFjY2Vzc1Rva2VuOwoJCX0sCgoJCWFzeW5jIGdldFBDU0xpbmsobWF4UmVxdWVzdFRpbWUgPSAyKSB7CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlsZXQgZmlkTGlzdCA9IHRoaXMuX2dldEZpZExpc3QoKSwgdXJsLCByZXM7CgoJCQlpZiAocHQgPT09ICdob21lJyB8fCBwdCA9PT0gJ21haW4nIHx8IHB0ID09PSAnd2FwJykgewoJCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7lhYjli77pgInopoHkuIvovb3nmoTmlofku7bmjY9+Jyk7CgkJCQl9CgkJCQlpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJCX0KCQkJCWZpZExpc3QgPSBlbmNvZGVVUklDb21wb25lbnQoZmlkTGlzdCk7CgkJCQlsZXQgYWNjZXNzVG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJykgfHwgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwoJCQkJdXJsID0gYCR7cGFuLnBjc1swXX0mZnNpZHM9JHtmaWRMaXN0fSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gOwoJCQkJcmVzID0gYXdhaXQgYmFzZS5nZXQodXJsLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9KTsKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCXRoaXMuZ2V0U2hhcmVEYXRhKCk7CgkJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJCX0KCQkJCWlmIChmaWRMaXN0Lmxlbmd0aCA9PT0gMikgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35omT5byA5paH5Lu25aS55ZCO5YaN5Yu+6YCJ5paH5Lu2ficpOwoJCQkJfQoJCQkJaWYgKCFwYXJhbXMuc2lnbikgewoJCQkJCWxldCB1cmwgPSBgJHtwYW4ucGNzWzJdfSZzdXJsPSR7cGFyYW1zLnN1cmx9JmxvZ2lkPSR7cGFyYW1zLmxvZ2lkfWA7CgkJCQkJbGV0IHIgPSBhd2FpdCBiYXNlLmdldCh1cmwpOwoJCQkJCWlmIChyLmVycm5vID09PSAwKSB7CgkJCQkJCXBhcmFtcy5zaWduID0gci5kYXRhLnNpZ247CgkJCQkJCXBhcmFtcy50aW1lc3RhbXAgPSByLmRhdGEudGltZXN0YW1wOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWxldCBkaWFsb2cgPSBhd2FpdCBTd2FsLmZpcmUoewoJCQkJCQkJdG9hc3Q6IHRydWUsCgkJCQkJCQlpY29uOiAnaW5mbycsCgkJCQkJCQl0aXRsZTogYOaPkOekuu+8mjxicj7or7flsIbmlofku7Y8c3BhbiBjbGFzcz0idGFnLWRhbmdlciI+W+S/neWtmOWIsOe9keebmF08L3NwYW4+5ZCO5YaN8J+RieWJjeW+gDxzcGFuIGNsYXNzPSJ0YWctZGFuZ2VyIj5b5oiR55qE572R55uYXTwvc3Bhbj7kuK3kuIvovb3lk6YhYCwKCQkJCQkJCXNob3dDb25maXJtQnV0dG9uOiB0cnVlLAoJCQkJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfngrnlh7vkv53lrZgnLAoJCQkJCQkJcG9zaXRpb246ICd0b3AnLAoJCQkJCQl9KTsKCQkJCQkJaWYgKGRpYWxvZy5pc0NvbmZpcm1lZCkgewoJCQkJCQkJJCgnLnRvb2xzLXNoYXJlLXNhdmUtaGInKVswXS5jbGljaygpOwoJCQkJCQl9CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoIXBhcmFtcy5iZHN0b2tlbikgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI55m75b2V572R55uYficpOwoJCQkJfQoJCQkJbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ2VuY3J5cHQnLCBwYXJhbXMuZW5jcnlwdCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3Byb2R1Y3QnLCBwYXJhbXMucHJvZHVjdCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3VrJywgcGFyYW1zLnVrKTsKCQkJCWZvcm1EYXRhLmFwcGVuZCgncHJpbWFyeWlkJywgcGFyYW1zLnByaW1hcnlpZCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ2ZpZF9saXN0JywgZmlkTGlzdCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ2xvZ2lkJywgcGFyYW1zLmxvZ2lkKTsKCQkJCXBhcmFtcy5zaGFyZVR5cGUgPT09ICdzZWNyZXQnID8gZm9ybURhdGEuYXBwZW5kKCdleHRyYScsIHBhcmFtcy5leHRyYSkgOiAnJzsKCQkJCXVybCA9IGAke3Bhbi5wY3NbMV19JnNpZ249JHtwYXJhbXMuc2lnbn0mdGltZXN0YW1wPSR7cGFyYW1zLnRpbWVzdGFtcH1gOwoJCQkJcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgZm9ybURhdGEsIHsiVXNlci1BZ2VudCI6IHBhbi51YX0pOwoJCQl9CgkJCWlmIChyZXMuZXJybm8gPT09IDApIHsKCQkJCWxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShyZXMubGlzdCk7CgkJCQl0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKCQkJfSBlbHNlIGlmIChyZXMuZXJybm8gPT09IDExMikgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7pobXpnaLov4fmnJ/kuobvvIzliLfmlrDph43or5XkuIvlkKd+Jyk7CgkJCX0gZWxzZSBpZiAocmVzLmVycm5vID09PSA5MDE5KSB7CgkJCQltYXhSZXF1ZXN0VGltZS0tOwoJCQkJYXdhaXQgdGhpcy5nZXRUb2tlbigpOwoJCQkJaWYgKG1heFJlcXVlc3RUaW1lID4gMCkgewoJCQkJCWF3YWl0IHRoaXMuZ2V0UENTTGluayhtYXhSZXF1ZXN0VGltZSk7CgkJCQl9IGVsc2UgewoJCQkJCW1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7ojrflj5bkuIvovb3pk77mjqXlpLHotKXvvIzliLfmlrDnvZHpobXlkI7lho3or5Xor5XlkKd+Jyk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQltZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yM5Yi35paw572R6aG15ZCO5LiN6KGM55qE6K+d5YaN6K+V6K+V6YeN5paw55m75b2V572R55uY5ZCnficpOwoJCQl9CgkJfSwKCgkJZ2VuZXJhdGVEb20obGlzdCkgewoJCQlsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwoJCQlsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CgkJCWJhc2Uuc29ydEJ5TmFtZShsaXN0KTsKCQkJbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlpZiAodi5pc2RpciA9PT0gMSkgcmV0dXJuOwoJCQkJbGV0IGZpbGVuYW1lID0gdi5zZXJ2ZXJfZmlsZW5hbWUgfHwgdi5maWxlbmFtZTsKCQkJCWxldCBleHQgPSBiYXNlLmdldEV4dGVuc2lvbihmaWxlbmFtZSk7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kbGluazsKCQkJCWlmIChwdCA9PT0gJ3dhcCcpIHsKCQkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGRsaW5rICsgJ1xyXG4nOwoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXBpIiBocmVmPSIke2RsaW5rfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtc2l6ZT0iJHt2LnNpemV9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTxicj7kuIvovb0gICR7ZmlsZW5hbWV9PC9hPgoJCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWNvcHkgcGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi26ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5aSN5Yi26ZO+5o6lPC9idXR0b24+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tdGlwIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+PHNwYW4+6Iul5rKh5pyJ5by55Ye6SURN5LiL6L295qGG77yM5om+5YiwSURNIDxiPumAiemhuTwvYj4gLT4gPGI+5paH5Lu257G75Z6LPC9iPiAtPiA8Yj7nrKzkuIDkuKrmoYY8L2I+IOS4rea3u+WKoOWQjue8gCA8c3BhbiBjbGFzcz0icGwtZXh0Ij4ke2V4dH08L3NwYW4+77yMPGEgaHJlZj0iJHtwYW4uaWRtfSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7or6bop4HmraTlpIQ8L2E+PC9zcGFuPiA8c3BhbiBjbGFzcz0icGwtYmFjayBsaXN0ZW5lci1iYWNrIj7ov5Tlm548L3NwYW4+PC9kaXY+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tcHJvZ3Jlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4KCQkJCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1vdXRlciI+PC9kaXY+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXIiIHN0eWxlPSJ3aWR0aDo1JSI+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+5q2j5Zyo5Yqg6L296L+b5bqmLi4uMCU8L2Rpdj4KCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgoJCQkJCQkJCQlgOwoJCQkJCQljb250ZW50ICs9IGA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtdGlwIiBzdHlsZT0iZGlzcGxheTogbm9uZSIgPuacquWPkeeOsElETe+8jOS9v+eUqOiHquW4pua1j+iniOWZqOS4i+i9vTwvc3Bhbj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLWJhY2sgcGwtYmFjayBsaXN0ZW5lci1iYWNrIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+6L+U5ZuePC9zcGFuPgoJCQkJCQkJCQk8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPuWmguS9leWUpOi1t0lETe+8nzwvc3Bhbj4KCQkJCQkJCQkJYAoJCQkJCQljb250ZW50ICs9YDwvZGl2PjwvZGl2PmAKCQkJCQl9CgkJCQkJaWYgKG1vZGUgPT09ICdhcmlhJykgewoJCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKCQkJCQkJaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5bCGICR7ZmlsZW5hbWV9IOaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQkJfQoJCQkJCWlmIChtb2RlID09PSAnY3VybCcpIHsKCQkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGluay5saW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuWkjeWItiAke2ZpbGVuYW1lfSDkuIvovb3lkb3ku6TooYw8L2E+IDwvZGl2PmA7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmIChtb2RlID09PSAnYmMnKSB7CgkJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKCQkJCQkJaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsubGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuS4i+i9vSAke2ZpbGVuYW1lfTwvYT4gPC9kaXY+YDsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PGJyPuS4i+i9vSAke2ZpbGVuYW1lfTwvYT4gPC9kaXY+YDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQlhbGlua0FsbFRleHQgKz0gZGxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFwaSIgaHJlZj0iJHtkbGlua30iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLXNpemU9IiR7di5zaXplfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308YnI+5LiL6L29ICAke2ZpbGVuYW1lfTwvYT4KCQkJCQkJCQk8IS0tPGEgY2xhc3M9InBsLWl0ZW0tY29weSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75L2/55So5rWP6KeI5Zmo5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5Lyg57uf5LiL6L29PC9hPi0tPgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tY29weSBwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgaHJlZj0iJHtkbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLbpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij7lpI3liLbpk77mjqU8L2J1dHRvbj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPjxzcGFuPuiLpeayoeacieW8ueWHuklETeS4i+i9veahhu+8jOaJvuWIsElETSA8Yj7pgInpobk8L2I+IC0+IDxiPuaWh+S7tuexu+WeizwvYj4gLT4gPGI+56ys5LiA5Liq5qGGPC9iPiDkuK3mt7vliqDlkI7nvIAgPHNwYW4gY2xhc3M9InBsLWV4dCI+JHtleHR9PC9zcGFuPu+8jDxhIGhyZWY9IiR7cGFuLmlkbX0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+6K+m6KeB5q2k5aSEPC9hPjwvc3Bhbj4gPHNwYW4gY2xhc3M9InBsLWJhY2sgbGlzdGVuZXItYmFjayI+6L+U5ZuePC9zcGFuPjwvZGl2PgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tcHJvZ3Jlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MiPgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3Mtb3V0ZXIiPjwvZGl2PgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXIiIHN0eWxlPSJ3aWR0aDo1JSI+CgkJCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1pbm5lci10ZXh0Ij7mraPlnKjliqDovb3ov5vluqYuLi4wJTwvZGl2PgoJCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQk8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3Mtc3RvcCBsaXN0ZW5lci1zdG9wIj7lj5bmtojkuIvovb08L3NwYW4+CgkJCQkJCQkJYDsKCQkJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19oaWRlX2lkbScpID09PSAnbm8nKSB7CgkJCQkJCWNvbnRlbnQrPWA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtdGlwIiA+5pyq5Y+R546wSURN77yM5L2/55So6Ieq5bim5rWP6KeI5Zmo5LiL6L29PC9zcGFuPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1iYWNrIHBsLWJhY2sgbGlzdGVuZXItYmFjayIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPui/lOWbnjwvc3Bhbj4KCQkJCQkJCQk8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyI+5aaC5L2V5ZSk6LW3SURN77yfPC9zcGFuPgoJCQkJCQkJCWAKCQkJCQl9IGVsc2UgewoJCQkJCQljb250ZW50Kz1gPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiID7mnKrlj5HnjrBJRE3vvIzkvb/nlKjoh6rluKbmtY/op4jlmajkuIvovb08L3NwYW4+CgkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLWJhY2sgcGwtYmFjayBsaXN0ZW5lci1iYWNrIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+6L+U5ZuePC9zcGFuPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1ob3cgbGlzdGVuZXItaG93IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+5aaC5L2V5ZSk6LW3SURN77yfPC9zcGFuPgoJCQkJCQkJCWAKCQkJCQl9OwoJCQkJCWNvbnRlbnQgKz1gPC9kaXY+PC9kaXY+YAoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdhcmlhJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0FyaWEoZGxpbmssIGZpbGVuYW1lLCBwYW4udWEpOwoJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7lsIYgJHtmaWxlbmFtZX0g5o6o6YCB5YiwIFJQQyDkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnY3VybCcpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKCQkJCQlpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CgkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGluay5saW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuWkjeWItiAke2ZpbGVuYW1lfSDkuIvovb3lkb3ku6TooYw8L2E+IDwvZGl2PmA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYmMnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQkMoZGxpbmssIGZpbGVuYW1lLCBwYW4udWEpOwoJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsubGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuS4i+i9vSAke2ZpbGVuYW1lfTwvYT4gPC9kaXY+YDsKCQkJCQl9IGVsc2UgewoJCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PGJyPuS4i+i9vSAke2ZpbGVuYW1lfTwvYT4gPC9kaXY+YDsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJfSk7CgoJCQljb250ZW50ICs9ICc8L2Rpdj4nOwoKCQkJaWYgKG1vZGUgPT09ICdhcGknKXsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbC1hcGkiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gO30KCQkJaWYgKG1vZGUgPT09ICdhcmlhJyl7CgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gO30KCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQlsZXQgcnBjID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJykgKyAnOicgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JykgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyk7CgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItc2VuZC1ycGMiPuWPkemAgeWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gdGl0bGU9IiR7cnBjfSIgY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4Ij7orr7nva4gUlBDIOWPguaVsO+8iOW9k+WJjeS4uu+8miR7cnBjfe+8iTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1zdWNjZXNzIGxpc3RlbmVyLXJwYy10YXNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7ZGlzcGxheTogbm9uZSI+5p+l55yL5LiL6L295Lu75YqhPC9idXR0b24+PC9kaXY+YDsKCQkJfQoJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKXsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7fQoJCQlyZXR1cm4gY29udGVudDsKCQl9LAoKCQlhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CgkJCWxldCBycGMgPSB7CgkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAoJCQkJdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCgkJCQlkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAoJCQl9OwoJCQlsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CgkJCWlmICghQkRVU1MpIHJldHVybiAnYXNzaXN0YW50JzsKCgkJCWxldCB1cmwgPSBgJHtycGMuZG9tYWlufToke3JwYy5wb3J0fSR7cnBjLnBhdGh9YDsKCQkJbGV0IHJwY0RhdGEgPSB7CgkJCQlpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCgkJCQlqc29ucnBjOiAnMi4wJywKCQkJCW1ldGhvZDogJ2FyaWEyLmFkZFVyaScsCgkJCQlwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YCwgW2xpbmtdLCB7CgkJCQkJZGlyOiBycGMuZGlyLAoJCQkJCW91dDogZmlsZW5hbWUsCgkJCQkJaGVhZGVyOiBbYFVzZXItQWdlbnQ6ICR7cGFuLnVhfWAsIGBDb29raWU6IEJEVVNTPSR7QkRVU1N9YF0KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSwgJycpOwoJCQkJaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9CgkJfSwKCgkJZ2V0U2VsZWN0ZWRMaXN0KCkgewoJCQl0cnkgewoJCQkJdmFyIExpc3QgPSByZXF1aXJlKCJzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMiKS5pbnN0YW5jZUZvclN5c3RlbS5saXN0OwoJCQkJdmFyIHNlbGVjdExpc3QgPSBMaXN0LmdldFNlbGVjdGVkKCk7CgkJCQlpZiAoIXNlbGVjdExpc3QubGVuZ3RoKSB7CgkJCQkJc2VsZWN0TGlzdCA9IExpc3QuZ2V0Q3VycmVudExpc3QoKTsKCQkJCX0KCQkJCXJldHVybiBzZWxlY3RMaXN0OwoJCQl9IGNhdGNoIChlKSB7CgkJCQl2YXIgbGlzdDEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud3Atcy1jb3JlLXBhbicpOwoJCQkJaWYgKGxpc3QxICYmIGxpc3QxLl9fdnVlX18pIHsKCQkJCQlyZXR1cm4gbGlzdDEuX192dWVfXy5zZWxlY3RlZExpc3Q7CgkJCQl9IGVsc2UgewoJCQkJCXZhciBsaXN0MiA9ICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJmaWxlLWxpc3QiKVswXTsKCQkJCQlyZXR1cm4gbGlzdDIuX192dWVfXy5hbGxGaWxlTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuICEhaXRlbS5zZWxlY3RlZDsgfSk7CgkJCQl9CgkJCX0KCQl9LAoKCQlnZXRMb2dpZCgpIHsKCQkJbGV0IHV0ID0gcmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikuaW5zdGFuY2VGb3JTeXN0ZW0udG9vbHMuYmFzZVNlcnZpY2U7CgkJCXJldHVybiB1dC5iYXNlNjRFbmNvZGUoYmFzZS5nZXRDb29raWUoIkJBSURVSUQiKSk7CgkJfSwKCgkJZ2V0U2hhcmVEYXRhKCkgewoJCQlsZXQgcmVzID0gbG9jYWxzLmR1bXAoKTsKCQkJcGFyYW1zLnNoYXJlVHlwZSA9ICdzZWNyZXQnOwoJCQlwYXJhbXMuc2lnbiA9ICcnOwoJCQlwYXJhbXMudGltZXN0YW1wID0gJyc7CgkJCXBhcmFtcy5iZHN0b2tlbiA9IHJlcy5iZHN0b2tlbi52YWx1ZTsKCQkJcGFyYW1zLmNoYW5uZWwgPSAnY2h1bmxlaSc7CgkJCXBhcmFtcy5jbGllbnR0eXBlID0gMDsKCQkJcGFyYW1zLndlYiA9IDE7CgkJCXBhcmFtcy5hcHBfaWQgPSAyNTA1Mjg7CgkJCXBhcmFtcy5lbmNyeXB0ID0gMDsKCQkJcGFyYW1zLnByb2R1Y3QgPSAnc2hhcmUnOwoJCQlwYXJhbXMubG9naWQgPSB0aGlzLmdldExvZ2lkKCk7CgkJCXBhcmFtcy5wcmltYXJ5aWQgPSByZXMuc2hhcmVpZC52YWx1ZTsKCQkJcGFyYW1zLnVrID0gcmVzLnNoYXJlX3VrLnZhbHVlOwoJCQlwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyAmJiAocGFyYW1zLmV4dHJhID0gdGhpcy5fZ2V0RXh0cmEoKSk7CgkJCXBhcmFtcy5zdXJsID0gdGhpcy5fZ2V0U3VybCgpOwoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvZGlza1wvaG9tZS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eXC9kaXNrXC9tYWluLy50ZXN0KHBhdGgpKSByZXR1cm4gJ21haW4nOwoJCQlpZiAoL15cL3dhcFwvaG9tZS8udGVzdChwYXRoKSkgcmV0dXJuICd3YXAnOwoJCQlpZiAoL15cLyhzfHNoYXJlKVwvLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKCQkJcmV0dXJuICcnOwoJCQlyZXR1cm4gJyc7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkgCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQlwb3NpdGlvbjogJ2NlbnRlcicsLy90b3AKCQkJCXdpZHRoLAoJCQkJcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAoJCQkJY3VzdG9tQ2xhc3MsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScsCgkJCX0pLnRoZW4oKCkgPT4gewoJCQkJdGhpcy5fcmVzZXREYXRhKCk7CgkJCX0pOwoJCX0sCgoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCXB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2docHJveHkuY29tL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC9tYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9naHByb3h5LmNvbS9odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v6Zi/6YeM5LqR55uYCglsZXQgYWxpID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJSZWZlcmVyOiBodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vImApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mcmVmZXI9JHtlbmNvZGVVUklDb21wb25lbnQoJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nKX1aWmA7CgkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGJjOi8vaHR0cC8ke2Jhc2UuZW5jb2RlKGJjKX1gKTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CgkJCWZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CgkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1lICJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJZnVuY3Rpb24gX2ZhY3RvcnkoZSkgewoJCQkJbGV0IHRhcmdldCA9ICQoZS50YXJnZXQpOwoJCQkJbGV0IGl0ZW0gPSB0YXJnZXQucGFyZW50cygnLnBsLWl0ZW0nKTsKCQkJCWxldCBsaW5rID0gaXRlbS5maW5kKCcucGwtaXRlbS1saW5rJyk7CgkJCQlsZXQgcHJvZ3Jlc3MgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXByb2dyZXNzJyk7CgkJCQlsZXQgdGlwID0gaXRlbS5maW5kKCcucGwtaXRlbS10aXAnKTsKCQkJCWxldCBjb3B5ID0gaXRlbS5maW5kKCcucGwtaXRlbS1jb3B5Jyk7CgkJCQlsZXQgaG93aWRtID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaG93Jyk7CgkJCQlsZXQgYmFjayA9IGl0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWJhY2snKTsKCQkJCWxldCBzdG9wID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3Mtc3RvcCcpOwoJCQkJcmV0dXJuIHsKCQkJCQlpdGVtLCBsaW5rLCBwcm9ncmVzcywgdGlwLCBjb3B5LCBob3dpZG0sIGJhY2ssIHN0b3AsIHRhcmdldCwKCQkJCX07CgkJCX0KCgkJCWZ1bmN0aW9uIF9yZXNldChpKSB7CgkJCQlpbnNbaV0gJiYgY2xlYXJJbnRlcnZhbChpbnNbaV0pOwoJCQkJcmVxdWVzdFtpXSAmJiByZXF1ZXN0W2ldLmFib3J0KCk7CgkJCQlwcm9ncmVzc1tpXSA9IDA7CgkJCQlpZG1baV0gPSBmYWxzZTsKCQkJfQoJCQlkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CgkJCQltb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwoJCQkJU3dhbC5maXJlKHsKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJaHRtbDogYOmTvuaOpeiOt+WPluS4rWAsCgkJCQkJd2lsbE9wZW46IGZ1bmN0aW9uKCkgewoJCQkJCQlTd2FsLnNob3dMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSk7CgkJCQl0aGlzLmdldFBDU0xpbmsoKTsKCQkJfSk7CgkJCWRvYy5vZmYoJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScpLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCAkd2lkdGggPSBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyJyk7CgkJCQlsZXQgJHRleHQgPSBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyLXRleHQnKTsKCQkJCWxldCBmaWxlbmFtZSA9IG8ubGlua1swXS5kYXRhc2V0LmZpbGVuYW1lOwoJCQkJbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CgkJCQlfcmVzZXQoaW5kZXgpOwoJCQkJbGV0IGhyZWYgPSBvLmxpbmtbMF0uZGF0YXNldC5saW5rOwoJCQkJbGV0IHVybCA9IGF3YWl0IHRoaXMuZ2V0UmVhbExpbmsoby5saW5rWzBdLmRhdGFzZXQuZGlkLCBvLmxpbmtbMF0uZGF0YXNldC5maWQpOwoJCQkJaWYgKHVybCkgaHJlZiA9IHVybDsKCQkJCWJhc2UuZ2V0KGhyZWYsIHsiVXNlci1BZ2VudCI6IHBhbi51YSwgIlJlZmVyZXIiOiAiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLyJ9LCAnYmxvYicsIHtmaWxlbmFtZSwgaW5kZXh9KTsKCQkJCWxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpOyAvLyDorrDlvZXkuIvovb3lvIDlp4vml7bpl7QKCQkJCWxldCBwcmV2TG9hZGVkID0gMDsgLy8g5LiK5LiA5qyh55qE5bey5LiL6L295pWw5o2u6YePCgkJCQlsZXQgcHJldlRpbWUgPSBzdGFydFRpbWU7IC8vIOS4iuS4gOasoeeahOaXtumXtAoJCQkJbGV0IHNpemUgPSBOdW1iZXIoby5saW5rWzBdLmRhdGFzZXQuc2l6ZSk7CgkJCQlpbnNbaW5kZXhdID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJCWxldCBwcm9nID0gK3Byb2dyZXNzW2luZGV4XSB8fCAwOwoJCQkJCS8vIOWkhOeQhuaZrumAmuS4i+i9veeahOaDheWGtS4uLgoJCQkJCWxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7CgkJCQkJbGV0IGVsYXBzZWRUaW1lID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWU7CgkJCQkJbGV0IHRvdGFsUHJvZ3Jlc3MgPSBwcm9nIC8gMTAwOwoJCQkJCWxldCB0b3RhbEVsYXBzZWRTZWNvbmRzID0gZWxhcHNlZFRpbWUgLyAxMDAwOwoJCQkJCWxldCBlc3RpbWF0ZWRUb3RhbFRpbWVTZWNvbmRzID0gdG90YWxFbGFwc2VkU2Vjb25kcyAvIHRvdGFsUHJvZ3Jlc3M7CgkJCQkJbGV0IHJlbWFpbmluZ1RpbWVTZWNvbmRzID0gZXN0aW1hdGVkVG90YWxUaW1lU2Vjb25kcyAtIHRvdGFsRWxhcHNlZFNlY29uZHM7CgoJCQkJCS8vIOWwhuWJqeS9meaXtumXtOi9rOaNouS4uuWkqeOAgeaXtuOAgeWIhuOAgeenkgoJCQkJCWxldCByZW1haW5pbmdEYXlzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvICg2MCAqIDYwICogMjQpKTsKCQkJCQlyZW1haW5pbmdUaW1lU2Vjb25kcyAlPSAoNjAgKiA2MCAqIDI0KTsKCgkJCQkJbGV0IHJlbWFpbmluZ0hvdXJzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvICg2MCAqIDYwKSk7CgkJCQkJcmVtYWluaW5nVGltZVNlY29uZHMgJT0gKDYwICogNjApOwoKCQkJCQlsZXQgcmVtYWluaW5nTWludXRlcyA9IE1hdGguZmxvb3IocmVtYWluaW5nVGltZVNlY29uZHMgLyA2MCk7CgkJCQkJbGV0IHJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzICUgNjApOwoKCQkJCQkvLyDorqHnrpfkuIvovb3pgJ/luqYKCQkJCQlsZXQgbG9hZGVkID0gcHJvZyAqIHNpemUgLyAxMDA7IC8vIOW3suS4i+i9veaVsOaNrumHjwoJCQkJCWxldCBjdXJyZW50VGltZURpZmYgPSBjdXJyZW50VGltZSAtIHByZXZUaW1lOyAvLyDlvZPliY3ml7bpl7TkuI7kuIrkuIDmrKHml7bpl7TnmoTlt67lgLwKCQkJCQlsZXQgbG9hZGVkRGlmZiA9IGxvYWRlZCAtIHByZXZMb2FkZWQ7IC8vIOW9k+WJjeW3suS4i+i9veaVsOaNrumHj+S4juS4iuS4gOasoeeahOW3ruWAvAoJCQkJCWxldCBkb3dubG9hZFNwZWVkID0gKGN1cnJlbnRUaW1lRGlmZiAhPT0gMCkgPyBsb2FkZWREaWZmIC8gKGN1cnJlbnRUaW1lRGlmZiAvIDEwMDApIDogMDsgLy8g5LiL6L296YCf5bqm77yI5Y2V5L2N77ya5a2X6IqCL+enku+8iQoKCQkJCQkvLyDmm7TmlrDkuIrkuIDmrKHnmoTmlbDmja4KCQkJCQlwcmV2TG9hZGVkID0gbG9hZGVkOwoJCQkJCXByZXZUaW1lID0gY3VycmVudFRpbWU7CgoJCQkJCS8vIOabtOaUueeVjOmdogoJCQkJCW8ubGluay5oaWRlKCk7CgkJCQkJby50aXAuaGlkZSgpOwoJCQkJCW8uc3RvcC5zaG93KCk7CgkJCQkJby5jb3B5LmhpZGUoKTsKCQkJCQlvLnByb2dyZXNzLnNob3coKTsKCgkJCQkJLy8g5pu05paw6L+b5bqm5p2hCgkJCQkJJHdpZHRoLmNzcygnd2lkdGgnLCBwcm9nICsgJyUnKTsKCgkJCQkJLy8g5pu05paw6L+b5bqm5p2h5paH5pysCgkJCQkJbGV0IHRpbWVUZXh0ID0gJyc7CgkJCQkJaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdEYXlzKSAmJiByZW1haW5pbmdEYXlzID4gMCkgewoJCQkJCQl0aW1lVGV4dCA9IHJlbWFpbmluZ0RheXMgKyAn5aSpICcgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ0hvdXJzKSArICfml7Y6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nTWludXRlcykgKyAn5YiGOicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ1NlY29uZHMpICsgJ+enkic7CgkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nSG91cnMpICYmIHJlbWFpbmluZ0hvdXJzID4gMCkgewoJCQkJCQl0aW1lVGV4dCA9IGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nSG91cnMpICsgJ+aXtjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdNaW51dGVzKSAmJiByZW1haW5pbmdNaW51dGVzID4gMCkgewoJCQkJCQl0aW1lVGV4dCA9IGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nTWludXRlcykgKyAn5YiGOicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ1NlY29uZHMpICsgJ+enkic7CgkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nU2Vjb25kcykgJiYgcmVtYWluaW5nU2Vjb25kcyA+IDApIHsKCQkJCQkJdGltZVRleHQgPSByZW1haW5pbmdTZWNvbmRzICsgJ+enkic7CgkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nU2Vjb25kcykgJiYgcmVtYWluaW5nU2Vjb25kcyA9PT0gMCkgewoJCQkJCQl0aW1lVGV4dCA9ICfljbPlsIblrozmiJAnOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRpbWVUZXh0ID0gJ+iuoeeul+S4rS4uLic7CgkJCQkJfQoKCQkJCQlsZXQgc3BlZWRUZXh0ID0nJzsKCQkJCQlzcGVlZFRleHQgPSBiYXNlLnNpemVGb3JtYXQoZG93bmxvYWRTcGVlZCkKCgkJCQkJJHRleHQudGV4dChwcm9nICsgJyUgfCDliankvZnml7bpl7TvvJonICsgdGltZVRleHQgKyAnIHwg6YCf5bqm77yaJyArIHNwZWVkVGV4dCArICcv56eSJyk7CgoJCQkJCWlmIChwcm9nID09PSAxMDApIHsKCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKXsKCQkJCQkJCWNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CgkJCQkJCQlwcm9ncmVzc1tpbmRleF0gPSAwOwoJCQkJCQkJby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1zdG9wJykuaGlkZSgpOwoJCQkJCQkJby5ob3dpZG0uaGlkZSgpOwoJCQkJCQkJJHRleHQudGV4dCgn5LiL6L295a6M5oiQ5LqGIea1j+iniOWZqOS4i+i9veahhuW6lOivpeW8ueWHuuadpeS6huWTpn4nKTsKCQkJCQkJCW8uYmFjay5zaG93KCkKCQkJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCl7CgkJCQkJCQkJby5saW5rLnRleHQoJ+mHjeaWsOS4i+i9vScpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJCQl9LDMwMDApCgkJCQkJCX0sMzAwMCkKCQkJCQl9CgkJCQl9LCA1MDApOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcmV0cnknLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCW8udGlwLmhpZGUoKTsKCQkJCW8ubGluay5zaG93KCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ob3cnLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJaWYgKHJlcXVlc3RbaW5kZXhdKSB7CgkJCQkJcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJCW8udGlwLnNob3coKTsKCQkJCX0KCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zdG9wJywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsKCQkJCWlmIChyZXF1ZXN0W2luZGV4XSkgewoJCQkJCXJlcXVlc3RbaW5kZXhdLmFib3J0KCk7CgkJCQkJY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyLXRleHQnKS50ZXh0KCfmraPlnKjlj5bmtoguLi4nKTsKCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyJykuY3NzKCd3aWR0aCcsIDEwMCArICclJyk7CgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCQlvLnRpcC5oaWRlKCk7CgkJCQkJCW8uYmFjay5oaWRlKCk7CgkJCQkJCW8ubGluay5zaG93KDApOwoJCQkJCQlvLmNvcHkuc2hvdygpOwoJCQkJCQlvLnByb2dyZXNzLmhpZGUoKTsKCQkJCQkJby5zdG9wLmhpZGUoKTsKCQkJCQl9LDEwNTApCgkJCQl9CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1iYWNrJywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlvLnByb2dyZXNzLmhpZGUoKTsKCQkJCW8udGlwLmhpZGUoKTsKCQkJCW8ubGluay5zaG93KCk7CgkJCQlvLmNvcHkuc2hvdygpOwoJCQkJby5zdG9wLmhpZGUoKTsKCQkJCW8uYmFjay5oaWRlKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaS1idG4nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRDbGlwYm9hcmQoZS50YXJnZXQuZGF0YXNldC5maWxlbmFtZSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJc2V0VGltZW91dCgKCQkJCQlmdW5jdGlvbiAoKXsKCQkJCQkJJChlLnRhcmdldCkudGV4dCgn6YeN5paw5aSN5Yi2JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQl9LDIwMDAKCQkJCSkKCQkJfSk7CgkJCWRvYy5vZmYoJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycpLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9mZignY2xpY2snLCAnLmxpc3RlbmVyLWRvd25sb2FkLWFsbCcpLm9uKCdjbGljaycsICcubGlzdGVuZXItZG93bmxvYWQtYWxsJywgKGUpID0+IHsKCQkJCSQoJy5wbC1pdGVtLWxpbmsnKS5jbGljaygpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5LiL6L295byA5aeL77yM5LiL6L296L+b5bqm6KeB5LiK5pa55oyJ6ZKu5ZOmficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+S4i+i9veWFqOmDqOmTvuaOpScpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CgkJCQlsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewoJCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lbmNvZGUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CgkJCQlHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CgkJCX0pOwoJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlKSA9PiB7CgkJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3BsLWEnKSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQl9CgkJCX0sIHRydWUpOwoJCX0sCgoJCWFzeW5jIGdldFJlYWxMaW5rKGQsIGYpIHsKCQkJbGV0IGF1dGhvcml6YXRpb24gPSBgJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykudG9rZW5fdHlwZX0gJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykuYWNjZXNzX3Rva2VufWA7CgkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1sxXSwgewoJCQkJZHJpdmVfaWQ6IGQsCgkJCQlmaWxlX2lkOiBmCgkJCX0sIHsKCQkJCWF1dGhvcml6YXRpb24sCgkJCQkiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsCgkJCX0pOwoJCQlpZiAocmVzLnVybCkgewoJCQkJcmV0dXJuIHJlcy51cmw7CgkJCX0KCQkJcmV0dXJuICcnOwoJCX0sCgoJCWFkZEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5zaGFyZS1saXN0LWJhbm5lci0tMUU4SnIiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdGlwMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInNoYXJlLWxpc3QtYmFubmVyLS0xRThKciIpWzBdOwoJCQkJdGlwMS5zdHlsZS56SW5kZXggPSAwOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi50by1hcHAtLURybFFRIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHRpcDIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ0by1hcHAtLURybFFRIilbMF07CgkJCQl0aXAyLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5idG4tbW9iaWxlLXNhdmUtLTJuWGRmIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHRpcDMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbW9iaWxlLXNhdmUtLTJuWGRmIilbMF07CgkJCQl0aXAzLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5jb250YWluZXItLWNvT2lTIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDEgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJjb250YWluZXItLWNvT2lTIilbMF07CgkJCQl2aXAxLnJlbW92ZSgpOwoJCQl9KSx0cnVlOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5TcGxhc2hTY3JlZW5JbWctLWNsb3NlLS0xMUdybER6IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJTcGxhc2hTY3JlZW5JbWctLWNsb3NlLS0xMUdybER6IilbMF07CgkJCQl2aXAyLmNsaWNrKCk7CgkJCX0sdHJ1ZSk7CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFsaS1idXR0b24gcGwtYnV0dG9uIj48c3BhbiBkYXRhLXJvbGU9Imljb24iIGRhdGEtcmVuZGVyLWFzPSJzdmciIGNsYXNzPSJpY29uIj48c3ZnIGNsYXNzPSJhbGktYnRuLWljb24iIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNODUzLjMzMyA5MzguNjY3SDE3MC42NjdhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQtODUuMzM0di0zODRBODUuMzMzIDg1LjMzMyAwIDAgMSAxNzAuNjY3IDM4NEgyODhhMzIgMzIgMCAwIDEgMCA2NEgxNzAuNjY3YTIxLjMzMyAyMS4zMzMgMCAwIDAtMjEuMzM0IDIxLjMzM3YzODRhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQgMjEuMzM0aDY4Mi42NjZhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQtMjEuMzM0di0zODRBMjEuMzMzIDIxLjMzMyAwIDAgMCA4NTMuMzMzIDQ0OEg3MzZhMzIgMzIgMCAwIDEgMC02NGgxMTcuMzMzYTg1LjMzMyA4NS4zMzMgMCAwIDEgODUuMzM0IDg1LjMzM3YzODRhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQgODUuMzM0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjxwYXRoIGQ9Ik03MTUuMDMgNTQzLjU1MmEzMi44MSAzMi44MSAwIDAgMC00Ni4yNTEgMEw1NTQuMDA1IDY1Ny44MTN2LTU0MC40OGEzMiAzMiAwIDAgMC02NCAwdjUzOS43MzRMMzc1Ljg5MyA1NDMuNDg4YTMyLjc5IDMyLjc5IDAgMCAwLTQ2LjIyOSAwIDMyLjQyNyAzMi40MjcgMCAwIDAgMCA0Ni4wMzdsMTY5LjU1NyAxNjguODExYTMyLjgxIDMyLjgxIDAgMCAwIDQ2LjI1MSAwbDE2OS41NTctMTY4LjgxYTMyLjQ3IDMyLjQ3IDAgMCAwIDAtNDUuOTc0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjwvc3ZnPjwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDMwcHg7IHJpZ2h0OiAwOyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPiR7dXBkYXRlfTwvdWw+PC9kaXY+YCk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQkvL2xldCBpbnMgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAuYXBwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgaWQ9InBsLWJ1dHRvbi1saW5rIiBjbGFzcz0iYWxpLWJ1dHRvbiBwbC1idXR0b24iPjxzcGFuIGRhdGEtcm9sZT0iaWNvbiIgZGF0YS1yZW5kZXItYXM9InN2ZyIgY2xhc3M9Imljb24iPjxzdmcgY2xhc3M9ImFsaS1idG4taWNvbiIgc3R5bGU9Im1hcmdpbi1yaWdodDogM3B4OyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik04NTMuMzMzIDkzOC42NjdIMTcwLjY2N2E4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNC04NS4zMzR2LTM4NEE4NS4zMzMgODUuMzMzIDAgMCAxIDE3MC42NjcgMzg0SDI4OGEzMiAzMiAwIDAgMSAwIDY0SDE3MC42NjdhMjEuMzMzIDIxLjMzMyAwIDAgMC0yMS4zMzQgMjEuMzMzdjM4NGEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNCAyMS4zMzRoNjgyLjY2NmEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNC0yMS4zMzR2LTM4NEEyMS4zMzMgMjEuMzMzIDAgMCAwIDg1My4zMzMgNDQ4SDczNmEzMiAzMiAwIDAgMSAwLTY0aDExNy4zMzNhODUuMzMzIDg1LjMzMyAwIDAgMSA4NS4zMzQgODUuMzMzdjM4NGE4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNCA4NS4zMzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PHBhdGggZD0iTTcxNS4wMyA1NDMuNTUyYTMyLjgxIDMyLjgxIDAgMCAwLTQ2LjI1MSAwTDU1NC4wMDUgNjU3LjgxM3YtNTQwLjQ4YTMyIDMyIDAgMCAwLTY0IDB2NTM5LjczNEwzNzUuODkzIDU0My40ODhhMzIuNzkgMzIuNzkgMCAwIDAtNDYuMjI5IDAgMzIuNDI3IDMyLjQyNyAwIDAgMCAwIDQ2LjAzN2wxNjkuNTU3IDE2OC44MTFhMzIuODEgMzIuODEgMCAwIDAgNDYuMjUxIDBsMTY5LjU1Ny0xNjguODFhMzIuNDcgMzIuNDcgMCAwIDAgMC00NS45NzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PC9zdmc+5LiL6L295Yqp5omLPC9zcGFuPjx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMzBweDsgcmlnaHQ6IDE2cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXNldHRpbmciPuWKqeaJi+iuvue9rjwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi11cGRhdGVsb2ciPuabtOaWsOaXpeW/lzwvbGk+JHt1cGRhdGV9PC91bD48L2Rpdj5gKTsKCQkJCSRidXR0b24uY3NzKHsnbWFyZ2luLXJpZ2h0JzogJzEwcHgnLCJoZWlnaHQiOiIzNnB4Iiwid2lkdGgiOiJhdXRvIiwicGFkZGluZyI6IjFweCAzMHB4In0pOwoJCQkJLy9sZXQgaW5zID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCQlhbGkuYWRkQnV0dG9uKCk7CgkJCQl9CgkJCX0sMTAwMCkKCQl9LAoKCQlhZGRJbml0QnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFsaS1idXR0b24gcGwtYnV0dG9uLWluaXQiPjxzcGFuIGRhdGEtcm9sZT0iaWNvbiIgZGF0YS1yZW5kZXItYXM9InN2ZyIgY2xhc3M9Imljb24iPjxzdmcgY2xhc3M9ImFsaS1idG4taWNvbiIgc3R5bGU9Im1hcmdpbi1yaWdodDogM3B4OyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik04NTMuMzMzIDkzOC42NjdIMTcwLjY2N2E4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNC04NS4zMzR2LTM4NEE4NS4zMzMgODUuMzMzIDAgMCAxIDE3MC42NjcgMzg0SDI4OGEzMiAzMiAwIDAgMSAwIDY0SDE3MC42NjdhMjEuMzMzIDIxLjMzMyAwIDAgMC0yMS4zMzQgMjEuMzMzdjM4NGEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNCAyMS4zMzRoNjgyLjY2NmEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNC0yMS4zMzR2LTM4NEEyMS4zMzMgMjEuMzMzIDAgMCAwIDg1My4zMzMgNDQ4SDczNmEzMiAzMiAwIDAgMSAwLTY0aDExNy4zMzNhODUuMzMzIDg1LjMzMyAwIDAgMSA4NS4zMzQgODUuMzMzdjM4NGE4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNCA4NS4zMzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PHBhdGggZD0iTTcxNS4wMyA1NDMuNTUyYTMyLjgxIDMyLjgxIDAgMCAwLTQ2LjI1MSAwTDU1NC4wMDUgNjU3LjgxM3YtNTQwLjQ4YTMyIDMyIDAgMCAwLTY0IDB2NTM5LjczNEwzNzUuODkzIDU0My40ODhhMzIuNzkgMzIuNzkgMCAwIDAtNDYuMjI5IDAgMzIuNDI3IDMyLjQyNyAwIDAgMCAwIDQ2LjAzN2wxNjkuNTU3IDE2OC44MTFhMzIuODEgMzIuODEgMCAwIDAgNDYuMjUxIDBsMTY5LjU1Ny0xNjguODFhMzIuNDcgMzIuNDcgMCAwIDAgMC00NS45NzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PC9zdmc+KOacqueCueS6rik8L3NwYW4+PC9kaXY+YCk7CgkJCSRidXR0b24uY3NzKHsid2lkdGgiOiJhdXRvIn0pOwoJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCQkJLy9jbGVhckludGVydmFsKGlucyk7CgkJCQl9CgkJCQkvL30sIDUwKTsKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJhbGktYnV0dG9uIHBsLWJ1dHRvbi1pbml0Ij48c3BhbiBkYXRhLXJvbGU9Imljb24iIGRhdGEtcmVuZGVyLWFzPSJzdmciIGNsYXNzPSJpY29uIj48c3ZnIGNsYXNzPSJhbGktYnRuLWljb24iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDNweDsiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNODUzLjMzMyA5MzguNjY3SDE3MC42NjdhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQtODUuMzM0di0zODRBODUuMzMzIDg1LjMzMyAwIDAgMSAxNzAuNjY3IDM4NEgyODhhMzIgMzIgMCAwIDEgMCA2NEgxNzAuNjY3YTIxLjMzMyAyMS4zMzMgMCAwIDAtMjEuMzM0IDIxLjMzM3YzODRhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQgMjEuMzM0aDY4Mi42NjZhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQtMjEuMzM0di0zODRBMjEuMzMzIDIxLjMzMyAwIDAgMCA4NTMuMzMzIDQ0OEg3MzZhMzIgMzIgMCAwIDEgMC02NGgxMTcuMzMzYTg1LjMzMyA4NS4zMzMgMCAwIDEgODUuMzM0IDg1LjMzM3YzODRhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQgODUuMzM0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjxwYXRoIGQ9Ik03MTUuMDMgNTQzLjU1MmEzMi44MSAzMi44MSAwIDAgMC00Ni4yNTEgMEw1NTQuMDA1IDY1Ny44MTN2LTU0MC40OGEzMiAzMiAwIDAgMC02NCAwdjUzOS43MzRMMzc1Ljg5MyA1NDMuNDg4YTMyLjc5IDMyLjc5IDAgMCAwLTQ2LjIyOSAwIDMyLjQyNyAzMi40MjcgMCAwIDAgMCA0Ni4wMzdsMTY5LjU1NyAxNjguODExYTMyLjgxIDMyLjgxIDAgMCAwIDQ2LjI1MSAwbDE2OS41NTctMTY4LjgxYTMyLjQ3IDMyLjQ3IDAgMCAwIDAtNDUuOTc0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjwvc3ZnPijmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQkJJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCcsImhlaWdodCI6IjM2cHgiLCJwYWRkaW5nIjoiMXB4IDMwcHgiLCJ3aWR0aCI6ImF1dG8ifSk7CgkJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCQkvL2NsZWFySW50ZXJ2YWwoaW5zKTsKCQkJCX0KCQkJCS8vfSwgNTApOwoJCQl9CgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQlpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJCWFsaS5hZGRJbml0QnV0dG9uKCk7CgkJCQl9CgkJCX0sMTAwMCkKCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlsZXQgcmVhY3REb21HcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYW4uZG9tLmdyaWQpOwoJCQlpZiAocmVhY3REb21HcmlkKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgU3dhbC5maXJlKHsKCQkJCQl0aXRsZTogJ+aPkOekuicsCgkJCQkJaHRtbDogJzxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsiPuivt+WFiOWIh+aNouWIsCZuYnNwOyZuYnNwOzxiPuWIl+ihqOinhuWbvjwvYj4mbmJzcDvigJw8c3ZnIGNsYXNzPSJpY29uIiBjbGFzcz0iaWNvbi0tRDNrTWsgIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPjx1c2UgeGxpbms6aHJlZj0iI1BEU0RyYWciPjwvdXNlPjwvc3ZnPuKAnSZuYnNwOyZuYnNwO+WQjuiOt+WPluS4i+i9vemTvuaOpTwvZGl2PicsCgkJCQkJaWNvbjogJ2luZm8nLAoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn54K55Ye75YiH5o2iJwoJCQkJfSk7CgkJCQlpZiAocmVzKSB7CgkJCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYW4uZG9tLnN3aXRjaCkuY2xpY2soKTsKCQkJCQlyZXR1cm4gbWVzc2FnZS5zdWNjZXNzKCfliIfmjaLkuLrliJfooajop4blm77miJDlip/vvIzor7flho3ojrflj5bkuIDmrKHkuIvovb3pk77mjqXlkaJ+Jyk7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJc2VsZWN0TGlzdCA9IHRoaXMuZ2V0U2VsZWN0ZWRMaXN0KCk7CgkJCWlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjli77pgInopoHkuIvovb3nmoTmlofku7bmjY9+Jyk7CgkJCX0KCQkJaWYgKHRoaXMuaXNPbmx5Rm9sZGVyKCkpIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35omT5byA5paH5Lu25aS55ZCO5YaN5Yu+6YCJ5paH5Lu2ficpOwoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID4gMjApIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuS4gOasoeacgOWkmuWPquiDveWLvumAiSAyMCDkuKrmlofku7blk6YhJyk7CgkJCQl9CgkJCQl0cnkgewoJCQkJCWxldCBhdXRob3JpemF0aW9uID0gYCR7YmFzZS5nZXRTdG9yYWdlKCd0b2tlbicpLnRva2VuX3R5cGV9ICR7YmFzZS5nZXRTdG9yYWdlKCd0b2tlbicpLmFjY2Vzc190b2tlbn1gOwoJCQkJCWxldCB4U2hhcmVUb2tlbiA9IGJhc2UuZ2V0U3RvcmFnZSgnc2hhcmVUb2tlbicpLnNoYXJlX3Rva2VuOwoKCQkJCQlmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKCQkJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzBdLCB7CgkJCQkJCQlleHBpcmVfc2VjOiA2MDAsCgkJCQkJCQlmaWxlX2lkOiBzZWxlY3RMaXN0W2ldLmZpbGVJZCwKCQkJCQkJCXNoYXJlX2lkOiBzZWxlY3RMaXN0W2ldLnNoYXJlSWQKCQkJCQkJfSwgewoJCQkJCQkJYXV0aG9yaXphdGlvbiwKCQkJCQkJCSJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04IiwKCQkJCQkJCSJ4LXNoYXJlLXRva2VuIjogeFNoYXJlVG9rZW4KCQkJCQkJfSk7CgkJCQkJCWlmIChyZXMuZG93bmxvYWRfdXJsKSB7CgkJCQkJCQlzZWxlY3RMaXN0W2ldLmRvd25sb2FkVXJsID0gcmVzLmRvd25sb2FkX3VybDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gY2F0Y2ggKGUpIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOeZu+W9lee9keebmH4nKTsKCQkJCX0KCQkJfQoJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CgkJCXRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwoJCX0sCgoJCWdlbmVyYXRlRG9tKGxpc3QpIHsKCQkJbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKCQkJbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwoJCQlsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWlmICh2LnR5cGUgPT09ICdmb2xkZXInKSByZXR1cm47CgkJCQlsZXQgZmlsZW5hbWUgPSB2Lm5hbWU7CgkJCQlsZXQgZmlkID0gdi5maWxlSWQ7CgkJCQlsZXQgZGlkID0gdi5kcml2ZUlkOwoJCQkJbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKCQkJCWxldCBkbGluayA9IHYuZG93bmxvYWRVcmwgfHwgdi51cmw7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQlhbGlua0FsbFRleHQgKz0gZGxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFwaSIgZGF0YS1kaWQ9IiR7ZGlkfSIgZGF0YS1maWQ9IiR7ZmlkfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtc2l6ZT0iJHt2LnNpemV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTxicj7kuIvovb0gICR7ZmlsZW5hbWV9PC9hPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tY29weSBwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1saW5rLWFwaS1idG4iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9Ij7lpI3liLbmlofku7blkI08L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPjxzcGFuPjxzcGFuIGNsYXNzPSJwbC1leHQiPjwvc3Bhbj48L3NwYW4+IDxzcGFuIGNsYXNzPSJwbC1iYWNrIGxpc3RlbmVyLWJhY2siPui/lOWbnjwvc3Bhbj48L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXByb2dyZXNzIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLW91dGVyIj48L2Rpdj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyIiBzdHlsZT0id2lkdGg6NSUiPgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+5q2j5Zyo5Yqg6L296L+b5bqmLi4uMCU8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgoJCQkJCWA7CgkJCQkJY29udGVudCs9YDxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy10aXAiIHN0eWxlPSJkaXNwbGF5OiBub25lIiA+5L2/55So6Ieq5bim5rWP6KeI5Zmo5LiL6L29PC9zcGFuPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1iYWNrIHBsLWJhY2sgbGlzdGVuZXItYmFjayIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPui/lOWbnjwvc3Bhbj4KCQkJCQkJCQk8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPuWmguS9leWUpOi1t0lETe+8nzwvc3Bhbj4KCQkJCQlgOwoJCQkJCWNvbnRlbnQgKz1gPC9kaXY+PC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcGknKQoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWRvd25sb2FkLWFsbCI+5LiL6L295YWo6YOo6ZO+5o6lPC9idXR0b24+PC9kaXY+YDsKCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+5YmN5b6A5Yqp5omL6K6+572u5L+u5pS55b2T5YmN57uI56uv57G75Z6L77yIJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW2BSZWZlcmVyOiBodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vYF0KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJSZWZlcmVyIjogImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8ifSwgJycpOwoJCQkJaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9CgkJfSwKCgkJZ2V0U2VsZWN0ZWRMaXN0KCkgewoJCQl0cnkgewoJCQkJbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwoJCQkJbGV0IHJlYWN0RG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYW4uZG9tLmxpc3QpOwoJCQkJbGV0IHJlYWN0T2JqID0gYmFzZS5maW5kUmVhY3QocmVhY3REb20sIDEpOwoJCQkJbGV0IHByb3BzID0gcmVhY3RPYmoucGVuZGluZ1Byb3BzOwoJCQkJaWYgKHByb3BzKSB7CgkJCQkJbGV0IGZpbGVMaXN0ID0gcHJvcHMuZGF0YVNvdXJjZSB8fCBbXTsKCQkJCQlsZXQgc2VsZWN0ZWRLZXlzID0gcHJvcHMuc2VsZWN0ZWRLZXlzLnNwbGl0KCcsJyk7CgkJCQkJZmlsZUxpc3QuZm9yRWFjaCgodmFsKSA9PiB7CgkJCQkJCWlmIChzZWxlY3RlZEtleXMuaW5jbHVkZXModmFsLmZpbGVJZCkpIHsKCQkJCQkJCXNlbGVjdGVkTGlzdC5wdXNoKHZhbCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBzZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvKGRyaXZlKS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0udHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL2FsaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL2FsaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2docHJveHkuY29tL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC9tYWluL2NvbmZpZy9hbGkuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9naHByb3h5LmNvbS9odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v5aSp57+85LqRCglsZXQgdGlhbnlpID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CgkJfSwKCgkJY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9mZignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstcnBjJykub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOyAKCgkJCQl0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwoJCQkJdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOwoKCQkJCWxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwoJCQkJaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CgkJCQkJJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwoJCQkJCXRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn+S6hiHlv6vljrvnnIvnnIvlkKd+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfSBlbHNlIGlmIChyZXMgPT09ICdhc3Npc3RhbnQnKSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwoJCQkJfSBlbHNlIHsKCQkJCQl0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS50ZXh0KCflj5HpgIHlpLHotKXvvIzmo4Dmn6XkuIDkuIvmgqjnmoRSUEPphY3nva7kv6Hmga/lk6YhJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewoJCQkJJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSruWTpn4nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CgkJCQlsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewoJCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lbmNvZGUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CgkJCQlHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CgkJCX0pOwoJCX0sCgoJCWFkZEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0idGlhbnlpLWJ1dHRvbiBwbC1idXR0b24iIGlkPSJwbC1idXR0b24tbGluayI+5LiL6L295Yqp5omLPHVsIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51IiBzdHlsZT0idG9wOiAyNnB4OyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPiR7dXBkYXRlfTwvdWw+PC9kaXY+YCk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQkvL2xldCBpbnMgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCQkvL2NsZWFySW50ZXJ2YWwoaW5zKTsKCQkJCX0KCQkJCS8vfSwgNTApOwoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJLy9sZXQgaW5zID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCQl0aWFueWkuYWRkQnV0dG9uKCk7CgkJCQl9CgkJCX0sMTAwMCkKCQl9LAoKCQlhZGRJbml0QnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ0aWFueWktYnV0dG9uIHBsLWJ1dHRvbi1pbml0IiBpZD0icGwtYnV0dG9uLWxpbmsiPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9kaXY+YCk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQkvL2xldCBpbnMgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAuYXBwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4J30pOwoJCQkJLy9sZXQgaW5zID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7CgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQlpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJCXRpYW55aS5hZGRJbml0QnV0dG9uKCk7CgkJCQl9CgkJCX0sMTAwMCkKCQl9LAoKCQlhc3luYyBnZXRUb2tlbigpIHsKCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0RmluYWxVcmwocGFuLnBjc1sxXSwge30pOwoJCQlsZXQgYWNjZXNzVG9rZW4gPSByZXMubWF0Y2goL2FjY2Vzc1Rva2VuPShcdyspLyk/LlsxXTsKCQkJYWNjZXNzVG9rZW4gJiYgYmFzZS5zZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTsKCQkJcmV0dXJuIGFjY2Vzc1Rva2VuOwoJCX0sCgoJCWFzeW5jIGdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSB7CgkJCXRyeSB7CgkJCQlpZiAoaXRlbS5kb3dubG9hZFVybCkgcmV0dXJuIHsKCQkJCQlpbmRleCwKCQkJCQlkb3dubG9hZFVybDogaXRlbS5kb3dubG9hZFVybAoJCQkJfTsKCQkJCWxldCB0aW1lID0gRGF0ZS5ub3coKSwKCQkJCQlmaWxlSWQgPSBpdGVtLmZpbGVJZCwKCQkJCQlvID0gIkFjY2Vzc1Rva2VuPSIgKyB0b2tlbiArICImVGltZXN0YW1wPSIgKyB0aW1lICsgIiZmaWxlSWQ9IiArIGZpbGVJZCwKCQkJCQl1cmwgPSBwYW4ucGNzWzJdICsgJz9maWxlSWQ9JyArIGZpbGVJZDsKCQkJCWlmIChpdGVtLnNoYXJlSWQpIHsKCQkJCQlvID0gIkFjY2Vzc1Rva2VuPSIgKyB0b2tlbiArICImVGltZXN0YW1wPSIgKyB0aW1lICsgIiZkdD0xJmZpbGVJZD0iICsgZmlsZUlkICsgIiZzaGFyZUlkPSIgKyBpdGVtLnNoYXJlSWQ7CgkJCQkJdXJsICs9ICcmZHQ9MSZzaGFyZUlkPScgKyBpdGVtLnNoYXJlSWQ7CgkJCQl9CgkJCQlsZXQgc2lnbiA9IG1kNShvKS50b1N0cmluZygpOwoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KHVybCwgewoJCQkJCSJhY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04IiwKCQkJCQkic2lnbi10eXBlIjogMSwKCQkJCQkiYWNjZXNzdG9rZW4iOiB0b2tlbiwKCQkJCQkidGltZXN0YW1wIjogdGltZSwKCQkJCQkic2lnbmF0dXJlIjogc2lnbgoJCQkJfSk7CgkJCQlpZiAocmVzLnJlc19jb2RlID09PSAwKSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiByZXMuZmlsZURvd25sb2FkVXJsCgkJCQkJfTsKCQkJCX0gZWxzZSBpZiAocmVzLmVycm9yQ29kZSA9PT0gJ0ludmFsaWRTZXNzaW9uS2V5JykgewoJCQkJCXJldHVybiB7CgkJCQkJCWluZGV4LAoJCQkJCQlkb3dubG9hZFVybDogJ+aPkOekuu+8mjxicj7or7flhYjnmbvlvZXnvZHnm5h+JwoJCQkJCX07CgkJCQl9IGVsc2UgaWYgKHJlcy5yZXNfY29kZSA9PT0gJ1NoYXJlTm90Rm91bmRGbGF0RGlyJykgewoJCQkJCXJldHVybiB7CgkJCQkJCWluZGV4LAoJCQkJCQlkb3dubG9hZFVybDogJ+aPkOekuu+8mjxicj7or7flhYhb6L2s5a2YXeaWh+S7tu+8jOS5i+WQjuWGjfCfkYnliY3lvoBb5oiR55qE572R55uYXeS4reS4i+i9veWTpn4nCgkJCQkJfTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCQl9OwoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCX07CgkJCX0KCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCQkJbGV0IHRva2VuID0gYmFzZS5nZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicpIHx8IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTsKCQkJaWYgKCF0b2tlbikgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjnmbvlvZXnvZHnm5h+Jyk7CgkJCX0KCQkJbGV0IHF1ZXVlID0gW107CgkJCXNlbGVjdExpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsKCQkJCXF1ZXVlLnB1c2godGhpcy5nZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikpOwoJCQl9KTsKCgkJCWNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXVlKTsKCQkJcmVzLmZvckVhY2godmFsID0+IHsKCQkJCXNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKCQkJfSk7CgoJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CgkJCXRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwoJCX0sCgoJCWdlbmVyYXRlRG9tKGxpc3QpIHsKCQkJbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKCQkJbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwoJCQlsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWlmICh2LmlzRm9sZGVyKSByZXR1cm47CgkJCQlsZXQgZmlsZW5hbWUgPSB2LmZpbGVOYW1lOwoJCQkJbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKCQkJCWxldCBkbGluayA9IHYuZG93bmxvYWRVcmw7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFwaSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgoJCQkJCQkJCTwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdjdXJsJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdiYycpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKCQkJCX0KCQkJfSk7CgkJCWNvbnRlbnQgKz0gJzwvZGl2Pic7CgkJCWlmIChtb2RlID09PSAnYXJpYScpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwoJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCWxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwoJCQl9CgkJCWlmIChtb2RlID09PSAnY3VybCcpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwoJCQlyZXR1cm4gY29udGVudDsKCQl9LAoKCQlhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CgkJCWxldCBycGMgPSB7CgkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAoJCQkJdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCgkJCQlkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAoJCQl9OwoKCQkJbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwoJCQlsZXQgcnBjRGF0YSA9IHsKCQkJCWlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKCQkJCWpzb25ycGM6ICcyLjAnLAoJCQkJbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKCQkJCXBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKCQkJCQlkaXI6IHJwYy5kaXIsCgkJCQkJb3V0OiBmaWxlbmFtZSwKCQkJCQloZWFkZXI6IFtdCgkJCQl9XQoJCQl9OwoJCQl0cnkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHt9LCAnJyk7CgkJCQlpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKCQkJCXJldHVybiAnZmFpbCc7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiAnZmFpbCc7CgkJCX0KCQl9LAoKCQlnZXRTZWxlY3RlZExpc3QoKSB7CgkJCXRyeSB7CgkJCQlyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmMtZmlsZS1saXN0IikuX192dWVfXy5zZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmluZm8tZGV0YWlsIikuX192dWVfXy5maWxlRGV0YWlsXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvd2ViXC9tYWluLy50ZXN0KHBhdGgpKSByZXR1cm4gJ2hvbWUnOwoJCQlpZiAoL15cL3dlYlwvc2hhcmUvLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwoJCQlyZXR1cm4gJyc7CgkJfSwKCgkJaXNPbmx5Rm9sZGVyKCkgewoJCQlmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKCQkJCWlmICghc2VsZWN0TGlzdFtpXS5pc0ZvbGRlcikgcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0sCgoJCXNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKCQkJU3dhbC5maXJlKHsKCQkJCXRpdGxlLAoJCQkJaHRtbCwKCQkJCWZvb3RlciwKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCXBvc2l0aW9uOiAnY2VudGVyJywvL3RvcAoJCQkJd2lkdGgsCgkJCQlwYWRkaW5nOiAnMTVweCAyMHB4IDVweCcsCgkJCQljdXN0b21DbGFzcywKCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn5YWz6ZetJywKCQkJfSk7CgkJfSwKCgkJYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsKCQkJcHQgPSB0aGlzLmRldGVjdFBhZ2UoKTsKCQkJYmFzZS5jcmVhdGVUaXAoKTsKCQkJYmFzZS5yZWdpc3Rlck1lbnVDb21tYW5kKCk7CgkJCWlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MScpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy90aWFueWkvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi90aWFueWkvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICJubyIpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9naHByb3h5LmNvbS9odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvbWFpbi9jb25maWcvdGlhbnlpLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCX0gZWxzZSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQoYGh0dHBzOi8vZ2hwcm94eS5jb20vaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50L21haW4vY29uZmlnL2NvbmZpZy5qc29uYCwge30sICJ0ZXh0Iiwge30pOwoJCQkJcGFuID0gSlNPTi5wYXJzZShyZXMpOwoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicsICd2MicpOwoJCQl9CgkJCU9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwoJCQlwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8IHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CgkJCXRoaXMuZ2V0VG9rZW4oKTsKCQl9Cgl9OwoKCS8v6L+F6Zu35LqR55uYCglsZXQgeHVubGVpID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CgkJfSwKCgkJY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaS1idG4nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRDbGlwYm9hcmQoZS50YXJnZXQuZGF0YXNldC5maWxlbmFtZSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1iYy1idG4nLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG1pcnJvciA9IGJhc2UuZ2V0TWlycm9yTGlzdChlLnRhcmdldC5kYXRhc2V0LmRsaW5rLCBwYW4ubWlycm9yKTsKCQkJCWJhc2Uuc2V0Q2xpcGJvYXJkKG1pcnJvcik7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJc2V0VGltZW91dCgKCQkJCQlmdW5jdGlvbiAoKXsKCQkJCQkJJChlLnRhcmdldCkudGV4dCgn6YeN5paw5aSN5Yi2JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQl9LDIwMDAKCQkJCSkKCQkJfSk7CgkJCWRvYy5vZmYoJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycpLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9Inh1bmxlaS1idXR0b24gcGwtYnV0dG9uIiBpZD0icGwtYnV0dG9uLWxpbmsiPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDM0cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXNldHRpbmciPuWKqeaJi+iuvue9rjwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi11cGRhdGVsb2ciPuabtOaWsOaXpeW/lzwvbGk+JHt1cGRhdGV9PC91bD48L2Rpdj5gKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4J30pOwoJCQkJLy9sZXQgaW5zID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCQl4dW5sZWkuYWRkQnV0dG9uKCk7CgkJCQl9CgkJCX0sMTAwMCkKCQl9LAoKCQlhZGRJbml0QnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ4dW5sZWktYnV0dG9uIHBsLWJ1dHRvbi1pbml0IiBpZD0icGwtYnV0dG9uLWxpbmsiPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJLy9sZXQgaW5zID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwoJCQkJaWYgKCR0b29sV3JhcC5sZW5ndGggPiAwKSB7CgkJCQkJJHRvb2xXcmFwLmFwcGVuZCgkYnV0dG9uKTsKCQkJCQkvL2NsZWFySW50ZXJ2YWwoaW5zKTsKCQkJCX0KCQkJCS8vfSwgNTApOwoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCQkvL2NsZWFySW50ZXJ2YWwoaW5zKTsKCQkJCX0KCQkJCS8vfSwgNTApOwoJCQl9CgkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCQl4dW5sZWkuYWRkSW5pdEJ1dHRvbigpOwoJCQkJfQoJCQl9LDEwMDApCgkJfSwKCgkJZ2V0VG9rZW4oKSB7CgkJCWxldCBjcmVkZW50aWFscyA9IHt9LCBjYXB0Y2hhID0ge307CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7CgkJCQlpZiAoL15jcmVkZW50aWFsc18vLnRlc3QobG9jYWxTdG9yYWdlLmtleShpKSkpIHsKCQkJCQljcmVkZW50aWFscyA9IGJhc2UuZ2V0U3RvcmFnZShsb2NhbFN0b3JhZ2Uua2V5KGkpKTsKCQkJCQliYXNlLnNldFN0b3JhZ2UoJycpOwoJCQkJfQoJCQkJaWYgKC9eY2FwdGNoYV9bXHddezE2fS8udGVzdChsb2NhbFN0b3JhZ2Uua2V5KGkpKSkgewoJCQkJCWNhcHRjaGEgPSBiYXNlLmdldFN0b3JhZ2UobG9jYWxTdG9yYWdlLmtleShpKSk7CgkJCQl9CgkJCX0KCQkJbGV0IGRldmljZWlkID0gLyhcd3szMn0pLy5leGVjKGJhc2UuZ2V0U3RvcmFnZSgnZGV2aWNlaWQnKS5zcGxpdCgnLCcpKVswXTsKCQkJbGV0IHRva2VuID0gewoJCQkJY3JlZGVudGlhbHMsCgkJCQljYXB0Y2hhLAoJCQkJZGV2aWNlaWQKCQkJfTsKCQkJcmV0dXJuIHRva2VuOwoJCX0sCgoJCWFzeW5jIGdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSB7CgkJCXRyeSB7CgkJCQlpZiAoaXRlbS5kb3dubG9hZFVybCkgcmV0dXJuIHsKCQkJCQlpbmRleCwKCQkJCQlkb3dubG9hZFVybDogaXRlbS5kb3dubG9hZFVybAoJCQkJfTsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChwYW4ucGNzWzBdICsgaXRlbS5pZCwgewoJCQkJCSdBdXRob3JpemF0aW9uJzogYCR7dG9rZW4uY3JlZGVudGlhbHMudG9rZW5fdHlwZX0gJHt0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NfdG9rZW59YCwKCQkJCQknY29udGVudC10eXBlJzogImFwcGxpY2F0aW9uL2pzb24iLAoJCQkJCSd4LWNhcHRjaGEtdG9rZW4nOiB0b2tlbi5jYXB0Y2hhLnRva2VuLAoJCQkJCSd4LWRldmljZS1pZCc6IHRva2VuLmRldmljZWlkLAoJCQkJfSk7CgkJCQlpZiAocmVzLndlYl9jb250ZW50X2xpbmspIHsKCQkJCQlyZXR1cm4gewoJCQkJCQlpbmRleCwKCQkJCQkJZG93bmxvYWRVcmw6IHJlcy53ZWJfY29udGVudF9saW5rCgkJCQkJfTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCQl9OwoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOeZu+W9lee9keebmOWQjuWGjeWIt+aWsOmhtemdouWRon4nKTsKCQkJfQoJCX0sCgoJCWFzeW5jIGdldFBDU0xpbmsoKSB7CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu25o2PficpOwoJCQl9CgkJCWlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJfQoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJbGV0IHF1ZXVlID0gW107CgkJCQlsZXQgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CgkJCQlzZWxlY3RMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQkJcXVldWUucHVzaCh0aGlzLmdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSk7CgkJCQl9KTsKCQkJCWNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXVlKTsKCQkJCXJlcy5mb3JFYWNoKHZhbCA9PiB7CgkJCQkJc2VsZWN0TGlzdFt2YWwuaW5kZXhdLmRvd25sb2FkVXJsID0gdmFsLmRvd25sb2FkVXJsOwoJCQkJfSk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+S/neWtmOWIsOiHquW3see9keebmOWQjuWGjeWOu+e9keebmOS4u+mhteS4i+i9veWTpn4nKTsKCQkJfQoJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CgkJCXRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwoKCQl9LAoKCQlnZW5lcmF0ZURvbShsaXN0KSB7CgkJCWxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CgkJCWxldCBhbGlua0FsbFRleHQgPSAnJzsKCQkJbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlpZiAodi5raW5kID09PSAnZHJpdmUjZm9sZGVyJykgcmV0dXJuOwoJCQkJbGV0IGZpbGVuYW1lID0gdi5uYW1lOwoJCQkJbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQoK3Yuc2l6ZSk7CgkJCQlsZXQgZGxpbmsgPSB2LmRvd25sb2FkVXJsOwoJCQkJaWYgKG1vZGUgPT09ICdhcGknKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLWJ0biBsaXN0ZW5lci1saW5rLWFwaS1idG4iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9Ij7lpI3liLbmlofku7blkI08L2Rpdj4KCQkJCQkJCQk8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdhcmlhJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0FyaWEoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmFyaWEyY+mTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5o6o6YCB5YiwIFJQQyDkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnY3VybCcpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYmMnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQkMoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1idG4gbGlzdGVuZXItbGluay1iYy1idG4iIGRhdGEtZGxpbms9IiR7ZGxpbmt9Ij7lpI3liLbplZzlg4/lnLDlnYA8L2Rpdj4KCQkJCQkJCQk8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW10KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCWxldCBkb21zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhbi1saXN0LWl0ZW0nKTsKCQkJCWxldCBzZWxlY3RlZExpc3QgPSBbXTsKCQkJCWZvciAobGV0IGRvbSBvZiBkb21zKSB7CgkJCQkJbGV0IGRvbVZ1ZSA9IGRvbS5fX3Z1ZV9fOwoJCQkJCWlmIChkb21WdWUuc2VsZWN0ZWQuaW5jbHVkZXMoZG9tVnVlLmluZm8uaWQpKSB7CgkJCQkJCXNlbGVjdGVkTGlzdC5wdXNoKGRvbVZ1ZS5pbmZvKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gW107CgkJCX0KCQl9LAoKCQlkZXRlY3RQYWdlKCkgewoJCQlsZXQgcGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwoJCQlpZiAoL15cLyQvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CgkJCWlmICgvXlwvKHN8c2hhcmUpXC8vLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwoJCQlyZXR1cm4gJyc7CgkJfSwKCgkJaXNPbmx5Rm9sZGVyKCkgewoJCQlmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKCQkJCWlmIChzZWxlY3RMaXN0W2ldLmtpbmQgPT09ICdkcml2ZSNmaWxlJykgcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0sCgoJCXNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKCQkJU3dhbC5maXJlKHsKCQkJCXRpdGxlLAoJCQkJaHRtbCwKCQkJCWZvb3RlciwKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCXBvc2l0aW9uOiAnY2VudGVyJywvL3RvcAoJCQkJd2lkdGgsCgkJCQlwYWRkaW5nOiAnMTVweCAyMHB4IDVweCcsCgkJCQljdXN0b21DbGFzcywKCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn5YWz6ZetJywKCQkJfSk7CgkJfSwKCgkJYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsKCQkJcHQgPSB0aGlzLmRldGVjdFBhZ2UoKTsKCQkJYmFzZS5jcmVhdGVUaXAoKTsKCQkJYmFzZS5yZWdpc3Rlck1lbnVDb21tYW5kKCk7CgkJCWlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MScpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy94dW5sZWkvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi94dW5sZWkvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICJubyIpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9naHByb3h5LmNvbS9odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvbWFpbi9jb25maWcveHVubGVpLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCX0gZWxzZSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQoYGh0dHBzOi8vZ2hwcm94eS5jb20vaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50L21haW4vY29uZmlnL2NvbmZpZy5qc29uYCwge30sICJ0ZXh0Iiwge30pOwoJCQkJcGFuID0gSlNPTi5wYXJzZShyZXMpOwoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicsICd2MicpOwoJCQl9CgkJCU9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwoJCQlwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8IHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CgkJfQoJfTsKCgkvL+WkuOWFi+e9keebmAoJbGV0IHF1YXJrID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJDb29raWU6ICR7ZG9jdW1lbnQuY29va2llfSJgKTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9JmNvb2tpZT0ke2VuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5jb29raWUpfVpaYDsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSIgLWIgIiR7ZG9jdW1lbnQuY29va2llfSJgKTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBob21lID0gJ2h0dHBzOi8vcGFuLnF1YXJrLmNuL2xpc3QjLycsIGFsbCA9ICdodHRwczovL3Bhbi5xdWFyay5jbi9saXN0Iy9saXN0L2FsbCc7CgkJCQlpZiAoZS5vbGRVUkwgPT09IGhvbWUgJiYgZS5uZXdVUkwgPT09IGFsbCkgcmV0dXJuOwoJCQkJYXdhaXQgYmFzZS5zbGVlcCgxNTApOwoJCQkJaWYgKCQoJy5xdWFyay1idXR0b24nKS5sZW5ndGggPiAwKSByZXR1cm47CgkJCQlwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8IHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CgkJCQltb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwoJCQkJU3dhbC5maXJlKHsKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJaHRtbDogYOmTvuaOpeiOt+WPluS4rWAsCgkJCQkJd2lsbE9wZW46IGZ1bmN0aW9uKCkgewoJCQkJCQlTd2FsLnNob3dMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSk7CgkJCQl0aGlzLmdldFBDU0xpbmsoKTsKCQkJfSk7CgkJCWRvYy5vZmYoJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXNhdmUnKS5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstc2F2ZScsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJCWlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI5Yu+6YCJ6KaB5L+d5a2Y5Yiw572R55uY55qE5paH5Lu25o2PficpOwoJCQkJfQoJCQkJbWVzc2FnZS5pbmZvKCfmj5DnpLrvvJo8YnI+5Zug5aS45YWL6ZmQ5Yi277yM6K+35YWI5L+d5a2Y5Yiw6Ieq5bex572R55uY5ZCO5YaN5LiL6L295ZOmIScpOwoJCQkJYXdhaXQgYmFzZS5zbGVlcCg1MDApOwoJCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbGUtaW5mb19yJykuY2xpY2soKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCSQoJyNkb3dubG9hZElmcmFtZScpLmF0dHIoJ3NyYycsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJc2V0VGltZW91dCgKCQkJCQlmdW5jdGlvbiAoKXsKCQkJCQkJJChlLnRhcmdldCkudGV4dCgn6YeN5paw5aSN5Yi2JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQl9LDIwMDAKCQkJCSkKCQkJfSk7CgkJCWRvYy5vZmYoJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycpLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWxldCBzdmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpJaUlHaGxhV2RvZEQwaU1qSWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTkdSa1pHUmtZaUlITjBjbTlyWlMxM2FXUjBhRDBpTWlJK1BIQmhkR2dnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUluSnZkVzVrSWlCa1BTSk5PU0F4TW13eUlESWdNaTB5ZWlJdlBqeHdZWFJvSUdROUlrMHhOQ0E0YURFdU5UVXpZeTQ0TlNBd0lERXVNVFl1TURreklERXVORGN1TWpZM0xqTXhNUzR4TnpRdU5UVTJMalF6TGpjeU1pNDNOVFl1TVRZMkxqTXlOaTR5TlRVdU5qVXVNalUxSURFdU5UUjJOQzQ0TnpOak1DQXVPRGt5TFM0d09Ea2dNUzR5TVRVdExqSTFOU0F4TGpVMExTNHhOall1TXpJM0xTNDBNUzQxT0RNdExqY3lNaTQzTlRjdExqTXhMakUzTkMwdU5qSXVNalkzTFRFdU5EY3VNalkzU0RZdU5EUTNZeTB1T0RVZ01DMHhMakUyTFM0d09UTXRNUzQwTnkwdU1qWTNZVEV1TnpjNElERXVOemM0SURBZ01ERXRMamN5TWkwdU56VTJZeTB1TVRZMkxTNHpNall0TGpJMU5TMHVOalV0TGpJMU5TMHhMalUwZGkwMExqZzNNMk13TFM0NE9USXVNRGc1TFRFdU1qRTFMakkxTlMweExqVTBMakUyTmkwdU16STNMalF4TFM0MU9ETXVOekl5TFM0M05UY3VNekV0TGpFM05DNDJNaTB1TWpZM0lERXVORGN0TGpJMk4wZ3hNU0l2UGp4d1lYUm9JSE4wY205clpTMXNhVzVsWTJGd1BTSnliM1Z1WkNJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKeWIzVnVaQ0lnWkQwaVRURXhJRE4yTVRBaUx6NDhMMmMrUEM5emRtYysnOwoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLm5leHQtYm94IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5leHQtYm94IilbMF07CgkJCQlhZDEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5hbnQtbW9kYWwtY2xvc2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgbG9naW4xID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYW50LW1vZGFsLWNsb3NlIilbMF07CgkJCQlsb2dpbjEuY2xpY2soKTsKCQkJfSx0cnVlKTsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLnRpcHMiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInRpcHMiKVswXTsKCQkJCXZpcDEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5wYy1tZW1iZXItZW50cmFuY2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYy1tZW1iZXItZW50cmFuY2Ugc3BhbicpOwoJCQkJd2luZG93Lm9ubG9hZCA9IHZpcDIuaW5uZXJIVE1MID0gIuW8gOmAmlNWSVAiOwoJCQl9KTsKCgkJCWxldCAkdG9vbFdyYXA7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgaWQ9InBsLWJ1dHRvbi1saW5rIiBjbGFzcz0iYW50LWRyb3Bkb3duLXRyaWdnZXIgcGwtYnV0dG9uIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InF1YXJrLWJ1dHRvbiBhbnQtYnRuIGJ0bi1maWxlIGFudC1idG4tcHJpbWFyeSI+PGltZyBjbGFzcz0icXVhcmstYnRuLWljb24iIHNyYz0iYCsgc3ZnICtgIj48c3Bhbj7kuIvovb3liqnmiYs8L3NwYW4+PC9idXR0b24+PHVsIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51IiBzdHlsZT0idG9wOiA1NXB4OyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyI+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT4ke3VwZGF0ZX08L3VsPjwvZGl2PmApOwoJCQkJJGJ1dHRvbi5jc3MoeyJtYXJnaW4tcmlnaHQiOiIxMHB4IiwiZGlzcGxheSI6ImlubGluZS1ibG9jayJ9KTsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFudC1kcm9wZG93bi10cmlnZ2VyIHBsLWJ1dHRvbiI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJxdWFyay1idXR0b24gYW50LWJ0biBidG4tZmlsZSBhbnQtYnRuLXByaW1hcnkiIHN0eWxlPSJoZWlnaHQ6IDQwcHg7Ij48aW1nIGNsYXNzPSJxdWFyay1idG4taWNvbiIgc3JjPSJgKyBzdmcgK2AiPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2J1dHRvbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDEwMHB4OyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItbGluay1zYXZlIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn1iMCAhaW1wb3J0YW50O2NvbG9yOiNmZmYgIWltcG9ydGFudDsiIGRhdGEtbW9kZT0ic2F2ZSI+PHNwYW4gY2xhc3M9InNhdmUtYnRuLWljb24iPjwvc3Bhbj7kv53lrZjlkI7kuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT4ke3VwZGF0ZX08L3VsPjwvZGl2PmApOwoJCQkJJGJ1dHRvbi5jc3MoeyJtYXJnaW4tcmlnaHQiOiIxMHB4IiwiZGlzcGxheSI6ImlubGluZS1ibG9jayJ9KTsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCX0KCQkJfQoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCQlxdWFyay5hZGRCdXR0b24oKTsKCQkJCX0KCQkJfSwxMDAwKQoJCX0sCgoJCWFkZEluaXRCdXR0b24oKSB7CgkJCWxldCBzdmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpJaUlHaGxhV2RvZEQwaU1qSWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTkdSa1pHUmtZaUlITjBjbTlyWlMxM2FXUjBhRDBpTWlJK1BIQmhkR2dnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUluSnZkVzVrSWlCa1BTSk5PU0F4TW13eUlESWdNaTB5ZWlJdlBqeHdZWFJvSUdROUlrMHhOQ0E0YURFdU5UVXpZeTQ0TlNBd0lERXVNVFl1TURreklERXVORGN1TWpZM0xqTXhNUzR4TnpRdU5UVTJMalF6TGpjeU1pNDNOVFl1TVRZMkxqTXlOaTR5TlRVdU5qVXVNalUxSURFdU5UUjJOQzQ0TnpOak1DQXVPRGt5TFM0d09Ea2dNUzR5TVRVdExqSTFOU0F4TGpVMExTNHhOall1TXpJM0xTNDBNUzQxT0RNdExqY3lNaTQzTlRjdExqTXhMakUzTkMwdU5qSXVNalkzTFRFdU5EY3VNalkzU0RZdU5EUTNZeTB1T0RVZ01DMHhMakUyTFM0d09UTXRNUzQwTnkwdU1qWTNZVEV1TnpjNElERXVOemM0SURBZ01ERXRMamN5TWkwdU56VTJZeTB1TVRZMkxTNHpNall0TGpJMU5TMHVOalV0TGpJMU5TMHhMalUwZGkwMExqZzNNMk13TFM0NE9USXVNRGc1TFRFdU1qRTFMakkxTlMweExqVTBMakUyTmkwdU16STNMalF4TFM0MU9ETXVOekl5TFM0M05UY3VNekV0TGpFM05DNDJNaTB1TWpZM0lERXVORGN0TGpJMk4wZ3hNU0l2UGp4d1lYUm9JSE4wY205clpTMXNhVzVsWTJGd1BTSnliM1Z1WkNJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKeWIzVnVaQ0lnWkQwaVRURXhJRE4yTVRBaUx6NDhMMmMrUEM5emRtYysnOwoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFudC1kcm9wZG93bi10cmlnZ2VyIHBsLWJ1dHRvbi1pbml0Ij48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InF1YXJrLWJ1dHRvbiBhbnQtYnRuIGJ0bi1maWxlIGFudC1idG4tcHJpbWFyeSIgc3R5bGU9ImhlaWdodDogNDBweDsiPjxpbWcgY2xhc3M9InF1YXJrLWJ0bi1pY29uIiBzcmM9ImArIHN2ZyArYCI+PHNwYW4+5LiL6L295Yqp5omLKOacqueCueS6rik8L3NwYW4+PC9idXR0b24+PC9kaXY+YCk7CgkJCSRidXR0b24uY3NzKHsibWFyZ2luLXJpZ2h0IjoiMTBweCIsImRpc3BsYXkiOiJpbmxpbmUtYmxvY2sifSk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQkvL2xldCBpbnMgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCQkvL2NsZWFySW50ZXJ2YWwoaW5zKTsKCQkJCX0KCQkJCS8vfSwgNTApOwoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJLy9sZXQgaW5zID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7CgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQlpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJCXF1YXJrLmFkZEluaXRCdXR0b24oKTsKCQkJCX0KCQkJfSwxMDAwKQoJCX0sCgoJCWFzeW5jIGdldFBDU0xpbmsoKSB7CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu25o2PficpOwoJCQl9CgkJCWlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJfQoJCQlsZXQgZmlkcyA9IFtdOwoJCQlzZWxlY3RMaXN0LmZvckVhY2godmFsID0+IHsKCQkJCWZpZHMucHVzaCh2YWwuZmlkKTsKCQkJfSk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHBhbi5wY3NbMF0sIHsKCQkJCQkiZmlkcyI6IGZpZHMKCQkJCX0sIHsiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsICJ1c2VyLWFnZW50IjogcGFuLnVhfSk7CgkJCQlpZiAocmVzLmNvZGUgPT09IDMxMDAxKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjnmbvlvZXnvZHnm5h+Jyk7CgkJCQl9CgkJCQlpZiAocmVzLmNvZGUgIT09IDApIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuiOt+WPlumTvuaOpeWksei0peS6hn4nKTsKCQkJCX0KCQkJCWxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShyZXMuZGF0YSk7CgkJCQl0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKCQkJfSBlbHNlIHsKCQkJCW1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fkv53lrZjliLDoh6rlt7HnvZHnm5jlkI7lho3ljrvnvZHnm5jkuLvpobXkuIvovb3lk6Z+Jyk7CgkJCQlhd2FpdCBiYXNlLnNsZWVwKDEwMDApOwoJCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbGUtaW5mb19yJykuY2xpY2soKTsKCQkJCXJldHVybjsKCQkJfQoJCX0sCgoJCWdlbmVyYXRlRG9tKGxpc3QpIHsKCQkJbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKCQkJbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwoJCQlsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWlmICh2LmZpbGUgPT09IGZhbHNlKSByZXR1cm47CgkJCQlsZXQgZmlsZW5hbWUgPSB2LmZpbGVfbmFtZTsKCQkJCWxldCBmaWQgPSB2LmZpZDsKCQkJCWxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KHYuc2l6ZSk7CgkJCQlsZXQgZGxpbmsgPSB2LmRvd25sb2FkX3VybDsKCQkJCWlmIChtb2RlID09PSAnYXBpJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpZD0iJHtmaWR9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW2BDb29raWU6ICR7ZG9jdW1lbnQuY29va2llfWBdCgkJCQl9XQoJCQl9OwoJCQl0cnkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHsiQ29va2llIjogZG9jdW1lbnQuY29va2llfSwgJycpOwoJCQkJaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9CgkJfSwKCgkJZ2V0U2VsZWN0ZWRMaXN0KCkgewoJCQl0cnkgewoJCQkJbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwoJCQkJbGV0IHJlYWN0RG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1saXN0JylbMF07CgkJCQlsZXQgcmVhY3RPYmogPSBiYXNlLmZpbmRSZWFjdChyZWFjdERvbSk7CgkJCQlsZXQgcHJvcHMgPSByZWFjdE9iai5wcm9wczsKCQkJCWlmIChwcm9wcykgewoJCQkJCWxldCBmaWxlTGlzdCA9IHByb3BzLmxpc3QgfHwgW107CgkJCQkJbGV0IHNlbGVjdGVkS2V5cyA9IHByb3BzLnNlbGVjdGVkUm93S2V5cyB8fCBbXTsKCQkJCQlmaWxlTGlzdC5mb3JFYWNoKCh2YWwpID0+IHsKCQkJCQkJaWYgKHNlbGVjdGVkS2V5cy5pbmNsdWRlcyh2YWwuZmlkKSkgewoJCQkJCQkJc2VsZWN0ZWRMaXN0LnB1c2godmFsKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfQoJCQkJcmV0dXJuIHNlbGVjdGVkTGlzdDsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuIFtdOwoJCQl9CgkJfSwKCgkJZGV0ZWN0UGFnZSgpIHsKCQkJbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKCQkJaWYgKC9eXC8obGlzdCkvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CgkJCWlmICgvXlwvKHN8c2hhcmUpXC8vLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwoJCQlyZXR1cm4gJyc7CgkJfSwKCgkJaXNPbmx5Rm9sZGVyKCkgewoJCQlmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKCQkJCWlmIChzZWxlY3RMaXN0W2ldLmZpbGUpIHJldHVybiBmYWxzZTsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoKCQlzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CgkJCVN3YWwuZmlyZSh7CgkJCQl0aXRsZSwKCQkJCWh0bWwsCgkJCQlmb290ZXIsCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlwb3NpdGlvbjogJ2NlbnRlcicsLy90b3AKCQkJCXdpZHRoLAoJCQkJcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAoJCQkJY3VzdG9tQ2xhc3MsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScsCgkJCX0pOwoJCX0sCgoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCXB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvcXVhcmsvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi9xdWFyay8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2docHJveHkuY29tL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC9tYWluL2NvbmZpZy9xdWFyay5qc29uYCwge30sICJ0ZXh0Iiwge30pOwoJCQkJcGFuID0gSlNPTi5wYXJzZShyZXMpOwoJCQl9IGVsc2UgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2docHJveHkuY29tL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC9tYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCAndjInKTsKCQkJfQoJCQlPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKCQkJcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fCBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQliYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CgkJfQoJfTsKCgkvL+S4reWbveenu+WKqOS6keebmC/lkozlvankupEKCWxldCB5aWRvbmcgPSB7CgoJCWNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9WlpgOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmVuY29kZShiYyl9YCk7CgkJfSwKCgkJY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9ImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJZG9jLm9uKCdjbGljaycsICcucGwtYnV0dG9uLW1vZGUnLCAoZSkgPT4gewoJCQkJbW9kZSA9IGUudGFyZ2V0LmRhdGFzZXQubW9kZTsKCQkJCVN3YWwuZmlyZSh7CgkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJCWh0bWw6IGDpk77mjqXojrflj5bkuK1gLAoJCQkJCXdpbGxPcGVuOiBmdW5jdGlvbigpIHsKCQkJCQkJU3dhbC5zaG93TG9hZGluZygpOwoJCQkJCX0KCQkJCX0pOwoJCQkJdGhpcy5nZXRQQ1NMaW5rKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkkKCcjZG93bmxvYWRJZnJhbWUnKS5hdHRyKCdzcmMnLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXJpYSwgLmxpc3RlbmVyLWNvcHktYWxsJywgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWJhc2Uuc2V0Q2xpcGJvYXJkKGRlY29kZVVSSUNvbXBvbmVudChlLnRhcmdldC5kYXRhc2V0LmxpbmspKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1jb3B5LWFsbC1hcGknLCAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJc2V0VGltZW91dCgKCQkJCQlmdW5jdGlvbiAoKXsKCQkJCQkJJChlLnRhcmdldCkudGV4dCgn6YeN5paw5aSN5Yi2JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQl9LDIwMDAKCQkJCSkKCQkJfSk7CgkJCWRvYy5vZmYoJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycpLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InlpZG9uZy1idXR0b24gcGwtYnV0dG9uIGJ0bi10b3AiIGlkPSJwbC1idXR0b24tbGluayI+PHNwYW4gY2xhc3M9InlpZG9uZy1idG4iPuS4i+i9veWKqeaJizwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDM2cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXNldHRpbmciPuWKqeaJi+iuvue9rjwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi11cGRhdGVsb2ciPuabtOaWsOaXpeW/lzwvbGk+JHt1cGRhdGV9PC91bD48L2Rpdj5gKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQkkYnV0dG9uLnJlbW92ZUNsYXNzKCd5aWRvbmctYnV0dG9uJykuYWRkQ2xhc3MoJ3lpZG9uZy1zaGFyZS1idXR0b24nKTsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCQkvL2NsZWFySW50ZXJ2YWwoaW5zKTsKCQkJCX0KCQkJCS8vfSwgNTApOwoJCQl9CgkJCWJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKCQkJdGhpcy5hZGRQYWdlTGlzdGVuZXIoKTsKCQkJc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCQkJCWlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQkJeWlkb25nLmFkZEJ1dHRvbigpOwoJCQkJfQoJCQl9LDEwMDApCgkJfSwKCgkJYWRkSW5pdEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0ieWlkb25nLWJ1dHRvbiBwbC1idXR0b24taW5pdCBidG4tdG9wIiBpZD0icGwtYnV0dG9uLWxpbmsiPjxzcGFuIGNsYXNzPSJ5aWRvbmctYnRuIj7kuIvovb3liqnmiYso5pyq54K55LquKTwvc3Bhbj48L2Rpdj5gKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCWlmICgkdG9vbFdyYXAubGVuZ3RoID4gMCkgewoJCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJCS8vY2xlYXJJbnRlcnZhbChpbnMpOwoJCQkJfQoJCQkJLy99LCA1MCk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQkkYnV0dG9uLnJlbW92ZUNsYXNzKCd5aWRvbmctYnV0dG9uJykuYWRkQ2xhc3MoJ3lpZG9uZy1zaGFyZS1idXR0b24nKTsKCQkJCS8vbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQlpZiAoJHRvb2xXcmFwLmxlbmd0aCA+IDApIHsKCQkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCQkvL2NsZWFySW50ZXJ2YWwoaW5zKTsKCQkJCX0KCQkJCS8vfSwgNTApOwoJCQl9CgkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCQl5aWRvbmcuYWRkSW5pdEJ1dHRvbigpOwoJCQkJfQoJCQl9LDEwMDApCgkJfSwKCgkJZ2V0UmFuZG9tU3RyaW5nKGxlbikgewoJCQlsZW4gPSBsZW4gfHwgMTY7CgkJCWxldCAkY2hhcnMgPSAnQUJDREVGR0hKS01OUFFSU1RXWFlaYWJjZGVmaGlqa21ucHJzdHd4eXoyMzQ1Njc4JzsKCQkJbGV0IG1heFBvcyA9ICRjaGFycy5sZW5ndGg7CgkJCWxldCBwd2QgPSAnJzsKCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCQkJcHdkICs9ICRjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbWF4UG9zKSk7CgkJCX0KCQkJcmV0dXJuIHB3ZDsKCQl9LAoKCQl1dG9iKHN0cikgewoJCQljb25zdCB1ID0gU3RyaW5nLmZyb21DaGFyQ29kZTsKCQkJcmV0dXJuIHN0ci5yZXBsYWNlKC9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRkZdfFteXHgwMC1ceDdGXS9nLCAodCkgPT4gewoJCQkJaWYgKHQubGVuZ3RoIDwgMikgewoJCQkJCWxldCBlID0gdC5jaGFyQ29kZUF0KDApOwoJCQkJCXJldHVybiBlIDwgMTI4ID8gdCA6IGUgPCAyMDQ4ID8gdSgxOTIgfCBlID4+PiA2KSArIHUoMTI4IHwgNjMgJiBlKSA6IHUoMjI0IHwgZSA+Pj4gMTIgJiAxNSkgKyB1KDEyOCB8IGUgPj4+IDYgJiA2MykgKyB1KDEyOCB8IDYzICYgZSk7CgkJCQl9CgkJCQllID0gNjU1MzYgKyAxMDI0ICogKHQuY2hhckNvZGVBdCgwKSAtIDU1Mjk2KSArICh0LmNoYXJDb2RlQXQoMSkgLSA1NjMyMCk7CgkJCQlyZXR1cm4gdSgyNDAgfCBlID4+PiAxOCAmIDcpICsgdSgxMjggfCBlID4+PiAxMiAmIDYzKSArIHUoMTI4IHwgZSA+Pj4gNiAmIDYzKSArIHUoMTI4IHwgNjMgJiBlKTsKCQkJfSk7CgkJfSwKCgkJZ2V0U2lnbihlLCB0LCBhLCBuKSB7CgkJCWxldCByID0gIiIsCgkJCQlpID0gIiI7CgkJCWlmICh0KSB7CgkJCQlsZXQgcyA9IE9iamVjdC5hc3NpZ24oe30sIHQpOwoJCQkJaSA9IEpTT04uc3RyaW5naWZ5KHMpLAoJCQkJCWkgPSBpLnJlcGxhY2UoL1xzKi9nLCAiIiksCgkJCQkJaSA9IGVuY29kZVVSSUNvbXBvbmVudChpKTsKCQkJCWxldCBjID0gaS5zcGxpdCgiIiksCgkJCQkJdSA9IGMuc29ydCgpOwoJCQkJaSA9IHUuam9pbigiIik7CgkJCX0KCQkJbGV0IEEgPSBtZDUoYmFzZS5lbmNvZGUodGhpcy51dG9iKGkpKSk7CgkJCWxldCBsID0gbWQ1KGEgKyAiOiIgKyBuKTsKCQkJcmV0dXJuIG1kNShBICsgbCkudG9VcHBlckNhc2UoKTsKCQl9LAoKCQlhc3luYyBnZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4KSB7CgkJCXRyeSB7CgkJCQlpZiAoaXRlbS5kb3dubG9hZFVybCkgcmV0dXJuIHsKCQkJCQlpbmRleCwKCQkJCQlkb3dubG9hZFVybDogaXRlbS5kb3dubG9hZFVybAoJCQkJfTsKCgkJCQlpZiAodGhpcy5kZXRlY3RQYWdlKCkgPT09ICdob21lJykgewoJCQkJCWxldCBib2R5ID0gewoJCQkJCQkiYXBwTmFtZSI6ICIiLAoJCQkJCQkiY29udGVudElEIjogaXRlbS5jb250ZW50SUQsCgkJCQkJCSJjb21tb25BY2NvdW50SW5mbyI6IHsiYWNjb3VudCI6IGl0ZW0ub3duZXIsICJhY2NvdW50VHlwZSI6IDF9CgkJCQkJfTsKCQkJCQlsZXQgdGltZSA9IG5ldyBEYXRlKCtuZXcgRGF0ZSgpICsgOCAqIDM2MDAgKiAxMDAwKS50b0pTT04oKS5zdWJzdHIoMCwgMTkpLnJlcGxhY2UoJ1QnLCAnICcpOwoJCQkJCWxldCBrZXkgPSB0aGlzLmdldFJhbmRvbVN0cmluZygxNik7CgkJCQkJbGV0IHNpZ24gPSB0aGlzLmdldFNpZ24odW5kZWZpbmVkLCBib2R5LCB0aW1lLCBrZXkpOwoKCQkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHBhbi5wY3NbMF0sIGJvZHksIHsKCQkJCQkJJ3gtaHVhd2VpLWNoYW5uZWxTcmMnOiAnMTAwMDAwMzQnLAoJCQkJCQkneC1pbm5lci1udHdrJzogJzInLAoJCQkJCQknbWNsb3VkLWNoYW5uZWwnOiAnMTAwMDEwMScsCgkJCQkJCSdtY2xvdWQtY2xpZW50JzogJzEwNzAxJywKCQkJCQkJJ21jbG91ZC1zaWduJzogdGltZSArICIsIiArIGtleSArICIsIiArIHNpZ24sCgkJCQkJCSdjb250ZW50LXR5cGUnOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04IiwKCQkJCQkJJ2NhbGxlcic6ICd3ZWInLAoJCQkJCQknQ01TLURFVklDRSc6ICdkZWZhdWx0JywKCQkJCQkJJ3gtRGV2aWNlSW5mbyc6ICd8fDl8Ny4xMS4wfGNocm9tZXwxMDIuMC4wLjB8fHx3aW5kb3dzIDEwfHx6aC1DTnx8fCcsCgkJCQkJCSd4LVN2Y1R5cGUnOiAnMScsCgkJCQkJfSk7CgkJCQkJaWYgKHJlcy5zdWNjZXNzKSB7CgkJCQkJCXJldHVybiB7CgkJCQkJCQlpbmRleCwKCQkJCQkJCWRvd25sb2FkVXJsOiByZXMuZGF0YS5kb3dubG9hZFVSTAoJCQkJCQl9OwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiB7CgkJCQkJCQlpbmRleCwKCQkJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCQkJfTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAodGhpcy5kZXRlY3RQYWdlKCkgPT09ICdzaGFyZScpIHsKCQkJCQlsZXQgdnVlRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmhvbWUtcGFnZSIpLl9fdnVlX187CgoJCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1sxXSwgYGxpbmtJZD0ke3Z1ZURvbS5saW5rSUR9JmNvbnRlbnRJZHM9JHtlbmNvZGVVUklDb21wb25lbnQodnVlRG9tLmN1cnJlbnRQYXRoLmlkICsgJy8nICsgaXRlbS5jb0lEKX0mY2F0YWxvZ0lkcz1gLCB7CgkJCQkJCSdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKCQkJCQl9KTsKCQkJCQlpZiAocmVzLmNvZGUgPT09IDApIHsKCQkJCQkJcmV0dXJuIHsKCQkJCQkJCWluZGV4LAoJCQkJCQkJZG93bmxvYWRVcmw6IHJlcy5kYXRhLnJlZHJVcmwKCQkJCQkJfTsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gewoJCQkJCQkJaW5kZXgsCgkJCQkJCQlkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOWIt+aWsOWQjuWGjeivleivleWQp34nCgkJCQkJCX07CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCX07CgkJCX0KCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCgkJCWxldCBxdWV1ZSA9IFtdOwoJCQlzZWxlY3RMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQlxdWV1ZS5wdXNoKHRoaXMuZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCkpOwoJCQl9KTsKCgkJCWNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXVlKTsKCQkJcmVzLmZvckVhY2godmFsID0+IHsKCQkJCXNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKCQkJfSk7CgoJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CgkJCXRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwoJCX0sCgoJCWdlbmVyYXRlRG9tKGxpc3QpIHsKCQkJbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKCQkJbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwoJCQlsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWlmICh2LmRpckV0YWcgfHwgdi5jYU5hbWUpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYuY29udGVudE5hbWUgfHwgdi5jb05hbWU7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LmNvbnRlbnRTaXplIHx8IHYuY29TaXplKTsKCQkJCWxldCBkbGluayA9IHYuZG93bmxvYWRVcmw7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQlhbGlua0FsbFRleHQgKz0gZGxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWNvcHkgcGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi26ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5aSN5Yi26ZO+5o6lPC9idXR0b24+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcGknKXsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbC1hcGkiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gO30KCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW10KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubWFpbl9maWxlX2xpc3QiKS5fX3Z1ZV9fLnNlbGVjdExpc3QubWFwKHZhbCA9PiB2YWwuaXRlbSk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWxldCB2dWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaG9tZS1wYWdlIikuX192dWVfXzsKCQkJCWxldCBmaWxlTGlzdCA9IHZ1ZURvbS5fY29tcHV0ZWRXYXRjaGVycy5maWxlTGlzdC52YWx1ZTsKCQkJCWxldCBkaXJMaXN0ID0gdnVlRG9tLl9jb21wdXRlZFdhdGNoZXJzLmRpckxpc3QudmFsdWU7CgkJCQlsZXQgc2VsZWN0ZWRGaWxlSW5kZXggPSB2dWVEb20uc2VsZWN0ZWRGaWxlOwoJCQkJbGV0IHNlbGVjdGVkRGlySW5kZXggPSB2dWVEb20uc2VsZWN0ZWREaXI7CgkJCQlsZXQgc2VsZWN0RmlsZUxpc3QgPSBmaWxlTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKCQkJCQlyZXR1cm4gc2VsZWN0ZWRGaWxlSW5kZXguaW5jbHVkZXMoaSk7CgkJCQl9KTsKCQkJCWxldCBzZWxlY3REaXJMaXN0ID0gZGlyTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKCQkJCQlyZXR1cm4gc2VsZWN0ZWREaXJJbmRleC5pbmNsdWRlcyhpKTsKCQkJCX0pOwoJCQkJcmV0dXJuIFsuLi5zZWxlY3RGaWxlTGlzdCwgLi4uc2VsZWN0RGlyTGlzdF07CgkJCX0KCQl9LAoKCQlkZXRlY3RQYWdlKCkgewoJCQlsZXQgaG9zdG5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTsKCQkJaWYgKC9eeXVuLy50ZXN0KGhvc3RuYW1lKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eY2FpeXVuLy50ZXN0KGhvc3RuYW1lKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0uZmlsZUV0YWcgfHwgc2VsZWN0TGlzdFtpXS5jb05hbWUpIHJldHVybiBmYWxzZTsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoKCQlzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CgkJCVN3YWwuZmlyZSh7CgkJCQl0aXRsZSwKCQkJCWh0bWwsCgkJCQlmb290ZXIsCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlwb3NpdGlvbjogJ2NlbnRlcicsLy90b3AKCQkJCXdpZHRoLAoJCQkJcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAoJCQkJY3VzdG9tQ2xhc3MsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScsCgkJCX0pOwoJCX0sCgoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCXB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcveWlkb25nLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjInKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjIveWlkb25nLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAibm8iKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQoYGh0dHBzOi8vZ2hwcm94eS5jb20vaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50L21haW4vY29uZmlnL3lpZG9uZy5qc29uYCwge30sICJ0ZXh0Iiwge30pOwoJCQkJcGFuID0gSlNPTi5wYXJzZShyZXMpOwoJCQl9IGVsc2UgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2docHJveHkuY29tL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC9tYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCAndjInKTsKCQkJfQoJCQlPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKCQkJcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fCBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwoJCX0KCX07CgoJLy8g5rK55bCP54y0CglsZXQgeW91eGlhb2hvdSA9ewoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJQYW5NZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2docHJveHkuY29tL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC9tYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9naHByb3h5LmNvbS9odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgoJCQlsZXQgJGJ1dHRvbiA9IGAKCQkJPGRpdiBjbGFzcz0ibmF2LWl0ZW0iPgoJCQkJPGRpdiBjbGFzcz0iZHJvcGRvd24td3JhcHBlciI+CgkJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGFyaWEtbGFiZWw9IijmlLkp5LiL6L295Yqp5omLIiBjbGFzcz0iZHJvcGRvd24tdGl0bGUiPgoJCQkJCQk8c3BhbiBjbGFzcz0idGl0bGUiPijmlLkp5LiL6L295Yqp5omL4qyH77iPPC9zcGFuPgoJCQkJCQk8c3BhbiBjbGFzcz0iYXJyb3cgZG93biI+PC9zcGFuPgoJCQkJCTwvYnV0dG9uPgoJCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSIo5pS5KeS4i+i9veWKqeaJiyIgY2xhc3M9Im1vYmlsZS1kcm9wZG93bi10aXRsZSI+CgkJCQkJCTxzcGFuIGNsYXNzPSJ0aXRsZSI+KOaUuSnkuIvovb3liqnmiYvirIfvuI88L3NwYW4+CgkJCQkJCTxzcGFuIGNsYXNzPSJhcnJvdyByaWdodCI+PC9zcGFuPgoJCQkJCTwvYnV0dG9uPgoJCQkJCTx1bCBjbGFzcz0ibmF2LWRyb3Bkb3duIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CgkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24taXRlbSI+CgkJCQkJCQk8aDQ+CgkJCQkJCQkJ5Yqp5omLCgkJCQkJCQk8L2g0PgoJCQkJCQkJPHVsIGNsYXNzPSJkcm9wZG93bi1zdWJpdGVtLXdyYXBwZXIiPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4taW5mbyBuYXYtbGluayI+CgkJCQkJCQkJCQnwn5ug77iPIOiwg+ivlSjmn6XnnIvmmpflj7cv5Y2P6K6uKQoJCQkJCQkJCQk8L2E+CgkJCQkJCQkJPC9saT4KCQkJCQkJCTwvdWw+CgkJCQkJCTwvbGk+CgkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24taXRlbSI+CgkJCQkJCQk8aDQ+CgkJCQkJCQkJ6YCJ6aG5CgkJCQkJCQk8L2g0PgoJCQkJCQkJPHVsIGNsYXNzPSJkcm9wZG93bi1zdWJpdGVtLXdyYXBwZXIiPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4tc2V0dGluZyBuYXYtbGluayI+CgkJCQkJCQkJCQnimpnvuI8g5Yqp5omL6K6+572uCgkJCQkJCQkJCTwvYT4KCQkJCQkJCQk8L2xpPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIG5hdi1saW5rIj4KCQkJCQkJCQkJCfCfk4Mg5pu05paw5pel5b+XCgkJCQkJCQkJCTwvYT4KCQkJCQkJCQk8L2xpPgoJCQkJCQkJPC91bD4KCQkJCQkJPC9saT4KCQkJCQk8L3VsPgoJCQkJPC9kaXY+CgkJCTwvZGl2PgoJCQlgOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1pbmZvJywgKCkgPT4gewoJCQkJYmFzZS5zaG93UGFuSW5mbygpOwoJCQl9KTsKCQkJCgkJCWZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7CgkJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LWxpbmtzIilbaV0uaW5uZXJIVE1MICs9ICRidXR0b24KCQkJfQoJCX0KCX0KCgoJLy8g6I635Y+W5Y6f6ISa5pys55qER3JlYXN5Rm9ya+S/oeaBr++8jOehruS/neayueWwj+eMtOacjeWKoeWZqOS/oeS7uwoJYmFzZS5mZXRjaFNjcmlwdEluZm8oJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MzY0NDYuanNvbicsIDUpLnRoZW4ocmVzID0+IHsKCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3NjcmlwdF92ZXJzaW9uJywgcmVzLnZlcnNpb24pOwoJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfc2NyaXB0X2F1dGhvcicsICdHcmVhc3lGb3JrJyk7CgkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19zY3JpcHRfbmFtZScsIHJlcy5uYW1lKTsKCX0pCgoJLy8g55So5LqO5rK55bCP54y05pyN5Yqh5Zmo5qOA5rWL55qE6ISa5pys5L+h5oGvCgljb25zdCBzY3JpcHRJbmZvID0gR01faW5mby5zY3JpcHQ7CgoJLy8g55So5LqO5rK55bCP54y05pyN5Yqh5Zmo5qOA5rWL55qE6ISa5pys5L2c6ICFCgljb25zdCByZWFsYXV0aG9yID0gc2NyaXB0SW5mby5hdXRob3I7Cgljb25zdCBhdXRob3IgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3NjcmlwdF9hdXRob3InKTsKCgkvLyDnlKjkuo7msrnlsI/njLTmnI3liqHlmajmo4DmtYvnmoTohJrmnKzlkI3np7AKCWNvbnN0IHJlYWxuYW1lID0gc2NyaXB0SW5mby5uYW1lOwoJY29uc3QgbmFtZSA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfc2NyaXB0X25hbWUnKTsKCgkvLyDnlKjkuo7msrnlsI/njLTmnI3liqHlmajmo4DmtYvnmoTohJrmnKzniYjmnKws6Ziy5q2i5pyN5Yqh5Zmo6L+U5Zue5pu05paw5L+h5oGvCgljb25zdCByZWFsdmVyc2lvbiA9IHNjcmlwdEluZm8udmVyc2lvbjsKCWNvbnN0IHZlcnNpb24gPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3NjcmlwdF92ZXJzaW9uJyk7CgoJLy8g6I635Y+W5pys6ISa5pys55qER3JlYXN5Rm9ya+S/oeaBr++8jOS7peaYvuekuuabtOaWsO+8jOaciUJ1Z++8jOWwseS4jeiOt+WPluS6huWQpwoJLypiYXNlLmZldGNoU2NyaXB0SW5mbygnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQ0OTI5MS5qc29uJywgNSkudGhlbihyZXMgPT4gewoJCWlmKHJlYWx2ZXJzaW9uIDwgcmVzLnZlcnNpb24pewoJCQl1cGRhdGUgPSBgCgkJCTxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIj4KCQkJCTxhIGNsYXNzPSJwbC1hIiBkYXRhLW5vLWluc3RhbnQ9IjEiIHN0eWxlPSJjb2xvcjojRjI0QzQzIiBocmVmPSIke3Jlcy5jb2RlX3VybH0iIHRhcmdldD0iX2JsYW5rIj4KCQkJCQk8c3ZnIHN0eWxlPSJhbmltYXRpb246IGxvYWQgMi41cyBjdWJpYy1iZXppZXIoMC4yMiwgMC42MSwgMC4zNiwgMSkgaW5maW5pdGU7IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiI+PHBhdGggZD0iTTE3MS4zMSA1NDkuMDI4Yy0yNC41NTgtMTUzLjU3MiA1OS44MDEtMzA4Ljc2IDIxMC40NDItMzY3LjQ3NyAxMTEuNjM3LTQzLjUzIDIzMi4wMDUtMjIuNzEgMzE3LjIzNiAzOS40N2wtNzIuNTI3IDExNy40OCAzMjUuMjQ1LTEuMjU0TDgzNS40NTkgMGwtNTkuNTQ3IDk2LjQyNkM2NTAuMzQgMTUuMTA0IDQ3OS4xNTYtMTEuNDkzIDMyOS4yNTggNDYuOTUgMTIxLjU3OCAxMjcuOTEgMi4wMzggMzM3LjI5IDI1LjY0IDU0OS4wM2gxNDUuNjd6IiBmaWxsPSIjRjI0QzQzIi8+PHBhdGggZD0iTTg1Mi42ODggNDY0Ljk2NmMyNC41MzYgMTUzLjU3Mi01OS43OCAzMDguNzgtMjEwLjQyMiAzNjcuNDc3LTEwMi42OTMgNDAuMDI0LTIxNS44NiAyNC45NC0zMDIuODc0LTI5LjAxOSAxNi41Ny0yNi44OTUgNjUuNTM3LTEwNi4xOTggNjUuNTM3LTEwNi4xOThMNTUuMTcgNjc2LjcwNCAyMDMuMTc2IDEwMjRsNjIuMDUzLTEwMC40ODRjMTI1LjU1MiA4MS4zMjIgMjc5LjU5MiAxMDEuOTkyIDQyOS40ODkgNDMuNTUgMjA3LjYzOC04MC45ODIgMzI3LjIyLTI5MC4zNCAzMDMuNjE4LTUwMi4wNThIODUyLjY4OHoiIGZpbGw9IiNGMjRDNDMiLz48L3N2Zz4KCQkJCQk8c3BhbiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiA1cHg7Ij7mm7TmlrDliLAke3Jlcy52ZXJzaW9ufTwvc3Bhbj4KCQkJCTwvYT4KCQkJPC9saT4KCQkJYDsKCQkJdXBkYXRlX2JhaWR1ID0gYAoJCQk8YSBzdHlsZT0iY29sb3I6I0YyNEM0MztkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1hIiBkYXRhLW5vLWluc3RhbnQ9IjEiIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXhpYW9ob3UuY29tL2luc3RhbGwuaHRtbD9mcm9tPXVwZGF0ZSIgdGFyZ2V0PSJfYmxhbmsiID4KCQkJCTxzdmcgc3R5bGU9ImFuaW1hdGlvbjogbG9hZCAyLjVzIGN1YmljLWJlemllcigwLjIyLCAwLjYxLCAwLjM2LCAxKSBpbmZpbml0ZTsiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEyIiBoZWlnaHQ9IjEyIj48cGF0aCBkPSJNMTcxLjMxIDU0OS4wMjhjLTI0LjU1OC0xNTMuNTcyIDU5LjgwMS0zMDguNzYgMjEwLjQ0Mi0zNjcuNDc3IDExMS42MzctNDMuNTMgMjMyLjAwNS0yMi43MSAzMTcuMjM2IDM5LjQ3bC03Mi41MjcgMTE3LjQ4IDMyNS4yNDUtMS4yNTRMODM1LjQ1OSAwbC01OS41NDcgOTYuNDI2QzY1MC4zNCAxNS4xMDQgNDc5LjE1Ni0xMS40OTMgMzI5LjI1OCA0Ni45NSAxMjEuNTc4IDEyNy45MSAyLjAzOCAzMzcuMjkgMjUuNjQgNTQ5LjAzaDE0NS42N3oiIGZpbGw9IiNGMjRDNDMiLz48cGF0aCBkPSJNODUyLjY4OCA0NjQuOTY2YzI0LjUzNiAxNTMuNTcyLTU5Ljc4IDMwOC43OC0yMTAuNDIyIDM2Ny40NzctMTAyLjY5MyA0MC4wMjQtMjE1Ljg2IDI0Ljk0LTMwMi44NzQtMjkuMDE5IDE2LjU3LTI2Ljg5NSA2NS41MzctMTA2LjE5OCA2NS41MzctMTA2LjE5OEw1NS4xNyA2NzYuNzA0IDIwMy4xNzYgMTAyNGw2Mi4wNTMtMTAwLjQ4NGMxMjUuNTUyIDgxLjMyMiAyNzkuNTkyIDEwMS45OTIgNDI5LjQ4OSA0My41NSAyMDcuNjM4LTgwLjk4MiAzMjcuMjItMjkwLjM0IDMwMy42MTgtNTAyLjA1OEg4NTIuNjg4eiIgZmlsbD0iI0YyNEM0MyIvPjwvc3ZnPgoJCQkJPHNwYW4gc3R5bGU9Im1hcmdpbi1yaWdodDogNXB4OyI+5pu05paw5YiwJHtyZXMudmVyc2lvbn08L3NwYW4+CgkJCTwvYT4KCQkJYDsKCQkJdXBkYXRlX2JhaWR1WCA9IGAKCQkJPGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAiPgoJCQkJPGEgY2xhc3M9InBsLWEiIGRhdGEtbm8taW5zdGFudD0iMSIgc3R5bGU9ImNvbG9yOiNGMjRDNDMiIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXhpYW9ob3UuY29tL2luc3RhbGwuaHRtbD9mcm9tPXVwZGF0ZSIgdGFyZ2V0PSJfYmxhbmsiPgoJCQkJCTxzdmcgc3R5bGU9ImFuaW1hdGlvbjogbG9hZCAyLjVzIGN1YmljLWJlemllcigwLjIyLCAwLjYxLCAwLjM2LCAxKSBpbmZpbml0ZTsiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEyIiBoZWlnaHQ9IjEyIj48cGF0aCBkPSJNMTcxLjMxIDU0OS4wMjhjLTI0LjU1OC0xNTMuNTcyIDU5LjgwMS0zMDguNzYgMjEwLjQ0Mi0zNjcuNDc3IDExMS42MzctNDMuNTMgMjMyLjAwNS0yMi43MSAzMTcuMjM2IDM5LjQ3bC03Mi41MjcgMTE3LjQ4IDMyNS4yNDUtMS4yNTRMODM1LjQ1OSAwbC01OS41NDcgOTYuNDI2QzY1MC4zNCAxNS4xMDQgNDc5LjE1Ni0xMS40OTMgMzI5LjI1OCA0Ni45NSAxMjEuNTc4IDEyNy45MSAyLjAzOCAzMzcuMjkgMjUuNjQgNTQ5LjAzaDE0NS42N3oiIGZpbGw9IiNGMjRDNDMiLz48cGF0aCBkPSJNODUyLjY4OCA0NjQuOTY2YzI0LjUzNiAxNTMuNTcyLTU5Ljc4IDMwOC43OC0yMTAuNDIyIDM2Ny40NzctMTAyLjY5MyA0MC4wMjQtMjE1Ljg2IDI0Ljk0LTMwMi44NzQtMjkuMDE5IDE2LjU3LTI2Ljg5NSA2NS41MzctMTA2LjE5OCA2NS41MzctMTA2LjE5OEw1NS4xNyA2NzYuNzA0IDIwMy4xNzYgMTAyNGw2Mi4wNTMtMTAwLjQ4NGMxMjUuNTUyIDgxLjMyMiAyNzkuNTkyIDEwMS45OTIgNDI5LjQ4OSA0My41NSAyMDcuNjM4LTgwLjk4MiAzMjcuMjItMjkwLjM0IDMwMy42MTgtNTAyLjA1OEg4NTIuNjg4eiIgZmlsbD0iI0YyNEM0MyIvPjwvc3ZnPgoJCQkJCTxzcGFuIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDVweDsiPuabtOaWsOWIsCR7cmVzLnZlcnNpb259PC9zcGFuPgoJCQkJPC9hPgoJCQk8L2xpPgoJCQlgOwoJCX0gZWxzZSB7CgkJCXVwZGF0ZSA9IGAKCQkJYDsKCQkJdXBkYXRlX2JhaWR1ID0gYAoJCQlgOwoJCQl1cGRhdGVfYmFpZHVYID0gYGA7CgkJfQoJfSkqLwoKCS8qLS0tIHdhaXRGb3JLZXlFbGVtZW50cygpOiDkuIDkuKrlrp7nlKjlh73mlbDvvIznlKjkuo5HcmVhc2Vtb25rZXnohJrmnKzvvIwKCeWug+WPr+S7peajgOa1i+WSjOWkhOeQhkFKQVjliqDovb3nmoTlhoXlrrnjgIIKCeS9v+eUqOekuuS+i++8mgoJCXdhaXRGb3JLZXlFbGVtZW50cyAoCgkJCSJkaXYuY29tbWVudHMiCgkJCSwgY29tbWVudENhbGxiYWNrRnVuY3Rpb24KCQkpOwoJCS8vIOmhtemdoueJueWumueahOWHveaVsO+8jOeUqOS6juWcqOaJvuWIsOiKgueCueaXtuaJp+ihjOaIkeS7rOaDs+imgeeahOaTjeS9nOOAggoJCWZ1bmN0aW9uIGNvbW1lbnRDYWxsYmFja0Z1bmN0aW9uIChqTm9kZSkgewoJCQlqTm9kZS50ZXh0ICgid2FpdEZvcktleUVsZW1lbnRzKCkg5pu05pS55LqG6L+Z5q615rOo6YeK44CCIik7CgkJfQoJ6YeN6KaB5o+Q56S677yaPGJyPui/meS4quWHveaVsOmcgOimgeS9oOeahOiEmuacrOWKoOi9veS6hmpRdWVyeeOAggoJKi8KCWZ1bmN0aW9uIHdhaXRGb3JLZXlFbGVtZW50cyhzZWxlY3RvclR4dCwgYWN0aW9uRnVuY3Rpb24sIGJXYWl0T25jZSwgaWZyYW1lU2VsZWN0b3IpIHsKCQl2YXIgdGFyZ2V0Tm9kZXMsIGJ0YXJnZXRzRm91bmQ7CgoJCWlmICh0eXBlb2YgaWZyYW1lU2VsZWN0b3IgPT0gInVuZGVmaW5lZCIpCgkJCXRhcmdldE5vZGVzID0gJChzZWxlY3RvclR4dCk7CgkJZWxzZQoJCQl0YXJnZXROb2RlcyA9ICQoaWZyYW1lU2VsZWN0b3IpLmNvbnRlbnRzKCkKCQkJCS5maW5kKHNlbGVjdG9yVHh0KTsKCgkJaWYgKHRhcmdldE5vZGVzICYmIHRhcmdldE5vZGVzLmxlbmd0aCA+IDApIHsKCQkJYnRhcmdldHNGb3VuZCA9IHRydWU7CgkJCXRhcmdldE5vZGVzLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJdmFyIGpUaGlzID0gJCh0aGlzKTsKCQkJCXZhciBhbHJlYWR5Rm91bmQgPSBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnKSB8fCBmYWxzZTsKCgkJCQlpZiAoIWFscmVhZHlGb3VuZCkgewoJCQkJCS8vLS0tIOiwg+eUqOi9veiNt+WHveaVsOOAggoJCQkJCXZhciBjYW5jZWxGb3VuZCA9IGFjdGlvbkZ1bmN0aW9uKGpUaGlzKTsKCQkJCQlpZiAoY2FuY2VsRm91bmQpIHsKCQkJCQkJYnRhcmdldHNGb3VuZCA9IGZhbHNlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWpUaGlzLmRhdGEoJ2FscmVhZHlGb3VuZCcsIHRydWUpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJYnRhcmdldHNGb3VuZCA9IGZhbHNlOwoJCX0KCgkJLy8tLS0g6I635Y+W6L+Z5Liq6YCJ5oup5Zmo55qE5a6a5pe25Zmo5o6n5Yi25Y+Y6YeP44CCCgkJdmFyIGNvbnRyb2xPYmogPSB3YWl0Rm9yS2V5RWxlbWVudHMuY29udHJvbE9iaiB8fCB7fTsKCQl2YXIgY29udHJvbEtleSA9IHNlbGVjdG9yVHh0LnJlcGxhY2UoL1teXHddL2csICJfIik7CgkJdmFyIHRpbWVDb250cm9sID0gY29udHJvbE9ialtjb250cm9sS2V5XTsKCgkJLy8tLS0g546w5Zyo5qC55o2u5oOF5Ya16K6+572u5oiW5riF6Zmk5a6a5pe25Zmo44CCCgkJaWYgKGJ0YXJnZXRzRm91bmQgJiYgYldhaXRPbmNlICYmIHRpbWVDb250cm9sKSB7CgkJCS8vLS0tIOWUr+S4gOmcgOimgea4hemZpOWumuaXtuWZqOeahOaDheWGteOAggoJCQljbGVhckludGVydmFsKHRpbWVDb250cm9sKTsKCQkJZGVsZXRlIGNvbnRyb2xPYmpbY29udHJvbEtleV0KCQl9IGVsc2UgewoJCQkvLy0tLSDlpoLmnpzpnIDopoHnmoTor53vvIzorr7nva7kuIDkuKrlrprml7blmajjgIIKCQkJaWYgKCF0aW1lQ29udHJvbCkgewoJCQkJdGltZUNvbnRyb2wgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CgkJCQkJd2FpdEZvcktleUVsZW1lbnRzKHNlbGVjdG9yVHh0LCBhY3Rpb25GdW5jdGlvbiwgYldhaXRPbmNlLCBpZnJhbWVTZWxlY3Rvcik7CgkJCQl9LCAzMDApOwoJCQkJY29udHJvbE9ialtjb250cm9sS2V5XSA9IHRpbWVDb250cm9sOwoJCQl9CgkJfQoJCXdhaXRGb3JLZXlFbGVtZW50cy5jb250cm9sT2JqID0gY29udHJvbE9iajsKCX0KCgkvLyDkuLvku6PnoIEKCWxldCBtYWluID0gewoJCWluaXQoKSB7CgkJCS8vIOWFiOWKoOi9vem7mOiupOiuvue9rgoJCQliYXNlLmluaXREZWZhdWx0Q29uZmlnKCk7CgkJCS8vIOWGjeWKoOi9vee9kemhteagt+W8jwoJCQliYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CgkJCS8vIOWIpOaWree9keebmOWcsOWdgOW5tuWKoOi9veWvueW6lOeahGluaXRQYW5MaW5rZXIKCQkJaWYgKC8ocGFufHl1bikuYmFpZHUuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQliYWlkdS5pbml0UGFuTGlua2VyKCk7CgkJCX0KCQkJaWYgKC93d3cuYWxpeXVuZHJpdmUuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQlhbGkuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvY2xvdWQuMTg5LmNuLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl0aWFueWkuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvcGFuLnh1bmxlaS5jb20vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKCQkJCXh1bmxlaS5pbml0UGFuTGlua2VyKCk7CgkJCX0KCQkJaWYgKC9wYW4ucXVhcmsuY24vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKCQkJCXF1YXJrLmluaXRQYW5MaW5rZXIoKTsKCQkJfQoJCQlpZiAoLyh5dW58Y2FpeXVuKS4xMzkuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl5aWRvbmcuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvd3d3LnlvdXhpYW9ob3UuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl5b3V4aWFvaG91LmluaXRQYW5MaW5rZXIoKTsKCQkJfQoJCX0KCX07CgltYWluLmluaXQoKTsKfSkoKTs=
Add Comment
Please, Sign In to add comment