BIG GRANDE COMEDY.
Photo goes here
- Podcasts
- Sketches
- Live Shows
- More!
CiAgLnRvcC1pbnRyby1lbWJlZHsKICAgIC0tb3JhbmdlOiNEQjhCM0I7IC0tY3JlYW06I0Y0RUVERDsgLS1pbms6IzI0MUMxMzsgLS10ZWFsLWRhcms6IzIzNEE0MzsgLS10ZWFsOiMzMzY2NUM7CiAgfQogIC50b3AtaW50cm8tZW1iZWQsIC50b3AtaW50cm8tZW1iZWQgKnsgYm94LXNpemluZzpib3JkZXItYm94OyB9CiAgLnRvcC1pbnRyby1lbWJlZHsKICAgIG1hcmdpbjowIGF1dG87IHBhZGRpbmc6MDsgZm9udC1mYW1pbHk6J0lCTSBQbGV4IE1vbm8nLG1vbm9zcGFjZTsgbWF4LXdpZHRoOjExMDBweDsKICB9CgogIC50b3AtaW50cm8tZW1iZWQgLnRpLWhlYWRsaW5lewogICAgZm9udC1mYW1pbHk6J0xpYnJlIEJhc2tlcnZpbGxlJyxzZXJpZjsgZm9udC13ZWlnaHQ6NzAwOwogICAgZm9udC1zaXplOmNsYW1wKDI4cHgsIDQuNnZ3LCA0NnB4KTsgbGluZS1oZWlnaHQ6MS4yNTsKICAgIGNvbG9yOnZhcigtLWluayk7IHRleHQtYWxpZ246Y2VudGVyOwogICAgbWFyZ2luOjAgMCA0MHB4OwogIH0KCiAgLnRvcC1pbnRyby1lbWJlZCAudGktcm93ewogICAgZGlzcGxheTpncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjsgZ2FwOjQ4cHg7IGFsaWduLWl0ZW1zOmNlbnRlcjsKICB9CgogIC50b3AtaW50cm8tZW1iZWQgLnRpLXBob3RvLXdyYXB7CiAgICBib3JkZXItcmFkaXVzOjI0cHg7IG92ZXJmbG93OmhpZGRlbjsgYXNwZWN0LXJhdGlvOjQvNTsKICAgIGJveC1zaGFkb3c6CiAgICAgIDAgNnB4IDE0cHggcmdiYSgzNiwyOCwxOSwwLjIyKSwKICAgICAgMCAyMHB4IDQwcHggcmdiYSgzNiwyOCwxOSwwLjIyKTsKICB9CiAgLnRvcC1pbnRyby1lbWJlZCAudGktcGhvdG8td3JhcCBpbWd7CiAgICB3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJTsgb2JqZWN0LWZpdDpjb3ZlcjsgZGlzcGxheTpibG9jazsKICB9CiAgLnRvcC1pbnRyby1lbWJlZCAudGktcGhvdG8tcGxhY2Vob2xkZXJ7CiAgICB3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJTsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOnZhcigtLXRlYWwpOyBjb2xvcjp2YXIoLS1jcmVhbSk7IGZvbnQtc2l6ZToxMnB4OyBsZXR0ZXItc3BhY2luZzowLjFlbTsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwogIH0KCiAgLnRvcC1pbnRyby1lbWJlZCAudGktbGlzdHsKICAgIGxpc3Qtc3R5bGU6bm9uZTsgbWFyZ2luOjA7IHBhZGRpbmc6MDsKICB9CiAgLnRvcC1pbnRyby1lbWJlZCAudGktbGlzdCBsaXsKICAgIGZvbnQtZmFtaWx5OidMaWJyZSBCYXNrZXJ2aWxsZScsc2VyaWY7IGZvbnQtd2VpZ2h0OjcwMDsKICAgIGZvbnQtc2l6ZTpjbGFtcCgyNHB4LCAzLjR2dywgMzhweCk7IGxpbmUtaGVpZ2h0OjEuMzU7CiAgICB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzowLjAxZW07CiAgfQogIC50b3AtaW50cm8tZW1iZWQgLnRpLWxpc3QgbGk6bnRoLWNoaWxkKG9kZCl7IGNvbG9yOnZhcigtLW9yYW5nZSk7IH0KICAudG9wLWludHJvLWVtYmVkIC50aS1saXN0IGxpOm50aC1jaGlsZChldmVuKXsgY29sb3I6dmFyKC0tdGVhbCk7IH0KCiAgLyogUmV2ZWFsLW9uLWxvYWQgKHRoaXMgc2VjdGlvbiBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgc28gaXQgZmFkZXMgaW4gb24KICAgICBwYWdlIGxvYWQgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgYSBzY3JvbGwgdHJpZ2dlciAtLSBzYW1lIGxpZ2h0d2VpZ2h0CiAgICAgbWVjaGFuaXNtIGFzIHRoZSByZXN0IG9mIHRoZSBwYWdlKS4gKi8KICAudG9wLWludHJvLWVtYmVkLnJldmVhbHsKICAgIG9wYWNpdHk6MDsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjBweCk7CiAgICB0cmFuc2l0aW9uOm9wYWNpdHkgLjdzIGVhc2UsIHRyYW5zZm9ybSAuN3MgZWFzZTsKICB9CiAgLnRvcC1pbnRyby1lbWJlZC5yZXZlYWwuaXMtdmlzaWJsZXsKICAgIG9wYWNpdHk6MTsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7CiAgfQoKICBAbWVkaWEgKG1heC13aWR0aDo3MDBweCl7CiAgICAudG9wLWludHJvLWVtYmVkIC50aS1yb3d7IGdyaWQtdGVtcGxhdGUtY29sdW1uczoxZnI7IGdhcDoyOHB4OyB9CiAgICAvKiBObyBmb3JjZWQgYXNwZWN0LXJhdGlvIGhlcmUgYW55bW9yZSAtLSBhIGZpeGVkIGNyb3AgYm94IHdhcyBjdXR0aW5nIG9mZgogICAgICAgZmFjZXMgb24gd2lkZSBncm91cCBwaG90b3MuIExldHRpbmcgaGVpZ2h0IGJlIG5hdHVyYWwgbWVhbnMgdGhlIHdob2xlCiAgICAgICBwaG90byBhbHdheXMgc2hvd3MsIHJlZ2FyZGxlc3Mgb2YgaXRzIHByb3BvcnRpb25zLiAqLwogICAgLnRvcC1pbnRyby1lbWJlZCAudGktcGhvdG8td3JhcHsgYXNwZWN0LXJhdGlvOmF1dG87IH0KICAgIC50b3AtaW50cm8tZW1iZWQgLnRpLXBob3RvLXdyYXAgaW1neyBoZWlnaHQ6YXV0bzsgfQogICAgLnRvcC1pbnRyby1lbWJlZCAudGktaGVhZGxpbmV7IG1hcmdpbi1ib3R0b206MjhweDsgfQogICAgLnRvcC1pbnRyby1lbWJlZCAudGktbGlzdHsgdGV4dC1hbGlnbjpjZW50ZXI7IH0KICAgIC50b3AtaW50cm8tZW1iZWQgLnRpLWxpc3QgbGl7IGZvbnQtc2l6ZToyNnB4OyB9CiAgfQoKICAvKiBUaGUgV29yZFByZXNzIEltYWdlIGJsb2NrIHRoYXQgc3VwcGxpZXMgdGhlIHBob3RvOiByZWFkIGJ5IEpTIGF0IGxvYWQsCiAgICAgdGhlbiBoaWRkZW4gc28gaXQgZG9lc24ndCBhbHNvIGRpc3BsYXkgaW4gaXRzIG5hdGl2ZSBXb3JkUHJlc3Mgc3BvdC4gKi8KICAuaW50cm8tcGhvdG8tc291cmNleyBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsgfQo=
CihmdW5jdGlvbigpewogIC8vIC0tLS0gUGhvdG86IHN1cHBsaWVkIHZpYSBhIHNpbmdsZSBXb3JkUHJlc3MgSW1hZ2UgYmxvY2sgLS0tLQogIC8vIEFkZCBhbiBJbWFnZSBibG9jayBhbnl3aGVyZSBvbiB0aGUgcGFnZSwgdXBsb2FkIHRoZSBncm91cCBwaG90bywgdGhlbgogIC8vIGdpdmUgdGhlIElNQUdFIGJsb2NrIHRoZSBDU1MgY2xhc3MgImludHJvLXBob3RvLXNvdXJjZSIgKEJsb2NrIHNldHRpbmdzCiAgLy8gLT4gQWR2YW5jZWQgLT4gQWRkaXRpb25hbCBDU1MgY2xhc3MoZXMpKS4gVGhpcyBzY3JpcHQgcmVhZHMgaXQgYW5kCiAgLy8gaGlkZXMgdGhlIGJsb2NrJ3Mgb3duIG5hdGl2ZSBkaXNwbGF5LgogIGZ1bmN0aW9uIGhpZ2hlc3RSZXNTcmMoaW1nKXsKICAgIGNvbnN0IGZ1bGxVcmwgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZ1bGwtdXJsJyk7CiAgICBpZiAoZnVsbFVybCkgcmV0dXJuIGZ1bGxVcmw7CiAgICBjb25zdCBzcmNzZXQgPSBpbWcuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKTsKICAgIGlmIChzcmNzZXQpIHsKICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHNyY3NldC5zcGxpdCgnLCcpLm1hcChwYXJ0ID0+IHsKICAgICAgICBjb25zdCBiaXRzID0gcGFydC50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoKGJpdHNbMV0gfHwgJycpLnJlcGxhY2UoJ3cnLCAnJyksIDEwKSB8fCAwOwogICAgICAgIHJldHVybiB7IHVybDogYml0c1swXSwgd2lkdGggfTsKICAgICAgfSk7CiAgICAgIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYi53aWR0aCAtIGEud2lkdGgpOwogICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggJiYgY2FuZGlkYXRlc1swXS51cmwpIHJldHVybiBjYW5kaWRhdGVzWzBdLnVybDsKICAgIH0KICAgIHJldHVybiBpbWcuc3JjOwogIH0KCiAgZnVuY3Rpb24gaW5pdCgpewogICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmludHJvLXBob3RvLXNvdXJjZSBpbWcnKTsKICAgIGNvbnN0IHdyYXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGlQaG90b1dyYXAnKTsKICAgIGlmIChzb3VyY2UgJiYgd3JhcCkgewogICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgaW1nLnNyYyA9IGhpZ2hlc3RSZXNTcmMoc291cmNlKTsKICAgICAgaW1nLmFsdCA9IHNvdXJjZS5hbHQgfHwgJ0JpZyBHcmFuZGUnOwogICAgICBpbWcubG9hZGluZyA9ICdlYWdlcic7CiAgICAgIHdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoaW1nKTsKICAgIH0KCiAgICAvLyBSZXZlYWwtb24tbG9hZAogICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9wLWludHJvLWVtYmVkJyk7CiAgICBpZiAoZWwpIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZCgncmV2ZWFsJyk7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgICAgICAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHsKICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgICBlbnRyeS50YXJnZXQuY2xhc3NMaXN0LmFkZCgnaXMtdmlzaWJsZScpOwogICAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoZW50cnkudGFyZ2V0KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwgeyB0aHJlc2hvbGQ6IDAuMDUgfSk7CiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWwpOwogICAgfQogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgIGluaXQoKTsKICB9IGVsc2UgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBpbml0KTsKICB9Cn0pKCk7Cg==

Some Quick Laughs
Click any video for more
CiAgLnNob3J0cy1ncmlkLWVtYmVkewogICAgLS1vcmFuZ2U6I0RCOEIzQjsgLS1jcmVhbTojRjRFRUREOyAtLWluazojMjQxQzEzOyAtLXRlYWwtZGFyazojMjM0QTQzOyAtLXRlYWw6IzMzNjY1QzsKICB9CiAgLnNob3J0cy1ncmlkLWVtYmVkLCAuc2hvcnRzLWdyaWQtZW1iZWQgKnsgYm94LXNpemluZzpib3JkZXItYm94OyB9CiAgLnNob3J0cy1ncmlkLWVtYmVkewogICAgbWFyZ2luOjAgYXV0bzsgcGFkZGluZzo0MHB4IDIwcHggNjBweDsgZm9udC1mYW1pbHk6J0thcmxhJyxzYW5zLXNlcmlmOyBtYXgtd2lkdGg6MTEwMHB4OwogICAgYm9yZGVyLXRvcDozcHggc29saWQgdmFyKC0tb3JhbmdlKTsKICAgIGJvcmRlci1ib3R0b206M3B4IHNvbGlkIHZhcigtLW9yYW5nZSk7CiAgfQoKICAuc2hvcnRzLWdyaWQtZW1iZWQgLnNnLXRpdGxlLWJsb2NreyB0ZXh0LWFsaWduOmNlbnRlcjsgcGFkZGluZzowIDEwcHggMjJweDsgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctdGl0bGUtYmxvY2sgaDJ7CiAgICBmb250LWZhbWlseTonTGlicmUgQmFza2VydmlsbGUnLHNlcmlmOyBmb250LXdlaWdodDo3MDA7IGZvbnQtc2l6ZTpjbGFtcCgyOHB4LCA0LjZ2dywgNDZweCk7IGxpbmUtaGVpZ2h0OjEuMjU7CiAgICBtYXJnaW46MDsgY29sb3I6dmFyKC0taW5rKTsKICB9CiAgLnNob3J0cy1ncmlkLWVtYmVkIC5zZy10aXRsZS1ibG9jayBwewogICAgZm9udC1mYW1pbHk6J0thcmxhJyxzYW5zLXNlcmlmOyBmb250LXNpemU6Y2xhbXAoMTRweCwgMS43dncsIDE3cHgpOyBsZXR0ZXItc3BhY2luZzowLjFlbTsKICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsgY29sb3I6dmFyKC0tdGVhbC1kYXJrKTsgbWFyZ2luOjhweCAwIDA7CiAgfQoKICAuc2hvcnRzLWdyaWQtZW1iZWQgLnNnLWdyaWR7CiAgICBkaXNwbGF5OmdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDIsIDFmcik7CiAgICBnYXA6MThweDsKICB9CiAgLnNob3J0cy1ncmlkLWVtYmVkIC5zZy1jYXJkewogICAgcG9zaXRpb246cmVsYXRpdmU7CiAgICBhc3BlY3QtcmF0aW86OS8xNjsKICAgIGJvcmRlci1yYWRpdXM6MTRweDsKICAgIG92ZXJmbG93OmhpZGRlbjsKICAgIGJhY2tncm91bmQ6dmFyKC0taW5rKTsKICAgIGJveC1zaGFkb3c6MCA2cHggMTRweCByZ2JhKDM2LDI4LDE5LDAuMjIpLCAwIDE2cHggMzJweCByZ2JhKDM2LDI4LDE5LDAuMik7CiAgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctcG9zdGVyewogICAgcG9zaXRpb246YWJzb2x1dGU7IGluc2V0OjA7IHdpZHRoOjEwMCU7IGhlaWdodDoxMDAlOyBvYmplY3QtZml0OmNvdmVyOwogICAgY3Vyc29yOnBvaW50ZXI7CiAgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctcG9zdGVyLXBsYWNlaG9sZGVyewogICAgcG9zaXRpb246YWJzb2x1dGU7IGluc2V0OjA7IHdpZHRoOjEwMCU7IGhlaWdodDoxMDAlOwogICAgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXI7CiAgICBjdXJzb3I6cG9pbnRlcjsKICB9CiAgLnNob3J0cy1ncmlkLWVtYmVkIC5zZy1kaW17CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsgaW5zZXQ6MDsgYmFja2dyb3VuZDpyZ2JhKDE1LDEwLDgsMC4yMik7IHBvaW50ZXItZXZlbnRzOm5vbmU7CiAgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctcGxheWJ0bnsKICAgIHBvc2l0aW9uOmFic29sdXRlOyB0b3A6NTAlOyBsZWZ0OjUwJTsgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOwogICAgd2lkdGg6NTJweDsgaGVpZ2h0OjUycHg7IGJvcmRlci1yYWRpdXM6NTAlOwogICAgYmFja2dyb3VuZDpyZ2JhKDI0NCwyMzgsMjI5LDAuOTQpOyBib3JkZXI6MnB4IHNvbGlkIHZhcigtLXRlYWwtZGFyayk7CiAgICBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsganVzdGlmeS1jb250ZW50OmNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7IHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMTVzIGVhc2UsIGJhY2tncm91bmQgLjE1cyBlYXNlOwogIH0KICAuc2hvcnRzLWdyaWQtZW1iZWQgLnNnLWNhcmQ6aG92ZXIgLnNnLXBsYXlidG57CiAgICB0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSkgc2NhbGUoMS4wOCk7IGJhY2tncm91bmQ6dmFyKC0tb3JhbmdlKTsKICB9CiAgLnNob3J0cy1ncmlkLWVtYmVkIC5zZy1wbGF5YnRuIHN2Z3sgd2lkdGg6MThweDsgaGVpZ2h0OjE4cHg7IG1hcmdpbi1sZWZ0OjJweDsgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctcGxheWJ0biBzdmcgcGF0aHsgZmlsbDp2YXIoLS10ZWFsLWRhcmspOyB9CiAgLnNob3J0cy1ncmlkLWVtYmVkIC5zZy1jYXJkOmhvdmVyIC5zZy1wbGF5YnRuIHN2ZyBwYXRoeyBmaWxsOnZhcigtLWNyZWFtKTsgfQoKICAuc2hvcnRzLWdyaWQtZW1iZWQgLnNnLWNhcHRpb257CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDowOyByaWdodDowOyBib3R0b206MDsgei1pbmRleDo0OwogICAgcGFkZGluZzoxMnB4OyBwb2ludGVyLWV2ZW50czpub25lOwogICAgYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE1LDEwLDgsMCkgMCUsIHJnYmEoMTAsNyw1LDAuOCkgMTAwJSk7CiAgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctY2FwdGlvbiBwewogICAgZm9udC1mYW1pbHk6J0thcmxhJyxzYW5zLXNlcmlmOyBmb250LXdlaWdodDo2MDA7IGZvbnQtc2l6ZToxMi41cHg7IGNvbG9yOnZhcigtLWNyZWFtKTsKICAgIG1hcmdpbjowOyB0ZXh0LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwwLjYpOwogICAgZGlzcGxheTotd2Via2l0LWJveDsgLXdlYmtpdC1saW5lLWNsYW1wOjI7IC13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDsgb3ZlcmZsb3c6aGlkZGVuOwogIH0KCiAgLnNob3J0cy1ncmlkLWVtYmVkIC5zZy1pZnJhbWUtd3JhcHsgcG9zaXRpb246YWJzb2x1dGU7IGluc2V0OjA7IH0KICAuc2hvcnRzLWdyaWQtZW1iZWQgLnNnLWlmcmFtZS13cmFwIGlmcmFtZXsgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IGJvcmRlcjowOyBkaXNwbGF5OmJsb2NrOyB9CgogIEBtZWRpYSAobWF4LXdpZHRoOjcwMHB4KXsKICAgIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctZ3JpZHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjsgZ2FwOjE2cHg7IH0KICB9CgoKICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBNb2JpbGUgInJlZWwgZmVlZCIgYWRkaXRpb25zIOKAlCBkZXNrdG9wIGlzIHVuYWZmZWN0ZWQuCiAgICAgQWN0aXZlIG9ubHkgd2hlbiB0aGUgZW1iZWQgaGFzIC5zZy1mZWVkLW1vZGUgKHNldCBieSBKUyBvbgogICAgIHNjcmVlbnMgPD0gNzAwcHgpLiBDYXJkcyBhdXRvcGxheSBtdXRlZCBhcyB0aGV5IHNjcm9sbCBpbnRvCiAgICAgdmlldzsgYSBzcGVha2VyIGJ1dHRvbiB0dXJucyBzb3VuZCBvbi4KICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KICAuc2hvcnRzLWdyaWQtZW1iZWQgLnNnLWF1ZGlvLWJ0bnsKICAgIGRpc3BsYXk6bm9uZTsgcG9zaXRpb246YWJzb2x1dGU7IHRvcDoxMnB4OyByaWdodDoxMnB4OyB6LWluZGV4OjY7CiAgICB3aWR0aDo0NHB4OyBoZWlnaHQ6NDRweDsgYm9yZGVyLXJhZGl1czo1MCU7IGJvcmRlcjowOyBjdXJzb3I6cG9pbnRlcjsgcGFkZGluZzowOwogICAgYmFja2dyb3VuZDpyZ2JhKDE1LDEwLDgsMC41NSk7IC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOmJsdXIoNHB4KTsgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNHB4KTsKICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsganVzdGlmeS1jb250ZW50OmNlbnRlcjsKICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246YmFja2dyb3VuZCAuMTVzIGVhc2UsIHRyYW5zZm9ybSAuMTVzIGVhc2U7CiAgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctYXVkaW8tYnRuOmFjdGl2ZXsgdHJhbnNmb3JtOnNjYWxlKDAuOTIpOyB9CiAgLnNob3J0cy1ncmlkLWVtYmVkIC5zZy1hdWRpby1idG4gc3ZneyB3aWR0aDoyMHB4OyBoZWlnaHQ6MjBweDsgZGlzcGxheTpibG9jazsgfQogIC5zaG9ydHMtZ3JpZC1lbWJlZCAuc2ctYXVkaW8tYnRuIHN2ZyBwYXRoeyBmaWxsOnZhcigtLWNyZWFtKTsgfQoKICAuc2hvcnRzLWdyaWQtZW1iZWQgLnNnLXNvdW5kLWhpbnR7CiAgICBkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OjUwJTsgYm90dG9tOjcwcHg7IHRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpOwogICAgei1pbmRleDo2OyBwYWRkaW5nOjdweCAxNXB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBwb2ludGVyLWV2ZW50czpub25lOyB3aGl0ZS1zcGFjZTpub3dyYXA7CiAgICBiYWNrZ3JvdW5kOnJnYmEoMTUsMTAsOCwwLjYpOyBjb2xvcjp2YXIoLS1jcmVhbSk7CiAgICBmb250LWZhbWlseTonS2FybGEnLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OjYwMDsgZm9udC1zaXplOjEycHg7IGxldHRlci1zcGFjaW5nOjAuMDNlbTsKICB9CgogIEBtZWRpYSAobWF4LXdpZHRoOjcwMHB4KXsKICAgIC8qIEVhY2ggY2FyZCBmaWxscyBtb3N0IG9mIHRoZSBzY3JlZW4sIGxlYXZpbmcgYSBwZWVrIG9mIHRoZSBuZXh0IG9uZS4gKi8KICAgIC5zaG9ydHMtZ3JpZC1lbWJlZC5zZy1mZWVkLW1vZGUgLnNnLWdyaWR7IGdhcDoxOHB4OyB9CiAgICAuc2hvcnRzLWdyaWQtZW1iZWQuc2ctZmVlZC1tb2RlIC5zZy1jYXJkewogICAgICBoZWlnaHQ6ODJ2aDsgYXNwZWN0LXJhdGlvOjkvMTY7IHdpZHRoOmF1dG87IGp1c3RpZnktc2VsZjpjZW50ZXI7CiAgICAgIHNjcm9sbC1tYXJnaW46MTRweDsKICAgIH0KICAgIC8qIEF1dG9wbGF5IGhhbmRsZXMgcGxheWJhY2ssIHNvIGhpZGUgdGhlIGNlbnRlcmVkIHBsYXkgYnV0dG9uIGluIGZlZWQgbW9kZS4gKi8KICAgIC5zaG9ydHMtZ3JpZC1lbWJlZC5zZy1mZWVkLW1vZGUgLnNnLXBsYXlidG57IGRpc3BsYXk6bm9uZTsgfQogICAgLyogU3BlYWtlciArIGhpbnQgc2hvdyBvbiB0aGUgY2FyZCB0aGF0J3MgY3VycmVudGx5IGFjdGl2ZS4gKi8KICAgIC5zaG9ydHMtZ3JpZC1lbWJlZC5zZy1mZWVkLW1vZGUgLnNnLWNhcmQuc2ctYWN0aXZlIC5zZy1hdWRpby1idG57IGRpc3BsYXk6ZmxleDsgfQogICAgLnNob3J0cy1ncmlkLWVtYmVkLnNnLWZlZWQtbW9kZSAuc2ctY2FyZC5zZy1hY3RpdmUgLnNnLXNvdW5kLWhpbnR7IGRpc3BsYXk6YmxvY2s7IH0KICAgIC8qIE9uY2UgdGhlIHZpZXdlciB0dXJucyBzb3VuZCBvbiwgdGhlIGhpbnQgZ29lcyBhd2F5IGV2ZXJ5d2hlcmUuICovCiAgICAuc2hvcnRzLWdyaWQtZW1iZWQuc2ctYXVkaW8tb24gLnNnLXNvdW5kLWhpbnR7IGRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyB9CiAgfQoKICAvKiBUaGUgV29yZFByZXNzIEdhbGxlcnkgYmxvY2sgdGhhdCBzdXBwbGllcyBwb3N0ZXJzL2xpbmtzOiByZWFkIGJ5IEpTIGF0CiAgICAgbG9hZCwgdGhlbiBoaWRkZW4uICovCiAgLnNob3J0cy1ncmlkLXNvdXJjZXsgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7IH0K
KGZ1bmN0aW9uKCl7CiAgY29uc3QgRkFMTEJBQ0tfQ09MT1JTID0gWycjMzM2NjVDJywnIzlDNDQzNicsJyNCNTc2M0EnLCcjNUM3QzhBJywnIzZCNUI3MycsJyM0RjdBNkUnXTsKICBjb25zdCBGQUxMQkFDS19TTElERVMgPSBbCiAgICB7IHRpdGxlOiAnQSBxdWljayBvbmUnIH0sIHsgdGl0bGU6ICdCZWhpbmQgdGhlIHNjZW5lcycgfSwKICAgIHsgdGl0bGU6ICdGYW4gZmF2b3JpdGUnIH0sIHsgdGl0bGU6ICdOZXcgY2xpcCcgfQogIF07CgogIGNvbnN0IHBsYXlJY29uU3ZnID0gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNOCA1djE0bDExLTd6Ii8+PC9zdmc+JzsKICAvLyBTcGVha2VyIGljb25zIGZvciB0aGUgbW9iaWxlIHNvdW5kIHRvZ2dsZS4KICBjb25zdCBzcGtPZmZTdmcgPSAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0zIDl2Nmg0bDUgNVY0TDcgOUgzem0xMy41IDNhNC41IDQuNSAwIDAgMC0yLjUtNC4wM3YyLjJsMi40NSAyLjQ1Yy4wMy0uMi4wNS0uNDEuMDUtLjYyek0xOSAxMmMwIC45NC0uMiAxLjgyLS41NCAyLjY0bDEuNTEgMS41MUE4Ljk0IDguOTQgMCAwIDAgMjEgMTJjMC00LjI4LTIuOTktNy44Ni03LTguNzd2Mi4wNmMyLjg5Ljg2IDUgMy41NCA1IDYuNzF6bS05LjczLTYuNzNMNC4yNyAzIDMgNC4yNyA3LjczIDlIM3Y2aDRsNSA1di02LjczbDQuMjUgNC4yNWMtLjY3LjUyLTEuNDIuOTMtMi4yNSAxLjE4djIuMDZhOC45OSA4Ljk5IDAgMCAwIDMuNjktMS44MUwxOS43MyAyMSAyMSAxOS43MyAxMiAxMC43MyA5LjI3IDUuMjd6Ii8+PC9zdmc+JzsKICBjb25zdCBzcGtPblN2ZyAgPSAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0zIDl2Nmg0bDUgNVY0TDcgOUgzem0xMy41IDNhNC41IDQuNSAwIDAgMC0yLjUtNC4wM3Y4LjA2QTQuNSA0LjUgMCAwIDAgMTYuNSAxMnpNMTQgMy4yM3YyLjA2YTcuMDEgNy4wMSAwIDAgMSAwIDEzLjQydjIuMDZjNC4wMS0uOTEgNy00LjQ5IDctOC43N3MtMi45OS03Ljg2LTctOC43N3oiLz48L3N2Zz4nOwoKICBjb25zdCBNT0JJTEVfUSA9ICcobWF4LXdpZHRoOjcwMHB4KSc7CgogIGZ1bmN0aW9uIHBhcnNlWW91VHViZUlkKHVybCl7CiAgICBpZiAoIXVybCkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBtID0gdXJsLm1hdGNoKC8oPzp5b3V0dWJlXC5jb21cLyg/OndhdGNoXD92PXxzaG9ydHNcLyl8eW91dHVcLmJlXC8pKFthLXpBLVowLTlfLV17Nix9KS8pOwogICAgcmV0dXJuIG0gPyBtWzFdIDogbnVsbDsKICB9CgogIGZ1bmN0aW9uIGhpZ2hlc3RSZXNTcmMoaW1nKXsKICAgIGNvbnN0IGZ1bGxVcmwgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZ1bGwtdXJsJyk7CiAgICBpZiAoZnVsbFVybCkgcmV0dXJuIGZ1bGxVcmw7CiAgICBjb25zdCBzcmNzZXQgPSBpbWcuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKTsKICAgIGlmIChzcmNzZXQpIHsKICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHNyY3NldC5zcGxpdCgnLCcpLm1hcChwYXJ0ID0+IHsKICAgICAgICBjb25zdCBiaXRzID0gcGFydC50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoKGJpdHNbMV0gfHwgJycpLnJlcGxhY2UoJ3cnLCAnJyksIDEwKSB8fCAwOwogICAgICAgIHJldHVybiB7IHVybDogYml0c1swXSwgd2lkdGggfTsKICAgICAgfSk7CiAgICAgIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYi53aWR0aCAtIGEud2lkdGgpOwogICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggJiYgY2FuZGlkYXRlc1swXS51cmwpIHJldHVybiBjYW5kaWRhdGVzWzBdLnVybDsKICAgIH0KICAgIHJldHVybiBpbWcuc3JjOwogIH0KCiAgLy8gLS0tLSBDb250ZW50IHN1cHBsaWVkIHZpYSBhIFdvcmRQcmVzcyBHYWxsZXJ5IGJsb2NrIC0tLS0KICAvLyBBZGQgYSBHYWxsZXJ5IGJsb2NrLCB1cGxvYWQgYSBwb3N0ZXIvdGh1bWJuYWlsIHBob3RvIGZvciBlYWNoIFNob3J0LAogIC8vIHRoZW4gZ2l2ZSB0aGUgR0FMTEVSWSBibG9jayB0aGUgQ1NTIGNsYXNzICJzaG9ydHMtZ3JpZC1zb3VyY2UiLiBGb3IgZWFjaCBwaG90bzoKICAvLyAgIC0gQWx0IFRleHQgLT4gdGhlIHRpdGxlL2NhcHRpb24gc2hvd24gb24gdGhlIGNhcmQKICAvLyAgIC0gTGluayAoQ3VzdG9tIFVSTCwgc2V0IG9uIHRoZSBpbWFnZSBpdHNlbGYpIC0+IHRoZSBZb3VUdWJlIFNob3J0cyBVUkwKICBmdW5jdGlvbiBmaW5kU2xpZGVzRnJvbVdQKCl7CiAgICBjb25zdCBzb3VyY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2hvcnRzLWdyaWQtc291cmNlJyk7CiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBpbWdzID0gQXJyYXkuZnJvbShzb3VyY2UucXVlcnlTZWxlY3RvckFsbCgnaW1nJykpOwogICAgaWYgKCFpbWdzLmxlbmd0aCkgcmV0dXJuIG51bGw7CgogICAgY29uc3Qgc2xpZGVzID0gW107CiAgICBpbWdzLmZvckVhY2goKGltZywgaSkgPT4gewogICAgICBjb25zdCB0aXRsZSA9IGltZy5hbHQgfHwgKCdTaG9ydCAnICsgKGkgKyAxKSk7CiAgICAgIGNvbnN0IGxpbmtFbCA9IGltZy5jbG9zZXN0KCdhJyk7CiAgICAgIGNvbnN0IHJhd1VybCA9IGxpbmtFbCA/IGxpbmtFbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA6IG51bGw7CiAgICAgIGNvbnN0IHZpZGVvSWQgPSBwYXJzZVlvdVR1YmVJZChyYXdVcmwpOwogICAgICBpZiAoIXZpZGVvSWQpIHJldHVybjsKICAgICAgc2xpZGVzLnB1c2goeyBwb3N0ZXI6IGhpZ2hlc3RSZXNTcmMoaW1nKSwgdGl0bGUsIHZpZGVvSWQgfSk7CiAgICB9KTsKICAgIHJldHVybiBzbGlkZXMubGVuZ3RoID8gc2xpZGVzIDogbnVsbDsKICB9CgogIC8vIC0tLS0gWW91VHViZSBJRnJhbWUgUGxheWVyIEFQSSBsb2FkZXIgKHNoYXJlZCwgbG9hZC1vbmNlKSAtLS0tCiAgbGV0IHl0QXBpUHJvbWlzZSA9IG51bGw7CiAgZnVuY3Rpb24gbG9hZFlUQXBpKCl7CiAgICBpZiAod2luZG93LllUICYmIHdpbmRvdy5ZVC5QbGF5ZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LllUKTsKICAgIGlmICh5dEFwaVByb21pc2UpIHJldHVybiB5dEFwaVByb21pc2U7CiAgICB5dEFwaVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKXsKICAgICAgY29uc3QgcHJldiA9IHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeTsKICAgICAgd2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5ID0gZnVuY3Rpb24oKXsKICAgICAgICBpZiAodHlwZW9mIHByZXYgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgcHJldigpOyB9IGNhdGNoKGUpe30gfQogICAgICAgIHJlc29sdmUod2luZG93LllUKTsKICAgICAgfTsKICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1zZy15dF0nKSkgewogICAgICAgIGNvbnN0IHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgIHRhZy5zcmMgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7CiAgICAgICAgdGFnLnNldEF0dHJpYnV0ZSgnZGF0YS1zZy15dCcsICcxJyk7CiAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGFnKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4geXRBcGlQcm9taXNlOwogIH0KCiAgLy8gLS0tLSBTaGFyZWQgcG9zdGVyIGJ1aWxkZXIgKHVzZWQgYnkgYm90aCBkZXNrdG9wIGFuZCBmZWVkKSAtLS0tCiAgZnVuY3Rpb24gYnVpbGRDYXJkQmFzZShjYXJkLCBzLCBpKXsKICAgIGNhcmQuaW5uZXJIVE1MID0gJyc7CiAgICBpZiAocy5wb3N0ZXIpIHsKICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgIGltZy5jbGFzc05hbWUgPSAnc2ctcG9zdGVyJzsKICAgICAgaW1nLnNyYyA9IHMucG9zdGVyOwogICAgICBpbWcuYWx0ID0gcy50aXRsZSB8fCAoJ1Nob3J0ICcgKyAoaSArIDEpKTsKICAgICAgaW1nLmxvYWRpbmcgPSBpIDwgNCA/ICdlYWdlcicgOiAnbGF6eSc7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoaW1nKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHBoLmNsYXNzTmFtZSA9ICdzZy1wb3N0ZXItcGxhY2Vob2xkZXInOwogICAgICBwaC5zdHlsZS5iYWNrZ3JvdW5kID0gcy5jb2xvciB8fCAnIzMzNjY1Qyc7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQocGgpOwogICAgfQogICAgY29uc3QgZGltID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkaW0uY2xhc3NOYW1lID0gJ3NnLWRpbSc7CiAgICBjYXJkLmFwcGVuZENoaWxkKGRpbSk7CgogICAgY29uc3QgcGxheUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcGxheUJ0bi5jbGFzc05hbWUgPSAnc2ctcGxheWJ0bic7CiAgICBwbGF5QnRuLmlubmVySFRNTCA9IHBsYXlJY29uU3ZnOwogICAgY2FyZC5hcHBlbmRDaGlsZChwbGF5QnRuKTsKCiAgICBpZiAocy50aXRsZSkgewogICAgICBjb25zdCBjYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY2FwLmNsYXNzTmFtZSA9ICdzZy1jYXB0aW9uJzsKICAgICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsKICAgICAgcC50ZXh0Q29udGVudCA9IHMudGl0bGU7CiAgICAgIGNhcC5hcHBlbmRDaGlsZChwKTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChjYXApOwogICAgfQogIH0KCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gIERFU0tUT1A6IHVuY2hhbmdlZCBjbGljay10by1wbGF5IGdyaWQKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBmdW5jdGlvbiBidWlsZERlc2t0b3BHcmlkKHNsaWRlcywgZ3JpZCl7CiAgICBjb25zdCBjYXJkRWxzID0gW107CgogICAgc2xpZGVzLmZvckVhY2goKHMsIGkpID0+IHsKICAgICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBjYXJkLmNsYXNzTmFtZSA9ICdzZy1jYXJkJzsKCiAgICAgIGZ1bmN0aW9uIGJ1aWxkUG9zdGVyU3RhdGUoKXsKICAgICAgICBidWlsZENhcmRCYXNlKGNhcmQsIHMsIGkpOwogICAgICAgIGNvbnN0IGNsaWNrVGFyZ2V0ID0gcy5wb3N0ZXIgPyBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5zZy1wb3N0ZXInKSA6IGNhcmQucXVlcnlTZWxlY3RvcignLnNnLXBvc3Rlci1wbGFjZWhvbGRlcicpOwogICAgICAgIGlmIChjbGlja1RhcmdldCAmJiBzLnZpZGVvSWQpIHsKICAgICAgICAgIGNsaWNrVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcGxheVZpZGVvKCkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGxheVZpZGVvKCl7CiAgICAgICAgaWYgKCFzLnZpZGVvSWQpIHJldHVybjsKICAgICAgICBzdG9wQWxsT3RoZXJWaWRlb3MoaSk7CiAgICAgICAgY2FyZC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBjb25zdCB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgd3JhcC5jbGFzc05hbWUgPSAnc2ctaWZyYW1lLXdyYXAnOwogICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwogICAgICAgIGlmcmFtZS5zcmMgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyArIHMudmlkZW9JZCArICc/YXV0b3BsYXk9MSZyZWw9MCZwbGF5c2lubGluZT0xJzsKICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdhbGxvdycsICdhdXRvcGxheTsgZnVsbHNjcmVlbjsgcGljdHVyZS1pbi1waWN0dXJlOyBlbmNyeXB0ZWQtbWVkaWEnKTsKICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdhbGxvd2Z1bGxzY3JlZW4nLCAnJyk7CiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZChpZnJhbWUpOwogICAgICAgIGNhcmQuYXBwZW5kQ2hpbGQod3JhcCk7CiAgICAgICAgY2FyZC5kYXRhc2V0LnBsYXlpbmcgPSAndHJ1ZSc7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHN0b3BWaWRlbygpewogICAgICAgIGlmIChjYXJkLmRhdGFzZXQucGxheWluZyA9PT0gJ3RydWUnKSB7CiAgICAgICAgICBjYXJkLmRhdGFzZXQucGxheWluZyA9ICdmYWxzZSc7CiAgICAgICAgICBidWlsZFBvc3RlclN0YXRlKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjYXJkLl9zdG9wVmlkZW8gPSBzdG9wVmlkZW87CiAgICAgIGJ1aWxkUG9zdGVyU3RhdGUoKTsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChjYXJkKTsKICAgICAgY2FyZEVscy5wdXNoKGNhcmQpOwogICAgfSk7CgogICAgZnVuY3Rpb24gc3RvcEFsbE90aGVyVmlkZW9zKGV4Y2VwdEluZGV4KXsKICAgICAgY2FyZEVscy5mb3JFYWNoKChlbCwgaWR4KSA9PiB7IGlmIChpZHggIT09IGV4Y2VwdEluZGV4KSBlbC5fc3RvcFZpZGVvKCk7IH0pOwogICAgfQoKICAgIHJldHVybiBmdW5jdGlvbiB0ZWFyZG93bigpeyBncmlkLmlubmVySFRNTCA9ICcnOyB9OwogIH0KCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gIE1PQklMRTogVGlrVG9rLXN0eWxlIHJlZWwgZmVlZCDigJQgYXV0b3BsYXkgbXV0ZWQgb24gc2Nyb2xsLAogIC8vICB0YXAgdGhlIHNwZWFrZXIgdG8gdHVybiBzb3VuZCBvbi4KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBmdW5jdGlvbiBidWlsZE1vYmlsZUZlZWQoc2xpZGVzLCBncmlkLCBlbWJlZCl7CiAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICBsZXQgYXVkaW9PbiA9IGZhbHNlOwogICAgbGV0IGFjdGl2ZUlkeCA9IC0xOwoKICAgIHNsaWRlcy5mb3JFYWNoKChzLCBpKSA9PiB7CiAgICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY2FyZC5jbGFzc05hbWUgPSAnc2ctY2FyZCc7CiAgICAgIGNhcmQuZGF0YXNldC5pZHggPSBTdHJpbmcoaSk7CiAgICAgIGJ1aWxkQ2FyZEJhc2UoY2FyZCwgcywgaSk7CgogICAgICAvLyBTb3VuZCB0b2dnbGUKICAgICAgY29uc3QgYXVkaW9CdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgYXVkaW9CdG4uY2xhc3NOYW1lID0gJ3NnLWF1ZGlvLWJ0bic7CiAgICAgIGF1ZGlvQnRuLnR5cGUgPSAnYnV0dG9uJzsKICAgICAgYXVkaW9CdG4uaW5uZXJIVE1MID0gc3BrT2ZmU3ZnOwogICAgICBhdWRpb0J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVHVybiBvbiBzb3VuZCcpOwogICAgICBhdWRpb0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpeyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVBdWRpbygpOyB9KTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChhdWRpb0J0bik7CgogICAgICAvLyAiVGFwIGZvciBzb3VuZCIgaGludAogICAgICBjb25zdCBoaW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGhpbnQuY2xhc3NOYW1lID0gJ3NnLXNvdW5kLWhpbnQnOwogICAgICBoaW50LnRleHRDb250ZW50ID0gJ1RhcCBmb3Igc291bmQnOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGhpbnQpOwoKICAgICAgLy8gVGFwcGluZyB0aGUgcG9zdGVyIGp1bXBzIHRoaXMgY2FyZCBhY3RpdmUgaW1tZWRpYXRlbHkuCiAgICAgIGNvbnN0IHBvc3RlckVsID0gcy5wb3N0ZXIgPyBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5zZy1wb3N0ZXInKSA6IGNhcmQucXVlcnlTZWxlY3RvcignLnNnLXBvc3Rlci1wbGFjZWhvbGRlcicpOwogICAgICBpZiAocG9zdGVyRWwgJiYgcy52aWRlb0lkKSBwb3N0ZXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7IHNldEFjdGl2ZShpKTsgfSk7CgogICAgICBncmlkLmFwcGVuZENoaWxkKGNhcmQpOwogICAgICBlbnRyaWVzLnB1c2goeyBjYXJkOmNhcmQsIHNsaWRlOnMsIGk6aSwgcGxheWVyOm51bGwsIHJlYWR5OmZhbHNlLCBjcmVhdGluZzpmYWxzZSwgYXVkaW9CdG46YXVkaW9CdG4gfSk7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBlbnN1cmVQbGF5ZXIoZW50cnkpewogICAgICBpZiAoIWVudHJ5LnNsaWRlLnZpZGVvSWQgfHwgZW50cnkucGxheWVyIHx8IGVudHJ5LmNyZWF0aW5nKSByZXR1cm47CiAgICAgIGVudHJ5LmNyZWF0aW5nID0gdHJ1ZTsKICAgICAgY29uc3QgY2FyZCA9IGVudHJ5LmNhcmQ7CiAgICAgIGNvbnN0IGRpbSA9IGNhcmQucXVlcnlTZWxlY3RvcignLnNnLWRpbScpOyBpZiAoZGltKSBkaW0ucmVtb3ZlKCk7CiAgICAgIGNvbnN0IHBiID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcuc2ctcGxheWJ0bicpOyBpZiAocGIpIHBiLnJlbW92ZSgpOwoKICAgICAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICB3cmFwLmNsYXNzTmFtZSA9ICdzZy1pZnJhbWUtd3JhcCc7CiAgICAgIGNvbnN0IG1vdW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQobW91bnQpOwogICAgICBjb25zdCBjYXB0aW9uID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcuc2ctY2FwdGlvbicpOwogICAgICBjYXJkLmluc2VydEJlZm9yZSh3cmFwLCBjYXB0aW9uIHx8IG51bGwpOwoKICAgICAgbG9hZFlUQXBpKCkudGhlbihmdW5jdGlvbihZVCl7CiAgICAgICAgZW50cnkucGxheWVyID0gbmV3IFlULlBsYXllcihtb3VudCwgewogICAgICAgICAgdmlkZW9JZDogZW50cnkuc2xpZGUudmlkZW9JZCwKICAgICAgICAgIHBsYXllclZhcnM6IHsgYXV0b3BsYXk6MCwgbXV0ZToxLCBwbGF5c2lubGluZToxLCBjb250cm9sczoxLCByZWw6MCwgbW9kZXN0YnJhbmRpbmc6MSB9LAogICAgICAgICAgZXZlbnRzOiB7CiAgICAgICAgICAgIG9uUmVhZHk6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgZW50cnkucmVhZHkgPSB0cnVlOwogICAgICAgICAgICAgIHRyeSB7IGVudHJ5LnBsYXllci5tdXRlKCk7IH0gY2F0Y2goZSl7fQogICAgICAgICAgICAgIGlmIChhY3RpdmVJZHggPT09IGVudHJ5LmkpIHN0YXJ0UGxheShlbnRyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKXt9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGFydFBsYXkoZW50cnkpewogICAgICBpZiAoIWVudHJ5LnJlYWR5KSByZXR1cm47CiAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgICBpZiAobyAhPT0gZW50cnkgJiYgby5wbGF5ZXIgJiYgby5yZWFkeSkgeyB0cnkgeyBvLnBsYXllci5wYXVzZVZpZGVvKCk7IH0gY2F0Y2goZSl7fSB9CiAgICAgIH0pOwogICAgICB0cnkgewogICAgICAgIGlmIChhdWRpb09uKSBlbnRyeS5wbGF5ZXIudW5NdXRlKCk7IGVsc2UgZW50cnkucGxheWVyLm11dGUoKTsKICAgICAgICBlbnRyeS5wbGF5ZXIucGxheVZpZGVvKCk7CiAgICAgIH0gY2F0Y2goZSl7fQogICAgICBlbnRyeS5jYXJkLmNsYXNzTGlzdC5hZGQoJ3NnLXBsYXlpbmcnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRBY3RpdmUoaWR4KXsKICAgICAgYWN0aXZlSWR4ID0gaWR4OwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgY29uc3Qgb24gPSAoby5pID09PSBpZHgpOwogICAgICAgIG8uY2FyZC5jbGFzc0xpc3QudG9nZ2xlKCdzZy1hY3RpdmUnLCBvbik7CiAgICAgICAgaWYgKCFvbikgewogICAgICAgICAgby5jYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3NnLXBsYXlpbmcnKTsKICAgICAgICAgIGlmIChvLnBsYXllciAmJiBvLnJlYWR5KSB7IHRyeSB7IG8ucGxheWVyLnBhdXNlVmlkZW8oKTsgfSBjYXRjaChlKXt9IH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaWR4XTsKICAgICAgZW5zdXJlUGxheWVyKGVudHJ5KTsKICAgICAgaWYgKGVudHJ5LnJlYWR5KSBzdGFydFBsYXkoZW50cnkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUF1ZGlvKCl7CiAgICAgIGF1ZGlvT24gPSAhYXVkaW9PbjsKICAgICAgZW1iZWQuY2xhc3NMaXN0LnRvZ2dsZSgnc2ctYXVkaW8tb24nLCBhdWRpb09uKTsKICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICAgIG8uYXVkaW9CdG4uaW5uZXJIVE1MID0gYXVkaW9PbiA/IHNwa09uU3ZnIDogc3BrT2ZmU3ZnOwogICAgICAgIG8uYXVkaW9CdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgYXVkaW9PbiA/ICdNdXRlJyA6ICdUdXJuIG9uIHNvdW5kJyk7CiAgICAgIH0pOwogICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbYWN0aXZlSWR4XTsKICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LnBsYXllciAmJiBlbnRyeS5yZWFkeSkgewogICAgICAgIHRyeSB7IGF1ZGlvT24gPyBlbnRyeS5wbGF5ZXIudW5NdXRlKCkgOiBlbnRyeS5wbGF5ZXIubXV0ZSgpOyB9IGNhdGNoKGUpe30KICAgICAgfQogICAgfQoKICAgIC8vIFBpY2sgdGhlIG1vc3QtdmlzaWJsZSBjYXJkIGFzICJhY3RpdmUiLgogICAgY29uc3QgcmF0aW9zID0gbmV3IEFycmF5KGVudHJpZXMubGVuZ3RoKS5maWxsKDApOwogICAgY29uc3QgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24ob2JzRW50cmllcyl7CiAgICAgIG9ic0VudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbil7CiAgICAgICAgY29uc3QgaWR4ID0gTnVtYmVyKGVuLnRhcmdldC5kYXRhc2V0LmlkeCk7CiAgICAgICAgaWYgKCFpc05hTihpZHgpKSByYXRpb3NbaWR4XSA9IGVuLmludGVyc2VjdGlvblJhdGlvOwogICAgICB9KTsKICAgICAgbGV0IGJlc3RJZHggPSAtMSwgYmVzdFJhdGlvID0gMC41NTsKICAgICAgcmF0aW9zLmZvckVhY2goZnVuY3Rpb24ociwgaWR4KXsgaWYgKHIgPj0gYmVzdFJhdGlvKSB7IGJlc3RSYXRpbyA9IHI7IGJlc3RJZHggPSBpZHg7IH0gfSk7CiAgICAgIGlmIChiZXN0SWR4ICE9PSAtMSAmJiBiZXN0SWR4ICE9PSBhY3RpdmVJZHgpIHNldEFjdGl2ZShiZXN0SWR4KTsKICAgIH0sIHsgdGhyZXNob2xkOiBbMCwgMC4yNSwgMC40LCAwLjU1LCAwLjcsIDAuODUsIDFdIH0pOwoKICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihvKXsgaW8ub2JzZXJ2ZShvLmNhcmQpOyB9KTsKCiAgICByZXR1cm4gZnVuY3Rpb24gdGVhcmRvd24oKXsKICAgICAgaW8uZGlzY29ubmVjdCgpOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24obyl7IGlmIChvLnBsYXllcikgeyB0cnkgeyBvLnBsYXllci5kZXN0cm95KCk7IH0gY2F0Y2goZSl7fSB9IH0pOwogICAgICBncmlkLmlubmVySFRNTCA9ICcnOwogICAgfTsKICB9CgogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vICBEaXNwYXRjaGVyIOKAlCBjaG9vc2UgZGVza3RvcCBncmlkIG9yIG1vYmlsZSBmZWVkLCBhbmQgcmVidWlsZAogIC8vICBpZiB0aGUgdmlld3BvcnQgY3Jvc3NlcyB0aGUgYnJlYWtwb2ludC4KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBsZXQgdGVhcmRvd24gPSBudWxsOwogIGZ1bmN0aW9uIGJ1aWxkKCl7CiAgICBpZiAodGVhcmRvd24pIHsgdHJ5IHsgdGVhcmRvd24oKTsgfSBjYXRjaChlKXt9IHRlYXJkb3duID0gbnVsbDsgfQoKICAgIGNvbnN0IGVtYmVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNob3J0cy1ncmlkLWVtYmVkJyk7CiAgICBjb25zdCBncmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NnR3JpZCcpOwogICAgaWYgKCFlbWJlZCB8fCAhZ3JpZCkgcmV0dXJuOwoKICAgIGNvbnN0IHdwU2xpZGVzID0gZmluZFNsaWRlc0Zyb21XUCgpOwogICAgY29uc3Qgc2xpZGVzID0gd3BTbGlkZXMgfHwgRkFMTEJBQ0tfU0xJREVTLm1hcChmdW5jdGlvbihzLCBpKXsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHMsIHsgY29sb3I6IEZBTExCQUNLX0NPTE9SU1tpICUgRkFMTEJBQ0tfQ09MT1JTLmxlbmd0aF0gfSk7CiAgICB9KTsKCiAgICBjb25zdCBpc0ZlZWQgPSB3aW5kb3cubWF0Y2hNZWRpYShNT0JJTEVfUSkubWF0Y2hlczsKICAgIGVtYmVkLmNsYXNzTGlzdC50b2dnbGUoJ3NnLWZlZWQtbW9kZScsIGlzRmVlZCk7CiAgICBlbWJlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZy1hdWRpby1vbicpOwogICAgZ3JpZC5pbm5lckhUTUwgPSAnJzsKCiAgICB0ZWFyZG93biA9IGlzRmVlZCA/IGJ1aWxkTW9iaWxlRmVlZChzbGlkZXMsIGdyaWQsIGVtYmVkKSA6IGJ1aWxkRGVza3RvcEdyaWQoc2xpZGVzLCBncmlkKTsKICB9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGJ1aWxkKCk7CiAgICBjb25zdCBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKE1PQklMRV9RKTsKICAgIGxldCBsYXN0ID0gbXEubWF0Y2hlczsKICAgIGNvbnN0IG9uQ2hhbmdlID0gZnVuY3Rpb24oKXsgaWYgKG1xLm1hdGNoZXMgIT09IGxhc3QpIHsgbGFzdCA9IG1xLm1hdGNoZXM7IGJ1aWxkKCk7IH0gfTsKICAgIGlmIChtcS5hZGRFdmVudExpc3RlbmVyKSBtcS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbkNoYW5nZSk7CiAgICBlbHNlIGlmIChtcS5hZGRMaXN0ZW5lcikgbXEuYWRkTGlzdGVuZXIob25DaGFuZ2UpOwogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgIGJvb3QoKTsKICB9IGVsc2UgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBib290KTsKICB9Cn0pKCk7Cg==




CiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkewogICAgLS1vcmFuZ2U6I0RCOEIzQjsgLS1jcmVhbTojRjRFRUREOyAtLWluazojMjQxQzEzOyAtLXRlYWwtZGFyazojMjM0QTQzOyAtLXRlYWw6IzMzNjY1QzsKICB9CiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkLCAucG9kY2FzdC10ZWFzZXItZW1iZWQgKnsgYm94LXNpemluZzpib3JkZXItYm94OyB9CiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkewogICAgbWFyZ2luOjAgYXV0bzsgcGFkZGluZzowOyBmb250LWZhbWlseTonS2FybGEnLHNhbnMtc2VyaWY7CiAgICB3aWR0aDoxMDB2dzsgcG9zaXRpb246cmVsYXRpdmU7IGxlZnQ6NTAlOyByaWdodDo1MCU7CiAgICBtYXJnaW4tbGVmdDotNTB2dzsgbWFyZ2luLXJpZ2h0Oi01MHZ3OyBtYXgtd2lkdGg6MTAwdnc7CiAgfQoKICAucG9kY2FzdC10ZWFzZXItZW1iZWQgLnB0LWNhcmR7CiAgICBiYWNrZ3JvdW5kOnZhcigtLW9yYW5nZSk7CiAgICBib3JkZXItcmFkaXVzOjA7CiAgICBvdmVyZmxvdzpoaWRkZW47CiAgICBib3gtc2hhZG93Om5vbmU7CiAgfQogIC5wb2RjYXN0LXRlYXNlci1lbWJlZCAucHQtcm93ewogICAgZGlzcGxheTpncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsM2ZyKSBtaW5tYXgoMCwyZnIpOyBhbGlnbi1pdGVtczpjZW50ZXI7CiAgICBnYXA6MDsKICB9CiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkIC5wdC1waG90by13cmFwewogICAgd2lkdGg6MTAwJTsgYXNwZWN0LXJhdGlvOjE2Lzk7IG92ZXJmbG93OmhpZGRlbjsKICAgIGJhY2tncm91bmQ6dmFyKC0taW5rKTsKICB9CiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkIC5wdC1waG90by13cmFwIGltZ3sKICAgIHdpZHRoOjEwMCU7IGhlaWdodDoxMDAlOyBvYmplY3QtZml0OmNvdmVyOyBkaXNwbGF5OmJsb2NrOwogIH0KICAucG9kY2FzdC10ZWFzZXItZW1iZWQgLnB0LXBob3RvLXBsYWNlaG9sZGVyewogICAgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IGRpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOwogICAgYmFja2dyb3VuZDp2YXIoLS10ZWFsKTsgY29sb3I6dmFyKC0tY3JlYW0pOyBmb250LXNpemU6MTJweDsgbGV0dGVyLXNwYWNpbmc6MC4xZW07IHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKICB9CiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkIC5wdC1jb250ZW50ewogICAgcGFkZGluZzo0OHB4IDQ0cHg7CiAgICBtYXgtd2lkdGg6NTYwcHg7CiAgICBtYXJnaW46MDsKICB9CiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkIC5wdC1leWVicm93ewogICAgZm9udC1mYW1pbHk6J0thcmxhJyxzYW5zLXNlcmlmOyBmb250LXdlaWdodDo2MDA7IGZvbnQtc2l6ZToxMi41cHg7IGxldHRlci1zcGFjaW5nOjAuMTRlbTsKICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsgY29sb3I6dmFyKC0taW5rKTsgb3BhY2l0eTowLjc1OyBtYXJnaW46MCAwIDEwcHg7CiAgfQogIC5wb2RjYXN0LXRlYXNlci1lbWJlZCAucHQtaGVhZGxpbmV7CiAgICBmb250LWZhbWlseTonTGlicmUgQmFza2VydmlsbGUnLHNlcmlmOyBmb250LXdlaWdodDo3MDA7CiAgICBmb250LXNpemU6Y2xhbXAoMjZweCwgMy40dncsIDM4cHgpOyBsaW5lLWhlaWdodDoxLjI7CiAgICBjb2xvcjp2YXIoLS1pbmspOyBtYXJnaW46MCAwIDE0cHg7CiAgfQogIC5wb2RjYXN0LXRlYXNlci1lbWJlZCAucHQtdGV4dHsKICAgIGZvbnQtZmFtaWx5OidLYXJsYScsc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6NDAwOyBmb250LXNpemU6MTdweDsgbGluZS1oZWlnaHQ6MS42NTsKICAgIGNvbG9yOnZhcigtLWluayk7IG1hcmdpbjowIDAgMjZweDsgb3BhY2l0eTowLjk7CiAgfQogIC5wb2RjYXN0LXRlYXNlci1lbWJlZCAucHQtYnRuewogICAgZGlzcGxheTppbmxpbmUtYmxvY2s7IGZvbnQtZmFtaWx5OidMaWJyZSBCYXNrZXJ2aWxsZScsc2VyaWY7IGZvbnQtd2VpZ2h0OjcwMDsKICAgIGZvbnQtc2l6ZToxNXB4OyBjb2xvcjp2YXIoLS1pbmspOyBib3JkZXI6MnB4IHNvbGlkIHZhcigtLWluayk7CiAgICBwYWRkaW5nOjEwcHggMjhweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4xOHMgZWFzZSwgY29sb3IgLjE4cyBlYXNlOwogIH0KICAvKiBOb3RlOiBidXR0b24gbGFiZWwgc3RheXMgTGlicmUgQmFza2VydmlsbGUgKHVuY2hhbmdlZCkgLS0gb25seSB0aGUKICAgICBleWVicm93IGxhYmVsIGFuZCBib2R5IHBhcmFncmFwaCBzd2l0Y2ggdG8gS2FybGEuICovCiAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkIC5wdC1idG46aG92ZXJ7IGJhY2tncm91bmQ6dmFyKC0taW5rKTsgY29sb3I6dmFyKC0tY3JlYW0pOyB9CgogIC5wb2RjYXN0LXRlYXNlci1lbWJlZC5yZXZlYWx7CiAgICBvcGFjaXR5OjA7IHRyYW5zZm9ybTp0cmFuc2xhdGVZKDI4cHgpOwogICAgdHJhbnNpdGlvbjpvcGFjaXR5IC43cyBlYXNlLCB0cmFuc2Zvcm0gLjdzIGVhc2U7CiAgfQogIC5wb2RjYXN0LXRlYXNlci1lbWJlZC5yZXZlYWwuaXMtdmlzaWJsZXsKICAgIG9wYWNpdHk6MTsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7CiAgfQoKICBAbWVkaWEgKG1heC13aWR0aDo3MDBweCl7CiAgICAucG9kY2FzdC10ZWFzZXItZW1iZWQgLnB0LXJvd3sgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjsgfQogICAgLyogTm8gZm9yY2VkIGFzcGVjdC1yYXRpbyAtLSBsZXQgdGhlIHBob3RvIHNob3cgYXQgaXRzIG5hdHVyYWwKICAgICAgIHByb3BvcnRpb25zIHNvIGZ1dHVyZSBwaG90byBzd2FwcyBuZXZlciByaXNrIGNyb3BwaW5nIGZhY2VzLiAqLwogICAgLnBvZGNhc3QtdGVhc2VyLWVtYmVkIC5wdC1waG90by13cmFweyBhc3BlY3QtcmF0aW86YXV0bzsgaGVpZ2h0OmF1dG87IH0KICAgIC5wb2RjYXN0LXRlYXNlci1lbWJlZCAucHQtcGhvdG8td3JhcCBpbWd7IGhlaWdodDphdXRvOyB9CiAgICAucG9kY2FzdC10ZWFzZXItZW1iZWQgLnB0LWNvbnRlbnR7IHBhZGRpbmc6MzJweCAyNnB4OyB0ZXh0LWFsaWduOmNlbnRlcjsgfQogIH0KCiAgLyogVGhlIFdvcmRQcmVzcyBJbWFnZSBibG9jayB0aGF0IHN1cHBsaWVzIHRoZSBwaG90by9oZWFkbGluZS90ZXh0L2xpbms6CiAgICAgcmVhZCBieSBKUyBhdCBsb2FkLCB0aGVuIGhpZGRlbi4gKi8KICAucG9kY2FzdC1waG90by1zb3VyY2V7IGRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyB9Cg==
CihmdW5jdGlvbigpewogIC8vIC0tLS0gQ29udGVudCBzdXBwbGllZCB2aWEgYSBzaW5nbGUgV29yZFByZXNzIEltYWdlIGJsb2NrIC0tLS0KICAvLyBBZGQgYW4gSW1hZ2UgYmxvY2sgYW55d2hlcmUgb24gdGhlIHBhZ2UsIHVwbG9hZCBhIHBob3RvLCB0aGVuIGdpdmUgaXQKICAvLyB0aGUgQ1NTIGNsYXNzICJwb2RjYXN0LXBob3RvLXNvdXJjZSIgKEJsb2NrIHNldHRpbmdzIC0+IEFkdmFuY2VkIC0+CiAgLy8gQWRkaXRpb25hbCBDU1MgY2xhc3MoZXMpKS4gU2V0OgogIC8vICAgLSBBbHQgVGV4dCAtPiB0aGUgaGVhZGxpbmUKICAvLyAgIC0gQ2FwdGlvbiAgLT4gdGhlIGRlc2NyaXB0aW9uIChvcHRpb25hbGx5ICJkZXNjcmlwdGlvbiB8IEJ1dHRvbiBMYWJlbCIpCiAgLy8gICAtIExpbmsgKEN1c3RvbSBVUkwpIC0+IHdoZXJlIHRoZSBidXR0b24gZ29lcwogIGZ1bmN0aW9uIGhpZ2hlc3RSZXNTcmMoaW1nKXsKICAgIGNvbnN0IGZ1bGxVcmwgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZ1bGwtdXJsJyk7CiAgICBpZiAoZnVsbFVybCkgcmV0dXJuIGZ1bGxVcmw7CiAgICBjb25zdCBzcmNzZXQgPSBpbWcuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKTsKICAgIGlmIChzcmNzZXQpIHsKICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHNyY3NldC5zcGxpdCgnLCcpLm1hcChwYXJ0ID0+IHsKICAgICAgICBjb25zdCBiaXRzID0gcGFydC50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoKGJpdHNbMV0gfHwgJycpLnJlcGxhY2UoJ3cnLCAnJyksIDEwKSB8fCAwOwogICAgICAgIHJldHVybiB7IHVybDogYml0c1swXSwgd2lkdGggfTsKICAgICAgfSk7CiAgICAgIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYi53aWR0aCAtIGEud2lkdGgpOwogICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggJiYgY2FuZGlkYXRlc1swXS51cmwpIHJldHVybiBjYW5kaWRhdGVzWzBdLnVybDsKICAgIH0KICAgIHJldHVybiBpbWcuc3JjOwogIH0KCiAgZnVuY3Rpb24gaW5pdCgpewogICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBvZGNhc3QtcGhvdG8tc291cmNlIGltZycpOwogICAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdFBob3RvV3JhcCcpOwoKICAgIGlmIChzb3VyY2UpIHsKICAgICAgaWYgKHdyYXApIHsKICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgICBpbWcuc3JjID0gaGlnaGVzdFJlc1NyYyhzb3VyY2UpOwogICAgICAgIGltZy5hbHQgPSBzb3VyY2UuYWx0IHx8ICdCaWcgR3JhbmRlJzsKICAgICAgICBpbWcubG9hZGluZyA9ICdlYWdlcic7CiAgICAgICAgd3JhcC5pbm5lckhUTUwgPSAnJzsKICAgICAgICB3cmFwLmFwcGVuZENoaWxkKGltZyk7CgogICAgICAgIC8vIE1hdGNoIHRoZSBib3gncyBzaGFwZSB0byB0aGUgYWN0dWFsIHBob3RvLCBvbmNlIHdlIGtub3cgaXRzIHJlYWwKICAgICAgICAvLyBkaW1lbnNpb25zIC0tIHRoaXMgbWVhbnMgd2lkZSBwaG90b3MgZ2V0IGEgd2lkZSBib3ggKG5vYm9keSBhdAogICAgICAgIC8vIHRoZSBlZGdlcyBnZXRzIGNyb3BwZWQpIGFuZCBwb3J0cmFpdCBwaG90b3MgZ2V0IGEgdGFsbGVyIGJveCAobm8KICAgICAgICAvLyBsZXR0ZXJib3ggYmFycyksIHJhdGhlciB0aGFuIGZvcmNpbmcgZXZlcnkgcGhvdG8gaW50byBvbmUgZml4ZWQKICAgICAgICAvLyBzaGFwZS4gQ2xhbXBlZCB0byBhIHNhbmUgcmFuZ2Ugc28gYSB0cnVseSBleHRyZW1lIHBob3RvIGRvZXNuJ3QKICAgICAgICAvLyBwcm9kdWNlIGEgYnJva2VuLWxvb2tpbmcgc2xpdmVyIG9yIGEgaHVnZSB0b3dlci4KICAgICAgICBmdW5jdGlvbiBhcHBseU5hdHVyYWxSYXRpbygpewogICAgICAgICAgaWYgKCFpbWcubmF0dXJhbFdpZHRoIHx8ICFpbWcubmF0dXJhbEhlaWdodCkgcmV0dXJuOwogICAgICAgICAgLy8gU2tpcCBvbiBtb2JpbGUgLS0gdGhhdCBicmVha3BvaW50IGFscmVhZHkgZ3VhcmFudGVlcyBmdWxsLAogICAgICAgICAgLy8gdW5jcm9wcGVkIHBob3RvcyB2aWEgbmF0dXJhbCBoZWlnaHQsIGFuZCB0aGlzIGlubGluZSBzdHlsZQogICAgICAgICAgLy8gd291bGQgb3RoZXJ3aXNlIG92ZXJyaWRlIHRoYXQgcmVzZXQuCiAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNzAwKSByZXR1cm47CiAgICAgICAgICBsZXQgcmF0aW8gPSBpbWcubmF0dXJhbFdpZHRoIC8gaW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgICAgICByYXRpbyA9IE1hdGgubWF4KDAuOCwgTWF0aC5taW4oMi40LCByYXRpbykpOwogICAgICAgICAgd3JhcC5zdHlsZS5hc3BlY3RSYXRpbyA9IHJhdGlvLnRvRml4ZWQoMykgKyAnIC8gMSc7CiAgICAgICAgfQogICAgICAgIGlmIChpbWcuY29tcGxldGUpIHsKICAgICAgICAgIGFwcGx5TmF0dXJhbFJhdGlvKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgYXBwbHlOYXR1cmFsUmF0aW8pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHNvdXJjZS5hbHQpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHRIZWFkbGluZScpLnRleHRDb250ZW50ID0gc291cmNlLmFsdDsKICAgICAgfQoKICAgICAgY29uc3QgZmlndXJlID0gc291cmNlLmNsb3Nlc3QoJ2ZpZ3VyZScpOwogICAgICBjb25zdCBjYXB0aW9uID0gZmlndXJlID8gZmlndXJlLnF1ZXJ5U2VsZWN0b3IoJ2ZpZ2NhcHRpb24nKSA6IG51bGw7CiAgICAgIGlmIChjYXB0aW9uKSB7CiAgICAgICAgY29uc3QgcmF3ID0gY2FwdGlvbi50ZXh0Q29udGVudC50cmltKCk7CiAgICAgICAgbGV0IHRleHQgPSByYXcsIGJ0bkxhYmVsID0gbnVsbDsKICAgICAgICBpZiAocmF3LmluY2x1ZGVzKCd8JykpIHsKICAgICAgICAgIGNvbnN0IHBhcnRzID0gcmF3LnNwbGl0KCd8Jyk7CiAgICAgICAgICB0ZXh0ID0gcGFydHNbMF0udHJpbSgpOwogICAgICAgICAgYnRuTGFiZWwgPSBwYXJ0c1sxXS50cmltKCk7CiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdFRleHQnKS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgICAgaWYgKGJ0bkxhYmVsKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHRCdG4nKS50ZXh0Q29udGVudCA9IGJ0bkxhYmVsOwogICAgICB9CgogICAgICBjb25zdCBsaW5rRWwgPSBzb3VyY2UuY2xvc2VzdCgnYScpOwogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHRCdG4nKTsKICAgICAgaWYgKGxpbmtFbCkgewogICAgICAgIGNvbnN0IGhyZWYgPSBsaW5rRWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbGlua0VsLmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7CiAgICAgICAgaWYgKGhyZWYpIGJ0bi5ocmVmID0gaHJlZjsKICAgICAgICBpZiAodGFyZ2V0KSB7IGJ0bi50YXJnZXQgPSB0YXJnZXQ7IGJ0bi5yZWwgPSAnbm9vcGVuZXIgbm9yZWZlcnJlcic7IH0KICAgICAgfQogICAgfQoKICAgIC8vIFJldmVhbC1vbi1zY3JvbGwKICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBvZGNhc3QtdGVhc2VyLWVtYmVkJyk7CiAgICBpZiAoZWwpIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZCgncmV2ZWFsJyk7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgICAgICAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHsKICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgICBlbnRyeS50YXJnZXQuY2xhc3NMaXN0LmFkZCgnaXMtdmlzaWJsZScpOwogICAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoZW50cnkudGFyZ2V0KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwgeyB0aHJlc2hvbGQ6IDAuMTUgfSk7CiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWwpOwogICAgfQogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgIGluaXQoKTsKICB9IGVsc2UgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBpbml0KTsKICB9Cn0pKCk7Cg==

| Listen Now
CiAgLm1zcy10ZWFzZXItZW1iZWR7CiAgICAtLW9yYW5nZTojREI4QjNCOyAtLWNyZWFtOiNGNEVFREQ7IC0taW5rOiMyNDFDMTM7IC0tdGVhbC1kYXJrOiMyMzRBNDM7IC0tdGVhbDojMzM2NjVDOwogIH0KICAubXNzLXRlYXNlci1lbWJlZCwgLm1zcy10ZWFzZXItZW1iZWQgKnsgYm94LXNpemluZzpib3JkZXItYm94OyB9CiAgLm1zcy10ZWFzZXItZW1iZWR7CiAgICBtYXJnaW46MCBhdXRvOyBwYWRkaW5nOjA7IGZvbnQtZmFtaWx5OidLYXJsYScsc2Fucy1zZXJpZjsKICAgIC8qIEJyZWFrIG91dCBvZiB3aGF0ZXZlciBjb25zdHJhaW5lZCBjb250ZW50IGNvbHVtbiBXb3JkUHJlc3MgcHV0cyB0aGlzCiAgICAgICBibG9jayBpbiwgc28gdGhlIGJhY2tncm91bmQgcGhvdG8gc3BhbnMgdGhlIGZ1bGwgYnJvd3NlciB3aWR0aCAtLQogICAgICAgdGhpcyB3b3JrcyByZWdhcmRsZXNzIG9mIHRoZW1lL3BhZ2UtdGVtcGxhdGUgc2V0dGluZ3MuICovCiAgICB3aWR0aDoxMDB2dzsKICAgIHBvc2l0aW9uOnJlbGF0aXZlOwogICAgbGVmdDo1MCU7CiAgICByaWdodDo1MCU7CiAgICBtYXJnaW4tbGVmdDotNTB2dzsKICAgIG1hcmdpbi1yaWdodDotNTB2dzsKICAgIG1heC13aWR0aDoxMDB2dzsKICB9CgogIC5tc3MtdGVhc2VyLWVtYmVkIC5tc3MtY2FyZHsKICAgIHBvc2l0aW9uOnJlbGF0aXZlOwogICAgYm9yZGVyLXJhZGl1czowOwogICAgb3ZlcmZsb3c6aGlkZGVuOwogICAgbWluLWhlaWdodDo1NjBweDsKICAgIG1pbi1oZWlnaHQ6MTAwdmg7CiAgICBtaW4taGVpZ2h0OjEwMHN2aDsKICAgIGRpc3BsYXk6ZmxleDsKICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDpjZW50ZXI7CiAgICBib3gtc2hhZG93Om5vbmU7CiAgICBiYWNrZ3JvdW5kOnZhcigtLXRlYWwpOwogIH0KICAubXNzLXRlYXNlci1lbWJlZCAubXNzLWJnLWltZ3sKICAgIHBvc2l0aW9uOmFic29sdXRlOyBpbnNldDowOyB3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJTsgb2JqZWN0LWZpdDpjb3ZlcjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyIDIwJTsKICAgIHotaW5kZXg6MTsKICB9CiAgLm1zcy10ZWFzZXItZW1iZWQgLm1zcy1iZy1ibHVyewogICAgZGlzcGxheTpub25lOwogICAgcG9zaXRpb246YWJzb2x1dGU7IGluc2V0OjA7IHdpZHRoOjEwMCU7IGhlaWdodDoxMDAlOyBvYmplY3QtZml0OmNvdmVyOwogICAgZmlsdGVyOiBibHVyKDI0cHgpIGJyaWdodG5lc3MoMC45KSBzYXR1cmF0ZSgxLjEpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjE1KTsgLyogaGlkZXMgdGhlIHNvZnQgYmx1ciBlZGdlIHBhc3QgdGhlIGJveCdzIGJvcmRlciAqLwogICAgei1pbmRleDowOwogIH0KICAubXNzLXRlYXNlci1lbWJlZCAubXNzLW92ZXJsYXl7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsgaW5zZXQ6MDsgei1pbmRleDoyOwogICAgYmFja2dyb3VuZDoKICAgICAgcmFkaWFsLWdyYWRpZW50KGVsbGlwc2UgYXQgY2VudGVyLCByZ2JhKDEwLDgsNiwwLjQyKSAwJSwgcmdiYSgxMCw4LDYsMC4yNikgNDUlLCByZ2JhKDEwLDgsNiwwLjEyKSA3NSUpLAogICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE1LDEwLDgsMC4yMikgMCUsIHJnYmEoMTUsMTAsOCwwLjI4KSA0NSUsIHJnYmEoMTAsNyw1LDAuNTUpIDEwMCUpOwogIH0KICAubXNzLXRlYXNlci1lbWJlZCAubXNzLWNvbnRlbnR7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsgei1pbmRleDo1OwogICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICBwYWRkaW5nOjQ4cHggNDBweDsKICAgIG1heC13aWR0aDo2MDBweDsKICAgIG1hcmdpbjowIGF1dG87CiAgfQogIC5tc3MtdGVhc2VyLWVtYmVkIC5tc3MtZXllYnJvd3sKICAgIGZvbnQtZmFtaWx5OidLYXJsYScsc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6NjAwOyBmb250LXNpemU6MTIuNXB4OyBsZXR0ZXItc3BhY2luZzowLjE0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7IGNvbG9yOnZhcigtLWNyZWFtKTsgb3BhY2l0eTowLjk7IG1hcmdpbjowIDAgMTBweDsKICAgIHRleHQtc2hhZG93OjAgMXB4IDNweCByZ2JhKDAsMCwwLDAuNik7CiAgfQogIC5tc3MtdGVhc2VyLWVtYmVkIC5tc3MtaGVhZGxpbmV7CiAgICBmb250LWZhbWlseTonTGlicmUgQmFza2VydmlsbGUnLHNlcmlmOyBmb250LXdlaWdodDo3MDA7CiAgICBmb250LXNpemU6Y2xhbXAoMjhweCwgNHZ3LCA0MnB4KTsgbGluZS1oZWlnaHQ6MS4yOwogICAgY29sb3I6dmFyKC0tY3JlYW0pOyBtYXJnaW46MCAwIDE0cHg7CiAgICB0ZXh0LXNoYWRvdzowIDJweCA0cHggcmdiYSgwLDAsMCwwLjc1KSwgMCA0cHggMThweCByZ2JhKDAsMCwwLDAuNjUpOwogIH0KICAubXNzLXRlYXNlci1lbWJlZCAubXNzLXRleHR7CiAgICBmb250LWZhbWlseTonS2FybGEnLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OjQwMDsgZm9udC1zaXplOjE3cHg7IGxpbmUtaGVpZ2h0OjEuNjU7CiAgICBjb2xvcjp2YXIoLS1jcmVhbSk7IG1hcmdpbjowIDAgMjZweDsKICAgIHRleHQtc2hhZG93OjAgMXB4IDNweCByZ2JhKDAsMCwwLDAuODUpLCAwIDNweCAxMnB4IHJnYmEoMCwwLDAsMC42KTsKICB9CiAgLm1zcy10ZWFzZXItZW1iZWQgLm1zcy1idG57CiAgICBkaXNwbGF5OmlubGluZS1ibG9jazsgZm9udC1mYW1pbHk6J0xpYnJlIEJhc2tlcnZpbGxlJyxzZXJpZjsgZm9udC13ZWlnaHQ6NzAwOwogICAgZm9udC1zaXplOjE1cHg7IGNvbG9yOnZhcigtLWNyZWFtKTsgYm9yZGVyOjJweCBzb2xpZCB2YXIoLS1jcmVhbSk7CiAgICBwYWRkaW5nOjEwcHggMjhweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4xOHMgZWFzZSwgY29sb3IgLjE4cyBlYXNlOwogICAgbWFyZ2luOjAgNnB4OwogIH0KICAubXNzLXRlYXNlci1lbWJlZCAubXNzLWJ0bjpob3ZlcnsgYmFja2dyb3VuZDp2YXIoLS1jcmVhbSk7IGNvbG9yOnZhcigtLWluayk7IH0KICAubXNzLXRlYXNlci1lbWJlZCAubXNzLWJ0bi1zZWNvbmRhcnl7CiAgICBiYWNrZ3JvdW5kOnZhcigtLW9yYW5nZSk7IGJvcmRlci1jb2xvcjp2YXIoLS1vcmFuZ2UpOwogIH0KICAubXNzLXRlYXNlci1lbWJlZCAubXNzLWJ0bi1zZWNvbmRhcnk6aG92ZXJ7CiAgICBiYWNrZ3JvdW5kOnZhcigtLWNyZWFtKTsgY29sb3I6dmFyKC0taW5rKTsgYm9yZGVyLWNvbG9yOnZhcigtLWNyZWFtKTsKICB9CiAgLm1zcy10ZWFzZXItZW1iZWQgLm1zcy1idG4tcm93ewogICAgZGlzcGxheTpmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyBnYXA6MDsgZmxleC13cmFwOndyYXA7CiAgfQoKICAubXNzLXRlYXNlci1lbWJlZC5yZXZlYWx7CiAgICBvcGFjaXR5OjA7IHRyYW5zZm9ybTp0cmFuc2xhdGVZKDI4cHgpOwogICAgdHJhbnNpdGlvbjpvcGFjaXR5IC43cyBlYXNlLCB0cmFuc2Zvcm0gLjdzIGVhc2U7CiAgfQogIC5tc3MtdGVhc2VyLWVtYmVkLnJldmVhbC5pcy12aXNpYmxlewogICAgb3BhY2l0eToxOyB0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTsKICB9CgogIEBtZWRpYSAobWF4LXdpZHRoOjcwMHB4KXsKICAgIC5tc3MtdGVhc2VyLWVtYmVkIC5tc3MtY2FyZHsgbWluLWhlaWdodDoxMDB2aDsgbWluLWhlaWdodDoxMDBzdmg7IH0KICAgIC5tc3MtdGVhc2VyLWVtYmVkIC5tc3MtY29udGVudHsgcGFkZGluZzozMnB4IDI2cHg7IH0KICAgIC5tc3MtdGVhc2VyLWVtYmVkIC5tc3MtYnRueyBtYXJnaW46NnB4OyB9CiAgICAvKiBNb2JpbGUgbm93IG1hdGNoZXMgZGVza3RvcDogcGhvdG8gYWx3YXlzIGZpbGxzIHRoZSBib3ggY29tcGxldGVseQogICAgICAgKG9iamVjdC1maXQ6Y292ZXIsIHNhbWUgYXMgdGhlIGJhc2UgcnVsZSkuIFRoaXMgdHJhZGVzIGF3YXkgdGhlCiAgICAgICBhdXRvbWF0aWMgbm8tY3JvcCBndWFyYW50ZWUgLS0gYXNrIENsYXVkZSB0byBhZGp1c3Qgb2JqZWN0LXBvc2l0aW9uCiAgICAgICBvbiAubXNzLWJnLWltZyB3aGVuZXZlciBhIG5ldyBwaG90byBpcyBzd2FwcGVkIGluLCBzbyBpdCdzIGZyYW1lZAogICAgICAgd2VsbCBmb3IgdGhhdCBzcGVjaWZpYyBwaG90bydzIGNvbnRlbnQuICovCiAgfQoKICAvKiBUaGUgV29yZFByZXNzIEltYWdlIGJsb2NrIHRoYXQgc3VwcGxpZXMgdGhlIHBob3RvL2hlYWRsaW5lL3RleHQvbGluayAqLwogIC5tc3MtcGhvdG8tc291cmNleyBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsgfQo=
CihmdW5jdGlvbigpewogIC8vIC0tLS0gQ29udGVudCBzdXBwbGllZCB2aWEgYSBzaW5nbGUgV29yZFByZXNzIEltYWdlIGJsb2NrIC0tLS0KICAvLyBBZGQgYW4gSW1hZ2UgYmxvY2sgYW55d2hlcmUgb24gdGhlIHBhZ2UsIHVwbG9hZCBhIFdJREUvbGFuZHNjYXBlIHBob3RvCiAgLy8gKHBlb3BsZSBzcHJlYWQgb3V0LCBub3QgYSB0YWxsIHBvc3Rlci1zdHlsZSBpbWFnZSAtLSB0aGlzIHRyZWF0bWVudAogIC8vIGNyb3BzIHRvcC9ib3R0b20gb24gbmFycm93IHBob3RvcyksIHRoZW4gZ2l2ZSBpdCB0aGUgQ1NTIGNsYXNzCiAgLy8gIm1zcy1waG90by1zb3VyY2UiIChCbG9jayBzZXR0aW5ncyAtPiBBZHZhbmNlZCAtPiBBZGRpdGlvbmFsIENTUwogIC8vIGNsYXNzKGVzKSkuIFNldDoKICAvLyAgIC0gQWx0IFRleHQgLT4gdGhlIGhlYWRsaW5lCiAgLy8gICAtIENhcHRpb24gIC0+IHRoZSBkZXNjcmlwdGlvbiAob3B0aW9uYWxseSAiZGVzY3JpcHRpb24gfCBCdXR0b24gTGFiZWwiKQogIC8vICAgLSBMaW5rIChDdXN0b20gVVJMKSAtPiB3aGVyZSB0aGUgYnV0dG9uIGdvZXMgKGUuZy4geW91ciBwdXJjaGFzZSBsaW5rKQogIGZ1bmN0aW9uIGhpZ2hlc3RSZXNTcmMoaW1nKXsKICAgIGNvbnN0IGZ1bGxVcmwgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZ1bGwtdXJsJyk7CiAgICBpZiAoZnVsbFVybCkgcmV0dXJuIGZ1bGxVcmw7CiAgICBjb25zdCBzcmNzZXQgPSBpbWcuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKTsKICAgIGlmIChzcmNzZXQpIHsKICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHNyY3NldC5zcGxpdCgnLCcpLm1hcChwYXJ0ID0+IHsKICAgICAgICBjb25zdCBiaXRzID0gcGFydC50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoKGJpdHNbMV0gfHwgJycpLnJlcGxhY2UoJ3cnLCAnJyksIDEwKSB8fCAwOwogICAgICAgIHJldHVybiB7IHVybDogYml0c1swXSwgd2lkdGggfTsKICAgICAgfSk7CiAgICAgIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYi53aWR0aCAtIGEud2lkdGgpOwogICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggJiYgY2FuZGlkYXRlc1swXS51cmwpIHJldHVybiBjYW5kaWRhdGVzWzBdLnVybDsKICAgIH0KICAgIHJldHVybiBpbWcuc3JjOwogIH0KCiAgZnVuY3Rpb24gaW5pdCgpewogICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1zcy1waG90by1zb3VyY2UgaW1nJyk7CiAgICBjb25zdCBiZ0ltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtc3NCZ0ltZycpOwogICAgY29uc3QgYmdCbHVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zc0JnQmx1cicpOwoKICAgIGlmIChzb3VyY2UpIHsKICAgICAgaWYgKGJnSW1nKSB7CiAgICAgICAgYmdJbWcuc3JjID0gaGlnaGVzdFJlc1NyYyhzb3VyY2UpOwogICAgICAgIGJnSW1nLmFsdCA9IHNvdXJjZS5hbHQgfHwgJ0JpZyBHcmFuZGUnOwogICAgICAgIGJnSW1nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgIGlmIChiZ0JsdXIpIHsgYmdCbHVyLnNyYyA9IGhpZ2hlc3RSZXNTcmMoc291cmNlKTsgfQogICAgICB9CgogICAgICBpZiAoc291cmNlLmFsdCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtc3NIZWFkbGluZScpLnRleHRDb250ZW50ID0gc291cmNlLmFsdDsKICAgICAgfQoKICAgICAgY29uc3QgZmlndXJlID0gc291cmNlLmNsb3Nlc3QoJ2ZpZ3VyZScpOwogICAgICBjb25zdCBjYXB0aW9uID0gZmlndXJlID8gZmlndXJlLnF1ZXJ5U2VsZWN0b3IoJ2ZpZ2NhcHRpb24nKSA6IG51bGw7CiAgICAgIGxldCBidG4yTGFiZWwgPSBudWxsOwogICAgICBpZiAoY2FwdGlvbikgewogICAgICAgIGNvbnN0IHJhdyA9IGNhcHRpb24udGV4dENvbnRlbnQudHJpbSgpOwogICAgICAgIGxldCB0ZXh0ID0gcmF3LCBidG5MYWJlbCA9IG51bGw7CiAgICAgICAgaWYgKHJhdy5pbmNsdWRlcygnfCcpKSB7CiAgICAgICAgICAvLyAiZGVzY3JpcHRpb24gfCBCdXR0b24xIExhYmVsIHwgQnV0dG9uMiBMYWJlbCIgLS0gdGhlIHRoaXJkCiAgICAgICAgICAvLyBzZWdtZW50IChpZiBwcmVzZW50KSBpcyB0aGUgc2Vjb25kIGJ1dHRvbidzIGxhYmVsLgogICAgICAgICAgY29uc3QgcGFydHMgPSByYXcuc3BsaXQoJ3wnKTsKICAgICAgICAgIHRleHQgPSBwYXJ0c1swXS50cmltKCk7CiAgICAgICAgICBidG5MYWJlbCA9IHBhcnRzWzFdID8gcGFydHNbMV0udHJpbSgpIDogbnVsbDsKICAgICAgICAgIGJ0bjJMYWJlbCA9IHBhcnRzWzJdID8gcGFydHNbMl0udHJpbSgpIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zc1RleHQnKS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgICAgaWYgKGJ0bkxhYmVsKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNzQnRuJykudGV4dENvbnRlbnQgPSBidG5MYWJlbDsKICAgICAgfQoKICAgICAgY29uc3QgbGlua0VsID0gc291cmNlLmNsb3Nlc3QoJ2EnKTsKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zc0J0bicpOwogICAgICBpZiAobGlua0VsKSB7CiAgICAgICAgY29uc3QgaHJlZiA9IGxpbmtFbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICBjb25zdCB0YXJnZXQgPSBsaW5rRWwuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTsKICAgICAgICBpZiAoaHJlZikgYnRuLmhyZWYgPSBocmVmOwogICAgICAgIGlmICh0YXJnZXQpIHsgYnRuLnRhcmdldCA9IHRhcmdldDsgYnRuLnJlbCA9ICdub29wZW5lciBub3JlZmVycmVyJzsgfQogICAgICB9CgogICAgICAvLyBTZWNvbmQgYnV0dG9uOiBpdHMgVVJMIGNvbWVzIGZyb20gdGhlIGltYWdlJ3MgIlRpdGxlIiBmaWVsZCAoYQogICAgICAvLyBzZXBhcmF0ZSBmaWVsZCBmcm9tIEFsdCBUZXh0LCBmb3VuZCBpbiB0aGUgc2FtZSBJbWFnZSBibG9jawogICAgICAvLyBzZXR0aW5ncykgLS0gcmV1c2luZyBhbiBleGlzdGluZyBXb3JkUHJlc3MgZmllbGQgcmF0aGVyIHRoYW4KICAgICAgLy8gaW52ZW50aW5nIGEgbmV3IG9uZSB0byBmaWxsIGluLgogICAgICBjb25zdCBidG4yVXJsID0gc291cmNlLmdldEF0dHJpYnV0ZSgndGl0bGUnKTsKICAgICAgY29uc3QgYnRuMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtc3NCdG4yJyk7CiAgICAgIGlmIChidG4yVXJsKSB7CiAgICAgICAgYnRuMi5ocmVmID0gYnRuMlVybDsKICAgICAgICBidG4yLnRleHRDb250ZW50ID0gYnRuMkxhYmVsIHx8ICdMZWFybiBNb3JlJzsKICAgICAgICBidG4yLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKICAgICAgICBidG4yLnRhcmdldCA9ICdfYmxhbmsnOwogICAgICAgIGJ0bjIucmVsID0gJ25vb3BlbmVyIG5vcmVmZXJyZXInOwogICAgICB9CiAgICB9CgogICAgLy8gUmV2ZWFsLW9uLXNjcm9sbAogICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubXNzLXRlYXNlci1lbWJlZCcpOwogICAgaWYgKGVsKSB7CiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3JldmVhbCcpOwogICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gewogICAgICAgIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7CiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgZW50cnkudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2lzLXZpc2libGUnKTsKICAgICAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVudHJ5LnRhcmdldCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sIHsgdGhyZXNob2xkOiAwLjE1IH0pOwogICAgICBvYnNlcnZlci5vYnNlcnZlKGVsKTsKICAgIH0KICB9CgogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICBpbml0KCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgaW5pdCk7CiAgfQp9KSgpOwo=

CiAgLnZpZGVvLWhlcm8tZW1iZWR7CiAgICAtLW9yYW5nZTojREI4QjNCOyAtLWNyZWFtOiNGNEVFREQ7IC0taW5rOiMyNDFDMTM7IC0tdGVhbC1kYXJrOiMyMzRBNDM7IC0tdGVhbDojMzM2NjVDOwogIH0KICAudmlkZW8taGVyby1lbWJlZCwgLnZpZGVvLWhlcm8tZW1iZWQgKnsgYm94LXNpemluZzpib3JkZXItYm94OyB9CiAgLnZpZGVvLWhlcm8tZW1iZWR7CiAgICBtYXJnaW46MCBhdXRvOyBwYWRkaW5nOjA7IGZvbnQtZmFtaWx5OidLYXJsYScsc2Fucy1zZXJpZjsKICAgIHdpZHRoOjEwMHZ3OyBwb3NpdGlvbjpyZWxhdGl2ZTsgbGVmdDo1MCU7IHJpZ2h0OjUwJTsKICAgIG1hcmdpbi1sZWZ0Oi01MHZ3OyBtYXJnaW4tcmlnaHQ6LTUwdnc7IG1heC13aWR0aDoxMDB2dzsKICB9CgogIC52aWRlby1oZXJvLWVtYmVkIC52aC1jYXJkewogICAgcG9zaXRpb246cmVsYXRpdmU7CiAgICBvdmVyZmxvdzpoaWRkZW47CiAgICBtaW4taGVpZ2h0OjUyMHB4OwogICAgbWluLWhlaWdodDoxMDB2aDsKICAgIG1pbi1oZWlnaHQ6MTAwc3ZoOwogICAgZGlzcGxheTpmbGV4OwogICAgYWxpZ24taXRlbXM6Y2VudGVyOwogICAganVzdGlmeS1jb250ZW50OmNlbnRlcjsKICAgIGJhY2tncm91bmQ6dmFyKC0taW5rKTsKICB9CiAgLnZpZGVvLWhlcm8tZW1iZWQgLnZoLWJnLXZpZGVvLCAudmlkZW8taGVyby1lbWJlZCAudmgtYmctZmFsbGJhY2t7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsgaW5zZXQ6MDsgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IG9iamVjdC1maXQ6Y292ZXI7CiAgICBwb2ludGVyLWV2ZW50czpub25lOyBib3JkZXI6bm9uZTsKICB9CiAgLyogLnZoLWJnLXZpZGVvIG1heSBlbmQgdXAgYXBwbGllZCB0byBhIHBsYWluIDx2aWRlbz4gdGFnLCBhIFZpZGVvSlMKICAgICB3cmFwcGVyIGRpdiwgb3IgYW4gPGlmcmFtZT4gKFZpZGVvUHJlc3MncyBhY3R1YWwgcmVhbC13b3JsZCBjYXNlIC0tCiAgICAgaXRzIGNvbnRlbnRzIGFyZSBhIGRpZmZlcmVudCBvcmlnaW4sIHNvIHdlIGNhbiBvbmx5IHNpemUvcG9zaXRpb24gdGhlCiAgICAgaWZyYW1lIGl0c2VsZiwgbmV2ZXIgcmVhY2ggaW5zaWRlIGl0OyBhdXRvcGxheS9sb29wL25vLWNvbnRyb2xzIGZvcgogICAgIHRoYXQgY2FzZSBhcmUgc2V0IHZpYSB0aGUgaWZyYW1lJ3Mgb3duIFVSTCBwYXJhbWV0ZXJzIGluc3RlYWQpLiAqLwogIC52aWRlby1oZXJvLWVtYmVkIC52aC1iZy12aWRlbyB2aWRlbywKICAudmlkZW8taGVyby1lbWJlZCAudmgtYmctdmlkZW8gLnZqcy10ZWNoewogICAgd2lkdGg6MTAwJSAhaW1wb3J0YW50OyBoZWlnaHQ6MTAwJSAhaW1wb3J0YW50OyBvYmplY3QtZml0OmNvdmVyOwogIH0KICAudmlkZW8taGVyby1lbWJlZCAudmgtYmctdmlkZW8gLnZqcy1jb250cm9sLWJhciwKICAudmlkZW8taGVyby1lbWJlZCAudmgtYmctdmlkZW8gLnZqcy1iaWctcGxheS1idXR0b24sCiAgLnZpZGVvLWhlcm8tZW1iZWQgLnZoLWJnLXZpZGVvIC52anMtbG9hZGluZy1zcGlubmVyLAogIC52aWRlby1oZXJvLWVtYmVkIC52aC1iZy12aWRlbyAudmpzLXBvc3RlcnsKICAgIGRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OwogIH0KICAudmlkZW8taGVyby1lbWJlZCAudmgtYmctZmFsbGJhY2t7CiAgICBiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHZhcigtLXRlYWwtZGFyayksIHZhcigtLWluaykpOwogIH0KICAudmlkZW8taGVyby1lbWJlZCAudmgtb3ZlcmxheXsKICAgIHBvc2l0aW9uOmFic29sdXRlOyBpbnNldDowOyB6LWluZGV4OjI7CiAgICBiYWNrZ3JvdW5kOgogICAgICByYWRpYWwtZ3JhZGllbnQoZWxsaXBzZSBhdCBjZW50ZXIsIHJnYmEoMTAsOCw2LDAuNSkgMCUsIHJnYmEoMTAsOCw2LDAuMzIpIDQ1JSwgcmdiYSgxMCw4LDYsMC4xNikgNzUlKSwKICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxNSwxMCw4LDAuMjgpIDAlLCByZ2JhKDE1LDEwLDgsMC4zMikgNDUlLCByZ2JhKDEwLDcsNSwwLjYyKSAxMDAlKTsKICB9CiAgLnZpZGVvLWhlcm8tZW1iZWQgLnZoLWNvbnRlbnR7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsgei1pbmRleDo1OwogICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICBwYWRkaW5nOjQ4cHggNDBweDsKICAgIG1heC13aWR0aDo2NDBweDsKICB9CiAgLnZpZGVvLWhlcm8tZW1iZWQgLnZoLWV5ZWJyb3d7CiAgICBmb250LWZhbWlseTonS2FybGEnLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OjYwMDsgZm9udC1zaXplOjEyLjVweDsgbGV0dGVyLXNwYWNpbmc6MC4xNGVtOwogICAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBjb2xvcjp2YXIoLS1jcmVhbSk7IG9wYWNpdHk6MC45OyBtYXJnaW46MCAwIDEwcHg7CiAgICB0ZXh0LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwwLjYpOwogIH0KICAudmlkZW8taGVyby1lbWJlZCAudmgtaGVhZGxpbmV7CiAgICBmb250LWZhbWlseTonTGlicmUgQmFza2VydmlsbGUnLHNlcmlmOyBmb250LXdlaWdodDo3MDA7CiAgICBmb250LXNpemU6Y2xhbXAoMzBweCwgNC42dncsIDQ4cHgpOyBsaW5lLWhlaWdodDoxLjI7CiAgICBjb2xvcjp2YXIoLS1jcmVhbSk7IG1hcmdpbjowIDAgMTRweDsKICAgIHRleHQtc2hhZG93OjAgMnB4IDRweCByZ2JhKDAsMCwwLDAuNzUpLCAwIDRweCAxOHB4IHJnYmEoMCwwLDAsMC42NSk7CiAgfQogIC52aWRlby1oZXJvLWVtYmVkIC52aC10ZXh0ewogICAgZm9udC1mYW1pbHk6J0thcmxhJyxzYW5zLXNlcmlmOyBmb250LXdlaWdodDo0MDA7IGZvbnQtc2l6ZToxN3B4OyBsaW5lLWhlaWdodDoxLjY1OwogICAgY29sb3I6dmFyKC0tY3JlYW0pOyBtYXJnaW46MCAwIDI2cHg7CiAgICB0ZXh0LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwwLjg1KSwgMCAzcHggMTJweCByZ2JhKDAsMCwwLDAuNik7CiAgfQogIC52aWRlby1oZXJvLWVtYmVkIC52aC1idG57CiAgICBkaXNwbGF5OmlubGluZS1ibG9jazsgZm9udC1mYW1pbHk6J0xpYnJlIEJhc2tlcnZpbGxlJyxzZXJpZjsgZm9udC13ZWlnaHQ6NzAwOwogICAgZm9udC1zaXplOjE1cHg7IGNvbG9yOnZhcigtLWNyZWFtKTsgYm9yZGVyOjJweCBzb2xpZCB2YXIoLS1jcmVhbSk7CiAgICBwYWRkaW5nOjExcHggMzBweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4xOHMgZWFzZSwgY29sb3IgLjE4cyBlYXNlOwogIH0KICAudmlkZW8taGVyby1lbWJlZCAudmgtYnRuOmhvdmVyeyBiYWNrZ3JvdW5kOnZhcigtLWNyZWFtKTsgY29sb3I6dmFyKC0taW5rKTsgfQoKICAudmlkZW8taGVyby1lbWJlZC5yZXZlYWx7CiAgICBvcGFjaXR5OjA7IHRyYW5zZm9ybTp0cmFuc2xhdGVZKDI4cHgpOwogICAgdHJhbnNpdGlvbjpvcGFjaXR5IC43cyBlYXNlLCB0cmFuc2Zvcm0gLjdzIGVhc2U7CiAgfQogIC52aWRlby1oZXJvLWVtYmVkLnJldmVhbC5pcy12aXNpYmxlewogICAgb3BhY2l0eToxOyB0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTsKICB9CgogIEBtZWRpYSAobWF4LXdpZHRoOjcwMHB4KXsKICAgIC52aWRlby1oZXJvLWVtYmVkIC52aC1jYXJkeyBtaW4taGVpZ2h0OjEwMHZoOyBtaW4taGVpZ2h0OjEwMHN2aDsgfQogICAgLnZpZGVvLWhlcm8tZW1iZWQgLnZoLWNvbnRlbnR7IHBhZGRpbmc6MzJweCAyNnB4OyB9CiAgfQoKICAvKiBUaGUgV29yZFByZXNzIGJsb2NrcyB0aGF0IHN1cHBseSB0aGUgdmlkZW8gZmlsZSBhbmQgdGhlIHRleHQvbGluazoKICAgICByZWFkIGJ5IEpTIGF0IGxvYWQsIHRoZW4gaGlkZGVuLiAqLwogIC52aWRlby1iZy1zb3VyY2UsIC52aWRlby1tZXRhLXNvdXJjZXsgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7IH0K
CihmdW5jdGlvbigpewogIC8vIC0tLS0gVmlkZW8gZmlsZTogc3VwcGxpZWQgdmlhIGEgV29yZFByZXNzIFZpZGVvIGJsb2NrIC0tLS0KICAvLyBBZGQgYSBWaWRlbyBibG9jaywgdXBsb2FkIGEgdmlkZW8gZmlsZSAoYW4gYWN0dWFsIHZpZGVvIGZpbGUsIG5vdCBhCiAgLy8gWW91VHViZSBsaW5rIC0tIHRoaXMgbmVlZHMgdG8gYmUgc2VsZi1ob3N0ZWQgZm9yIGEgc2VhbWxlc3Mgc2lsZW50CiAgLy8gYXV0b3BsYXkgYmFja2dyb3VuZCksIHRoZW4gZ2l2ZSB0aGUgVklERU8gYmxvY2sgdGhlIENTUyBjbGFzcwogIC8vICJ2aWRlby1iZy1zb3VyY2UiIChCbG9jayBzZXR0aW5ncyAtPiBBZHZhbmNlZCAtPiBBZGRpdGlvbmFsIENTUwogIC8vIGNsYXNzKGVzKSkuCiAgLy8KICAvLyAtLS0tIEhlYWRsaW5lL3RleHQvYnV0dG9uOiBzdXBwbGllZCB2aWEgYSBzZXBhcmF0ZSBJbWFnZSBibG9jayAtLS0tCiAgLy8gQWRkIGFuIEltYWdlIGJsb2NrIGFueXdoZXJlIG9uIHRoZSBwYWdlIChhbnkgc21hbGwgcGxhY2Vob2xkZXIgcGhvdG8KICAvLyB3b3JrcywgaXQncyBuZXZlciBzaG93biAtLSBvbmx5IGl0cyB0ZXh0IGZpZWxkcyBhcmUgcmVhZCksIHRhZyBpdAogIC8vICJ2aWRlby1tZXRhLXNvdXJjZSIsIGFuZCBzZXQ6CiAgLy8gICAtIEFsdCBUZXh0IC0+IHRoZSBoZWFkbGluZQogIC8vICAgLSBDYXB0aW9uICAtPiB0aGUgZGVzY3JpcHRpb24gKG9wdGlvbmFsbHkgImRlc2NyaXB0aW9uIHwgQnV0dG9uIExhYmVsIikKICAvLyAgIC0gTGluayAoQ3VzdG9tIFVSTCkgLT4geW91ciBZb3VUdWJlIGNoYW5uZWwvdmlkZW8gVVJMCiAgZnVuY3Rpb24gaW5pdCgpewogICAgY29uc3Qgc291cmNlQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWJnLXNvdXJjZScpOwogICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aENhcmQnKTsKICAgIGNvbnN0IGZhbGxiYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZoRmFsbGJhY2snKTsKCiAgICBmdW5jdGlvbiByZWxvY2F0ZVZpZGVvKGF0dGVtcHRzTGVmdCl7CiAgICAgIGlmICghc291cmNlQ29udGFpbmVyKSByZXR1cm47CgogICAgICAvLyAtLS0tIENhc2UgMTogVmlkZW9QcmVzcyAoSmV0cGFjaykgdmlhIGEgY3Jvc3Mtb3JpZ2luIGlmcmFtZSAtLS0tCiAgICAgIC8vIFRoaXMgaXMgd2hhdCBWaWRlb1ByZXNzIGFjdHVhbGx5IHVzZXMuIFRoZSBpZnJhbWUncyAqY29udGVudHMqCiAgICAgIC8vIGxpdmUgb24gdmlkZW9wcmVzcy5jb20sIGEgZGlmZmVyZW50IG9yaWdpbiAtLSBubyBzY3JpcHQgb24gdGhpcwogICAgICAvLyBwYWdlIGNhbiBldmVyIHJlYWNoIGluc2lkZSBpdCwgYnkgZGVzaWduIChhIGJyb3dzZXIgc2VjdXJpdHkgcnVsZSwKICAgICAgLy8gbm90IHNvbWV0aGluZyBmaXhhYmxlIHdpdGggY2xldmVyZXIgY29kZSkuIEJ1dCBWaWRlb1ByZXNzIGV4cG9zZXMKICAgICAgLy8gYXV0b3BsYXkvbG9vcC9jb250cm9scyBhcyBVUkwgcGFyYW1ldGVycyBvbiB0aGUgaWZyYW1lIGl0c2VsZiwKICAgICAgLy8gd2hpY2ggd2UgQ0FOIHJlYWQgYW5kIHJld3JpdGUsIHRoZW4gbGV0IFZpZGVvUHJlc3MncyBvd24gcGxheWVyCiAgICAgIC8vIGhhbmRsZSBwbGF5YmFjayBuYXRpdmVseS4KICAgICAgY29uc3QgaWZyYW1lID0gc291cmNlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpOwogICAgICBpZiAoaWZyYW1lKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaWZyYW1lLnNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpOwogICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2F1dG9QbGF5JywgJzEnKTsKICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdjb250cm9scycsICcwJyk7CiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnbG9vcCcsICcxJyk7CiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnbXV0ZWQnLCAnMScpOwogICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3BsYXlzaW5saW5lJywgJzEnKTsKICAgICAgICAgIGlmcmFtZS5zcmMgPSB1cmwudG9TdHJpbmcoKTsKICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkIGZvciBhbnkgcmVhc29uLCBsZWF2ZSBpdCBhcy1pcyAqLyB9CgogICAgICAgIGlmcmFtZS5jbGFzc0xpc3QuYWRkKCd2aC1iZy12aWRlbycpOwogICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBjYXJkLmluc2VydEJlZm9yZShpZnJhbWUsIGZhbGxiYWNrKTsKICAgICAgICBmYWxsYmFjay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgdmlkZW9FbCA9IHNvdXJjZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICBjb25zdCBoYXNSZWFsU3JjID0gdmlkZW9FbCAmJiAodmlkZW9FbC5jdXJyZW50U3JjIHx8IHZpZGVvRWwuc3JjKTsKCiAgICAgIC8vIEEgdmlkZW8gKG9yIGlmcmFtZSkgY2FuIGluaXRpYWxpemUgYXN5bmNocm9ub3VzbHksIHNvbWV0aW1lcyBhZnRlcgogICAgICAvLyBvdXIgb3duIHNjcmlwdCBydW5zIC0tIGlmIHRoZXJlJ3Mgbm90aGluZyB1c2FibGUgeWV0LCB3YWl0IGJyaWVmbHkKICAgICAgLy8gYW5kIGNoZWNrIGFnYWluIGEgZmV3IHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAuCiAgICAgIGlmICghaWZyYW1lICYmICFoYXNSZWFsU3JjICYmIGF0dGVtcHRzTGVmdCA+IDApIHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlbG9jYXRlVmlkZW8oYXR0ZW1wdHNMZWZ0IC0gMSksIDQwMCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghdmlkZW9FbCkgcmV0dXJuOwoKICAgICAgY29uc3QgaXNCbG9iU3JjID0gdmlkZW9FbC5jdXJyZW50U3JjICYmIHZpZGVvRWwuY3VycmVudFNyYy5pbmRleE9mKCdibG9iOicpID09PSAwOwoKICAgICAgaWYgKGlzQmxvYlNyYykgewogICAgICAgIC8vIFNhbWUtZG9jdW1lbnQgcGxheWVyIChub3QgdGhlIGlmcmFtZSBjYXNlIGFib3ZlKSB1c2luZyBhIGJsb2I6CiAgICAgICAgLy8gc291cmNlIC0tIHJlbG9jYXRlIHRoZSB3aG9sZSBwbGF5ZXIgcmF0aGVyIHRoYW4gcmVjcmVhdGluZyBpdCwKICAgICAgICAvLyBzaW5jZSBhIGJsb2IgVVJMIGNhbid0IGJlIHJldXNlZCBpbiBhIGZyZXNoIHZpZGVvIGVsZW1lbnQuCiAgICAgICAgY29uc3QgcGxheWVyV3JhcHBlciA9IHZpZGVvRWwuY2xvc2VzdCgnLnZpZGVvLWpzJykgfHwgdmlkZW9FbC5jbG9zZXN0KCdbY2xhc3MqPSJ2aWRlb3ByZXNzIl0nKSB8fCB2aWRlb0VsOwogICAgICAgIHBsYXllcldyYXBwZXIuY2xhc3NMaXN0LmFkZCgndmgtYmctdmlkZW8nKTsKICAgICAgICBjYXJkLmluc2VydEJlZm9yZShwbGF5ZXJXcmFwcGVyLCBmYWxsYmFjayk7CiAgICAgICAgZmFsbGJhY2suc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICAgICAgdmlkZW9FbC5tdXRlZCA9IHRydWU7CiAgICAgICAgdmlkZW9FbC5sb29wID0gdHJ1ZTsKICAgICAgICB2aWRlb0VsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgIGNvbnN0IHBsYXlQcm9taXNlID0gdmlkZW9FbC5wbGF5KCk7CiAgICAgICAgaWYgKHBsYXlQcm9taXNlICYmIHBsYXlQcm9taXNlLmNhdGNoKSB7CiAgICAgICAgICBwbGF5UHJvbWlzZS5jYXRjaCgoKSA9PiB7IGZhbGxiYWNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodmlkZW9FbC5jdXJyZW50U3JjIHx8IHZpZGVvRWwuc3JjKSB7CiAgICAgICAgLy8gUGxhaW4sIG5vbi1WaWRlb1ByZXNzIHZpZGVvIChhIHNpbXBsZSBkaXJlY3QgZmlsZSBVUkwpIC0tIHRoZQogICAgICAgIC8vIHN0cmFpZ2h0Zm9yd2FyZCBhcHByb2FjaCB3b3JrcyBmaW5lIGhlcmUuCiAgICAgICAgY29uc3Qgc3JjID0gdmlkZW9FbC5jdXJyZW50U3JjIHx8IHZpZGVvRWwuc3JjOwogICAgICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKICAgICAgICB2aWRlby5jbGFzc05hbWUgPSAndmgtYmctdmlkZW8nOwogICAgICAgIHZpZGVvLnNyYyA9IHNyYzsKICAgICAgICB2aWRlby5hdXRvcGxheSA9IHRydWU7CiAgICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlOwogICAgICAgIHZpZGVvLmxvb3AgPSB0cnVlOwogICAgICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTsKICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBjYXJkLmluc2VydEJlZm9yZSh2aWRlbywgZmFsbGJhY2spOwogICAgICAgIGZhbGxiYWNrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgY29uc3QgcGxheVByb21pc2UgPSB2aWRlby5wbGF5KCk7CiAgICAgICAgaWYgKHBsYXlQcm9taXNlICYmIHBsYXlQcm9taXNlLmNhdGNoKSB7CiAgICAgICAgICBwbGF5UHJvbWlzZS5jYXRjaCgoKSA9PiB7IGZhbGxiYWNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJlbG9jYXRlVmlkZW8oNik7IC8vIHJldHJpZXMgZm9yIHVwIHRvIH4yLjRzIHRvdGFsIGJlZm9yZSBnaXZpbmcgdXAKCiAgICBjb25zdCBtZXRhU291cmNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLW1ldGEtc291cmNlIGltZycpOwogICAgaWYgKG1ldGFTb3VyY2UpIHsKICAgICAgaWYgKG1ldGFTb3VyY2UuYWx0KSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZoSGVhZGxpbmUnKS50ZXh0Q29udGVudCA9IG1ldGFTb3VyY2UuYWx0OwogICAgICB9CiAgICAgIGNvbnN0IGZpZ3VyZSA9IG1ldGFTb3VyY2UuY2xvc2VzdCgnZmlndXJlJyk7CiAgICAgIGNvbnN0IGNhcHRpb24gPSBmaWd1cmUgPyBmaWd1cmUucXVlcnlTZWxlY3RvcignZmlnY2FwdGlvbicpIDogbnVsbDsKICAgICAgaWYgKGNhcHRpb24pIHsKICAgICAgICBjb25zdCByYXcgPSBjYXB0aW9uLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICBsZXQgdGV4dCA9IHJhdywgYnRuTGFiZWwgPSBudWxsOwogICAgICAgIGlmIChyYXcuaW5jbHVkZXMoJ3wnKSkgewogICAgICAgICAgY29uc3QgcGFydHMgPSByYXcuc3BsaXQoJ3wnKTsKICAgICAgICAgIHRleHQgPSBwYXJ0c1swXS50cmltKCk7CiAgICAgICAgICBidG5MYWJlbCA9IHBhcnRzWzFdID8gcGFydHNbMV0udHJpbSgpIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZoVGV4dCcpLnRleHRDb250ZW50ID0gdGV4dDsKICAgICAgICBpZiAoYnRuTGFiZWwpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aEJ0bicpLnRleHRDb250ZW50ID0gYnRuTGFiZWw7CiAgICAgIH0KICAgICAgY29uc3QgbGlua0VsID0gbWV0YVNvdXJjZS5jbG9zZXN0KCdhJyk7CiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aEJ0bicpOwogICAgICBpZiAobGlua0VsKSB7CiAgICAgICAgY29uc3QgaHJlZiA9IGxpbmtFbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICBpZiAoaHJlZikgYnRuLmhyZWYgPSBocmVmOwogICAgICB9CiAgICB9CgogICAgLy8gUmV2ZWFsLW9uLXNjcm9sbAogICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8taGVyby1lbWJlZCcpOwogICAgaWYgKGVsKSB7CiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3JldmVhbCcpOwogICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gewogICAgICAgIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7CiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgZW50cnkudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2lzLXZpc2libGUnKTsKICAgICAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVudHJ5LnRhcmdldCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sIHsgdGhyZXNob2xkOiAwLjE1IH0pOwogICAgICBvYnNlcnZlci5vYnNlcnZlKGVsKTsKICAgIH0KICB9CgogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICBpbml0KCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgaW5pdCk7CiAgfQp9KSgpOwo=

CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZHsKICAgIC0tb3JhbmdlOiNEQjhCM0I7IC0tY3JlYW06I0Y0RUVERDsgLS1pbms6IzI0MUMxMzsgLS10ZWFsLWRhcms6IzIzNEE0MzsgLS10ZWFsOiMzMzY2NUM7CiAgfQogIC5wb2RjYXN0LXdhbGwtZW1iZWQsIC5wb2RjYXN0LXdhbGwtZW1iZWQgKnsgYm94LXNpemluZzpib3JkZXItYm94OyB9CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZHsKICAgIG1hcmdpbjowIGF1dG87IHBhZGRpbmc6MDsgZm9udC1mYW1pbHk6J0thcmxhJyxzYW5zLXNlcmlmOwogICAgd2lkdGg6MTAwdnc7IHBvc2l0aW9uOnJlbGF0aXZlOyBsZWZ0OjUwJTsgcmlnaHQ6NTAlOwogICAgbWFyZ2luLWxlZnQ6LTUwdnc7IG1hcmdpbi1yaWdodDotNTB2dzsgbWF4LXdpZHRoOjEwMHZ3OwogIH0KCiAgLnBvZGNhc3Qtd2FsbC1lbWJlZCAucHctY2FyZHsKICAgIHBvc2l0aW9uOnJlbGF0aXZlOwogICAgb3ZlcmZsb3c6aGlkZGVuOwogICAgbWluLWhlaWdodDo1MjBweDsKICAgIG1pbi1oZWlnaHQ6MTAwdmg7CiAgICBtaW4taGVpZ2h0OjEwMHN2aDsKICAgIGRpc3BsYXk6ZmxleDsKICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDpjZW50ZXI7CiAgICAvKiBDU1MtZ2VuZXJhdGVkIGJyaWNrIHBhdHRlcm4gLS0gbm8gZXh0ZXJuYWwgaW1hZ2UgbmVlZGVkLCBhbmQgdGhlCiAgICAgICBicmljayB0b25lIGlzIHR1bmVkIHRvIHJlYWQgY2xlYXJseSBvbmNlIHRoZSBkYXJrIHRleHQtbGVnaWJpbGl0eQogICAgICAgb3ZlcmxheSBzaXRzIG9uIHRvcCBvZiBpdC4gKi8KICAgIGJhY2tncm91bmQtY29sb3I6IzhhNTU0MDsKICAgIGJhY2tncm91bmQtaW1hZ2U6CiAgICAgIGxpbmVhci1ncmFkaWVudCgzMzVkZWcsICNhODY5NGMgMjNweCwgdHJhbnNwYXJlbnQgMjNweCksCiAgICAgIGxpbmVhci1ncmFkaWVudCgxNTVkZWcsICNhODY5NGMgMjNweCwgdHJhbnNwYXJlbnQgMjNweCksCiAgICAgIGxpbmVhci1ncmFkaWVudCgzMzVkZWcsICNhODY5NGMgMjNweCwgdHJhbnNwYXJlbnQgMjNweCksCiAgICAgIGxpbmVhci1ncmFkaWVudCgxNTVkZWcsICNhODY5NGMgMjNweCwgdHJhbnNwYXJlbnQgMjNweCk7CiAgICBiYWNrZ3JvdW5kLXNpemU6NThweCA1OHB4OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowcHggMnB4LCA0cHggMzVweCwgMjlweCAzMXB4LCAzNHB4IDZweDsKICB9CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZCAucHctY2FyZDo6YmVmb3JlewogICAgY29udGVudDonJzsKICAgIHBvc2l0aW9uOmFic29sdXRlOyBpbnNldDowOwogICAgYmFja2dyb3VuZDpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDBkZWcsIHJnYmEoNDAsMjUsMTgsMC4zNSkgMHB4LCByZ2JhKDQwLDI1LDE4LDAuMzUpIDNweCwgdHJhbnNwYXJlbnQgM3B4LCB0cmFuc3BhcmVudCAyOXB4KTsKICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7CiAgfQoKICAucG9kY2FzdC13YWxsLWVtYmVkIC5wdy1mcmFtZS1ncmlkewogICAgcG9zaXRpb246YWJzb2x1dGU7IGluc2V0OjA7CiAgICBkaXNwbGF5OmdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDYsIDFmcik7CiAgICBnYXA6MjJweDsKICAgIHBhZGRpbmc6MzJweDsKICAgIGFsaWduLWNvbnRlbnQ6Y2VudGVyOwogIH0KICAucG9kY2FzdC13YWxsLWVtYmVkIC5wdy1mcmFtZXsKICAgIGFzcGVjdC1yYXRpbzoxLzE7CiAgICBiYWNrZ3JvdW5kOnZhcigtLWNyZWFtKTsKICAgIHBhZGRpbmc6OHB4OwogICAgYm94LXNoYWRvdzoKICAgICAgMCA0cHggOHB4IHJnYmEoMCwwLDAsMC40NSksCiAgICAgIDAgMTZweCAzMnB4IHJnYmEoMCwwLDAsMC41NSksCiAgICAgIDAgMzJweCA2NHB4IHJnYmEoMCwwLDAsMC40KTsKICB9CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZCAucHctZnJhbWUgaW1nLAogIC5wb2RjYXN0LXdhbGwtZW1iZWQgLnB3LWZyYW1lIC5wdy10aWxlLXBsYWNlaG9sZGVyewogICAgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IG9iamVjdC1maXQ6Y292ZXI7IGRpc3BsYXk6YmxvY2s7CiAgfQoKICAucG9kY2FzdC13YWxsLWVtYmVkIC5wdy1vdmVybGF5ewogICAgcG9zaXRpb246YWJzb2x1dGU7IGluc2V0OjA7IHotaW5kZXg6MjsKICAgIGJhY2tncm91bmQ6CiAgICAgIHJhZGlhbC1ncmFkaWVudChlbGxpcHNlIGF0IGNlbnRlciwgcmdiYSg4LDYsNSwwLjY4KSAwJSwgcmdiYSg4LDYsNSwwLjUpIDQ1JSwgcmdiYSg4LDYsNSwwLjMpIDc1JSksCiAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTIsOCw2LDAuNCkgMCUsIHJnYmEoMTIsOCw2LDAuNDQpIDQ1JSwgcmdiYSg4LDUsNCwwLjcyKSAxMDAlKTsKICB9CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZCAucHctY29udGVudHsKICAgIHBvc2l0aW9uOnJlbGF0aXZlOyB6LWluZGV4OjU7CiAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgIHBhZGRpbmc6NDhweCA0MHB4OwogICAgbWF4LXdpZHRoOjY0MHB4OwogIH0KICAucG9kY2FzdC13YWxsLWVtYmVkIC5wdy1leWVicm93ewogICAgZm9udC1mYW1pbHk6J0thcmxhJyxzYW5zLXNlcmlmOyBmb250LXdlaWdodDo2MDA7IGZvbnQtc2l6ZToxMi41cHg7IGxldHRlci1zcGFjaW5nOjAuMTRlbTsKICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsgY29sb3I6dmFyKC0tY3JlYW0pOyBvcGFjaXR5OjAuOTU7IG1hcmdpbjowIDAgMTBweDsKICAgIHRleHQtc2hhZG93OjAgMXB4IDNweCByZ2JhKDAsMCwwLDAuOCk7CiAgfQogIC5wb2RjYXN0LXdhbGwtZW1iZWQgLnB3LWhlYWRsaW5lewogICAgZm9udC1mYW1pbHk6J0xpYnJlIEJhc2tlcnZpbGxlJyxzZXJpZjsgZm9udC13ZWlnaHQ6NzAwOwogICAgZm9udC1zaXplOmNsYW1wKDMwcHgsIDQuNnZ3LCA0OHB4KTsgbGluZS1oZWlnaHQ6MS4yOwogICAgY29sb3I6dmFyKC0tY3JlYW0pOyBtYXJnaW46MCAwIDE0cHg7CiAgICB0ZXh0LXNoYWRvdzowIDJweCA0cHggcmdiYSgwLDAsMCwwLjg1KSwgMCA0cHggMjBweCByZ2JhKDAsMCwwLDAuNzUpOwogICAgLXdlYmtpdC10ZXh0LXN0cm9rZTowLjZweCByZ2JhKDAsMCwwLDAuNCk7CiAgfQogIC5wb2RjYXN0LXdhbGwtZW1iZWQgLnB3LXRleHR7CiAgICBmb250LWZhbWlseTonS2FybGEnLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OjQwMDsgZm9udC1zaXplOjE3cHg7IGxpbmUtaGVpZ2h0OjEuNjU7CiAgICBjb2xvcjp2YXIoLS1jcmVhbSk7IG1hcmdpbjowIDAgMjZweDsKICAgIHRleHQtc2hhZG93OjAgMXB4IDNweCByZ2JhKDAsMCwwLDAuOSksIDAgM3B4IDE0cHggcmdiYSgwLDAsMCwwLjc1KTsKICB9CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZCAucHctYnRuewogICAgZGlzcGxheTppbmxpbmUtYmxvY2s7IGZvbnQtZmFtaWx5OidMaWJyZSBCYXNrZXJ2aWxsZScsc2VyaWY7IGZvbnQtd2VpZ2h0OjcwMDsKICAgIGZvbnQtc2l6ZToxNXB4OyBjb2xvcjp2YXIoLS1jcmVhbSk7IGJvcmRlcjoycHggc29saWQgdmFyKC0tY3JlYW0pOwogICAgcGFkZGluZzoxMXB4IDMwcHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IHRleHQtZGVjb3JhdGlvbjpub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuMThzIGVhc2UsIGNvbG9yIC4xOHMgZWFzZTsKICB9CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZCAucHctYnRuOmhvdmVyeyBiYWNrZ3JvdW5kOnZhcigtLWNyZWFtKTsgY29sb3I6dmFyKC0taW5rKTsgfQoKICAucG9kY2FzdC13YWxsLWVtYmVkLnJldmVhbHsKICAgIG9wYWNpdHk6MDsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjhweCk7CiAgICB0cmFuc2l0aW9uOm9wYWNpdHkgLjdzIGVhc2UsIHRyYW5zZm9ybSAuN3MgZWFzZTsKICB9CiAgLnBvZGNhc3Qtd2FsbC1lbWJlZC5yZXZlYWwuaXMtdmlzaWJsZXsKICAgIG9wYWNpdHk6MTsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7CiAgfQoKICBAbWVkaWEgKG1heC13aWR0aDo3MDBweCl7CiAgICAucG9kY2FzdC13YWxsLWVtYmVkIC5wdy1jYXJkeyBtaW4taGVpZ2h0OjEwMHZoOyBtaW4taGVpZ2h0OjEwMHN2aDsgfQogICAgLnBvZGNhc3Qtd2FsbC1lbWJlZCAucHctY29udGVudHsgcGFkZGluZzozMnB4IDI2cHg7IH0KICAgIC5wb2RjYXN0LXdhbGwtZW1iZWQgLnB3LWZyYW1lLWdyaWR7IGdyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMywgMWZyKTsgZ2FwOjE0cHg7IHBhZGRpbmc6MThweDsgfQogIH0KCiAgLyogVGhlIFdvcmRQcmVzcyBibG9ja3MgdGhhdCBzdXBwbHkgdGhlIGNvdmVyIGltYWdlcyBhbmQgdGhlIHRleHQvbGluazoKICAgICByZWFkIGJ5IEpTIGF0IGxvYWQsIHRoZW4gaGlkZGVuLiAqLwogIC5wb2RjYXN0LXdhbGwtc291cmNlLCAucG9kY2FzdC13YWxsLW1ldGF7IGRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyB9Cg==
CihmdW5jdGlvbigpewogIC8vIC0tLS0gQ292ZXIgaW1hZ2VzOiBzdXBwbGllZCB2aWEgYSBXb3JkUHJlc3MgR2FsbGVyeSBibG9jayAtLS0tCiAgLy8gQWRkIGEgR2FsbGVyeSBibG9jaywgdXBsb2FkIDQtOCBwb2RjYXN0IGNvdmVyL2xvZ28gaW1hZ2VzLCB0aGVuIGdpdmUKICAvLyB0aGUgR0FMTEVSWSBibG9jayB0aGUgQ1NTIGNsYXNzICJwb2RjYXN0LXdhbGwtc291cmNlIiAoQmxvY2sgc2V0dGluZ3MKICAvLyAtPiBBZHZhbmNlZCAtPiBBZGRpdGlvbmFsIENTUyBjbGFzcyhlcykpLgogIC8vCiAgLy8gLS0tLSBIZWFkbGluZS90ZXh0L2J1dHRvbjogc3VwcGxpZWQgdmlhIGEgc2VwYXJhdGUgSW1hZ2UgYmxvY2sgLS0tLQogIC8vIEFkZCBhbiBJbWFnZSBibG9jayBhbnl3aGVyZSBvbiB0aGUgcGFnZSAoYW55IHNtYWxsIHBsYWNlaG9sZGVyIHBob3RvCiAgLy8gd29ya3MsIGl0J3MgbmV2ZXIgc2hvd24gLS0gb25seSBpdHMgdGV4dCBmaWVsZHMgYXJlIHJlYWQpLCB0YWcgaXQKICAvLyAicG9kY2FzdC13YWxsLW1ldGEiLCBhbmQgc2V0OgogIC8vICAgLSBBbHQgVGV4dCAtPiB0aGUgaGVhZGxpbmUKICAvLyAgIC0gQ2FwdGlvbiAgLT4gdGhlIGRlc2NyaXB0aW9uIChvcHRpb25hbGx5ICJkZXNjcmlwdGlvbiB8IEJ1dHRvbiBMYWJlbCIpCiAgLy8gICAtIExpbmsgKEN1c3RvbSBVUkwpIC0+IHlvdXIgImFsbCBwb2RjYXN0cyIgcGFnZQogIGNvbnN0IFRJTEVfQ09VTlQgPSA0MjsgLy8gZW5vdWdoIGZyYW1lZCB0aWxlcyB0byBmaWxsIGEgdGFsbCBmdWxsLWhlaWdodCB3YWxsCgogIGZ1bmN0aW9uIGhpZ2hlc3RSZXNTcmMoaW1nKXsKICAgIGNvbnN0IGZ1bGxVcmwgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZ1bGwtdXJsJyk7CiAgICBpZiAoZnVsbFVybCkgcmV0dXJuIGZ1bGxVcmw7CiAgICBjb25zdCBzcmNzZXQgPSBpbWcuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKTsKICAgIGlmIChzcmNzZXQpIHsKICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHNyY3NldC5zcGxpdCgnLCcpLm1hcChwYXJ0ID0+IHsKICAgICAgICBjb25zdCBiaXRzID0gcGFydC50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoKGJpdHNbMV0gfHwgJycpLnJlcGxhY2UoJ3cnLCAnJyksIDEwKSB8fCAwOwogICAgICAgIHJldHVybiB7IHVybDogYml0c1swXSwgd2lkdGggfTsKICAgICAgfSk7CiAgICAgIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYi53aWR0aCAtIGEud2lkdGgpOwogICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggJiYgY2FuZGlkYXRlc1swXS51cmwpIHJldHVybiBjYW5kaWRhdGVzWzBdLnVybDsKICAgIH0KICAgIHJldHVybiBpbWcuc3JjOwogIH0KCiAgZnVuY3Rpb24gaW5pdCgpewogICAgY29uc3QgZ2FsbGVyeUltZ3MgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wb2RjYXN0LXdhbGwtc291cmNlIGltZycpKTsKICAgIGNvbnN0IGZyYW1lR3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwd0ZyYW1lR3JpZCcpOwoKICAgIGlmIChnYWxsZXJ5SW1ncy5sZW5ndGgpIHsKICAgICAgY29uc3Qgc3JjcyA9IGdhbGxlcnlJbWdzLm1hcChoaWdoZXN0UmVzU3JjKTsKICAgICAgY29uc3Qgc2h1ZmZsZWQgPSBzcmNzLnNsaWNlKCk7CiAgICAgIGZvciAobGV0IGkgPSBzaHVmZmxlZC5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7CiAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpOwogICAgICAgIFtzaHVmZmxlZFtpXSwgc2h1ZmZsZWRbal1dID0gW3NodWZmbGVkW2pdLCBzaHVmZmxlZFtpXV07CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUSUxFX0NPVU5UOyBpKyspIHsKICAgICAgICBjb25zdCBmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGZyYW1lLmNsYXNzTmFtZSA9ICdwdy1mcmFtZSc7CiAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgaW1nLnNyYyA9IHNodWZmbGVkW2kgJSBzaHVmZmxlZC5sZW5ndGhdOwogICAgICAgIGltZy5hbHQgPSAnJzsKICAgICAgICBpbWcubG9hZGluZyA9IGkgPCAxMiA/ICdlYWdlcicgOiAnbGF6eSc7CiAgICAgICAgZnJhbWUuYXBwZW5kQ2hpbGQoaW1nKTsKICAgICAgICBmcmFtZUdyaWQuYXBwZW5kQ2hpbGQoZnJhbWUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBjb2xvcnMgPSBbJyNjOTU3M2YnLCcjM2E1YThhJywnIzRhOGE1YScsJyNjOWE4M2YnLCcjOGE0YTdhJywnIzNmOGFjOSddOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRJTEVfQ09VTlQ7IGkrKykgewogICAgICAgIGNvbnN0IGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgZnJhbWUuY2xhc3NOYW1lID0gJ3B3LWZyYW1lJzsKICAgICAgICBjb25zdCBwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHBoLmNsYXNzTmFtZSA9ICdwdy10aWxlLXBsYWNlaG9sZGVyJzsKICAgICAgICBwaC5zdHlsZS5iYWNrZ3JvdW5kID0gY29sb3JzW2kgJSBjb2xvcnMubGVuZ3RoXTsKICAgICAgICBmcmFtZS5hcHBlbmRDaGlsZChwaCk7CiAgICAgICAgZnJhbWVHcmlkLmFwcGVuZENoaWxkKGZyYW1lKTsKICAgICAgfQogICAgfQoKICAgIGNvbnN0IG1ldGFTb3VyY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucG9kY2FzdC13YWxsLW1ldGEgaW1nJyk7CiAgICBpZiAobWV0YVNvdXJjZSkgewogICAgICBpZiAobWV0YVNvdXJjZS5hbHQpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHdIZWFkbGluZScpLnRleHRDb250ZW50ID0gbWV0YVNvdXJjZS5hbHQ7CiAgICAgIH0KICAgICAgY29uc3QgZmlndXJlID0gbWV0YVNvdXJjZS5jbG9zZXN0KCdmaWd1cmUnKTsKICAgICAgY29uc3QgY2FwdGlvbiA9IGZpZ3VyZSA/IGZpZ3VyZS5xdWVyeVNlbGVjdG9yKCdmaWdjYXB0aW9uJykgOiBudWxsOwogICAgICBpZiAoY2FwdGlvbikgewogICAgICAgIGNvbnN0IHJhdyA9IGNhcHRpb24udGV4dENvbnRlbnQudHJpbSgpOwogICAgICAgIGxldCB0ZXh0ID0gcmF3LCBidG5MYWJlbCA9IG51bGw7CiAgICAgICAgaWYgKHJhdy5pbmNsdWRlcygnfCcpKSB7CiAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJhdy5zcGxpdCgnfCcpOwogICAgICAgICAgdGV4dCA9IHBhcnRzWzBdLnRyaW0oKTsKICAgICAgICAgIGJ0bkxhYmVsID0gcGFydHNbMV0gPyBwYXJ0c1sxXS50cmltKCkgOiBudWxsOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHdUZXh0JykudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICAgIGlmIChidG5MYWJlbCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B3QnRuJykudGV4dENvbnRlbnQgPSBidG5MYWJlbDsKICAgICAgfQogICAgICBjb25zdCBsaW5rRWwgPSBtZXRhU291cmNlLmNsb3Nlc3QoJ2EnKTsKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B3QnRuJyk7CiAgICAgIGlmIChsaW5rRWwpIHsKICAgICAgICBjb25zdCBocmVmID0gbGlua0VsLmdldEF0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgIGNvbnN0IHRhcmdldCA9IGxpbmtFbC5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpOwogICAgICAgIGlmIChocmVmKSBidG4uaHJlZiA9IGhyZWY7CiAgICAgICAgaWYgKHRhcmdldCkgeyBidG4udGFyZ2V0ID0gdGFyZ2V0OyBidG4ucmVsID0gJ25vb3BlbmVyIG5vcmVmZXJyZXInOyB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZXZlYWwtb24tc2Nyb2xsCiAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wb2RjYXN0LXdhbGwtZW1iZWQnKTsKICAgIGlmIChlbCkgewogICAgICBlbC5jbGFzc0xpc3QuYWRkKCdyZXZlYWwnKTsKICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgICBlbnRyaWVzLmZvckVhY2goZW50cnkgPT4gewogICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7CiAgICAgICAgICAgIGVudHJ5LnRhcmdldC5jbGFzc0xpc3QuYWRkKCdpcy12aXNpYmxlJyk7CiAgICAgICAgICAgIG9ic2VydmVyLnVub2JzZXJ2ZShlbnRyeS50YXJnZXQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LCB7IHRocmVzaG9sZDogMC4xIH0pOwogICAgICBvYnNlcnZlci5vYnNlcnZlKGVsKTsKICAgIH0KICB9CgogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICBpbml0KCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgaW5pdCk7CiAgfQp9KSgpOwo=









CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWR7CiAgICAtLW9yYW5nZTojREI4QjNCOyAtLWNyZWFtOiNGNEVFREQ7IC0taW5rOiMyNDFDMTM7IC0tdGVhbC1kYXJrOiMyMzRBNDM7IC0tdGVhbDojMzM2NjVDOwogICAgLS1iZzp0cmFuc3BhcmVudDsKICAgIC0tbWItZ29sZDojRjNDQjY3OyAtLW1iLWJyb3duOiM5RTVBMzg7IC0tbWItYnJvd24tZGFyazojOTc1MDM0OyAtLW1iLWNyZWFtOiNGMEUxQkI7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkLCAubGl2ZS1wb2xhcm9pZC1lbWJlZCAqeyBib3gtc2l6aW5nOmJvcmRlci1ib3g7IH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZHsKICAgIHBhZGRpbmc6NzBweCA0MHB4OyBmb250LWZhbWlseTonS2FybGEnLHNhbnMtc2VyaWY7CiAgICBiYWNrZ3JvdW5kOnZhcigtLWJnKTsKICAgIHdpZHRoOjEwMHZ3OyBtYXgtd2lkdGg6MTAwdnc7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsgbGVmdDo1MCU7CiAgICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTsKICAgIGNvbnRhaW5lci10eXBlOmlubGluZS1zaXplOyBjb250YWluZXItbmFtZTpiaWVtYmVkOwogIH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtbGF5b3V0LAogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1idG4tcm93eyBtYXgtd2lkdGg6MjE2MHB4OyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1sYXlvdXR7CiAgICBkaXNwbGF5OmZsZXg7IGp1c3RpZnktY29udGVudDpjZW50ZXI7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjU4cHg7IGZsZXgtd3JhcDp3cmFwOwogICAgb3ZlcmZsb3c6aGlkZGVuOwogIH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtbWF0Y2hib29rLWltZ3sKICAgIHdpZHRoOjQxOHB4OyBtYXgtd2lkdGg6MTAwJTsKICAgIGZpbHRlcjpkcm9wLXNoYWRvdygwIDhweCAxNnB4IHJnYmEoMzYsMjgsMTksMC4yMikpIGRyb3Atc2hhZG93KDAgMThweCAzMnB4IHJnYmEoMzYsMjgsMTksMC4yKSk7CiAgICBmbGV4LXNocmluazowOwogICAgZGlzcGxheTpibG9jazsKICAgIHRyYW5zaXRpb246ZmlsdGVyIC4xOHMgZWFzZTsKICB9CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLW1hdGNoYm9vay1jb2wgPiBheyBkaXNwbGF5OmJsb2NrOyBjdXJzb3I6cG9pbnRlcjsgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1tYXRjaGJvb2stY29sID4gYTpob3ZlciAubHAtbWF0Y2hib29rLWltZ3sKICAgIGZpbHRlcjpkcm9wLXNoYWRvdygwIDEwcHggMjBweCByZ2JhKDM2LDI4LDE5LDAuMzIpKSBkcm9wLXNoYWRvdygwIDIycHggNDBweCByZ2JhKDM2LDI4LDE5LDAuMykpOwogIH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtbWF0Y2hib29rLWNvbHsKICAgIGRpc3BsYXk6ZmxleDsgZmxleC1kaXJlY3Rpb246Y29sdW1uOyBnYXA6NTNweDsgZmxleC1zaHJpbms6MDsKICB9CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLW1hdGNoYm9vay1jb2wgPiAqOm50aC1jaGlsZCgxKXsgdHJhbnNmb3JtOnJvdGF0ZSgtMmRlZyk7IGFsaWduLXNlbGY6ZmxleC1zdGFydDsgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1tYXRjaGJvb2stY29sID4gKjpudGgtY2hpbGQoMil7IHRyYW5zZm9ybTpyb3RhdGUoMmRlZyk7IGFsaWduLXNlbGY6ZmxleC1lbmQ7IH0KCiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLXN0YWNreyBwb3NpdGlvbjpyZWxhdGl2ZTsgaGVpZ2h0Ojk1MHB4OyB3aWR0aDo4MzVweDsgbWF4LXdpZHRoOjEwMCU7IH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtcG9sYXJvaWR7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIGJhY2tncm91bmQ6I2ZmZjsKICAgIHBhZGRpbmc6MjNweCAyM3B4IDk4cHg7CiAgICBib3gtc2hhZG93OjAgOHB4IDIwcHggcmdiYSgzNiwyOCwxOSwwLjI1KSwgMCAycHggNnB4IHJnYmEoMzYsMjgsMTksMC4xNSk7CiAgICB3aWR0aDo0NzVweDsKICAgIG1heC13aWR0aDo3MCU7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1wb2xhcm9pZCBpbWcsCiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLXBvbGFyb2lkIC5scC1wbGFjZWhvbGRlcnsKICAgIHdpZHRoOjEwMCU7IGFzcGVjdC1yYXRpbzoxLzE7IG9iamVjdC1maXQ6Y292ZXI7IGRpc3BsYXk6YmxvY2s7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1jYXB7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsgYm90dG9tOjhweDsgbGVmdDoxMHB4OyByaWdodDoxMHB4OwogICAgZm9udC1mYW1pbHk6J1Blcm1hbmVudCBNYXJrZXInLCBjdXJzaXZlOyBmb250LXNpemU6MjVweDsKICAgIHRleHQtYWxpZ246Y2VudGVyOyBsaW5lLWhlaWdodDoxLjM1OwogIH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtY2FwIHNwYW57CiAgICBkaXNwbGF5OmlubGluZS1ibG9jazsKICAgIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDEwMGRlZywKICAgICAgdmFyKC0taW5rKSAwJSwgdmFyKC0taW5rKSAyMCUsICM2YjVkNGYgMzglLAogICAgICB2YXIoLS1pbmspIDU1JSwgdmFyKC0taW5rKSA3OCUsICM4YTdhNjggOTAlLCB2YXIoLS1pbmspIDEwMCUpOwogICAgLXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6dGV4dDsgYmFja2dyb3VuZC1jbGlwOnRleHQ7CiAgICAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDsgY29sb3I6dHJhbnNwYXJlbnQ7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1wMXsgdG9wOjA7IGxlZnQ6NSU7IHRyYW5zZm9ybTpyb3RhdGUoLTZkZWcpOyB6LWluZGV4OjE7IH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtcDJ7IHRvcDoyJTsgbGVmdDo0NCU7IHRyYW5zZm9ybTpyb3RhdGUoNGRlZyk7IHotaW5kZXg6MjsgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1wM3sgdG9wOjQ2JTsgbGVmdDowOyB0cmFuc2Zvcm06cm90YXRlKDNkZWcpOyB6LWluZGV4OjQ7IH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtcDR7IHRvcDo0NiU7IGxlZnQ6NDMlOyB0cmFuc2Zvcm06cm90YXRlKC00ZGVnKTsgei1pbmRleDozOyB9CgogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1jb250ZW50eyB0ZXh0LWFsaWduOmxlZnQ7IH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtY29udGVudCAubHAtZXllYnJvd3sgZGlzcGxheTpub25lOyB9CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLWV5ZWJyb3d7CiAgICBmb250LWZhbWlseTonS2FybGEnLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OjYwMDsgZm9udC1zaXplOjEyLjVweDsgbGV0dGVyLXNwYWNpbmc6MC4xNGVtOwogICAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBjb2xvcjp2YXIoLS10ZWFsLWRhcmspOyBtYXJnaW46MCAwIDEwcHg7CiAgfQoKICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtYnRuLXJvd3sKICAgIHRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tdG9wOjUwcHg7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1idG57CiAgICBkaXNwbGF5OmlubGluZS1ibG9jazsgZm9udC1mYW1pbHk6J0xpYnJlIEJhc2tlcnZpbGxlJyxzZXJpZjsgZm9udC13ZWlnaHQ6NzAwOwogICAgZm9udC1zaXplOjE1cHg7IGxldHRlci1zcGFjaW5nOjAuMTZlbTsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwogICAgY29sb3I6dmFyKC0tbWItYnJvd24tZGFyayk7IGJhY2tncm91bmQ6dmFyKC0tbWItZ29sZCk7CiAgICBib3JkZXI6MnB4IHNvbGlkIHZhcigtLW1iLWJyb3duKTsKICAgIHBhZGRpbmc6MTRweCA0MHB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyB0ZXh0LWRlY29yYXRpb246bm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgLjE4cyBlYXNlLCBjb2xvciAuMThzIGVhc2UsIGJvcmRlci1jb2xvciAuMThzIGVhc2U7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1idG46aG92ZXJ7CiAgICBiYWNrZ3JvdW5kOnZhcigtLW1iLWJyb3duLWRhcmspOyBjb2xvcjp2YXIoLS1tYi1jcmVhbSk7IGJvcmRlci1jb2xvcjp2YXIoLS1tYi1icm93bi1kYXJrKTsKICB9CgogIC8qIC0tLS0tLS0tIFN0YWdnZXJlZCBzY3JvbGwgZW50cmFuY2UgLS0tLS0tLS0KICAgICBFdmVyeXRoaW5nIGJlbG93IGlzIGdhdGVkIGJlaGluZCAucmV2ZWFsIChhZGRlZCBieSBKUyByaWdodCBiZWZvcmUgdGhlCiAgICAgc2Nyb2xsIG9ic2VydmVyIGlzIHNldCB1cCkgc28gdGhhdCBpZiBKUyBldmVyIGZhaWxzIHRvIGxvYWQsIG5vdGhpbmcKICAgICBzdGF5cyBwZXJtYW5lbnRseSBoaWRkZW4gLS0gdGhlIHNlY3Rpb24ganVzdCBkaXNwbGF5cyBub3JtYWxseSB3aXRoIG5vCiAgICAgYW5pbWF0aW9uLiBPbmNlIC5pcy12aXNpYmxlIGlzIGFkZGVkLCBlYWNoIHBpZWNlIGFuaW1hdGVzIGluIG9uIGl0cwogICAgIG93biBkZWxheTogbGVmdCBtYXRjaGJvb2sgY29sdW1uIHNsaWRlcyBpbiBmcm9tIHRoZSBsZWZ0LCByaWdodAogICAgIGNvbHVtbiBmcm9tIHRoZSByaWdodCwgdGhlIHBob3RvIHN0YWNrIHNjYWxlcyB1cCBpbiB0aGUgbWlkZGxlLCBhbmQKICAgICB0aGUgYnV0dG9uIHNldHRsZXMgaW4gbGFzdC4gKi8KICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwgLmxwLW1hdGNoYm9vay1jb2w6Zmlyc3Qtb2YtdHlwZSA+ICo6bnRoLWNoaWxkKDEpewogICAgb3BhY2l0eTowOyB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNzBweCkgcm90YXRlKC0yZGVnKTsKICAgIHRyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZSwgdHJhbnNmb3JtIC42cyBjdWJpYy1iZXppZXIoLjIyLDEsLjM2LDEpOwogICAgdHJhbnNpdGlvbi1kZWxheTowbXM7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbCAubHAtbWF0Y2hib29rLWNvbDpmaXJzdC1vZi10eXBlID4gKjpudGgtY2hpbGQoMil7CiAgICBvcGFjaXR5OjA7IHRyYW5zZm9ybTp0cmFuc2xhdGVYKC03MHB4KSByb3RhdGUoMmRlZyk7CiAgICB0cmFuc2l0aW9uOm9wYWNpdHkgLjZzIGVhc2UsIHRyYW5zZm9ybSAuNnMgY3ViaWMtYmV6aWVyKC4yMiwxLC4zNiwxKTsKICAgIHRyYW5zaXRpb24tZGVsYXk6MTUwbXM7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbCAubHAtbWF0Y2hib29rLWNvbDpsYXN0LW9mLXR5cGUgPiAqOm50aC1jaGlsZCgxKXsKICAgIG9wYWNpdHk6MDsgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoNzBweCkgcm90YXRlKC0yZGVnKTsKICAgIHRyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZSwgdHJhbnNmb3JtIC42cyBjdWJpYy1iZXppZXIoLjIyLDEsLjM2LDEpOwogICAgdHJhbnNpdGlvbi1kZWxheToyMjBtczsKICB9CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsIC5scC1tYXRjaGJvb2stY29sOmxhc3Qtb2YtdHlwZSA+ICo6bnRoLWNoaWxkKDIpewogICAgb3BhY2l0eTowOyB0cmFuc2Zvcm06dHJhbnNsYXRlWCg3MHB4KSByb3RhdGUoMmRlZyk7CiAgICB0cmFuc2l0aW9uOm9wYWNpdHkgLjZzIGVhc2UsIHRyYW5zZm9ybSAuNnMgY3ViaWMtYmV6aWVyKC4yMiwxLC4zNiwxKTsKICAgIHRyYW5zaXRpb24tZGVsYXk6MzcwbXM7CiAgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbCAubHAtc3RhY2t7CiAgICBvcGFjaXR5OjA7IHRyYW5zZm9ybTpzY2FsZSgwLjk0KTsKICAgIHRyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZSwgdHJhbnNmb3JtIC42cyBjdWJpYy1iZXppZXIoLjIyLDEsLjM2LDEpOwogICAgdHJhbnNpdGlvbi1kZWxheToxMDBtczsKICB9CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsIC5scC1idG4tcm93ewogICAgb3BhY2l0eTowOyB0cmFuc2Zvcm06dHJhbnNsYXRlWSgyMHB4KTsKICAgIHRyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZSwgdHJhbnNmb3JtIC42cyBjdWJpYy1iZXppZXIoLjIyLDEsLjM2LDEpOwogICAgdHJhbnNpdGlvbi1kZWxheTo0ODBtczsKICB9CgogIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbC5pcy12aXNpYmxlIC5scC1tYXRjaGJvb2stY29sOmZpcnN0LW9mLXR5cGUgPiAqOm50aC1jaGlsZCgxKXsgb3BhY2l0eToxOyB0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGUoLTJkZWcpOyB9CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsLmlzLXZpc2libGUgLmxwLW1hdGNoYm9vay1jb2w6Zmlyc3Qtb2YtdHlwZSA+ICo6bnRoLWNoaWxkKDIpeyBvcGFjaXR5OjE7IHRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZSgyZGVnKTsgfQogIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbC5pcy12aXNpYmxlIC5scC1tYXRjaGJvb2stY29sOmxhc3Qtb2YtdHlwZSA+ICo6bnRoLWNoaWxkKDEpeyBvcGFjaXR5OjE7IHRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZSgtMmRlZyk7IH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwuaXMtdmlzaWJsZSAubHAtbWF0Y2hib29rLWNvbDpsYXN0LW9mLXR5cGUgPiAqOm50aC1jaGlsZCgyKXsgb3BhY2l0eToxOyB0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGUoMmRlZyk7IH0KICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwuaXMtdmlzaWJsZSAubHAtc3RhY2t7IG9wYWNpdHk6MTsgdHJhbnNmb3JtOnNjYWxlKDEpOyB9CiAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsLmlzLXZpc2libGUgLmxwLWJ0bi1yb3d7IG9wYWNpdHk6MTsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7IH0KCiAgQG1lZGlhIChtYXgtd2lkdGg6OTAwcHgpewogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWR7IHBhZGRpbmc6NTBweCAyNnB4OyB9CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtbGF5b3V0eyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47IGdhcDozNnB4OyB9CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtbWF0Y2hib29rLWltZ3sgd2lkdGg6MjIwcHg7IH0KICAgIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1tYXRjaGJvb2stY29seyBmbGV4LWRpcmVjdGlvbjpyb3c7IGp1c3RpZnktY29udGVudDpjZW50ZXI7IGdhcDoyMHB4OyBmbGV4LXdyYXA6d3JhcDsgfQogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLW1hdGNoYm9vay1jb2wgPiAqOm50aC1jaGlsZCgxKXsgYWxpZ24tc2VsZjpjZW50ZXI7IHRyYW5zZm9ybTpub25lOyB9CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtbWF0Y2hib29rLWNvbCA+ICo6bnRoLWNoaWxkKDIpeyBhbGlnbi1zZWxmOmNlbnRlcjsgdHJhbnNmb3JtOm5vbmU7IH0KICAgIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1zdGFja3sgaGVpZ2h0OjYwMHB4OyB3aWR0aDoxMDAlOyBtYXgtd2lkdGg6MzAwcHg7IH0KICAgIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1wb2xhcm9pZHsgd2lkdGg6MTcycHg7IG1heC13aWR0aDoxNzJweDsgcGFkZGluZzoxMnB4IDEycHggNzBweDsgfQogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLWNhcHsgZm9udC1zaXplOjE3cHg7IGxpbmUtaGVpZ2h0OjEuMzsgfQogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQgLmxwLXAxeyB0b3A6MDsgbGVmdDowOyB9CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtcDJ7IHRvcDoyNHB4OyBsZWZ0OjEyNnB4OyB9CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZCAubHAtcDN7IHRvcDoyOTZweDsgbGVmdDo0cHg7IH0KICAgIC5saXZlLXBvbGFyb2lkLWVtYmVkIC5scC1wNHsgdG9wOjMyNnB4OyBsZWZ0OjEyMnB4OyB9CgogICAgLyogU2ltcGxlciBlbnRyYW5jZSBvbiBtb2JpbGU6IHBsYWluIGZhZGUsIG5vIGRpcmVjdGlvbmFsIHNsaWRlL3NjYWxlIC0tCiAgICAgICBtYXRjaGVzIHRoZSBmYWN0IHRoZSB0aWx0L3Bvc2l0aW9uaW5nIGlzIGFscmVhZHkgcmVzZXQgYXQgdGhpcyB3aWR0aC4gKi8KICAgIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbCAubHAtbWF0Y2hib29rLWNvbCA+ICo6bnRoLWNoaWxkKDEpLAogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsIC5scC1tYXRjaGJvb2stY29sID4gKjpudGgtY2hpbGQoMiksCiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwgLmxwLXN0YWNrLAogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsIC5scC1idG4tcm93ewogICAgICB0cmFuc2Zvcm06bm9uZSAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UgIWltcG9ydGFudDsKICAgIH0KICAgIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbCAubHAtbWF0Y2hib29rLWNvbCA+ICo6bnRoLWNoaWxkKDEpeyB0cmFuc2l0aW9uLWRlbGF5OjBtcyAhaW1wb3J0YW50OyB9CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwgLmxwLW1hdGNoYm9vay1jb2wgPiAqOm50aC1jaGlsZCgyKXsgdHJhbnNpdGlvbi1kZWxheToxMDBtcyAhaW1wb3J0YW50OyB9CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwgLmxwLXN0YWNreyB0cmFuc2l0aW9uLWRlbGF5OjUwbXMgIWltcG9ydGFudDsgfQogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsIC5scC1idG4tcm93eyB0cmFuc2l0aW9uLWRlbGF5OjI1MG1zICFpbXBvcnRhbnQ7IH0KICAgIC5saXZlLXBvbGFyb2lkLWVtYmVkLnJldmVhbC5pcy12aXNpYmxlIC5scC1tYXRjaGJvb2stY29sID4gKjpudGgtY2hpbGQoMSksCiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwuaXMtdmlzaWJsZSAubHAtbWF0Y2hib29rLWNvbCA+ICo6bnRoLWNoaWxkKDIpLAogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsLmlzLXZpc2libGUgLmxwLXN0YWNrLAogICAgLmxpdmUtcG9sYXJvaWQtZW1iZWQucmV2ZWFsLmlzLXZpc2libGUgLmxwLWJ0bi1yb3d7CiAgICAgIHRyYW5zZm9ybTpub25lICFpbXBvcnRhbnQ7CiAgICB9CiAgfQoKICBAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7CiAgICAubGl2ZS1wb2xhcm9pZC1lbWJlZC5yZXZlYWwgKnsgdHJhbnNpdGlvbjpub25lICFpbXBvcnRhbnQ7IH0KICB9CgogIC5saXZlLXBvbGFyb2lkLXNvdXJjZSwgLmxpdmUtbWF0Y2hib29rLTEsIC5saXZlLW1hdGNoYm9vay0yLCAubGl2ZS1tYXRjaGJvb2stMywgLmxpdmUtbWF0Y2hib29rLTQsIC5saXZlLWJ0bi1zb3VyY2V7IGRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyB9Cg==
CihmdW5jdGlvbigpewogIC8vIC0tLS0gUGhvdG9zOiBzdXBwbGllZCB2aWEgYSBXb3JkUHJlc3MgR2FsbGVyeSBibG9jayAtLS0tCiAgLy8gQWRkIGEgR2FsbGVyeSBibG9jaywgdXBsb2FkIDQgcGhvdG9zIG9mIHlvdSBwZXJmb3JtaW5nIGxpdmUsIHRhZyB0aGUKICAvLyBHQUxMRVJZIGJsb2NrICJsaXZlLXBvbGFyb2lkLXNvdXJjZSIuIEZvciBlYWNoIHBob3RvLCBzZXQgQWx0IFRleHQgdG8KICAvLyBhIHNob3J0IGNhcHRpb24gKGUuZy4gIkJhY2tzdGFnZSIpIC0tIGl0J2xsIGJlIGhhbmR3cml0dGVuIHVuZGVyIHRoYXQKICAvLyBwb2xhcm9pZC4gVXNlICJ8IiBpbiB0aGUgQWx0IFRleHQgdG8gZm9yY2UgYSBsaW5lIGJyZWFrLCBlLmcuCiAgLy8gIk9jdCAnMjMuIFVDQkxBLiB8IFBob3RvOiBKTCBEdWNrZXIiLgogIC8vCiAgLy8gLS0tLSBGb3VyIG1hdGNoYm9vayBpbWFnZXM6IHNlcGFyYXRlIEltYWdlIGJsb2NrcyAtLS0tCiAgLy8gVGFnIHRoZW0gImxpdmUtbWF0Y2hib29rLTEiIGFuZCAibGl2ZS1tYXRjaGJvb2stMiIgKGxlZnQgY29sdW1uLCB0b3AKICAvLyBhbmQgYm90dG9tKSwgYW5kICJsaXZlLW1hdGNoYm9vay0zIiBhbmQgImxpdmUtbWF0Y2hib29rLTQiIChyaWdodAogIC8vIGNvbHVtbiwgdG9wIGFuZCBib3R0b20pLiBKdXN0IHVwbG9hZCBlYWNoIGZpbmlzaGVkIG1hdGNoYm9vayBncmFwaGljCiAgLy8gLS0gbm8gQWx0IFRleHQgb3IgQ2FwdGlvbiBuZWVkZWQsIHRoZXkncmUgdXNlZCBhcy1pcy4gT3B0aW9uYWxseSBzZXQKICAvLyB0aGF0IGJsb2NrJ3MgTGluayAoQ3VzdG9tIFVSTCkgdG8gbWFrZSB0aGF0IG1hdGNoYm9vayBjbGlja2FibGUgLS0KICAvLyBpdCdsbCBvcGVuIGluIGEgbmV3IHRhYi4KICAvLwogIC8vIC0tLS0gQnV0dG9uOiBzZXBhcmF0ZSBJbWFnZSBibG9jaywgdGFnICJsaXZlLWJ0bi1zb3VyY2UiIC0tLS0KICAvLyBBbnkgc21hbGwgcGxhY2Vob2xkZXIgcGhvdG8gd29ya3MsIGl0J3MgbmV2ZXIgc2hvd24gLS0gb25seSBpdHMgbGluawogIC8vIGlzIHJlYWQuIFNldCBMaW5rIChDdXN0b20gVVJMKSB0byB5b3VyIExpdmUgU2hvd3MgcGFnZSwgYW5kIEFsdCBUZXh0CiAgLy8gdG8gY3VzdG9taXplIHRoZSBidXR0b24gbGFiZWwgKGRlZmF1bHRzIHRvICJTZWUgTGl2ZSBTaG93cyIpLgogIGNvbnN0IFBPU0lUSU9OUyA9IFsnbHAtcDEnLCAnbHAtcDInLCAnbHAtcDMnLCAnbHAtcDQnXTsKICBjb25zdCBGQUxMQkFDS19DQVBUSU9OUyA9IFsnTGl2ZSBhdCBVQ0InLCAnT24gdGhlIHJvYWQnLCAnQmFja3N0YWdlJywgJ1NvbGQgb3V0IGNyb3dkJ107CiAgY29uc3QgRkFMTEJBQ0tfQ09MT1JTID0gWycjMzM2NjVDJywgJyM5QzQ0MzYnLCAnI0I1NzYzQScsICcjNUM3QzhBJ107CgogIGZ1bmN0aW9uIGhpZ2hlc3RSZXNTcmMoaW1nKXsKICAgIGNvbnN0IGZ1bGxVcmwgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZ1bGwtdXJsJyk7CiAgICBpZiAoZnVsbFVybCkgcmV0dXJuIGZ1bGxVcmw7CiAgICBjb25zdCBzcmNzZXQgPSBpbWcuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKTsKICAgIGlmIChzcmNzZXQpIHsKICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHNyY3NldC5zcGxpdCgnLCcpLm1hcChwYXJ0ID0+IHsKICAgICAgICBjb25zdCBiaXRzID0gcGFydC50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoKGJpdHNbMV0gfHwgJycpLnJlcGxhY2UoJ3cnLCAnJyksIDEwKSB8fCAwOwogICAgICAgIHJldHVybiB7IHVybDogYml0c1swXSwgd2lkdGggfTsKICAgICAgfSk7CiAgICAgIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYi53aWR0aCAtIGEud2lkdGgpOwogICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggJiYgY2FuZGlkYXRlc1swXS51cmwpIHJldHVybiBjYW5kaWRhdGVzWzBdLnVybDsKICAgIH0KICAgIHJldHVybiBpbWcuc3JjOwogIH0KCiAgZnVuY3Rpb24gaW5pdCgpewogICAgY29uc3QgZ2FsbGVyeUltZ3MgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5saXZlLXBvbGFyb2lkLXNvdXJjZSBpbWcnKSk7CiAgICBjb25zdCBzdGFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdscFN0YWNrJyk7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgY29uc3QgcG9sYXJvaWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgcG9sYXJvaWQuY2xhc3NOYW1lID0gJ2xwLXBvbGFyb2lkICcgKyBQT1NJVElPTlNbaV07CgogICAgICBpZiAoZ2FsbGVyeUltZ3MubGVuZ3RoKSB7CiAgICAgICAgY29uc3Qgc3JjSW1nID0gZ2FsbGVyeUltZ3NbaSAlIGdhbGxlcnlJbWdzLmxlbmd0aF07CiAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgaW1nLnNyYyA9IGhpZ2hlc3RSZXNTcmMoc3JjSW1nKTsKICAgICAgICBpbWcuYWx0ID0gJyc7CiAgICAgICAgcG9sYXJvaWQuYXBwZW5kQ2hpbGQoaW1nKTsKCiAgICAgICAgY29uc3QgY2FwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgY2FwLmNsYXNzTmFtZSA9ICdscC1jYXAnOwogICAgICAgIGNvbnN0IHJhd0NhcHRpb24gPSBzcmNJbWcuYWx0IHx8IEZBTExCQUNLX0NBUFRJT05TW2ldOwogICAgICAgIGNvbnN0IGxpbmVzID0gcmF3Q2FwdGlvbi5zcGxpdCgnfCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7CiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgbGkpID0+IHsKICAgICAgICAgIGlmIChsaSA+IDApIGNhcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gbGluZTsKICAgICAgICAgIGNhcC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgICB9KTsKICAgICAgICBwb2xhcm9pZC5hcHBlbmRDaGlsZChjYXApOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgcGguY2xhc3NOYW1lID0gJ2xwLXBsYWNlaG9sZGVyJzsKICAgICAgICBwaC5zdHlsZS5iYWNrZ3JvdW5kID0gRkFMTEJBQ0tfQ09MT1JTW2ldOwogICAgICAgIHBvbGFyb2lkLmFwcGVuZENoaWxkKHBoKTsKCiAgICAgICAgY29uc3QgY2FwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgY2FwLmNsYXNzTmFtZSA9ICdscC1jYXAnOwogICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IEZBTExCQUNLX0NBUFRJT05TW2ldOwogICAgICAgIGNhcC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgICBwb2xhcm9pZC5hcHBlbmRDaGlsZChjYXApOwogICAgICB9CgogICAgICBzdGFjay5hcHBlbmRDaGlsZChwb2xhcm9pZCk7CiAgICB9CgogICAgWycxJywgJzInLCAnMycsICc0J10uZm9yRWFjaCgobikgPT4gewogICAgICBjb25zdCBzb3VyY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubGl2ZS1tYXRjaGJvb2stJyArIG4gKyAnIGltZycpOwogICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbHBNYXRjaGJvb2snICsgbik7CiAgICAgIGlmIChzb3VyY2UgJiYgdGFyZ2V0KSB7CiAgICAgICAgdGFyZ2V0LnNyYyA9IGhpZ2hlc3RSZXNTcmMoc291cmNlKTsKICAgICAgICAvLyBJZiB0aGUgc291cmNlIEltYWdlIGJsb2NrIGhhcyBhIExpbmsgc2V0LCBtYWtlIHRoZSBtYXRjaGJvb2sKICAgICAgICAvLyBjbGlja2FibGUgdG9vIC0tIG9wZW5zIGluIGEgbmV3IHRhYiBzbyBwZW9wbGUgZG9uJ3QgbG9zZSB0aGVpcgogICAgICAgIC8vIHBsYWNlIG9uIHRoZSBwYWdlLgogICAgICAgIGNvbnN0IGxpbmtFbCA9IHNvdXJjZS5jbG9zZXN0KCdhJyk7CiAgICAgICAgY29uc3QgaHJlZiA9IGxpbmtFbCA/IGxpbmtFbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA6IG51bGw7CiAgICAgICAgaWYgKGhyZWYpIHsKICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgIGFuY2hvci5ocmVmID0gaHJlZjsKICAgICAgICAgIGFuY2hvci50YXJnZXQgPSAnX2JsYW5rJzsKICAgICAgICAgIGFuY2hvci5yZWwgPSAnbm9vcGVuZXIgbm9yZWZlcnJlcic7CiAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYW5jaG9yLCB0YXJnZXQpOwogICAgICAgICAgYW5jaG9yLmFwcGVuZENoaWxkKHRhcmdldCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBidG5Tb3VyY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubGl2ZS1idG4tc291cmNlIGltZycpOwogICAgaWYgKGJ0blNvdXJjZSkgewogICAgICBjb25zdCBsaW5rRWwgPSBidG5Tb3VyY2UuY2xvc2VzdCgnYScpOwogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbHBCdG4nKTsKICAgICAgaWYgKGxpbmtFbCkgewogICAgICAgIGNvbnN0IGhyZWYgPSBsaW5rRWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbGlua0VsLmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7CiAgICAgICAgaWYgKGhyZWYpIGJ0bi5ocmVmID0gaHJlZjsKICAgICAgICBpZiAodGFyZ2V0KSB7IGJ0bi50YXJnZXQgPSB0YXJnZXQ7IGJ0bi5yZWwgPSAnbm9vcGVuZXIgbm9yZWZlcnJlcic7IH0KICAgICAgfQogICAgICBpZiAoYnRuU291cmNlLmFsdCkgYnRuLnRleHRDb250ZW50ID0gYnRuU291cmNlLmFsdDsKICAgIH0KCiAgICAvLyBSZXZlYWwtb24tc2Nyb2xsCiAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5saXZlLXBvbGFyb2lkLWVtYmVkJyk7CiAgICBpZiAoZWwpIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZCgncmV2ZWFsJyk7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgICAgICAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHsKICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgICBlbnRyeS50YXJnZXQuY2xhc3NMaXN0LmFkZCgnaXMtdmlzaWJsZScpOwogICAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoZW50cnkudGFyZ2V0KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwgeyB0aHJlc2hvbGQ6IDAuMSB9KTsKICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbCk7CiAgICB9CiAgfQoKICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykgewogICAgaW5pdCgpOwogIH0gZWxzZSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGluaXQpOwogIH0KfSkoKTsK












