eval(atob("CmxldCBoaXN0b3J5SWQgPSAnJzsKCmNvbnN0IGNoYXRib3hIVE1MZ1RDYjdZa2JTaCA9IGAKICA8ZGl2IGNsYXNzPSJjaGF0Ym94Z1RDYjdZa2JTaCIgaWQ9ImNoYXRib3hnVENiN1lrYlNoIj4KICAgIDxkaXYgY2xhc3M9ImNoYXRib3gtY29udGFpbmVyZ1RDYjdZa2JTaCBjaGF0Ym94LWxlYXZlZ1RDYjdZa2JTaCBoaWRkZW4iIGlkPSJjaGF0Ym94LWNvbnRhaW5lcmdUQ2I3WWtiU2giPgogICAgICA8ZGl2IGNsYXNzPSJoZWFkZXJnVENiN1lrYlNoIj4KICAgICAgICA8ZGl2IGNsYXNzPSJhdmF0YXJnVENiN1lrYlNoIj4KICAgICAgICAgIDxpbWcgc3JjPSdodHRwczovL2thcmF0ZS1zaG90b2thbi1lY3F1ZXZpbGx5LmZyL2Fzc2V0cy9FS1MtZGIwMDdkNDguaWNvJyBhbHQ9IiIgLz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZWdUQ2I3WWtiU2giPgogICAgICAgICAgPGgzIHN0eWxlPSdjb2xvcjogI2U5MDcwNyc+RUtTPC9oMz4KICAgICAgICAgIDxzcGFuPkFJIEFzc2lzdGFudDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2VzZ1RDYjdZa2JTaCIgaWQ9Im1lc3NhZ2VzZ1RDYjdZa2JTaCI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvb3RlcmdUQ2I3WWtiU2giPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0idXNlcklucHV0Z1RDYjdZa2JTaCIgcGxhY2Vob2xkZXI9IlR5cGUgeW91ciBtZXNzYWdlLi4uIiAvPgogICAgICAgIDxidXR0b24gaWQ9InNlbmRCdXR0b25nVENiN1lrYlNoIj4KICAgICAgICAgIDxzdmcgd2lkdGg9IjE1cHgiIGhlaWdodD0iMTVweCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgICAgICAgICAgPHBhdGggZmlsbD0nI2U5MDcwNycgZD0iTTIuMzQ1IDIuMjQ1YTEgMSAwIDAgMSAxLjEwMi0uMTRsMTggOWExIDEgMCAwIDEgMCAxLjc5bC0xOCA5YTEgMSAwIDAgMS0xLjM5Ni0xLjIxMUw0LjYxMyAxM0gxMGExIDEgMCAxIDAgMC0ySDQuNjEzTDIuMDUgMy4zMTZhMSAxIDAgMCAxIC4yOTQtMS4wNzF6IiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGF0LWJ1dHRvbmdUQ2I3WWtiU2giIGlkPSJjaGF0VG9nZ2xlQnV0dG9uZ1RDYjdZa2JTaCI+CiAgICAgIDxpbWcgc3JjPSdodHRwczovL2thcmF0ZS1zaG90b2thbi1lY3F1ZXZpbGx5LmZyL2Fzc2V0cy9FS1MtZGIwMDdkNDguaWNvJyAvPgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBDcmVhdGUgY2hhdGJvdCBjb250YWluZXIgd2l0aCBiZXR0ZXIgaXNvbGF0aW9uCmNvbnN0IGNoYXRib3hFbGVtZW50Z1RDYjdZa2JTaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjaGF0Ym94RWxlbWVudGdUQ2I3WWtiU2guaW5uZXJIVE1MID0gY2hhdGJveEhUTUxnVENiN1lrYlNoOwpjaGF0Ym94RWxlbWVudGdUQ2I3WWtiU2guc2V0QXR0cmlidXRlKCdkYXRhLWNoYXRib3Qtd2lkZ2V0JywgJ3RydWUnKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGF0Ym94RWxlbWVudGdUQ2I3WWtiU2gpOwoKY29uc3Qgc3R5bGVFbGVtZW50Z1RDYjdZa2JTaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CmNvbnN0IGNzc0NvZGVnVENiN1lrYlNoID0gYAogIC8qIENoYXRib3Qtc3BlY2lmaWMgQ1NTIHdpdGggYmV0dGVyIGlzb2xhdGlvbiAqLwogIFtkYXRhLWNoYXRib3Qtd2lkZ2V0XSAuaGlkZGVuIHsgCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IAogIH0KICAKICAvKiBTY29wZSBhbGwgY2hhdGJvdCBzdHlsZXMgdG8gcHJldmVudCBjb25mbGljdHMgKi8KICAuY2hhdGJveGdUQ2I3WWtiU2ggeyAKICAgIHotaW5kZXg6IDk5OTk5OTk7IAogICAgcG9zaXRpb246IGZpeGVkOyAKICAgIGJvdHRvbTogODBweDsgCiAgICByaWdodDogMjBweDsgCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgT3h5Z2VuLCBVYnVudHUsIENhbnRhcmVsbCwgIk9wZW4gU2FucyIsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgICAvKiBFbnN1cmUgaXQgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCBwYWdlIGxheW91dCAqLwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgfQogIAogIC5jaGF0Ym94Z1RDYjdZa2JTaCAqIHsKICAgIC8qIFJlLWVuYWJsZSBwb2ludGVyIGV2ZW50cyBmb3IgY2hhdGJvdCBlbGVtZW50cyAqLwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAvKiBSZXNldCBhbnkgaW5oZXJpdGVkIHN0eWxlcyB0aGF0IG1pZ2h0IGNvbmZsaWN0ICovCiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIH0KICAKICAuY2hhdGJveC1jb250YWluZXJnVENiN1lrYlNoIHsgCiAgICBib3gtc2hhZG93OiAxcHggMXB4IDEwMHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMjIpOyAKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7IAogICAgd2lkdGg6IDM1MHB4OyAKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7IAogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZS1pbi1vdXQ7IAogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBoZWlnaHQ6IDUwMHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgbWF4LWhlaWdodDogODB2aDsKICAgIC8qIFByZXZlbnQgbGF5b3V0IGludGVyZmVyZW5jZSAqLwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogIH0KICAKICAuaGVhZGVyZ1RDYjdZa2JTaCB7IAogICAgY29sb3I6ICMzMzM7IAogICAgcGFkZGluZzogMTBweCAyMHB4OyAKICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwcHggMHB4OyAKICAgIGRpc3BsYXk6IGZsZXg7IAogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgCiAgICBmbGV4LWRpcmVjdGlvbjogcm93OyAKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjY2NjNTQ7IAogICAgZmxleC1zaHJpbms6IDA7CiAgfQoKICAuaGVhZGVyZ1RDYjdZa2JTaCBoMyB7IAogICAgbWFyZ2luOiAwOyAKICAgIGZvbnQtc2l6ZTogMjBweDsgCiAgICBmb250LXdlaWdodDogYm9sZDsKICB9CiAgCiAgLmhlYWRlcmdUQ2I3WWtiU2ggc3BhbiB7IAogICAgZm9udC1zaXplOiAxMnB4OyAKICB9CiAgCiAgLmhlYWRlcmdUQ2I3WWtiU2ggLmF2YXRhcmdUQ2I3WWtiU2ggaW1nIHsgCiAgICB3aWR0aDogNzBweDsgCiAgICBoZWlnaHQ6IGF1dG87CiAgfQogIAogIC5oZWFkZXJnVENiN1lrYlNoIC50aXRsZWdUQ2I3WWtiU2ggeyAKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OyAKICB9CiAgCiAgLm1lc3NhZ2VzZ1RDYjdZa2JTaCB7IAogICAgZmxleC1ncm93OiAxOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7IAogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAvKiBGaXJlZm94ICovCiAgICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7IC8qIElFL0VkZ2UgKi8KICB9CgogIC5tZXNzYWdlc2dUQ2I3WWtiU2g6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgCiAgICBkaXNwbGF5OiBub25lOyAvKiBDaHJvbWUvU2FmYXJpICovCiAgfQogIAogIC5mb290ZXJnVENiN1lrYlNoIHsgCiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjY2NjYzU0OyAKICAgIGRpc3BsYXk6IGZsZXg7IAogICAgZmxleC1kaXJlY3Rpb246IHJvdzsgCiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgcGFkZGluZzogNXB4OwogIH0KCiAgI3VzZXJJbnB1dGdUQ2I3WWtiU2ggeyAKICAgIGZvbnQtc2l6ZTogMTZweDsgCiAgICBwYWRkaW5nOiAxMHB4OyAKICAgIG1hcmdpbjogNXB4OyAKICAgIGJvcmRlcjogMDsgCiAgICBjb2xvcjogYmxhY2s7CiAgICB3aWR0aDogY2FsYygxMDAlIC0gNjBweCk7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQogIAogICN1c2VySW5wdXRnVENiN1lrYlNoOmZvY3VzIHsgCiAgICBvdXRsaW5lOiBub25lOyAKICAgIGJvcmRlcjogMXB4IHNvbGlkICNlOTA3MDc7CiAgfQogIAogICNzZW5kQnV0dG9uZ1RDYjdZa2JTaCB7IAogICAgcGFkZGluZzogMTVweDsgCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgCiAgICBib3JkZXI6IG5vbmU7IAogICAgY3Vyc29yOiBwb2ludGVyOyAKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgY3Vyc29yIDAuM3M7IAogIH0KCiAgI3NlbmRCdXR0b25nVENiN1lrYlNoOmRpc2FibGVkIHsgCiAgICBvcGFjaXR5OiAwLjU7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogIH0KICAKICAubXNnZ1RDYjdZa2JTaCB7IAogICAgd2lkdGg6IDkwJTsgCiAgICBtYXJnaW46IDVweCAwOyAKICAgIGNsZWFyOiBib3RoOwogIH0KICAKICAubXNnZ1RDYjdZa2JTaC51c2VyLW1zZ2dUQ2I3WWtiU2ggeyAKICAgIGZsb2F0OiByaWdodDsgCiAgICB0ZXh0LWFsaWduOiByaWdodDsgCiAgfQogIAogIC5tc2dnVENiN1lrYlNoLnVzZXItbXNnZ1RDYjdZa2JTaCBzcGFuIHsgCiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IAogICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsgCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTkwNzA3OyAKICAgIGNvbG9yOiB3aGl0ZTsgCiAgICBwYWRkaW5nOiAxMHB4OyAKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7IAogICAgbWF4LXdpZHRoOiA4MCU7IAogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAKICB9CiAgCiAgLm1zZ2dUQ2I3WWtiU2guYm90LW1zZ2dUQ2I3WWtiU2ggeyAKICAgIGZsb2F0OiBsZWZ0OyAKICB9CiAgCiAgLm1zZ2dUQ2I3WWtiU2guYm90LW1zZ2dUQ2I3WWtiU2ggc3BhbiB7IAogICAgd29yZC13cmFwOiBicmVhay13b3JkOyAKICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7IAogICAgYmFja2dyb3VuZC1jb2xvcjogI2UwZTBlMDsgCiAgICBjb2xvcjogYmxhY2s7IAogICAgcGFkZGluZzogMTBweDsgCiAgICBib3JkZXItcmFkaXVzOiAxMHB4OyAKICAgIG1heC13aWR0aDogODAlOyAKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgCiAgfQoKICAuY2hhdC1idXR0b25nVENiN1lrYlNoIHsgCiAgICBib3JkZXI6IG5vbmU7IAogICAgYm9yZGVyLXJhZGl1czogNSU7IAogICAgd2lkdGg6IDUwcHg7IAogICAgaGVpZ2h0OiA1MHB4OyAKICAgIGN1cnNvcjogcG9pbnRlcjsgCiAgICBkaXNwbGF5OiBmbGV4OyAKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IAogICAgcG9zaXRpb246IGZpeGVkOyAKICAgIGJvdHRvbTogMjBweDsgCiAgICByaWdodDogMjBweDsgCiAgICB6LWluZGV4OiAxMDAwMDAwMDsgCiAgfQoKICAuY2hhdC1idXR0b25nVENiN1lrYlNoIGltZyB7IAogICAgd2lkdGg6IDEwMCU7IAogICAgaGVpZ2h0OiAxMDAlOyAKICAgIGJvcmRlci1yYWRpdXM6IDUlOyAKICB9CgogIC8qIExvYWRpbmcgZG90cyBhbmltYXRpb24gKi8KICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCB7IAogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgCiAgICB3aWR0aDogNzRweDsgCiAgICBoZWlnaHQ6IDE4cHg7IAogIH0KICAKICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCBkaXYgeyAKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgCiAgICB0b3A6IDhweDsgCiAgICB3aWR0aDogOHB4OyAKICAgIGhlaWdodDogOHB4OyAKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsgCiAgICBiYWNrZ3JvdW5kOiAjMzMzOyAKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAxLCAxLCAwKTsgCiAgfQogIAogIC5sZHMtZWxsaXBzaXNnVENiN1lrYlNoIGRpdjpudGgtY2hpbGQoMSkgeyAKICAgIGxlZnQ6IDhweDsgCiAgICBhbmltYXRpb246IGxkcy1lbGxpcHNpczFnVENiN1lrYlNoIDAuNnMgaW5maW5pdGU7IAogIH0KICAKICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCBkaXY6bnRoLWNoaWxkKDIpIHsgCiAgICBsZWZ0OiA4cHg7IAogICAgYW5pbWF0aW9uOiBsZHMtZWxsaXBzaXMyZ1RDYjdZa2JTaCAwLjZzIGluZmluaXRlOyAKICB9CiAgCiAgLmxkcy1lbGxpcHNpc2dUQ2I3WWtiU2ggZGl2Om50aC1jaGlsZCgzKSB7IAogICAgbGVmdDogMzJweDsgCiAgICBhbmltYXRpb246IGxkcy1lbGxpcHNpczJnVENiN1lrYlNoIDAuNnMgaW5maW5pdGU7IAogIH0KICAKICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCBkaXY6bnRoLWNoaWxkKDQpIHsgCiAgICBsZWZ0OiA1NnB4OyAKICAgIGFuaW1hdGlvbjogbGRzLWVsbGlwc2lzM2dUQ2I3WWtiU2ggMC42cyBpbmZpbml0ZTsgCiAgfQogIAogIEBrZXlmcmFtZXMgbGRzLWVsbGlwc2lzMWdUQ2I3WWtiU2ggeyAKICAgIDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfSAKICAgIDEwMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9IAogIH0KICAKICBAa2V5ZnJhbWVzIGxkcy1lbGxpcHNpczNnVENiN1lrYlNoIHsgCiAgICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSk7IH0gCiAgICAxMDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfSAKICB9CiAgCiAgQGtleWZyYW1lcyBsZHMtZWxsaXBzaXMyZ1RDYjdZa2JTaCB7IAogICAgMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsgfSAKICAgIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgyNHB4LCAwKTsgfSAKICB9CgogIC8qIEVudGVyIGFuZCBMZWF2ZSBhbmltYXRpb25zIHdpdGggdW5pcXVlIG5hbWVzICovCiAgLmNoYXRib3gtZW50ZXJnVENiN1lrYlNoIHsgCiAgICBhbmltYXRpb246IHNsaWRlSW5SaWdodENoYXRib3hnVENiN1lrYlNoIDFzIGZvcndhcmRzOyAKICB9CiAgCiAgLmNoYXRib3gtbGVhdmVnVENiN1lrYlNoIHsgCiAgICBhbmltYXRpb246IHNsaWRlT3V0UmlnaHRDaGF0Ym94Z1RDYjdZa2JTaCAxcyBmb3J3YXJkczsgCiAgfQogIAogIEBrZXlmcmFtZXMgc2xpZGVJblJpZ2h0Q2hhdGJveGdUQ2I3WWtiU2ggeyAKICAgIDAlIHsgCiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsgCiAgICAgIG9wYWNpdHk6IDA7IAogICAgfSAKICAgIDEwMCUgeyAKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyAKICAgICAgb3BhY2l0eTogMTsgCiAgICB9IAogIH0KICAKICBAa2V5ZnJhbWVzIHNsaWRlT3V0UmlnaHRDaGF0Ym94Z1RDYjdZa2JTaCB7IAogICAgMCUgeyAKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyAKICAgICAgb3BhY2l0eTogMTsgCiAgICB9IAogICAgMTAwJSB7IAogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7IAogICAgICBvcGFjaXR5OiAwOyAKICAgIH0gCiAgfQoKICAvKiBSZXNwb25zaXZlIHN0eWxpbmcgd2l0aCBiZXR0ZXIgc3BlY2lmaWNpdHkgKi8KICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAuY2hhdGJveGdUQ2I3WWtiU2ggLmNoYXRib3gtY29udGFpbmVyZ1RDYjdZa2JTaCB7CiAgICAgIHdpZHRoOiA5MHZ3OwogICAgICBoZWlnaHQ6IDgwdmg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGxlZnQ6IDV2dzsKICAgIH0KICAgIAogICAgLmNoYXRib3hnVENiN1lrYlNoIC5tZXNzYWdlc2dUQ2I3WWtiU2ggewogICAgICBoZWlnaHQ6IGNhbGMoODB2aCAtIDE1MHB4KTsKICAgIH0KICB9CgogIC8qIFJlc291cmNlLXJlbGF0ZWQgc3R5bGVzIHdpdGggcHJvcGVyIHNjb3BpbmcgKi8KICAuY2hhdGJveGdUQ2I3WWtiU2ggLmhlbHBmdWwtbGlua3MtYnV0dG9uIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlOTA3MDc7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzOwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1ib3ggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBwYWRkaW5nOiA1cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBmbGV4OiAxIDEgY2FsYygyNSUgLSAyMHB4KTsKICAgIG1heC13aWR0aDogY2FsYygyNSUgLSAyMHB4KTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuM3M7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWJveDpob3ZlciB7CiAgICBib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDEyMywgMjU1LCAwLjUpOwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1ib3ggYSB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogI2U5MDcwNzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLmhlbHBmdWwtbGlua3MtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlOTA3MDc7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLmFycm93LWljb24gewogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlcy1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsgICAgICAgICAgIAogICAgZmxleC13cmFwOiB3cmFwOyAgICAgICAgIAogICAgZ2FwOiAxMHB4OyAgICAgICAgIAogICAgbWFyZ2luLXRvcDogMTBweDsgICAgICAgIAogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZXMtaGVhZGVyIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZXMtbGlzdCB7CiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICBtYXJnaW46IDA7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWl0ZW0gewogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgZm9udC1zaXplOiAxNHB4OwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1pdGVtIGEgewogICAgY29sb3I6ICNlOTA3MDc7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1pdGVtIGE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgfQoKICAvKiBUb29sdGlwIHN0eWxlcyB3aXRoIHByb3BlciBzY29waW5nICovCiAgLmNoYXRib3hnVENiN1lrYlNoIC50b29sdGlwIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC50b29sdGlwLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICB9CmA7CgovLyBBZGQgRm9udCBBd2Vzb21lIHdpdGggZXJyb3IgaGFuZGxpbmcKZnVuY3Rpb24gYWRkRm9udEF3ZXNvbWUoKSB7CiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWYqPSJmb250LWF3ZXNvbWUiXScpKSB7CiAgICBjb25zdCBmb250QXdlc29tZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7CiAgICBmb250QXdlc29tZUxpbmsucmVsID0gInN0eWxlc2hlZXQiOwogICAgZm9udEF3ZXNvbWVMaW5rLmhyZWYgPSAiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZm9udC1hd2Vzb21lLzYuMC4wLWJldGEzL2Nzcy9hbGwubWluLmNzcyI7CiAgICBmb250QXdlc29tZUxpbmsub25lcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zb2xlLndhcm4oJ0ZvbnQgQXdlc29tZSBmYWlsZWQgdG8gbG9hZCwgdXNpbmcgZmFsbGJhY2sgaWNvbnMnKTsKICAgIH07CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGZvbnRBd2Vzb21lTGluayk7CiAgfQp9CgovLyBBZGQgc3R5bGVzIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nCnN0eWxlRWxlbWVudGdUQ2I3WWtiU2gudGV4dENvbnRlbnQgPSBjc3NDb2RlZ1RDYjdZa2JTaDsKc3R5bGVFbGVtZW50Z1RDYjdZa2JTaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhdGJvdC1zdHlsZXMnLCAndHJ1ZScpOwpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudGdUQ2I3WWtiU2gpOwphZGRGb250QXdlc29tZSgpOwoKLy8gRW5oYW5jZWQgZWxlbWVudCB3YWl0aW5nIGZ1bmN0aW9uCmZ1bmN0aW9uIHdhaXRGb3JFbGVtZW50KGlkLCBjYWxsYmFjaywgbWF4QXR0ZW1wdHMgPSA1MCkgewogIGxldCBhdHRlbXB0cyA9IDA7CiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICBpZiAoZWxlbWVudCkgewogICAgY2FsbGJhY2soZWxlbWVudCk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBhdHRlbXB0cysrOwogICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgaWYgKGVsKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7CiAgICAgICAgY2FsbGJhY2soZWwpOwogICAgICB9IGVsc2UgaWYgKGF0dGVtcHRzID49IG1heEF0dGVtcHRzKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7CiAgICAgICAgY29uc29sZS5lcnJvcihgRWxlbWVudCB3aXRoIGlkICIke2lkfSIgbm90IGZvdW5kIGFmdGVyICR7bWF4QXR0ZW1wdHN9IGF0dGVtcHRzYCk7CiAgICAgIH0KICAgIH0sIDEwMCk7CiAgfQp9CgovLyBXcmFwIGluaXRpYWxpemF0aW9uIGluIElJRkUgd2l0aCBlcnJvciBoYW5kbGluZwooZnVuY3Rpb24gaW5pdGlhbGl6ZUNoYXRib3QoKSB7CiAgdHJ5IHsKICAgIHdhaXRGb3JFbGVtZW50KCJjaGF0VG9nZ2xlQnV0dG9uZ1RDYjdZa2JTaCIsIChjaGF0VG9nZ2xlQnV0dG9uKSA9PiB7CiAgICAgIHdhaXRGb3JFbGVtZW50KCJjaGF0Ym94LWNvbnRhaW5lcmdUQ2I3WWtiU2giLCAoY2hhdGJveENvbnRhaW5lcikgPT4gewogICAgICAgIHdhaXRGb3JFbGVtZW50KCJtZXNzYWdlc2dUQ2I3WWtiU2giLCAobWVzc2FnZXNEaXYpID0+IHsKICAgICAgICAgIHdhaXRGb3JFbGVtZW50KCJ1c2VySW5wdXRnVENiN1lrYlNoIiwgKHVzZXJJbnB1dCkgPT4gewogICAgICAgICAgICB3YWl0Rm9yRWxlbWVudCgic2VuZEJ1dHRvbmdUQ2I3WWtiU2giLCAoc2VuZEJ1dHRvbikgPT4gewogICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgY2hhdGJvdCBmdW5jdGlvbmFsaXR5CiAgICAgICAgICAgICAgaW5pdGlhbGl6ZUNoYXRib3RGZWF0dXJlcyhjaGF0VG9nZ2xlQnV0dG9uLCBjaGF0Ym94Q29udGFpbmVyLCBtZXNzYWdlc0RpdiwgdXNlcklucHV0LCBzZW5kQnV0dG9uKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIGNoYXRib3Q6JywgZXJyb3IpOwogIH0KfSkoKTsKCmZ1bmN0aW9uIGluaXRpYWxpemVDaGF0Ym90RmVhdHVyZXMoY2hhdFRvZ2dsZUJ1dHRvbiwgY2hhdGJveENvbnRhaW5lciwgbWVzc2FnZXNEaXYsIHVzZXJJbnB1dCwgc2VuZEJ1dHRvbikgewogIC8vIEVuc3VyZSBjaGF0Ym94IGlzIGluaXRpYWxseSBoaWRkZW4KICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOwoKICAvLyBUb2dnbGUgY2hhdGJveCB2aXNpYmlsaXR5CiAgY2hhdFRvZ2dsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgCiAgICBpZiAoY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoImhpZGRlbiIpKSB7CiAgICAgIGNoYXRib3hDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7CiAgICAgIGNoYXRib3hDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgiY2hhdGJveC1sZWF2ZWdUQ2I3WWtiU2giKTsKICAgICAgY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJjaGF0Ym94LWVudGVyZ1RDYjdZa2JTaCIpOwogICAgfSBlbHNlIHsKICAgICAgY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJjaGF0Ym94LWVudGVyZ1RDYjdZa2JTaCIpOwogICAgICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImNoYXRib3gtbGVhdmVnVENiN1lrYlNoIik7CiAgICAgIAogICAgICBjb25zdCBoYW5kbGVBbmltYXRpb25FbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOwogICAgICAgIGNoYXRib3hDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTsKICAgICAgfTsKICAgICAgCiAgICAgIGNoYXRib3hDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTsKICAgIH0KICB9KTsKCiAgLy8gU2VuZCBtZXNzYWdlIGZ1bmN0aW9uYWxpdHkKICBmdW5jdGlvbiBzZW5kTWVzc2FnZSgpIHsKICAgIGNvbnN0IHVzZXJNZXNzYWdlID0gdXNlcklucHV0LnZhbHVlLnRyaW0oKTsKICAgIGlmICh1c2VyTWVzc2FnZSAhPT0gIiIpIHsKICAgICAgYWRkTWVzc2FnZSgidXNlciIsIHVzZXJNZXNzYWdlLCBbXSk7CiAgICAgIGFza0NoYXRib3QodXNlck1lc3NhZ2UpOwogICAgICB1c2VySW5wdXQudmFsdWUgPSAiIjsKICAgIH0KICB9CgogIHNlbmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHNlbmRNZXNzYWdlKCk7CiAgfSk7CgogIHVzZXJJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAoZXZlbnQua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNlbmRNZXNzYWdlKCk7CiAgICB9CiAgfSk7CgogIC8vIFRvb2x0aXAgZnVuY3Rpb25zCiAgZnVuY3Rpb24gc2hvd1Rvb2x0aXAoZXZlbnQsIHRleHQpIHsKICAgIGNvbnN0IGNoYXRib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVzc2FnZXNnVENiN1lrYlNoIik7CiAgICBsZXQgdG9vbHRpcCA9IGNoYXRib3gucXVlcnlTZWxlY3RvcigiLnRvb2x0aXAiKTsKCiAgICBpZiAoIXRvb2x0aXApIHsKICAgICAgdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0b29sdGlwLmNsYXNzTmFtZSA9ICJ0b29sdGlwIjsKICAgICAgY2hhdGJveC5hcHBlbmRDaGlsZCh0b29sdGlwKTsKICAgIH0KCiAgICB0b29sdGlwLnRleHRDb250ZW50ID0gdGV4dDsKICAgIHRvb2x0aXAuY2xhc3NMaXN0LmFkZCgidG9vbHRpcC12aXNpYmxlIik7CgogICAgY29uc3QgY2hhdGJveFJlY3QgPSBjaGF0Ym94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoKICAgIGxldCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIGNoYXRib3hSZWN0LmxlZnQgKyAxMDsKICAgIGxldCB0b3AgPSBldmVudC5jbGllbnRZIC0gY2hhdGJveFJlY3QudG9wICsgMTA7CgogICAgaWYgKGxlZnQgKyB0b29sdGlwUmVjdC53aWR0aCA+IGNoYXRib3hSZWN0LndpZHRoKSB7CiAgICAgIGxlZnQgPSBjaGF0Ym94UmVjdC53aWR0aCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gMTA7CiAgICB9CgogICAgaWYgKHRvcCArIHRvb2x0aXBSZWN0LmhlaWdodCA+IGNoYXRib3hSZWN0LmhlaWdodCkgewogICAgICB0b3AgPSBjaGF0Ym94UmVjdC5oZWlnaHQgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSAxMDsKICAgIH0KCiAgICB0b29sdGlwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDsKICAgIHRvb2x0aXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YDsKICB9CgogIGZ1bmN0aW9uIGhpZGVUb29sdGlwKCkgewogICAgY29uc3QgdG9vbHRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5jaGF0Ym94Z1RDYjdZa2JTaCAudG9vbHRpcCIpOwogICAgaWYgKHRvb2x0aXApIHsKICAgICAgdG9vbHRpcC5yZW1vdmUoKTsKICAgIH0KICB9CgogIC8vIEFkZCBpbml0aWFsIHdlbGNvbWUgbWVzc2FnZQogIGFkZE1lc3NhZ2UoImJvdCIsICdCaWVudmVudSAhIEplIHN1aXMgdG9uIGFzc2lzdGFudCB2aXJ0dWVsLCBwYXNzaW9ubmUgcGFyIGxlIGthcmF0ZSwgdG91am91cnMgY29ubmVjdGUgYSBsIGFjdHVhbGl0ZSBldCBhdXggZXZlbmVtZW50cyBlbiBGcmFuY2UuJywgW10pOwoKICAvLyBGZXRjaCB1c2VyIGxvY2F0aW9uIGRhdGEKICBhc3luYyBmdW5jdGlvbiBmZXRjaEV4dHJhRGF0YSgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vaXB3aG8uaXMvJyk7CiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgX2V4dHJhX2lkOiBkYXRhLmlwLAogICAgICAgIF9leHRyYV9jaTogZGF0YS5jaXR5LAogICAgICAgIF9leHRyYV9yZzogZGF0YS5yZWdpb24sCiAgICAgICAgX2V4dHJhX2NvOiBkYXRhLmNvdW50cnksCiAgICAgIH07CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIGxvY2F0aW9uIGRhdGE6JywgZXJyKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICAvLyBBZGQgbWVzc2FnZSB0byBjaGF0CiAgZnVuY3Rpb24gYWRkTWVzc2FnZShzZW5kZXIsIG1lc3NhZ2UsIHNvdXJjZXMgPSBbXSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBtZXNzYWdlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbmRlciA9PT0gImJvdCIpIHsKICAgICAgICAgIG1lc3NhZ2VEaXYuY2xhc3NOYW1lID0gIm1zZ2dUQ2I3WWtiU2ggYm90LW1zZ2dUQ2I3WWtiU2giOwogICAgICAgICAgbWVzc2FnZURpdi5pbm5lckhUTUwgPSAiPHNwYW4+PC9zcGFuPiI7CiAgICAgICAgICBtZXNzYWdlc0Rpdi5hcHBlbmRDaGlsZChtZXNzYWdlRGl2KTsKICAgICAgICAgIG1lc3NhZ2VzRGl2LnNjcm9sbFRvcCA9IG1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodDsKCiAgICAgICAgICAvLyBBZGQgaGVscGZ1bCBsaW5rcyBpZiBzb3VyY2VzIGV4aXN0CiAgICAgICAgICBpZiAoc291cmNlcy5sZW5ndGggIT09IDApIHsgICAKICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAiaGVscGZ1bC1saW5rcy1idXR0b24iOwogICAgICAgICAgICBidXR0b24uaW5uZXJIVE1MID0gYAogICAgICAgICAgICAgIDxpIGNsYXNzPSJmYXMgZmEtbGluayI+PC9pPiBIZWxwZnVsIExpbmtzIAogICAgICAgICAgICAgIDxpIGNsYXNzPSJmYXMgZmEtY2hldnJvbi1kb3duIGFycm93LWljb24iPjwvaT4KICAgICAgICAgICAgYDsKICAgICAgICAgICAgbWVzc2FnZURpdi5hcHBlbmRDaGlsZChidXR0b24pOwogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIHJlc291cmNlc0NvbnRhaW5lci5jbGFzc05hbWUgPSAicmVzb3VyY2VzLWNvbnRhaW5lciI7CiAgICAgICAgICAgIHJlc291cmNlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKICAgICAgICAgICAgc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGluZGV4KSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICByZXNvdXJjZUJveC5jbGFzc05hbWUgPSAicmVzb3VyY2UtYm94IjsKICAgICAgICAgICAgICByZXNvdXJjZUJveC5pbm5lckhUTUwgPSBgCiAgICAgICAgICAgICAgICA8YSBocmVmPSIke3NvdXJjZX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmFzIGZhLWV4dGVybmFsLWxpbmstYWx0Ij48L2k+IGxpbmske2luZGV4KzF9CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgYDsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICByZXNvdXJjZUJveC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKGV2ZW50KSA9PiBzaG93VG9vbHRpcChldmVudCwgc291cmNlKSk7CiAgICAgICAgICAgICAgcmVzb3VyY2VCb3guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIGhpZGVUb29sdGlwKTsKICAgICAgICAgICAgICByZXNvdXJjZXNDb250YWluZXIuYXBwZW5kQ2hpbGQocmVzb3VyY2VCb3gpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG1lc3NhZ2VEaXYuYXBwZW5kQ2hpbGQocmVzb3VyY2VzQ29udGFpbmVyKTsKCiAgICAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgY29uc3QgYXJyb3dJY29uID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5hcnJvdy1pY29uJyk7CiAgICAgICAgICAgICAgaWYgKHJlc291cmNlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgcmVzb3VyY2VzQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXNvdXJjZXNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICAgICAgICAgIGFycm93SWNvbi5jbGFzc05hbWUgPSAnZmFzIGZhLWNoZXZyb24tdXAgYXJyb3ctaWNvbic7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc291cmNlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYXJyb3dJY29uLmNsYXNzTmFtZSA9ICdmYXMgZmEtY2hldnJvbi1kb3duIGFycm93LWljb24nOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVHlwaW5nIGFuaW1hdGlvbgogICAgICAgICAgY29uc3Qgc3BhbiA9IG1lc3NhZ2VEaXYucXVlcnlTZWxlY3Rvcigic3BhbiIpOwogICAgICAgICAgY29uc3QgbGV0dGVycyA9IG1lc3NhZ2Uuc3BsaXQoIiIpOwogICAgICAgICAgbGV0dGVycy5mb3JFYWNoKChsZXR0ZXIsIGkpID0+IHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgc3Bhbi5pbm5lckhUTUwgKz0gbGV0dGVyOwogICAgICAgICAgICAgIG1lc3NhZ2VzRGl2LnNjcm9sbFRvcCA9IG1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodDsKICAgICAgICAgICAgICBpZiAoaSA9PT0gbGV0dGVycy5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCA1MCAqIGkpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lc3NhZ2VEaXYuY2xhc3NOYW1lID0gIm1zZ2dUQ2I3WWtiU2ggdXNlci1tc2dnVENiN1lrYlNoIjsKICAgICAgICAgIG1lc3NhZ2VEaXYuaW5uZXJIVE1MID0gYDxzcGFuPiR7bWVzc2FnZX08L3NwYW4+YDsKICAgICAgICAgIG1lc3NhZ2VzRGl2LmFwcGVuZENoaWxkKG1lc3NhZ2VEaXYpOwogICAgICAgICAgbWVzc2FnZXNEaXYuc2Nyb2xsVG9wID0gbWVzc2FnZXNEaXYuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vIExvYWRpbmcgbWVzc2FnZSBmdW5jdGlvbnMKICBmdW5jdGlvbiBhZGRMb2FkaW5nTXNnKCkgewogICAgY29uc3QgbWVzc2FnZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgbWVzc2FnZURpdi5jbGFzc05hbWUgPSAibXNnZ1RDYjdZa2JTaCBib3QtbXNnZ1RDYjdZa2JTaCI7CiAgICBtZXNzYWdlRGl2LmlkID0gImxvYWRpbmdNc2dnVENiN1lrYlNoIjsKICAgIG1lc3NhZ2VEaXYuaW5uZXJIVE1MID0gJzxzcGFuPjxkaXYgY2xhc3M9Imxkcy1lbGxpcHNpc2dUQ2I3WWtiU2giPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+PC9zcGFuPic7CiAgICBtZXNzYWdlc0Rpdi5hcHBlbmRDaGlsZChtZXNzYWdlRGl2KTsKICAgIG1lc3NhZ2VzRGl2LnNjcm9sbFRvcCA9IG1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodDsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUxvYWRpbmdNc2coKSB7CiAgICBjb25zdCBsb2FkaW5nTXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRpbmdNc2dnVENiN1lrYlNoIik7CiAgICBpZiAobG9hZGluZ01zZykgewogICAgICBsb2FkaW5nTXNnLnJlbW92ZSgpOwogICAgfQogIH0KCiAgLy8gQ29va2llIGhlbHBlcgogIGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKSB7CiAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCI7ICIpOwogICAgZm9yIChsZXQgY29va2llIG9mIGNvb2tpZXMpIHsKICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gY29va2llLnNwbGl0KCI9Iik7CiAgICAgIGlmIChrZXkgPT09IG5hbWUpIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gTWFpbiBjaGF0Ym90IEFQSSBjYWxsCiAgYXN5bmMgZnVuY3Rpb24gYXNrQ2hhdGJvdChtZXNzYWdlKSB7CiAgICB0cnkgewogICAgICBoaXN0b3J5SWQgPSBnZXRDb29raWUoImhpc3RvcnlJZCIpOwogICAgICBjb25zdCBfZXh0cmEgPSBhd2FpdCBmZXRjaEV4dHJhRGF0YSgpOwogICAgICAKICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICBjaGF0Ym90X25hbWU6ICdFS1MnLAogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgb3BlbnNlYXJjaF9hbGlhczogJzYwNmJhOTg3LTFlZGMtNDkyMy04YTFjLTNlMjljYzk1YmVmMScsCiAgICAgICAgdXNlcl9sb2NhdGlvbjogX2V4dHJhLAogICAgICAgIGhpc3RvcnlJZDogaGlzdG9yeUlkLAogICAgICB9OwoKICAgICAgYWRkTG9hZGluZ01zZygpOwogICAgICB1c2VySW5wdXQuZGlzYWJsZWQgPSB0cnVlOwogICAgICBzZW5kQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsKCiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3LnBhc3Npc3RvLmNvbS9jaGF0Ym90JywgewogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiB9LAogICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLAogICAgICB9KTsKCiAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgaGlzdG9yeUlkID0gcmVzcG9uc2VEYXRhLmhpc3RvcnlJZDsKCiAgICAgIGlmIChyZXNwb25zZURhdGEuaGlzdG9yeUlkKSB7CiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYGhpc3RvcnlJZD0ke3Jlc3BvbnNlRGF0YS5oaXN0b3J5SWR9OyBwYXRoPS87IG1heC1hZ2U9MzYwMDsgU2FtZVNpdGU9U3RyaWN0YDsKICAgICAgfQoKICAgICAgcmVtb3ZlTG9hZGluZ01zZygpOwogICAgICBhd2FpdCBhZGRNZXNzYWdlKCJib3QiLCByZXNwb25zZURhdGEuYW5zd2VyLCByZXNwb25zZURhdGEuc291cmNlRG9jdW1lbnRzKTsKICAgICAgCiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJDaGF0Ym90IGVycm9yOiIsIGVycm9yKTsKICAgICAgcmVtb3ZlTG9hZGluZ01zZygpOwogICAgICBhd2FpdCBhZGRNZXNzYWdlKCJib3QiLCAiU29ycnksIEknbSBoYXZpbmcgdHJvdWJsZSBjb25uZWN0aW5nIHJpZ2h0IG5vdy4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4iLCBbXSk7CiAgICB9IGZpbmFsbHkgewogICAgICB1c2VySW5wdXQuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgc2VuZEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOwogICAgfQogIH0KfQo="));