Category

Best Book Trailers

Curated roundups of the best book trailers made each year, along with all-time lists organized by view count, genre, and style. Book trailer quality has advanced significantly over the past decade, and the trailers featured in this section represent the high end of what is possible when authors and publishers treat video as a serious creative and marketing investment rather than an afterthought. The selections here draw from trailers produced across the entire industry, not just Film 14 productions, because the goal is to give authors and publishers an honest picture of what excellent book trailer production actually looks like in practice. Whether you are researching what a great thriller trailer feels like, trying to understand what separates a memorable romance trailer from a forgettable one, or simply want to see what the current state of the art looks like before commissioning your own trailer, this section gives you a reliable and regularly updated reference point. New roundups are added annually and existing lists are updated as new standout trailers emerge.

Book Teaser Tiers

Film 14 cinematic book teaser title cards for authors
PGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1BbnRvbiZmYW1pbHk9UG9wcGluczppdGFsLHdnaHRAMCw0MDA7MCw1MDA7MCw2MDA7MCw3MDA7MCw4MDA7MSw0MDAmZGlzcGxheT1zd2FwIiByZWw9InN0eWxlc2hlZXQiPgo8c3R5bGU+Cjpyb290ewogIC0tbmF2eTojMWIyMTUzOwogIC0taW5rOiMyZTMxMzg7CiAgLS1ib2R5OiMyZTMxMzg7CiAgLS1yZWQ6I2Q2NDA0NTsKICAtLXJlZC1icmFuZDojRTMxODM3OwogIC0td2hpdGU6I2ZmZmZmZjsKICAtLXBhcGVyOiNlZmVmZWY7CiAgLS1saW5lOiNlM2UzZTY7Cn0KI2YxNC10ZWFzZXItcGFnZSAqe2JveC1zaXppbmc6Ym9yZGVyLWJveH0KI2YxNC10ZWFzZXItcGFnZXsKICBmb250LWZhbWlseTonUG9wcGlucycsc2Fucy1zZXJpZjsKICBiYWNrZ3JvdW5kOnZhcigtLXdoaXRlKTsKICBjb2xvcjp2YXIoLS1ib2R5KTsKICBmb250LXNpemU6MTdweDsKICBsaW5lLWhlaWdodDoxLjc1OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7Cn0KI2YxNC10ZWFzZXItcGFnZSBwLCNmMTQtdGVhc2VyLXBhZ2UgaDEsI2YxNC10ZWFzZXItcGFnZSBoMiwjZjE0LXRlYXNlci1wYWdlIGgze21hcmdpbi1ib3R0b206MH0KI2YxNC10ZWFzZXItcGFnZSAuZnVsbGJsZWVke3dpZHRoOjEwMHZ3O3Bvc2l0aW9uOnJlbGF0aXZlO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01MHZ3fQppbWd7bWF4LXdpZHRoOjEwMCU7ZGlzcGxheTpibG9ja30KYXtjb2xvcjppbmhlcml0fQoKI2YxNC10ZWFzZXItcGFnZSAuZGlzcGxheXtmb250LWZhbWlseTonQW50b24nLHNhbnMtc2VyaWYhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OjQwMCFpbXBvcnRhbnQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlIWltcG9ydGFudDtsaW5lLWhlaWdodDouOTYhaW1wb3J0YW50O2xldHRlci1zcGFjaW5nOi4wMDVlbSFpbXBvcnRhbnQ7Y29sb3I6dmFyKC0tbmF2eSl9CiNmMTQtdGVhc2VyLXBhZ2UgLmJhbm5lciAuZGlzcGxheXtjb2xvcjojZmZmfQojZjE0LXRlYXNlci1wYWdlIGgxLmRpc3BsYXl7Zm9udC1zaXplOmNsYW1wKDU0cHgsN3Z3LDExMHB4KSFpbXBvcnRhbnR9CiNmMTQtdGVhc2VyLXBhZ2UgaDIuZGlzcGxheXtmb250LXNpemU6Y2xhbXAoNDBweCw1LjJ2dyw3OHB4KSFpbXBvcnRhbnR9CiNmMTQtdGVhc2VyLXBhZ2UgaDMuZGlzcGxheXtmb250LXNpemU6Y2xhbXAoMjZweCwzdncsNDJweCkhaW1wb3J0YW50fQpoMS5kaXNwbGF5e2ZvbnQtc2l6ZTpjbGFtcCg1NHB4LDd2dywxMTBweCl9CmgyLmRpc3BsYXl7Zm9udC1zaXplOmNsYW1wKDQwcHgsNS4ydncsNzhweCl9CmgzLmRpc3BsYXl7Zm9udC1zaXplOmNsYW1wKDI2cHgsM3Z3LDQycHgpfQoua2lja2VyewogIGZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMjhlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7CiAgY29sb3I6dmFyKC0taW5rKTttYXJnaW4tYm90dG9tOjE4cHg7ZGlzcGxheTpibG9jazsKfQoua2lja2VyLnJlZHtjb2xvcjp2YXIoLS1yZWQpfQoKLyogLS0tLS0tLS0tLSBsaW5rIHN0eWxlIENUQSAtLS0tLS0tLS0tICovCi5nb2xpbmt7CiAgZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7CiAgZm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4yMmVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKICBjb2xvcjp2YXIoLS1yZWQpO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjsKICBmb250LWZhbWlseTonUG9wcGlucycsc2Fucy1zZXJpZjt0cmFuc2l0aW9uOmNvbG9yIC4yczsKfQouZ29saW5rIC5jaXJjewogIHdpZHRoOjI2cHg7aGVpZ2h0OjI2cHg7Ym9yZGVyOjEuNXB4IHNvbGlkIGN1cnJlbnRDb2xvcjtib3JkZXItcmFkaXVzOjUwJTsKICBkaXNwbGF5OmdyaWQ7cGxhY2UtaXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZToxMnB4O3RyYW5zaXRpb246dHJhbnNmb3JtIC4yczsKfQouZ29saW5rOmhvdmVye2NvbG9yOnZhcigtLXJlZC1icmFuZCl9Ci5nb2xpbms6aG92ZXIgLmNpcmN7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoM3B4KX0KCi5idG57CiAgZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDp2YXIoLS1yZWQpO2NvbG9yOiNmZmY7CiAgZm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxNXB4O2xldHRlci1zcGFjaW5nOi4xZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwogIHBhZGRpbmc6MTdweCA0NHB4O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO3RleHQtZGVjb3JhdGlvbjpub25lOwogIGZvbnQtZmFtaWx5OidQb3BwaW5zJyxzYW5zLXNlcmlmO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnMsdHJhbnNmb3JtIC4yczsKfQouYnRuOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tcmVkLWJyYW5kKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMnB4KX0KLmJ0bi5saW5le2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6dmFyKC0tbmF2eSk7Ym9yZGVyOjJweCBzb2xpZCB2YXIoLS1uYXZ5KX0KLmJ0bi5saW5lOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tbmF2eSk7Y29sb3I6I2ZmZn0KCi8qIC0tLS0tLS0tLS0gaGVybyAtLS0tLS0tLS0tICovCi5oZXJve2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MS4wNWZyIDFmcjttaW4taGVpZ2h0Ojgydmg7YmFja2dyb3VuZDp2YXIoLS13aGl0ZSl9Ci5oZXJvIC5jb3B5e2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjkwcHggNnZ3fQouaGVybyAuY29weSBwLmxlYWR7bWFyZ2luLXRvcDozMHB4O21heC13aWR0aDo1NmNoO2ZvbnQtc2l6ZToxNy41cHh9Ci5oZXJvIC5jdGEtcm93e21hcmdpbi10b3A6NDBweDtkaXNwbGF5OmZsZXg7Z2FwOjIycHg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwfQouaGVybyAudmlzdWFse3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjttaW4taGVpZ2h0OjQyMHB4fQouaGVybyAudmlzdWFsIGltZ3twb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb3Zlcn0KCi5oZXJvIC52aXN1YWwgLnRhZ3sKICBwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjI2cHg7Ym90dG9tOjIycHg7ei1pbmRleDozOwogIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuOTIpO2NvbG9yOnZhcigtLWluayk7CiAgZm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4yMmVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKICBwYWRkaW5nOjhweCAxNHB4O2JvcmRlci1yYWRpdXM6MnB4Owp9CkBtZWRpYShtYXgtd2lkdGg6OTAwcHgpewogIC5oZXJve2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnJ9CiAgLmhlcm8gLnZpc3VhbHtvcmRlcjotMTttaW4taGVpZ2h0OjMyMHB4fQp9CgovKiAtLS0tLS0tLS0tIGFuZ2xlZCBzZWN0aW9uIC0tLS0tLS0tLS0gKi8KLnRpZXJzLXdyYXB7CiAgYmFja2dyb3VuZDp2YXIoLS1wYXBlcik7CiAgY2xpcC1wYXRoOnBvbHlnb24oMCAwLDEwMCUgMy4ydncsMTAwJSAxMDAlLDAgY2FsYygxMDAlIC0gMy4ydncpKTsKICBwYWRkaW5nOmNhbGMoMTEwcHggKyAzLjJ2dykgNnZ3IGNhbGMoMTIwcHggKyAzLjJ2dyk7CiAgdGV4dC1hbGlnbjpjZW50ZXI7Cn0KLnRpZXJzLXdyYXAgLmludHJvLXN1YnttYXgtd2lkdGg6NTJjaDttYXJnaW46MjZweCBhdXRvIDA7Zm9udC1zaXplOjE3LjVweH0KCi50aWVyLWdyaWR7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMywxZnIpO2dhcDoyOHB4O21hcmdpbi10b3A6NzBweDt0ZXh0LWFsaWduOmNlbnRlcn0KLnRpZXJ7CiAgYmFja2dyb3VuZDp2YXIoLS13aGl0ZSk7CiAgcGFkZGluZzo2MnB4IDQwcHggNTRweDsKICBib3gtc2hhZG93OjAgMjBweCA1MHB4IC0zMHB4IHJnYmEoMjcsMzMsODMsLjI1KTsKICBjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTsKICAKICB0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMjVzLGJveC1zaGFkb3cgLjI1cyxib3JkZXItY29sb3IgLjI1czsKICBkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjsKfQoudGllci5zdGF0aWN7Y3Vyc29yOmRlZmF1bHR9Ci50aWVyOm5vdCguc3RhdGljKTpob3Zlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtOHB4KTtib3gtc2hhZG93OjAgMzJweCA2MHB4IC0zMHB4IHJnYmEoMjcsMzMsODMsLjQpfQoudGllci5zZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLThweCk7Ym94LXNoYWRvdzowIDMycHggNjBweCAtMzBweCByZ2JhKDI3LDMzLDgzLC40KX0KLnRpZXIgLmtpY2tlcnttYXJnaW4tYm90dG9tOjEwcHh9Ci50aWVyIC50bmFtZXtmb250LXNpemU6Y2xhbXAoMzRweCwzdncsNDRweCk7Zm9udC13ZWlnaHQ6MzAwO2NvbG9yOnZhcigtLWluayk7bGV0dGVyLXNwYWNpbmc6LjAyZW07Zm9udC1mYW1pbHk6J1BvcHBpbnMnLHNhbnMtc2VyaWZ9Ci50aWVyIHAuZGVzY3ttYXJnaW4tdG9wOjE4cHg7Zm9udC1zaXplOjE2LjVweDttYXgtd2lkdGg6MzRjaH0KLnRpZXIgLnByaWNle2ZvbnQtZmFtaWx5OidBbnRvbicsc2Fucy1zZXJpZjtmb250LXNpemU6MzhweDtjb2xvcjp2YXIoLS1uYXZ5KTttYXJnaW4tdG9wOjE4cHg7bGV0dGVyLXNwYWNpbmc6LjAxZW19Ci50aWVyIC5nb2xpbmt7bWFyZ2luLXRvcDozMHB4fQoudGllciB1bHtkaXNwbGF5Om5vbmV9CkBtZWRpYShtYXgtd2lkdGg6MTAwMHB4KXsudGllci1ncmlke2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnI7bWF4LXdpZHRoOjUyMHB4O21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99fQoKLnBheS1ub3Rle21hcmdpbi10b3A6NTZweDtmb250LXNpemU6MTQuNXB4O2NvbG9yOiMyZTMxMzh9CgovKiAtLS0tLS0tLS0tIHdpemFyZCAtLS0tLS0tLS0tICovCi53aXphcmR7bWF4LXdpZHRoOjg4MHB4O21hcmdpbjo5MHB4IGF1dG8gMDtkaXNwbGF5Om5vbmU7dGV4dC1hbGlnbjpsZWZ0fQoud2l6YXJkLm9ue2Rpc3BsYXk6YmxvY2t9Ci53aXotYmFye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpiYXNlbGluZTtnYXA6MjBweH0KLndpei1iYXIgLmtpY2tlcnttYXJnaW46MH0KLndpei1iYXIgLmFtdHtmb250LWZhbWlseTonQW50b24nLHNhbnMtc2VyaWY7Zm9udC1zaXplOjM0cHg7Y29sb3I6dmFyKC0tbmF2eSl9Ci5wcm9ne2hlaWdodDo0cHg7YmFja2dyb3VuZDojZTBlMGU0O21hcmdpbjoxNnB4IDAgMzBweDtvdmVyZmxvdzpoaWRkZW59Ci5wcm9nIGl7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnZhcigtLW5hdnkpO3dpZHRoOjAlO3RyYW5zaXRpb246d2lkdGggLjRzIGVhc2V9Cgoud3N0ZXB7CiAgYmFja2dyb3VuZDp2YXIoLS13aGl0ZSk7CiAgYm94LXNoYWRvdzowIDI0cHggNjBweCAtMzBweCByZ2JhKDI3LDMzLDgzLC4zKTsKICBwYWRkaW5nOmNsYW1wKDQ0cHgsNXZ3LDY4cHgpOwogIGRpc3BsYXk6bm9uZTt0ZXh0LWFsaWduOmxlZnQ7Cn0KLndzdGVwLm9ue2Rpc3BsYXk6YmxvY2s7YW5pbWF0aW9uOnJpc2UgLjQ1cyBlYXNlfQpAa2V5ZnJhbWVzIHJpc2V7ZnJvbXtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjBweCl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfX0KLndzdGVwIC5wcmljZS1saW5le2ZvbnQtZmFtaWx5OidBbnRvbicsc2Fucy1zZXJpZjtmb250LXNpemU6MzBweDtjb2xvcjp2YXIoLS1yZWQpO21hcmdpbi10b3A6MjBweH0KLndzdGVwIHAuZGVzY3ttYXJnaW4tdG9wOjE4cHg7bWF4LXdpZHRoOjU2Y2h9Ci53c3RlcCAuYWN0aW9uc3ttYXJnaW4tdG9wOjM4cHg7ZGlzcGxheTpmbGV4O2dhcDoxOHB4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcn0KLndzdGVwIC5uYXYtcm93e21hcmdpbi10b3A6MzRweH0KLndpei1iYWNrewogIGJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtmb250LWZhbWlseTonUG9wcGlucycsc2Fucy1zZXJpZjsKICBmb250LXNpemU6MTIuNXB4O2ZvbnQtd2VpZ2h0OjYwMDtsZXR0ZXItc3BhY2luZzouMThlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Y29sb3I6IzFiMjE1MztwYWRkaW5nOjA7Cn0KLndpei1iYWNrOmhvdmVye2NvbG9yOnZhcigtLXJlZCl9CgouZ3gtZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgyLG1pbm1heCgwLDFmcikpO2dhcDoxNnB4O21hcmdpbi10b3A6MzRweH0KLmd4e21pbi13aWR0aDowfQouZ3h7CiAgYmFja2dyb3VuZDojZmFmYWZhO2JvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsKICBwYWRkaW5nOjI0cHggMjZweDtjdXJzb3I6cG9pbnRlcjt0ZXh0LWFsaWduOmxlZnQ7CiAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjJzLGJhY2tncm91bmQgLjJzOwp9Ci5neDpob3Zlcntib3JkZXItY29sb3I6IzJlMzEzOH0KLmd4LnNlbHtib3JkZXItY29sb3I6dmFyKC0tbmF2eSk7YmFja2dyb3VuZDojZmZmO2JveC1zaGFkb3c6MCAxNHB4IDM0cHggLTIycHggcmdiYSgyNywzMyw4MywuMzUpfQouZ3ggYntmb250LXNpemU6MTdweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0taW5rKTtkaXNwbGF5OmJsb2NrfQouZ3ggc3Bhbntmb250LXNpemU6MTMuNXB4O2NvbG9yOiMyZTMxMzg7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDoxLjU1O21hcmdpbi10b3A6MnB4fQouZ3ggLnB7Zm9udC1mYW1pbHk6J0FudG9uJyxzYW5zLXNlcmlmO2NvbG9yOnZhcigtLXJlZCk7Zm9udC1zaXplOjIwcHg7bWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6YmxvY2t9CkBtZWRpYShtYXgtd2lkdGg6NzYwcHgpey5neC1ncmlke2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnJ9fQoKLnMtbGluZXN7bWFyZ2luLXRvcDozMHB4fQoucy1saW5le2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6MTRweDtwYWRkaW5nOjEycHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1saW5lKTtmb250LXNpemU6MTZweH0KLnMtbGluZSBie2NvbG9yOnZhcigtLWluayk7Zm9udC13ZWlnaHQ6NjAwfQoucy1saW5lLnJlZHtjb2xvcjp2YXIoLS1yZWQpfQoucy1saW5lIC5lZGl0e2NvbG9yOiMxYjIxNTM7Zm9udC1zaXplOjEyLjVweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2N1cnNvcjpwb2ludGVyO2JvcmRlcjpub25lO2JhY2tncm91bmQ6bm9uZTtmb250LWZhbWlseTppbmhlcml0O3BhZGRpbmc6MDttYXJnaW4tbGVmdDoxMnB4fQoucy1saW5lIC5lZGl0OmhvdmVye2NvbG9yOnZhcigtLWluayl9Ci5zLXRvdGFse21hcmdpbi10b3A6MzBweH0KLnMtdG90YWwgPiBzcGFue2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4yNmVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtjb2xvcjp2YXIoLS1pbmspfQoucy10b3RhbCBie2ZvbnQtZmFtaWx5OidBbnRvbicsc2Fucy1zZXJpZjtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTo1NnB4O2NvbG9yOnZhcigtLW5hdnkpO21hcmdpbi10b3A6OHB4O2xpbmUtaGVpZ2h0OjF9Ci5zLW5vdGV7bWFyZ2luLXRvcDoyMHB4O2ZvbnQtc2l6ZToxMy41cHg7Y29sb3I6IzJlMzEzODtsaW5lLWhlaWdodDoxLjd9CgovKiAtLS0tLS0tLS0tIGRhcmsgYmFubmVyIC0tLS0tLS0tLS0gKi8KLmJhbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTttaW4taGVpZ2h0Ojc4dmg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47Y29sb3I6I2ZmZn0KLmJhbm5lciAuYmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MH0KLmJhbm5lciAuYmcgaW1ne3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb3Zlcn0KLmJhbm5lciAuYmc6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoOCw4LDEyLC43Mil9Ci5iYW5uZXIgLmlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MjtwYWRkaW5nOjEyMHB4IDZ2dzttYXgtd2lkdGg6OTAwcHh9Ci5iYW5uZXIgLmRpc3BsYXl7Y29sb3I6I2ZmZn0KLmJhbm5lciAua2lja2Vye2NvbG9yOiNmZmY7b3BhY2l0eTouODV9Ci5iYW5uZXIgcHttYXJnaW4tdG9wOjI2cHg7Zm9udC1zaXplOjE3LjVweDtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44OCk7bWF4LXdpZHRoOjU4Y2h9Ci5iYW5uZXIgLmdvbGlua3ttYXJnaW4tdG9wOjM2cHg7Y29sb3I6I2ZmZn0KLmJhbm5lciAuZ29saW5rOmhvdmVye2NvbG9yOiNmZmY7b3BhY2l0eTouODV9CgovKiAtLS0tLS0tLS0tIGZpbmFsIENUQSAtLS0tLS0tLS0tICovCi5maW5hbHtwYWRkaW5nOjEzMHB4IDZ2dzt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kOnZhcigtLXdoaXRlKX0KLmZpbmFsIHB7bWF4LXdpZHRoOjUyY2g7bWFyZ2luOjI4cHggYXV0byAwO2ZvbnQtc2l6ZToxNy41cHh9Ci5maW5hbCAuY3RhLXJvd3ttYXJnaW4tdG9wOjQycHg7ZGlzcGxheTpmbGV4O2dhcDoyMHB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7ZmxleC13cmFwOndyYXB9CgoKLyogdG9hc3QgKi8KI2YxNHRvYXN0e3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTozNHB4O2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMTQwcHgpO2JhY2tncm91bmQ6dmFyKC0tbmF2eSk7CiAgICAgICBjb2xvcjojZmZmO3BhZGRpbmc6MTVweCAyOHB4O2ZvbnQtc2l6ZToxNC41cHg7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjM1cyBlYXNlO3otaW5kZXg6OTk7bWF4LXdpZHRoOjkwdnc7dGV4dC1hbGlnbjpjZW50ZXI7Ym94LXNoYWRvdzowIDE2cHggNDBweCAtMThweCByZ2JhKDI3LDMzLDgzLC42KX0KI2YxNHRvYXN0LnNob3d7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgwKX0KCi8qIHY2IG92ZXJyaWRlcyAqLwoudGllciAudGJ0bnttYXJnaW4tdG9wOjMwcHg7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjE1cHggMTBweH0KLnRpZXI6aG92ZXIsLnRpZXIuc2Vse2JhY2tncm91bmQ6dmFyKC0tbmF2eSl9Ci50aWVyOmhvdmVyIC50bmFtZSwudGllci5zZWwgLnRuYW1lLAoudGllcjpob3ZlciBwLmRlc2MsLnRpZXIuc2VsIHAuZGVzYywKLnRpZXI6aG92ZXIgLnByaWNlLC50aWVyLnNlbCAucHJpY2V7Y29sb3I6I2ZmZn0KLnRpZXI6aG92ZXIgLmJ0bi5saW5lLC50aWVyLnNlbCAuYnRuLmxpbmV7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6I2ZmZn0KLyogdGVzdGltb25pYWxzICovCi50ZXN0aXtiYWNrZ3JvdW5kOnZhcigtLXBhcGVyKTtjbGlwLXBhdGg6cG9seWdvbigwIDMuMnZ3LDEwMCUgMCwxMDAlIDEwMCUsMCAxMDAlKTtwYWRkaW5nOmNhbGMoMTAwcHggKyAzLjJ2dykgNnZ3IDEwMHB4O3RleHQtYWxpZ246Y2VudGVyfQoucW1hcmt7d2lkdGg6NjZweDtoZWlnaHQ6NjZweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiNmZmY7Ym94LXNoYWRvdzowIDE0cHggMzRweCAtMThweCByZ2JhKDI3LDMzLDgzLC4zNSk7ZGlzcGxheTpncmlkO3BsYWNlLWl0ZW1zOmNlbnRlcjttYXJnaW46MCBhdXRvIDhweDtmb250LWZhbWlseTonQW50b24nLHNhbnMtc2VyaWY7Zm9udC1zaXplOjQ0cHg7Y29sb3I6dmFyKC0tbmF2eSk7bGluZS1oZWlnaHQ6MTtwYWRkaW5nLXRvcDoxOHB4fQoudGVzdGkgLnF7bWF4LXdpZHRoOjU4Y2g7bWFyZ2luOjMwcHggYXV0byAwO2ZvbnQtc2l6ZTpjbGFtcCgxOXB4LDJ2dywyNHB4KTtjb2xvcjp2YXIoLS1pbmspO2xpbmUtaGVpZ2h0OjEuNjtmb250LXN0eWxlOml0YWxpY30KLnRlc3RpIC5hdHRye21hcmdpbi10b3A6MjRweDtmb250LXNpemU6MTVweDtjb2xvcjp2YXIoLS1uYXZ5KTtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LjAzZW19Ci50ZXN0aSAuYXR0ciBzcGFue2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjp2YXIoLS1pbmspfQouZG90c3ttYXJnaW4tdG9wOjM2cHg7ZGlzcGxheTpmbGV4O2dhcDoxMHB4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9Ci5kb3R7d2lkdGg6OXB4O2hlaWdodDo5cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDpyZ2JhKDI3LDMzLDgzLC4yMik7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzowO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnN9Ci5kb3Qub257YmFja2dyb3VuZDp2YXIoLS1uYXZ5KX0KCi5zLXRvdGFsIGIsIC5zLXRvdGFsIGIgc3Bhbntmb250LXNpemU6NTZweCFpbXBvcnRhbnQ7Zm9udC1mYW1pbHk6J0FudG9uJyxzYW5zLXNlcmlmIWltcG9ydGFudDtjb2xvcjojMWIyMTUzIWltcG9ydGFudDtsaW5lLWhlaWdodDoxIWltcG9ydGFudDtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnQ7bGV0dGVyLXNwYWNpbmc6LjAxZW0haW1wb3J0YW50fQoud2l6LWJhciAuYW10LCAud2l6LWJhciAuYW10IHNwYW57Zm9udC1zaXplOjM0cHghaW1wb3J0YW50O2ZvbnQtZmFtaWx5OidBbnRvbicsc2Fucy1zZXJpZiFpbXBvcnRhbnQ7Y29sb3I6IzFiMjE1MyFpbXBvcnRhbnQ7bGV0dGVyLXNwYWNpbmc6LjAxZW0haW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lIWltcG9ydGFudH0KI2YxNC10ZWFzZXItcGFnZSAuaGVybyAudmlzdWFsIGltZ3t3aWR0aDoxMDAlIWltcG9ydGFudDtoZWlnaHQ6MTAwJSFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O29iamVjdC1maXQ6Y292ZXIhaW1wb3J0YW50O3Bvc2l0aW9uOmFic29sdXRlIWltcG9ydGFudDtpbnNldDowIWltcG9ydGFudH0KI2YxNC10ZWFzZXItcGFnZSAuYmFubmVyIC5iZyBpbWd7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7aGVpZ2h0OjEwMCUhaW1wb3J0YW50O21heC13aWR0aDpub25lIWltcG9ydGFudDtvYmplY3QtZml0OmNvdmVyIWltcG9ydGFudH0KI2YxNC10ZWFzZXItcGFnZSAuaGVybyAudmlzdWFsLmNvbGxhZ2V7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6MzBweCAzdnc7bWluLWhlaWdodDo0MjBweH0KI2YxNC10ZWFzZXItcGFnZSAuaGVybyAudmlzdWFsLmNvbGxhZ2UgaW1ne3Bvc2l0aW9uOnN0YXRpYyFpbXBvcnRhbnQ7d2lkdGg6bWluKDEwMCUsOTAwcHgpIWltcG9ydGFudDtoZWlnaHQ6YXV0byFpbXBvcnRhbnQ7b2JqZWN0LWZpdDpjb250YWluIWltcG9ydGFudDttYXgtd2lkdGg6bm9uZSFpbXBvcnRhbnR9CkBtZWRpYShtYXgtd2lkdGg6OTAwcHgpeyNmMTQtdGVhc2VyLXBhZ2UgLmhlcm8gLnZpc3VhbC5jb2xsYWdle21pbi1oZWlnaHQ6YXV0bztwYWRkaW5nOjMwcHggNnZ3IDB9fQouc2tpcC1hbGwtcm93e21hcmdpbi10b3A6MjJweH0KLndpei1za2lwe2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtmb250LWZhbWlseTonUG9wcGlucycsc2Fucy1zZXJpZjtmb250LXNpemU6MTQuNXB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWIyMTUzO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7cGFkZGluZzowfQoud2l6LXNraXA6aG92ZXJ7Y29sb3I6I2Q2NDA0NX0KPC9zdHlsZT4KPGRpdiBpZD0iZjE0LXRlYXNlci1wYWdlIj4KCgo8IS0tID09PT09PT09PT09PSBIRVJPID09PT09PT09PT09PSAtLT4KPGhlYWRlciBjbGFzcz0iZnVsbGJsZWVkIGhlcm8iPgogIDxkaXYgY2xhc3M9ImNvcHkiPgogICAgPGgxIGNsYXNzPSJraWNrZXIgcmVkIiBzdHlsZT0iZm9udC1zaXplOjEzcHg7bWFyZ2luOjAgMCAxOHB4Ij5XaGF0IEFyZSBCb29rIFRlYXNlcnM/PC9oMT4KICAgIDxkaXYgY2xhc3M9ImRpc3BsYXkiIHN0eWxlPSJmb250LXNpemU6Y2xhbXAoNDhweCw2Ljh2dyw5NnB4KSI+WW91ciBCb29rLDxicj5JbiBNb3Rpb248L2Rpdj4KICAgIDxwIGNsYXNzPSJsZWFkIj5Cb29rIFRlYXNlciB0cmFpbGVycyBhcmUgYnVkZ2V0LWZyaWVuZGx5IGFsdGVybmF0aXZlcyB0byBmdWxsLXNjYWxlIGJvb2sgdHJhaWxlciBwcm9kdWN0aW9ucy4gVGhyZWUgcGFja2FnZXMsIGVhY2ggaW4gd2lkZSBhbmQgdmVydGljYWwgZm9ybWF0cyBmb3IgSW5zdGFncmFtLCBUaWtUb2ssIGFuZCBYLCB3aXRoIHRoZSBvcHRpb24gdG8gYWRkIGN1dC1kb3ducy4gWW91IGVuZCB1cCB3aXRoIHF1aXRlIGEgYml0IG9mIHZpZGVvIGZvciB5b3VyIGJvb2sgbWFya2V0aW5nLjwvcD4KICAgIDxkaXYgY2xhc3M9ImN0YS1yb3ciPgogICAgICA8YSBjbGFzcz0iYnRuIiBocmVmPSIjdGllcnMiPlNlbGVjdCBhIFRpZXI8L2E+CiAgICAgIDxhIGNsYXNzPSJidG4gbGluZSIgaHJlZj0iaHR0cHM6Ly9maWxtLTE0LmNvbS9ib29rLXRlYXNlci12aWRlb3MvIj5XYXRjaCBFeGFtcGxlczwvYT4KICAgIDwvZGl2PgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InZpc3VhbCBjb2xsYWdlIj4KICAgIDxpbWcgc3JjPSJodHRwczovL2ZpbG0tMTQuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L1ZJREVPQ0FSRFM2LndlYnAiIGFsdD0iQ29sbGFnZSBvZiBjaW5lbWF0aWMgYm9vayB0ZWFzZXIgdGl0bGUgY2FyZHMgcHJvZHVjZWQgYnkgRmlsbSAxNCIgbG9hZGluZz0iZWFnZXIiIGZldGNocHJpb3JpdHk9ImhpZ2giPgogIDwvZGl2Pgo8L2hlYWRlcj4KCjwhLS0gPT09PT09PT09PT09IFRJRVJTID09PT09PT09PT09PSAtLT4KPHNlY3Rpb24gY2xhc3M9ImZ1bGxibGVlZCB0aWVycy13cmFwIiBpZD0idGllcnMiPgogIDxzcGFuIGNsYXNzPSJraWNrZXIgcmVkIj5Cb29rIGFuZCBQYXkgaW4gYSBGZXcgQ2xpY2tzPC9zcGFuPgogIDxoMiBjbGFzcz0iZGlzcGxheSI+U2VsZWN0IGEgVGllciBCZWxvdzwvaDI+CiAgPHAgY2xhc3M9ImludHJvLXN1YiI+UGljayB5b3VyIHBhY2thZ2UgYW5kIGJ1aWxkIHlvdXIgdGVhc2VyIHJpZ2h0IGhlcmUuIFRpZXIgMSBpcyBvdXIgbW9zdCBhbWJpdGlvdXMgcHJvZHVjdGlvbiwgc28gaXQgc3RhcnRzIHdpdGggYW4gYXZhaWxhYmlsaXR5IGNoZWNrLjwvcD4KCiAgPGRpdiBjbGFzcz0idGllci1ncmlkIj4KCiAgICA8ZGl2IGNsYXNzPSJ0aWVyIHN0YXRpYyI+CiAgICAgIDxzcGFuIGNsYXNzPSJraWNrZXIgcmVkIj5FeHRlbmRlZCBMZW5ndGg8L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9InRuYW1lIj5USUVSIDE8L2Rpdj4KICAgICAgPHAgY2xhc3M9ImRlc2MiPk9uZSBzaXh0eS1zZWNvbmQgYm9vayB0ZWFzZXIgdmlkZW8gaW4gYm90aCB3aWRlIGFuZCB2ZXJ0aWNhbCBmb3JtYXRzLiBJbmNsdWRlcyB0aHJlZSBzaG9ydGVyIHZlcnNpb25zLjwvcD4KICAgICAgPGRpdiBjbGFzcz0icHJpY2UiPiQxNzUwPC9kaXY+CiAgICAgIDxhIGNsYXNzPSJidG4gbGluZSB0YnRuIiBocmVmPSJtYWlsdG86aW5mb0BmaWxtLTE0LmNvbT9zdWJqZWN0PVRpZXIlMjAxJTIwQm9vayUyMFRlYXNlciUyMEF2YWlsYWJpbGl0eSI+Q2hlY2sgQXZhaWxhYmlsaXR5PC9hPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0idGllciIgaWQ9ImNhcmQtdDIiIG9uY2xpY2s9InN0YXJ0QnVpbGQoJ3QyJykiPgogICAgICA8c3BhbiBjbGFzcz0ia2lja2VyIHJlZCI+TW9zdCBQb3B1bGFyPC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJ0bmFtZSI+VElFUiAyPC9kaXY+CiAgICAgIDxwIGNsYXNzPSJkZXNjIj5PbmUgdGhpcnR5LXNlY29uZCBib29rIHRlYXNlciBpbiB3aWRlIGFuZCB2ZXJ0aWNhbCBmb3JtYXRzLiBJbmNsdWRlcyB0d28gc2hvcnRlciB2ZXJzaW9ucy48L3A+CiAgICAgIDxkaXYgY2xhc3M9InByaWNlIj4kMTIwMDwvZGl2PgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gdGJ0biIgaWQ9ImJ0bi10MiI+Qm9vayBOb3c8L2J1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InRpZXIiIGlkPSJjYXJkLXQzIiBvbmNsaWNrPSJzdGFydEJ1aWxkKCd0MycpIj4KICAgICAgPHNwYW4gY2xhc3M9ImtpY2tlciByZWQiPkdvb2QgVmFsdWU8L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9InRuYW1lIj5USUVSIDM8L2Rpdj4KICAgICAgPHAgY2xhc3M9ImRlc2MiPk9uZSBmaWZ0ZWVuLXNlY29uZCBib29rIHRlYXNlciB2aWRlbyBpbiB3aWRlIGFuZCB2ZXJ0aWNhbCBmb3JtYXRzLiBJbmNsdWRlcyBvbmUgc2hvcnRlciB2ZXJzaW9uLjwvcD4KICAgICAgPGRpdiBjbGFzcz0icHJpY2UiPiQ2MDA8L2Rpdj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHRidG4iIGlkPSJidG4tdDMiPkJvb2sgTm93PC9idXR0b24+CiAgICA8L2Rpdj4KCiAgPC9kaXY+CiAgPHAgY2xhc3M9InBheS1ub3RlIj5QYXltZW50IHBsYW5zIGF2YWlsYWJsZS4gT25lIHJvdW5kIG9mIGNvbXBsaW1lbnRhcnkgYWRqdXN0bWVudHMgaW5jbHVkZWQgd2l0aCBldmVyeSB0ZWFzZXIuPC9wPgoKICA8IS0tID09PT09PT09PT09PSBXSVpBUkQgPT09PT09PT09PT09IC0tPgogIDxkaXYgY2xhc3M9IndpemFyZCIgaWQ9IndpemFyZCI+CiAgICA8ZGl2IGNsYXNzPSJ3aXotYmFyIj4KICAgICAgPHNwYW4gY2xhc3M9ImtpY2tlciByZWQiIGlkPSJ3aXotdGllci1uYW1lIj5CdWlsZGluZyBUaWVyIDI8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJhbXQiPiQ8c3BhbiBpZD0id2l6LXRvdGFsIj4xMjAwPC9zcGFuPjwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0icHJvZyI+PGkgaWQ9InByb2ctYmFyIj48L2k+PC9kaXY+CgogICAgPCEtLSBTdGVwIDEgLS0+CiAgICA8ZGl2IGNsYXNzPSJ3c3RlcCIgaWQ9ImYxNHN0ZXAtMSI+CiAgICAgIDxzcGFuIGNsYXNzPSJraWNrZXIgcmVkIj5TdGVwIDEgb2YgNDwvc3Bhbj4KICAgICAgPGgzIGNsYXNzPSJkaXNwbGF5Ij5XYW50IGEgcHJvZmVzc2lvbmFsIHZvaWNlLW92ZXI/PC9oMz4KICAgICAgPHAgY2xhc3M9ImRlc2MiPkEgZ2VucmUtbWF0Y2hlZCBuYXJyYXRvciByZWFkcyB5b3VyIGhvb2ssIGRpcmVjdGVkIGJ5IG91ciB0ZWFtIGFuZCBtaXhlZCBpbnRvIHRoZSBzY29yZS48L3A+CiAgICAgIDxwIGNsYXNzPSJwcmljZS1saW5lIj4rICQyNTA8L3A+CiAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biIgb25jbGljaz0iYW5zd2VyKCd2bycsdHJ1ZSkiPkFkZCBWb2ljZS1PdmVyPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGxpbmUiIG9uY2xpY2s9ImFuc3dlcigndm8nLGZhbHNlKSI+U2tpcDwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPHAgY2xhc3M9InNraXAtYWxsLXJvdyI+PGJ1dHRvbiBjbGFzcz0id2l6LXNraXAiIG9uY2xpY2s9InNraXBBbGwoKSI+SW4gYSBodXJyeT8gU2tpcCB0aGUgZXh0cmFzIGFuZCBjaGVjayBvdXQgbm93PC9idXR0b24+PC9wPgogICAgICA8ZGl2IGNsYXNzPSJuYXYtcm93Ij48YnV0dG9uIGNsYXNzPSJ3aXotYmFjayIgb25jbGljaz0iZ29TdGVwKDApIj5CYWNrIHRvIHRpZXJzPC9idXR0b24+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8IS0tIFN0ZXAgMiAtLT4KICAgIDxkaXYgY2xhc3M9IndzdGVwIiBpZD0iZjE0c3RlcC0yIj4KICAgICAgPHNwYW4gY2xhc3M9ImtpY2tlciByZWQiPlN0ZXAgMiBvZiA0PC9zcGFuPgogICAgICA8aDMgY2xhc3M9ImRpc3BsYXkiPkJyaW5nIHlvdXIgYm9vayBjb3ZlciB0byBsaWZlPzwvaDM+CiAgICAgIDxwIGNsYXNzPSJkZXNjIj5Zb3VyIGNvdmVyIGFuaW1hdGVkIHdpdGggY2luZW1hdGljIG1vdGlvbi4gSXQgbWFrZXMgYSBzdHJpa2luZyBlbmQgY2FyZCBhbmQgd29ya3Mgb24gZXZlcnkgZmVlZC48L3A+CiAgICAgIDxwIGNsYXNzPSJwcmljZS1saW5lIj4rICQ0NTA8L3A+CiAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biIgb25jbGljaz0iYW5zd2VyKCdhYycsdHJ1ZSkiPkFkZCBBbmltYXRlZCBDb3ZlcjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBsaW5lIiBvbmNsaWNrPSJhbnN3ZXIoJ2FjJyxmYWxzZSkiPlNraXA8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Im5hdi1yb3ciPjxidXR0b24gY2xhc3M9Indpei1iYWNrIiBvbmNsaWNrPSJnb1N0ZXAoMSkiPkJhY2s8L2J1dHRvbj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDwhLS0gU3RlcCAzIC0tPgogICAgPGRpdiBjbGFzcz0id3N0ZXAiIGlkPSJmMTRzdGVwLTMiPgogICAgICA8c3BhbiBjbGFzcz0ia2lja2VyIHJlZCI+U3RlcCAzIG9mIDQ8L3NwYW4+CiAgICAgIDxoMyBjbGFzcz0iZGlzcGxheSI+V2FudCBleHRyYSBzaG9ydGVyIHZlcnNpb25zPzwvaDM+CiAgICAgIDxwIGNsYXNzPSJkZXNjIj5BbiBhZGRpdGlvbmFsIGN1dC1kb3duIHBhY2thZ2UgZ2l2ZXMgeW91IG1vcmUgc2hvcnQgZWRpdHMgb2YgeW91ciB0ZWFzZXIsIHNvIHlvdSBuZXZlciBydW4gb3V0IG9mIHBvc3RzLjwvcD4KICAgICAgPHAgY2xhc3M9InByaWNlLWxpbmUiPisgJDUwMDwvcD4KICAgICAgPGRpdiBjbGFzcz0iYWN0aW9ucyI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiBvbmNsaWNrPSJhbnN3ZXIoJ2NkJyx0cnVlKSI+QWRkIEN1dC1Eb3duczwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBsaW5lIiBvbmNsaWNrPSJhbnN3ZXIoJ2NkJyxmYWxzZSkiPlNraXA8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Im5hdi1yb3ciPjxidXR0b24gY2xhc3M9Indpei1iYWNrIiBvbmNsaWNrPSJnb1N0ZXAoMikiPkJhY2s8L2J1dHRvbj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDwhLS0gU3RlcCA0IC0tPgogICAgPGRpdiBjbGFzcz0id3N0ZXAiIGlkPSJmMTRzdGVwLTQiPgogICAgICA8c3BhbiBjbGFzcz0ia2lja2VyIHJlZCI+U3RlcCA0IG9mIDQ8L3NwYW4+CiAgICAgIDxoMyBjbGFzcz0iZGlzcGxheSI+QWRkIGEgZ3JhcGhpY3MgcGFja2FnZT88L2gzPgogICAgICA8cCBjbGFzcz0iZGVzYyI+QnJhbmRlZCBncmFwaGljcyBhbmQgY2FwdGlvbnMgYnVpbHQgZnJvbSB5b3VyIHRlYXNlci4gMTAlIG9mZiBldmVyeSBwYWNrYWdlIHdoZW4gYnVuZGxlZCB3aXRoIHlvdXIgb3JkZXIuPC9wPgogICAgICA8ZGl2IGNsYXNzPSJneC1ncmlkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJneCBzZWwiIGlkPSJneC1nMCIgb25jbGljaz0icGlja0dmeCgnZzAnKSI+PGI+Tm8gZ3JhcGhpY3M8L2I+PHNwYW4+SnVzdCB0aGUgdGVhc2VyPC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Imd4IiBpZD0iZ3gtZzEiIG9uY2xpY2s9InBpY2tHZngoJ2cxJykiPjxiPlRoZSBPbmUtU2hlZXQ8L2I+PHNwYW4+MTAgZ3JhcGhpY3MgKyAxMCBjYXB0aW9ucywgcmVnLiAkNzUwPC9zcGFuPjxzcGFuIGNsYXNzPSJwIj4kNjc1IGJ1bmRsZWQ8L3NwYW4+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZ3giIGlkPSJneC1nMiIgb25jbGljaz0icGlja0dmeCgnZzInKSI+PGI+VGhlIENhbXBhaWduPC9iPjxzcGFuPjIwIGdyYXBoaWNzICsgMjAgY2FwdGlvbnMgKyA1IHZpZGVvIGFzc2V0cywgcmVnLiAkMSw0NTA8L3NwYW4+PHNwYW4gY2xhc3M9InAiPiQxLDMwNSBidW5kbGVkPC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Imd4IiBpZD0iZ3gtZzMiIG9uY2xpY2s9InBpY2tHZngoJ2czJykiPjxiPlRoZSBDcml0ZXJpb248L2I+PHNwYW4+MzAgZ3JhcGhpY3MgKyAzMCBjYXB0aW9ucyArIDEwIHZpZGVvcywgYW5pbWF0ZWQgY292ZXIgaW5jbHVkZWQsIHJlZy4gJDIsNTAwPC9zcGFuPjxzcGFuIGNsYXNzPSJwIj4kMiwyNTAgYnVuZGxlZDwvc3Bhbj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biIgb25jbGljaz0iZ29TdGVwKDUpIj5SZXZpZXcgTXkgVGVhc2VyPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJuYXYtcm93Ij48YnV0dG9uIGNsYXNzPSJ3aXotYmFjayIgb25jbGljaz0iZ29TdGVwKDMpIj5CYWNrPC9idXR0b24+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8IS0tIFN0ZXAgNSAtLT4KICAgIDxkaXYgY2xhc3M9IndzdGVwIiBpZD0iZjE0c3RlcC01Ij4KICAgICAgPHNwYW4gY2xhc3M9ImtpY2tlciByZWQiPlJlYWR5IHRvIE9yZGVyPC9zcGFuPgogICAgICA8aDMgY2xhc3M9ImRpc3BsYXkiPkhlcmUncyB3aGF0IHlvdSBidWlsdDwvaDM+CiAgICAgIDxkaXYgY2xhc3M9InMtbGluZXMiIGlkPSJzLWxpbmVzIj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0icy10b3RhbCI+CiAgICAgICAgPHNwYW4+VG90YWw8L3NwYW4+CiAgICAgICAgPGI+JDxzcGFuIGlkPSJzLXRvdGFsIj4xMjAwPC9zcGFuPjwvYj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biIgb25jbGljaz0iY2hlY2tvdXQoKSI+Q2hlY2sgT3V0PC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGxpbmUiIG9uY2xpY2s9ImdvU3RlcCgxKSI+QnVpbGQgQWdhaW48L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxwIGNsYXNzPSJzLW5vdGUiPlBheW1lbnQgcGxhbnMgYXZhaWxhYmxlIGF0IGNoZWNrb3V0LiBPbmUgcm91bmQgb2YgY29tcGxpbWVudGFyeSBhZGp1c3RtZW50cyBpbmNsdWRlZC48L3A+CiAgICA8L2Rpdj4KCiAgPC9kaXY+Cjwvc2VjdGlvbj4KCjwhLS0gPT09PT09PT09PT09IEhPVyBCT09LIFRFQVNFUlMgQVJFIE1BREUgPT09PT09PT09PT09IC0tPgo8c2VjdGlvbiBjbGFzcz0iZnVsbGJsZWVkIGJhbm5lciI+CiAgPGRpdiBjbGFzcz0iYmciPjxpbWcgc3JjPSJodHRwczovL2ZpbG0tMTQuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA0L0JUUy1CVFMud2VicCIgYWx0PSJCZWhpbmQgdGhlIHNjZW5lczogRmlsbSAxNCBjYW1lcmEgb3BlcmF0b3IgZmlsbWluZyBhIGNpbmVtYXRpYyBib29rIHRlYXNlciBzY2VuZSIgbG9hZGluZz0ibGF6eSI+PC9kaXY+CiAgPGRpdiBjbGFzcz0iaW5uZXIiPgogICAgPHNwYW4gY2xhc3M9ImtpY2tlciI+VGhlIFByb2Nlc3M8L3NwYW4+CiAgICA8aDIgY2xhc3M9ImRpc3BsYXkiPkhvdyBCb29rIFRlYXNlcnMgQXJlIE1hZGU8L2gyPgogICAgPHA+V2Ugc3RhcnQgd2l0aCB0aGUgc3lub3BzaXMgYW5kIGJvb2sgY292ZXIsIHRoZW4gYnJhaW5zdG9ybSBrZXkgc2NlbmVzLCB0aGVtZXMsIGFuZCB0b25lLiBVc2luZyBzZWxlY3RlZCBpbWFnZXMgYW5kIHZpZGVvIGNsaXBzLCB3ZSBjcmFmdCBhIHRlYXNlciBzZXQgdG8gYSBmaXR0aW5nIHNjb3JlLiBPbmUgcm91bmQgb2YgY29tcGxpbWVudGFyeSBhZGp1c3RtZW50cyBpcyBpbmNsdWRlZC48L3A+CiAgICA8YSBjbGFzcz0iYnRuIiBzdHlsZT0ibWFyZ2luLXRvcDozNnB4IiBocmVmPSJodHRwczovL2ZpbG0tMTQuY29tL2Jvb2stdGVhc2VyLXZpZGVvcy8iPlNlZSBDbGllbnQgQm9vayBUZWFzZXJzPC9hPgogIDwvZGl2Pgo8L3NlY3Rpb24+Cgo8IS0tID09PT09PT09PT09PSBURVNUSU1PTklBTFMgPT09PT09PT09PT09IC0tPgo8c2VjdGlvbiBjbGFzcz0iZnVsbGJsZWVkIHRlc3RpIj4KICA8c3BhbiBjbGFzcz0ia2lja2VyIHJlZCI+V2hhdCBEbyBPdXIgQ2xpZW50cyBTYXk8L3NwYW4+CiAgPGRpdiBjbGFzcz0icW1hcmsiPiZsZHF1bzs8L2Rpdj4KICA8cCBjbGFzcz0icSIgaWQ9InQtcXVvdGUiPjwvcD4KICA8cCBjbGFzcz0iYXR0ciIgaWQ9InQtYXR0ciI+PC9wPgogIDxkaXYgY2xhc3M9ImRvdHMiIGlkPSJ0LWRvdHMiPjwvZGl2Pgo8L3NlY3Rpb24+Cgo8c2NyaXB0Pgpjb25zdCBURVNUUz1bCiB7cToiSSB2ZXJ5IG11Y2ggZW5qb3llZCB3b3JraW5nIHdpdGggRmlsbSAxNCBvbiB0aGUgYm9vayB0ZWFzZXIgdmlkZW9zIGZvciBteSBoaXN0b3JpY2FsIGZpY3Rpb24gbm92ZWwuIixuOiJNZWxpc3NhIENvbGUiLGI6ImF1dGhvciBvZiBBIEdyYWluIG9mIEhvcGUifSwKIHtxOiJJdCB3YXMgYXdlc29tZSB3b3JraW5nIHdpdGggQWRhbSBhdCBGaWxtIDE0ISBFZmZpY2llbnQgYW5kIHByb2Zlc3Npb25hbCBzZXJ2aWNlLiIsbjoiRC5NLiBNb3J0aWVyIixiOiJhdXRob3Igb2YgU291bCBNYXRlIn0sCiB7cToiR3JlYXQgd29ya2luZyB3aXRoIEZpbG0gMTQgLSBwcm9mZXNzaW9uYWxseSBkb25lIHRyYWlsZXIgZm9yIG15IG5ldyBib29rLiBFYXN5IHRvIHdvcmsgd2l0aCEiLG46IkRyLiBEYXZpZCBXZWlsIixiOiJhdXRob3Igb2YgQWxsIHRoYXQgUmVhbGx5IE1hdHRlcnMifSwKIHtxOiJUaGUgYm9vayB0ZWFzZXIgdGhleSBtYWRlIGZvciBtZSBjb252ZXlzIHRoZSBlc3NlbmNlIG9mIG15IG5vdmVsIGluIDMwIHNlY29uZHMgd2l0aCBwb3dlcmZ1bCB2aXN1YWxzLiIsbjoiTWFyeSBNYWRkb3giLGI6ImF1dGhvciBvZiBEYXJrcm9vbSJ9LAoge3E6IkZpbG0gMTQgZGlkIG15IGJvb2sgdHJhaWxlciBhbmQgbXkgYXV0aG9yIHRyYWlsZXIgZm9yIG15IHdlYnNpdGUgYW5kIGJvdGggd2VyZSBhbWF6aW5nLiIsbjoiSmVubmlmZXIgUHJvYnN0IixiOiJhdXRob3Igb2YgQSBXZWRkaW5nIGluIExha2UgQ29tbyJ9LAoge3E6IlZlcnkgcHJvZmVzc2lvbmFsLCBjcmVhdGl2ZSwgYW5kIGVhc3kgdG8gd29yayB3aXRoLiIsbjoiRGV2aW4gR3JlZW5sZWUiLGI6ImF1dGhvciBvZiBFdmVyZ3JlZW4ifQpdOwpsZXQgdGk9MCx0dGltZXI7CmZ1bmN0aW9uIHNob3dUKGkpewogIHRpPWk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3QtcXVvdGUnKS50ZXh0Q29udGVudD0nIicrVEVTVFNbaV0ucSsnIic7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3QtYXR0cicpLmlubmVySFRNTD1URVNUU1tpXS5uKycgJm5ic3A7PHNwYW4+JytURVNUU1tpXS5iKyc8L3NwYW4+JzsKICBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRvdCcpXS5mb3JFYWNoKChkLHgpPT5kLmNsYXNzTGlzdC50b2dnbGUoJ29uJyx4PT09aSkpOwp9CihmdW5jdGlvbigpewogIGNvbnN0IGRkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0LWRvdHMnKTsKICBURVNUUy5mb3JFYWNoKChfLGkpPT57CiAgICBjb25zdCBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgYi5jbGFzc05hbWU9J2RvdCc7Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdUZXN0aW1vbmlhbCAnKyhpKzEpKTsKICAgIGIub25jbGljaz0oKT0+e3Nob3dUKGkpO2NsZWFySW50ZXJ2YWwodHRpbWVyKTt0dGltZXI9c2V0SW50ZXJ2YWwoKCk9PnNob3dUKCh0aSsxKSVURVNUUy5sZW5ndGgpLDYwMDApO307CiAgICBkZC5hcHBlbmRDaGlsZChiKTsKICB9KTsKICBzaG93VCgwKTsKICB0dGltZXI9c2V0SW50ZXJ2YWwoKCk9PnNob3dUKCh0aSsxKSVURVNUUy5sZW5ndGgpLDYwMDApOwp9KSgpOwo8L3NjcmlwdD4KCjwhLS0gPT09PT09PT09PT09IEZJTkFMIENUQSA9PT09PT09PT09PT0gLS0+CjxzZWN0aW9uIGNsYXNzPSJmdWxsYmxlZWQgZmluYWwiPgogIDxzcGFuIGNsYXNzPSJraWNrZXIgcmVkIj5TdGlsbCBEZWNpZGluZz88L3NwYW4+CiAgPGgyIGNsYXNzPSJkaXNwbGF5Ij5Ob3QgU3VyZSBXaGljaCBUaWVyIEZpdHM8L2gyPgogIDxwPlRlbGwgdXMgYWJvdXQgeW91ciBib29rIGFuZCB3ZSB3aWxsIHBvaW50IHlvdSB0byB0aGUgcmlnaHQgb25lLjwvcD4KICA8ZGl2IGNsYXNzPSJjdGEtcm93Ij4KICAgIDxhIGNsYXNzPSJidG4iIGhyZWY9IiN0aWVycyI+U2VsZWN0IGEgVGllcjwvYT4KICAgIDxhIGNsYXNzPSJidG4gbGluZSIgaHJlZj0ibWFpbHRvOmluZm9AZmlsbS0xNC5jb20/c3ViamVjdD1XaGljaCUyMHRlYXNlciUyMHRpZXIlMjBmaXRzJTIwbXklMjBib29rIj5Bc2sgVXMgRGlyZWN0bHk8L2E+CiAgPC9kaXY+Cjwvc2VjdGlvbj4KCgo8ZGl2IGlkPSJmMTR0b2FzdCI+PC9kaXY+Cgo8c2NyaXB0Pgpjb25zdCBQUklDRVM9e3QyOjEyMDAsdDM6NjAwLHZvOjI1MCxhYzo0NTAsY2Q6NTAwLGcxOjc1MCxnMjoxNDUwLGczOjI1MDB9Owpjb25zdCBOQU1FUz17CiAgdDI6J1RpZXIgMiBCb29rIFRlYXNlciwgMzAgc2VjJywKICB0MzonVGllciAzIEJvb2sgVGVhc2VyLCAxNSBzZWMnLAogIHZvOidQcm9mZXNzaW9uYWwgVm9pY2UtT3ZlcicsCiAgYWM6J0FuaW1hdGVkIEJvb2sgQ292ZXInLAogIGNkOidBZGRpdGlvbmFsIEN1dC1Eb3duIFBhY2thZ2UnLAogIGcxOidUaGUgT25lLVNoZWV0JywKICBnMjonVGhlIENhbXBhaWduJywKICBnMzonVGhlIENyaXRlcmlvbicKfTsKbGV0IHN0YXRlPXt0aWVyOm51bGwsdm86ZmFsc2UsYWM6ZmFsc2UsY2Q6ZmFsc2UsZ2Z4OidnMCd9OwpsZXQgc3RlcD0wOwpmdW5jdGlvbiBmMTR0cmFjayhldixwKXt0cnl7aWYodHlwZW9mIGd0YWc9PT0nZnVuY3Rpb24nKXtwPXB8fHt9O3AudHJhbnNwb3J0X3R5cGU9J2JlYWNvbic7Z3RhZygnZXZlbnQnLGV2LHApO319Y2F0Y2goZSl7fX0KCmZ1bmN0aW9uIHN0YXJ0QnVpbGQodCl7CiAgc3RhdGU9e3RpZXI6dCx2bzpmYWxzZSxhYzpmYWxzZSxjZDpmYWxzZSxnZng6J2cwJ307CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmQtdDInKS5jbGFzc0xpc3QudG9nZ2xlKCdzZWwnLHQ9PT0ndDInKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZC10MycpLmNsYXNzTGlzdC50b2dnbGUoJ3NlbCcsdD09PSd0MycpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aXotdGllci1uYW1lJykudGV4dENvbnRlbnQgPSB0PT09J3QyJyA/ICdCdWlsZGluZyBUaWVyIDInIDogJ0J1aWxkaW5nIFRpZXIgMyc7CiAgWydnMCcsJ2cxJywnZzInLCdnMyddLmZvckVhY2goeD0+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2d4LScreCkuY2xhc3NMaXN0LnRvZ2dsZSgnc2VsJyx4PT09J2cwJykpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aXphcmQnKS5jbGFzc0xpc3QuYWRkKCdvbicpOwogIGYxNHRyYWNrKCdzZWxlY3RfaXRlbScse2l0ZW1fbGlzdF9uYW1lOidCb29rIFRlYXNlciBUaWVycycsaXRlbXM6W3tpdGVtX25hbWU6TkFNRVNbdF19XX0pOwogIGdvU3RlcCgxKTsKICB1cGRhdGVUb3RhbCgpOwp9CmZ1bmN0aW9uIGdvU3RlcChuKXsKICBpZihuPT09MCl7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkJykuY2xhc3NMaXN0LnJlbW92ZSgnb24nKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkLXQyJykuY2xhc3NMaXN0LnJlbW92ZSgnc2VsJyk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZC10MycpLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbCcpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpZXJzJykuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnfSk7CiAgICBzdGVwPTA7cmV0dXJuOwogIH0KICBzdGVwPW47CiAgZm9yKGxldCBpPTE7aTw9NTtpKyspZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2YxNHN0ZXAtJytpKS5jbGFzc0xpc3QudG9nZ2xlKCdvbicsaT09PW4pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9nLWJhcicpLnN0eWxlLndpZHRoPShuLzUqMTAwKSsnJSc7CiAgaWYobj09PTUpcmVuZGVyUmV2aWV3KCk7CiAgZjE0dHJhY2soJ3RlYXNlcl93aXphcmRfc3RlcCcse3N0ZXA6bix0aWVyOnN0YXRlLnRpZXJ8fCcnfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dpemFyZCcpLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjonc21vb3RoJyxibG9jazonc3RhcnQnfSk7Cn0KZnVuY3Rpb24gYW5zd2VyKGsseWVzKXsKICBzdGF0ZVtrXT15ZXM7CiAgdXBkYXRlVG90YWwoKTsKICBnb1N0ZXAoc3RlcCsxKTsKfQpmdW5jdGlvbiBwaWNrR2Z4KGcpewogIHN0YXRlLmdmeD1nOwogIFsnZzAnLCdnMScsJ2cyJywnZzMnXS5mb3JFYWNoKHg9PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdneC0nK3gpLmNsYXNzTGlzdC50b2dnbGUoJ3NlbCcseD09PWcpKTsKICB1cGRhdGVUb3RhbCgpOwp9CmZ1bmN0aW9uIHRvdGFsKCl7CiAgbGV0IHQ9UFJJQ0VTW3N0YXRlLnRpZXJdfHwwOwogIFsndm8nLCdhYycsJ2NkJ10uZm9yRWFjaChrPT57aWYoc3RhdGVba10pdCs9UFJJQ0VTW2tdfSk7CiAgaWYoc3RhdGUuZ2Z4IT09J2cwJyl7Y29uc3QgcD1QUklDRVNbc3RhdGUuZ2Z4XTt0Kz1wLU1hdGgucm91bmQocCowLjEwKTt9CiAgcmV0dXJuIHQ7Cn0KbGV0IHNob3duPTA7CmZ1bmN0aW9uIHVwZGF0ZVRvdGFsKCl7CiAgY29uc3QgdGFyZ2V0PXRvdGFsKCk7CiAgY29uc3QgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dpei10b3RhbCcpOwogIGNvbnN0IHN0YXJ0PXNob3duLGRpZmY9dGFyZ2V0LXN0YXJ0LHQwPXBlcmZvcm1hbmNlLm5vdygpOwogIGlmKGRpZmY9PT0wKXtlbC50ZXh0Q29udGVudD10YXJnZXQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7cmV0dXJuO30KICBmdW5jdGlvbiB0aWNrKHQpewogICAgY29uc3QgcD1NYXRoLm1pbigodC10MCkvNDAwLDEpOwogICAgY29uc3QgZT0xLU1hdGgucG93KDEtcCwzKTsKICAgIGVsLnRleHRDb250ZW50PU1hdGgucm91bmQoc3RhcnQrZGlmZiplKS50b0xvY2FsZVN0cmluZygnZW4tVVMnKTsKICAgIGlmKHA8MSlyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7ZWxzZSBzaG93bj10YXJnZXQ7CiAgfQogIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsKfQpmdW5jdGlvbiByZW5kZXJSZXZpZXcoKXsKICBjb25zdCBMPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzLWxpbmVzJyk7CiAgbGV0IGh0bWw9Jyc7CiAgaHRtbCs9YDxkaXYgY2xhc3M9InMtbGluZSI+PGI+JHtOQU1FU1tzdGF0ZS50aWVyXX08L2I+PGI+JCR7UFJJQ0VTW3N0YXRlLnRpZXJdLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpfTwvYj48L2Rpdj5gOwogIFtbJ3ZvJywxXSxbJ2FjJywyXSxbJ2NkJywzXV0uZm9yRWFjaCgoW2ssc10pPT57CiAgICBpZihzdGF0ZVtrXSlodG1sKz1gPGRpdiBjbGFzcz0icy1saW5lIj48c3Bhbj4ke05BTUVTW2tdfTxidXR0b24gY2xhc3M9ImVkaXQiIG9uY2xpY2s9ImdvU3RlcCgke3N9KSI+Y2hhbmdlPC9idXR0b24+PC9zcGFuPjxzcGFuPiQke1BSSUNFU1trXS50b0xvY2FsZVN0cmluZygnZW4tVVMnKX08L3NwYW4+PC9kaXY+YDsKICB9KTsKICBpZihzdGF0ZS5nZnghPT0nZzAnKXsKICAgIGNvbnN0IHA9UFJJQ0VTW3N0YXRlLmdmeF0sZD1NYXRoLnJvdW5kKHAqMC4xMCk7CiAgICBodG1sKz1gPGRpdiBjbGFzcz0icy1saW5lIj48c3Bhbj4ke05BTUVTW3N0YXRlLmdmeF19PGJ1dHRvbiBjbGFzcz0iZWRpdCIgb25jbGljaz0iZ29TdGVwKDQpIj5jaGFuZ2U8L2J1dHRvbj48L3NwYW4+PHNwYW4+JCR7cC50b0xvY2FsZVN0cmluZygnZW4tVVMnKX08L3NwYW4+PC9kaXY+YDsKICAgIGh0bWwrPWA8ZGl2IGNsYXNzPSJzLWxpbmUgcmVkIj48c3Bhbj5CdW5kbGUgZGlzY291bnQsIDEwJTwvc3Bhbj48c3Bhbj4mbWludXM7JCR7ZC50b0xvY2FsZVN0cmluZygnZW4tVVMnKX08L3NwYW4+PC9kaXY+YDsKICB9CiAgTC5pbm5lckhUTUw9aHRtbDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncy10b3RhbCcpLnRleHRDb250ZW50PXRvdGFsKCkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7Cn0KZnVuY3Rpb24gc2tpcEFsbCgpewogIHN0YXRlLnZvPWZhbHNlO3N0YXRlLmFjPWZhbHNlO3N0YXRlLmNkPWZhbHNlO3N0YXRlLmdmeD0nZzAnOwogIGYxNHRyYWNrKCd0ZWFzZXJfc2tpcF9hbGwnLHt0aWVyOnN0YXRlLnRpZXJ8fCcnfSk7CiAgY2hlY2tvdXQoKTsKfQpmdW5jdGlvbiBjaGVja291dCgpewogIGYxNHRyYWNrKCdiZWdpbl9jaGVja291dCcse2N1cnJlbmN5OidVU0QnLHZhbHVlOnRvdGFsKCksaXRlbXM6W3tpdGVtX25hbWU6TkFNRVNbc3RhdGUudGllcl19XX0pOwogIGNvbnN0IFBJRD17dDI6JzIxODg2Jyx0MzonMjE4NjknfVtzdGF0ZS50aWVyXTsKICBjb25zdCBHWD17ZzE6J3RoZS1vbmUtc2hlZXQtMTAtZ3JhcGhpY3MtMTAtY2FwdGlvbnMtcmVnLTc1MCcsZzI6J3RoZS1jYW1wYWlnbi0yMC1ncmFwaGljcy0yMC1jYXB0aW9ucy01LXZpZGVvLWFzc2V0cy1yZWctMTQ1MCcsZzM6J3RoZS1jcml0ZXJpb24tMzAtZ3JhcGhpY3MtMzAtY2FwdGlvbnMtMTAtdmlkZW9zLWFuaW1hdGVkLWNvdmVyLWluY2x1ZGVkLXJlZy0yNTAwJ307CiAgY29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7CiAgZi5tZXRob2Q9J1BPU1QnO2YuYWN0aW9uPSdodHRwczovL2ZpbG0tMTQuY29tL2NhcnQvJzsKICBjb25zdCBhZGQ9KG4sdik9Pntjb25zdCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7aS50eXBlPSdoaWRkZW4nO2kubmFtZT1uO2kudmFsdWU9djtmLmFwcGVuZENoaWxkKGkpO307CiAgYWRkKCdhZGQtdG8tY2FydCcsUElEKTthZGQoJ3F1YW50aXR5JywnMScpOwogIGlmKHN0YXRlLnZvKWFkZCgnYWRkb24tJytQSUQrJy0wW10nLCd5ZXMnKTsKICBpZihzdGF0ZS5jZClhZGQoJ2FkZG9uLScrUElEKyctMVtdJywneWVzJyk7CiAgaWYoc3RhdGUuYWMpYWRkKCdhZGRvbi0nK1BJRCsnLTE3ODM2NjQ0NDBbXScsJ3llcycpOwogIGFkZCgnYWRkb24tJytQSUQrJy0xNzgzNjY0NDQxJyxzdGF0ZS5nZnghPT0nZzAnP0dYW3N0YXRlLmdmeF06JycpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5zdWJtaXQoKTsKfQpsZXQgdHQ7CmZ1bmN0aW9uIHRvYXN0KG0pewogIGNvbnN0IHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2YxNHRvYXN0Jyk7CiAgdC50ZXh0Q29udGVudD1tO3QuY2xhc3NMaXN0LmFkZCgnc2hvdycpOwogIGNsZWFyVGltZW91dCh0dCk7dHQ9c2V0VGltZW91dCgoKT0+dC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JyksMzIwMCk7Cn0KPC9zY3JpcHQ+CjwvZGl2Pgo8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2xkK2pzb24iPgp7IkBjb250ZXh0IjoiaHR0cHM6Ly9zY2hlbWEub3JnIiwiQHR5cGUiOiJQcm9kdWN0IiwibmFtZSI6IkNpbmVtYXRpYyBCb29rIFRlYXNlciIsImJyYW5kIjp7IkB0eXBlIjoiQnJhbmQiLCJuYW1lIjoiRmlsbSAxNCJ9LCJkZXNjcmlwdGlvbiI6IkJvb2sgVGVhc2VyIHRyYWlsZXJzIGFyZSBidWRnZXQtZnJpZW5kbHkgYWx0ZXJuYXRpdmVzIHRvIGZ1bGwtc2NhbGUgYm9vayB0cmFpbGVyIHByb2R1Y3Rpb25zLiBUaHJlZSB0aWVycyBpbiB3aWRlIGFuZCB2ZXJ0aWNhbCBmb3JtYXRzIHdpdGggb3B0aW9uYWwgY3V0LWRvd25zLCB2b2ljZS1vdmVyLCBhbmltYXRlZCBib29rIGNvdmVyLCBhbmQgZ3JhcGhpY3MgcGFja2FnZXMuIiwiaW1hZ2UiOiJodHRwczovL2ZpbG0tMTQuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L1ZJREVPQ0FSRFM2LndlYnAiLCJ1cmwiOiJodHRwczovL2ZpbG0tMTQuY29tL2Jvb2stdGVhc2VyLXRpZXJzLyIsIm9mZmVycyI6W3siQHR5cGUiOiJPZmZlciIsIm5hbWUiOiJUaWVyIDEgRXh0ZW5kZWQgTGVuZ3RoOiA2MCBzZWNvbmQgYm9vayB0ZWFzZXIiLCJwcmljZSI6IjE3NTAiLCJwcmljZUN1cnJlbmN5IjoiVVNEIiwidXJsIjoiaHR0cHM6Ly9maWxtLTE0LmNvbS9ib29rLXRlYXNlci10aWVycy8iLCJhdmFpbGFiaWxpdHkiOiJodHRwczovL3NjaGVtYS5vcmcvSW5TdG9jayJ9LHsiQHR5cGUiOiJPZmZlciIsIm5hbWUiOiJUaWVyIDIgTW9zdCBQb3B1bGFyOiAzMCBzZWNvbmQgYm9vayB0ZWFzZXIiLCJwcmljZSI6IjEyMDAiLCJwcmljZUN1cnJlbmN5IjoiVVNEIiwidXJsIjoiaHR0cHM6Ly9maWxtLTE0LmNvbS9wcm9kdWN0L3RpZXItMi8iLCJhdmFpbGFiaWxpdHkiOiJodHRwczovL3NjaGVtYS5vcmcvSW5TdG9jayJ9LHsiQHR5cGUiOiJPZmZlciIsIm5hbWUiOiJUaWVyIDMgR29vZCBWYWx1ZTogMTUgc2Vjb25kIGJvb2sgdGVhc2VyIiwicHJpY2UiOiI2MDAiLCJwcmljZUN1cnJlbmN5IjoiVVNEIiwidXJsIjoiaHR0cHM6Ly9maWxtLTE0LmNvbS9wcm9kdWN0L3RpZXItMy8iLCJhdmFpbGFiaWxpdHkiOiJodHRwczovL3NjaGVtYS5vcmcvSW5TdG9jayJ9XX0KPC9zY3JpcHQ+
Read More