Jmx0OyFET0NUWVBFIGh0bWwmZ3Q7CiZsdDtodG1sIGxhbmc9JnF1b3Q7dGgmcXVvdDsmZ3Q7CiZsdDtoZWFkJmd0OwogICAgJmx0O21ldGEgY2hhcnNldD0mcXVvdDtVVEYtOCZxdW90OyZndDsKICAgICZsdDttZXRhIG5hbWU9JnF1b3Q7dmlld3BvcnQmcXVvdDsgY29udGVudD0mcXVvdDt3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wJnF1b3Q7Jmd0OwogICAgJmx0O3RpdGxlJmd0O+C5gOC4geC4oeC4leC5iOC4reC4quC4ueC5iSBSUEcmbHQ7L3RpdGxlJmd0OwogICAgJmx0O3N0eWxlJmd0OwogICAgICAgICogewogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBUYWhvbWEsIEdlbmV2YSwgVmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMxYTFhMmUgMCUsICMxNjIxM2UgMTAwJSk7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jb250YWluZXIgewogICAgICAgICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwogICAgICAgICAgICBwYWRkaW5nOiAyNXB4OwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDEwcHggMzBweCByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICMwMGE4ZmY7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGgxIHsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBjb2xvcjogIzAwYThmZjsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgICAgICAgZm9udC1zaXplOiAyLjVyZW07CiAgICAgICAgICAgIHRleHQtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDE2OCwgMjU1LCAwLjUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZ2FtZS1pbmZvIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wbGF5ZXItaW5mbywgLmVuZW15LWluZm8gewogICAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAucGxheWVyLWluZm8gewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDEwMCwgMCwgMC4zKTsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgIzRDQUY1MDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmVuZW15LWluZm8gewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDEwMCwgMCwgMCwgMC4zKTsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgI2Y0NDMzNjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmhlYWx0aC1iYXItY29udGFpbmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKICAgICAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgICAgIG1hcmdpbjogMTBweCAwOwogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuaGVhbHRoLWJhciB7CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjZjAwIDAlLCAjZmYwIDUwJSwgIzBmMCAxMDAlKTsKICAgICAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC41cyBlYXNlOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wbGF5ZXItaGVhbHRoLWJhciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzBmMCAwJSwgI2ZmMCA1MCUsICNmMDAgMTAwJSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5iYXR0bGUtYXJlYSB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBtYXJnaW46IDMwcHggMDsKICAgICAgICAgICAgbWluLWhlaWdodDogMjUwcHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jaGFyYWN0ZXIgewogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnBsYXllciB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMTAwLCAwLCAwLjIpOwogICAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNENBRjUwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZW5lbXkgewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDEwMCwgMCwgMCwgMC4yKTsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgI2Y0NDMzNjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNoYXJhY3Rlci1pbWcgewogICAgICAgICAgICBmb250LXNpemU6IDgwcHg7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wbGF5ZXItaW1nIHsKICAgICAgICAgICAgY29sb3I6ICM0Q0FGNTA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5lbmVteS1pbWcgewogICAgICAgICAgICBjb2xvcjogI2Y0NDMzNjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTsKICAgICAgICAgICAgZ2FwOiAxNXB4OwogICAgICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBidXR0b24gewogICAgICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBhOGZmOwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgICBmb250LXNpemU6IDEuMXJlbTsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYnV0dG9uOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwOTdlNjsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zcHgpOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwgMTY4LCAyNTUsIDAuNCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGJ1dHRvbjpkaXNhYmxlZCB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM1NTU7CiAgICAgICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmF0dGFjay1idG4gewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTc0YzNjOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuYXR0YWNrLWJ0bjpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjMDM5MmI7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNXB4IDE1cHggcmdiYSgyMzEsIDc2LCA2MCwgMC40KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmhlYWwtYnRuIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzJlY2M3MTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmhlYWwtYnRuOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzI3YWU2MDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA1cHggMTVweCByZ2JhKDQ2LCAyMDQsIDExMywgMC40KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNwZWNpYWwtYnRuIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzliNTliNjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNwZWNpYWwtYnRuOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzhlNDRhZDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA1cHggMTVweCByZ2JhKDE1NSwgODksIDE4MiwgMC40KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmRlZmVuZC1idG4gewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ5OGRiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZGVmZW5kLWJ0bjpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyOTgwYjk7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNXB4IDE1cHggcmdiYSg1MiwgMTUyLCAyMTksIDAuNCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5sb2cgewogICAgICAgICAgICBtYXJnaW4tdG9wOiAzMHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgIGhlaWdodDogMTUwcHg7CiAgICAgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM1NTU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5sb2cgaDMgewogICAgICAgICAgICBjb2xvcjogIzAwYThmZjsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMGE4ZmY7CiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiA1cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5sb2ctbWVzc2FnZSB7CiAgICAgICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICMzMzM7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wbGF5ZXItbG9nIHsKICAgICAgICAgICAgY29sb3I6ICM0Q0FGNTA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5lbmVteS1sb2cgewogICAgICAgICAgICBjb2xvcjogI2Y0NDMzNjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnN5c3RlbS1sb2cgewogICAgICAgICAgICBjb2xvcjogI0ZGRDcwMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmdhbWUtc3RhdHVzIHsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBmb250LXNpemU6IDEuNXJlbTsKICAgICAgICAgICAgbWFyZ2luLXRvcDogMjBweDsKICAgICAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLndpbiB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDYsIDIwNCwgMTEzLCAwLjMpOwogICAgICAgICAgICBjb2xvcjogIzJlY2M3MTsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgIzJlY2M3MTsKICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5sb3NlIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzEsIDc2LCA2MCwgMC4zKTsKICAgICAgICAgICAgY29sb3I6ICNlNzRjM2M7CiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICNlNzRjM2M7CiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAucmVzdGFydC1idG4gewogICAgICAgICAgICBncmlkLWNvbHVtbjogc3BhbiAyOwogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZENzAwOwogICAgICAgICAgICBjb2xvcjogIzMzMzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnJlc3RhcnQtYnRuOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGQzQwMDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA1cHggMTVweCByZ2JhKDI1NSwgMjE1LCAwLCAwLjQpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAucmVzdGFydC1idG4gewogICAgICAgICAgICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLmJhdHRsZS1hcmVhIHsKICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgICAgICBnYXA6IDIwcHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAmbHQ7L3N0eWxlJmd0OwombHQ7L2hlYWQmZ3Q7CiZsdDtib2R5Jmd0OwogICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtjb250YWluZXImcXVvdDsmZ3Q7CiAgICAgICAgJmx0O2gxJmd0O/Cfl6HvuI8g4LmA4LiB4Lih4LiV4LmI4Lit4Liq4Li54LmJIFJQRyDwn5uh77iPJmx0Oy9oMSZndDsKICAgICAgICAKICAgICAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2dhbWUtaW5mbyZxdW90OyZndDsKICAgICAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtwbGF5ZXItaW5mbyZxdW90OyZndDsKICAgICAgICAgICAgICAgICZsdDtoMiZndDvguK7guLXguYLguKPguYgg8J+muCZsdDsvaDImZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7ZGl2Jmd0O+C4nuC4peC4seC4h+C4iuC4teC4p+C4tOC4lTogJmx0O3NwYW4gaWQ9JnF1b3Q7cGxheWVyLWhlYWx0aCZxdW90OyZndDsxMDAmbHQ7L3NwYW4mZ3Q7LyZsdDtzcGFuIGlkPSZxdW90O3BsYXllci1tYXgtaGVhbHRoJnF1b3Q7Jmd0OzEwMCZsdDsvc3BhbiZndDsmbHQ7L2RpdiZndDsKICAgICAgICAgICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7aGVhbHRoLWJhci1jb250YWluZXImcXVvdDsmZ3Q7CiAgICAgICAgICAgICAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtoZWFsdGgtYmFyIHBsYXllci1oZWFsdGgtYmFyJnF1b3Q7IGlkPSZxdW90O3BsYXllci1oZWFsdGgtYmFyJnF1b3Q7IHN0eWxlPSZxdW90O3dpZHRoOiAxMDAlJnF1b3Q7Jmd0OyZsdDsvZGl2Jmd0OwogICAgICAgICAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7ZGl2Jmd0O+C4nuC4peC4seC4h+C5guC4iOC4oeC4leC4tTogJmx0O3NwYW4gaWQ9JnF1b3Q7cGxheWVyLWF0dGFjayZxdW90OyZndDsxNSZsdDsvc3BhbiZndDsmbHQ7L2RpdiZndDsKICAgICAgICAgICAgICAgICZsdDtkaXYmZ3Q74LiB4Liy4Lij4Lib4LmJ4Lit4LiH4LiB4Lix4LiZOiAmbHQ7c3BhbiBpZD0mcXVvdDtwbGF5ZXItZGVmZW5zZSZxdW90OyZndDsxMCZsdDsvc3BhbiZndDsmbHQ7L2RpdiZndDsKICAgICAgICAgICAgICAgICZsdDtkaXYmZ3Q74Lie4Lil4Lix4LiH4LmA4Lin4LiXOiAmbHQ7c3BhbiBpZD0mcXVvdDtwbGF5ZXItbWFuYSZxdW90OyZndDs1MCZsdDsvc3BhbiZndDsvJmx0O3NwYW4gaWQ9JnF1b3Q7cGxheWVyLW1heC1tYW5hJnF1b3Q7Jmd0OzUwJmx0Oy9zcGFuJmd0OyZsdDsvZGl2Jmd0OwogICAgICAgICAgICAmbHQ7L2RpdiZndDsKICAgICAgICAgICAgCiAgICAgICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7ZW5lbXktaW5mbyZxdW90OyZndDsKICAgICAgICAgICAgICAgICZsdDtoMiZndDvguKHguK3guJnguKrguYDguJXguK3guKPguYwg8J+RuSZsdDsvaDImZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7ZGl2Jmd0O+C4nuC4peC4seC4h+C4iuC4teC4p+C4tOC4lTogJmx0O3NwYW4gaWQ9JnF1b3Q7ZW5lbXktaGVhbHRoJnF1b3Q7Jmd0OzEyMCZsdDsvc3BhbiZndDsvJmx0O3NwYW4gaWQ9JnF1b3Q7ZW5lbXktbWF4LWhlYWx0aCZxdW90OyZndDsxMjAmbHQ7L3NwYW4mZ3Q7Jmx0Oy9kaXYmZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2hlYWx0aC1iYXItY29udGFpbmVyJnF1b3Q7Jmd0OwogICAgICAgICAgICAgICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7aGVhbHRoLWJhciZxdW90OyBpZD0mcXVvdDtlbmVteS1oZWFsdGgtYmFyJnF1b3Q7IHN0eWxlPSZxdW90O3dpZHRoOiAxMDAlJnF1b3Q7Jmd0OyZsdDsvZGl2Jmd0OwogICAgICAgICAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7ZGl2Jmd0O+C4nuC4peC4seC4h+C5guC4iOC4oeC4leC4tTogJmx0O3NwYW4gaWQ9JnF1b3Q7ZW5lbXktYXR0YWNrJnF1b3Q7Jmd0OzEyJmx0Oy9zcGFuJmd0OyZsdDsvZGl2Jmd0OwogICAgICAgICAgICAgICAgJmx0O2RpdiZndDvguIHguLLguKPguJvguYnguK3guIfguIHguLHguJk6ICZsdDtzcGFuIGlkPSZxdW90O2VuZW15LWRlZmVuc2UmcXVvdDsmZ3Q7OCZsdDsvc3BhbiZndDsmbHQ7L2RpdiZndDsKICAgICAgICAgICAgICAgICZsdDtkaXYmZ3Q74Lie4Lil4Lix4LiH4LmA4Lin4LiXOiAmbHQ7c3BhbiBpZD0mcXVvdDtlbmVteS1tYW5hJnF1b3Q7Jmd0OzMwJmx0Oy9zcGFuJmd0Oy8mbHQ7c3BhbiBpZD0mcXVvdDtlbmVteS1tYXgtbWFuYSZxdW90OyZndDszMCZsdDsvc3BhbiZndDsmbHQ7L2RpdiZndDsKICAgICAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAgICAgCiAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtiYXR0bGUtYXJlYSZxdW90OyZndDsKICAgICAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtjaGFyYWN0ZXIgcGxheWVyJnF1b3Q7Jmd0OwogICAgICAgICAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtjaGFyYWN0ZXItaW1nIHBsYXllci1pbWcmcXVvdDsmZ3Q74pqU77iPJmx0Oy9kaXYmZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7aDMmZ3Q74Liu4Li14LmC4Lij4LmIJmx0Oy9oMyZndDsKICAgICAgICAgICAgICAgICZsdDtkaXYmZ3Q74Lie4Lil4Lix4LiH4LiK4Li14Lin4Li04LiVOiAmbHQ7c3BhbiBpZD0mcXVvdDtwbGF5ZXItaGVhbHRoLWRpc3BsYXkmcXVvdDsmZ3Q7MTAwJmx0Oy9zcGFuJmd0OyZsdDsvZGl2Jmd0OwogICAgICAgICAgICAmbHQ7L2RpdiZndDsKICAgICAgICAgICAgCiAgICAgICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7Y2hhcmFjdGVyIGVuZW15JnF1b3Q7Jmd0OwogICAgICAgICAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtjaGFyYWN0ZXItaW1nIGVuZW15LWltZyZxdW90OyZndDvwn5G5Jmx0Oy9kaXYmZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7aDMmZ3Q74Lih4Lit4LiZ4Liq4LmA4LiV4Lit4Lij4LmMJmx0Oy9oMyZndDsKICAgICAgICAgICAgICAgICZsdDtkaXYmZ3Q74Lie4Lil4Lix4LiH4LiK4Li14Lin4Li04LiVOiAmbHQ7c3BhbiBpZD0mcXVvdDtlbmVteS1oZWFsdGgtZGlzcGxheSZxdW90OyZndDsxMjAmbHQ7L3NwYW4mZ3Q7Jmx0Oy9kaXYmZ3Q7CiAgICAgICAgICAgICZsdDsvZGl2Jmd0OwogICAgICAgICZsdDsvZGl2Jmd0OwogICAgICAgIAogICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7Y29udHJvbHMmcXVvdDsmZ3Q7CiAgICAgICAgICAgICZsdDtidXR0b24gY2xhc3M9JnF1b3Q7YXR0YWNrLWJ0biZxdW90OyBpZD0mcXVvdDthdHRhY2stYnRuJnF1b3Q7Jmd0O+KalO+4jyDguYLguIjguKHguJXguLUmbHQ7L2J1dHRvbiZndDsKICAgICAgICAgICAgJmx0O2J1dHRvbiBjbGFzcz0mcXVvdDtoZWFsLWJ0biZxdW90OyBpZD0mcXVvdDtoZWFsLWJ0biZxdW90OyZndDvinaTvuI8mendqO/Cfqbkg4Lij4Lix4LiB4Lip4LiyICjguYPguIrguYkgMjAg4Lie4Lil4Lix4LiH4LmA4Lin4LiXKSZsdDsvYnV0dG9uJmd0OwogICAgICAgICAgICAmbHQ7YnV0dG9uIGNsYXNzPSZxdW90O3NwZWNpYWwtYnRuJnF1b3Q7IGlkPSZxdW90O3NwZWNpYWwtYnRuJnF1b3Q7Jmd0O/CflKUg4LmC4LiI4Lih4LiV4Li14Lie4Li04LmA4Lio4LipICjguYPguIrguYkgMzAg4Lie4Lil4Lix4LiH4LmA4Lin4LiXKSZsdDsvYnV0dG9uJmd0OwogICAgICAgICAgICAmbHQ7YnV0dG9uIGNsYXNzPSZxdW90O2RlZmVuZC1idG4mcXVvdDsgaWQ9JnF1b3Q7ZGVmZW5kLWJ0biZxdW90OyZndDvwn5uh77iPIOC4leC4seC5ieC4h+C4o+C4seC4miZsdDsvYnV0dG9uJmd0OwogICAgICAgICAgICAmbHQ7YnV0dG9uIGNsYXNzPSZxdW90O3Jlc3RhcnQtYnRuJnF1b3Q7IGlkPSZxdW90O3Jlc3RhcnQtYnRuJnF1b3Q7Jmd0O/CflIQg4LmA4Lij4Li04LmI4Lih4LmA4LiB4Lih4LmD4Lir4Lih4LmIJmx0Oy9idXR0b24mZ3Q7CiAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAgICAgCiAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtnYW1lLXN0YXR1cyZxdW90OyBpZD0mcXVvdDtnYW1lLXN0YXR1cyZxdW90OyZndDsmbHQ7L2RpdiZndDsKICAgICAgICAKICAgICAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2xvZyZxdW90OyZndDsKICAgICAgICAgICAgJmx0O2gzJmd0O+C4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C4leC5iOC4reC4quC4ueC5iSZsdDsvaDMmZ3Q7CiAgICAgICAgICAgICZsdDtkaXYgaWQ9JnF1b3Q7YmF0dGxlLWxvZyZxdW90OyZndDsKICAgICAgICAgICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7bG9nLW1lc3NhZ2Ugc3lzdGVtLWxvZyZxdW90OyZndDvguIHguLLguKPguJXguYjguK3guKrguLnguYnguYDguKPguLTguYjguKHguILguLbguYnguJkhIOC4ruC4teC5guC4o+C5iOC4nuC4muC4geC4seC4muC4oeC4reC4meC4quC5gOC4leC4reC4o+C5jCEmbHQ7L2RpdiZndDsKICAgICAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAmbHQ7L2RpdiZndDsKCiAgICAmbHQ7c2NyaXB0Jmd0OwogICAgICAgIC8vIOC4leC4seC4p+C5geC4m+C4o+C5gOC4geC4oQogICAgICAgIGxldCBwbGF5ZXIgPSB7CiAgICAgICAgICAgIGhlYWx0aDogMTAwLAogICAgICAgICAgICBtYXhIZWFsdGg6IDEwMCwKICAgICAgICAgICAgYXR0YWNrOiAxNSwKICAgICAgICAgICAgZGVmZW5zZTogMTAsCiAgICAgICAgICAgIG1hbmE6IDUwLAogICAgICAgICAgICBtYXhNYW5hOiA1MCwKICAgICAgICAgICAgaXNEZWZlbmRpbmc6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICAKICAgICAgICBsZXQgZW5lbXkgPSB7CiAgICAgICAgICAgIGhlYWx0aDogMTIwLAogICAgICAgICAgICBtYXhIZWFsdGg6IDEyMCwKICAgICAgICAgICAgYXR0YWNrOiAxMiwKICAgICAgICAgICAgZGVmZW5zZTogOCwKICAgICAgICAgICAgbWFuYTogMzAsCiAgICAgICAgICAgIG1heE1hbmE6IDMwLAogICAgICAgICAgICBpc0RlZmVuZGluZzogZmFsc2UKICAgICAgICB9OwogICAgICAgIAogICAgICAgIGxldCBnYW1lT3ZlciA9IGZhbHNlOwogICAgICAgIGxldCBiYXR0bGVMb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0dGxlLWxvZycpOwogICAgICAgIAogICAgICAgIC8vIOC4reC4seC4nuC5gOC4lOC4lSBVSQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVVJKCkgewogICAgICAgICAgICAvLyDguK3guLHguJ7guYDguJTguJXguILguYnguK3guKHguLnguKXguJzguLnguYnguYDguKXguYjguJkKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsYXllci1oZWFsdGgnKS50ZXh0Q29udGVudCA9IHBsYXllci5oZWFsdGg7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGF5ZXItbWF4LWhlYWx0aCcpLnRleHRDb250ZW50ID0gcGxheWVyLm1heEhlYWx0aDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsYXllci1oZWFsdGgtZGlzcGxheScpLnRleHRDb250ZW50ID0gcGxheWVyLmhlYWx0aDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsYXllci1hdHRhY2snKS50ZXh0Q29udGVudCA9IHBsYXllci5hdHRhY2s7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGF5ZXItZGVmZW5zZScpLnRleHRDb250ZW50ID0gcGxheWVyLmRlZmVuc2U7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGF5ZXItbWFuYScpLnRleHRDb250ZW50ID0gcGxheWVyLm1hbmE7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGF5ZXItbWF4LW1hbmEnKS50ZXh0Q29udGVudCA9IHBsYXllci5tYXhNYW5hOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4Lit4Lix4Lie4LmA4LiU4LiV4LmB4LiW4Lia4Lie4Lil4Lix4LiH4LiK4Li14Lin4Li04LiV4Lic4Li54LmJ4LmA4Lil4LmI4LiZCiAgICAgICAgICAgIGxldCBwbGF5ZXJIZWFsdGhQZXJjZW50ID0gKHBsYXllci5oZWFsdGggLyBwbGF5ZXIubWF4SGVhbHRoKSAqIDEwMDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsYXllci1oZWFsdGgtYmFyJykuc3R5bGUud2lkdGggPSBgJHtwbGF5ZXJIZWFsdGhQZXJjZW50fSVgOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4Lit4Lix4Lie4LmA4LiU4LiV4LiC4LmJ4Lit4Lih4Li54Lil4Lio4Lix4LiV4Lij4Li5CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmVteS1oZWFsdGgnKS50ZXh0Q29udGVudCA9IGVuZW15LmhlYWx0aDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuZW15LW1heC1oZWFsdGgnKS50ZXh0Q29udGVudCA9IGVuZW15Lm1heEhlYWx0aDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuZW15LWhlYWx0aC1kaXNwbGF5JykudGV4dENvbnRlbnQgPSBlbmVteS5oZWFsdGg7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmVteS1hdHRhY2snKS50ZXh0Q29udGVudCA9IGVuZW15LmF0dGFjazsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuZW15LWRlZmVuc2UnKS50ZXh0Q29udGVudCA9IGVuZW15LmRlZmVuc2U7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmVteS1tYW5hJykudGV4dENvbnRlbnQgPSBlbmVteS5tYW5hOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5lbXktbWF4LW1hbmEnKS50ZXh0Q29udGVudCA9IGVuZW15Lm1heE1hbmE7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguK3guLHguJ7guYDguJTguJXguYHguJbguJrguJ7guKXguLHguIfguIrguLXguKfguLTguJXguKjguLHguJXguKPguLkKICAgICAgICAgICAgbGV0IGVuZW15SGVhbHRoUGVyY2VudCA9IChlbmVteS5oZWFsdGggLyBlbmVteS5tYXhIZWFsdGgpICogMTAwOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5lbXktaGVhbHRoLWJhcicpLnN0eWxlLndpZHRoID0gYCR7ZW5lbXlIZWFsdGhQZXJjZW50fSVgOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Liq4LiW4Liy4LiZ4Liw4LmA4LiB4LihCiAgICAgICAgICAgIGlmIChwbGF5ZXIuaGVhbHRoICZsdDs9IDApIHsKICAgICAgICAgICAgICAgIGVuZEdhbWUoZmFsc2UpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGVuZW15LmhlYWx0aCAmbHQ7PSAwKSB7CiAgICAgICAgICAgICAgICBlbmRHYW1lKHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguK3guLHguJ7guYDguJTguJXguKrguJbguLLguJnguLDguJvguLjguYjguKEKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWwtYnRuJykuZGlzYWJsZWQgPSBwbGF5ZXIubWFuYSAmbHQ7IDIwOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BlY2lhbC1idG4nKS5kaXNhYmxlZCA9IHBsYXllci5tYW5hICZsdDsgMzA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOC5gOC4nuC4tOC5iOC4oeC4guC5ieC4reC4hOC4p+C4suC4oeC5g+C4meC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C4leC5iOC4reC4quC4ueC5iQogICAgICAgIGZ1bmN0aW9uIGFkZExvZ01lc3NhZ2UobWVzc2FnZSwgdHlwZSkgewogICAgICAgICAgICBsZXQgbG9nRW50cnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgbG9nRW50cnkuY2xhc3NOYW1lID0gYGxvZy1tZXNzYWdlICR7dHlwZX0tbG9nYDsKICAgICAgICAgICAgbG9nRW50cnkudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgICAgICAgICBiYXR0bGVMb2cuYXBwZW5kQ2hpbGQobG9nRW50cnkpOwogICAgICAgICAgICBiYXR0bGVMb2cuc2Nyb2xsVG9wID0gYmF0dGxlTG9nLnNjcm9sbEhlaWdodDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8g4LiB4Liy4Lij4LmC4LiI4Lih4LiV4Li14LiC4Lit4LiH4Lic4Li54LmJ4LmA4Lil4LmI4LiZCiAgICAgICAgZnVuY3Rpb24gcGxheWVyQXR0YWNrKCkgewogICAgICAgICAgICBpZiAoZ2FtZU92ZXIpIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgICAgIGxldCBkYW1hZ2UgPSBwbGF5ZXIuYXR0YWNrOwogICAgICAgICAgICBpZiAoZW5lbXkuaXNEZWZlbmRpbmcpIHsKICAgICAgICAgICAgICAgIGRhbWFnZSA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoZGFtYWdlIC8gMikpOwogICAgICAgICAgICAgICAgYWRkTG9nTWVzc2FnZShg4Lih4Lit4LiZ4Liq4LmA4LiV4Lit4Lij4LmM4LiV4Lix4LmJ4LiH4Lij4Lix4Lia4LmE4Lin4LmJIOC4peC4lOC4hOC4p+C4suC4oeC5gOC4quC4teC4ouC4q+C4suC4ouC4peC4h+C4hOC4o+C4tuC5iOC4h+C4q+C4meC4tuC5iOC4hyFgLCAnc3lzdGVtJyk7CiAgICAgICAgICAgICAgICBlbmVteS5pc0RlZmVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlbmVteS5oZWFsdGggLT0gZGFtYWdlOwogICAgICAgICAgICBhZGRMb2dNZXNzYWdlKGDguK7guLXguYLguKPguYjguYLguIjguKHguJXguLXguKHguK3guJnguKrguYDguJXguK3guKPguYzguYHguKXguLDguJfguLPguYPguKvguYnguYDguKrguLXguKLguKvguLLguKIgJHtkYW1hZ2V9IOC4q+C4meC5iOC4p+C4oiFgLCAncGxheWVyJyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguK3guLHguJ7guYDguJTguJUgVUkKICAgICAgICAgICAgdXBkYXRlVUkoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4luC5ieC4suC5gOC4geC4oeC4ouC4seC4h+C5hOC4oeC5iOC4iOC4muC5g+C4q+C5ieC4qOC4seC4leC4o+C4ueC4leC4reC4muC5guC4leC5iQogICAgICAgICAgICBpZiAoZW5lbXkuaGVhbHRoICZndDsgMCAmYW1wOyZhbXA7ICFnYW1lT3ZlcikgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChlbmVteVR1cm4sIDEwMDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOC4geC4suC4o+C4o+C4seC4geC4qeC4suC4guC4reC4h+C4nOC4ueC5ieC5gOC4peC5iOC4mQogICAgICAgIGZ1bmN0aW9uIHBsYXllckhlYWwoKSB7CiAgICAgICAgICAgIGlmIChnYW1lT3ZlciB8fCBwbGF5ZXIubWFuYSAmbHQ7IDIwKSByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgICAgICBsZXQgaGVhbEFtb3VudCA9IDI1OwogICAgICAgICAgICBwbGF5ZXIuaGVhbHRoID0gTWF0aC5taW4ocGxheWVyLm1heEhlYWx0aCwgcGxheWVyLmhlYWx0aCArIGhlYWxBbW91bnQpOwogICAgICAgICAgICBwbGF5ZXIubWFuYSAtPSAyMDsKICAgICAgICAgICAgCiAgICAgICAgICAgIGFkZExvZ01lc3NhZ2UoYOC4ruC4teC5guC4o+C5iOC5g+C4iuC5ieC5gOC4p+C4l+C4oeC4meC4leC4o+C5jOC4o+C4seC4geC4qeC4suC4leC4seC4p+C5gOC4reC4h+C5hOC4lOC5iSAke2hlYWxBbW91bnR9IOC4q+C4meC5iOC4p+C4ouC4iuC4teC4p+C4tOC4lSFgLCAncGxheWVyJyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguK3guLHguJ7guYDguJTguJUgVUkKICAgICAgICAgICAgdXBkYXRlVUkoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4luC5ieC4suC5gOC4geC4oeC4ouC4seC4h+C5hOC4oeC5iOC4iOC4muC5g+C4q+C5ieC4qOC4seC4leC4o+C4ueC4leC4reC4muC5guC4leC5iQogICAgICAgICAgICBpZiAoIWdhbWVPdmVyKSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGVuZW15VHVybiwgMTAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8g4LiB4Liy4Lij4LmC4LiI4Lih4LiV4Li14Lie4Li04LmA4Lio4Lip4LiC4Lit4LiH4Lic4Li54LmJ4LmA4Lil4LmI4LiZCiAgICAgICAgZnVuY3Rpb24gcGxheWVyU3BlY2lhbEF0dGFjaygpIHsKICAgICAgICAgICAgaWYgKGdhbWVPdmVyIHx8IHBsYXllci5tYW5hICZsdDsgMzApIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgICAgIGxldCBkYW1hZ2UgPSBwbGF5ZXIuYXR0YWNrICogMjsKICAgICAgICAgICAgaWYgKGVuZW15LmlzRGVmZW5kaW5nKSB7CiAgICAgICAgICAgICAgICBkYW1hZ2UgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGRhbWFnZSAvIDIpKTsKICAgICAgICAgICAgICAgIGFkZExvZ01lc3NhZ2UoYOC4oeC4reC4meC4quC5gOC4leC4reC4o+C5jOC4leC4seC5ieC4h+C4o+C4seC4muC5hOC4p+C5iSDguKXguJTguITguKfguLLguKHguYDguKrguLXguKLguKvguLLguKLguKXguIfguITguKPguLbguYjguIfguKvguJnguLbguYjguIchYCwgJ3N5c3RlbScpOwogICAgICAgICAgICAgICAgZW5lbXkuaXNEZWZlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZW5lbXkuaGVhbHRoIC09IGRhbWFnZTsKICAgICAgICAgICAgcGxheWVyLm1hbmEgLT0gMzA7CiAgICAgICAgICAgIAogICAgICAgICAgICBhZGRMb2dNZXNzYWdlKGDguK7guLXguYLguKPguYjguYPguIrguYnguYLguIjguKHguJXguLXguJ7guLTguYDguKjguKnguYHguKXguLDguJfguLPguYPguKvguYnguKHguK3guJnguKrguYDguJXguK3guKPguYzguYDguKrguLXguKLguKvguLLguKIgJHtkYW1hZ2V9IOC4q+C4meC5iOC4p+C4oiFgLCAncGxheWVyJyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguK3guLHguJ7guYDguJTguJUgVUkKICAgICAgICAgICAgdXBkYXRlVUkoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4luC5ieC4suC5gOC4geC4oeC4ouC4seC4h+C5hOC4oeC5iOC4iOC4muC5g+C4q+C5ieC4qOC4seC4leC4o+C4ueC4leC4reC4muC5guC4leC5iQogICAgICAgICAgICBpZiAoZW5lbXkuaGVhbHRoICZndDsgMCAmYW1wOyZhbXA7ICFnYW1lT3ZlcikgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChlbmVteVR1cm4sIDEwMDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOC4geC4suC4o+C4leC4seC5ieC4h+C4o+C4seC4muC4guC4reC4h+C4nOC4ueC5ieC5gOC4peC5iOC4mQogICAgICAgIGZ1bmN0aW9uIHBsYXllckRlZmVuZCgpIHsKICAgICAgICAgICAgaWYgKGdhbWVPdmVyKSByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgICAgICBwbGF5ZXIuaXNEZWZlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICBhZGRMb2dNZXNzYWdlKGDguK7guLXguYLguKPguYjguJXguLHguYnguIfguJfguYjguLLguJvguYnguK3guIfguIHguLHguJkg4LiB4Liy4Lij4LmC4LiI4Lih4LiV4Li14LiE4Lij4Lix4LmJ4LiH4LiV4LmI4Lit4LmE4Lib4LiI4Liw4LmE4LiU4LmJ4Lij4Lix4Lia4LiE4Lin4Liy4Lih4LmA4Liq4Li14Lii4Lir4Liy4Lii4Lil4LiU4Lil4LiH4LiE4Lij4Li24LmI4LiH4Lir4LiZ4Li24LmI4LiHIWAsICdwbGF5ZXInKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4reC4seC4nuC5gOC4lOC4lSBVSQogICAgICAgICAgICB1cGRhdGVVSSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4LiW4LmJ4Liy4LmA4LiB4Lih4Lii4Lix4LiH4LmE4Lih4LmI4LiI4Lia4LmD4Lir4LmJ4Lio4Lix4LiV4Lij4Li54LiV4Lit4Lia4LmC4LiV4LmJCiAgICAgICAgICAgIGlmICghZ2FtZU92ZXIpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZW5lbXlUdXJuLCAxMDAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyDguYDguJfguLTguKPguYzguJnguILguK3guIfguKjguLHguJXguKPguLkKICAgICAgICBmdW5jdGlvbiBlbmVteVR1cm4oKSB7CiAgICAgICAgICAgIGlmIChnYW1lT3ZlcikgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4Lij4Li14LmA4LiL4LmH4LiV4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4Lij4Lix4Lia4LiC4Lit4LiH4Lic4Li54LmJ4LmA4Lil4LmI4LiZCiAgICAgICAgICAgIHBsYXllci5pc0RlZmVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4Lio4Lix4LiV4Lij4Li54LmA4Lil4Li34Lit4LiB4LiB4Liy4Lij4LiB4Lij4Liw4LiX4Liz4LmB4Lia4Lia4Liq4Li44LmI4LihCiAgICAgICAgICAgIGxldCBhY3Rpb25zID0gWydhdHRhY2snLCAnZGVmZW5kJ107CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguYDguJ7guLTguYjguKHguYLguK3guIHguLLguKrguYPguIrguYnguYDguKfguJfguKHguJnguJXguKPguYzguJbguYnguLLguKHguLXguJ7guKXguLHguIfguYDguKfguJfguJ7guK0KICAgICAgICAgICAgaWYgKGVuZW15Lm1hbmEgJmd0Oz0gMTUpIHsKICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCgnc3BlY2lhbCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguYDguJ7guLTguYjguKHguYLguK3guIHguLLguKrguKPguLHguIHguKnguLLguJXguLHguKfguYDguK3guIfguJbguYnguLLguJ7guKXguLHguIfguIrguLXguKfguLTguJXguJXguYjguLPguIHguKfguYjguLIgNTAlCiAgICAgICAgICAgIGlmIChlbmVteS5oZWFsdGggJmx0OyBlbmVteS5tYXhIZWFsdGggKiAwLjUgJmFtcDsmYW1wOyBlbmVteS5tYW5hICZndDs9IDEwKSB7CiAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goJ2hlYWwnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGFjdGlvbnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWN0aW9ucy5sZW5ndGgpXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHN3aXRjaChhY3Rpb24pIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2F0dGFjayc6CiAgICAgICAgICAgICAgICAgICAgbGV0IGRhbWFnZSA9IGVuZW15LmF0dGFjazsKICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLmlzRGVmZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhbWFnZSA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoZGFtYWdlIC8gMikpOwogICAgICAgICAgICAgICAgICAgICAgICBhZGRMb2dNZXNzYWdlKGDguK7guLXguYLguKPguYjguJXguLHguYnguIfguKPguLHguJrguYTguKfguYkg4Lil4LiU4LiE4Lin4Liy4Lih4LmA4Liq4Li14Lii4Lir4Liy4Lii4Lil4LiH4LiE4Lij4Li24LmI4LiH4Lir4LiZ4Li24LmI4LiHIWAsICdzeXN0ZW0nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmhlYWx0aCAtPSBkYW1hZ2U7CiAgICAgICAgICAgICAgICAgICAgYWRkTG9nTWVzc2FnZShg4Lih4Lit4LiZ4Liq4LmA4LiV4Lit4Lij4LmM4LmC4LiI4Lih4LiV4Li14Liu4Li14LmC4Lij4LmI4LmB4Lil4Liw4LiX4Liz4LmD4Lir4LmJ4LmA4Liq4Li14Lii4Lir4Liy4LiiICR7ZGFtYWdlfSDguKvguJnguYjguKfguKIhYCwgJ2VuZW15Jyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjYXNlICdkZWZlbmQnOgogICAgICAgICAgICAgICAgICAgIGVuZW15LmlzRGVmZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBhZGRMb2dNZXNzYWdlKGDguKHguK3guJnguKrguYDguJXguK3guKPguYzguJXguLHguYnguIfguJfguYjguLLguJvguYnguK3guIfguIHguLHguJkhYCwgJ2VuZW15Jyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjYXNlICdoZWFsJzoKICAgICAgICAgICAgICAgICAgICBsZXQgaGVhbEFtb3VudCA9IDIwOwogICAgICAgICAgICAgICAgICAgIGVuZW15LmhlYWx0aCA9IE1hdGgubWluKGVuZW15Lm1heEhlYWx0aCwgZW5lbXkuaGVhbHRoICsgaGVhbEFtb3VudCk7CiAgICAgICAgICAgICAgICAgICAgZW5lbXkubWFuYSAtPSAxMDsKICAgICAgICAgICAgICAgICAgICBhZGRMb2dNZXNzYWdlKGDguKHguK3guJnguKrguYDguJXguK3guKPguYzguYPguIrguYnguYDguKfguJfguKHguJnguJXguKPguYzguKPguLHguIHguKnguLLguJXguLHguKfguYDguK3guIfguYTguJTguYkgJHtoZWFsQW1vdW50fSDguKvguJnguYjguKfguKLguIrguLXguKfguLTguJUhYCwgJ2VuZW15Jyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjYXNlICdzcGVjaWFsJzoKICAgICAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbERhbWFnZSA9IGVuZW15LmF0dGFjayAqIDEuNTsKICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLmlzRGVmZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxEYW1hZ2UgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHNwZWNpYWxEYW1hZ2UgLyAyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZExvZ01lc3NhZ2UoYOC4ruC4teC5guC4o+C5iOC4leC4seC5ieC4h+C4o+C4seC4muC5hOC4p+C5iSDguKXguJTguITguKfguLLguKHguYDguKrguLXguKLguKvguLLguKLguKXguIfguITguKPguLbguYjguIfguKvguJnguLbguYjguIchYCwgJ3N5c3RlbScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuaGVhbHRoIC09IHNwZWNpYWxEYW1hZ2U7CiAgICAgICAgICAgICAgICAgICAgZW5lbXkubWFuYSAtPSAxNTsKICAgICAgICAgICAgICAgICAgICBhZGRMb2dNZXNzYWdlKGDguKHguK3guJnguKrguYDguJXguK3guKPguYzguYPguIrguYnguYLguIjguKHguJXguLXguJ7guLTguYDguKjguKnguYHguKXguLDguJfguLPguYPguKvguYnguK7guLXguYLguKPguYjguYDguKrguLXguKLguKvguLLguKIgJHtzcGVjaWFsRGFtYWdlfSDguKvguJnguYjguKfguKIhYCwgJ2VuZW15Jyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4n+C4t+C5ieC4meC4n+C4ueC4nuC4peC4seC4h+C5gOC4p+C4l+C5gOC4peC5h+C4geC4meC5ieC4reC4ouC5g+C4meC5geC4leC5iOC4peC4sOC5gOC4l+C4tOC4o+C5jOC4mQogICAgICAgICAgICBwbGF5ZXIubWFuYSA9IE1hdGgubWluKHBsYXllci5tYXhNYW5hLCBwbGF5ZXIubWFuYSArIDUpOwogICAgICAgICAgICBlbmVteS5tYW5hID0gTWF0aC5taW4oZW5lbXkubWF4TWFuYSwgZW5lbXkubWFuYSArIDUpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4Lit4Lix4Lie4LmA4LiU4LiVIFVJCiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOC4iOC4muC5gOC4geC4oQogICAgICAgIGZ1bmN0aW9uIGVuZEdhbWUocGxheWVyV29uKSB7CiAgICAgICAgICAgIGdhbWVPdmVyID0gdHJ1ZTsKICAgICAgICAgICAgbGV0IGdhbWVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2FtZS1zdGF0dXMnKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChwbGF5ZXJXb24pIHsKICAgICAgICAgICAgICAgIGdhbWVTdGF0dXMudGV4dENvbnRlbnQgPSAmcXVvdDvwn46JIOC4iuC4meC4sCEg4LiE4Li44LiT4LiB4Liz4LiI4Lix4LiU4Lih4Lit4LiZ4Liq4LmA4LiV4Lit4Lij4LmM4LmE4LiU4LmJISDwn46JJnF1b3Q7OwogICAgICAgICAgICAgICAgZ2FtZVN0YXR1cy5jbGFzc05hbWUgPSAmcXVvdDtnYW1lLXN0YXR1cyB3aW4mcXVvdDs7CiAgICAgICAgICAgICAgICBhZGRMb2dNZXNzYWdlKCZxdW90O+C4hOC4uOC4k+C4iuC4meC4sOC4geC4suC4o+C4leC5iOC4reC4quC4ueC5iSEmcXVvdDssICdzeXN0ZW0nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdhbWVTdGF0dXMudGV4dENvbnRlbnQgPSAmcXVvdDvwn5KAIOC5geC4nuC5iSEg4Lih4Lit4LiZ4Liq4LmA4LiV4Lit4Lij4LmM4LiB4Liz4LiI4Lix4LiU4LiE4Li44LiT4LmE4LiU4LmJISDwn5KAJnF1b3Q7OwogICAgICAgICAgICAgICAgZ2FtZVN0YXR1cy5jbGFzc05hbWUgPSAmcXVvdDtnYW1lLXN0YXR1cyBsb3NlJnF1b3Q7OwogICAgICAgICAgICAgICAgYWRkTG9nTWVzc2FnZSgmcXVvdDvguITguLjguJPguYHguJ7guYnguIHguLLguKPguJXguYjguK3guKrguLnguYkhJnF1b3Q7LCAnc3lzdGVtJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC4m+C4uOC5iOC4oeC4geC4suC4o+C4geC4o+C4sOC4l+C4swogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29udHJvbHMgYnV0dG9uOm5vdCgjcmVzdGFydC1idG4pJykuZm9yRWFjaChidG4gPSZndDsgewogICAgICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOC5gOC4o+C4tOC5iOC4oeC5gOC4geC4oeC5g+C4q+C4oeC5iAogICAgICAgIGZ1bmN0aW9uIHJlc3RhcnRHYW1lKCkgewogICAgICAgICAgICAvLyDguKPguLXguYDguIvguYfguJXguILguYnguK3guKHguLnguKXguJzguLnguYnguYDguKXguYjguJkKICAgICAgICAgICAgcGxheWVyID0gewogICAgICAgICAgICAgICAgaGVhbHRoOiAxMDAsCiAgICAgICAgICAgICAgICBtYXhIZWFsdGg6IDEwMCwKICAgICAgICAgICAgICAgIGF0dGFjazogMTUsCiAgICAgICAgICAgICAgICBkZWZlbnNlOiAxMCwKICAgICAgICAgICAgICAgIG1hbmE6IDUwLAogICAgICAgICAgICAgICAgbWF4TWFuYTogNTAsCiAgICAgICAgICAgICAgICBpc0RlZmVuZGluZzogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4o+C4teC5gOC4i+C5h+C4leC4guC5ieC4reC4oeC4ueC4peC4qOC4seC4leC4o+C4uQogICAgICAgICAgICBlbmVteSA9IHsKICAgICAgICAgICAgICAgIGhlYWx0aDogMTIwLAogICAgICAgICAgICAgICAgbWF4SGVhbHRoOiAxMjAsCiAgICAgICAgICAgICAgICBhdHRhY2s6IDEyLAogICAgICAgICAgICAgICAgZGVmZW5zZTogOCwKICAgICAgICAgICAgICAgIG1hbmE6IDMwLAogICAgICAgICAgICAgICAgbWF4TWFuYTogMzAsCiAgICAgICAgICAgICAgICBpc0RlZmVuZGluZzogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGdhbWVPdmVyID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDguKXguYnguLLguIfguJrguLHguJnguJfguLbguIHguIHguLLguKPguJXguYjguK3guKrguLnguYkKICAgICAgICAgICAgYmF0dGxlTG9nLmlubmVySFRNTCA9ICcmbHQ7ZGl2IGNsYXNzPSZxdW90O2xvZy1tZXNzYWdlIHN5c3RlbS1sb2cmcXVvdDsmZ3Q74LiB4Liy4Lij4LiV4LmI4Lit4Liq4Li54LmJ4LmA4Lij4Li04LmI4Lih4LiC4Li24LmJ4LiZISDguK7guLXguYLguKPguYjguJ7guJrguIHguLHguJrguKHguK3guJnguKrguYDguJXguK3guKPguYwhJmx0Oy9kaXYmZ3Q7JzsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC4i+C5iOC4reC4meC4quC4luC4suC4meC4sOC5gOC4geC4oQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2FtZS1zdGF0dXMnKS5jbGFzc05hbWUgPSAmcXVvdDtnYW1lLXN0YXR1cyZxdW90OzsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOC5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC4m+C4uOC5iOC4oeC4geC4suC4o+C4geC4o+C4sOC4l+C4swogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29udHJvbHMgYnV0dG9uJykuZm9yRWFjaChidG4gPSZndDsgewogICAgICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g4Lit4Lix4Lie4LmA4LiU4LiVIFVJCiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOC4geC4s+C4q+C4meC4lCBldmVudCBsaXN0ZW5lcnMKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXR0YWNrLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGxheWVyQXR0YWNrKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHBsYXllckhlYWwpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVjaWFsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGxheWVyU3BlY2lhbEF0dGFjayk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlZmVuZC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHBsYXllckRlZmVuZCk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RhcnQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXN0YXJ0R2FtZSk7CiAgICAgICAgCiAgICAgICAgLy8g4Lit4Lix4Lie4LmA4LiU4LiVIFVJIOC5gOC4o+C4tOC5iOC4oeC4leC5ieC4mQogICAgICAgIHVwZGF0ZVVJKCk7CiAgICAmbHQ7L3NjcmlwdCZndDsKJmx0Oy9ib2R5Jmd0OwombHQ7L2h0bWwmZ3Q7
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>เกมต่อสู้ RPG</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
color: #fff;
min-height: 100vh;
padding: 20px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.container {
max-width: 900px;
width: 100%;
background-color: rgba(0, 0, 0, 0.7);
border-radius: 15px;
padding: 25px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
border: 2px solid #00a8ff;
}
h1 {
text-align: center;
color: #00a8ff;
margin-bottom: 20px;
font-size: 2.5rem;
text-shadow: 0 0 10px rgba(0, 168, 255, 0.5);
}
.game-info {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
background-color: rgba(0, 0, 0, 0.5);
padding: 15px;
border-radius: 10px;
border: 1px solid #333;
}
.player-info, .enemy-info {
flex: 1;
padding: 15px;
border-radius: 10px;
}
.player-info {
background-color: rgba(0, 100, 0, 0.3);
border: 2px solid #4CAF50;
}
.enemy-info {
background-color: rgba(100, 0, 0, 0.3);
border: 2px solid #f44336;
}
.health-bar-container {
background-color: #333;
height: 25px;
border-radius: 5px;
margin: 10px 0;
overflow: hidden;
}
.health-bar {
height: 100%;
background: linear-gradient(90deg, #f00 0%, #ff0 50%, #0f0 100%);
transition: width 0.5s ease;
border-radius: 5px;
}
.player-health-bar {
background: linear-gradient(90deg, #0f0 0%, #ff0 50%, #f00 100%);
}
.battle-area {
display: flex;
justify-content: space-around;
align-items: center;
margin: 30px 0;
min-height: 250px;
}
.character {
text-align: center;
padding: 20px;
border-radius: 10px;
width: 200px;
}
.player {
background-color: rgba(0, 100, 0, 0.2);
border: 2px solid #4CAF50;
}
.enemy {
background-color: rgba(100, 0, 0, 0.2);
border: 2px solid #f44336;
}
.character-img {
font-size: 80px;
margin-bottom: 10px;
}
.player-img {
color: #4CAF50;
}
.enemy-img {
color: #f44336;
}
.controls {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 15px;
margin-top: 20px;
}
button {
padding: 15px;
background-color: #00a8ff;
color: white;
border: none;
border-radius: 8px;
font-size: 1.1rem;
cursor: pointer;
transition: all 0.3s ease;
font-weight: bold;
}
button:hover {
background-color: #0097e6;
transform: translateY(-3px);
box-shadow: 0 5px 15px rgba(0, 168, 255, 0.4);
}
button:disabled {
background-color: #555;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
.attack-btn {
background-color: #e74c3c;
}
.attack-btn:hover {
background-color: #c0392b;
box-shadow: 0 5px 15px rgba(231, 76, 60, 0.4);
}
.heal-btn {
background-color: #2ecc71;
}
.heal-btn:hover {
background-color: #27ae60;
box-shadow: 0 5px 15px rgba(46, 204, 113, 0.4);
}
.special-btn {
background-color: #9b59b6;
}
.special-btn:hover {
background-color: #8e44ad;
box-shadow: 0 5px 15px rgba(155, 89, 182, 0.4);
}
.defend-btn {
background-color: #3498db;
}
.defend-btn:hover {
background-color: #2980b9;
box-shadow: 0 5px 15px rgba(52, 152, 219, 0.4);
}
.log {
margin-top: 30px;
background-color: rgba(0, 0, 0, 0.7);
padding: 15px;
border-radius: 10px;
height: 150px;
overflow-y: auto;
border: 1px solid #555;
}
.log h3 {
color: #00a8ff;
margin-bottom: 10px;
border-bottom: 1px solid #00a8ff;
padding-bottom: 5px;
}
.log-message {
padding: 5px 0;
border-bottom: 1px dotted #333;
}
.player-log {
color: #4CAF50;
}
.enemy-log {
color: #f44336;
}
.system-log {
color: #FFD700;
}
.game-status {
text-align: center;
font-size: 1.5rem;
margin-top: 20px;
padding: 15px;
border-radius: 10px;
display: none;
}
.win {
background-color: rgba(46, 204, 113, 0.3);
color: #2ecc71;
border: 2px solid #2ecc71;
display: block;
}
.lose {
background-color: rgba(231, 76, 60, 0.3);
color: #e74c3c;
border: 2px solid #e74c3c;
display: block;
}
.restart-btn {
grid-column: span 2;
background-color: #FFD700;
color: #333;
}
.restart-btn:hover {
background-color: #FFC400;
box-shadow: 0 5px 15px rgba(255, 215, 0, 0.4);
}
@media (max-width: 768px) {
.controls {
grid-template-columns: 1fr;
}
.restart-btn {
grid-column: span 1;
}
.battle-area {
flex-direction: column;
gap: 20px;
}
}
</style>
</head>
<body>
<div class="container">
<h1>🗡️ เกมต่อสู้ RPG 🛡️</h1>
<div class="game-info">
<div class="player-info">
<h2>ฮีโร่ 🦸</h2>
<div>พลังชีวิต: <span id="player-health">100</span>/<span id="player-max-health">100</span></div>
<div class="health-bar-container">
<div class="health-bar player-health-bar" id="player-health-bar" style="width: 100%"></div>
</div>
<div>พลังโจมตี: <span id="player-attack">15</span></div>
<div>การป้องกัน: <span id="player-defense">10</span></div>
<div>พลังเวท: <span id="player-mana">50</span>/<span id="player-max-mana">50</span></div>
</div>
<div class="enemy-info">
<h2>มอนสเตอร์ 👹</h2>
<div>พลังชีวิต: <span id="enemy-health">120</span>/<span id="enemy-max-health">120</span></div>
<div class="health-bar-container">
<div class="health-bar" id="enemy-health-bar" style="width: 100%"></div>
</div>
<div>พลังโจมตี: <span id="enemy-attack">12</span></div>
<div>การป้องกัน: <span id="enemy-defense">8</span></div>
<div>พลังเวท: <span id="enemy-mana">30</span>/<span id="enemy-max-mana">30</span></div>
</div>
</div>
<div class="battle-area">
<div class="character player">
<div class="character-img player-img">⚔️</div>
<h3>ฮีโร่</h3>
<div>พลังชีวิต: <span id="player-health-display">100</span></div>
</div>
<div class="character enemy">
<div class="character-img enemy-img">👹</div>
<h3>มอนสเตอร์</h3>
<div>พลังชีวิต: <span id="enemy-health-display">120</span></div>
</div>
</div>
<div class="controls">
<button class="attack-btn" id="attack-btn">⚔️ โจมตี</button>
<button class="heal-btn" id="heal-btn">❤️🩹 รักษา (ใช้ 20 พลังเวท)</button>
<button class="special-btn" id="special-btn">🔥 โจมตีพิเศษ (ใช้ 30 พลังเวท)</button>
<button class="defend-btn" id="defend-btn">🛡️ ตั้งรับ</button>
<button class="restart-btn" id="restart-btn">🔄 เริ่มเกมใหม่</button>
</div>
<div class="game-status" id="game-status"></div>
<div class="log">
<h3>บันทึกการต่อสู้</h3>
<div id="battle-log">
<div class="log-message system-log">การต่อสู้เริ่มขึ้น! ฮีโร่พบกับมอนสเตอร์!</div>
</div>
</div>
</div>
<script>
// ตัวแปรเกม
let player = {
health: 100,
maxHealth: 100,
attack: 15,
defense: 10,
mana: 50,
maxMana: 50,
isDefending: false
};
let enemy = {
health: 120,
maxHealth: 120,
attack: 12,
defense: 8,
mana: 30,
maxMana: 30,
isDefending: false
};
let gameOver = false;
let battleLog = document.getElementById('battle-log');
// อัพเดต UI
function updateUI() {
// อัพเดตข้อมูลผู้เล่น
document.getElementById('player-health').textContent = player.health;
document.getElementById('player-max-health').textContent = player.maxHealth;
document.getElementById('player-health-display').textContent = player.health;
document.getElementById('player-attack').textContent = player.attack;
document.getElementById('player-defense').textContent = player.defense;
document.getElementById('player-mana').textContent = player.mana;
document.getElementById('player-max-mana').textContent = player.maxMana;
// อัพเดตแถบพลังชีวิตผู้เล่น
let playerHealthPercent = (player.health / player.maxHealth) * 100;
document.getElementById('player-health-bar').style.width = `${playerHealthPercent}%`;
// อัพเดตข้อมูลศัตรู
document.getElementById('enemy-health').textContent = enemy.health;
document.getElementById('enemy-max-health').textContent = enemy.maxHealth;
document.getElementById('enemy-health-display').textContent = enemy.health;
document.getElementById('enemy-attack').textContent = enemy.attack;
document.getElementById('enemy-defense').textContent = enemy.defense;
document.getElementById('enemy-mana').textContent = enemy.mana;
document.getElementById('enemy-max-mana').textContent = enemy.maxMana;
// อัพเดตแถบพลังชีวิตศัตรู
let enemyHealthPercent = (enemy.health / enemy.maxHealth) * 100;
document.getElementById('enemy-health-bar').style.width = `${enemyHealthPercent}%`;
// ตรวจสอบสถานะเกม
if (player.health <= 0) {
endGame(false);
} else if (enemy.health <= 0) {
endGame(true);
}
// อัพเดตสถานะปุ่ม
document.getElementById('heal-btn').disabled = player.mana < 20;
document.getElementById('special-btn').disabled = player.mana < 30;
}
// เพิ่มข้อความในบันทึกการต่อสู้
function addLogMessage(message, type) {
let logEntry = document.createElement('div');
logEntry.className = `log-message ${type}-log`;
logEntry.textContent = message;
battleLog.appendChild(logEntry);
battleLog.scrollTop = battleLog.scrollHeight;
}
// การโจมตีของผู้เล่น
function playerAttack() {
if (gameOver) return;
let damage = player.attack;
if (enemy.isDefending) {
damage = Math.max(1, Math.floor(damage / 2));
addLogMessage(`มอนสเตอร์ตั้งรับไว้ ลดความเสียหายลงครึ่งหนึ่ง!`, 'system');
enemy.isDefending = false;
}
enemy.health -= damage;
addLogMessage(`ฮีโร่โจมตีมอนสเตอร์และทำให้เสียหาย ${damage} หน่วย!`, 'player');
// อัพเดต UI
updateUI();
// ถ้าเกมยังไม่จบให้ศัตรูตอบโต้
if (enemy.health > 0 && !gameOver) {
setTimeout(enemyTurn, 1000);
}
}
// การรักษาของผู้เล่น
function playerHeal() {
if (gameOver || player.mana < 20) return;
let healAmount = 25;
player.health = Math.min(player.maxHealth, player.health + healAmount);
player.mana -= 20;
addLogMessage(`ฮีโร่ใช้เวทมนตร์รักษาตัวเองได้ ${healAmount} หน่วยชีวิต!`, 'player');
// อัพเดต UI
updateUI();
// ถ้าเกมยังไม่จบให้ศัตรูตอบโต้
if (!gameOver) {
setTimeout(enemyTurn, 1000);
}
}
// การโจมตีพิเศษของผู้เล่น
function playerSpecialAttack() {
if (gameOver || player.mana < 30) return;
let damage = player.attack * 2;
if (enemy.isDefending) {
damage = Math.max(1, Math.floor(damage / 2));
addLogMessage(`มอนสเตอร์ตั้งรับไว้ ลดความเสียหายลงครึ่งหนึ่ง!`, 'system');
enemy.isDefending = false;
}
enemy.health -= damage;
player.mana -= 30;
addLogMessage(`ฮีโร่ใช้โจมตีพิเศษและทำให้มอนสเตอร์เสียหาย ${damage} หน่วย!`, 'player');
// อัพเดต UI
updateUI();
// ถ้าเกมยังไม่จบให้ศัตรูตอบโต้
if (enemy.health > 0 && !gameOver) {
setTimeout(enemyTurn, 1000);
}
}
// การตั้งรับของผู้เล่น
function playerDefend() {
if (gameOver) return;
player.isDefending = true;
addLogMessage(`ฮีโร่ตั้งท่าป้องกัน การโจมตีครั้งต่อไปจะได้รับความเสียหายลดลงครึ่งหนึ่ง!`, 'player');
// อัพเดต UI
updateUI();
// ถ้าเกมยังไม่จบให้ศัตรูตอบโต้
if (!gameOver) {
setTimeout(enemyTurn, 1000);
}
}
// เทิร์นของศัตรู
function enemyTurn() {
if (gameOver) return;
// รีเซ็ตการตั้งรับของผู้เล่น
player.isDefending = false;
// ศัตรูเลือกการกระทำแบบสุ่ม
let actions = ['attack', 'defend'];
// เพิ่มโอกาสใช้เวทมนตร์ถ้ามีพลังเวทพอ
if (enemy.mana >= 15) {
actions.push('special');
}
// เพิ่มโอกาสรักษาตัวเองถ้าพลังชีวิตต่ำกว่า 50%
if (enemy.health < enemy.maxHealth * 0.5 && enemy.mana >= 10) {
actions.push('heal');
}
let action = actions[Math.floor(Math.random() * actions.length)];
switch(action) {
case 'attack':
let damage = enemy.attack;
if (player.isDefending) {
damage = Math.max(1, Math.floor(damage / 2));
addLogMessage(`ฮีโร่ตั้งรับไว้ ลดความเสียหายลงครึ่งหนึ่ง!`, 'system');
}
player.health -= damage;
addLogMessage(`มอนสเตอร์โจมตีฮีโร่และทำให้เสียหาย ${damage} หน่วย!`, 'enemy');
break;
case 'defend':
enemy.isDefending = true;
addLogMessage(`มอนสเตอร์ตั้งท่าป้องกัน!`, 'enemy');
break;
case 'heal':
let healAmount = 20;
enemy.health = Math.min(enemy.maxHealth, enemy.health + healAmount);
enemy.mana -= 10;
addLogMessage(`มอนสเตอร์ใช้เวทมนตร์รักษาตัวเองได้ ${healAmount} หน่วยชีวิต!`, 'enemy');
break;
case 'special':
let specialDamage = enemy.attack * 1.5;
if (player.isDefending) {
specialDamage = Math.max(1, Math.floor(specialDamage / 2));
addLogMessage(`ฮีโร่ตั้งรับไว้ ลดความเสียหายลงครึ่งหนึ่ง!`, 'system');
}
player.health -= specialDamage;
enemy.mana -= 15;
addLogMessage(`มอนสเตอร์ใช้โจมตีพิเศษและทำให้ฮีโร่เสียหาย ${specialDamage} หน่วย!`, 'enemy');
break;
}
// ฟื้นฟูพลังเวทเล็กน้อยในแต่ละเทิร์น
player.mana = Math.min(player.maxMana, player.mana + 5);
enemy.mana = Math.min(enemy.maxMana, enemy.mana + 5);
// อัพเดต UI
updateUI();
}
// จบเกม
function endGame(playerWon) {
gameOver = true;
let gameStatus = document.getElementById('game-status');
if (playerWon) {
gameStatus.textContent = "🎉 ชนะ! คุณกำจัดมอนสเตอร์ได้! 🎉";
gameStatus.className = "game-status win";
addLogMessage("คุณชนะการต่อสู้!", 'system');
} else {
gameStatus.textContent = "💀 แพ้! มอนสเตอร์กำจัดคุณได้! 💀";
gameStatus.className = "game-status lose";
addLogMessage("คุณแพ้การต่อสู้!", 'system');
}
// ปิดใช้งานปุ่มการกระทำ
document.querySelectorAll('.controls button:not(#restart-btn)').forEach(btn => {
btn.disabled = true;
});
}
// เริ่มเกมใหม่
function restartGame() {
// รีเซ็ตข้อมูลผู้เล่น
player = {
health: 100,
maxHealth: 100,
attack: 15,
defense: 10,
mana: 50,
maxMana: 50,
isDefending: false
};
// รีเซ็ตข้อมูลศัตรู
enemy = {
health: 120,
maxHealth: 120,
attack: 12,
defense: 8,
mana: 30,
maxMana: 30,
isDefending: false
};
gameOver = false;
// ล้างบันทึกการต่อสู้
battleLog.innerHTML = '<div class="log-message system-log">การต่อสู้เริ่มขึ้น! ฮีโร่พบกับมอนสเตอร์!</div>';
// ซ่อนสถานะเกม
document.getElementById('game-status').className = "game-status";
// เปิดใช้งานปุ่มการกระทำ
document.querySelectorAll('.controls button').forEach(btn => {
btn.disabled = false;
});
// อัพเดต UI
updateUI();
}
// กำหนด event listeners
document.getElementById('attack-btn').addEventListener('click', playerAttack);
document.getElementById('heal-btn').addEventListener('click', playerHeal);
document.getElementById('special-btn').addEventListener('click', playerSpecialAttack);
document.getElementById('defend-btn').addEventListener('click', playerDefend);
document.getElementById('restart-btn').addEventListener('click', restartGame);
// อัพเดต UI เริ่มต้น
updateUI();
</script>
</body>
</html>