@sprig-technologies/sprig-browser 2.14.7 → 2.14.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/controller/encodedViewJs.d.ts +1 -1
- package/controller/encodedViewJs.js +1 -1
- package/package.json +1 -1
- package/shared/constants.d.ts +2 -0
- package/shared/constants.d.ts.map +1 -1
- package/shared/constants.js +5 -0
- package/shared/network.js +1 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
declare var _default: "LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgdXNlcmxlYXAtd2ViLXZpZXctc2RrLXYyLjE0LjIuanMuTElDRU5TRS50eHQgKi8KIWZ1bmN0aW9uKCl7dmFyIHQ9ezkzMTMwOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obil7c2V0VGltZW91dChuLmJpbmQobnVsbCxlKSx0KX0pKX1uLnIoZSksbi5kKGUse2RlbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LE5FVFdPUktfQ09ORklHOmZ1bmN0aW9uKCl7cmV0dXJuIG99fSk7dmFyIG89e1JBVEVMSU1JVF9SRVNFVF9ERUZBVUxUOjEwfX0sNzc4ODpmdW5jdGlvbih0LGUsbil7KGU9bigxODk4NikoITEpKS5wdXNoKFt0LmlkLCIudWwtY2FyZCB7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cbi51bC1jYXJkX19jb250YWluZXItLWRlc2t0b3Age1xuICBtYXJnaW46IDE1cHg7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4udWwtY2FyZF9fY29udGFpbmVyLS1tb2JpbGUge1xuICBib3JkZXItd2lkdGg6IDA7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLnVsLWNhcmRfX2NvbnRhaW5lciB7XG4gIHBhZGRpbmc6IDIwcHggMjBweCA1cHggMjBweDtcbiAgZmxleDogMSAxIGF1dG87XG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgbGluZS1oZWlnaHQ6IDIzcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cblxuLnVsLXF1ZXN0aW9uIHtcbiAgZmxleDogMSAwIGF1dG87XG4gIGNvbG9yOiAjMzQzNDQyO1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMTI1JTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4udWwtY2FwdGlvbiB7XG4gIGZsZXg6IDEgMCBhdXRvO1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgbGluZS1oZWlnaHQ6IDEzMC4zNSU7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gIGNvbG9yOiAjNmM2YzZlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4udWwtY2FyZC0tbXVsdGlwbGUge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4udWwtY2FyZF9fY2hvaWNlcyB7XG4gIG1hcmdpbjogNXB4IDAgMCAwO1xuICBmbGV4OiAxIDA7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLmNob2ljZS0tbW9iaWxlIHtcbiAgYm9yZGVyOiAycHggc29saWQgI2U2ZTZlNjtcbn1cblxuLmNob2ljZS0tZGVza3RvcCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7XG59XG5cbi5jaG9pY2Uge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBjb2xvcjogIzI2MjEzNjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG5cbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuXG4gIG1hcmdpbi1ib3R0b206IDdweDtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgcGFkZGluZzogMTBweCAyMHB4IDEwcHggMTVweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjAxKTtcbn1cblxuLmNob2ljZS0tZGVza3RvcDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG59XG5cbi5jaG9pY2UtLWRlc2t0b3A6YWN0aXZlLFxuLmNob2ljZS0tbW9iaWxlOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG59XG5cbi51bC1jYXJkLS10aGFua3Mge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4udWwtdGhhbmtzLWNoZWNrIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4udWwtY2FyZC0tdGhhbmtzLWNvbnRlbnQge1xuICBwYWRkaW5nOiAyMHB4IDAgMTBweCAwO1xufVxuXG4udWwtY2FyZC0tdGhhbmtzIC51bC1xdWVzdGlvbiB7XG4gIHBhZGRpbmctdG9wOiAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi51bC1jYXJkLS10aGFua3MgLnVsLWNhcHRpb24ge1xuICBwYWRkaW5nLXRvcDogMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICBoeXBoZW5zOiBhdXRvO1xuICBoeXBoZW5hdGUtbGltaXQtbGluZXM6IG5vLWxpbWl0O1xufVxuXG4uc2VsZWN0LWNoZWNrYm94IHtcbiAgaGVpZ2h0OiAxNnB4O1xuICB3aWR0aDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjMzIzMjMyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3gtc2hhZG93OiBpbnNldCAzcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICd0cmFuc3BhcmVudCc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uc2VsZWN0LXJhZGlvIHtcbiAgaGVpZ2h0OiAxNnB4O1xuICB3aWR0aDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzMyMzIzMjtcbiAgZGlzcGxheTogZmxleDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAndHJhbnNwYXJlbnQnO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLyogTGluayBzdHVkaWVzIHdpZGUgc2NyZWVuIHZpZXcgKi9cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNjAwcHgpIHtcbiAgLnVsLWNhcmRfX2NvbnRhaW5lci0tZGVza3RvcCB7XG4gICAgYm94LXNoYWRvdzogdW5zZXQ7XG4gIH1cblxuICAudWwtY2FyZF9fY29udGFpbmVyIHtcbiAgICBib3JkZXItcmFkaXVzOiB1bnNldDtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG4uZmFkZS1pbi10cmFuc2l0aW9uIHtcbiAgYW5pbWF0aW9uOiBmYWRlSW4gNDAwbXMgZWFzZS1pbjtcbiAgLXdlYmtpdC1hbmltYXRpb246IGZhZGVJbiA0MDBtcyBlYXNlLWluO1xuICAtbW96LWFuaW1hdGlvbjogZmFkZUluIDQwMG1zIGVhc2UtaW47XG4gIC1vLWFuaW1hdGlvbjogZmFkZUluIDQwMG1zIGVhc2UtaW47XG4gIC1tcy1hbmltYXRpb246IGZhZGVJbiA0MDBtcyBlYXNlLWluO1xufVxuXG5Aa2V5ZnJhbWVzIGZhZGVJbiB7XG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuQC1tb3ota2V5ZnJhbWVzIGZhZGVJbiB7XG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbiB7XG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuQC1vLWtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtbXMta2V5ZnJhbWVzIGZhZGVJbiB7XG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cbiIsIiJdKSx0LmV4cG9ydHM9ZX0sNDcwNjY6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTg5ODYpLG89bigxMDY2OSksaT1uKDc3ODgpLGE9big4NjU1OCksYz1uKDYwNjMyKSxzPW4oNDIwMDUpLHU9big3NjQyOCksbD1uKDczNTIzKSxmPW4oNjM1NTMpOyhlPXIoITEpKS5pKG8pLGUuaShpKSxlLmkoYSksZS5pKGMpLGUuaShzKSxlLmkodSksZS5pKGwpLGUuaShmKSxlLnB1c2goW3QuaWQsImh0bWwsXG5ib2R5IHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsICdBcHBsZSBDb2xvciBFbW9qaScsXG4gICAgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCc7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG5iIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuI3VsLWFwcCB7XG4gIG9wYWNpdHk6IDA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4jdWwtYXBwLnVsLWFwcC0tb3ZlcmxheSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgZWFzZS1vdXQ7XG59XG5cbiN1bC1hcHAudWwtYXBwLS12aXNpYmxlIHtcbiAgb3BhY2l0eTogMTtcbiAgYm90dG9tOiAwO1xufVxuXG4udWwtYXBwX19jb250YWluZXIge1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXgtaGVpZ2h0OiAxMDB2aDtcbn1cblxuLnVsLWZvb3RlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLnVsLWZvb3Rlci1idWJibGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbjogMCAzcHg7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xufVxuXG4uY2xvc2UtY29udGFpbmVyLS1kZXNrdG9wLFxuLmNsb3NlLWNvbnRhaW5lci0tbW9iaWxlIHtcbiAgaGVpZ2h0OiAyMnB4O1xuICB3aWR0aDogMjJweDtcbiAgYm9yZGVyLXJhZGl1czogMjJweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5jbG9zZS1jb250YWluZXItLWRlc2t0b3Age1xuICB0b3A6IDI1cHg7XG4gIHJpZ2h0OiAyNXB4O1xufVxuXG4uY2xvc2UtY29udGFpbmVyLS1tb2JpbGUge1xuICB0b3A6IDE1cHg7XG4gIHJpZ2h0OiAxMHB4O1xufVxuXG4uY2xvc2UtY29udGFpbmVyIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uY2xvc2UtYnRuIHtcbiAgaGVpZ2h0OiAxOHB4O1xuICB3aWR0aDogMThweDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnVsLWFwcF9fY29udGFpbmVyIHtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2Utb3V0O1xufVxuIiwiIl0pLHQuZXhwb3J0cz1lfSw4NjU1ODpmdW5jdGlvbih0LGUsbil7KGU9bigxODk4NikoITEpKS5wdXNoKFt0LmlkLCIvKiBpZGVudGljYWwgdG8gbnBzLmNzcywgb3RoZXIgdGhhbiBjbGFzcyBuYW1lcy4gKi9cbi51bC1jYXJkLS1saWtlcnQge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4udWwtY2FyZC0tbGlrZXJ0X19udW1iZXJzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBmbGV4OiAxIDA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW46IDVweCAwIDAgMDtcbn1cblxuLmxpa2VydC1udW1iZXItLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMnB4O1xufVxuXG4ubGlrZXJ0LW51bWJlci0tZGVza3RvcCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ubGlrZXJ0LW51bWJlciB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZsZXg6IDEgMDtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDEpO1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBoZWlnaHQ6IDY3cHg7XG59XG5cbi5saWtlcnQtbnVtYmVyOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5saWtlcnQtbnVtYmVyLS1kZXNrdG9wOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLmxpa2VydC1udW1iZXItMSB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4O1xufVxuXG4ubGlrZXJ0LW51bWJlci01IHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDVweDtcbn1cblxuLnVsLWNhcmQtLWxpa2VydF9fbGFiZWxzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXg6IDEgMDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTVweDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW46IDdweCAwIDEwcHggMDtcbn1cblxuLnVsLWNhcmQtLWxpa2VydF9fbGFiZWxzIHNwYW46bGFzdC1jaGlsZCB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuIiwiIl0pLHQuZXhwb3J0cz1lfSw2MDYzMjpmdW5jdGlvbih0LGUsbil7KGU9bigxODk4NikoITEpKS5wdXNoKFt0LmlkLCIuc2VsZWN0LWxhYmVsIHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xufVxuIiwiIl0pLHQuZXhwb3J0cz1lfSw0MjAwNTpmdW5jdGlvbih0LGUsbil7KGU9bigxODk4NikoITEpKS5wdXNoKFt0LmlkLCIvKiBpZGVudGljYWwgdG8gbGlrZXJ0LmNzcywgb3RoZXIgdGhhbiBjbGFzcyBuYW1lcy4gKi9cbi51bC1jYXJkLS1ucHMge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4udWwtY2FyZC0tbnBzX19udW1iZXJzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBmbGV4OiAxIDA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW46IDVweCAwIDAgMDtcbn1cblxuLm5wcy1udW1iZXItLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMnB4O1xufVxuXG4ubnBzLW51bWJlci0tZGVza3RvcCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ubnBzLW51bWJlciB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZsZXg6IDEgMDtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDEpO1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBoZWlnaHQ6IDY3cHg7XG59XG5cbi5ucHMtbnVtYmVyOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5ucHMtbnVtYmVyLS1kZXNrdG9wOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLm5wcy1udW1iZXItMCB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4O1xufVxuXG4ubnBzLW51bWJlci0xMCB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA1cHg7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA1cHg7XG59XG5cbi51bC1jYXJkLS1ucHNfX2xhYmVscyB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiAjMjYyMTM2O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBmbGV4OiAxIDA7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE1cHg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luOiA3cHggMCAxMHB4IDA7XG59XG5cbi51bC1jYXJkLS1ucHNfX2xhYmVscyBzcGFuOmxhc3QtY2hpbGQge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cbiIsIiJdKSx0LmV4cG9ydHM9ZX0sMTA2Njk6ZnVuY3Rpb24odCxlLG4peyhlPW4oMTg5ODYpKCExKSkucHVzaChbdC5pZCwiLyoqXG4gKiBtaW5pcmVzZXQuY3NzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vamd0aG1zL21pbmlyZXNldC5jc3NcbiAqL1xuXG5odG1sLFxuYm9keSxcbnAsXG5vbCxcbnVsLFxubGksXG5kbCxcbmR0LFxuZGQsXG5ibG9ja3F1b3RlLFxuZmlndXJlLFxuZmllbGRzZXQsXG5sZWdlbmQsXG50ZXh0YXJlYSxcbnByZSxcbmlmcmFtZSxcbmhyLFxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2IHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBmb250LXNpemU6IDEwMCU7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG5cbnVsIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuYnV0dG9uLFxuaW5wdXQsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIG1hcmdpbjogMDtcbn1cblxuaHRtbCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbiosICo6YmVmb3JlLCAqOmFmdGVyIHtcbiAgYm94LXNpemluZzogaW5oZXJpdDtcbn1cbiIsIiJdKSx0LmV4cG9ydHM9ZX0sNzY0Mjg6ZnVuY3Rpb24odCxlLG4peyhlPW4oMTg5ODYpKCExKSkucHVzaChbdC5pZCwiLnVsLWNhcmQtLXRleHQge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4udWwtY2FyZC10ZXh0IHtcbiAgZmxleDogMSAwIGF1dG87XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nOiAwO1xufVxuXG4udWwtY2FyZC10ZXh0X19jb250YWluZXIge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICBmbGV4OiAxIDAgMTAwJTtcbn1cblxuLnVsLWNhcmQtdGV4dF9faW5wdXQtLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG4gIG1heC1oZWlnaHQ6IDYzcHg7XG59XG5cbi51bC1jYXJkLXRleHRfX2lucHV0LS1kZXNrdG9wIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjtcbiAgbWF4LWhlaWdodDogMTUwcHg7XG59XG5cbi51bC1jYXJkLXRleHRfX2lucHV0IHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAxKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgY29sb3I6ICMzNDM0NDI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgJ0FwcGxlIENvbG9yIEVtb2ppJyxcbiAgICAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJztcbiAgbWluLWhlaWdodDogNjNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMTJweDtcbiAgcmVzaXplOiBub25lO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xufVxuXG4udWwtY2FyZC10ZXh0X19pbnB1dDo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogcmdiYSgxMDgsIDEwOCwgMTEwLCAwLjUpO1xufVxuXG4udWwtY2FyZC10ZXh0X19pbnB1dDpmb2N1cyB7XG4gIG91dGxpbmU6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4udWwtY2FyZC10ZXh0X19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBsaW5lLWhlaWdodDogMThweDtcbiAgcGFkZGluZzogMTAuNXB4IDIxcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuIiwiIl0pLHQuZXhwb3J0cz1lfSw3MzUyMzpmdW5jdGlvbih0LGUsbil7KGU9bigxODk4NikoITEpKS5wdXNoKFt0LmlkLCIudWwtY2FyZF9fdGV4dC11cmwtcHJvbXB0IHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbn1cblxuLnVsLWNhcmRfX3RleHQtdXJsLWJvZHktY29udGFpbmVyLFxuLnVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1ib2R5IHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLnVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1ib2R5IHtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBsaW5lLWhlaWdodDogMTMwLjM1JTtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgY29sb3I6ICMzNDM0NDI7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbn1cblxuLnVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1ib2R5Omxhc3QtY2hpbGQge1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxuXG4udWwtY2FyZF9fdGV4dC11cmwtcHJvbXB0LWJ1dHRvbiB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuLnVsLWNhcmRfX3RleHQtdXJsLWJvZHktY29udGFpbmVyIHtcbiAgbWluLWhlaWdodDogMmVtO1xufVxuIiwiIl0pLHQuZXhwb3J0cz1lfSw2MzU1MzpmdW5jdGlvbih0LGUsbil7KGU9bigxODk4NikoITEpKS5wdXNoKFt0LmlkLCIudWwtY2FyZC0tdmlkZW8ge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4jdWwtY2FyZC12b2ljZV9fdmlkZW8ge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuLnVsLWNhcmQtdGV4dF9fYnV0dG9uLnVsLWJ1dHRvbi1pbmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gIGNvbG9yOiAjNWQ2OTZmICFpbXBvcnRhbnQ7XG59XG5cbiN1bC1jYXJkLXZpZGVvX19wbGF5ZXJfcmVjb3JkZXIge1xuICB3aWR0aDogMTAwJTtcbiAgd2lkdGg6IC1tb3otYXZhaWxhYmxlOyAvKiBXZWJLaXQtYmFzZWQgYnJvd3NlcnMgd2lsbCBpZ25vcmUgdGhpcy4gKi9cbiAgd2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGU7IC8qIE1vemlsbGEtYmFzZWQgYnJvd3NlcnMgd2lsbCBpZ25vcmUgdGhpcy4gKi9cbiAgd2lkdGg6IGZpbGwtYXZhaWxhYmxlO1xufVxuIiwiIl0pLHQuZXhwb3J0cz1lfSw2MjU4MjpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBlPTAsbj1uZXcgQXJyYXkodC5sZW5ndGgpO2U8dC5sZW5ndGg7ZSsrKW5bZV09dFtlXTtyZXR1cm4gbn19fSw0NDYyMTpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxuLHIsbyxpLGEpe3RyeXt2YXIgYz10W2ldKGEpLHM9Yy52YWx1ZX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBuKHQpfWMuZG9uZT9lKHMpOlByb21pc2UucmVzb2x2ZShzKS50aGVuKHIsbyl9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe3ZhciBhPXQuYXBwbHkobixyKTtmdW5jdGlvbiBjKHQpe2UoYSxvLGksYyxzLCJuZXh0Iix0KX1mdW5jdGlvbiBzKHQpe2UoYSxvLGksYyxzLCJ0aHJvdyIsdCl9Yyh2b2lkIDApfSkpfX19LDMwNTkzOmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX0sNDQ1MzpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19LDY0MTU3OmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9fSw2NjA4MTpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuZXhwb3J0cz1lPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXQuZXhwb3J0cz1lfSw5NDI2NjpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KXx8IltvYmplY3QgQXJndW1lbnRzXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpcmV0dXJuIEFycmF5LmZyb20odCl9fSw5NDU2NjpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfX0sOTI4MTY6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjI1ODIpLG89big5NDI2NiksaT1uKDk0NTY2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCl8fG8odCl8fGkoKX19LDc2MzkwOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/dC5leHBvcnRzPWU9ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTp0LmV4cG9ydHM9ZT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGUobil9dC5leHBvcnRzPWV9LDQ0Njc0OmZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9big0NjY3OSl9LDk3MzQzOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvO3I9W3QsZV0sbj1mdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbixyLG89ImZ1bmN0aW9uIj09dHlwZW9mIE1hcD9uZXcgTWFwOihuPVtdLHI9W10se2hhczpmdW5jdGlvbih0KXtyZXR1cm4gbi5pbmRleE9mKHQpPi0xfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHJbbi5pbmRleE9mKHQpXX0sc2V0OmZ1bmN0aW9uKHQsZSl7LTE9PT1uLmluZGV4T2YodCkmJihuLnB1c2godCksci5wdXNoKGUpKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe3ZhciBlPW4uaW5kZXhPZih0KTtlPi0xJiYobi5zcGxpY2UoZSwxKSxyLnNwbGljZShlLDEpKX19KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRXZlbnQodCx7YnViYmxlczohMH0pfTt0cnl7bmV3IEV2ZW50KCJ0ZXN0Iil9Y2F0Y2godCl7aT1mdW5jdGlvbih0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtyZXR1cm4gZS5pbml0RXZlbnQodCwhMCwhMSksZX19ZnVuY3Rpb24gYSh0KXtpZih0JiZ0Lm5vZGVOYW1lJiYiVEVYVEFSRUEiPT09dC5ub2RlTmFtZSYmIW8uaGFzKHQpKXt2YXIgZT1udWxsLG49bnVsbCxyPW51bGwsYT1mdW5jdGlvbigpe3QuY2xpZW50V2lkdGghPT1uJiZkKCl9LGM9ZnVuY3Rpb24oZSl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsYSwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dCIsZCwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsZCwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhdXRvc2l6ZTpkZXN0cm95IixjLCExKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImF1dG9zaXplOnVwZGF0ZSIsZCwhMSksT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7dC5zdHlsZVtuXT1lW25dfSkpLG8uZGVsZXRlKHQpfS5iaW5kKHQse2hlaWdodDp0LnN0eWxlLmhlaWdodCxyZXNpemU6dC5zdHlsZS5yZXNpemUsb3ZlcmZsb3dZOnQuc3R5bGUub3ZlcmZsb3dZLG92ZXJmbG93WDp0LnN0eWxlLm92ZXJmbG93WCx3b3JkV3JhcDp0LnN0eWxlLndvcmRXcmFwfSk7dC5hZGRFdmVudExpc3RlbmVyKCJhdXRvc2l6ZTpkZXN0cm95IixjLCExKSwib25wcm9wZXJ0eWNoYW5nZSJpbiB0JiYib25pbnB1dCJpbiB0JiZ0LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixkLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixhLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixkLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoImF1dG9zaXplOnVwZGF0ZSIsZCwhMSksdC5zdHlsZS5vdmVyZmxvd1g9ImhpZGRlbiIsdC5zdHlsZS53b3JkV3JhcD0iYnJlYWstd29yZCIsby5zZXQodCx7ZGVzdHJveTpjLHVwZGF0ZTpkfSkscygpfWZ1bmN0aW9uIHMoKXt2YXIgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpOyJ2ZXJ0aWNhbCI9PT1uLnJlc2l6ZT90LnN0eWxlLnJlc2l6ZT0ibm9uZSI6ImJvdGgiPT09bi5yZXNpemUmJih0LnN0eWxlLnJlc2l6ZT0iaG9yaXpvbnRhbCIpLGU9ImNvbnRlbnQtYm94Ij09PW4uYm94U2l6aW5nPy0ocGFyc2VGbG9hdChuLnBhZGRpbmdUb3ApK3BhcnNlRmxvYXQobi5wYWRkaW5nQm90dG9tKSk6cGFyc2VGbG9hdChuLmJvcmRlclRvcFdpZHRoKStwYXJzZUZsb2F0KG4uYm9yZGVyQm90dG9tV2lkdGgpLGlzTmFOKGUpJiYoZT0wKSxkKCl9ZnVuY3Rpb24gdShlKXt2YXIgbj10LnN0eWxlLndpZHRoO3Quc3R5bGUud2lkdGg9IjBweCIsdC5vZmZzZXRXaWR0aCx0LnN0eWxlLndpZHRoPW4sdC5zdHlsZS5vdmVyZmxvd1k9ZX1mdW5jdGlvbiBsKHQpe2Zvcih2YXIgZT1bXTt0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7KXQucGFyZW50Tm9kZS5zY3JvbGxUb3AmJmUucHVzaCh7bm9kZTp0LnBhcmVudE5vZGUsc2Nyb2xsVG9wOnQucGFyZW50Tm9kZS5zY3JvbGxUb3B9KSx0PXQucGFyZW50Tm9kZTtyZXR1cm4gZX1mdW5jdGlvbiBmKCl7aWYoMCE9PXQuc2Nyb2xsSGVpZ2h0KXt2YXIgcj1sKHQpLG89ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3Quc3R5bGUuaGVpZ2h0PSIiLHQuc3R5bGUuaGVpZ2h0PXQuc2Nyb2xsSGVpZ2h0K2UrInB4IixuPXQuY2xpZW50V2lkdGgsci5mb3JFYWNoKChmdW5jdGlvbih0KXt0Lm5vZGUuc2Nyb2xsVG9wPXQuc2Nyb2xsVG9wfSkpLG8mJihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wPW8pfX1mdW5jdGlvbiBkKCl7ZigpO3ZhciBlPU1hdGgucm91bmQocGFyc2VGbG9hdCh0LnN0eWxlLmhlaWdodCkpLG49d2luZG93LmdldENvbXB1dGVkU3R5bGUodCxudWxsKSxvPSJjb250ZW50LWJveCI9PT1uLmJveFNpemluZz9NYXRoLnJvdW5kKHBhcnNlRmxvYXQobi5oZWlnaHQpKTp0Lm9mZnNldEhlaWdodDtpZihvPGU/ImhpZGRlbiI9PT1uLm92ZXJmbG93WSYmKHUoInNjcm9sbCIpLGYoKSxvPSJjb250ZW50LWJveCI9PT1uLmJveFNpemluZz9NYXRoLnJvdW5kKHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5oZWlnaHQpKTp0Lm9mZnNldEhlaWdodCk6ImhpZGRlbiIhPT1uLm92ZXJmbG93WSYmKHUoImhpZGRlbiIpLGYoKSxvPSJjb250ZW50LWJveCI9PT1uLmJveFNpemluZz9NYXRoLnJvdW5kKHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5oZWlnaHQpKTp0Lm9mZnNldEhlaWdodCksciE9PW8pe3I9bzt2YXIgYT1pKCJhdXRvc2l6ZTpyZXNpemVkIik7dHJ5e3QuZGlzcGF0Y2hFdmVudChhKX1jYXRjaCh0KXt9fX19ZnVuY3Rpb24gYyh0KXt2YXIgZT1vLmdldCh0KTtlJiZlLmRlc3Ryb3koKX1mdW5jdGlvbiBzKHQpe3ZhciBlPW8uZ2V0KHQpO2UmJmUudXBkYXRlKCl9dmFyIHU9bnVsbDsidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8ImZ1bmN0aW9uIiE9dHlwZW9mIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlPygodT1mdW5jdGlvbih0KXtyZXR1cm4gdH0pLmRlc3Ryb3k9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHUudXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0fSk6KCh1PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5sZW5ndGg/dDpbdF0sKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsZSl9KSksdH0pLmRlc3Ryb3k9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5sZW5ndGg/dDpbdF0sYyksdH0sdS51cGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5sZW5ndGg/dDpbdF0scyksdH0pLGUuZGVmYXVsdD11LHQuZXhwb3J0cz1lLmRlZmF1bHR9LHZvaWQgMD09PShvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkoZSxyKTpuKXx8KHQuZXhwb3J0cz1vKX0sNDAwNDY6ZnVuY3Rpb24odCxlLG4pe24oNjU2NzkpLG4oNTEwOTApLG4oMjQ3ODUpLG4oODkxNyksbig1NDc4NiksbigxMjgxNiksbig2MTkyNCksbig5ODMwNiksbigxMjAyNSksbigyODMzKSxuKDk2NDUzKSxuKDcwODYzKSxuKDI0ODAyKSxuKDE4MjczKSxuKDQyNDExKSxuKDM3NDgxKSxuKDQ1NTUwKSxuKDU4MTY1KSxuKDUxMTczKSxuKDg3NDMpLG4oNzU4MDQpLG4oNDYxNDYpLG4oMTUwNzcpLG4oNTgzMjkpLG4oNjA1MjUpLG4oNzQ5NTMpLG4oNTQ3ODEpLG4oNTE2Niksbig4OTc1OCksbigxODM3OCksbig5MjUyKSxuKDkzMjcyKSxuKDU2MTU4KSxuKDQxNDU2KSxuKDcyODUxKSxuKDM0NTI5KSxuKDE5Mjc4KSxuKDkxMjA5KSxuKDcyNTYwKSxuKDEwNjMpLG4oOTY0OTgpLG4oMjI0NDIpLG4oNzU4OTQpLG4oNzE2MjIpLG4oNzQ1MzgpLG4oMjEyNyksbig2OTk4OCksbig1NzM4NyksbigzMDgxNyksbig1MjA1NSksbig3MzM2MCksbig0NzUwMiksbigzMzE5NSksbig5MDkxMiksbigyODIwMyksbig3OTIyNyksbig0MzU5MSksbigyMjI3NyksbigyNDEyOSksbig3NDEyMCksbig5NDk2MyksbigyNzM4OCksbig4MDUyMiksbig0NTUyOCksbig4MDExNiksbigyOTExMCksbig4NTU5NCksbig2NzgxMiksbigzMzc5Miksbig4NjIxNCksbig3MDE0Niksbig3MTg0Niksbig1MDA2MyksbigxMDc0Myksbig4MDUxMSksbigxNTM3Myksbig5NzY4OCksbig3NDU2Myksbig2NTAwMyksbig4MTI3Nyksbig0NDAxOSksbigzODIpLG4oMTg4MjMpLG4oMzMzMjIpLG4oMzMwNjUpLG4oMTc0OTQpLG4oODAzNjMpLG4oNDMzOTYpLG4oNjkxODgpLG4oNzQ3OTUpLG4oODIyMDEpLG4oNDE3NzMpLG4oMzA0MDIpLG4oMTgxNzUpLG4oNjY4OTYpLG4oODU3NjcpLG4oODQzNiksbig5MjE5MiksbigxMjE1NSksbigyNjAxNiksbig3NDExNyksbigyODAwMyksbig2Nzk0MSksbig0NDA1MSksbig0OTQ5NSksbig4NzIwOSksbigxODI3NiksbigzNzU0KSxuKDMzNDM3KSxuKDE5NDMzKSxuKDcxODI3KSxuKDI2MDYzKSxuKDk2NyksbigzMzEwMCksbig0MTkyOCksbigxNTg2OSksbig4ODcxNSksbigzNjk5NSksbigxMTIyNCksbig2Mzc2NSksbigxMzA2NCksbigzMjI5MyksbigyMTAzMiksbigzNzkzNiksbig5Mzk5NSksbigxMzM5MyksbigxMTI4MSksbigzODAzNiksbigxMTM4KSxuKDQ2MDc4KSxuKDMwMDgzKSxuKDQ3MzgzKSxuKDcxNTU4KSxuKDk5MjE4KSxuKDk4OTc4KSxuKDgwNjkpLG4oNzAyMDQpLG4oODU3NTgpLG4oMTE3NzMpLG4oMTU3NjMpLG4oNDE2MzIpLG4oMzYyMzMpLG4oNDAwNDUpLG4oMjEzNzYpLG4oODQwNyksbigxNjUwKSxuKDgxMTA0KSxuKDExNjg4KSxuKDE3NjI5KSxuKDQyNDkwKSxuKDk0OTA2KSxuKDc0MDYxKSxuKDU4NjA2KSxuKDQ1MTU3KSxuKDYxMjQ1KSxuKDI5MjczKSxuKDkwNTYwKSxuKDQ1MTU0KSxuKDcwMzczKSxuKDgwNzU3KSxuKDY5ODc5KSxuKDI0NDk4KSxuKDE2OTc4KSxuKDE3MTUyKSxuKDM3OTg3KSxuKDI2ODApLG4oMzgyODApLG4oMTg1NTkpLG4oNTA0ODIpLG4oNzQyMzApLG4oMTg1MDYpLG4oMjAyNDIpLG4oMjgxNTUpLG4oMzM5MDEpLG4oNzY0NDIpLG4oODg2MzYpLG4oODE0NjMpLG4oOTUxNjMpLG4oODM2NzMpLG4oMjM1NjgpLG4oMjcyOTQpLG4oMjQ0NTcpLG4oMzkzMiksbig3NTQ5OSksbig4NzU2NCksbig4NDUwKSxuKDE3NjA1KSxuKDczNTYyKSxuKDExODc4KSxuKDYwOTI5KSxuKDQzOTUxKSxuKDkxMzQ3KSxuKDI5Mjg0KSxuKDYxOTQzKSxuKDI2OTg2KSxuKDEzNjYpLG4oODMzMTApLG4oNDY1OTcpLG4oNzAxMzYpLG4oNjA4NjUpLG4oNjc3MDgpLG4oOTY2MzgpLG4oMzk3MzApLG4oNzQxMTUpLG4oODU2ODYpO3ZhciByPW4oNTYyMzgpO3QuZXhwb3J0cz1yfSw2MDQ5MTpmdW5jdGlvbih0LGUsbil7big0MDA0NiksbigxNTYyNCksbig5MjQwNCk7dmFyIHI9big1NjIzOCk7dC5leHBvcnRzPXJ9LDg2NDcwOmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpKyIgaXMgbm90IGEgZnVuY3Rpb24iKTtyZXR1cm4gdH19LDc5ODYxOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwNTkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkmJm51bGwhPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3Qgc2V0ICIrU3RyaW5nKHQpKyIgYXMgYSBwcm90b3R5cGUiKTtyZXR1cm4gdH19LDc2NTEzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzNzI0KSxvPW4oNTA4NjgpLGk9big2Njk3MSksYT1yKCJ1bnNjb3BhYmxlcyIpLGM9QXJyYXkucHJvdG90eXBlO251bGw9PWNbYV0mJmkoYyxhLG8obnVsbCkpLHQuZXhwb3J0cz1mdW5jdGlvbih0KXtjW2FdW3RdPSEwfX0sNTMxNDE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDYwMTQwKS5jaGFyQXQ7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSsobj9yKHQsZSkubGVuZ3RoOjEpfX0sNTkzNzk6ZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCAiKyhuP24rIiAiOiIiKSsiaW52b2NhdGlvbiIpO3JldHVybiB0fX0sODc1Nzk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTA1OTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpKyIgaXMgbm90IGFuIG9iamVjdCIpO3JldHVybiB0fX0sNzMwNzQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPW4oNjI1NTYpLGk9big4OTU1OCksYT1uKDEwNTkyKSxjPW4oNzYyOTgpLHM9big1OTU5MSksdT1uKDY2OTcxKSxsPW4oOTI5MTMpLGY9bigzNzYyMCkuZixkPW4oNjQ5NjUpLHA9big3MTg0MiksaD1uKDIzNzI0KSx2PW4oNjcyOSksZz1pLkRhdGFWaWV3LHk9ZyYmZy5wcm90b3R5cGUsbT1pLkludDhBcnJheSxiPW0mJm0ucHJvdG90eXBlLHg9aS5VaW50OENsYW1wZWRBcnJheSx3PXgmJngucHJvdG90eXBlLEU9bSYmZChtKSxqPWImJmQoYiksQz1PYmplY3QucHJvdG90eXBlLGs9Qy5pc1Byb3RvdHlwZU9mLFM9aCgidG9TdHJpbmdUYWciKSxPPXYoIlRZUEVEX0FSUkFZX1RBRyIpLEE9ISghaS5BcnJheUJ1ZmZlcnx8IWcpLEk9QSYmISFwJiYiT3BlcmEiIT09cyhpLm9wZXJhKSxUPSExLE09e0ludDhBcnJheToxLFVpbnQ4QXJyYXk6MSxVaW50OENsYW1wZWRBcnJheToxLEludDE2QXJyYXk6MixVaW50MTZBcnJheToyLEludDMyQXJyYXk6NCxVaW50MzJBcnJheTo0LEZsb2F0MzJBcnJheTo0LEZsb2F0NjRBcnJheTo4fSxfPWZ1bmN0aW9uKHQpe3JldHVybiBhKHQpJiZjKE0scyh0KSl9O2ZvcihyIGluIE0paVtyXXx8KEk9ITEpO2lmKCghSXx8ImZ1bmN0aW9uIiE9dHlwZW9mIEV8fEU9PT1GdW5jdGlvbi5wcm90b3R5cGUpJiYoRT1mdW5jdGlvbigpe3Rocm93IFR5cGVFcnJvcigiSW5jb3JyZWN0IGludm9jYXRpb24iKX0sSSkpZm9yKHIgaW4gTSlpW3JdJiZwKGlbcl0sRSk7aWYoKCFJfHwhanx8aj09PUMpJiYoaj1FLnByb3RvdHlwZSxJKSlmb3IociBpbiBNKWlbcl0mJnAoaVtyXS5wcm90b3R5cGUsaik7aWYoSSYmZCh3KSE9PWomJnAodyxqKSxvJiYhYyhqLFMpKWZvcihyIGluIFQ9ITAsZihqLFMse2dldDpmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpP3RoaXNbT106dm9pZCAwfX0pLE0paVtyXSYmdShpW3JdLE8scik7QSYmcCYmZCh5KSE9PUMmJnAoeSxDKSx0LmV4cG9ydHM9e05BVElWRV9BUlJBWV9CVUZGRVI6QSxOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOkksVFlQRURfQVJSQVlfVEFHOlQmJk8sYVR5cGVkQXJyYXk6ZnVuY3Rpb24odCl7aWYoXyh0KSlyZXR1cm4gdDt0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheSIpfSxhVHlwZWRBcnJheUNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe2lmKHApe2lmKGsuY2FsbChFLHQpKXJldHVybiB0fWVsc2UgZm9yKHZhciBlIGluIE0paWYoYyhNLHIpKXt2YXIgbj1pW2VdO2lmKG4mJih0PT09bnx8ay5jYWxsKG4sdCkpKXJldHVybiB0fXRocm93IFR5cGVFcnJvcigiVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIil9LGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6ZnVuY3Rpb24odCxlLG4pe2lmKG8pe2lmKG4pZm9yKHZhciByIGluIE0pe3ZhciBhPWlbcl07YSYmYyhhLnByb3RvdHlwZSx0KSYmZGVsZXRlIGEucHJvdG90eXBlW3RdfWpbdF0mJiFufHxsKGosdCxuP2U6SSYmYlt0XXx8ZSl9fSxleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixhO2lmKG8pe2lmKHApe2lmKG4pZm9yKHIgaW4gTSkoYT1pW3JdKSYmYyhhLHQpJiZkZWxldGUgYVt0XTtpZihFW3RdJiYhbilyZXR1cm47dHJ5e3JldHVybiBsKEUsdCxuP2U6SSYmbVt0XXx8ZSl9Y2F0Y2godCl7fX1mb3IociBpbiBNKSEoYT1pW3JdKXx8YVt0XSYmIW58fGwoYSx0LGUpfX0saXNWaWV3OmZ1bmN0aW9uKHQpe3ZhciBlPXModCk7cmV0dXJuIkRhdGFWaWV3Ij09PWV8fGMoTSxlKX0saXNUeXBlZEFycmF5Ol8sVHlwZWRBcnJheTpFLFR5cGVkQXJyYXlQcm90b3R5cGU6an19LDgyODM1OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big4OTU1OCksbz1uKDYyNTU2KSxpPW4oNzMwNzQpLk5BVElWRV9BUlJBWV9CVUZGRVIsYT1uKDY2OTcxKSxjPW4oMTkyNikscz1uKDMyMTg3KSx1PW4oNTkzNzkpLGw9big0MzQxNiksZj1uKDI3ODg0KSxkPW4oODM5MTQpLHA9big5MDcyNSksaD1uKDEzMzM0KS5mLHY9bigzNzYyMCkuZixnPW4oNjU4OTUpLHk9big1MTEyOCksbT1uKDg5ODI3KSxiPW0uZ2V0LHg9bS5zZXQsdz0iQXJyYXlCdWZmZXIiLEU9IkRhdGFWaWV3IixqPSJXcm9uZyBpbmRleCIsQz1yLkFycmF5QnVmZmVyLGs9QyxTPXIuRGF0YVZpZXcsTz1yLlJhbmdlRXJyb3IsQT1wLnBhY2ssST1wLnVucGFjayxUPWZ1bmN0aW9uKHQpe3JldHVyblsyNTUmdF19LE09ZnVuY3Rpb24odCl7cmV0dXJuWzI1NSZ0LHQ+PjgmMjU1XX0sXz1mdW5jdGlvbih0KXtyZXR1cm5bMjU1JnQsdD4+OCYyNTUsdD4+MTYmMjU1LHQ+PjI0JjI1NV19LEw9ZnVuY3Rpb24odCl7cmV0dXJuIHRbM108PDI0fHRbMl08PDE2fHRbMV08PDh8dFswXX0sUj1mdW5jdGlvbih0KXtyZXR1cm4gQSh0LDIzLDQpfSxQPWZ1bmN0aW9uKHQpe3JldHVybiBBKHQsNTIsOCl9LE49ZnVuY3Rpb24odCxlKXt2KHQucHJvdG90eXBlLGUse2dldDpmdW5jdGlvbigpe3JldHVybiBiKHRoaXMpW2VdfX0pfSxGPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWQobiksaT1iKHQpO2lmKG8rZT5pLmJ5dGVMZW5ndGgpdGhyb3cgTyhqKTt2YXIgYT1iKGkuYnVmZmVyKS5ieXRlcyxjPW8raS5ieXRlT2Zmc2V0LHM9YS5zbGljZShjLGMrZSk7cmV0dXJuIHI/czpzLnJldmVyc2UoKX0sRD1mdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9ZChuKSxjPWIodCk7aWYoYStlPmMuYnl0ZUxlbmd0aCl0aHJvdyBPKGopO2Zvcih2YXIgcz1iKGMuYnVmZmVyKS5ieXRlcyx1PWErYy5ieXRlT2Zmc2V0LGw9cigrbyksZj0wO2Y8ZTtmKyspc1t1K2ZdPWxbaT9mOmUtZi0xXX07aWYoaSl7aWYoIXMoKGZ1bmN0aW9uKCl7QygxKX0pKXx8IXMoKGZ1bmN0aW9uKCl7bmV3IEMoLTEpfSkpfHxzKChmdW5jdGlvbigpe3JldHVybiBuZXcgQyxuZXcgQygxLjUpLG5ldyBDKE5hTiksQy5uYW1lIT13fSkpKXtmb3IodmFyIFUsQj0oaz1mdW5jdGlvbih0KXtyZXR1cm4gdSh0aGlzLGspLG5ldyBDKGQodCkpfSkucHJvdG90eXBlPUMucHJvdG90eXBlLHo9aChDKSxIPTA7ei5sZW5ndGg+SDspKFU9eltIKytdKWluIGt8fGEoayxVLENbVV0pO0IuY29uc3RydWN0b3I9a312YXIgVj1uZXcgUyhuZXcgaygyKSkscT1TLnByb3RvdHlwZS5zZXRJbnQ4O1Yuc2V0SW50OCgwLDIxNDc0ODM2NDgpLFYuc2V0SW50OCgxLDIxNDc0ODM2NDkpLCFWLmdldEludDgoMCkmJlYuZ2V0SW50OCgxKXx8YyhTLnByb3RvdHlwZSx7c2V0SW50ODpmdW5jdGlvbih0LGUpe3EuY2FsbCh0aGlzLHQsZTw8MjQ+PjI0KX0sc2V0VWludDg6ZnVuY3Rpb24odCxlKXtxLmNhbGwodGhpcyx0LGU8PDI0Pj4yNCl9fSx7dW5zYWZlOiEwfSl9ZWxzZSBrPWZ1bmN0aW9uKHQpe3UodGhpcyxrLHcpO3ZhciBlPWQodCk7eCh0aGlzLHtieXRlczpnLmNhbGwobmV3IEFycmF5KGUpLDApLGJ5dGVMZW5ndGg6ZX0pLG98fCh0aGlzLmJ5dGVMZW5ndGg9ZSl9LFM9ZnVuY3Rpb24odCxlLG4pe3UodGhpcyxTLEUpLHUodCxrLEUpO3ZhciByPWIodCkuYnl0ZUxlbmd0aCxpPWwoZSk7aWYoaTwwfHxpPnIpdGhyb3cgTygiV3Jvbmcgb2Zmc2V0Iik7aWYoaSsobj12b2lkIDA9PT1uP3ItaTpmKG4pKT5yKXRocm93IE8oIldyb25nIGxlbmd0aCIpO3godGhpcyx7YnVmZmVyOnQsYnl0ZUxlbmd0aDpuLGJ5dGVPZmZzZXQ6aX0pLG98fCh0aGlzLmJ1ZmZlcj10LHRoaXMuYnl0ZUxlbmd0aD1uLHRoaXMuYnl0ZU9mZnNldD1pKX0sbyYmKE4oaywiYnl0ZUxlbmd0aCIpLE4oUywiYnVmZmVyIiksTihTLCJieXRlTGVuZ3RoIiksTihTLCJieXRlT2Zmc2V0IikpLGMoUy5wcm90b3R5cGUse2dldEludDg6ZnVuY3Rpb24odCl7cmV0dXJuIEYodGhpcywxLHQpWzBdPDwyND4+MjR9LGdldFVpbnQ4OmZ1bmN0aW9uKHQpe3JldHVybiBGKHRoaXMsMSx0KVswXX0sZ2V0SW50MTY6ZnVuY3Rpb24odCl7dmFyIGU9Rih0aGlzLDIsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCk7cmV0dXJuKGVbMV08PDh8ZVswXSk8PDE2Pj4xNn0sZ2V0VWludDE2OmZ1bmN0aW9uKHQpe3ZhciBlPUYodGhpcywyLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApO3JldHVybiBlWzFdPDw4fGVbMF19LGdldEludDMyOmZ1bmN0aW9uKHQpe3JldHVybiBMKEYodGhpcyw0LHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApKX0sZ2V0VWludDMyOmZ1bmN0aW9uKHQpe3JldHVybiBMKEYodGhpcyw0LHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApKT4+PjB9LGdldEZsb2F0MzI6ZnVuY3Rpb24odCl7cmV0dXJuIEkoRih0aGlzLDQsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCksMjMpfSxnZXRGbG9hdDY0OmZ1bmN0aW9uKHQpe3JldHVybiBJKEYodGhpcyw4LHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApLDUyKX0sc2V0SW50ODpmdW5jdGlvbih0LGUpe0QodGhpcywxLHQsVCxlKX0sc2V0VWludDg6ZnVuY3Rpb24odCxlKXtEKHRoaXMsMSx0LFQsZSl9LHNldEludDE2OmZ1bmN0aW9uKHQsZSl7RCh0aGlzLDIsdCxNLGUsYXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDApfSxzZXRVaW50MTY6ZnVuY3Rpb24odCxlKXtEKHRoaXMsMix0LE0sZSxhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCl9LHNldEludDMyOmZ1bmN0aW9uKHQsZSl7RCh0aGlzLDQsdCxfLGUsYXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDApfSxzZXRVaW50MzI6ZnVuY3Rpb24odCxlKXtEKHRoaXMsNCx0LF8sZSxhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCl9LHNldEZsb2F0MzI6ZnVuY3Rpb24odCxlKXtEKHRoaXMsNCx0LFIsZSxhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCl9LHNldEZsb2F0NjQ6ZnVuY3Rpb24odCxlKXtEKHRoaXMsOCx0LFAsZSxhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCl9fSk7eShrLHcpLHkoUyxFKSx0LmV4cG9ydHM9e0FycmF5QnVmZmVyOmssRGF0YVZpZXc6U319LDk5NDMxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxOTIwOSksbz1uKDc2OTc2KSxpPW4oMjc4ODQpLGE9TWF0aC5taW47dC5leHBvcnRzPVtdLmNvcHlXaXRoaW58fGZ1bmN0aW9uKHQsZSl7dmFyIG49cih0aGlzKSxjPWkobi5sZW5ndGgpLHM9byh0LGMpLHU9byhlLGMpLGw9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsZj1hKCh2b2lkIDA9PT1sP2M6byhsLGMpKS11LGMtcyksZD0xO2Zvcih1PHMmJnM8dStmJiYoZD0tMSx1Kz1mLTEscys9Zi0xKTtmLS0gPjA7KXUgaW4gbj9uW3NdPW5bdV06ZGVsZXRlIG5bc10scys9ZCx1Kz1kO3JldHVybiBufX0sNjU4OTU6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE5MjA5KSxvPW4oNzY5NzYpLGk9bigyNzg4NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1yKHRoaXMpLG49aShlLmxlbmd0aCksYT1hcmd1bWVudHMubGVuZ3RoLGM9byhhPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxuKSxzPWE+Mj9hcmd1bWVudHNbMl06dm9pZCAwLHU9dm9pZCAwPT09cz9uOm8ocyxuKTt1PmM7KWVbYysrXT10O3JldHVybiBlfX0sMzEzNjg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwMDI1KS5mb3JFYWNoLG89bigyMjkwOSk7dC5leHBvcnRzPW8oImZvckVhY2giKT9mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfTpbXS5mb3JFYWNofSw4NTE2NjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDYxMzApLG89bigxOTIwOSksaT1uKDEyMjc4KSxhPW4oNDQ5ODQpLGM9bigyNzg4NCkscz1uKDU4ODEwKSx1PW4oNzM4OTApO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixkLHA9byh0KSxoPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXksdj1hcmd1bWVudHMubGVuZ3RoLGc9dj4xP2FyZ3VtZW50c1sxXTp2b2lkIDAseT12b2lkIDAhPT1nLG09MCxiPXUocCk7aWYoeSYmKGc9cihnLHY+Mj9hcmd1bWVudHNbMl06dm9pZCAwLDIpKSxudWxsPT1ifHxoPT1BcnJheSYmYShiKSlmb3Iobj1uZXcgaChlPWMocC5sZW5ndGgpKTtlPm07bSsrKXMobixtLHk/ZyhwW21dLG0pOnBbbV0pO2Vsc2UgZm9yKGQ9KGY9Yi5jYWxsKHApKS5uZXh0LG49bmV3IGg7IShsPWQuY2FsbChmKSkuZG9uZTttKyspcyhuLG0seT9pKGYsZyxbbC52YWx1ZSxtXSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPW0sbn19LDg1ODAzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk1NzMpLG89bigyNzg4NCksaT1uKDc2OTc2KSxhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4sYSl7dmFyIGMscz1yKGUpLHU9byhzLmxlbmd0aCksbD1pKGEsdSk7aWYodCYmbiE9bil7Zm9yKDt1Pmw7KWlmKChjPXNbbCsrXSkhPWMpcmV0dXJuITB9ZWxzZSBmb3IoO3U+bDtsKyspaWYoKHR8fGwgaW4gcykmJnNbbF09PT1uKXJldHVybiB0fHxsfHwwO3JldHVybiF0JiYtMX19O3QuZXhwb3J0cz17aW5jbHVkZXM6YSghMCksaW5kZXhPZjphKCExKX19LDMwMDI1OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2MTMwKSxvPW4oMjQ5OCksaT1uKDE5MjA5KSxhPW4oMjc4ODQpLGM9big3MDA5KSxzPVtdLnB1c2gsdT1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCx1PTM9PXQsbD00PT10LGY9Nj09dCxkPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKHAsaCx2LGcpe2Zvcih2YXIgeSxtLGI9aShwKSx4PW8oYiksdz1yKGgsdiwzKSxFPWEoeC5sZW5ndGgpLGo9MCxDPWd8fGMsaz1lP0MocCxFKTpuP0MocCwwKTp2b2lkIDA7RT5qO2orKylpZigoZHx8aiBpbiB4KSYmKG09dyh5PXhbal0saixiKSx0KSlpZihlKWtbal09bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBqO2Nhc2UgMjpzLmNhbGwoayx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6dXx8bD9sOmt9fTt0LmV4cG9ydHM9e2ZvckVhY2g6dSgwKSxtYXA6dSgxKSxmaWx0ZXI6dSgyKSxzb21lOnUoMyksZXZlcnk6dSg0KSxmaW5kOnUoNSksZmluZEluZGV4OnUoNil9fSw0OTI0OTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTU3Myksbz1uKDQzNDE2KSxpPW4oMjc4ODQpLGE9bigyMjkwOSksYz1NYXRoLm1pbixzPVtdLmxhc3RJbmRleE9mLHU9ISFzJiYxL1sxXS5sYXN0SW5kZXhPZigxLC0wKTwwLGw9YSgibGFzdEluZGV4T2YiKTt0LmV4cG9ydHM9dXx8bD9mdW5jdGlvbih0KXtpZih1KXJldHVybiBzLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDt2YXIgZT1yKHRoaXMpLG49aShlLmxlbmd0aCksYT1uLTE7Zm9yKGFyZ3VtZW50cy5sZW5ndGg+MSYmKGE9YyhhLG8oYXJndW1lbnRzWzFdKSkpLGE8MCYmKGE9bithKTthPj0wO2EtLSlpZihhIGluIGUmJmVbYV09PT10KXJldHVybiBhfHwwO3JldHVybi0xfTpzfSw2MTk2MzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMjE4Nyksbz1uKDIzNzI0KSxpPW4oNzkwNzEpLGE9bygic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaT49NTF8fCFyKChmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybihlLmNvbnN0cnVjdG9yPXt9KVthXT1mdW5jdGlvbigpe3JldHVybntmb286MX19LDEhPT1lW3RdKEJvb2xlYW4pLmZvb30pKX19LDEyMzY2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg2NDcwKSxvPW4oMTkyMDkpLGk9bigyNDk4KSxhPW4oMjc4ODQpLGM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixjLHMpe3Iobik7dmFyIHU9byhlKSxsPWkodSksZj1hKHUubGVuZ3RoKSxkPXQ/Zi0xOjAscD10Py0xOjE7aWYoYzwyKWZvcig7Oyl7aWYoZCBpbiBsKXtzPWxbZF0sZCs9cDticmVha31pZihkKz1wLHQ/ZDwwOmY8PWQpdGhyb3cgVHlwZUVycm9yKCJSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIil9Zm9yKDt0P2Q+PTA6Zj5kO2QrPXApZCBpbiBsJiYocz1uKHMsbFtkXSxkLHUpKTtyZXR1cm4gc319O3QuZXhwb3J0cz17bGVmdDpjKCExKSxyaWdodDpjKCEwKX19LDcwMDk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTA1OTIpLG89big2MTk5KSxpPW4oMjM3MjQpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG8odCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj10LmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhbyhuLnByb3RvdHlwZSk/cihuKSYmbnVsbD09PShuPW5baV0pJiYobj12b2lkIDApOm49dm9pZCAwKSxuZXcodm9pZCAwPT09bj9BcnJheTpuKSgwPT09ZT8wOmUpfX0sNDU2NjY6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDg2NDcwKSxvPW4oODc1NzkpLGk9big3NzAxKSgiUHJvbWlzZSIpLGE9W10ucHVzaCxjPWZ1bmN0aW9uKHQpe3ZhciBlPTA9PXQsbj0xPT10LGM9Mj09dCxzPTM9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsdSl7byh0KTt2YXIgbD1yKHQubmV4dCksZj1lP1tdOnZvaWQgMDtyZXR1cm4gZXx8cih1KSxuZXcgaSgoZnVuY3Rpb24ocixkKXt2YXIgcD1mdW5jdGlvbigpe3RyeXtpLnJlc29sdmUobyhsLmNhbGwodCkpKS50aGVuKChmdW5jdGlvbih0KXt0cnl7aWYobyh0KS5kb25lKXIoZT9mOiFzJiYoY3x8dm9pZCAwKSk7ZWxzZXt2YXIgbD10LnZhbHVlO2U/KGEuY2FsbChmLGwpLHAoKSk6aS5yZXNvbHZlKHUobCkpLnRoZW4oKGZ1bmN0aW9uKHQpe24/cCgpOmM/dD9wKCk6cighMSk6dD9yKHN8fGwpOnAoKX0pLGQpfX1jYXRjaCh0KXtkKHQpfX0pLGQpfWNhdGNoKHQpe2QodCl9fTtwKCl9KSl9fTt0LmV4cG9ydHM9e3RvQXJyYXk6YygwKSxmb3JFYWNoOmMoMSksZXZlcnk6YygyKSxzb21lOmMoMyksZmluZDpjKDQpfX0sNjM4NDU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT1uKDg5NTU4KSxhPW4oMzQ3NDEpLGM9big2NDk2NSkscz1uKDc2Mjk4KSx1PW4oNjY5NzEpLGw9bigyMzcyNCksZj1uKDY1NjcyKSxkPWwoImFzeW5jSXRlcmF0b3IiKSxwPWkuQXN5bmNJdGVyYXRvcixoPWEuQXN5bmNJdGVyYXRvclByb3RvdHlwZTtpZighZilpZihoKXI9aDtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBwKXI9cC5wcm90b3R5cGU7ZWxzZSBpZihhLlVTRV9GVU5DVElPTl9DT05TVFJVQ1RPUnx8aS5VU0VfRlVOQ1RJT05fQ09OU1RSVUNUT1IpdHJ5e289YyhjKGMoRnVuY3Rpb24oInJldHVybiBhc3luYyBmdW5jdGlvbiooKXt9KCkiKSgpKSkpLGMobyk9PT1PYmplY3QucHJvdG90eXBlJiYocj1vKX1jYXRjaCh0KXt9cnx8KHI9e30pLHMocixkKXx8dShyLGQsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksdC5leHBvcnRzPXJ9LDQ2MTMwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg2NDcwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKHIodCksdm9pZCAwPT09ZSlyZXR1cm4gdDtzd2l0Y2gobil7Y2FzZSAwOnJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmNhbGwoZSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY2FsbChlLG4scil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixyLG8pe3JldHVybiB0LmNhbGwoZSxuLHIsbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSwxMjI3ODpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NzU3OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSw0Nzk2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzNzI0KSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSwoZnVuY3Rpb24oKXt0aHJvdyAyfSkpfWNhdGNoKHQpe310LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighZSYmIW8pcmV0dXJuITE7dmFyIG49ITE7dHJ5e3ZhciBpPXt9O2lbcl09ZnVuY3Rpb24oKXtyZXR1cm57bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOm49ITB9fX19LHQoaSl9Y2F0Y2godCl7fXJldHVybiBufX0sMjQ1OTQ6ZnVuY3Rpb24odCl7dmFyIGU9e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNhbGwodCkuc2xpY2UoOCwtMSl9fSw1OTU5MTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big5MDYxMyksbz1uKDI0NTk0KSxpPW4oMjM3MjQpKCJ0b1N0cmluZ1RhZyIpLGE9IkFyZ3VtZW50cyI9PW8oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKTt0LmV4cG9ydHM9cj9vOmZ1bmN0aW9uKHQpe3ZhciBlLG4scjtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLGkpKT9uOmE/byhlKToiT2JqZWN0Ij09KHI9byhlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjpyfX0sOTgxNzk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDg3NTc5KSxvPW4oODY0NzApO3QuZXhwb3J0cz1mdW5jdGlvbigpe2Zvcih2YXIgdD1yKHRoaXMpLGU9byh0LmFkZCksbj0wLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWUuY2FsbCh0LGFyZ3VtZW50c1tuXSk7cmV0dXJuIHR9fSwxNDY2OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big4NzU3OSksbz1uKDg2NDcwKTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT1yKHRoaXMpLG49byhlLmRlbGV0ZSksaT0hMCxhPTAsYz1hcmd1bWVudHMubGVuZ3RoO2E8YzthKyspdD1uLmNhbGwoZSxhcmd1bWVudHNbYV0pLGk9aSYmdDtyZXR1cm4hIWl9fSwxMjkwMTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODY0NzApLG89big0NjEzMCksaT1uKDQxMzM0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsbixhLGMscz1hcmd1bWVudHMubGVuZ3RoLHU9cz4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7cmV0dXJuIHIodGhpcyksKGU9dm9pZCAwIT09dSkmJnIodSksbnVsbD09dD9uZXcgdGhpczoobj1bXSxlPyhhPTAsYz1vKHUscz4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMiksaSh0LChmdW5jdGlvbih0KXtuLnB1c2goYyh0LGErKykpfSkpKTppKHQsbi5wdXNoLG4pLG5ldyB0aGlzKG4pKX19LDI1MDI2OmZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KTt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBuZXcgdGhpcyhlKX19LDY0NTA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM3NjIwKS5mLG89big1MDg2OCksaT1uKDE5MjYpLGE9big0NjEzMCksYz1uKDU5Mzc5KSxzPW4oNDEzMzQpLHU9big0NjA2MSksbD1uKDY3NTM4KSxmPW4oNjI1NTYpLGQ9big5NjAzKS5mYXN0S2V5LHA9big4OTgyNyksaD1wLnNldCx2PXAuZ2V0dGVyRm9yO3QuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24odCxlLG4sdSl7dmFyIGw9dCgoZnVuY3Rpb24odCxyKXtjKHQsbCxlKSxoKHQse3R5cGU6ZSxpbmRleDpvKG51bGwpLGZpcnN0OnZvaWQgMCxsYXN0OnZvaWQgMCxzaXplOjB9KSxmfHwodC5zaXplPTApLG51bGwhPXImJnMocix0W3VdLHQsbil9KSkscD12KGUpLGc9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT1wKHQpLGE9eSh0LGUpO3JldHVybiBhP2EudmFsdWU9bjooaS5sYXN0PWE9e2luZGV4Om89ZChlLCEwKSxrZXk6ZSx2YWx1ZTpuLHByZXZpb3VzOnI9aS5sYXN0LG5leHQ6dm9pZCAwLHJlbW92ZWQ6ITF9LGkuZmlyc3R8fChpLmZpcnN0PWEpLHImJihyLm5leHQ9YSksZj9pLnNpemUrKzp0LnNpemUrKywiRiIhPT1vJiYoaS5pbmRleFtvXT1hKSksdH0seT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9cCh0KSxvPWQoZSk7aWYoIkYiIT09bylyZXR1cm4gci5pbmRleFtvXTtmb3Iobj1yLmZpcnN0O247bj1uLm5leHQpaWYobi5rZXk9PWUpcmV0dXJuIG59O3JldHVybiBpKGwucHJvdG90eXBlLHtjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdD1wKHRoaXMpLGU9dC5pbmRleCxuPXQuZmlyc3Q7bjspbi5yZW1vdmVkPSEwLG4ucHJldmlvdXMmJihuLnByZXZpb3VzPW4ucHJldmlvdXMubmV4dD12b2lkIDApLGRlbGV0ZSBlW24uaW5kZXhdLG49bi5uZXh0O3QuZmlyc3Q9dC5sYXN0PXZvaWQgMCxmP3Quc2l6ZT0wOnRoaXMuc2l6ZT0wfSxkZWxldGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXAoZSkscj15KGUsdCk7aWYocil7dmFyIG89ci5uZXh0LGk9ci5wcmV2aW91cztkZWxldGUgbi5pbmRleFtyLmluZGV4XSxyLnJlbW92ZWQ9ITAsaSYmKGkubmV4dD1vKSxvJiYoby5wcmV2aW91cz1pKSxuLmZpcnN0PT1yJiYobi5maXJzdD1vKSxuLmxhc3Q9PXImJihuLmxhc3Q9aSksZj9uLnNpemUtLTplLnNpemUtLX1yZXR1cm4hIXJ9LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49cCh0aGlzKSxyPWEodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtlPWU/ZS5uZXh0Om4uZmlyc3Q7KWZvcihyKGUudmFsdWUsZS5rZXksdGhpcyk7ZSYmZS5yZW1vdmVkOyllPWUucHJldmlvdXN9LGhhczpmdW5jdGlvbih0KXtyZXR1cm4hIXkodGhpcyx0KX19KSxpKGwucHJvdG90eXBlLG4/e2dldDpmdW5jdGlvbih0KXt2YXIgZT15KHRoaXMsdCk7cmV0dXJuIGUmJmUudmFsdWV9LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiBnKHRoaXMsMD09PXQ/MDp0LGUpfX06e2FkZDpmdW5jdGlvbih0KXtyZXR1cm4gZyh0aGlzLHQ9MD09PXQ/MDp0LHQpfX0pLGYmJnIobC5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcCh0aGlzKS5zaXplfX0pLGx9LHNldFN0cm9uZzpmdW5jdGlvbih0LGUsbil7dmFyIHI9ZSsiIEl0ZXJhdG9yIixvPXYoZSksaT12KHIpO3UodCxlLChmdW5jdGlvbih0LGUpe2godGhpcyx7dHlwZTpyLHRhcmdldDp0LHN0YXRlOm8odCksa2luZDplLGxhc3Q6dm9pZCAwfSl9KSwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9aSh0aGlzKSxlPXQua2luZCxuPXQubGFzdDtuJiZuLnJlbW92ZWQ7KW49bi5wcmV2aW91cztyZXR1cm4gdC50YXJnZXQmJih0Lmxhc3Q9bj1uP24ubmV4dDp0LnN0YXRlLmZpcnN0KT8ia2V5cyI9PWU/e3ZhbHVlOm4ua2V5LGRvbmU6ITF9OiJ2YWx1ZXMiPT1lP3t2YWx1ZTpuLnZhbHVlLGRvbmU6ITF9Ont2YWx1ZTpbbi5rZXksbi52YWx1ZV0sZG9uZTohMX06KHQudGFyZ2V0PXZvaWQgMCx7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KX0pLG4/ImVudHJpZXMiOiJ2YWx1ZXMiLCFuLCEwKSxsKGUpfX19LDcxMzAzOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxOTI2KSxvPW4oOTYwMykuZ2V0V2Vha0RhdGEsaT1uKDg3NTc5KSxhPW4oMTA1OTIpLGM9big1OTM3OSkscz1uKDQxMzM0KSx1PW4oMzAwMjUpLGw9big3NjI5OCksZj1uKDg5ODI3KSxkPWYuc2V0LHA9Zi5nZXR0ZXJGb3IsaD11LmZpbmQsdj11LmZpbmRJbmRleCxnPTAseT1mdW5jdGlvbih0KXtyZXR1cm4gdC5mcm96ZW58fCh0LmZyb3plbj1uZXcgbSl9LG09ZnVuY3Rpb24oKXt0aGlzLmVudHJpZXM9W119LGI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaCh0LmVudHJpZXMsKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPT09ZX0pKX07bS5wcm90b3R5cGU9e2dldDpmdW5jdGlvbih0KXt2YXIgZT1iKHRoaXMsdCk7aWYoZSlyZXR1cm4gZVsxXX0saGFzOmZ1bmN0aW9uKHQpe3JldHVybiEhYih0aGlzLHQpfSxzZXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1iKHRoaXMsdCk7bj9uWzFdPWU6dGhpcy5lbnRyaWVzLnB1c2goW3QsZV0pfSxkZWxldGU6ZnVuY3Rpb24odCl7dmFyIGU9dih0aGlzLmVudHJpZXMsKGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPT09dH0pKTtyZXR1cm5+ZSYmdGhpcy5lbnRyaWVzLnNwbGljZShlLDEpLCEhfmV9fSx0LmV4cG9ydHM9e2dldENvbnN0cnVjdG9yOmZ1bmN0aW9uKHQsZSxuLHUpe3ZhciBmPXQoKGZ1bmN0aW9uKHQscil7Yyh0LGYsZSksZCh0LHt0eXBlOmUsaWQ6ZysrLGZyb3plbjp2b2lkIDB9KSxudWxsIT1yJiZzKHIsdFt1XSx0LG4pfSkpLGg9cChlKSx2PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1oKHQpLGE9byhpKGUpLCEwKTtyZXR1cm4hMD09PWE/eShyKS5zZXQoZSxuKTphW3IuaWRdPW4sdH07cmV0dXJuIHIoZi5wcm90b3R5cGUse2RlbGV0ZTpmdW5jdGlvbih0KXt2YXIgZT1oKHRoaXMpO2lmKCFhKHQpKXJldHVybiExO3ZhciBuPW8odCk7cmV0dXJuITA9PT1uP3koZSkuZGVsZXRlKHQpOm4mJmwobixlLmlkKSYmZGVsZXRlIG5bZS5pZF19LGhhczpmdW5jdGlvbih0KXt2YXIgZT1oKHRoaXMpO2lmKCFhKHQpKXJldHVybiExO3ZhciBuPW8odCk7cmV0dXJuITA9PT1uP3koZSkuaGFzKHQpOm4mJmwobixlLmlkKX19KSxyKGYucHJvdG90eXBlLG4/e2dldDpmdW5jdGlvbih0KXt2YXIgZT1oKHRoaXMpO2lmKGEodCkpe3ZhciBuPW8odCk7cmV0dXJuITA9PT1uP3koZSkuZ2V0KHQpOm4/bltlLmlkXTp2b2lkIDB9fSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdih0aGlzLHQsZSl9fTp7YWRkOmZ1bmN0aW9uKHQpe3JldHVybiB2KHRoaXMsdCwhMCl9fSksZn19fSw4MTk1MTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4OTU1OCksaT1uKDY0NTA0KSxhPW4oOTI5MTMpLGM9big5NjAzKSxzPW4oNDEzMzQpLHU9big1OTM3OSksbD1uKDEwNTkyKSxmPW4oMzIxODcpLGQ9big0Nzk2KSxwPW4oNTExMjgpLGg9bigzMDI3Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgdj0tMSE9PXQuaW5kZXhPZigiTWFwIiksZz0tMSE9PXQuaW5kZXhPZigiV2VhayIpLHk9dj8ic2V0IjoiYWRkIixtPW9bdF0sYj1tJiZtLnByb3RvdHlwZSx4PW0sdz17fSxFPWZ1bmN0aW9uKHQpe3ZhciBlPWJbdF07YShiLHQsImFkZCI9PXQ/ZnVuY3Rpb24odCl7cmV0dXJuIGUuY2FsbCh0aGlzLDA9PT10PzA6dCksdGhpc306ImRlbGV0ZSI9PXQ/ZnVuY3Rpb24odCl7cmV0dXJuIShnJiYhbCh0KSkmJmUuY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJnZXQiPT10P2Z1bmN0aW9uKHQpe3JldHVybiBnJiYhbCh0KT92b2lkIDA6ZS5jYWxsKHRoaXMsMD09PXQ/MDp0KX06ImhhcyI9PXQ/ZnVuY3Rpb24odCl7cmV0dXJuIShnJiYhbCh0KSkmJmUuY2FsbCh0aGlzLDA9PT10PzA6dCl9OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0aGlzLDA9PT10PzA6dCxuKSx0aGlzfSl9O2lmKGkodCwiZnVuY3Rpb24iIT10eXBlb2YgbXx8IShnfHxiLmZvckVhY2gmJiFmKChmdW5jdGlvbigpeyhuZXcgbSkuZW50cmllcygpLm5leHQoKX0pKSkpKXg9bi5nZXRDb25zdHJ1Y3RvcihlLHQsdix5KSxjLlJFUVVJUkVEPSEwO2Vsc2UgaWYoaSh0LCEwKSl7dmFyIGo9bmV3IHgsQz1qW3ldKGc/e306LTAsMSkhPWosaz1mKChmdW5jdGlvbigpe2ouaGFzKDEpfSkpLFM9ZCgoZnVuY3Rpb24odCl7bmV3IG0odCl9KSksTz0hZyYmZigoZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IG0sZT01O2UtLTspdFt5XShlLGUpO3JldHVybiF0LmhhcygtMCl9KSk7U3x8KCh4PWUoKGZ1bmN0aW9uKGUsbil7dShlLHgsdCk7dmFyIHI9aChuZXcgbSxlLHgpO3JldHVybiBudWxsIT1uJiZzKG4sclt5XSxyLHYpLHJ9KSkpLnByb3RvdHlwZT1iLGIuY29uc3RydWN0b3I9eCksKGt8fE8pJiYoRSgiZGVsZXRlIiksRSgiaGFzIiksdiYmRSgiZ2V0IikpLChPfHxDKSYmRSh5KSxnJiZiLmNsZWFyJiZkZWxldGUgYi5jbGVhcn1yZXR1cm4gd1t0XT14LHIoe2dsb2JhbDohMCxmb3JjZWQ6eCE9bX0sdykscCh4LHQpLGd8fG4uc2V0U3Ryb25nKHgsdCx2KSx4fX0sNzQ2ODU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTQ5MDYpLG89big1ODYwNiksaT1uKDUwODY4KSxhPW4oMTA1OTIpLGM9ZnVuY3Rpb24oKXt0aGlzLm9iamVjdD1udWxsLHRoaXMuc3ltYm9sPW51bGwsdGhpcy5wcmltaXRpdmVzPW51bGwsdGhpcy5vYmplY3RzQnlJbmRleD1pKG51bGwpfTtjLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc1t0XXx8KHRoaXNbdF09ZSgpKX0sYy5wcm90b3R5cGUubmV4dD1mdW5jdGlvbih0LGUsbil7dmFyIGk9bj90aGlzLm9iamVjdHNCeUluZGV4W3RdfHwodGhpcy5vYmplY3RzQnlJbmRleFt0XT1uZXcgbyk6dGhpcy5wcmltaXRpdmVzfHwodGhpcy5wcmltaXRpdmVzPW5ldyByKSxhPWkuZ2V0KGUpO3JldHVybiBhfHxpLnNldChlLGE9bmV3IGMpLGF9O3ZhciBzPW5ldyBjO3QuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0LGUsbj1zLHI9YXJndW1lbnRzLmxlbmd0aDtmb3IodD0wO3Q8cjt0KyspYShlPWFyZ3VtZW50c1t0XSkmJihuPW4ubmV4dCh0LGUsITApKTtpZih0aGlzPT09T2JqZWN0JiZuPT09cyl0aHJvdyBUeXBlRXJyb3IoIkNvbXBvc2l0ZSBrZXlzIG11c3QgY29udGFpbiBhIG5vbi1wcmltaXRpdmUgY29tcG9uZW50Iik7Zm9yKHQ9MDt0PHI7dCsrKWEoZT1hcmd1bWVudHNbdF0pfHwobj1uLm5leHQodCxlLCExKSk7cmV0dXJuIG59fSw5OTYyNTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big3NjI5OCksbz1uKDI0NDE1KSxpPW4oOTcyNTcpLGE9bigzNzYyMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW8oZSksYz1hLmYscz1pLmYsdT0wO3U8bi5sZW5ndGg7dSsrKXt2YXIgbD1uW3VdO3IodCxsKXx8Yyh0LGwscyhlLGwpKX19fSw5MzkxNTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzcyNCkoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPS8uLzt0cnl7Ii8uLyJbdF0oZSl9Y2F0Y2gobil7dHJ5e3JldHVybiBlW3JdPSExLCIvLi8iW3RdKGUpfWNhdGNoKHQpe319cmV0dXJuITF9fSw3MTYwODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMjE4Nyk7dC5leHBvcnRzPSFyKChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSkpfSwyNzAwNDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTYyMzgpLG89big4NjQ3MCksaT1uKDg3NTc5KSxhPW4oNTA4NjgpLGM9big2Njk3MSkscz1uKDE5MjYpLHU9bigyMzcyNCksbD1uKDg5ODI3KSxmPW4oNzcwMSkoIlByb21pc2UiKSxkPWwuc2V0LHA9bC5nZXQsaD11KCJ0b1N0cmluZ1RhZyIpLHY9ZnVuY3Rpb24odCl7dmFyIGU9cCh0aGlzKS5pdGVyYXRvcixuPWUucmV0dXJuO3JldHVybiB2b2lkIDA9PT1uP2YucmVzb2x2ZSh7ZG9uZTohMCx2YWx1ZTp0fSk6aShuLmNhbGwoZSx0KSl9LGc9ZnVuY3Rpb24odCl7dmFyIGU9cCh0aGlzKS5pdGVyYXRvcixuPWUudGhyb3c7cmV0dXJuIHZvaWQgMD09PW4/Zi5yZWplY3QodCk6bi5jYWxsKGUsdCl9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3QubmV4dD1vKHQuaXRlcmF0b3IubmV4dCksdC5kb25lPSExLGQodGhpcyx0KX07cmV0dXJuIG4ucHJvdG90eXBlPXMoYShyLkFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSx7bmV4dDpmdW5jdGlvbihlKXt2YXIgbj1wKHRoaXMpO2lmKG4uZG9uZSlyZXR1cm4gZi5yZXNvbHZlKHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pO3RyeXtyZXR1cm4gZi5yZXNvbHZlKGkodC5jYWxsKG4sZSxmKSkpfWNhdGNoKHQpe3JldHVybiBmLnJlamVjdCh0KX19LHJldHVybjp2LHRocm93Omd9KSxlfHxjKG4ucHJvdG90eXBlLGgsIkdlbmVyYXRvciIpLG59fSwzMTM1MTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big3MDEzMiksbz0vIi9nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixpKXt2YXIgYT1TdHJpbmcocih0KSksYz0iPCIrZTtyZXR1cm4iIiE9PW4mJihjKz0iICIrbisnPSInK1N0cmluZyhpKS5yZXBsYWNlKG8sIiZxdW90OyIpKyciJyksYysiPiIrYSsiPC8iK2UrIj4ifX0sNzEyMDE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDY0MTc2KS5JdGVyYXRvclByb3RvdHlwZSxvPW4oNTA4NjgpLGk9bigxNDIwOSksYT1uKDUxMTI4KSxjPW4oMTIzNSkscz1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciB1PWUrIiBJdGVyYXRvciI7cmV0dXJuIHQucHJvdG90eXBlPW8ocix7bmV4dDppKDEsbil9KSxhKHQsdSwhMSwhMCksY1t1XT1zLHR9fSw4ODA3OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1NjIzOCksbz1uKDg2NDcwKSxpPW4oODc1NzkpLGE9big1MDg2OCksYz1uKDY2OTcxKSxzPW4oMTkyNiksdT1uKDIzNzI0KSxsPW4oODk4MjcpLGY9bC5zZXQsZD1sLmdldCxwPXUoInRvU3RyaW5nVGFnIiksaD1mdW5jdGlvbih0KXt2YXIgZT1kKHRoaXMpLml0ZXJhdG9yLG49ZS5yZXR1cm47cmV0dXJuIHZvaWQgMD09PW4/e2RvbmU6ITAsdmFsdWU6dH06aShuLmNhbGwoZSx0KSl9LHY9ZnVuY3Rpb24odCl7dmFyIGU9ZCh0aGlzKS5pdGVyYXRvcixuPWUudGhyb3c7aWYodm9pZCAwPT09bil0aHJvdyB0O3JldHVybiBuLmNhbGwoZSx0KX07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7dC5uZXh0PW8odC5pdGVyYXRvci5uZXh0KSx0LmRvbmU9ITEsZih0aGlzLHQpfTtyZXR1cm4gbi5wcm90b3R5cGU9cyhhKHIuSXRlcmF0b3IucHJvdG90eXBlKSx7bmV4dDpmdW5jdGlvbigpe3ZhciBlPWQodGhpcyksbj1lLmRvbmU/dm9pZCAwOnQuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybntkb25lOmUuZG9uZSx2YWx1ZTpufX0scmV0dXJuOmgsdGhyb3c6dn0pLGV8fGMobi5wcm90b3R5cGUscCwiR2VuZXJhdG9yIiksbn19LDY2OTcxOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYyNTU2KSxvPW4oMzc2MjApLGk9bigxNDIwOSk7dC5leHBvcnRzPXI/ZnVuY3Rpb24odCxlLG4pe3JldHVybiBvLmYodCxlLGkoMSxuKSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1uLHR9fSwxNDIwOTpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSw1ODgxMDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTM0OTgpLG89bigzNzYyMCksaT1uKDE0MjA5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBhPXIoZSk7YSBpbiB0P28uZih0LGEsaSgwLG4pKTp0W2FdPW59fSw3OTE2NzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzIxODcpLG89bigyNjU3Mykuc3RhcnQsaT1NYXRoLmFicyxhPURhdGUucHJvdG90eXBlLGM9YS5nZXRUaW1lLHM9YS50b0lTT1N0cmluZzt0LmV4cG9ydHM9cigoZnVuY3Rpb24oKXtyZXR1cm4iMDM4NS0wNy0yNVQwNzowNjozOS45OTlaIiE9cy5jYWxsKG5ldyBEYXRlKC01MDAwMDAwMDAwMDAwMSkpfSkpfHwhcigoZnVuY3Rpb24oKXtzLmNhbGwobmV3IERhdGUoTmFOKSl9KSk/ZnVuY3Rpb24oKXtpZighaXNGaW5pdGUoYy5jYWxsKHRoaXMpKSl0aHJvdyBSYW5nZUVycm9yKCJJbnZhbGlkIHRpbWUgdmFsdWUiKTt2YXIgdD10aGlzLGU9dC5nZXRVVENGdWxsWWVhcigpLG49dC5nZXRVVENNaWxsaXNlY29uZHMoKSxyPWU8MD8iLSI6ZT45OTk5PyIrIjoiIjtyZXR1cm4gcitvKGkoZSkscj82OjQsMCkrIi0iK28odC5nZXRVVENNb250aCgpKzEsMiwwKSsiLSIrbyh0LmdldFVUQ0RhdGUoKSwyLDApKyJUIitvKHQuZ2V0VVRDSG91cnMoKSwyLDApKyI6IitvKHQuZ2V0VVRDTWludXRlcygpLDIsMCkrIjoiK28odC5nZXRVVENTZWNvbmRzKCksMiwwKSsiLiIrbyhuLDMsMCkrIloifTpzfSw3Njk3NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODc1NzkpLG89big1MzQ5OCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT09dCYmIm51bWJlciIhPT10JiYiZGVmYXVsdCIhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb3JyZWN0IGhpbnQiKTtyZXR1cm4gbyhyKHRoaXMpLCJudW1iZXIiIT09dCl9fSw0NjA2MTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big3MTIwMSksaT1uKDY0OTY1KSxhPW4oNzE4NDIpLGM9big1MTEyOCkscz1uKDY2OTcxKSx1PW4oOTI5MTMpLGw9bigyMzcyNCksZj1uKDY1NjcyKSxkPW4oMTIzNSkscD1uKDY0MTc2KSxoPXAuSXRlcmF0b3JQcm90b3R5cGUsdj1wLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMsZz1sKCJpdGVyYXRvciIpLHk9ImtleXMiLG09InZhbHVlcyIsYj0iZW50cmllcyIseD1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxwLHcsRSl7byhuLGUsbCk7dmFyIGosQyxrLFM9ZnVuY3Rpb24odCl7aWYodD09PXAmJk0pcmV0dXJuIE07aWYoIXYmJnQgaW4gSSlyZXR1cm4gSVt0XTtzd2l0Y2godCl7Y2FzZSB5OmNhc2UgbTpjYXNlIGI6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsdCl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzKX19LE89ZSsiIEl0ZXJhdG9yIixBPSExLEk9dC5wcm90b3R5cGUsVD1JW2ddfHxJWyJAQGl0ZXJhdG9yIl18fHAmJklbcF0sTT0hdiYmVHx8UyhwKSxfPSJBcnJheSI9PWUmJkkuZW50cmllc3x8VDtpZihfJiYoaj1pKF8uY2FsbChuZXcgdCkpLGghPT1PYmplY3QucHJvdG90eXBlJiZqLm5leHQmJihmfHxpKGopPT09aHx8KGE/YShqLGgpOiJmdW5jdGlvbiIhPXR5cGVvZiBqW2ddJiZzKGosZyx4KSksYyhqLE8sITAsITApLGYmJihkW09dPXgpKSkscD09bSYmVCYmVC5uYW1lIT09bSYmKEE9ITAsTT1mdW5jdGlvbigpe3JldHVybiBULmNhbGwodGhpcyl9KSxmJiYhRXx8SVtnXT09PU18fHMoSSxnLE0pLGRbZV09TSxwKWlmKEM9e3ZhbHVlczpTKG0pLGtleXM6dz9NOlMoeSksZW50cmllczpTKGIpfSxFKWZvcihrIGluIEMpKHZ8fEF8fCEoayBpbiBJKSkmJnUoSSxrLENba10pO2Vsc2Ugcih7dGFyZ2V0OmUscHJvdG86ITAsZm9yY2VkOnZ8fEF9LEMpO3JldHVybiBDfX0sOTIyNzU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTYyMzgpLG89big3NjI5OCksaT1uKDczOTE2KSxhPW4oMzc2MjApLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIuU3ltYm9sfHwoci5TeW1ib2w9e30pO28oZSx0KXx8YShlLHQse3ZhbHVlOmkuZih0KX0pfX0sNjI1NTY6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzIxODcpO3QuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pKX0sMTkyMzpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OTU1OCksbz1uKDEwNTkyKSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LDQ3MDk0OmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LDU5MTM1OmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1bImNvbnN0cnVjdG9yIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIiwidmFsdWVPZiJdfSwxNDA0NDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OTU1OCksbz1uKDk3MjU3KS5mLGk9big2Njk3MSksYT1uKDkyOTEzKSxjPW4oOTgyNjkpLHM9big5OTYyNSksdT1uKDY0NTA0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixsLGYsZCxwLGg9dC50YXJnZXQsdj10Lmdsb2JhbCxnPXQuc3RhdDtpZihuPXY/cjpnP3JbaF18fGMoaCx7fSk6KHJbaF18fHt9KS5wcm90b3R5cGUpZm9yKGwgaW4gZSl7aWYoZD1lW2xdLGY9dC5ub1RhcmdldEdldD8ocD1vKG4sbCkpJiZwLnZhbHVlOm5bbF0sIXUodj9sOmgrKGc/Ii4iOiIjIikrbCx0LmZvcmNlZCkmJnZvaWQgMCE9PWYpe2lmKHR5cGVvZiBkPT10eXBlb2YgZiljb250aW51ZTtzKGQsZil9KHQuc2hhbXx8ZiYmZi5zaGFtKSYmaShkLCJzaGFtIiwhMCksYShuLGwsZCx0KX19fSwzMjE4NzpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX19LDM1ODYwOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2Njk3MSksbz1uKDkyOTEzKSxpPW4oMzIxODcpLGE9bigyMzcyNCksYz1uKDM4NTk4KSxzPWEoInNwZWNpZXMiKSx1PSFpKChmdW5jdGlvbigpe3ZhciB0PS8uLztyZXR1cm4gdC5leGVjPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHQuZ3JvdXBzPXthOiI3In0sdH0sIjciIT09IiIucmVwbGFjZSh0LCIkPGE+Iil9KSksbD0haSgoZnVuY3Rpb24oKXt2YXIgdD0vKD86KS8sZT10LmV4ZWM7dC5leGVjPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgbj0iYWIiLnNwbGl0KHQpO3JldHVybiAyIT09bi5sZW5ndGh8fCJhIiE9PW5bMF18fCJiIiE9PW5bMV19KSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGYpe3ZhciBkPWEodCkscD0haSgoZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gZVtkXT1mdW5jdGlvbigpe3JldHVybiA3fSw3IT0iIlt0XShlKX0pKSxoPXAmJiFpKChmdW5jdGlvbigpe3ZhciBlPSExLG49L2EvO3JldHVybiJzcGxpdCI9PT10JiYoKG49e30pLmNvbnN0cnVjdG9yPXt9LG4uY29uc3RydWN0b3Jbc109ZnVuY3Rpb24oKXtyZXR1cm4gbn0sbi5mbGFncz0iIixuW2RdPS8uL1tkXSksbi5leGVjPWZ1bmN0aW9uKCl7cmV0dXJuIGU9ITAsbnVsbH0sbltkXSgiIiksIWV9KSk7aWYoIXB8fCFofHwicmVwbGFjZSI9PT10JiYhdXx8InNwbGl0Ij09PXQmJiFsKXt2YXIgdj0vLi9bZF0sZz1uKGQsIiJbdF0sKGZ1bmN0aW9uKHQsZSxuLHIsbyl7cmV0dXJuIGUuZXhlYz09PWM/cCYmIW8/e2RvbmU6ITAsdmFsdWU6di5jYWxsKGUsbixyKX06e2RvbmU6ITAsdmFsdWU6dC5jYWxsKG4sZSxyKX06e2RvbmU6ITF9fSkpLHk9Z1swXSxtPWdbMV07byhTdHJpbmcucHJvdG90eXBlLHQseSksbyhSZWdFeHAucHJvdG90eXBlLGQsMj09ZT9mdW5jdGlvbih0LGUpe3JldHVybiBtLmNhbGwodCx0aGlzLGUpfTpmdW5jdGlvbih0KXtyZXR1cm4gbS5jYWxsKHQsdGhpcyl9KSxmJiZyKFJlZ0V4cC5wcm90b3R5cGVbZF0sInNoYW0iLCEwKX19fSw4MDY2NTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjE5OSksbz1uKDI3ODg0KSxpPW4oNDYxMzApLGE9ZnVuY3Rpb24odCxlLG4sYyxzLHUsbCxmKXtmb3IodmFyIGQscD1zLGg9MCx2PSEhbCYmaShsLGYsMyk7aDxjOyl7aWYoaCBpbiBuKXtpZihkPXY/dihuW2hdLGgsZSk6bltoXSx1PjAmJnIoZCkpcD1hKHQsZSxkLG8oZC5sZW5ndGgpLHAsdS0xKS0xO2Vsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIkV4Y2VlZCB0aGUgYWNjZXB0YWJsZSBhcnJheSBsZW5ndGgiKTt0W3BdPWR9cCsrfWgrK31yZXR1cm4gcH07dC5leHBvcnRzPWF9LDQ3ODEyOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2NTY3Miksbz1uKDg5NTU4KSxpPW4oMzIxODcpO3QuZXhwb3J0cz1yfHwhaSgoZnVuY3Rpb24oKXt2YXIgdD1NYXRoLnJhbmRvbSgpO19fZGVmaW5lU2V0dGVyX18uY2FsbChudWxsLHQsKGZ1bmN0aW9uKCl7fSkpLGRlbGV0ZSBvW3RdfSkpfSw1MjEyOTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMjE4Nyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKChmdW5jdGlvbigpe3ZhciBlPSIiW3RdKCciJyk7cmV0dXJuIGUhPT1lLnRvTG93ZXJDYXNlKCl8fGUuc3BsaXQoJyInKS5sZW5ndGg+M30pKX19LDg0NzU0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMTg3KSxvPW4oNTAwNTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcigoZnVuY3Rpb24oKXtyZXR1cm4hIW9bdF0oKXx8IuKAi8KF4aCOIiE9IuKAi8KF4aCOIlt0XSgpfHxvW3RdLm5hbWUhPT10fSkpfX0sNzQ1MjA6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzIxODcpO3QuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pKX0sNzM3Mzk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDg2NDcwKSxvPW4oMTA1OTIpLGk9W10uc2xpY2UsYT17fSxjPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/YyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSw2NjkyMDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Mzg5MCksbz1uKDIzNzI0KSgiYXN5bmNJdGVyYXRvciIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10W29dO3JldHVybiB2b2lkIDA9PT1lP3IodCk6ZX19LDc3MDE6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTYyMzgpLG89big4OTU1OCksaT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9pKHJbdF0pfHxpKG9bdF0pOnJbdF0mJnJbdF1bZV18fG9bdF0mJm9bdF1bZV19fSw3Mzg5MDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OTU5MSksbz1uKDEyMzUpLGk9bigyMzcyNCkoIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpcmV0dXJuIHRbaV18fHRbIkBAaXRlcmF0b3IiXXx8b1tyKHQpXX19LDMxMDc0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg3NTc5KSxvPW4oNzM4OTApO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gcihlLmNhbGwodCkpfX0sNDE5ODk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjU2NzIpLG89bigzMTA3NCk7dC5leHBvcnRzPXI/bzpmdW5jdGlvbih0KXtyZXR1cm4gTWFwLnByb3RvdHlwZS5lbnRyaWVzLmNhbGwodCl9fSw0MTQ3NTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big2NTY3Miksbz1uKDMxMDc0KTt0LmV4cG9ydHM9cj9vOmZ1bmN0aW9uKHQpe3JldHVybiBTZXQucHJvdG90eXBlLnZhbHVlcy5jYWxsKHQpfX0sODk1NTg6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lk1hdGg9PU1hdGgmJnR9O3QuZXhwb3J0cz1yKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcyl8fHIoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyl8fHIoIm9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmKXx8cigib2JqZWN0Ij09dHlwZW9mIG4uZyYmbi5nKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0sNzYyOTg6ZnVuY3Rpb24odCl7dmFyIGU9e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4pfX0sMjMwNzA6ZnVuY3Rpb24odCl7dC5leHBvcnRzPXt9fSw4MzYyMDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OTU1OCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ci5jb25zb2xlO24mJm4uZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD9uLmVycm9yKHQpOm4uZXJyb3IodCxlKSl9fSw1MTU3MTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big3NzAxKTt0LmV4cG9ydHM9cigiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiKX0sNjI3OTk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjI1NTYpLG89bigzMjE4NyksaT1uKDE5MjMpO3QuZXhwb3J0cz0hciYmIW8oKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSl9LDkwNzI1OmZ1bmN0aW9uKHQpe3ZhciBlPTEvMCxuPU1hdGguYWJzLHI9TWF0aC5wb3csbz1NYXRoLmZsb29yLGk9TWF0aC5sb2csYT1NYXRoLkxOMjt0LmV4cG9ydHM9e3BhY2s6ZnVuY3Rpb24odCxjLHMpe3ZhciB1LGwsZixkPW5ldyBBcnJheShzKSxwPTgqcy1jLTEsaD0oMTw8cCktMSx2PWg+PjEsZz0yMz09PWM/cigyLC0yNCktcigyLC03Nyk6MCx5PXQ8MHx8MD09PXQmJjEvdDwwPzE6MCxtPTA7Zm9yKCh0PW4odCkpIT10fHx0PT09ZT8obD10IT10PzE6MCx1PWgpOih1PW8oaSh0KS9hKSx0KihmPXIoMiwtdSkpPDEmJih1LS0sZio9MiksKHQrPXUrdj49MT9nL2Y6ZypyKDIsMS12KSkqZj49MiYmKHUrKyxmLz0yKSx1K3Y+PWg/KGw9MCx1PWgpOnUrdj49MT8obD0odCpmLTEpKnIoMixjKSx1Kz12KToobD10KnIoMix2LTEpKnIoMixjKSx1PTApKTtjPj04O2RbbSsrXT0yNTUmbCxsLz0yNTYsYy09OCk7Zm9yKHU9dTw8Y3xsLHArPWM7cD4wO2RbbSsrXT0yNTUmdSx1Lz0yNTYscC09OCk7cmV0dXJuIGRbLS1tXXw9MTI4KnksZH0sdW5wYWNrOmZ1bmN0aW9uKHQsbil7dmFyIG8saT10Lmxlbmd0aCxhPTgqaS1uLTEsYz0oMTw8YSktMSxzPWM+PjEsdT1hLTcsbD1pLTEsZj10W2wtLV0sZD0xMjcmZjtmb3IoZj4+PTc7dT4wO2Q9MjU2KmQrdFtsXSxsLS0sdS09OCk7Zm9yKG89ZCYoMTw8LXUpLTEsZD4+PS11LHUrPW47dT4wO289MjU2Km8rdFtsXSxsLS0sdS09OCk7aWYoMD09PWQpZD0xLXM7ZWxzZXtpZihkPT09YylyZXR1cm4gbz9OYU46Zj8tMS8wOmU7bys9cigyLG4pLGQtPXN9cmV0dXJuKGY/LTE6MSkqbypyKDIsZC1uKX19fSwyNDk4OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMTg3KSxvPW4oMjQ1OTQpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKHQpe3JldHVybiJTdHJpbmciPT1vKHQpP2kuY2FsbCh0LCIiKTpPYmplY3QodCl9Ok9iamVjdH0sMzAyNzI6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTA1OTIpLG89big3MTg0Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxhO3JldHVybiBvJiYiZnVuY3Rpb24iPT10eXBlb2YoaT1lLmNvbnN0cnVjdG9yKSYmaSE9PW4mJnIoYT1pLnByb3RvdHlwZSkmJmEhPT1uLnByb3RvdHlwZSYmbyh0LGEpLHR9fSw3Njc3MzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNDc0MSksbz1GdW5jdGlvbi50b1N0cmluZzsiZnVuY3Rpb24iIT10eXBlb2Ygci5pbnNwZWN0U291cmNlJiYoci5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwodCl9KSx0LmV4cG9ydHM9ci5pbnNwZWN0U291cmNlfSw5NjAzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzMDcwKSxvPW4oMTA1OTIpLGk9big3NjI5OCksYT1uKDM3NjIwKS5mLGM9big2NzI5KSxzPW4oNzQ1MjApLHU9YygibWV0YSIpLGw9MCxmPU9iamVjdC5pc0V4dGVuc2libGV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LGQ9ZnVuY3Rpb24odCl7YSh0LHUse3ZhbHVlOntvYmplY3RJRDoiTyIrICsrbCx3ZWFrRGF0YTp7fX19KX0scD10LmV4cG9ydHM9e1JFUVVJUkVEOiExLGZhc3RLZXk6ZnVuY3Rpb24odCxlKXtpZighbyh0KSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHQ/dDooInN0cmluZyI9PXR5cGVvZiB0PyJTIjoiUCIpK3Q7aWYoIWkodCx1KSl7aWYoIWYodCkpcmV0dXJuIkYiO2lmKCFlKXJldHVybiJFIjtkKHQpfXJldHVybiB0W3VdLm9iamVjdElEfSxnZXRXZWFrRGF0YTpmdW5jdGlvbih0LGUpe2lmKCFpKHQsdSkpe2lmKCFmKHQpKXJldHVybiEwO2lmKCFlKXJldHVybiExO2QodCl9cmV0dXJuIHRbdV0ud2Vha0RhdGF9LG9uRnJlZXplOmZ1bmN0aW9uKHQpe3JldHVybiBzJiZwLlJFUVVJUkVEJiZmKHQpJiYhaSh0LHUpJiZkKHQpLHR9fTtyW3VdPSEwfSw4OTgyNzpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9bigxOTU5MSksYz1uKDg5NTU4KSxzPW4oMTA1OTIpLHU9big2Njk3MSksbD1uKDc2Mjk4KSxmPW4oODMxOTcpLGQ9bigyMzA3MCkscD1jLldlYWtNYXA7aWYoYSl7dmFyIGg9bmV3IHAsdj1oLmdldCxnPWguaGFzLHk9aC5zZXQ7cj1mdW5jdGlvbih0LGUpe3JldHVybiB5LmNhbGwoaCx0LGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChoLHQpfHx7fX0saT1mdW5jdGlvbih0KXtyZXR1cm4gZy5jYWxsKGgsdCl9fWVsc2V7dmFyIG09Zigic3RhdGUiKTtkW21dPSEwLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0LG0sZSksZX0sbz1mdW5jdGlvbih0KXtyZXR1cm4gbCh0LG0pP3RbbV06e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKX19dC5leHBvcnRzPXtzZXQ6cixnZXQ6byxoYXM6aSxlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpP28odCk6cih0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbjtpZighcyhlKXx8KG49byhlKSkudHlwZSE9PXQpdGhyb3cgVHlwZUVycm9yKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrdCsiIHJlcXVpcmVkIik7cmV0dXJuIG59fX19LDQ0OTg0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzNzI0KSxvPW4oMTIzNSksaT1yKCJpdGVyYXRvciIpLGE9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmKG8uQXJyYXk9PT10fHxhW2ldPT09dCl9fSw2MTk5OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0NTk0KTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LDY0NTA0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMTg3KSxvPS8jfFwucHJvdG90eXBlXC4vLGk9ZnVuY3Rpb24odCxlKXt2YXIgbj1jW2EodCldO3JldHVybiBuPT11fHxuIT1zJiYoImZ1bmN0aW9uIj09dHlwZW9mIGU/cihlKTohIWUpfSxhPWkubm9ybWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCkucmVwbGFjZShvLCIuIikudG9Mb3dlckNhc2UoKX0sYz1pLmRhdGE9e30scz1pLk5BVElWRT0iTiIsdT1pLlBPTFlGSUxMPSJQIjt0LmV4cG9ydHM9aX0sMzgyNTc6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTA1OTIpLG89TWF0aC5mbG9vcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIXIodCkmJmlzRmluaXRlKHQpJiZvKHQpPT09dH19LDIxMjMxOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM5NDc2KTt0LmV4cG9ydHM9LyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHIpfSwxMDU5MjpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10OiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0sNjU2NzI6ZnVuY3Rpb24odCl7dC5leHBvcnRzPSExfSw0MzIyMzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDU5Miksbz1uKDI0NTk0KSxpPW4oMjM3MjQpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gcih0KSYmKHZvaWQgMCE9PShlPXRbaV0pPyEhZToiUmVnRXhwIj09byh0KSl9fSw0MTMzNDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NzU3OSksbz1uKDQ0OTg0KSxpPW4oMjc4ODQpLGE9big0NjEzMCksYz1uKDczODkwKSxzPW4oMTIyNzgpLHU9ZnVuY3Rpb24odCxlKXt0aGlzLnN0b3BwZWQ9dCx0aGlzLnJlc3VsdD1lfTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGwsZil7dmFyIGQscCxoLHYsZyx5LG0sYj1hKGUsbixsPzI6MSk7aWYoZilkPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YocD1jKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKHApKXtmb3IoaD0wLHY9aSh0Lmxlbmd0aCk7dj5oO2grKylpZigoZz1sP2IocihtPXRbaF0pWzBdLG1bMV0pOmIodFtoXSkpJiZnIGluc3RhbmNlb2YgdSlyZXR1cm4gZztyZXR1cm4gbmV3IHUoITEpfWQ9cC5jYWxsKHQpfWZvcih5PWQubmV4dDshKG09eS5jYWxsKGQpKS5kb25lOylpZigib2JqZWN0Ij09dHlwZW9mKGc9cyhkLGIsbS52YWx1ZSxsKSkmJmcmJmcgaW5zdGFuY2VvZiB1KXJldHVybiBnO3JldHVybiBuZXcgdSghMSl9KS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdSghMCx0KX19LDY0MTc2OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGE9big2NDk2NSksYz1uKDY2OTcxKSxzPW4oNzYyOTgpLHU9bigyMzcyNCksbD1uKDY1NjcyKSxmPXUoIml0ZXJhdG9yIiksZD0hMTtbXS5rZXlzJiYoIm5leHQiaW4oaT1bXS5rZXlzKCkpPyhvPWEoYShpKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmKHI9byk6ZD0hMCksbnVsbD09ciYmKHI9e30pLGx8fHMocixmKXx8YyhyLGYsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksdC5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTpyLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6ZH19LDEyMzU6ZnVuY3Rpb24odCl7dC5leHBvcnRzPXt9fSw0NzkyNzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODc1NzkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLG89cih0aGlzKSxpPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgaSl0aHJvdyBUeXBlRXJyb3IoIkF0IGxlYXN0IG9uZSBjYWxsYmFjayByZXF1aXJlZCIpO3JldHVybiBvLmhhcyh0KT8obj1vLmdldCh0KSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZShuKSxvLnNldCh0LG4pKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGkmJihuPWkoKSxvLnNldCh0LG4pKSxufX0sNzI5NzA6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5leHBtMSxuPU1hdGguZXhwO3QuZXhwb3J0cz0hZXx8ZSgxMCk+MjIwMjUuNDY1Nzk0ODA2NzE4fHxlKDEwKTwyMjAyNS40NjU3OTQ4MDY3MTh8fC0yZS0xNyE9ZSgtMmUtMTcpP2Z1bmN0aW9uKHQpe3JldHVybiAwPT0odD0rdCk/dDp0Pi0xZS02JiZ0PDFlLTY/dCt0KnQvMjpuKHQpLTF9OmV9LDUzMjUxOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM4Nzg3KSxvPU1hdGguYWJzLGk9TWF0aC5wb3csYT1pKDIsLTUyKSxjPWkoMiwtMjMpLHM9aSgyLDEyNykqKDItYyksdT1pKDIsLTEyNik7dC5leHBvcnRzPU1hdGguZnJvdW5kfHxmdW5jdGlvbih0KXt2YXIgZSxuLGk9byh0KSxsPXIodCk7cmV0dXJuIGk8dT9sKihpL3UvYysxL2EtMS9hKSp1KmM6KG49KGU9KDErYy9hKSppKS0oZS1pKSk+c3x8biE9bj9sKigxLzApOmwqbn19LDIxOTMyOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgubG9nO3QuZXhwb3J0cz1NYXRoLmxvZzFwfHxmdW5jdGlvbih0KXtyZXR1cm4odD0rdCk+LTFlLTgmJnQ8MWUtOD90LXQqdC8yOmUoMSt0KX19LDc3NDI6ZnVuY3Rpb24odCl7dC5leHBvcnRzPU1hdGguc2NhbGV8fGZ1bmN0aW9uKHQsZSxuLHIsbyl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RofHx0IT10fHxlIT1lfHxuIT1ufHxyIT1yfHxvIT1vP05hTjp0PT09MS8wfHx0PT09LTEvMD90Oih0LWUpKihvLXIpLyhuLWUpK3J9fSwzODc4NzpmdW5jdGlvbih0KXt0LmV4cG9ydHM9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gMD09KHQ9K3QpfHx0IT10P3Q6dDwwPy0xOjF9fSw2NTU1NTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEsYyxzLHUsbCxmPW4oODk1NTgpLGQ9big5NzI1NykuZixwPW4oMjQ1OTQpLGg9bigyMTc0NCkuc2V0LHY9bigyMTIzMSksZz1mLk11dGF0aW9uT2JzZXJ2ZXJ8fGYuV2ViS2l0TXV0YXRpb25PYnNlcnZlcix5PWYucHJvY2VzcyxtPWYuUHJvbWlzZSxiPSJwcm9jZXNzIj09cCh5KSx4PWQoZiwicXVldWVNaWNyb3Rhc2siKSx3PXgmJngudmFsdWU7d3x8KHI9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihiJiYodD15LmRvbWFpbikmJnQuZXhpdCgpO287KXtlPW8uZm4sbz1vLm5leHQ7dHJ5e2UoKX1jYXRjaCh0KXt0aHJvdyBvP2EoKTppPXZvaWQgMCx0fX1pPXZvaWQgMCx0JiZ0LmVudGVyKCl9LGI/YT1mdW5jdGlvbigpe3kubmV4dFRpY2socil9OmcmJiF2PyhjPSEwLHM9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpLG5ldyBnKHIpLm9ic2VydmUocyx7Y2hhcmFjdGVyRGF0YTohMH0pLGE9ZnVuY3Rpb24oKXtzLmRhdGE9Yz0hY30pOm0mJm0ucmVzb2x2ZT8odT1tLnJlc29sdmUodm9pZCAwKSxsPXUudGhlbixhPWZ1bmN0aW9uKCl7bC5jYWxsKHUscil9KTphPWZ1bmN0aW9uKCl7aC5jYWxsKGYscil9KSx0LmV4cG9ydHM9d3x8ZnVuY3Rpb24odCl7dmFyIGU9e2ZuOnQsbmV4dDp2b2lkIDB9O2kmJihpLm5leHQ9ZSksb3x8KG89ZSxhKCkpLGk9ZX19LDM5NDU3OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5NTU4KTt0LmV4cG9ydHM9ci5Qcm9taXNlfSw5MDE0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMTg3KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcigoZnVuY3Rpb24oKXtyZXR1cm4hU3RyaW5nKFN5bWJvbCgpKX0pKX0sNTc1OTc6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzIxODcpLG89bigyMzcyNCksaT1uKDY1NjcyKSxhPW8oIml0ZXJhdG9yIik7dC5leHBvcnRzPSFyKChmdW5jdGlvbigpe3ZhciB0PW5ldyBVUkwoImI/YT0xJmI9MiZjPTMiLCJodHRwOi8vYSIpLGU9dC5zZWFyY2hQYXJhbXMsbj0iIjtyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGUuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtlLmRlbGV0ZSgiYiIpLG4rPXIrdH0pKSxpJiYhdC50b0pTT058fCFlLnNvcnR8fCJodHRwOi8vYS9jJTIwZD9hPTEmYz0zIiE9PXQuaHJlZnx8IjMiIT09ZS5nZXQoImMiKXx8ImE9MSIhPT1TdHJpbmcobmV3IFVSTFNlYXJjaFBhcmFtcygiP2E9MSIpKXx8IWVbYV18fCJhIiE9PW5ldyBVUkwoImh0dHBzOi8vYUBiIikudXNlcm5hbWV8fCJiIiE9PW5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygiYT1iIikpLmdldCgiYSIpfHwieG4tLWUxYXliYyIhPT1uZXcgVVJMKCJodHRwOi8v0YLQtdGB0YIiKS5ob3N0fHwiIyVEMCVCMSIhPT1uZXcgVVJMKCJodHRwOi8vYSPQsSIpLmhhc2h8fCJhMWMzIiE9PW58fCJ4IiE9PW5ldyBVUkwoImh0dHA6Ly94Iix2b2lkIDApLmhvc3R9KSl9LDE5NTkxOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5NTU4KSxvPW4oNzY3NzMpLGk9ci5XZWFrTWFwO3QuZXhwb3J0cz0iZnVuY3Rpb24iPT10eXBlb2YgaSYmL25hdGl2ZSBjb2RlLy50ZXN0KG8oaSkpfSw4MzA4MzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODY0NzApLG89ZnVuY3Rpb24odCl7dmFyIGUsbjt0aGlzLnByb21pc2U9bmV3IHQoKGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pKSx0aGlzLnJlc29sdmU9cihlKSx0aGlzLnJlamVjdD1yKG4pfTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8odCl9fSw5OTM0NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzIyMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTtyZXR1cm4gdH19LDg5NTQyOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5NTU4KS5pc0Zpbml0ZTt0LmV4cG9ydHM9TnVtYmVyLmlzRmluaXRlfHxmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnIodCl9fSw3ODY4NTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjI1NTYpLG89bigzMjE4NyksaT1uKDI1NTA3KSxhPW4oNTY5OTEpLGM9big0MTYyOCkscz1uKDE5MjA5KSx1PW4oMjQ5OCksbD1PYmplY3QuYXNzaWduLGY9T2JqZWN0LmRlZmluZVByb3BlcnR5O3QuZXhwb3J0cz0hbHx8bygoZnVuY3Rpb24oKXtpZihyJiYxIT09bCh7YjoxfSxsKGYoe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2YodGhpcywiYiIse3ZhbHVlOjMsZW51bWVyYWJsZTohMX0pfX0pLHtiOjJ9KSkuYilyZXR1cm4hMDt2YXIgdD17fSxlPXt9LG49U3ltYm9sKCksbz0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiB0W25dPTcsby5zcGxpdCgiIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVt0XT10fSkpLDchPWwoe30sdClbbl18fGkobCh7fSxlKSkuam9pbigiIikhPW99KSk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49cyh0KSxvPWFyZ3VtZW50cy5sZW5ndGgsbD0xLGY9YS5mLGQ9Yy5mO28+bDspZm9yKHZhciBwLGg9dShhcmd1bWVudHNbbCsrXSksdj1mP2koaCkuY29uY2F0KGYoaCkpOmkoaCksZz12Lmxlbmd0aCx5PTA7Zz55OylwPXZbeSsrXSxyJiYhZC5jYWxsKGgscCl8fChuW3BdPWhbcF0pO3JldHVybiBufTpsfSw1MDg2ODpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NzU3OSksbz1uKDg2NDAxKSxpPW4oNTkxMzUpLGE9bigyMzA3MCksYz1uKDUxNTcxKSxzPW4oMTkyMyksdT1uKDgzMTk3KSgiSUVfUFJPVE8iKSxsPWZ1bmN0aW9uKCl7fSxmPWZ1bmN0aW9uKCl7dmFyIHQsZT1zKCJpZnJhbWUiKSxuPWkubGVuZ3RoO2ZvcihlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGMuYXBwZW5kQ2hpbGQoZSksZS5zcmM9U3RyaW5nKCJqYXZhc2NyaXB0OiIpLCh0PWUuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLHQud3JpdGUoIjxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8XC9zY3JpcHQ+IiksdC5jbG9zZSgpLGY9dC5GO24tLTspZGVsZXRlIGYucHJvdG90eXBlW2lbbl1dO3JldHVybiBmKCl9O3QuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiBudWxsIT09dD8obC5wcm90b3R5cGU9cih0KSxuPW5ldyBsLGwucHJvdG90eXBlPW51bGwsblt1XT10KTpuPWYoKSx2b2lkIDA9PT1lP246byhuLGUpfSxhW3VdPSEwfSw4NjQwMTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big2MjU1Niksbz1uKDM3NjIwKSxpPW4oODc1NzkpLGE9bigyNTUwNyk7dC5leHBvcnRzPXI/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24odCxlKXtpKHQpO2Zvcih2YXIgbixyPWEoZSksYz1yLmxlbmd0aCxzPTA7Yz5zOylvLmYodCxuPXJbcysrXSxlW25dKTtyZXR1cm4gdH19LDM3NjIwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYyNTU2KSxvPW4oNjI3OTkpLGk9big4NzU3OSksYT1uKDUzNDk4KSxjPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmY9cj9jOmZ1bmN0aW9uKHQsZSxuKXtpZihpKHQpLGU9YShlLCEwKSxpKG4pLG8pdHJ5e3JldHVybiBjKHQsZSxuKX1jYXRjaCh0KXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCIpO3JldHVybiJ2YWx1ZSJpbiBuJiYodFtlXT1uLnZhbHVlKSx0fX0sOTcyNTc6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjI1NTYpLG89big0MTYyOCksaT1uKDE0MjA5KSxhPW4oOTU3MyksYz1uKDUzNDk4KSxzPW4oNzYyOTgpLHU9big2Mjc5OSksbD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2UuZj1yP2w6ZnVuY3Rpb24odCxlKXtpZih0PWEodCksZT1jKGUsITApLHUpdHJ5e3JldHVybiBsKHQsZSl9Y2F0Y2godCl7fWlmKHModCxlKSlyZXR1cm4gaSghby5mLmNhbGwodCxlKSx0W2VdKX19LDI2OTM3OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk1NzMpLG89bigxMzMzNCkuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSwxMzMzNDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MTc2KSxvPW4oNTkxMzUpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7ZS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbih0KXtyZXR1cm4gcih0LG8pfX0sNTY5OTE6ZnVuY3Rpb24odCxlKXtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sNjQ5NjU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNzYyOTgpLG89bigxOTIwOSksaT1uKDgzMTk3KSxhPW4oNzE2MDgpLGM9aSgiSUVfUFJPVE8iKSxzPU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPWE/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0PW8odCkscih0LGMpP3RbY106ImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/czpudWxsfX0sODY0MDM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDg5ODI3KSxvPW4oNzEyMDEpLGk9big3NjI5OCksYT1uKDI1NTA3KSxjPW4oMTkyMDkpLHM9Ik9iamVjdCBJdGVyYXRvciIsdT1yLnNldCxsPXIuZ2V0dGVyRm9yKHMpO3QuZXhwb3J0cz1vKChmdW5jdGlvbih0LGUpe3ZhciBuPWModCk7dSh0aGlzLHt0eXBlOnMsbW9kZTplLG9iamVjdDpuLGtleXM6YShuKSxpbmRleDowfSl9KSwiT2JqZWN0IiwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9bCh0aGlzKSxlPXQua2V5czs7KXtpZihudWxsPT09ZXx8dC5pbmRleD49ZS5sZW5ndGgpcmV0dXJuIHQub2JqZWN0PXQua2V5cz1udWxsLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH07dmFyIG49ZVt0LmluZGV4KytdLHI9dC5vYmplY3Q7aWYoaShyLG4pKXtzd2l0Y2godC5tb2RlKXtjYXNlImtleXMiOnJldHVybnt2YWx1ZTpuLGRvbmU6ITF9O2Nhc2UidmFsdWVzIjpyZXR1cm57dmFsdWU6cltuXSxkb25lOiExfX1yZXR1cm57dmFsdWU6W24scltuXV0sZG9uZTohMX19fX0pKX0sNDE3NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9big3NjI5OCksbz1uKDk1NzMpLGk9big4NTgwMykuaW5kZXhPZixhPW4oMjMwNzApO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGM9byh0KSxzPTAsdT1bXTtmb3IobiBpbiBjKSFyKGEsbikmJnIoYyxuKSYmdS5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+czspcihjLG49ZVtzKytdKSYmKH5pKHUsbil8fHUucHVzaChuKSk7cmV0dXJuIHV9fSwyNTUwNzpmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MTc2KSxvPW4oNTkxMzUpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvKX19LDQxNjI4OmZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO3ZhciBuPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPXImJiFuLmNhbGwoezE6Mn0sMSk7ZS5mPW8/ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpufSw3MTg0MjpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NzU3OSksbz1uKDc5ODYxKTt0LmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIHQsZT0hMSxuPXt9O3RyeXsodD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCkuY2FsbChuLFtdKSxlPW4gaW5zdGFuY2VvZiBBcnJheX1jYXRjaCh0KXt9cmV0dXJuIGZ1bmN0aW9uKG4saSl7cmV0dXJuIHIobiksbyhpKSxlP3QuY2FsbChuLGkpOm4uX19wcm90b19fPWksbn19KCk6dm9pZCAwKX0sMzU2NzpmdW5jdGlvbih0LGUsbil7dmFyIHI9big2MjU1Niksbz1uKDI1NTA3KSxpPW4oOTU3MyksYT1uKDQxNjI4KS5mLGM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgbixjPWkoZSkscz1vKGMpLHU9cy5sZW5ndGgsbD0wLGY9W107dT5sOyluPXNbbCsrXSxyJiYhYS5jYWxsKGMsbil8fGYucHVzaCh0P1tuLGNbbl1dOmNbbl0pO3JldHVybiBmfX07dC5leHBvcnRzPXtlbnRyaWVzOmMoITApLHZhbHVlczpjKCExKX19LDE5NzU4OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5MDYxMyksbz1uKDU5NTkxKTt0LmV4cG9ydHM9cj97fS50b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0ICIrbyh0aGlzKSsiXSJ9fSwyNDQxNTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big3NzAxKSxvPW4oMTMzMzQpLGk9big1Njk5MSksYT1uKDg3NTc5KTt0LmV4cG9ydHM9cigiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24odCl7dmFyIGU9by5mKGEodCkpLG49aS5mO3JldHVybiBuP2UuY29uY2F0KG4odCkpOmV9fSwyNDQ5NzpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OTU1OCksbz1uKDgyMzUwKS50cmltLGk9big1MDA1NSksYT1yLnBhcnNlRmxvYXQsYz0xL2EoaSsiLTAiKSE9LTEvMDt0LmV4cG9ydHM9Yz9mdW5jdGlvbih0KXt2YXIgZT1vKFN0cmluZyh0KSksbj1hKGUpO3JldHVybiAwPT09biYmIi0iPT1lLmNoYXJBdCgwKT8tMDpufTphfSw3ODQ2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5NTU4KSxvPW4oODIzNTApLnRyaW0saT1uKDUwMDU1KSxhPXIucGFyc2VJbnQsYz0vXlsrLV0/MFtYeF0vLHM9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9cz9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwoYy50ZXN0KG4pPzE2OjEwKSl9OmF9LDU2MjM4OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5NTU4KTt0LmV4cG9ydHM9cn0sMzExNTpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSw2MzEzNDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NzU3OSksbz1uKDEwNTkyKSxpPW4oODMwODMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKHIodCksbyhlKSYmZS5jb25zdHJ1Y3Rvcj09PXQpcmV0dXJuIGU7dmFyIG49aS5mKHQpO3JldHVybigwLG4ucmVzb2x2ZSkoZSksbi5wcm9taXNlfX0sNjk5Mjc6ZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPTIxNDc0ODM2NDcsbj0vW15cMC1cdTAwN0VdLyxyPS9bLlx1MzAwMlx1RkYwRVx1RkY2MV0vZyxvPSJPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcyIsaT1NYXRoLmZsb29yLGE9U3RyaW5nLmZyb21DaGFyQ29kZSxjPWZ1bmN0aW9uKHQpe3JldHVybiB0KzIyKzc1Kih0PDI2KX0scz1mdW5jdGlvbih0LGUsbil7dmFyIHI9MDtmb3IodD1uP2kodC83MDApOnQ+PjEsdCs9aSh0L2UpO3Q+NDU1O3IrPTM2KXQ9aSh0LzM1KTtyZXR1cm4gaShyKzM2KnQvKHQrMzgpKX0sdT1mdW5jdGlvbih0KXt2YXIgbj1bXTt0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Lmxlbmd0aDtuPHI7KXt2YXIgbz10LmNoYXJDb2RlQXQobisrKTtpZihvPj01NTI5NiYmbzw9NTYzMTkmJm48cil7dmFyIGk9dC5jaGFyQ29kZUF0KG4rKyk7NTYzMjA9PSg2NDUxMiZpKT9lLnB1c2goKCgxMDIzJm8pPDwxMCkrKDEwMjMmaSkrNjU1MzYpOihlLnB1c2gobyksbi0tKX1lbHNlIGUucHVzaChvKX1yZXR1cm4gZX0odCk7dmFyIHIsdSxsPXQubGVuZ3RoLGY9MTI4LGQ9MCxwPTcyO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspKHU9dFtyXSk8MTI4JiZuLnB1c2goYSh1KSk7dmFyIGg9bi5sZW5ndGgsdj1oO2ZvcihoJiZuLnB1c2goIi0iKTt2PGw7KXt2YXIgZz1lO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspKHU9dFtyXSk+PWYmJnU8ZyYmKGc9dSk7dmFyIHk9disxO2lmKGctZj5pKChlLWQpL3kpKXRocm93IFJhbmdlRXJyb3Iobyk7Zm9yKGQrPShnLWYpKnksZj1nLHI9MDtyPHQubGVuZ3RoO3IrKyl7aWYoKHU9dFtyXSk8ZiYmKytkPmUpdGhyb3cgUmFuZ2VFcnJvcihvKTtpZih1PT1mKXtmb3IodmFyIG09ZCxiPTM2OztiKz0zNil7dmFyIHg9Yjw9cD8xOmI+PXArMjY/MjY6Yi1wO2lmKG08eClicmVhazt2YXIgdz1tLXgsRT0zNi14O24ucHVzaChhKGMoeCt3JUUpKSksbT1pKHcvRSl9bi5wdXNoKGEoYyhtKSkpLHA9cyhkLHksdj09aCksZD0wLCsrdn19KytkLCsrZn1yZXR1cm4gbi5qb2luKCIiKX07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG8saT1bXSxhPXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHIsIi4iKS5zcGxpdCgiLiIpO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspbz1hW2VdLGkucHVzaChuLnRlc3Qobyk/InhuLS0iK3Uobyk6byk7cmV0dXJuIGkuam9pbigiLiIpfX0sMTkyNjpmdW5jdGlvbih0LGUsbil7dmFyIHI9big5MjkxMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIG8gaW4gZSlyKHQsbyxlW29dLG4pO3JldHVybiB0fX0sOTI5MTM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODk1NTgpLG89big2Njk3MSksaT1uKDc2Mjk4KSxhPW4oOTgyNjkpLGM9big3Njc3Mykscz1uKDg5ODI3KSx1PXMuZ2V0LGw9cy5lbmZvcmNlLGY9U3RyaW5nKFN0cmluZykuc3BsaXQoIlN0cmluZyIpOyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sYyl7dmFyIHM9ISFjJiYhIWMudW5zYWZlLHU9ISFjJiYhIWMuZW51bWVyYWJsZSxkPSEhYyYmISFjLm5vVGFyZ2V0R2V0OyJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoInN0cmluZyIhPXR5cGVvZiBlfHxpKG4sIm5hbWUiKXx8byhuLCJuYW1lIixlKSxsKG4pLnNvdXJjZT1mLmpvaW4oInN0cmluZyI9PXR5cGVvZiBlP2U6IiIpKSx0IT09cj8ocz8hZCYmdFtlXSYmKHU9ITApOmRlbGV0ZSB0W2VdLHU/dFtlXT1uOm8odCxlLG4pKTp1P3RbZV09bjphKGUsbil9KShGdW5jdGlvbi5wcm90b3R5cGUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdSh0aGlzKS5zb3VyY2V8fGModGhpcyl9KSl9LDc3MDIwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk0OTA2KSxvPW4oNTg2MDYpLGk9big2MjA1NCkoIm1ldGFkYXRhIiksYT1pLnN0b3JlfHwoaS5zdG9yZT1uZXcgbyksYz1mdW5jdGlvbih0LGUsbil7dmFyIG89YS5nZXQodCk7aWYoIW8pe2lmKCFuKXJldHVybjthLnNldCh0LG89bmV3IHIpfXZhciBpPW8uZ2V0KGUpO2lmKCFpKXtpZighbilyZXR1cm47by5zZXQoZSxpPW5ldyByKX1yZXR1cm4gaX07dC5leHBvcnRzPXtzdG9yZTphLGdldE1hcDpjLGhhczpmdW5jdGlvbih0LGUsbil7dmFyIHI9YyhlLG4sITEpO3JldHVybiB2b2lkIDAhPT1yJiZyLmhhcyh0KX0sZ2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1jKGUsbiwhMSk7cmV0dXJuIHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KHQpfSxzZXQ6ZnVuY3Rpb24odCxlLG4scil7YyhuLHIsITApLnNldCh0LGUpfSxrZXlzOmZ1bmN0aW9uKHQsZSl7dmFyIG49Yyh0LGUsITEpLHI9W107cmV0dXJuIG4mJm4uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtyLnB1c2goZSl9KSkscn0sdG9LZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR8fCJzeW1ib2wiPT10eXBlb2YgdD90OlN0cmluZyh0KX19fSwzNTQ1NTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNDU5NCksbz1uKDM4NTk4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmV4ZWM7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pe3ZhciBpPW4uY2FsbCh0LGUpO2lmKCJvYmplY3QiIT10eXBlb2YgaSl0aHJvdyBUeXBlRXJyb3IoIlJlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCIpO3JldHVybiBpfWlmKCJSZWdFeHAiIT09cih0KSl0aHJvdyBUeXBlRXJyb3IoIlJlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXIiKTtyZXR1cm4gby5jYWxsKHQsZSl9fSwzODU5ODpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saT1uKDI1NDE5KSxhPVJlZ0V4cC5wcm90b3R5cGUuZXhlYyxjPVN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxzPWEsdT0ocj0vYS8sbz0vYiovZyxhLmNhbGwociwiYSIpLGEuY2FsbChvLCJhIiksMCE9PXIubGFzdEluZGV4fHwwIT09by5sYXN0SW5kZXgpLGw9dm9pZCAwIT09LygpPz8vLmV4ZWMoIiIpWzFdOyh1fHxsKSYmKHM9ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8scz10aGlzO3JldHVybiBsJiYobj1uZXcgUmVnRXhwKCJeIitzLnNvdXJjZSsiJCg/IVxccykiLGkuY2FsbChzKSkpLHUmJihlPXMubGFzdEluZGV4KSxyPWEuY2FsbChzLHQpLHUmJnImJihzLmxhc3RJbmRleD1zLmdsb2JhbD9yLmluZGV4K3JbMF0ubGVuZ3RoOmUpLGwmJnImJnIubGVuZ3RoPjEmJmMuY2FsbChyWzBdLG4sKGZ1bmN0aW9uKCl7Zm9yKG89MTtvPGFyZ3VtZW50cy5sZW5ndGgtMjtvKyspdm9pZCAwPT09YXJndW1lbnRzW29dJiYocltvXT12b2lkIDApfSkpLHJ9KSx0LmV4cG9ydHM9c30sMjU0MTk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDg3NTc5KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdD1yKHRoaXMpLGU9IiI7cmV0dXJuIHQuZ2xvYmFsJiYoZSs9ImciKSx0Lmlnbm9yZUNhc2UmJihlKz0iaSIpLHQubXVsdGlsaW5lJiYoZSs9Im0iKSx0LmRvdEFsbCYmKGUrPSJzIiksdC51bmljb2RlJiYoZSs9InUiKSx0LnN0aWNreSYmKGUrPSJ5IiksZX19LDcwMTMyOmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIit0KTtyZXR1cm4gdH19LDM4MTg5OmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX19LDc2NDgyOmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1PYmplY3QuaXN8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lPzAhPT10fHwxL3Q9PTEvZTp0IT10JiZlIT1lfX0sOTgyNjk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODk1NTgpLG89big2Njk3MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dHJ5e28ocix0LGUpfWNhdGNoKG4pe3JbdF09ZX1yZXR1cm4gZX19LDY3NTM4OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3NzAxKSxvPW4oMzc2MjApLGk9bigyMzcyNCksYT1uKDYyNTU2KSxjPWkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPW8uZjthJiZlJiYhZVtjXSYmbihlLGMse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LDUxMTI4OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM3NjIwKS5mLG89big3NjI5OCksaT1uKDIzNzI0KSgidG9TdHJpbmdUYWciKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3QmJiFvKHQ9bj90OnQucHJvdG90eXBlLGkpJiZyKHQsaSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KX19LDgzMTk3OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYyMDU0KSxvPW4oNjcyOSksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LDM0NzQxOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5NTU4KSxvPW4oOTgyNjkpLGk9Il9fY29yZS1qc19zaGFyZWRfXyIsYT1yW2ldfHxvKGkse30pO3QuZXhwb3J0cz1hfSw2MjA1NDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big2NTY3Miksbz1uKDM0NzQxKTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG9bdF18fChvW3RdPXZvaWQgMCE9PWU/ZTp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjUuMCIsbW9kZTpyPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LDIyOTA5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMjE4Nyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49W11bdF07cmV0dXJuIW58fCFyKChmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KSl9fSwxMzk3OTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NzU3OSksbz1uKDg2NDcwKSxpPW4oMjM3MjQpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSw2MDE0MDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzQxNiksbz1uKDcwMTMyKSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEsYz1TdHJpbmcobyhlKSkscz1yKG4pLHU9Yy5sZW5ndGg7cmV0dXJuIHM8MHx8cz49dT90PyIiOnZvaWQgMDooaT1jLmNoYXJDb2RlQXQocykpPDU1Mjk2fHxpPjU2MzE5fHxzKzE9PT11fHwoYT1jLmNoYXJDb2RlQXQocysxKSk8NTYzMjB8fGE+NTczNDM/dD9jLmNoYXJBdChzKTppOnQ/Yy5zbGljZShzLHMrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sMjY1NzM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjc4ODQpLG89big2ODI1MyksaT1uKDcwMTMyKSxhPU1hdGguY2VpbCxjPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4sYyl7dmFyIHMsdSxsPVN0cmluZyhpKGUpKSxmPWwubGVuZ3RoLGQ9dm9pZCAwPT09Yz8iICI6U3RyaW5nKGMpLHA9cihuKTtyZXR1cm4gcDw9Znx8IiI9PWQ/bDoocz1wLWYsKHU9by5jYWxsKGQsYShzL2QubGVuZ3RoKSkpLmxlbmd0aD5zJiYodT11LnNsaWNlKDAscykpLHQ/bCt1OnUrbCl9fTt0LmV4cG9ydHM9e3N0YXJ0OmMoITEpLGVuZDpjKCEwKX19LDY4MjUzOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0MzQxNiksbz1uKDcwMTMyKTt0LmV4cG9ydHM9IiIucmVwZWF0fHxmdW5jdGlvbih0KXt2YXIgZT1TdHJpbmcobyh0aGlzKSksbj0iIixpPXIodCk7aWYoaTwwfHxpPT0xLzApdGhyb3cgUmFuZ2VFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zIik7Zm9yKDtpPjA7KGk+Pj49MSkmJihlKz1lKSkxJmkmJihuKz1lKTtyZXR1cm4gbn19LDgyMzUwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcwMTMyKSxvPSJbIituKDUwMDU1KSsiXSIsaT1SZWdFeHAoIl4iK28rbysiKiIpLGE9UmVnRXhwKG8rbysiKiQiKSxjPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1TdHJpbmcocihlKSk7cmV0dXJuIDEmdCYmKG49bi5yZXBsYWNlKGksIiIpKSwyJnQmJihuPW4ucmVwbGFjZShhLCIiKSksbn19O3QuZXhwb3J0cz17c3RhcnQ6YygxKSxlbmQ6YygyKSx0cmltOmMoMyl9fSwyMTc0NDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big4OTU1OCksYz1uKDMyMTg3KSxzPW4oMjQ1OTQpLHU9big0NjEzMCksbD1uKDUxNTcxKSxmPW4oMTkyMyksZD1uKDIxMjMxKSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSx2PWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3MseT1hLk1lc3NhZ2VDaGFubmVsLG09YS5EaXNwYXRjaCxiPTAseD17fSx3PSJvbnJlYWR5c3RhdGVjaGFuZ2UiLEU9ZnVuY3Rpb24odCl7aWYoeC5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIGU9eFt0XTtkZWxldGUgeFt0XSxlKCl9fSxqPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe0UodCl9fSxDPWZ1bmN0aW9uKHQpe0UodC5kYXRhKX0saz1mdW5jdGlvbih0KXthLnBvc3RNZXNzYWdlKHQrIiIscC5wcm90b2NvbCsiLy8iK3AuaG9zdCl9O2gmJnZ8fChoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTE7YXJndW1lbnRzLmxlbmd0aD5uOyllLnB1c2goYXJndW1lbnRzW24rK10pO3JldHVybiB4WysrYl09ZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpGdW5jdGlvbih0KSkuYXBwbHkodm9pZCAwLGUpfSxyKGIpLGJ9LHY9ZnVuY3Rpb24odCl7ZGVsZXRlIHhbdF19LCJwcm9jZXNzIj09cyhnKT9yPWZ1bmN0aW9uKHQpe2cubmV4dFRpY2soaih0KSl9Om0mJm0ubm93P3I9ZnVuY3Rpb24odCl7bS5ub3coaih0KSl9OnkmJiFkPyhpPShvPW5ldyB5KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1DLHI9dShpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxjKGspP3I9dyBpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLEUodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KGoodCksMCl9OihyPWssYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixDLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6dn19LDUzOTk3OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0NTk0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0JiYiTnVtYmVyIiE9cih0KSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCBpbnZvY2F0aW9uIik7cmV0dXJuK3R9fSw3Njk3NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzQxNiksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSw4MzkxNDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzQxNiksbz1uKDI3ODg0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gMDt2YXIgZT1yKHQpLG49byhlKTtpZihlIT09bil0aHJvdyBSYW5nZUVycm9yKCJXcm9uZyBsZW5ndGggb3IgaW5kZXgiKTtyZXR1cm4gbn19LDk1NzM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjQ5OCksbz1uKDcwMTMyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIobyh0KSl9fSw0MzQxNjpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLmNlaWwsbj1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP246ZSkodCl9fSwyNzg4NDpmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzQxNiksbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9vKHIodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LDE5MjA5OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcwMTMyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyKHQpKX19LDYwNTU4OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ1NjgwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yKHQpO2lmKG4lZSl0aHJvdyBSYW5nZUVycm9yKCJXcm9uZyBvZmZzZXQiKTtyZXR1cm4gbn19LDQ1NjgwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQzNDE2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9cih0KTtpZihlPDApdGhyb3cgUmFuZ2VFcnJvcigiVGhlIGFyZ3VtZW50IGNhbid0IGJlIGxlc3MgdGhhbiAwIik7cmV0dXJuIGV9fSw1MzQ5ODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDU5Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIXIodCkpcmV0dXJuIHQ7dmFyIG4sbztpZihlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCJmdW5jdGlvbiI9PXR5cGVvZihuPXQudmFsdWVPZikmJiFyKG89bi5jYWxsKHQpKSlyZXR1cm4gbztpZighZSYmImZ1bmN0aW9uIj09dHlwZW9mKG49dC50b1N0cmluZykmJiFyKG89bi5jYWxsKHQpKSlyZXR1cm4gbzt0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfX0sOTA2MTM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXt9O3JbbigyMzcyNCkoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iPT09U3RyaW5nKHIpfSw5MzAxNzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4OTU1OCksaT1uKDYyNTU2KSxhPW4oMzU2MjcpLGM9big3MzA3NCkscz1uKDgyODM1KSx1PW4oNTkzNzkpLGw9bigxNDIwOSksZj1uKDY2OTcxKSxkPW4oMjc4ODQpLHA9big4MzkxNCksaD1uKDYwNTU4KSx2PW4oNTM0OTgpLGc9big3NjI5OCkseT1uKDU5NTkxKSxtPW4oMTA1OTIpLGI9big1MDg2OCkseD1uKDcxODQyKSx3PW4oMTMzMzQpLmYsRT1uKDIwNDU1KSxqPW4oMzAwMjUpLmZvckVhY2gsQz1uKDY3NTM4KSxrPW4oMzc2MjApLFM9big5NzI1NyksTz1uKDg5ODI3KSxBPW4oMzAyNzIpLEk9Ty5nZXQsVD1PLnNldCxNPWsuZixfPVMuZixMPU1hdGgucm91bmQsUj1vLlJhbmdlRXJyb3IsUD1zLkFycmF5QnVmZmVyLE49cy5EYXRhVmlldyxGPWMuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyxEPWMuVFlQRURfQVJSQVlfVEFHLFU9Yy5UeXBlZEFycmF5LEI9Yy5UeXBlZEFycmF5UHJvdG90eXBlLHo9Yy5hVHlwZWRBcnJheUNvbnN0cnVjdG9yLEg9Yy5pc1R5cGVkQXJyYXksVj0iQllURVNfUEVSX0VMRU1FTlQiLHE9Ildyb25nIGxlbmd0aCIsVz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGgsbz1uZXcoeih0KSkocik7cj5uOylvW25dPWVbbisrXTtyZXR1cm4gb30sRz1mdW5jdGlvbih0LGUpe00odCxlLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSSh0aGlzKVtlXX19KX0sWj1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIFB8fCJBcnJheUJ1ZmZlciI9PShlPXkodCkpfHwiU2hhcmVkQXJyYXlCdWZmZXIiPT1lfSwkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEgodCkmJiJzeW1ib2wiIT10eXBlb2YgZSYmZSBpbiB0JiZTdHJpbmcoK2UpPT1TdHJpbmcoZSl9LFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0LGU9dihlLCEwKSk/bCgyLHRbZV0pOl8odCxlKX0sSz1mdW5jdGlvbih0LGUsbil7cmV0dXJuISgkKHQsZT12KGUsITApKSYmbShuKSYmZyhuLCJ2YWx1ZSIpKXx8ZyhuLCJnZXQiKXx8ZyhuLCJzZXQiKXx8bi5jb25maWd1cmFibGV8fGcobiwid3JpdGFibGUiKSYmIW4ud3JpdGFibGV8fGcobiwiZW51bWVyYWJsZSIpJiYhbi5lbnVtZXJhYmxlP00odCxlLG4pOih0W2VdPW4udmFsdWUsdCl9O2k/KEZ8fChTLmY9WSxrLmY9SyxHKEIsImJ1ZmZlciIpLEcoQiwiYnl0ZU9mZnNldCIpLEcoQiwiYnl0ZUxlbmd0aCIpLEcoQiwibGVuZ3RoIikpLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohRn0se2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpZLGRlZmluZVByb3BlcnR5Okt9KSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQubWF0Y2goL1xkKyQvKVswXS84LGM9dCsobj8iQ2xhbXBlZCI6IiIpKyJBcnJheSIscz0iZ2V0Iit0LGw9InNldCIrdCx2PW9bY10sZz12LHk9ZyYmZy5wcm90b3R5cGUsaz17fSxTPWZ1bmN0aW9uKHQsZSl7TSh0LGUse2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPUkodCk7cmV0dXJuIG4udmlld1tzXShlKmkrbi5ieXRlT2Zmc2V0LCEwKX0odGhpcyxlKX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG89SSh0KTtuJiYocj0ocj1MKHIpKTwwPzA6cj4yNTU/MjU1OjI1NSZyKSxvLnZpZXdbbF0oZSppK28uYnl0ZU9mZnNldCxyLCEwKX0odGhpcyxlLHQpfSxlbnVtZXJhYmxlOiEwfSl9O0Y/YSYmKGc9ZSgoZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHUodCxnLGMpLEEobShlKT9aKGUpP3ZvaWQgMCE9PXI/bmV3IHYoZSxoKG4saSkscik6dm9pZCAwIT09bj9uZXcgdihlLGgobixpKSk6bmV3IHYoZSk6SChlKT9XKGcsZSk6RS5jYWxsKGcsZSk6bmV3IHYocChlKSksdCxnKX0pKSx4JiZ4KGcsVSksaih3KHYpLChmdW5jdGlvbih0KXt0IGluIGd8fGYoZyx0LHZbdF0pfSkpLGcucHJvdG90eXBlPXkpOihnPWUoKGZ1bmN0aW9uKHQsZSxuLHIpe3UodCxnLGMpO3ZhciBvLGEscyxsPTAsZj0wO2lmKG0oZSkpe2lmKCFaKGUpKXJldHVybiBIKGUpP1coZyxlKTpFLmNhbGwoZyxlKTtvPWUsZj1oKG4saSk7dmFyIHY9ZS5ieXRlTGVuZ3RoO2lmKHZvaWQgMD09PXIpe2lmKHYlaSl0aHJvdyBSKHEpO2lmKChhPXYtZik8MCl0aHJvdyBSKHEpfWVsc2UgaWYoKGE9ZChyKSppKStmPnYpdGhyb3cgUihxKTtzPWEvaX1lbHNlIHM9cChlKSxvPW5ldyBQKGE9cyppKTtmb3IoVCh0LHtidWZmZXI6byxieXRlT2Zmc2V0OmYsYnl0ZUxlbmd0aDphLGxlbmd0aDpzLHZpZXc6bmV3IE4obyl9KTtsPHM7KVModCxsKyspfSkpLHgmJngoZyxVKSx5PWcucHJvdG90eXBlPWIoQikpLHkuY29uc3RydWN0b3IhPT1nJiZmKHksImNvbnN0cnVjdG9yIixnKSxEJiZmKHksRCxjKSxrW2NdPWcscih7Z2xvYmFsOiEwLGZvcmNlZDpnIT12LHNoYW06IUZ9LGspLFYgaW4gZ3x8ZihnLFYsaSksViBpbiB5fHxmKHksVixpKSxDKGMpfSk6dC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sMjA0NTU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTkyMDkpLG89bigyNzg4NCksaT1uKDczODkwKSxhPW4oNDQ5ODQpLGM9big0NjEzMCkscz1uKDczMDc0KS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLHUsbCxmLGQscD1yKHQpLGg9YXJndW1lbnRzLmxlbmd0aCx2PWg+MT9hcmd1bWVudHNbMV06dm9pZCAwLGc9dm9pZCAwIT09dix5PWkocCk7aWYobnVsbCE9eSYmIWEoeSkpZm9yKGQ9KGY9eS5jYWxsKHApKS5uZXh0LHA9W107IShsPWQuY2FsbChmKSkuZG9uZTspcC5wdXNoKGwudmFsdWUpO2ZvcihnJiZoPjImJih2PWModixhcmd1bWVudHNbMl0sMikpLG49byhwLmxlbmd0aCksdT1uZXcocyh0aGlzKSkobiksZT0wO24+ZTtlKyspdVtlXT1nP3YocFtlXSxlKTpwW2VdO3JldHVybiB1fX0sMzU2Mjc6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODk1NTgpLG89bigzMjE4NyksaT1uKDQ3OTYpLGE9big3MzA3NCkuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyxjPXIuQXJyYXlCdWZmZXIscz1yLkludDhBcnJheTt0LmV4cG9ydHM9IWF8fCFvKChmdW5jdGlvbigpe3MoMSl9KSl8fCFvKChmdW5jdGlvbigpe25ldyBzKC0xKX0pKXx8IWkoKGZ1bmN0aW9uKHQpe25ldyBzLG5ldyBzKG51bGwpLG5ldyBzKDEuNSksbmV3IHModCl9KSwhMCl8fG8oKGZ1bmN0aW9uKCl7cmV0dXJuIDEhPT1uZXcgcyhuZXcgYygyKSwxLHZvaWQgMCkubGVuZ3RofSkpfSw2NzI5OmZ1bmN0aW9uKHQpe3ZhciBlPTAsbj1NYXRoLnJhbmRvbSgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4iU3ltYm9sKCIrU3RyaW5nKHZvaWQgMD09PXQ/IiI6dCkrIilfIisoKytlK24pLnRvU3RyaW5nKDM2KX19LDE2NDEwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkwMTQpO3QuZXhwb3J0cz1yJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sKCl9LDM5NDc2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc3MDEpO3QuZXhwb3J0cz1yKCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiKXx8IiJ9LDc5MDcxOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9big4OTU1OCksYT1uKDM5NDc2KSxjPWkucHJvY2VzcyxzPWMmJmMudmVyc2lvbnMsdT1zJiZzLnY4O3U/bz0ocj11LnNwbGl0KCIuIikpWzBdK3JbMV06YSYmKCEocj1hLm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8clsxXT49NzQpJiYocj1hLm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYobz1yWzFdKSx0LmV4cG9ydHM9byYmK299LDQyMTg0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM5NDc2KTt0LmV4cG9ydHM9L1ZlcnNpb25cLzEwXC5cZCsoXC5cZCspPyggTW9iaWxlXC9cdyspPyBTYWZhcmlcLy8udGVzdChyKX0sMjM3MjQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODk1NTgpLG89big2MjA1NCksaT1uKDc2Mjk4KSxhPW4oNjcyOSksYz1uKDkwMTQpLHM9bigxNjQxMCksdT1vKCJ3a3MiKSxsPXIuU3ltYm9sLGY9cz9sOmE7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHUsdCl8fChjJiZpKGwsdCk/dVt0XT1sW3RdOnVbdF09ZigiU3ltYm9sLiIrdCkpLHVbdF19fSw1MDA1NTpmdW5jdGlvbih0KXt0LmV4cG9ydHM9Ilx0XG5cdlxmXHIgwqDhmoDigIDigIHigILigIPigITigIXigIbigIfigIjigInigIrigK/igZ/jgIBcdTIwMjhcdTIwMjlcdWZlZmYifSw3MzkxNjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzcyNCk7ZS5mPXJ9LDYxMjQ1OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDg5NTU4KSxpPW4oODI4MzUpLGE9big2NzUzOCksYz0iQXJyYXlCdWZmZXIiLHM9aS5BcnJheUJ1ZmZlcjtyKHtnbG9iYWw6ITAsZm9yY2VkOm8uQXJyYXlCdWZmZXIhPT1zfSx7QXJyYXlCdWZmZXI6c30pLGEoYyl9LDI5MjczOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNzMwNzQpO3Ioe3RhcmdldDoiQXJyYXlCdWZmZXIiLHN0YXQ6ITAsZm9yY2VkOiFvLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1N9LHtpc1ZpZXc6by5pc1ZpZXd9KX0sOTA1NjA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzIxODcpLGk9big4MjgzNSksYT1uKDg3NTc5KSxjPW4oNzY5NzYpLHM9bigyNzg4NCksdT1uKDEzOTc5KSxsPWkuQXJyYXlCdWZmZXIsZj1pLkRhdGFWaWV3LGQ9bC5wcm90b3R5cGUuc2xpY2U7cih7dGFyZ2V0OiJBcnJheUJ1ZmZlciIscHJvdG86ITAsdW5zYWZlOiEwLGZvcmNlZDpvKChmdW5jdGlvbigpe3JldHVybiFuZXcgbCgyKS5zbGljZSgxLHZvaWQgMCkuYnl0ZUxlbmd0aH0pKX0se3NsaWNlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZCYmdm9pZCAwPT09ZSlyZXR1cm4gZC5jYWxsKGEodGhpcyksdCk7Zm9yKHZhciBuPWEodGhpcykuYnl0ZUxlbmd0aCxyPWModCxuKSxvPWModm9pZCAwPT09ZT9uOmUsbiksaT1uZXcodSh0aGlzLGwpKShzKG8tcikpLHA9bmV3IGYodGhpcyksaD1uZXcgZihpKSx2PTA7cjxvOyloLnNldFVpbnQ4KHYrKyxwLmdldFVpbnQ4KHIrKykpO3JldHVybiBpfX0pfSw1NzM4NzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMjE4NyksaT1uKDYxOTkpLGE9bigxMDU5MiksYz1uKDE5MjA5KSxzPW4oMjc4ODQpLHU9big1ODgxMCksbD1uKDcwMDkpLGY9big2MTk2MyksZD1uKDIzNzI0KSxwPW4oNzkwNzEpLGg9ZCgiaXNDb25jYXRTcHJlYWRhYmxlIiksdj05MDA3MTk5MjU0NzQwOTkxLGc9Ik1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIseT1wPj01MXx8IW8oKGZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRbaF09ITEsdC5jb25jYXQoKVswXSE9PXR9KSksbT1mKCJjb25jYXQiKSxiPWZ1bmN0aW9uKHQpe2lmKCFhKHQpKXJldHVybiExO3ZhciBlPXRbaF07cmV0dXJuIHZvaWQgMCE9PWU/ISFlOmkodCl9O3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDoheXx8IW19LHtjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhPWModGhpcyksZj1sKGEsMCksZD0wO2ZvcihlPS0xLHI9YXJndW1lbnRzLmxlbmd0aDtlPHI7ZSsrKWlmKGIoaT0tMT09PWU/YTphcmd1bWVudHNbZV0pKXtpZihkKyhvPXMoaS5sZW5ndGgpKT52KXRocm93IFR5cGVFcnJvcihnKTtmb3Iobj0wO248bztuKyssZCsrKW4gaW4gaSYmdShmLGQsaVtuXSl9ZWxzZXtpZihkPj12KXRocm93IFR5cGVFcnJvcihnKTt1KGYsZCsrLGkpfXJldHVybiBmLmxlbmd0aD1kLGZ9fSl9LDMwODE3OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oOTk0MzEpLGk9big3NjUxMyk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtjb3B5V2l0aGluOm99KSxpKCJjb3B5V2l0aGluIil9LDUyMDU1OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMwMDI1KS5ldmVyeTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6bigyMjkwOSkoImV2ZXJ5Iil9LHtldmVyeTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSw3MzM2MDpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDY1ODk1KSxpPW4oNzY1MTMpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7ZmlsbDpvfSksaSgiZmlsbCIpfSw0NzUwMjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMDAyNSkuZmlsdGVyLGk9bigzMjE4NyksYT1uKDYxOTYzKSgiZmlsdGVyIiksYz1hJiYhaSgoZnVuY3Rpb24oKXtbXS5maWx0ZXIuY2FsbCh7bGVuZ3RoOi0xLDA6MX0sKGZ1bmN0aW9uKHQpe3Rocm93IHR9KSl9KSk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFhfHwhY30se2ZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSw5MDkxMjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMDAyNSkuZmluZEluZGV4LGk9big3NjUxMyksYT0iZmluZEluZGV4IixjPSEwO2EgaW5bXSYmQXJyYXkoMSkuZmluZEluZGV4KChmdW5jdGlvbigpe2M9ITF9KSkscih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOmN9LHtmaW5kSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxpKGEpfSwzMzE5NTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMDAyNSkuZmluZCxpPW4oNzY1MTMpLGE9ImZpbmQiLGM9ITA7YSBpbltdJiZBcnJheSgxKS5maW5kKChmdW5jdGlvbigpe2M9ITF9KSkscih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOmN9LHtmaW5kOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksaShhKX0sNzkyMjc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODA2NjUpLGk9bigxOTIwOSksYT1uKDI3ODg0KSxjPW4oODY0NzApLHM9big3MDA5KTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2ZsYXRNYXA6ZnVuY3Rpb24odCl7dmFyIGUsbj1pKHRoaXMpLHI9YShuLmxlbmd0aCk7cmV0dXJuIGModCksKGU9cyhuLDApKS5sZW5ndGg9byhlLG4sbixyLDAsMSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKSxlfX0pfSwyODIwMzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4MDY2NSksaT1uKDE5MjA5KSxhPW4oMjc4ODQpLGM9big0MzQxNikscz1uKDcwMDkpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7ZmxhdDpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCxlPWkodGhpcyksbj1hKGUubGVuZ3RoKSxyPXMoZSwwKTtyZXR1cm4gci5sZW5ndGg9byhyLGUsZSxuLDAsdm9pZCAwPT09dD8xOmModCkpLHJ9fSl9LDQzNTkxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMxMzY4KTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6W10uZm9yRWFjaCE9b30se2ZvckVhY2g6b30pfSw3NDUzODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDg1MTY2KTtyKHt0YXJnZXQ6IkFycmF5IixzdGF0OiEwLGZvcmNlZDohbig0Nzk2KSgoZnVuY3Rpb24odCl7QXJyYXkuZnJvbSh0KX0pKX0se2Zyb206b30pfSwyMjI3NzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4NTgwMykuaW5jbHVkZXMsaT1uKDc2NTEzKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksaSgiaW5jbHVkZXMiKX0sMjQxMjk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODU4MDMpLmluZGV4T2YsaT1uKDIyOTA5KSxhPVtdLmluZGV4T2YsYz0hIWEmJjEvWzFdLmluZGV4T2YoMSwtMCk8MCxzPWkoImluZGV4T2YiKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6Y3x8c30se2luZGV4T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGM/YS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDA6byh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSwyMTI3OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJBcnJheSIsc3RhdDohMH0se2lzQXJyYXk6big2MTk5KX0pfSw1MDA2MzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTU3Myksbz1uKDc2NTEzKSxpPW4oMTIzNSksYT1uKDg5ODI3KSxjPW4oNDYwNjEpLHM9IkFycmF5IEl0ZXJhdG9yIix1PWEuc2V0LGw9YS5nZXR0ZXJGb3Iocyk7dC5leHBvcnRzPWMoQXJyYXksIkFycmF5IiwoZnVuY3Rpb24odCxlKXt1KHRoaXMse3R5cGU6cyx0YXJnZXQ6cih0KSxpbmRleDowLGtpbmQ6ZX0pfSksKGZ1bmN0aW9uKCl7dmFyIHQ9bCh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19KSwidmFsdWVzIiksaS5Bcmd1bWVudHM9aS5BcnJheSxvKCJrZXlzIiksbygidmFsdWVzIiksbygiZW50cmllcyIpfSw3NDEyMDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigyNDk4KSxpPW4oOTU3MyksYT1uKDIyOTA5KSxjPVtdLmpvaW4scz1vIT1PYmplY3QsdT1hKCJqb2luIiwiLCIpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpzfHx1fSx7am9pbjpmdW5jdGlvbih0KXtyZXR1cm4gYy5jYWxsKGkodGhpcyksdm9pZCAwPT09dD8iLCI6dCl9fSl9LDk0OTYzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNDkyNDkpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpvIT09W10ubGFzdEluZGV4T2Z9LHtsYXN0SW5kZXhPZjpvfSl9LDI3Mzg4OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMwMDI1KS5tYXAsaT1uKDMyMTg3KSxhPW4oNjE5NjMpKCJtYXAiKSxjPWEmJiFpKChmdW5jdGlvbigpe1tdLm1hcC5jYWxsKHtsZW5ndGg6LTEsMDoxfSwoZnVuY3Rpb24odCl7dGhyb3cgdH0pKX0pKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWF8fCFjfSx7bWFwOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LDY5OTg4OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMyMTg3KSxpPW4oNTg4MTApO3Ioe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITAsZm9yY2VkOm8oKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4hKEFycmF5Lm9mLmNhbGwodClpbnN0YW5jZW9mIHQpfSkpfSx7b2Y6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXM/dGhpczpBcnJheSkoZSk7ZT50OylpKG4sdCxhcmd1bWVudHNbdCsrXSk7cmV0dXJuIG4ubGVuZ3RoPWUsbn19KX0sNDU1Mjg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMTIzNjYpLnJpZ2h0O3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpuKDIyOTA5KSgicmVkdWNlUmlnaHQiKX0se3JlZHVjZVJpZ2h0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sODA1MjI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMTIzNjYpLmxlZnQ7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOm4oMjI5MDkpKCJyZWR1Y2UiKX0se3JlZHVjZTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LDgwMTE2OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDYxOTkpLGk9W10ucmV2ZXJzZSxhPVsxLDJdO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpTdHJpbmcoYSk9PT1TdHJpbmcoYS5yZXZlcnNlKCkpfSx7cmV2ZXJzZTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpJiYodGhpcy5sZW5ndGg9dGhpcy5sZW5ndGgpLGkuY2FsbCh0aGlzKX19KX0sMjkxMTA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMTA1OTIpLGk9big2MTk5KSxhPW4oNzY5NzYpLGM9bigyNzg4NCkscz1uKDk1NzMpLHU9big1ODgxMCksbD1uKDYxOTYzKSxmPW4oMjM3MjQpKCJzcGVjaWVzIiksZD1bXS5zbGljZSxwPU1hdGgubWF4O3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbCgic2xpY2UiKX0se3NsaWNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixsLGg9cyh0aGlzKSx2PWMoaC5sZW5ndGgpLGc9YSh0LHYpLHk9YSh2b2lkIDA9PT1lP3Y6ZSx2KTtpZihpKGgpJiYoImZ1bmN0aW9uIiE9dHlwZW9mKG49aC5jb25zdHJ1Y3Rvcil8fG4hPT1BcnJheSYmIWkobi5wcm90b3R5cGUpP28obikmJm51bGw9PT0obj1uW2ZdKSYmKG49dm9pZCAwKTpuPXZvaWQgMCxuPT09QXJyYXl8fHZvaWQgMD09PW4pKXJldHVybiBkLmNhbGwoaCxnLHkpO2ZvcihyPW5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKHAoeS1nLDApKSxsPTA7Zzx5O2crKyxsKyspZyBpbiBoJiZ1KHIsbCxoW2ddKTtyZXR1cm4gci5sZW5ndGg9bCxyfX0pfSw4NTU5NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMDAyNSkuc29tZTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6bigyMjkwOSkoInNvbWUiKX0se3NvbWU6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sNjc4MTI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODY0NzApLGk9bigxOTIwOSksYT1uKDMyMTg3KSxjPW4oMjI5MDkpLHM9W10sdT1zLnNvcnQsbD1hKChmdW5jdGlvbigpe3Muc29ydCh2b2lkIDApfSkpLGY9YSgoZnVuY3Rpb24oKXtzLnNvcnQobnVsbCl9KSksZD1jKCJzb3J0Iik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOmx8fCFmfHxkfSx7c29ydDpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD91LmNhbGwoaSh0aGlzKSk6dS5jYWxsKGkodGhpcyksbyh0KSl9fSl9LDg2MjE0OmZ1bmN0aW9uKHQsZSxuKXtuKDY3NTM4KSgiQXJyYXkiKX0sMzM3OTI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNzY5NzYpLGk9big0MzQxNiksYT1uKDI3ODg0KSxjPW4oMTkyMDkpLHM9big3MDA5KSx1PW4oNTg4MTApLGw9big2MTk2MyksZj1NYXRoLm1heCxkPU1hdGgubWluLHA9OTAwNzE5OTI1NDc0MDk5MSxoPSJNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIGV4Y2VlZGVkIjtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNwbGljZSIpfSx7c3BsaWNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixsLHYsZyx5LG09Yyh0aGlzKSxiPWEobS5sZW5ndGgpLHg9byh0LGIpLHc9YXJndW1lbnRzLmxlbmd0aDtpZigwPT09dz9uPXI9MDoxPT09dz8obj0wLHI9Yi14KToobj13LTIscj1kKGYoaShlKSwwKSxiLXgpKSxiK24tcj5wKXRocm93IFR5cGVFcnJvcihoKTtmb3IobD1zKG0sciksdj0wO3Y8cjt2KyspKGc9eCt2KWluIG0mJnUobCx2LG1bZ10pO2lmKGwubGVuZ3RoPXIsbjxyKXtmb3Iodj14O3Y8Yi1yO3YrKyl5PXYrbiwoZz12K3IpaW4gbT9tW3ldPW1bZ106ZGVsZXRlIG1beV07Zm9yKHY9Yjt2PmItcituO3YtLSlkZWxldGUgbVt2LTFdfWVsc2UgaWYobj5yKWZvcih2PWItcjt2Png7di0tKXk9dituLTEsKGc9dityLTEpaW4gbT9tW3ldPW1bZ106ZGVsZXRlIG1beV07Zm9yKHY9MDt2PG47disrKW1bdit4XT1hcmd1bWVudHNbdisyXTtyZXR1cm4gbS5sZW5ndGg9Yi1yK24sbH19KX0sNzE4NDY6ZnVuY3Rpb24odCxlLG4pe24oNzY1MTMpKCJmbGF0TWFwIil9LDcwMTQ2OmZ1bmN0aW9uKHQsZSxuKXtuKDc2NTEzKSgiZmxhdCIpfSw0NTE1NDpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDgyODM1KTtyKHtnbG9iYWw6ITAsZm9yY2VkOiFuKDczMDc0KS5OQVRJVkVfQVJSQVlfQlVGRkVSfSx7RGF0YVZpZXc6by5EYXRhVmlld30pfSw0MTYzMjpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiRGF0ZSIsc3RhdDohMH0se25vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfX0pfSw0MDA0NTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc5MTY3KTtyKHt0YXJnZXQ6IkRhdGUiLHByb3RvOiEwLGZvcmNlZDpEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyE9PW99LHt0b0lTT1N0cmluZzpvfSl9LDM2MjMzOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMyMTg3KSxpPW4oMTkyMDkpLGE9big1MzQ5OCk7cih7dGFyZ2V0OiJEYXRlIixwcm90bzohMCxmb3JjZWQ6bygoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PW5ldyBEYXRlKE5hTikudG9KU09OKCl8fDEhPT1EYXRlLnByb3RvdHlwZS50b0pTT04uY2FsbCh7dG9JU09TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gMX19KX0pKX0se3RvSlNPTjpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMpLG49YShlKTtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIG58fGlzRmluaXRlKG4pP2UudG9JU09TdHJpbmcoKTpudWxsfX0pfSw4NDA3OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY2OTcxKSxvPW4oNzY5NzQpLGk9bigyMzcyNCkoInRvUHJpbWl0aXZlIiksYT1EYXRlLnByb3RvdHlwZTtpIGluIGF8fHIoYSxpLG8pfSwyMTM3NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9big5MjkxMyksbz1EYXRlLnByb3RvdHlwZSxpPSJJbnZhbGlkIERhdGUiLGE9InRvU3RyaW5nIixjPW8udG9TdHJpbmcscz1vLmdldFRpbWU7bmV3IERhdGUoTmFOKSsiIiE9aSYmcihvLGEsKGZ1bmN0aW9uKCl7dmFyIHQ9cy5jYWxsKHRoaXMpO3JldHVybiB0PT10P2MuY2FsbCh0aGlzKTppfSkpfSw5NjQ5ODpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiRnVuY3Rpb24iLHByb3RvOiEwfSx7YmluZDpuKDczNzM5KX0pfSw3NTg5NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTA1OTIpLG89bigzNzYyMCksaT1uKDY0OTY1KSxhPW4oMjM3MjQpKCJoYXNJbnN0YW5jZSIpLGM9RnVuY3Rpb24ucHJvdG90eXBlO2EgaW4gY3x8by5mKGMsYSx7dmFsdWU6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXN8fCFyKHQpKXJldHVybiExO2lmKCFyKHRoaXMucHJvdG90eXBlKSlyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXM7Zm9yKDt0PWkodCk7KWlmKHRoaXMucHJvdG90eXBlPT09dClyZXR1cm4hMDtyZXR1cm4hMX19KX0sMjI0NDI6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjI1NTYpLG89bigzNzYyMCkuZixpPUZ1bmN0aW9uLnByb3RvdHlwZSxhPWkudG9TdHJpbmcsYz0vXlxzKmZ1bmN0aW9uIChbXiAoXSopLyxzPSJuYW1lIjtyJiYhKHMgaW4gaSkmJm8oaSxzLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBhLmNhbGwodGhpcykubWF0Y2goYylbMV19Y2F0Y2godCl7cmV0dXJuIiJ9fX0pfSw3MTYyMjpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe2dsb2JhbDohMH0se2dsb2JhbFRoaXM6big4OTU1OCl9KX0sMTY1MDpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3MDEpLGk9bigzMjE4NyksYT1vKCJKU09OIiwic3RyaW5naWZ5IiksYz0vW1x1RDgwMC1cdURGRkZdL2cscz0vXltcdUQ4MDAtXHVEQkZGXSQvLHU9L15bXHVEQzAwLVx1REZGRl0kLyxsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uLmNoYXJBdChlLTEpLG89bi5jaGFyQXQoZSsxKTtyZXR1cm4gcy50ZXN0KHQpJiYhdS50ZXN0KG8pfHx1LnRlc3QodCkmJiFzLnRlc3Qocik/IlxcdSIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTp0fSxmPWkoKGZ1bmN0aW9uKCl7cmV0dXJuJyJcXHVkZjA2XFx1ZDgzNCInIT09YSgiXHVkZjA2XHVkODM0Iil8fCciXFx1ZGVhZCInIT09YSgiXHVkZWFkIil9KSk7YSYmcih7dGFyZ2V0OiJKU09OIixzdGF0OiEwLGZvcmNlZDpmfSx7c3RyaW5naWZ5OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/ci5yZXBsYWNlKGMsbCk6cn19KX0sODExMDQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODk1NTgpO24oNTExMjgpKHIuSlNPTiwiSlNPTiIsITApfSw5NDkwNjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODE5NTEpLG89big2NDUwKTt0LmV4cG9ydHM9cigiTWFwIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDApfX0pLG8pfSwyMTAzMjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDIxOTMyKSxpPU1hdGguYWNvc2gsYT1NYXRoLmxvZyxjPU1hdGguc3FydCxzPU1hdGguTE4yO3Ioe3RhcmdldDoiTWF0aCIsc3RhdDohMCxmb3JjZWQ6IWl8fDcxMCE9TWF0aC5mbG9vcihpKE51bWJlci5NQVhfVkFMVUUpKXx8aSgxLzApIT0xLzB9LHthY29zaDpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCk8MT9OYU46dD45NDkwNjI2NS42MjQyNTE1Nj9hKHQpK3M6byh0LTErYyh0LTEpKmModCsxKSl9fSl9LDM3OTM2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPU1hdGguYXNpbmgsaT1NYXRoLmxvZyxhPU1hdGguc3FydDtyKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITAsZm9yY2VkOiEobyYmMS9vKDApPjApfSx7YXNpbmg6ZnVuY3Rpb24gdChlKXtyZXR1cm4gaXNGaW5pdGUoZT0rZSkmJjAhPWU/ZTwwPy10KC1lKTppKGUrYShlKmUrMSkpOmV9fSl9LDkzOTk1OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPU1hdGguYXRhbmgsaT1NYXRoLmxvZztyKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITAsZm9yY2VkOiEobyYmMS9vKC0wKTwwKX0se2F0YW5oOmZ1bmN0aW9uKHQpe3JldHVybiAwPT0odD0rdCk/dDppKCgxK3QpLygxLXQpKS8yfX0pfSwxMzM5MzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDM4Nzg3KSxpPU1hdGguYWJzLGE9TWF0aC5wb3c7cih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7Y2JydDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0PSt0KSphKGkodCksMS8zKX19KX0sMTEyODE6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89TWF0aC5mbG9vcixpPU1hdGgubG9nLGE9TWF0aC5MT0cyRTtyKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITB9LHtjbHozMjpmdW5jdGlvbih0KXtyZXR1cm4odD4+Pj0wKT8zMS1vKGkodCsuNSkqYSk6MzJ9fSl9LDM4MDM2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNzI5NzApLGk9TWF0aC5jb3NoLGE9TWF0aC5hYnMsYz1NYXRoLkU7cih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwLGZvcmNlZDohaXx8aSg3MTApPT09MS8wfSx7Y29zaDpmdW5jdGlvbih0KXt2YXIgZT1vKGEodCktMSkrMTtyZXR1cm4oZSsxLyhlKmMqYykpKihjLzIpfX0pfSwxMTM4OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNzI5NzApO3Ioe3RhcmdldDoiTWF0aCIsc3RhdDohMCxmb3JjZWQ6byE9TWF0aC5leHBtMX0se2V4cG0xOm99KX0sNDYwNzg6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITB9LHtmcm91bmQ6big1MzI1MSl9KX0sMzAwODM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89TWF0aC5oeXBvdCxpPU1hdGguYWJzLGE9TWF0aC5zcXJ0O3Ioe3RhcmdldDoiTWF0aCIsc3RhdDohMCxmb3JjZWQ6ISFvJiZvKDEvMCxOYU4pIT09MS8wfSx7aHlwb3Q6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvPTAsYz0wLHM9YXJndW1lbnRzLmxlbmd0aCx1PTA7YzxzOyl1PChuPWkoYXJndW1lbnRzW2MrK10pKT8obz1vKihyPXUvbikqcisxLHU9bik6bys9bj4wPyhyPW4vdSkqcjpuO3JldHVybiB1PT09MS8wPzEvMDp1KmEobyl9fSl9LDQ3MzgzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oMzIxODcpLGk9TWF0aC5pbXVsO3Ioe3RhcmdldDoiTWF0aCIsc3RhdDohMCxmb3JjZWQ6bygoZnVuY3Rpb24oKXtyZXR1cm4tNSE9aSg0Mjk0OTY3Mjk1LDUpfHwyIT1pLmxlbmd0aH0pKX0se2ltdWw6ZnVuY3Rpb24odCxlKXt2YXIgbj02NTUzNSxyPSt0LG89K2UsaT1uJnIsYT1uJm87cmV0dXJuIDB8aSphKygobiZyPj4+MTYpKmEraSoobiZvPj4+MTYpPDwxNj4+PjApfX0pfSw3MTU1ODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1NYXRoLmxvZyxpPU1hdGguTE9HMTBFO3Ioe3RhcmdldDoiTWF0aCIsc3RhdDohMH0se2xvZzEwOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQpKml9fSl9LDk5MjE4OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7bG9nMXA6bigyMTkzMil9KX0sOTg5Nzg6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89TWF0aC5sb2csaT1NYXRoLkxOMjtyKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITB9LHtsb2cyOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQpL2l9fSl9LDgwNjk6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITB9LHtzaWduOm4oMzg3ODcpfSl9LDcwMjA0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oMzIxODcpLGk9big3Mjk3MCksYT1NYXRoLmFicyxjPU1hdGguZXhwLHM9TWF0aC5FO3Ioe3RhcmdldDoiTWF0aCIsc3RhdDohMCxmb3JjZWQ6bygoZnVuY3Rpb24oKXtyZXR1cm4tMmUtMTchPU1hdGguc2luaCgtMmUtMTcpfSkpfSx7c2luaDpmdW5jdGlvbih0KXtyZXR1cm4gYSh0PSt0KTwxPyhpKHQpLWkoLXQpKS8yOihjKHQtMSktYygtdC0xKSkqKHMvMil9fSl9LDg1NzU4OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNzI5NzApLGk9TWF0aC5leHA7cih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7dGFuaDpmdW5jdGlvbih0KXt2YXIgZT1vKHQ9K3QpLG49bygtdCk7cmV0dXJuIGU9PTEvMD8xOm49PTEvMD8tMTooZS1uKS8oaSh0KStpKC10KSl9fSl9LDExNzczOmZ1bmN0aW9uKHQsZSxuKXtuKDUxMTI4KShNYXRoLCJNYXRoIiwhMCl9LDE1NzYzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPU1hdGguY2VpbCxpPU1hdGguZmxvb3I7cih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7dHJ1bmM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ+MD9pOm8pKHQpfX0pfSw3MTgyNzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjI1NTYpLG89big4OTU1OCksaT1uKDY0NTA0KSxhPW4oOTI5MTMpLGM9big3NjI5OCkscz1uKDI0NTk0KSx1PW4oMzAyNzIpLGw9big1MzQ5OCksZj1uKDMyMTg3KSxkPW4oNTA4NjgpLHA9bigxMzMzNCkuZixoPW4oOTcyNTcpLmYsdj1uKDM3NjIwKS5mLGc9big4MjM1MCkudHJpbSx5PSJOdW1iZXIiLG09by5OdW1iZXIsYj1tLnByb3RvdHlwZSx4PXMoZChiKSk9PXksdz1mdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEsYyxzLHU9bCh0LCExKTtpZigic3RyaW5nIj09dHlwZW9mIHUmJnUubGVuZ3RoPjIpaWYoNDM9PT0oZT0odT1nKHUpKS5jaGFyQ29kZUF0KDApKXx8NDU9PT1lKXtpZig4OD09PShuPXUuY2hhckNvZGVBdCgyKSl8fDEyMD09PW4pcmV0dXJuIE5hTn1lbHNlIGlmKDQ4PT09ZSl7c3dpdGNoKHUuY2hhckNvZGVBdCgxKSl7Y2FzZSA2NjpjYXNlIDk4OnI9MixvPTQ5O2JyZWFrO2Nhc2UgNzk6Y2FzZSAxMTE6cj04LG89NTU7YnJlYWs7ZGVmYXVsdDpyZXR1cm4rdX1mb3IoYT0oaT11LnNsaWNlKDIpKS5sZW5ndGgsYz0wO2M8YTtjKyspaWYoKHM9aS5jaGFyQ29kZUF0KGMpKTw0OHx8cz5vKXJldHVybiBOYU47cmV0dXJuIHBhcnNlSW50KGkscil9cmV0dXJuK3V9O2lmKGkoeSwhbSgiIDBvMSIpfHwhbSgiMGIxIil8fG0oIisweDEiKSkpe2Zvcih2YXIgRSxqPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8MT8wOnQsbj10aGlzO3JldHVybiBuIGluc3RhbmNlb2YgaiYmKHg/ZigoZnVuY3Rpb24oKXtiLnZhbHVlT2YuY2FsbChuKX0pKTpzKG4pIT15KT91KG5ldyBtKHcoZSkpLG4saik6dyhlKX0sQz1yP3AobSk6Ik1BWF9WQUxVRSxNSU5fVkFMVUUsTmFOLE5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZLEVQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUixNSU5fU0FGRV9JTlRFR0VSLHBhcnNlRmxvYXQscGFyc2VJbnQsaXNJbnRlZ2VyIi5zcGxpdCgiLCIpLGs9MDtDLmxlbmd0aD5rO2srKyljKG0sRT1DW2tdKSYmIWMoaixFKSYmdihqLEUsaChtLEUpKTtqLnByb3RvdHlwZT1iLGIuY29uc3RydWN0b3I9aixhKG8seSxqKX19LDI2MDYzOmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJOdW1iZXIiLHN0YXQ6ITB9LHtFUFNJTE9OOk1hdGgucG93KDIsLTUyKX0pfSw5Njc6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik51bWJlciIsc3RhdDohMH0se2lzRmluaXRlOm4oODk1NDIpfSl9LDMzMTAwOmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJOdW1iZXIiLHN0YXQ6ITB9LHtpc0ludGVnZXI6bigzODI1Nyl9KX0sNDE5Mjg6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik51bWJlciIsc3RhdDohMH0se2lzTmFOOmZ1bmN0aW9uKHQpe3JldHVybiB0IT10fX0pfSwxNTg2OTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDM4MjU3KSxpPU1hdGguYWJzO3Ioe3RhcmdldDoiTnVtYmVyIixzdGF0OiEwfSx7aXNTYWZlSW50ZWdlcjpmdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmaSh0KTw9OTAwNzE5OTI1NDc0MDk5MX19KX0sODg3MTU6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik51bWJlciIsc3RhdDohMH0se01BWF9TQUZFX0lOVEVHRVI6OTAwNzE5OTI1NDc0MDk5MX0pfSwzNjk5NTpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiTnVtYmVyIixzdGF0OiEwfSx7TUlOX1NBRkVfSU5URUdFUjotOTAwNzE5OTI1NDc0MDk5MX0pfSwxMTIyNDpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDI0NDk3KTtyKHt0YXJnZXQ6Ik51bWJlciIsc3RhdDohMCxmb3JjZWQ6TnVtYmVyLnBhcnNlRmxvYXQhPW99LHtwYXJzZUZsb2F0Om99KX0sNjM3NjU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big3ODQ2KTtyKHt0YXJnZXQ6Ik51bWJlciIsc3RhdDohMCxmb3JjZWQ6TnVtYmVyLnBhcnNlSW50IT1vfSx7cGFyc2VJbnQ6b30pfSwxMzA2NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big0MzQxNiksaT1uKDUzOTk3KSxhPW4oNjgyNTMpLGM9bigzMjE4Nykscz0xLi50b0ZpeGVkLHU9TWF0aC5mbG9vcixsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PWU/bjplJTI9PTE/bCh0LGUtMSxuKnQpOmwodCp0LGUvMixuKX07cih7dGFyZ2V0OiJOdW1iZXIiLHByb3RvOiEwLGZvcmNlZDpzJiYoIjAuMDAwIiE9PThlLTUudG9GaXhlZCgzKXx8IjEiIT09LjkudG9GaXhlZCgwKXx8IjEuMjUiIT09MS4yNTUudG9GaXhlZCgyKXx8IjEwMDAwMDAwMDAwMDAwMDAxMjgiIT09KDB4ZGUwYjZiM2E3NjQwMDgwKS50b0ZpeGVkKDApKXx8IWMoKGZ1bmN0aW9uKCl7cy5jYWxsKHt9KX0pKX0se3RvRml4ZWQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGMscz1pKHRoaXMpLGY9byh0KSxkPVswLDAsMCwwLDAsMF0scD0iIixoPSIwIix2PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZTsrK248Njspcis9dCpkW25dLGRbbl09ciUxZTcscj11KHIvMWU3KX0sZz1mdW5jdGlvbih0KXtmb3IodmFyIGU9NixuPTA7LS1lPj0wOyluKz1kW2VdLGRbZV09dShuL3QpLG49biV0KjFlN30seT1mdW5jdGlvbigpe2Zvcih2YXIgdD02LGU9IiI7LS10Pj0wOylpZigiIiE9PWV8fDA9PT10fHwwIT09ZFt0XSl7dmFyIG49U3RyaW5nKGRbdF0pO2U9IiI9PT1lP246ZSthLmNhbGwoIjAiLDctbi5sZW5ndGgpK259cmV0dXJuIGV9O2lmKGY8MHx8Zj4yMCl0aHJvdyBSYW5nZUVycm9yKCJJbmNvcnJlY3QgZnJhY3Rpb24gZGlnaXRzIik7aWYocyE9cylyZXR1cm4iTmFOIjtpZihzPD0tMWUyMXx8cz49MWUyMSlyZXR1cm4gU3RyaW5nKHMpO2lmKHM8MCYmKHA9Ii0iLHM9LXMpLHM+MWUtMjEpaWYobj0oZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXQ7bj49NDA5NjspZSs9MTIsbi89NDA5Njtmb3IoO24+PTI7KWUrPTEsbi89MjtyZXR1cm4gZX0ocypsKDIsNjksMSkpLTY5KTwwP3MqbCgyLC1lLDEpOnMvbCgyLGUsMSksbio9NDUwMzU5OTYyNzM3MDQ5NiwoZT01Mi1lKT4wKXtmb3IodigwLG4pLHI9ZjtyPj03Oyl2KDFlNywwKSxyLT03O2Zvcih2KGwoMTAsciwxKSwwKSxyPWUtMTtyPj0yMzspZygxPDwyMyksci09MjM7ZygxPDxyKSx2KDEsMSksZygyKSxoPXkoKX1lbHNlIHYoMCxuKSx2KDE8PC1lLDApLGg9eSgpK2EuY2FsbCgiMCIsZik7cmV0dXJuIGg9Zj4wP3ArKChjPWgubGVuZ3RoKTw9Zj8iMC4iK2EuY2FsbCgiMCIsZi1jKStoOmguc2xpY2UoMCxjLWYpKyIuIitoLnNsaWNlKGMtZikpOnAraH19KX0sMzIyOTM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzIxODcpLGk9big1Mzk5NyksYT0xLi50b1ByZWNpc2lvbjtyKHt0YXJnZXQ6Ik51bWJlciIscHJvdG86ITAsZm9yY2VkOm8oKGZ1bmN0aW9uKCl7cmV0dXJuIjEiIT09YS5jYWxsKDEsdm9pZCAwKX0pKXx8IW8oKGZ1bmN0aW9uKCl7YS5jYWxsKHt9KX0pKX0se3RvUHJlY2lzaW9uOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P2EuY2FsbChpKHRoaXMpKTphLmNhbGwoaSh0aGlzKSx0KX19KX0sMzc0ODE6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big3ODY4NSk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOk9iamVjdC5hc3NpZ24hPT1vfSx7YXNzaWduOm99KX0sNDU1NTA6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxzaGFtOiFuKDYyNTU2KX0se2NyZWF0ZTpuKDUwODY4KX0pfSwxOTI3ODpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2MjU1NiksaT1uKDQ3ODEyKSxhPW4oMTkyMDkpLGM9big4NjQ3MCkscz1uKDM3NjIwKTtvJiZyKHt0YXJnZXQ6Ik9iamVjdCIscHJvdG86ITAsZm9yY2VkOml9LHtfX2RlZmluZUdldHRlcl9fOmZ1bmN0aW9uKHQsZSl7cy5mKGEodGhpcyksdCx7Z2V0OmMoZSksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX19KX0sNTExNzM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big2MjU1Nik7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFvLHNoYW06IW99LHtkZWZpbmVQcm9wZXJ0aWVzOm4oODY0MDEpfSl9LDU4MTY1OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNjI1NTYpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohbyxzaGFtOiFvfSx7ZGVmaW5lUHJvcGVydHk6bigzNzYyMCkuZn0pfSw5MTIwOTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2MjU1NiksaT1uKDQ3ODEyKSxhPW4oMTkyMDkpLGM9big4NjQ3MCkscz1uKDM3NjIwKTtvJiZyKHt0YXJnZXQ6Ik9iamVjdCIscHJvdG86ITAsZm9yY2VkOml9LHtfX2RlZmluZVNldHRlcl9fOmZ1bmN0aW9uKHQsZSl7cy5mKGEodGhpcyksdCx7c2V0OmMoZSksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX19KX0sODc0MzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDM1NjcpLmVudHJpZXM7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfX0pfSw3NTgwNDpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc0NTIwKSxpPW4oMzIxODcpLGE9bigxMDU5MiksYz1uKDk2MDMpLm9uRnJlZXplLHM9T2JqZWN0LmZyZWV6ZTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6aSgoZnVuY3Rpb24oKXtzKDEpfSkpLHNoYW06IW99LHtmcmVlemU6ZnVuY3Rpb24odCl7cmV0dXJuIHMmJmEodCk/cyhjKHQpKTp0fX0pfSw0NjE0NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDQxMzM0KSxpPW4oNTg4MTApO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7ZnJvbUVudHJpZXM6ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIG8odCwoZnVuY3Rpb24odCxuKXtpKGUsdCxuKX0pLHZvaWQgMCwhMCksZX19KX0sMTUwNzc6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89bigzMjE4NyksaT1uKDk1NzMpLGE9big5NzI1NykuZixjPW4oNjI1NTYpLHM9bygoZnVuY3Rpb24oKXthKDEpfSkpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohY3x8cyxzaGFtOiFjfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoaSh0KSxlKX19KX0sNTgzMjk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big2MjU1NiksaT1uKDI0NDE1KSxhPW4oOTU3MyksYz1uKDk3MjU3KSxzPW4oNTg4MTApO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLHNoYW06IW99LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLHI9YSh0KSxvPWMuZix1PWkociksbD17fSxmPTA7dS5sZW5ndGg+Zjspdm9pZCAwIT09KG49byhyLGU9dVtmKytdKSkmJnMobCxlLG4pO3JldHVybiBsfX0pfSw2MDUyNTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDMyMTg3KSxpPW4oMjY5MzcpLmY7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOm8oKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKDEpfSkpfSx7Z2V0T3duUHJvcGVydHlOYW1lczppfSl9LDc0OTUzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oMzIxODcpLGk9bigxOTIwOSksYT1uKDY0OTY1KSxjPW4oNzE2MDgpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKChmdW5jdGlvbigpe2EoMSl9KSksc2hhbTohY30se2dldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiBhKGkodCkpfX0pfSw1MTY2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oMzIxODcpLGk9bigxMDU5MiksYT1PYmplY3QuaXNFeHRlbnNpYmxlO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKChmdW5jdGlvbigpe2EoMSl9KSl9LHtpc0V4dGVuc2libGU6ZnVuY3Rpb24odCl7cmV0dXJuISFpKHQpJiYoIWF8fGEodCkpfX0pfSw4OTc1ODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDMyMTg3KSxpPW4oMTA1OTIpLGE9T2JqZWN0LmlzRnJvemVuO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKChmdW5jdGlvbigpe2EoMSl9KSl9LHtpc0Zyb3plbjpmdW5jdGlvbih0KXtyZXR1cm4haSh0KXx8ISFhJiZhKHQpfX0pfSwxODM3ODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDMyMTg3KSxpPW4oMTA1OTIpLGE9T2JqZWN0LmlzU2VhbGVkO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKChmdW5jdGlvbigpe2EoMSl9KSl9LHtpc1NlYWxlZDpmdW5jdGlvbih0KXtyZXR1cm4haSh0KXx8ISFhJiZhKHQpfX0pfSw1NDc4MTpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7aXM6big3NjQ4Mil9KX0sOTI1MjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDE5MjA5KSxpPW4oMjU1MDcpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDMyMTg3KSgoZnVuY3Rpb24oKXtpKDEpfSkpfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sNzI1NjA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjI1NTYpLGk9big0NzgxMiksYT1uKDE5MjA5KSxjPW4oNTM0OTgpLHM9big2NDk2NSksdT1uKDk3MjU3KS5mO28mJnIoe3RhcmdldDoiT2JqZWN0Iixwcm90bzohMCxmb3JjZWQ6aX0se19fbG9va3VwR2V0dGVyX186ZnVuY3Rpb24odCl7dmFyIGUsbj1hKHRoaXMpLHI9Yyh0LCEwKTtkb3tpZihlPXUobixyKSlyZXR1cm4gZS5nZXR9d2hpbGUobj1zKG4pKX19KX0sMTA2MzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2MjU1NiksaT1uKDQ3ODEyKSxhPW4oMTkyMDkpLGM9big1MzQ5OCkscz1uKDY0OTY1KSx1PW4oOTcyNTcpLmY7byYmcih7dGFyZ2V0OiJPYmplY3QiLHByb3RvOiEwLGZvcmNlZDppfSx7X19sb29rdXBTZXR0ZXJfXzpmdW5jdGlvbih0KXt2YXIgZSxuPWEodGhpcykscj1jKHQsITApO2Rve2lmKGU9dShuLHIpKXJldHVybiBlLnNldH13aGlsZShuPXMobikpfX0pfSw5MzI3MjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDEwNTkyKSxpPW4oOTYwMykub25GcmVlemUsYT1uKDc0NTIwKSxjPW4oMzIxODcpLHM9T2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpjKChmdW5jdGlvbigpe3MoMSl9KSksc2hhbTohYX0se3ByZXZlbnRFeHRlbnNpb25zOmZ1bmN0aW9uKHQpe3JldHVybiBzJiZvKHQpP3MoaSh0KSk6dH19KX0sNTYxNTg6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89bigxMDU5MiksaT1uKDk2MDMpLm9uRnJlZXplLGE9big3NDUyMCksYz1uKDMyMTg3KSxzPU9iamVjdC5zZWFsO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpjKChmdW5jdGlvbigpe3MoMSl9KSksc2hhbTohYX0se3NlYWw6ZnVuY3Rpb24odCl7cmV0dXJuIHMmJm8odCk/cyhpKHQpKTp0fX0pfSw0MTQ1NjpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7c2V0UHJvdG90eXBlT2Y6big3MTg0Mil9KX0sMzQ1Mjk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTA2MTMpLG89big5MjkxMyksaT1uKDE5NzU4KTtyfHxvKE9iamVjdC5wcm90b3R5cGUsInRvU3RyaW5nIixpLHt1bnNhZmU6ITB9KX0sNzI4NTE6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89bigzNTY3KS52YWx1ZXM7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHt2YWx1ZXM6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9fSl9LDE5NDMzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oMjQ0OTcpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VGbG9hdCE9b30se3BhcnNlRmxvYXQ6b30pfSwzMzQzNzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc4NDYpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LDE3NjI5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDg2NDcwKSxpPW4oODMwODMpLGE9bigzMTE1KSxjPW4oNDEzMzQpO3Ioe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMH0se2FsbFNldHRsZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWkuZihlKSxyPW4ucmVzb2x2ZSxzPW4ucmVqZWN0LHU9YSgoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksaT1bXSxhPTAscz0xO2ModCwoZnVuY3Rpb24odCl7dmFyIG89YSsrLGM9ITE7aS5wdXNoKHZvaWQgMCkscysrLG4uY2FsbChlLHQpLnRoZW4oKGZ1bmN0aW9uKHQpe2N8fChjPSEwLGlbb109e3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTp0fSwtLXN8fHIoaSkpfSksKGZ1bmN0aW9uKHQpe2N8fChjPSEwLGlbb109e3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjp0fSwtLXN8fHIoaSkpfSkpfSkpLC0tc3x8cihpKX0pKTtyZXR1cm4gdS5lcnJvciYmcyh1LnZhbHVlKSxuLnByb21pc2V9fSl9LDQyNDkwOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDY1NjcyKSxpPW4oMzk0NTcpLGE9bigzMjE4NyksYz1uKDc3MDEpLHM9bigxMzk3OSksdT1uKDYzMTM0KSxsPW4oOTI5MTMpO3Ioe3RhcmdldDoiUHJvbWlzZSIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6ISFpJiZhKChmdW5jdGlvbigpe2kucHJvdG90eXBlLmZpbmFsbHkuY2FsbCh7dGhlbjpmdW5jdGlvbigpe319LChmdW5jdGlvbigpe30pKX0pKX0se2ZpbmFsbHk6ZnVuY3Rpb24odCl7dmFyIGU9cyh0aGlzLGMoIlByb21pc2UiKSksbj0iZnVuY3Rpb24iPT10eXBlb2YgdDtyZXR1cm4gdGhpcy50aGVuKG4/ZnVuY3Rpb24obil7cmV0dXJuIHUoZSx0KCkpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbigoZnVuY3Rpb24oKXt0aHJvdyBufSkpfTp0KX19KSxvfHwiZnVuY3Rpb24iIT10eXBlb2YgaXx8aS5wcm90b3R5cGUuZmluYWxseXx8bChpLnByb3RvdHlwZSwiZmluYWxseSIsYygiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5KX0sMTE2ODg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGksYSxjPW4oMTQwNDQpLHM9big2NTY3MiksdT1uKDg5NTU4KSxsPW4oNzcwMSksZj1uKDM5NDU3KSxkPW4oOTI5MTMpLHA9bigxOTI2KSxoPW4oNTExMjgpLHY9big2NzUzOCksZz1uKDEwNTkyKSx5PW4oODY0NzApLG09big1OTM3OSksYj1uKDI0NTk0KSx4PW4oNzY3NzMpLHc9big0MTMzNCksRT1uKDQ3OTYpLGo9bigxMzk3OSksQz1uKDIxNzQ0KS5zZXQsaz1uKDY1NTU1KSxTPW4oNjMxMzQpLE89big4MzYyMCksQT1uKDgzMDgzKSxJPW4oMzExNSksVD1uKDg5ODI3KSxNPW4oNjQ1MDQpLF89bigyMzcyNCksTD1uKDc5MDcxKSxSPV8oInNwZWNpZXMiKSxQPSJQcm9taXNlIixOPVQuZ2V0LEY9VC5zZXQsRD1ULmdldHRlckZvcihQKSxVPWYsQj11LlR5cGVFcnJvcix6PXUuZG9jdW1lbnQsSD11LnByb2Nlc3MsVj1sKCJmZXRjaCIpLHE9QS5mLFc9cSxHPSJwcm9jZXNzIj09YihIKSxaPSEhKHomJnouY3JlYXRlRXZlbnQmJnUuZGlzcGF0Y2hFdmVudCksJD0idW5oYW5kbGVkcmVqZWN0aW9uIixZPU0oUCwoZnVuY3Rpb24oKXtpZighKHgoVSkhPT1TdHJpbmcoVSkpKXtpZig2Nj09PUwpcmV0dXJuITA7aWYoIUcmJiJmdW5jdGlvbiIhPXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpcmV0dXJuITB9aWYocyYmIVUucHJvdG90eXBlLmZpbmFsbHkpcmV0dXJuITA7aWYoTD49NTEmJi9uYXRpdmUgY29kZS8udGVzdChVKSlyZXR1cm4hMTt2YXIgdD1VLnJlc29sdmUoMSksZT1mdW5jdGlvbih0KXt0KChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX07cmV0dXJuKHQuY29uc3RydWN0b3I9e30pW1JdPWUsISh0LnRoZW4oKGZ1bmN0aW9uKCl7fSkpaW5zdGFuY2VvZiBlKX0pKSxLPVl8fCFFKChmdW5jdGlvbih0KXtVLmFsbCh0KS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9KSksSj1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4hKCFnKHQpfHwiZnVuY3Rpb24iIT10eXBlb2YoZT10LnRoZW4pKSYmZX0sWD1mdW5jdGlvbih0LGUsbil7aWYoIWUubm90aWZpZWQpe2Uubm90aWZpZWQ9ITA7dmFyIHI9ZS5yZWFjdGlvbnM7aygoZnVuY3Rpb24oKXtmb3IodmFyIG89ZS52YWx1ZSxpPTE9PWUuc3RhdGUsYT0wO3IubGVuZ3RoPmE7KXt2YXIgYyxzLHUsbD1yW2ErK10sZj1pP2wub2s6bC5mYWlsLGQ9bC5yZXNvbHZlLHA9bC5yZWplY3QsaD1sLmRvbWFpbjt0cnl7Zj8oaXx8KDI9PT1lLnJlamVjdGlvbiYmbnQodCxlKSxlLnJlamVjdGlvbj0xKSwhMD09PWY/Yz1vOihoJiZoLmVudGVyKCksYz1mKG8pLGgmJihoLmV4aXQoKSx1PSEwKSksYz09PWwucHJvbWlzZT9wKEIoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KHM9SihjKSk/cy5jYWxsKGMsZCxwKTpkKGMpKTpwKG8pfWNhdGNoKHQpe2gmJiF1JiZoLmV4aXQoKSxwKHQpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLG4mJiFlLnJlamVjdGlvbiYmdHQodCxlKX0pKX19LFE9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87Wj8oKHI9ei5jcmVhdGVFdmVudCgiRXZlbnQiKSkucHJvbWlzZT1lLHIucmVhc29uPW4sci5pbml0RXZlbnQodCwhMSwhMCksdS5kaXNwYXRjaEV2ZW50KHIpKTpyPXtwcm9taXNlOmUscmVhc29uOm59LChvPXVbIm9uIit0XSk/byhyKTp0PT09JCYmTygiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixuKX0sdHQ9ZnVuY3Rpb24odCxlKXtDLmNhbGwodSwoZnVuY3Rpb24oKXt2YXIgbixyPWUudmFsdWU7aWYoZXQoZSkmJihuPUkoKGZ1bmN0aW9uKCl7Rz9ILmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscix0KTpRKCQsdCxyKX0pKSxlLnJlamVjdGlvbj1HfHxldChlKT8yOjEsbi5lcnJvcikpdGhyb3cgbi52YWx1ZX0pKX0sZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEhPT10LnJlamVjdGlvbiYmIXQucGFyZW50fSxudD1mdW5jdGlvbih0LGUpe0MuY2FsbCh1LChmdW5jdGlvbigpe0c/SC5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpRKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSkpfSxydD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZnVuY3Rpb24obyl7dChlLG4sbyxyKX19LG90PWZ1bmN0aW9uKHQsZSxuLHIpe2UuZG9uZXx8KGUuZG9uZT0hMCxyJiYoZT1yKSxlLnZhbHVlPW4sZS5zdGF0ZT0yLFgodCxlLCEwKSl9LGl0PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxyJiYoZT1yKTt0cnl7aWYodD09PW4pdGhyb3cgQigiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgbz1KKG4pO28/aygoZnVuY3Rpb24oKXt2YXIgcj17ZG9uZTohMX07dHJ5e28uY2FsbChuLHJ0KGl0LHQscixlKSxydChvdCx0LHIsZSkpfWNhdGNoKG4pe290KHQscixuLGUpfX0pKTooZS52YWx1ZT1uLGUuc3RhdGU9MSxYKHQsZSwhMSkpfWNhdGNoKG4pe290KHQse2RvbmU6ITF9LG4sZSl9fX07WSYmKFU9ZnVuY3Rpb24odCl7bSh0aGlzLFUsUCkseSh0KSxyLmNhbGwodGhpcyk7dmFyIGU9Tih0aGlzKTt0cnl7dChydChpdCx0aGlzLGUpLHJ0KG90LHRoaXMsZSkpfWNhdGNoKHQpe290KHRoaXMsZSx0KX19LChyPWZ1bmN0aW9uKHQpe0YodGhpcyx7dHlwZTpQLGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpbXSxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT1wKFUucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKHQsZSl7dmFyIG49RCh0aGlzKSxyPXEoaih0aGlzLFUpKTtyZXR1cm4gci5vaz0iZnVuY3Rpb24iIT10eXBlb2YgdHx8dCxyLmZhaWw9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUsci5kb21haW49Rz9ILmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsbi5yZWFjdGlvbnMucHVzaChyKSwwIT1uLnN0YXRlJiZYKHRoaXMsbiwhMSksci5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0KX19KSxvPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHIsZT1OKHQpO3RoaXMucHJvbWlzZT10LHRoaXMucmVzb2x2ZT1ydChpdCx0LGUpLHRoaXMucmVqZWN0PXJ0KG90LHQsZSl9LEEuZj1xPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09VXx8dD09PWk/bmV3IG8odCk6Vyh0KX0sc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGZ8fChhPWYucHJvdG90eXBlLnRoZW4sZChmLnByb3RvdHlwZSwidGhlbiIsKGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFUoKGZ1bmN0aW9uKHQsZSl7YS5jYWxsKG4sdCxlKX0pKS50aGVuKHQsZSl9KSx7dW5zYWZlOiEwfSksImZ1bmN0aW9uIj09dHlwZW9mIFYmJmMoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uKHQpe3JldHVybiBTKFUsVi5hcHBseSh1LGFyZ3VtZW50cykpfX0pKSksYyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOll9LHtQcm9taXNlOlV9KSxoKFUsUCwhMSwhMCksdihQKSxpPWwoUCksYyh7dGFyZ2V0OlAsc3RhdDohMCxmb3JjZWQ6WX0se3JlamVjdDpmdW5jdGlvbih0KXt2YXIgZT1xKHRoaXMpO3JldHVybiBlLnJlamVjdC5jYWxsKHZvaWQgMCx0KSxlLnByb21pc2V9fSksYyh7dGFyZ2V0OlAsc3RhdDohMCxmb3JjZWQ6c3x8WX0se3Jlc29sdmU6ZnVuY3Rpb24odCl7cmV0dXJuIFMocyYmdGhpcz09PWk/VTp0aGlzLHQpfX0pLGMoe3RhcmdldDpQLHN0YXQ6ITAsZm9yY2VkOkt9LHthbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXEoZSkscj1uLnJlc29sdmUsbz1uLnJlamVjdCxpPUkoKGZ1bmN0aW9uKCl7dmFyIG49eShlLnJlc29sdmUpLGk9W10sYT0wLGM9MTt3KHQsKGZ1bmN0aW9uKHQpe3ZhciBzPWErKyx1PSExO2kucHVzaCh2b2lkIDApLGMrKyxuLmNhbGwoZSx0KS50aGVuKChmdW5jdGlvbih0KXt1fHwodT0hMCxpW3NdPXQsLS1jfHxyKGkpKX0pLG8pfSkpLC0tY3x8cihpKX0pKTtyZXR1cm4gaS5lcnJvciYmbyhpLnZhbHVlKSxuLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXEoZSkscj1uLnJlamVjdCxvPUkoKGZ1bmN0aW9uKCl7dmFyIG89eShlLnJlc29sdmUpO3codCwoZnVuY3Rpb24odCl7by5jYWxsKGUsdCkudGhlbihuLnJlc29sdmUscil9KSl9KSk7cmV0dXJuIG8uZXJyb3ImJnIoby52YWx1ZSksbi5wcm9taXNlfX0pfSwyOTI4NDpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3MDEpLGk9big4NjQ3MCksYT1uKDg3NTc5KSxjPW4oMzIxODcpLHM9bygiUmVmbGVjdCIsImFwcGx5IiksdT1GdW5jdGlvbi5hcHBseTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITAsZm9yY2VkOiFjKChmdW5jdGlvbigpe3MoKGZ1bmN0aW9uKCl7fSkpfSkpfSx7YXBwbHk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpKHQpLGEobikscz9zKHQsZSxuKTp1LmNhbGwodCxlLG4pfX0pfSw2MTk0MzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3MDEpLGk9big4NjQ3MCksYT1uKDg3NTc5KSxjPW4oMTA1OTIpLHM9big1MDg2OCksdT1uKDczNzM5KSxsPW4oMzIxODcpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLGQ9bCgoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiEoZigoZnVuY3Rpb24oKXt9KSxbXSx0KWluc3RhbmNlb2YgdCl9KSkscD0hbCgoZnVuY3Rpb24oKXtmKChmdW5jdGlvbigpe30pKX0pKSxoPWR8fHA7cih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwLGZvcmNlZDpoLHNoYW06aH0se2NvbnN0cnVjdDpmdW5jdGlvbih0LGUpe2kodCksYShlKTt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPDM/dDppKGFyZ3VtZW50c1syXSk7aWYocCYmIWQpcmV0dXJuIGYodCxlLG4pO2lmKHQ9PW4pe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGVbMF0pO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10pfXZhciByPVtudWxsXTtyZXR1cm4gci5wdXNoLmFwcGx5KHIsZSksbmV3KHUuYXBwbHkodCxyKSl9dmFyIG89bi5wcm90b3R5cGUsbD1zKGMobyk/bzpPYmplY3QucHJvdG90eXBlKSxoPUZ1bmN0aW9uLmFwcGx5LmNhbGwodCxsLGUpO3JldHVybiBjKGgpP2g6bH19KX0sMjY5ODY6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big2MjU1NiksaT1uKDg3NTc5KSxhPW4oNTM0OTgpLGM9bigzNzYyMCk7cih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwLGZvcmNlZDpuKDMyMTg3KSgoZnVuY3Rpb24oKXtSZWZsZWN0LmRlZmluZVByb3BlcnR5KGMuZih7fSwxLHt2YWx1ZToxfSksMSx7dmFsdWU6Mn0pfSkpLHNoYW06IW99LHtkZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbih0LGUsbil7aSh0KTt2YXIgcj1hKGUsITApO2kobik7dHJ5e3JldHVybiBjLmYodCxyLG4pLCEwfWNhdGNoKHQpe3JldHVybiExfX19KX0sMTM2NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPW4oOTcyNTcpLmY7cih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwfSx7ZGVsZXRlUHJvcGVydHk6ZnVuY3Rpb24odCxlKXt2YXIgbj1pKG8odCksZSk7cmV0dXJuIShuJiYhbi5jb25maWd1cmFibGUpJiZkZWxldGUgdFtlXX19KX0sNDY1OTc6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big2MjU1NiksaT1uKDg3NTc5KSxhPW4oOTcyNTcpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxzaGFtOiFvfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEuZihpKHQpLGUpfX0pfSw3MDEzNjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPW4oNjQ5NjUpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxzaGFtOiFuKDcxNjA4KX0se2dldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiBpKG8odCkpfX0pfSw4MzMxMDpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDEwNTkyKSxpPW4oODc1NzkpLGE9big3NjI5OCksYz1uKDk3MjU3KSxzPW4oNjQ5NjUpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2dldDpmdW5jdGlvbiB0KGUsbil7dmFyIHIsdSxsPWFyZ3VtZW50cy5sZW5ndGg8Mz9lOmFyZ3VtZW50c1syXTtyZXR1cm4gaShlKT09PWw/ZVtuXToocj1jLmYoZSxuKSk/YShyLCJ2YWx1ZSIpP3IudmFsdWU6dm9pZCAwPT09ci5nZXQ/dm9pZCAwOnIuZ2V0LmNhbGwobCk6byh1PXMoZSkpP3QodSxuLGwpOnZvaWQgMH19KX0sNjA4NjU6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtoYXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbiB0fX0pfSw2NzcwODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPU9iamVjdC5pc0V4dGVuc2libGU7cih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwfSx7aXNFeHRlbnNpYmxlOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQpLCFpfHxpKHQpfX0pfSw5NjYzODpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se293bktleXM6bigyNDQxNSl9KX0sMzk3MzA6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big3NzAxKSxpPW4oODc1NzkpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxzaGFtOiFuKDc0NTIwKX0se3ByZXZlbnRFeHRlbnNpb25zOmZ1bmN0aW9uKHQpe2kodCk7dHJ5e3ZhciBlPW8oIk9iamVjdCIsInByZXZlbnRFeHRlbnNpb25zIik7cmV0dXJuIGUmJmUodCksITB9Y2F0Y2godCl7cmV0dXJuITF9fX0pfSw4NTY4NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPW4oNzk4NjEpLGE9big3MTg0Mik7YSYmcih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwfSx7c2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCxlKXtvKHQpLGkoZSk7dHJ5e3JldHVybiBhKHQsZSksITB9Y2F0Y2godCl7cmV0dXJuITF9fX0pfSw3NDExNTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPW4oMTA1OTIpLGE9big3NjI5OCksYz1uKDMyMTg3KSxzPW4oMzc2MjApLHU9big5NzI1NyksbD1uKDY0OTY1KSxmPW4oMTQyMDkpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6YygoZnVuY3Rpb24oKXt2YXIgdD1zLmYoe30sImEiLHtjb25maWd1cmFibGU6ITB9KTtyZXR1cm4hMSE9PVJlZmxlY3Quc2V0KGwodCksImEiLDEsdCl9KSl9LHtzZXQ6ZnVuY3Rpb24gdChlLG4scil7dmFyIGMsZCxwPWFyZ3VtZW50cy5sZW5ndGg8ND9lOmFyZ3VtZW50c1szXSxoPXUuZihvKGUpLG4pO2lmKCFoKXtpZihpKGQ9bChlKSkpcmV0dXJuIHQoZCxuLHIscCk7aD1mKDApfWlmKGEoaCwidmFsdWUiKSl7aWYoITE9PT1oLndyaXRhYmxlfHwhaShwKSlyZXR1cm4hMTtpZihjPXUuZihwLG4pKXtpZihjLmdldHx8Yy5zZXR8fCExPT09Yy53cml0YWJsZSlyZXR1cm4hMTtjLnZhbHVlPXIscy5mKHAsbixjKX1lbHNlIHMuZihwLG4sZigwLHIpKTtyZXR1cm4hMH1yZXR1cm4gdm9pZCAwIT09aC5zZXQmJihoLnNldC5jYWxsKHAsciksITApfX0pfSw0OTQ5NTpmdW5jdGlvbih0LGUsbil7dmFyIHI9big2MjU1Niksbz1uKDg5NTU4KSxpPW4oNjQ1MDQpLGE9bigzMDI3MiksYz1uKDM3NjIwKS5mLHM9bigxMzMzNCkuZix1PW4oNDMyMjMpLGw9bigyNTQxOSksZj1uKDkyOTEzKSxkPW4oMzIxODcpLHA9big2NzUzOCksaD1uKDIzNzI0KSgibWF0Y2giKSx2PW8uUmVnRXhwLGc9di5wcm90b3R5cGUseT0vYS9nLG09L2EvZyxiPW5ldyB2KHkpIT09eTtpZihyJiZpKCJSZWdFeHAiLCFifHxkKChmdW5jdGlvbigpe3JldHVybiBtW2hdPSExLHYoeSkhPXl8fHYobSk9PW18fCIvYS9pIiE9dih5LCJpIil9KSkpKXtmb3IodmFyIHg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzIGluc3RhbmNlb2YgeCxyPXUodCksbz12b2lkIDA9PT1lO3JldHVybiFuJiZyJiZ0LmNvbnN0cnVjdG9yPT09eCYmbz90OmEoYj9uZXcgdihyJiYhbz90LnNvdXJjZTp0LGUpOnYoKHI9dCBpbnN0YW5jZW9mIHgpP3Quc291cmNlOnQsciYmbz9sLmNhbGwodCk6ZSksbj90aGlzOmcseCl9LHc9ZnVuY3Rpb24odCl7dCBpbiB4fHxjKHgsdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB2W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7dlt0XT1lfX0pfSxFPXModiksaj0wO0UubGVuZ3RoPmo7KXcoRVtqKytdKTtnLmNvbnN0cnVjdG9yPXgseC5wcm90b3R5cGU9ZyxmKG8sIlJlZ0V4cCIseCl9cCgiUmVnRXhwIil9LDg3MjA5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDM4NTk4KTtyKHt0YXJnZXQ6IlJlZ0V4cCIscHJvdG86ITAsZm9yY2VkOi8uLy5leGVjIT09b30se2V4ZWM6b30pfSwxODI3NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9big2MjU1Niksbz1uKDM3NjIwKSxpPW4oMjU0MTkpO3ImJiJnIiE9Ly4vZy5mbGFncyYmby5mKFJlZ0V4cC5wcm90b3R5cGUsImZsYWdzIix7Y29uZmlndXJhYmxlOiEwLGdldDppfSl9LDM3NTQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkyOTEzKSxvPW4oODc1NzkpLGk9bigzMjE4NyksYT1uKDI1NDE5KSxjPSJ0b1N0cmluZyIscz1SZWdFeHAucHJvdG90eXBlLHU9cy50b1N0cmluZyxsPWkoKGZ1bmN0aW9uKCl7cmV0dXJuIi9hL2IiIT11LmNhbGwoe3NvdXJjZToiYSIsZmxhZ3M6ImIifSl9KSksZj11Lm5hbWUhPWM7KGx8fGYpJiZyKFJlZ0V4cC5wcm90b3R5cGUsYywoZnVuY3Rpb24oKXt2YXIgdD1vKHRoaXMpLGU9U3RyaW5nKHQuc291cmNlKSxuPXQuZmxhZ3M7cmV0dXJuIi8iK2UrIi8iK1N0cmluZyh2b2lkIDA9PT1uJiZ0IGluc3RhbmNlb2YgUmVnRXhwJiYhKCJmbGFncyJpbiBzKT9hLmNhbGwodCk6bil9KSx7dW5zYWZlOiEwfSl9LDc0MDYxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big4MTk1MSksbz1uKDY0NTApO3QuZXhwb3J0cz1yKCJTZXQiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSksbyl9LDQxNzczOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMxMzUxKTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oNTIxMjkpKCJhbmNob3IiKX0se2FuY2hvcjpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLCJhIiwibmFtZSIsdCl9fSl9LDMwNDAyOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMxMzUxKTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oNTIxMjkpKCJiaWciKX0se2JpZzpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMsImJpZyIsIiIsIiIpfX0pfSwxODE3NTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMTM1MSk7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDUyMTI5KSgiYmxpbmsiKX0se2JsaW5rOmZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcywiYmxpbmsiLCIiLCIiKX19KX0sNjY4OTY6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzEzNTEpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6big1MjEyOSkoImJvbGQiKX0se2JvbGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLCJiIiwiIiwiIil9fSl9LDE1MzczOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDYwMTQwKS5jb2RlQXQ7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwfSx7Y29kZVBvaW50QXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0KX19KX0sOTc2ODg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPW4oMTQwNDQpLGk9big5NzI1NykuZixhPW4oMjc4ODQpLGM9big5OTM0Nikscz1uKDcwMTMyKSx1PW4oOTM5MTUpLGw9big2NTY3MiksZj0iIi5lbmRzV2l0aCxkPU1hdGgubWluLHA9dSgiZW5kc1dpdGgiKTtvKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiEhKGx8fHB8fChyPWkoU3RyaW5nLnByb3RvdHlwZSwiZW5kc1dpdGgiKSwhcnx8ci53cml0YWJsZSkpJiYhcH0se2VuZHNXaXRoOmZ1bmN0aW9uKHQpe3ZhciBlPVN0cmluZyhzKHRoaXMpKTtjKHQpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHI9YShlLmxlbmd0aCksbz12b2lkIDA9PT1uP3I6ZChhKG4pLHIpLGk9U3RyaW5nKHQpO3JldHVybiBmP2YuY2FsbChlLGksbyk6ZS5zbGljZShvLWkubGVuZ3RoLG8pPT09aX19KX0sODU3Njc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzEzNTEpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6big1MjEyOSkoImZpeGVkIil9LHtmaXhlZDpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMsInR0IiwiIiwiIil9fSl9LDg0MzY6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzEzNTEpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6big1MjEyOSkoImZvbnRjb2xvciIpfSx7Zm9udGNvbG9yOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsImZvbnQiLCJjb2xvciIsdCl9fSl9LDkyMTkyOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMxMzUxKTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oNTIxMjkpKCJmb250c2l6ZSIpfSx7Zm9udHNpemU6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcywiZm9udCIsInNpemUiLHQpfX0pfSwxMDc0MzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc2OTc2KSxpPVN0cmluZy5mcm9tQ2hhckNvZGUsYT1TdHJpbmcuZnJvbUNvZGVQb2ludDtyKHt0YXJnZXQ6IlN0cmluZyIsc3RhdDohMCxmb3JjZWQ6ISFhJiYxIT1hLmxlbmd0aH0se2Zyb21Db2RlUG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49W10scj1hcmd1bWVudHMubGVuZ3RoLGE9MDtyPmE7KXtpZihlPSthcmd1bWVudHNbYSsrXSxvKGUsMTExNDExMSkhPT1lKXRocm93IFJhbmdlRXJyb3IoZSsiIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQiKTtuLnB1c2goZTw2NTUzNj9pKGUpOmkoNTUyOTYrKChlLT02NTUzNik+PjEwKSxlJTEwMjQrNTYzMjApKX1yZXR1cm4gbi5qb2luKCIiKX19KX0sNzQ1NjM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oOTkzNDYpLGk9big3MDEzMik7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohbig5MzkxNSkoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4hIX5TdHJpbmcoaSh0aGlzKSkuaW5kZXhPZihvKHQpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sMTIxNTU6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzEzNTEpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6big1MjEyOSkoIml0YWxpY3MiKX0se2l0YWxpY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLCJpIiwiIiwiIil9fSl9LDgyMjAxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2MDE0MCkuY2hhckF0LG89big4OTgyNyksaT1uKDQ2MDYxKSxhPSJTdHJpbmcgSXRlcmF0b3IiLGM9by5zZXQscz1vLmdldHRlckZvcihhKTtpKFN0cmluZywiU3RyaW5nIiwoZnVuY3Rpb24odCl7Yyh0aGlzLHt0eXBlOmEsc3RyaW5nOlN0cmluZyh0KSxpbmRleDowfSl9KSwoZnVuY3Rpb24oKXt2YXIgdCxlPXModGhpcyksbj1lLnN0cmluZyxvPWUuaW5kZXg7cmV0dXJuIG8+PW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9cihuLG8pLGUuaW5kZXgrPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pKX0sMjYwMTY6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzEzNTEpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6big1MjEyOSkoImxpbmsiKX0se2xpbms6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcywiYSIsImhyZWYiLHQpfX0pfSw4MTI3NzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big3MTIwMSksaT1uKDcwMTMyKSxhPW4oMjc4ODQpLGM9big4NjQ3MCkscz1uKDg3NTc5KSx1PW4oMjQ1OTQpLGw9big0MzIyMyksZj1uKDI1NDE5KSxkPW4oNjY5NzEpLHA9bigzMjE4NyksaD1uKDIzNzI0KSx2PW4oMTM5NzkpLGc9big1MzE0MSkseT1uKDg5ODI3KSxtPW4oNjU2NzIpLGI9aCgibWF0Y2hBbGwiKSx4PSJSZWdFeHAgU3RyaW5nIix3PSJSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yIixFPXkuc2V0LGo9eS5nZXR0ZXJGb3IodyksQz1SZWdFeHAucHJvdG90eXBlLGs9Qy5leGVjLFM9IiIubWF0Y2hBbGwsTz0hIVMmJiFwKChmdW5jdGlvbigpeyJhIi5tYXRjaEFsbCgvLi8pfSkpLEE9bygoZnVuY3Rpb24odCxlLG4scil7RSh0aGlzLHt0eXBlOncscmVnZXhwOnQsc3RyaW5nOmUsZ2xvYmFsOm4sdW5pY29kZTpyLGRvbmU6ITF9KX0pLHgsKGZ1bmN0aW9uKCl7dmFyIHQ9aih0aGlzKTtpZih0LmRvbmUpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTt2YXIgZT10LnJlZ2V4cCxuPXQuc3RyaW5nLHI9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXQuZXhlYztpZigiZnVuY3Rpb24iPT10eXBlb2Ygcil7aWYoIm9iamVjdCIhPXR5cGVvZihuPXIuY2FsbCh0LGUpKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCBleGVjIHJlc3VsdCIpO3JldHVybiBufXJldHVybiBrLmNhbGwodCxlKX0oZSxuKTtyZXR1cm4gbnVsbD09PXI/e3ZhbHVlOnZvaWQgMCxkb25lOnQuZG9uZT0hMH06dC5nbG9iYWw/KCIiPT1TdHJpbmcoclswXSkmJihlLmxhc3RJbmRleD1nKG4sYShlLmxhc3RJbmRleCksdC51bmljb2RlKSkse3ZhbHVlOnIsZG9uZTohMX0pOih0LmRvbmU9ITAse3ZhbHVlOnIsZG9uZTohMX0pfSkpLEk9ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxjLHU9cyh0aGlzKSxsPVN0cmluZyh0KTtyZXR1cm4gZT12KHUsUmVnRXhwKSx2b2lkIDA9PT0obj11LmZsYWdzKSYmdSBpbnN0YW5jZW9mIFJlZ0V4cCYmISgiZmxhZ3MiaW4gQykmJihuPWYuY2FsbCh1KSkscj12b2lkIDA9PT1uPyIiOlN0cmluZyhuKSxvPW5ldyBlKGU9PT1SZWdFeHA/dS5zb3VyY2U6dSxyKSxpPSEhfnIuaW5kZXhPZigiZyIpLGM9ISF+ci5pbmRleE9mKCJ1Iiksby5sYXN0SW5kZXg9YSh1Lmxhc3RJbmRleCksbmV3IEEobyxsLGksYyl9O3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6T30se21hdGNoQWxsOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPWkodGhpcyk7aWYobnVsbCE9dCl7aWYobCh0KSYmIX5TdHJpbmcoaSgiZmxhZ3MiaW4gQz90LmZsYWdzOmYuY2FsbCh0KSkpLmluZGV4T2YoImciKSl0aHJvdyBUeXBlRXJyb3IoImAubWF0Y2hBbGxgIGRvZXMgbm90IGFsbG93IG5vbi1nbG9iYWwgcmVnZXhlcyIpO2lmKE8pcmV0dXJuIFMuYXBwbHkobyxhcmd1bWVudHMpO2lmKHZvaWQgMD09PShuPXRbYl0pJiZtJiYiUmVnRXhwIj09dSh0KSYmKG49SSksbnVsbCE9bilyZXR1cm4gYyhuKS5jYWxsKHQsbyl9ZWxzZSBpZihPKXJldHVybiBTLmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gZT1TdHJpbmcobykscj1uZXcgUmVnRXhwKHQsImciKSxtP0kuY2FsbChyLGUpOnJbYl0oZSl9fSksbXx8YiBpbiBDfHxkKEMsYixJKX0sNjUwMDM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM1ODYwKSxvPW4oODc1NzkpLGk9bigyNzg4NCksYT1uKDcwMTMyKSxjPW4oNTMxNDEpLHM9bigzNTQ1NSk7cigibWF0Y2giLDEsKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bZnVuY3Rpb24oZSl7dmFyIG49YSh0aGlzKSxyPW51bGw9PWU/dm9pZCAwOmVbdF07cmV0dXJuIHZvaWQgMCE9PXI/ci5jYWxsKGUsbik6bmV3IFJlZ0V4cChlKVt0XShTdHJpbmcobikpfSxmdW5jdGlvbih0KXt2YXIgcj1uKGUsdCx0aGlzKTtpZihyLmRvbmUpcmV0dXJuIHIudmFsdWU7dmFyIGE9byh0KSx1PVN0cmluZyh0aGlzKTtpZighYS5nbG9iYWwpcmV0dXJuIHMoYSx1KTt2YXIgbD1hLnVuaWNvZGU7YS5sYXN0SW5kZXg9MDtmb3IodmFyIGYsZD1bXSxwPTA7bnVsbCE9PShmPXMoYSx1KSk7KXt2YXIgaD1TdHJpbmcoZlswXSk7ZFtwXT1oLCIiPT09aCYmKGEubGFzdEluZGV4PWModSxpKGEubGFzdEluZGV4KSxsKSkscCsrfXJldHVybiAwPT09cD9udWxsOmR9XX0pKX0sNDQwMTk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMjY1NzMpLmVuZDtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oNDIxODQpfSx7cGFkRW5kOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LDM4MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigyNjU3Mykuc3RhcnQ7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDQyMTg0KX0se3BhZFN0YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LDgwNTExOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oOTU3MyksaT1uKDI3ODg0KTtyKHt0YXJnZXQ6IlN0cmluZyIsc3RhdDohMH0se3JhdzpmdW5jdGlvbih0KXtmb3IodmFyIGU9byh0LnJhdyksbj1pKGUubGVuZ3RoKSxyPWFyZ3VtZW50cy5sZW5ndGgsYT1bXSxjPTA7bj5jOylhLnB1c2goU3RyaW5nKGVbYysrXSkpLGM8ciYmYS5wdXNoKFN0cmluZyhhcmd1bWVudHNbY10pKTtyZXR1cm4gYS5qb2luKCIiKX19KX0sMTg4MjM6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITB9LHtyZXBlYXQ6big2ODI1Myl9KX0sMzMzMjI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM1ODYwKSxvPW4oODc1NzkpLGk9bigxOTIwOSksYT1uKDI3ODg0KSxjPW4oNDM0MTYpLHM9big3MDEzMiksdT1uKDUzMTQxKSxsPW4oMzU0NTUpLGY9TWF0aC5tYXgsZD1NYXRoLm1pbixwPU1hdGguZmxvb3IsaD0vXCQoWyQmJ2BdfFxkXGQ/fDxbXj5dKj4pL2csdj0vXCQoWyQmJ2BdfFxkXGQ/KS9nO3IoInJlcGxhY2UiLDIsKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bZnVuY3Rpb24obixyKXt2YXIgbz1zKHRoaXMpLGk9bnVsbD09bj92b2lkIDA6blt0XTtyZXR1cm4gdm9pZCAwIT09aT9pLmNhbGwobixvLHIpOmUuY2FsbChTdHJpbmcobyksbixyKX0sZnVuY3Rpb24odCxpKXt2YXIgcz1uKGUsdCx0aGlzLGkpO2lmKHMuZG9uZSlyZXR1cm4gcy52YWx1ZTt2YXIgcD1vKHQpLGg9U3RyaW5nKHRoaXMpLHY9ImZ1bmN0aW9uIj09dHlwZW9mIGk7dnx8KGk9U3RyaW5nKGkpKTt2YXIgZz1wLmdsb2JhbDtpZihnKXt2YXIgeT1wLnVuaWNvZGU7cC5sYXN0SW5kZXg9MH1mb3IodmFyIG09W107Oyl7dmFyIGI9bChwLGgpO2lmKG51bGw9PT1iKWJyZWFrO2lmKG0ucHVzaChiKSwhZylicmVhazsiIj09PVN0cmluZyhiWzBdKSYmKHAubGFzdEluZGV4PXUoaCxhKHAubGFzdEluZGV4KSx5KSl9Zm9yKHZhciB4LHc9IiIsRT0wLGo9MDtqPG0ubGVuZ3RoO2orKyl7Yj1tW2pdO2Zvcih2YXIgQz1TdHJpbmcoYlswXSksaz1mKGQoYyhiLmluZGV4KSxoLmxlbmd0aCksMCksUz1bXSxPPTE7TzxiLmxlbmd0aDtPKyspUy5wdXNoKHZvaWQgMD09PSh4PWJbT10pP3g6U3RyaW5nKHgpKTt2YXIgQT1iLmdyb3VwcztpZih2KXt2YXIgST1bQ10uY29uY2F0KFMsayxoKTt2b2lkIDAhPT1BJiZJLnB1c2goQSk7dmFyIFQ9U3RyaW5nKGkuYXBwbHkodm9pZCAwLEkpKX1lbHNlIFQ9cihDLGgsayxTLEEsaSk7az49RSYmKHcrPWguc2xpY2UoRSxrKStULEU9aytDLmxlbmd0aCl9cmV0dXJuIHcraC5zbGljZShFKX1dO2Z1bmN0aW9uIHIodCxuLHIsbyxhLGMpe3ZhciBzPXIrdC5sZW5ndGgsdT1vLmxlbmd0aCxsPXY7cmV0dXJuIHZvaWQgMCE9PWEmJihhPWkoYSksbD1oKSxlLmNhbGwoYyxsLChmdW5jdGlvbihlLGkpe3ZhciBjO3N3aXRjaChpLmNoYXJBdCgwKSl7Y2FzZSIkIjpyZXR1cm4iJCI7Y2FzZSImIjpyZXR1cm4gdDtjYXNlImAiOnJldHVybiBuLnNsaWNlKDAscik7Y2FzZSInIjpyZXR1cm4gbi5zbGljZShzKTtjYXNlIjwiOmM9YVtpLnNsaWNlKDEsLTEpXTticmVhaztkZWZhdWx0OnZhciBsPStpO2lmKDA9PT1sKXJldHVybiBlO2lmKGw+dSl7dmFyIGY9cChsLzEwKTtyZXR1cm4gMD09PWY/ZTpmPD11P3ZvaWQgMD09PW9bZi0xXT9pLmNoYXJBdCgxKTpvW2YtMV0raS5jaGFyQXQoMSk6ZX1jPW9bbC0xXX1yZXR1cm4gdm9pZCAwPT09Yz8iIjpjfSkpfX0pKX0sMzMwNjU6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM1ODYwKSxvPW4oODc1NzkpLGk9big3MDEzMiksYT1uKDc2NDgyKSxjPW4oMzU0NTUpO3IoInNlYXJjaCIsMSwoZnVuY3Rpb24odCxlLG4pe3JldHVybltmdW5jdGlvbihlKXt2YXIgbj1pKHRoaXMpLHI9bnVsbD09ZT92b2lkIDA6ZVt0XTtyZXR1cm4gdm9pZCAwIT09cj9yLmNhbGwoZSxuKTpuZXcgUmVnRXhwKGUpW3RdKFN0cmluZyhuKSl9LGZ1bmN0aW9uKHQpe3ZhciByPW4oZSx0LHRoaXMpO2lmKHIuZG9uZSlyZXR1cm4gci52YWx1ZTt2YXIgaT1vKHQpLHM9U3RyaW5nKHRoaXMpLHU9aS5sYXN0SW5kZXg7YSh1LDApfHwoaS5sYXN0SW5kZXg9MCk7dmFyIGw9YyhpLHMpO3JldHVybiBhKGkubGFzdEluZGV4LHUpfHwoaS5sYXN0SW5kZXg9dSksbnVsbD09PWw/LTE6bC5pbmRleH1dfSkpfSw3NDExNzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMTM1MSk7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDUyMTI5KSgic21hbGwiKX0se3NtYWxsOmZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcywic21hbGwiLCIiLCIiKX19KX0sMTc0OTQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM1ODYwKSxvPW4oNDMyMjMpLGk9big4NzU3OSksYT1uKDcwMTMyKSxjPW4oMTM5NzkpLHM9big1MzE0MSksdT1uKDI3ODg0KSxsPW4oMzU0NTUpLGY9bigzODU5OCksZD1uKDMyMTg3KSxwPVtdLnB1c2gsaD1NYXRoLm1pbix2PTQyOTQ5NjcyOTUsZz0hZCgoZnVuY3Rpb24oKXtyZXR1cm4hUmVnRXhwKHYsInkiKX0pKTtyKCJzcGxpdCIsMiwoZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybiByPSJjIj09ImFiYmMiLnNwbGl0KC8oYikqLylbMV18fDQhPSJ0ZXN0Ii5zcGxpdCgvKD86KS8sLTEpLmxlbmd0aHx8MiE9ImFiIi5zcGxpdCgvKD86YWIpKi8pLmxlbmd0aHx8NCE9Ii4iLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aHx8Ii4iLnNwbGl0KC8oKSgpLykubGVuZ3RoPjF8fCIiLnNwbGl0KC8uPy8pLmxlbmd0aD9mdW5jdGlvbih0LG4pe3ZhciByPVN0cmluZyhhKHRoaXMpKSxpPXZvaWQgMD09PW4/djpuPj4+MDtpZigwPT09aSlyZXR1cm5bXTtpZih2b2lkIDA9PT10KXJldHVybltyXTtpZighbyh0KSlyZXR1cm4gZS5jYWxsKHIsdCxpKTtmb3IodmFyIGMscyx1LGw9W10sZD0odC5pZ25vcmVDYXNlPyJpIjoiIikrKHQubXVsdGlsaW5lPyJtIjoiIikrKHQudW5pY29kZT8idSI6IiIpKyh0LnN0aWNreT8ieSI6IiIpLGg9MCxnPW5ldyBSZWdFeHAodC5zb3VyY2UsZCsiZyIpOyhjPWYuY2FsbChnLHIpKSYmISgocz1nLmxhc3RJbmRleCk+aCYmKGwucHVzaChyLnNsaWNlKGgsYy5pbmRleCkpLGMubGVuZ3RoPjEmJmMuaW5kZXg8ci5sZW5ndGgmJnAuYXBwbHkobCxjLnNsaWNlKDEpKSx1PWNbMF0ubGVuZ3RoLGg9cyxsLmxlbmd0aD49aSkpOylnLmxhc3RJbmRleD09PWMuaW5kZXgmJmcubGFzdEluZGV4Kys7cmV0dXJuIGg9PT1yLmxlbmd0aD8hdSYmZy50ZXN0KCIiKXx8bC5wdXNoKCIiKTpsLnB1c2goci5zbGljZShoKSksbC5sZW5ndGg+aT9sLnNsaWNlKDAsaSk6bH06IjAiLnNwbGl0KHZvaWQgMCwwKS5sZW5ndGg/ZnVuY3Rpb24odCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmMD09PW4/W106ZS5jYWxsKHRoaXMsdCxuKX06ZSxbZnVuY3Rpb24oZSxuKXt2YXIgbz1hKHRoaXMpLGk9bnVsbD09ZT92b2lkIDA6ZVt0XTtyZXR1cm4gdm9pZCAwIT09aT9pLmNhbGwoZSxvLG4pOnIuY2FsbChTdHJpbmcobyksZSxuKX0sZnVuY3Rpb24odCxvKXt2YXIgYT1uKHIsdCx0aGlzLG8sciE9PWUpO2lmKGEuZG9uZSlyZXR1cm4gYS52YWx1ZTt2YXIgZj1pKHQpLGQ9U3RyaW5nKHRoaXMpLHA9YyhmLFJlZ0V4cCkseT1mLnVuaWNvZGUsbT0oZi5pZ25vcmVDYXNlPyJpIjoiIikrKGYubXVsdGlsaW5lPyJtIjoiIikrKGYudW5pY29kZT8idSI6IiIpKyhnPyJ5IjoiZyIpLGI9bmV3IHAoZz9mOiJeKD86IitmLnNvdXJjZSsiKSIsbSkseD12b2lkIDA9PT1vP3Y6bz4+PjA7aWYoMD09PXgpcmV0dXJuW107aWYoMD09PWQubGVuZ3RoKXJldHVybiBudWxsPT09bChiLGQpP1tkXTpbXTtmb3IodmFyIHc9MCxFPTAsaj1bXTtFPGQubGVuZ3RoOyl7Yi5sYXN0SW5kZXg9Zz9FOjA7dmFyIEMsaz1sKGIsZz9kOmQuc2xpY2UoRSkpO2lmKG51bGw9PT1rfHwoQz1oKHUoYi5sYXN0SW5kZXgrKGc/MDpFKSksZC5sZW5ndGgpKT09PXcpRT1zKGQsRSx5KTtlbHNle2lmKGoucHVzaChkLnNsaWNlKHcsRSkpLGoubGVuZ3RoPT09eClyZXR1cm4gajtmb3IodmFyIFM9MTtTPD1rLmxlbmd0aC0xO1MrKylpZihqLnB1c2goa1tTXSksai5sZW5ndGg9PT14KXJldHVybiBqO0U9dz1DfX1yZXR1cm4gai5wdXNoKGQuc2xpY2UodykpLGp9XX0pLCFnKX0sODAzNjM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPW4oMTQwNDQpLGk9big5NzI1NykuZixhPW4oMjc4ODQpLGM9big5OTM0Nikscz1uKDcwMTMyKSx1PW4oOTM5MTUpLGw9big2NTY3MiksZj0iIi5zdGFydHNXaXRoLGQ9TWF0aC5taW4scD11KCJzdGFydHNXaXRoIik7byh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohIShsfHxwfHwocj1pKFN0cmluZy5wcm90b3R5cGUsInN0YXJ0c1dpdGgiKSwhcnx8ci53cml0YWJsZSkpJiYhcH0se3N0YXJ0c1dpdGg6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHModGhpcykpO2ModCk7dmFyIG49YShkKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLGUubGVuZ3RoKSkscj1TdHJpbmcodCk7cmV0dXJuIGY/Zi5jYWxsKGUscixuKTplLnNsaWNlKG4sbityLmxlbmd0aCk9PT1yfX0pfSwyODAwMzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89bigzMTM1MSk7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDUyMTI5KSgic3RyaWtlIil9LHtzdHJpa2U6ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLCJzdHJpa2UiLCIiLCIiKX19KX0sNjc5NDE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oMzEzNTEpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6big1MjEyOSkoInN1YiIpfSx7c3ViOmZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcywic3ViIiwiIiwiIil9fSl9LDQ0MDUxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDMxMzUxKTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oNTIxMjkpKCJzdXAiKX0se3N1cDpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMsInN1cCIsIiIsIiIpfX0pfSw3NDc5NTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4MjM1MCkuZW5kLGk9big4NDc1NCkoInRyaW1FbmQiKSxhPWk/ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKX06IiIudHJpbUVuZDtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOml9LHt0cmltRW5kOmEsdHJpbVJpZ2h0OmF9KX0sNjkxODg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODIzNTApLnN0YXJ0LGk9big4NDc1NCkoInRyaW1TdGFydCIpLGE9aT9mdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfToiIi50cmltU3RhcnQ7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDppfSx7dHJpbVN0YXJ0OmEsdHJpbUxlZnQ6YX0pfSw0MzM5NjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4MjM1MCkudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oODQ3NTQpKCJ0cmltIil9LHt0cmltOmZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcyl9fSl9LDUxMDkwOmZ1bmN0aW9uKHQsZSxuKXtuKDkyMjc1KSgiYXN5bmNJdGVyYXRvciIpfSwyNDc4NTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2MjU1NiksaT1uKDg5NTU4KSxhPW4oNzYyOTgpLGM9bigxMDU5Mikscz1uKDM3NjIwKS5mLHU9big5OTYyNSksbD1pLlN5bWJvbDtpZihvJiYiZnVuY3Rpb24iPT10eXBlb2YgbCYmKCEoImRlc2NyaXB0aW9uImluIGwucHJvdG90eXBlKXx8dm9pZCAwIT09bCgpLmRlc2NyaXB0aW9uKSl7dmFyIGY9e30sZD1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg8MXx8dm9pZCAwPT09YXJndW1lbnRzWzBdP3ZvaWQgMDpTdHJpbmcoYXJndW1lbnRzWzBdKSxlPXRoaXMgaW5zdGFuY2VvZiBkP25ldyBsKHQpOnZvaWQgMD09PXQ/bCgpOmwodCk7cmV0dXJuIiI9PT10JiYoZltlXT0hMCksZX07dShkLGwpO3ZhciBwPWQucHJvdG90eXBlPWwucHJvdG90eXBlO3AuY29uc3RydWN0b3I9ZDt2YXIgaD1wLnRvU3RyaW5nLHY9IlN5bWJvbCh0ZXN0KSI9PVN0cmluZyhsKCJ0ZXN0IikpLGc9L15TeW1ib2xcKCguKilcKVteKV0rJC87cyhwLCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1jKHRoaXMpP3RoaXMudmFsdWVPZigpOnRoaXMsZT1oLmNhbGwodCk7aWYoYShmLHQpKXJldHVybiIiO3ZhciBuPXY/ZS5zbGljZSg3LC0xKTplLnJlcGxhY2UoZywiJDEiKTtyZXR1cm4iIj09PW4/dm9pZCAwOm59fSkscih7Z2xvYmFsOiEwLGZvcmNlZDohMH0se1N5bWJvbDpkfSl9fSw4OTE3OmZ1bmN0aW9uKHQsZSxuKXtuKDkyMjc1KSgiaGFzSW5zdGFuY2UiKX0sNTQ3ODY6ZnVuY3Rpb24odCxlLG4pe24oOTIyNzUpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sMTI4MTY6ZnVuY3Rpb24odCxlLG4pe24oOTIyNzUpKCJpdGVyYXRvciIpfSw2NTY3OTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4OTU1OCksaT1uKDc3MDEpLGE9big2NTY3MiksYz1uKDYyNTU2KSxzPW4oOTAxNCksdT1uKDE2NDEwKSxsPW4oMzIxODcpLGY9big3NjI5OCksZD1uKDYxOTkpLHA9bigxMDU5MiksaD1uKDg3NTc5KSx2PW4oMTkyMDkpLGc9big5NTczKSx5PW4oNTM0OTgpLG09bigxNDIwOSksYj1uKDUwODY4KSx4PW4oMjU1MDcpLHc9bigxMzMzNCksRT1uKDI2OTM3KSxqPW4oNTY5OTEpLEM9big5NzI1Nyksaz1uKDM3NjIwKSxTPW4oNDE2MjgpLE89big2Njk3MSksQT1uKDkyOTEzKSxJPW4oNjIwNTQpLFQ9big4MzE5NyksTT1uKDIzMDcwKSxfPW4oNjcyOSksTD1uKDIzNzI0KSxSPW4oNzM5MTYpLFA9big5MjI3NSksTj1uKDUxMTI4KSxGPW4oODk4MjcpLEQ9bigzMDAyNSkuZm9yRWFjaCxVPVQoImhpZGRlbiIpLEI9IlN5bWJvbCIsej1MKCJ0b1ByaW1pdGl2ZSIpLEg9Ri5zZXQsVj1GLmdldHRlckZvcihCKSxxPU9iamVjdC5wcm90b3R5cGUsVz1vLlN5bWJvbCxHPWkoIkpTT04iLCJzdHJpbmdpZnkiKSxaPUMuZiwkPWsuZixZPUUuZixLPVMuZixKPUkoInN5bWJvbHMiKSxYPUkoIm9wLXN5bWJvbHMiKSxRPUkoInN0cmluZy10by1zeW1ib2wtcmVnaXN0cnkiKSx0dD1JKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksZXQ9SSgid2tzIiksbnQ9by5RT2JqZWN0LHJ0PSFudHx8IW50LnByb3RvdHlwZXx8IW50LnByb3RvdHlwZS5maW5kQ2hpbGQsb3Q9YyYmbCgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9YigkKHt9LCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcywiYSIse3ZhbHVlOjd9KS5hfX0pKS5hfSkpP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj1aKHEsZSk7ciYmZGVsZXRlIHFbZV0sJCh0LGUsbiksciYmdCE9PXEmJiQocSxlLHIpfTokLGl0PWZ1bmN0aW9uKHQsZSl7dmFyIG49Slt0XT1iKFcucHJvdG90eXBlKTtyZXR1cm4gSChuLHt0eXBlOkIsdGFnOnQsZGVzY3JpcHRpb246ZX0pLGN8fChuLmRlc2NyaXB0aW9uPWUpLG59LGF0PXMmJiJzeW1ib2wiPT10eXBlb2YgVy5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QodClpbnN0YW5jZW9mIFd9LGN0PWZ1bmN0aW9uKHQsZSxuKXt0PT09cSYmY3QoWCxlLG4pLGgodCk7dmFyIHI9eShlLCEwKTtyZXR1cm4gaChuKSxmKEoscik/KG4uZW51bWVyYWJsZT8oZih0LFUpJiZ0W1VdW3JdJiYodFtVXVtyXT0hMSksbj1iKG4se2VudW1lcmFibGU6bSgwLCExKX0pKTooZih0LFUpfHwkKHQsVSxtKDEse30pKSx0W1VdW3JdPSEwKSxvdCh0LHIsbikpOiQodCxyLG4pfSxzdD1mdW5jdGlvbih0LGUpe2godCk7dmFyIG49ZyhlKSxyPXgobikuY29uY2F0KGR0KG4pKTtyZXR1cm4gRChyLChmdW5jdGlvbihlKXtjJiYhdXQuY2FsbChuLGUpfHxjdCh0LGUsbltlXSl9KSksdH0sdXQ9ZnVuY3Rpb24odCl7dmFyIGU9eSh0LCEwKSxuPUsuY2FsbCh0aGlzLGUpO3JldHVybiEodGhpcz09PXEmJmYoSixlKSYmIWYoWCxlKSkmJighKG58fCFmKHRoaXMsZSl8fCFmKEosZSl8fGYodGhpcyxVKSYmdGhpc1tVXVtlXSl8fG4pfSxsdD1mdW5jdGlvbih0LGUpe3ZhciBuPWcodCkscj15KGUsITApO2lmKG4hPT1xfHwhZihKLHIpfHxmKFgscikpe3ZhciBvPVoobixyKTtyZXR1cm4hb3x8IWYoSixyKXx8ZihuLFUpJiZuW1VdW3JdfHwoby5lbnVtZXJhYmxlPSEwKSxvfX0sZnQ9ZnVuY3Rpb24odCl7dmFyIGU9WShnKHQpKSxuPVtdO3JldHVybiBEKGUsKGZ1bmN0aW9uKHQpe2YoSix0KXx8ZihNLHQpfHxuLnB1c2godCl9KSksbn0sZHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PXEsbj1ZKGU/WDpnKHQpKSxyPVtdO3JldHVybiBEKG4sKGZ1bmN0aW9uKHQpeyFmKEosdCl8fGUmJiFmKHEsdCl8fHIucHVzaChKW3RdKX0pKSxyfTsoc3x8KFc9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgVyl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1fKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PXEmJm4uY2FsbChYLHQpLGYodGhpcyxVKSYmZih0aGlzW1VdLGUpJiYodGhpc1tVXVtlXT0hMSksb3QodGhpcyxlLG0oMSx0KSl9O3JldHVybiBjJiZydCYmb3QocSxlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxpdChlLHQpfSxBKFcucHJvdG90eXBlLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIFYodGhpcykudGFnfSkpLFMuZj11dCxrLmY9Y3QsQy5mPWx0LHcuZj1FLmY9ZnQsai5mPWR0LGMmJigkKFcucHJvdG90eXBlLCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVih0aGlzKS5kZXNjcmlwdGlvbn19KSxhfHxBKHEsInByb3BlcnR5SXNFbnVtZXJhYmxlIix1dCx7dW5zYWZlOiEwfSkpKSx1fHwoUi5mPWZ1bmN0aW9uKHQpe3JldHVybiBpdChMKHQpLHQpfSkscih7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOiFzLHNoYW06IXN9LHtTeW1ib2w6V30pLEQoeChldCksKGZ1bmN0aW9uKHQpe1AodCl9KSkscih7dGFyZ2V0OkIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGYoUSxlKSlyZXR1cm4gUVtlXTt2YXIgbj1XKGUpO3JldHVybiBRW2VdPW4sdHRbbl09ZSxufSxrZXlGb3I6ZnVuY3Rpb24odCl7aWYoIWF0KHQpKXRocm93IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgc3ltYm9sIik7aWYoZih0dCx0KSlyZXR1cm4gdHRbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe3J0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtydD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohY30se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP2IodCk6c3QoYih0KSxlKX0sZGVmaW5lUHJvcGVydHk6Y3QsZGVmaW5lUHJvcGVydGllczpzdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6bHR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmZ0LGdldE93blByb3BlcnR5U3ltYm9sczpkdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpsKChmdW5jdGlvbigpe2ouZigxKX0pKX0se2dldE93blByb3BlcnR5U3ltYm9sczpmdW5jdGlvbih0KXtyZXR1cm4gai5mKHYodCkpfX0pLEcpJiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHxsKChmdW5jdGlvbigpe3ZhciB0PVcoKTtyZXR1cm4iW251bGxdIiE9RyhbdF0pfHwie30iIT1HKHthOnR9KXx8Int9IiE9RyhPYmplY3QodCkpfSkpfSx7c3RyaW5naWZ5OmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsbz1bdF0saT0xO2FyZ3VtZW50cy5sZW5ndGg+aTspby5wdXNoKGFyZ3VtZW50c1tpKytdKTtpZihyPWUsKHAoZSl8fHZvaWQgMCE9PXQpJiYhYXQodCkpcmV0dXJuIGQoZSl8fChlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJihlPXIuY2FsbCh0aGlzLHQsZSkpLCFhdChlKSlyZXR1cm4gZX0pLG9bMV09ZSxHLmFwcGx5KG51bGwsbyl9fSk7Vy5wcm90b3R5cGVbel18fE8oVy5wcm90b3R5cGUseixXLnByb3RvdHlwZS52YWx1ZU9mKSxOKFcsQiksTVtVXT0hMH0sOTgzMDY6ZnVuY3Rpb24odCxlLG4pe24oOTIyNzUpKCJtYXRjaEFsbCIpfSw2MTkyNDpmdW5jdGlvbih0LGUsbil7big5MjI3NSkoIm1hdGNoIil9LDEyMDI1OmZ1bmN0aW9uKHQsZSxuKXtuKDkyMjc1KSgicmVwbGFjZSIpfSwyODMzOmZ1bmN0aW9uKHQsZSxuKXtuKDkyMjc1KSgic2VhcmNoIil9LDk2NDUzOmZ1bmN0aW9uKHQsZSxuKXtuKDkyMjc1KSgic3BlY2llcyIpfSw3MDg2MzpmdW5jdGlvbih0LGUsbil7big5MjI3NSkoInNwbGl0Iil9LDI0ODAyOmZ1bmN0aW9uKHQsZSxuKXtuKDkyMjc1KSgidG9QcmltaXRpdmUiKX0sMTgyNzM6ZnVuY3Rpb24odCxlLG4pe24oOTIyNzUpKCJ0b1N0cmluZ1RhZyIpfSw0MjQxMTpmdW5jdGlvbih0LGUsbil7big5MjI3NSkoInVuc2NvcGFibGVzIil9LDc0MjMwOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3MzA3NCksbz1uKDk5NDMxKSxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiY29weVdpdGhpbiIsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uY2FsbChpKHRoaXMpLHQsZSxhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCl9KSl9LDE4NTA2OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3MzA3NCksbz1uKDMwMDI1KS5ldmVyeSxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZXZlcnkiLChmdW5jdGlvbih0KXtyZXR1cm4gbyhpKHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpfSwyMDI0MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89big2NTg5NSksaT1yLmFUeXBlZEFycmF5OygwLHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCkoImZpbGwiLChmdW5jdGlvbih0KXtyZXR1cm4gby5hcHBseShpKHRoaXMpLGFyZ3VtZW50cyl9KSl9LDI4MTU1OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3MzA3NCksbz1uKDMwMDI1KS5maWx0ZXIsaT1uKDEzOTc5KSxhPXIuYVR5cGVkQXJyYXksYz1yLmFUeXBlZEFycmF5Q29uc3RydWN0b3I7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmlsdGVyIiwoZnVuY3Rpb24odCl7Zm9yKHZhciBlPW8oYSh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKSxuPWkodGhpcyx0aGlzLmNvbnN0cnVjdG9yKSxyPTAscz1lLmxlbmd0aCx1PW5ldyhjKG4pKShzKTtzPnI7KXVbcl09ZVtyKytdO3JldHVybiB1fSkpfSw3NjQ0MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89bigzMDAyNSkuZmluZEluZGV4LGk9ci5hVHlwZWRBcnJheTsoMCxyLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJmaW5kSW5kZXgiLChmdW5jdGlvbih0KXtyZXR1cm4gbyhpKHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpfSwzMzkwMTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89bigzMDAyNSkuZmluZCxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmluZCIsKGZ1bmN0aW9uKHQpe3JldHVybiBvKGkodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSl9LDI2ODA6ZnVuY3Rpb24odCxlLG4pe24oOTMwMTcpKCJGbG9hdDMyIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdCh0aGlzLGUsbixyKX19KSl9LDM4MjgwOmZ1bmN0aW9uKHQsZSxuKXtuKDkzMDE3KSgiRmxvYXQ2NCIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIHQodGhpcyxlLG4scil9fSkpfSw4ODYzNjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89bigzMDAyNSkuZm9yRWFjaCxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZm9yRWFjaCIsKGZ1bmN0aW9uKHQpe28oaSh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sMTg1NTk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM1NjI3KTsoMCxuKDczMDc0KS5leHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kKSgiZnJvbSIsbigyMDQ1NSkscil9LDgxNDYzOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3MzA3NCksbz1uKDg1ODAzKS5pbmNsdWRlcyxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiaW5jbHVkZXMiLChmdW5jdGlvbih0KXtyZXR1cm4gbyhpKHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpfSw5NTE2MzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89big4NTgwMykuaW5kZXhPZixpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiaW5kZXhPZiIsKGZ1bmN0aW9uKHQpe3JldHVybiBvKGkodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSl9LDI0NDk4OmZ1bmN0aW9uKHQsZSxuKXtuKDkzMDE3KSgiSW50MTYiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0KHRoaXMsZSxuLHIpfX0pKX0sMTcxNTI6ZnVuY3Rpb24odCxlLG4pe24oOTMwMTcpKCJJbnQzMiIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIHQodGhpcyxlLG4scil9fSkpfSw3MDM3MzpmdW5jdGlvbih0LGUsbil7big5MzAxNykoIkludDgiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0KHRoaXMsZSxuLHIpfX0pKX0sODM2NzM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDg5NTU4KSxvPW4oNzMwNzQpLGk9big1MDA2MyksYT1uKDIzNzI0KSgiaXRlcmF0b3IiKSxjPXIuVWludDhBcnJheSxzPWkudmFsdWVzLHU9aS5rZXlzLGw9aS5lbnRyaWVzLGY9by5hVHlwZWRBcnJheSxkPW8uZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxwPWMmJmMucHJvdG90eXBlW2FdLGg9ISFwJiYoInZhbHVlcyI9PXAubmFtZXx8bnVsbD09cC5uYW1lKSx2PWZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbChmKHRoaXMpKX07ZCgiZW50cmllcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGwuY2FsbChmKHRoaXMpKX0pKSxkKCJrZXlzIiwoZnVuY3Rpb24oKXtyZXR1cm4gdS5jYWxsKGYodGhpcykpfSkpLGQoInZhbHVlcyIsdiwhaCksZChhLHYsIWgpfSwyMzU2ODpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89ci5hVHlwZWRBcnJheSxpPXIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxhPVtdLmpvaW47aSgiam9pbiIsKGZ1bmN0aW9uKHQpe3JldHVybiBhLmFwcGx5KG8odGhpcyksYXJndW1lbnRzKX0pKX0sMjcyOTQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDczMDc0KSxvPW4oNDkyNDkpLGk9ci5hVHlwZWRBcnJheTsoMCxyLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJsYXN0SW5kZXhPZiIsKGZ1bmN0aW9uKHQpe3JldHVybiBvLmFwcGx5KGkodGhpcyksYXJndW1lbnRzKX0pKX0sMjQ0NTc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDczMDc0KSxvPW4oMzAwMjUpLm1hcCxpPW4oMTM5NzkpLGE9ci5hVHlwZWRBcnJheSxjPXIuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsoMCxyLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJtYXAiLChmdW5jdGlvbih0KXtyZXR1cm4gbyhhKHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyhjKGkodCx0LmNvbnN0cnVjdG9yKSkpKGUpfSkpfSkpfSw1MDQ4MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89bigzNTYyNyksaT1yLmFUeXBlZEFycmF5Q29uc3RydWN0b3I7KDAsci5leHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kKSgib2YiLChmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyhpKHRoaXMpKShlKTtlPnQ7KW5bdF09YXJndW1lbnRzW3QrK107cmV0dXJuIG59KSxvKX0sNzU0OTk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDczMDc0KSxvPW4oMTIzNjYpLnJpZ2h0LGk9ci5hVHlwZWRBcnJheTsoMCxyLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJyZWR1Y2VSaWdodCIsKGZ1bmN0aW9uKHQpe3JldHVybiBvKGkodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sMzkzMjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89bigxMjM2NikubGVmdCxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgicmVkdWNlIiwoZnVuY3Rpb24odCl7cmV0dXJuIG8oaSh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGgsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpfSw4NzU2NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89ci5hVHlwZWRBcnJheSxpPXIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxhPU1hdGguZmxvb3I7aSgicmV2ZXJzZSIsKGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9dGhpcyxuPW8oZSkubGVuZ3RoLHI9YShuLzIpLGk9MDtpPHI7KXQ9ZVtpXSxlW2krK109ZVstLW5dLGVbbl09dDtyZXR1cm4gZX0pKX0sODQ1MDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLG89bigyNzg4NCksaT1uKDYwNTU4KSxhPW4oMTkyMDkpLGM9bigzMjE4Nykscz1yLmFUeXBlZEFycmF5OygwLHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCkoInNldCIsKGZ1bmN0aW9uKHQpe3ModGhpcyk7dmFyIGU9aShhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwxKSxuPXRoaXMubGVuZ3RoLHI9YSh0KSxjPW8oci5sZW5ndGgpLHU9MDtpZihjK2U+bil0aHJvdyBSYW5nZUVycm9yKCJXcm9uZyBsZW5ndGgiKTtmb3IoO3U8YzspdGhpc1tlK3VdPXJbdSsrXX0pLGMoKGZ1bmN0aW9uKCl7bmV3IEludDhBcnJheSgxKS5zZXQoe30pfSkpKX0sMTc2MDU6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDczMDc0KSxvPW4oMTM5NzkpLGk9bigzMjE4NyksYT1yLmFUeXBlZEFycmF5LGM9ci5hVHlwZWRBcnJheUNvbnN0cnVjdG9yLHM9ci5leHBvcnRUeXBlZEFycmF5TWV0aG9kLHU9W10uc2xpY2U7cygic2xpY2UiLChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj11LmNhbGwoYSh0aGlzKSx0LGUpLHI9byh0aGlzLHRoaXMuY29uc3RydWN0b3IpLGk9MCxzPW4ubGVuZ3RoLGw9bmV3KGMocikpKHMpO3M+aTspbFtpXT1uW2krK107cmV0dXJuIGx9KSxpKChmdW5jdGlvbigpe25ldyBJbnQ4QXJyYXkoMSkuc2xpY2UoKX0pKSl9LDczNTYyOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3MzA3NCksbz1uKDMwMDI1KS5zb21lLGk9ci5hVHlwZWRBcnJheTsoMCxyLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJzb21lIiwoZnVuY3Rpb24odCl7cmV0dXJuIG8oaSh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sMTE4Nzg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDczMDc0KSxvPXIuYVR5cGVkQXJyYXksaT1yLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsYT1bXS5zb3J0O2koInNvcnQiLChmdW5jdGlvbih0KXtyZXR1cm4gYS5jYWxsKG8odGhpcyksdCl9KSl9LDYwOTI5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3MzA3NCksbz1uKDI3ODg0KSxpPW4oNzY5NzYpLGE9bigxMzk3OSksYz1yLmFUeXBlZEFycmF5OygwLHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCkoInN1YmFycmF5IiwoZnVuY3Rpb24odCxlKXt2YXIgbj1jKHRoaXMpLHI9bi5sZW5ndGgscz1pKHQscik7cmV0dXJuIG5ldyhhKG4sbi5jb25zdHJ1Y3RvcikpKG4uYnVmZmVyLG4uYnl0ZU9mZnNldCtzKm4uQllURVNfUEVSX0VMRU1FTlQsbygodm9pZCAwPT09ZT9yOmkoZSxyKSktcykpfSkpfSw0Mzk1MTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODk1NTgpLG89big3MzA3NCksaT1uKDMyMTg3KSxhPXIuSW50OEFycmF5LGM9by5hVHlwZWRBcnJheSxzPW8uZXhwb3J0VHlwZWRBcnJheU1ldGhvZCx1PVtdLnRvTG9jYWxlU3RyaW5nLGw9W10uc2xpY2UsZj0hIWEmJmkoKGZ1bmN0aW9uKCl7dS5jYWxsKG5ldyBhKDEpKX0pKTtzKCJ0b0xvY2FsZVN0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIHUuYXBwbHkoZj9sLmNhbGwoYyh0aGlzKSk6Yyh0aGlzKSxhcmd1bWVudHMpfSksaSgoZnVuY3Rpb24oKXtyZXR1cm5bMSwyXS50b0xvY2FsZVN0cmluZygpIT1uZXcgYShbMSwyXSkudG9Mb2NhbGVTdHJpbmcoKX0pKXx8IWkoKGZ1bmN0aW9uKCl7YS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwyXSl9KSkpfSw5MTM0NzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzMwNzQpLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Qsbz1uKDMyMTg3KSxpPW4oODk1NTgpLlVpbnQ4QXJyYXksYT1pJiZpLnByb3RvdHlwZXx8e30sYz1bXS50b1N0cmluZyxzPVtdLmpvaW47bygoZnVuY3Rpb24oKXtjLmNhbGwoe30pfSkpJiYoYz1mdW5jdGlvbigpe3JldHVybiBzLmNhbGwodGhpcyl9KTt2YXIgdT1hLnRvU3RyaW5nIT1jO3IoInRvU3RyaW5nIixjLHUpfSwxNjk3ODpmdW5jdGlvbih0LGUsbil7big5MzAxNykoIlVpbnQxNiIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIHQodGhpcyxlLG4scil9fSkpfSwzNzk4NzpmdW5jdGlvbih0LGUsbil7big5MzAxNykoIlVpbnQzMiIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIHQodGhpcyxlLG4scil9fSkpfSw4MDc1NzpmdW5jdGlvbih0LGUsbil7big5MzAxNykoIlVpbnQ4IiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdCh0aGlzLGUsbixyKX19KSl9LDY5ODc5OmZ1bmN0aW9uKHQsZSxuKXtuKDkzMDE3KSgiVWludDgiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0KHRoaXMsZSxuLHIpfX0pLCEwKX0sNTg2MDY6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPW4oODk1NTgpLGk9bigxOTI2KSxhPW4oOTYwMyksYz1uKDgxOTUxKSxzPW4oNzEzMDMpLHU9bigxMDU5MiksbD1uKDg5ODI3KS5lbmZvcmNlLGY9bigxOTU5MSksZD0hby5BY3RpdmVYT2JqZWN0JiYiQWN0aXZlWE9iamVjdCJpbiBvLHA9T2JqZWN0LmlzRXh0ZW5zaWJsZSxoPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19LHY9dC5leHBvcnRzPWMoIldlYWtNYXAiLGgscyk7aWYoZiYmZCl7cj1zLmdldENvbnN0cnVjdG9yKGgsIldlYWtNYXAiLCEwKSxhLlJFUVVJUkVEPSEwO3ZhciBnPXYucHJvdG90eXBlLHk9Zy5kZWxldGUsbT1nLmhhcyxiPWcuZ2V0LHg9Zy5zZXQ7aShnLHtkZWxldGU6ZnVuY3Rpb24odCl7aWYodSh0KSYmIXAodCkpe3ZhciBlPWwodGhpcyk7cmV0dXJuIGUuZnJvemVufHwoZS5mcm96ZW49bmV3IHIpLHkuY2FsbCh0aGlzLHQpfHxlLmZyb3plbi5kZWxldGUodCl9cmV0dXJuIHkuY2FsbCh0aGlzLHQpfSxoYXM6ZnVuY3Rpb24odCl7aWYodSh0KSYmIXAodCkpe3ZhciBlPWwodGhpcyk7cmV0dXJuIGUuZnJvemVufHwoZS5mcm96ZW49bmV3IHIpLG0uY2FsbCh0aGlzLHQpfHxlLmZyb3plbi5oYXModCl9cmV0dXJuIG0uY2FsbCh0aGlzLHQpfSxnZXQ6ZnVuY3Rpb24odCl7aWYodSh0KSYmIXAodCkpe3ZhciBlPWwodGhpcyk7cmV0dXJuIGUuZnJvemVufHwoZS5mcm96ZW49bmV3IHIpLG0uY2FsbCh0aGlzLHQpP2IuY2FsbCh0aGlzLHQpOmUuZnJvemVuLmdldCh0KX1yZXR1cm4gYi5jYWxsKHRoaXMsdCl9LHNldDpmdW5jdGlvbih0LGUpe2lmKHUodCkmJiFwKHQpKXt2YXIgbj1sKHRoaXMpO24uZnJvemVufHwobi5mcm96ZW49bmV3IHIpLG0uY2FsbCh0aGlzLHQpP3guY2FsbCh0aGlzLHQsZSk6bi5mcm96ZW4uc2V0KHQsZSl9ZWxzZSB4LmNhbGwodGhpcyx0LGUpO3JldHVybiB0aGlzfX0pfX0sNDUxNTc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuKDgxOTUxKSgiV2Vha1NldCIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxuKDcxMzAzKSl9LDk2NzUxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDYyNTU2KSxpPW4oNjQ5NjUpLGE9big3MTg0MiksYz1uKDUwODY4KSxzPW4oMzc2MjApLHU9bigxNDIwOSksbD1uKDQxMzM0KSxmPW4oNjY5NzEpLGQ9big4OTgyNykscD1kLnNldCxoPWQuZ2V0dGVyRm9yKCJBZ2dyZWdhdGVFcnJvciIpLHY9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIHYpKXJldHVybiBuZXcgdih0LGUpO2EmJihuPWEobmV3IEVycm9yKGUpLGkobikpKTt2YXIgcj1bXTtyZXR1cm4gbCh0LHIucHVzaCxyKSxvP3Aobix7ZXJyb3JzOnIsdHlwZToiQWdncmVnYXRlRXJyb3IifSk6bi5lcnJvcnM9cix2b2lkIDAhPT1lJiZmKG4sIm1lc3NhZ2UiLFN0cmluZyhlKSksbn07di5wcm90b3R5cGU9YyhFcnJvci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnUoNSx2KSxtZXNzYWdlOnUoNSwiIiksbmFtZTp1KDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxvJiZzLmYodi5wcm90b3R5cGUsImVycm9ycyIse2dldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMpLmVycm9yc30sY29uZmlndXJhYmxlOiEwfSkscih7Z2xvYmFsOiEwfSx7QWdncmVnYXRlRXJyb3I6dn0pfSwxNDA4NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDYxOTkpLGk9T2JqZWN0LmlzRnJvemVuLGE9ZnVuY3Rpb24odCxlKXtpZighaXx8IW8odCl8fCFpKHQpKXJldHVybiExO2Zvcih2YXIgbixyPTAsYT10Lmxlbmd0aDtyPGE7KWlmKCEoInN0cmluZyI9PXR5cGVvZihuPXRbcisrXSl8fGUmJnZvaWQgMD09PW4pKXJldHVybiExO3JldHVybiAwIT09YX07cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMH0se2lzVGVtcGxhdGVPYmplY3Q6ZnVuY3Rpb24odCl7aWYoIWEodCwhMCkpcmV0dXJuITE7dmFyIGU9dC5yYXc7cmV0dXJuIShlLmxlbmd0aCE9PXQubGVuZ3RofHwhYShlLCExKSl9fSl9LDQ5MzA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDYyNTU2KSxvPW4oNzY1MTMpLGk9bigxOTIwOSksYT1uKDI3ODg0KSxjPW4oMzc2MjApLmY7ciYmISgibGFzdEluZGV4ImluW10pJiYoYyhBcnJheS5wcm90b3R5cGUsImxhc3RJbmRleCIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1pKHRoaXMpLGU9YSh0Lmxlbmd0aCk7cmV0dXJuIDA9PWU/MDplLTF9fSksbygibGFzdEluZGV4IikpfSw2MzY0OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2MjU1Niksbz1uKDc2NTEzKSxpPW4oMTkyMDkpLGE9bigyNzg4NCksYz1uKDM3NjIwKS5mO3ImJiEoImxhc3RJdGVtImluW10pJiYoYyhBcnJheS5wcm90b3R5cGUsImxhc3RJdGVtIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciB0PWkodGhpcyksZT1hKHQubGVuZ3RoKTtyZXR1cm4gMD09ZT92b2lkIDA6dFtlLTFdfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9aSh0aGlzKSxuPWEoZS5sZW5ndGgpO3JldHVybiBlWzA9PW4/MDpuLTFdPXR9fSksbygibGFzdEl0ZW0iKSl9LDQ3MDA0OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPW4oMjcwMDQpKChmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1uLml0ZXJhdG9yO3JldHVybiBlLnJlc29sdmUobyhuLm5leHQuY2FsbChyLHQpKSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIG8odCkuZG9uZT8obi5kb25lPSEwLHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pOntkb25lOiExLHZhbHVlOltuLmluZGV4KyssdC52YWx1ZV19fSkpfSkpO3Ioe3RhcmdldDoiQXN5bmNJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se2FzSW5kZXhlZFBhaXJzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHtpdGVyYXRvcjpvKHRoaXMpLGluZGV4OjB9KX19KX0sNjEyOTg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNTkzNzkpLGk9big2Njk3MSksYT1uKDc2Mjk4KSxjPW4oMjM3MjQpLHM9big2Mzg0NSksdT1uKDY1NjcyKSxsPWMoInRvU3RyaW5nVGFnIiksZj1mdW5jdGlvbigpe28odGhpcyxmKX07Zi5wcm90b3R5cGU9cyxhKHMsbCl8fGkocyxsLCJBc3luY0l0ZXJhdG9yIiksYShzLCJjb25zdHJ1Y3RvciIpJiZzLmNvbnN0cnVjdG9yIT09T2JqZWN0fHxpKHMsImNvbnN0cnVjdG9yIixmKSxyKHtnbG9iYWw6ITAsZm9yY2VkOnV9LHtBc3luY0l0ZXJhdG9yOmZ9KX0sNjc0NjI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODc1NzkpLGk9big0NTY4MCksYT1uKDI3MDA0KSgoZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBuZXcgZSgoZnVuY3Rpb24ocixpKXt2YXIgYT1mdW5jdGlvbigpe3RyeXtlLnJlc29sdmUobyhuLm5leHQuY2FsbChuLml0ZXJhdG9yLG4ucmVtYWluaW5nP3ZvaWQgMDp0KSkpLnRoZW4oKGZ1bmN0aW9uKHQpe3RyeXtvKHQpLmRvbmU/KG4uZG9uZT0hMCxyKHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pKTpuLnJlbWFpbmluZz8obi5yZW1haW5pbmctLSxhKCkpOnIoe2RvbmU6ITEsdmFsdWU6dC52YWx1ZX0pfWNhdGNoKHQpe2kodCl9fSksaSl9Y2F0Y2godCl7aSh0KX19O2EoKX0pKX0pKTtyKHt0YXJnZXQ6IkFzeW5jSXRlcmF0b3IiLHByb3RvOiEwLHJlYWw6ITB9LHtkcm9wOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYSh7aXRlcmF0b3I6byh0aGlzKSxyZW1haW5pbmc6aSh0KX0pfX0pfSw5MDY3OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQ1NjY2KS5ldmVyeTtyKHt0YXJnZXQ6IkFzeW5jSXRlcmF0b3IiLHByb3RvOiEwLHJlYWw6ITB9LHtldmVyeTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQpfX0pfSwyMDEyNDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4NjQ3MCksaT1uKDg3NTc5KSxhPW4oMjcwMDQpKChmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1uLmZpbHRlcmVyO3JldHVybiBuZXcgZSgoZnVuY3Rpb24obyxhKXt2YXIgYz1mdW5jdGlvbigpe3RyeXtlLnJlc29sdmUoaShuLm5leHQuY2FsbChuLml0ZXJhdG9yLHQpKSkudGhlbigoZnVuY3Rpb24odCl7dHJ5e2lmKGkodCkuZG9uZSluLmRvbmU9ITAsbyh7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9KTtlbHNle3ZhciBzPXQudmFsdWU7ZS5yZXNvbHZlKHIocykpLnRoZW4oKGZ1bmN0aW9uKHQpe3Q/byh7ZG9uZTohMSx2YWx1ZTpzfSk6YygpfSksYSl9fWNhdGNoKHQpe2EodCl9fSksYSl9Y2F0Y2godCl7YSh0KX19O2MoKX0pKX0pKTtyKHt0YXJnZXQ6IkFzeW5jSXRlcmF0b3IiLHByb3RvOiEwLHJlYWw6ITB9LHtmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhKHtpdGVyYXRvcjppKHRoaXMpLGZpbHRlcmVyOm8odCl9KX19KX0sMjEzNzE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNDU2NjYpLmZpbmQ7cih7dGFyZ2V0OiJBc3luY0l0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQpfX0pfSwzODk4NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4NjQ3MCksaT1uKDg3NTc5KSxhPW4oMjcwMDQpLGM9big2NjkyMCkscz1hKChmdW5jdGlvbih0LGUpe3ZhciBuLHIsYT10aGlzLHM9YS5tYXBwZXI7cmV0dXJuIG5ldyBlKChmdW5jdGlvbih1LGwpe3ZhciBmPWZ1bmN0aW9uKCl7dHJ5e2UucmVzb2x2ZShpKGEubmV4dC5jYWxsKGEuaXRlcmF0b3IsdCkpKS50aGVuKChmdW5jdGlvbih0KXt0cnl7aSh0KS5kb25lPyhhLmRvbmU9ITAsdSh7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9KSk6ZS5yZXNvbHZlKHModC52YWx1ZSkpLnRoZW4oKGZ1bmN0aW9uKHQpe3RyeXtpZih2b2lkIDAhPT0ocj1jKHQpKSlyZXR1cm4gYS5pbm5lckl0ZXJhdG9yPW49aShyLmNhbGwodCkpLGEuaW5uZXJOZXh0PW8obi5uZXh0KSxkKCk7bChUeXBlRXJyb3IoIi5mbGF0TWFwIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYW4gaXRlcmFibGUgb2JqZWN0IikpfWNhdGNoKHQpe2wodCl9fSksbCl9Y2F0Y2godCl7bCh0KX19KSxsKX1jYXRjaCh0KXtsKHQpfX0sZD1mdW5jdGlvbigpe2lmKG49YS5pbm5lckl0ZXJhdG9yKXRyeXtlLnJlc29sdmUoaShhLmlubmVyTmV4dC5jYWxsKG4pKSkudGhlbigoZnVuY3Rpb24odCl7dHJ5e2kodCkuZG9uZT8oYS5pbm5lckl0ZXJhdG9yPWEuaW5uZXJOZXh0PW51bGwsZigpKTp1KHtkb25lOiExLHZhbHVlOnQudmFsdWV9KX1jYXRjaCh0KXtsKHQpfX0pLGwpfWNhdGNoKHQpe2wodCl9ZWxzZSBmKCl9O2QoKX0pKX0pKTtyKHt0YXJnZXQ6IkFzeW5jSXRlcmF0b3IiLHByb3RvOiEwLHJlYWw6ITB9LHtmbGF0TWFwOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcyh7aXRlcmF0b3I6aSh0aGlzKSxtYXBwZXI6byh0KSxpbm5lckl0ZXJhdG9yOm51bGwsaW5uZXJOZXh0Om51bGx9KX19KX0sNjkyMzc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNDU2NjYpLmZvckVhY2g7cih7dGFyZ2V0OiJBc3luY0l0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7Zm9yRWFjaDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQpfX0pfSwyNjQ5NzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDU2MjM4KSxpPW4oODY0NzApLGE9big4NzU3OSksYz1uKDE5MjA5KSxzPW4oMjcwMDQpLHU9big2NjkyMCksbD1vLkFzeW5jSXRlcmF0b3IsZj1zKChmdW5jdGlvbih0KXtyZXR1cm4gYSh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLHQpKX0pLCEwKTtyKHt0YXJnZXQ6IkFzeW5jSXRlcmF0b3IiLHN0YXQ6ITB9LHtmcm9tOmZ1bmN0aW9uKHQpe3ZhciBlLG49Yyh0KSxyPXUobik7aWYobnVsbCE9cil7aWYoKGU9aShyKS5jYWxsKG4pKWluc3RhbmNlb2YgbClyZXR1cm4gZX1lbHNlIGU9bjtyZXR1cm4gbmV3IGYoe2l0ZXJhdG9yOmV9KX19KX0sNTMxNjg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODY0NzApLGk9big4NzU3OSksYT1uKDI3MDA0KSgoZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5tYXBwZXI7cmV0dXJuIGUucmVzb2x2ZShpKG4ubmV4dC5jYWxsKG4uaXRlcmF0b3IsdCkpKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gaSh0KS5kb25lPyhuLmRvbmU9ITAse2RvbmU6ITAsdmFsdWU6dm9pZCAwfSk6ZS5yZXNvbHZlKHIodC52YWx1ZSkpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybntkb25lOiExLHZhbHVlOnR9fSkpfSkpfSkpO3Ioe3RhcmdldDoiQXN5bmNJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se21hcDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGEoe2l0ZXJhdG9yOmkodGhpcyksbWFwcGVyOm8odCl9KX19KX0sNzM5NDk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODY0NzApLGk9big4NzU3OSksYT1uKDc3MDEpKCJQcm9taXNlIik7cih7dGFyZ2V0OiJBc3luY0l0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7cmVkdWNlOmZ1bmN0aW9uKHQpe3ZhciBlPWkodGhpcyksbj1vKGUubmV4dCkscj1hcmd1bWVudHMubGVuZ3RoPDIsYz1yP3ZvaWQgMDphcmd1bWVudHNbMV07cmV0dXJuIG8odCksbmV3IGEoKGZ1bmN0aW9uKG8scyl7dmFyIHU9ZnVuY3Rpb24oKXt0cnl7YS5yZXNvbHZlKGkobi5jYWxsKGUpKSkudGhlbigoZnVuY3Rpb24oZSl7dHJ5e2lmKGkoZSkuZG9uZSlyP3MoVHlwZUVycm9yKCJSZWR1Y2Ugb2YgZW1wdHkgaXRlcmF0b3Igd2l0aCBubyBpbml0aWFsIHZhbHVlIikpOm8oYyk7ZWxzZXt2YXIgbj1lLnZhbHVlO3I/KHI9ITEsYz1uLHUoKSk6YS5yZXNvbHZlKHQoYyxuKSkudGhlbigoZnVuY3Rpb24odCl7Yz10LHUoKX0pLHMpfX1jYXRjaCh0KXtzKHQpfX0pLHMpfWNhdGNoKHQpe3ModCl9fTt1KCl9KSl9fSl9LDg4MjExOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQ1NjY2KS5zb21lO3Ioe3RhcmdldDoiQXN5bmNJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se3NvbWU6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0KX19KX0sNzM3NjE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODc1NzkpLGk9big0NTY4MCksYT1uKDI3MDA0KSgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVtYWluaW5nLS0/dGhpcy5uZXh0LmNhbGwodGhpcy5pdGVyYXRvcix0KToodGhpcy5kb25lPSEwLHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pfSkpO3Ioe3RhcmdldDoiQXN5bmNJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se3Rha2U6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhKHtpdGVyYXRvcjpvKHRoaXMpLHJlbWFpbmluZzppKHQpfSl9fSl9LDQyMTk2OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQ1NjY2KS50b0FycmF5O3Ioe3RhcmdldDoiQXN5bmNJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se3RvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKX19KX0sMzY1NzE6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big3NDY4NSksaT1uKDc3MDEpLGE9big1MDg2OCksYz1mdW5jdGlvbigpe3ZhciB0PWkoIk9iamVjdCIsImZyZWV6ZSIpO3JldHVybiB0P3QoYShudWxsKSk6YShudWxsKX07cih7Z2xvYmFsOiEwfSx7Y29tcG9zaXRlS2V5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uYXBwbHkoT2JqZWN0LGFyZ3VtZW50cykuZ2V0KCJvYmplY3QiLGMpfX0pfSw0MzA4NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc0Njg1KSxpPW4oNzcwMSk7cih7Z2xvYmFsOiEwfSx7Y29tcG9zaXRlU3ltYm9sOmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoJiYic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXT9pKCJTeW1ib2wiKS5mb3IoYXJndW1lbnRzWzBdKTpvLmFwcGx5KG51bGwsYXJndW1lbnRzKS5nZXQoInN5bWJvbCIsaSgiU3ltYm9sIikpfX0pfSw5OTYyODpmdW5jdGlvbih0LGUsbil7big3MTYyMil9LDkyNjAxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPW4oODgwNykoKGZ1bmN0aW9uKHQpe3ZhciBlPW8odGhpcy5uZXh0LmNhbGwodGhpcy5pdGVyYXRvcix0KSk7aWYoISh0aGlzLmRvbmU9ISFlLmRvbmUpKXJldHVyblt0aGlzLmluZGV4KyssZS52YWx1ZV19KSk7cih7dGFyZ2V0OiJJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se2FzSW5kZXhlZFBhaXJzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHtpdGVyYXRvcjpvKHRoaXMpLGluZGV4OjB9KX19KX0sNDMzMzI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODk1NTgpLGk9big1OTM3OSksYT1uKDY2OTcxKSxjPW4oMzIxODcpLHM9big3NjI5OCksdT1uKDIzNzI0KSxsPW4oNjQxNzYpLkl0ZXJhdG9yUHJvdG90eXBlLGY9big2NTY3MiksZD11KCJpdGVyYXRvciIpLHA9dSgidG9TdHJpbmdUYWciKSxoPW8uSXRlcmF0b3Isdj1mfHwiZnVuY3Rpb24iIT10eXBlb2YgaHx8aC5wcm90b3R5cGUhPT1sfHwhYygoZnVuY3Rpb24oKXtoKHt9KX0pKSxnPWZ1bmN0aW9uKCl7aSh0aGlzLGcpfTtmJiZhKGw9e30sZCwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSxzKGwscCl8fGEobCxwLCJJdGVyYXRvciIpLCF2JiZzKGwsImNvbnN0cnVjdG9yIikmJmwuY29uc3RydWN0b3IhPT1PYmplY3R8fGEobCwiY29uc3RydWN0b3IiLGcpLGcucHJvdG90eXBlPWwscih7Z2xvYmFsOiEwLGZvcmNlZDp2fSx7SXRlcmF0b3I6Z30pfSwyMDQ3NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4NzU3OSksaT1uKDQ1NjgwKSxhPW4oODgwNykoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXRoaXMuaXRlcmF0b3Iscj10aGlzLm5leHQ7dGhpcy5yZW1haW5pbmc7KWlmKHRoaXMucmVtYWluaW5nLS0sZT1vKHIuY2FsbChuKSksdGhpcy5kb25lPSEhZS5kb25lKXJldHVybjtpZihlPW8oci5jYWxsKG4sdCkpLCEodGhpcy5kb25lPSEhZS5kb25lKSlyZXR1cm4gZS52YWx1ZX0pKTtyKHt0YXJnZXQ6Ikl0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7ZHJvcDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGEoe2l0ZXJhdG9yOm8odGhpcykscmVtYWluaW5nOmkodCl9KX19KX0sNTQ1NTY6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNDEzMzQpLGk9big4NjQ3MCksYT1uKDg3NTc5KTtyKHt0YXJnZXQ6Ikl0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7ZXZlcnk6ZnVuY3Rpb24odCl7cmV0dXJuIGEodGhpcyksaSh0KSwhbyh0aGlzLChmdW5jdGlvbihlKXtpZighdChlKSlyZXR1cm4gby5zdG9wKCl9KSx2b2lkIDAsITEsITApLnN0b3BwZWR9fSl9LDQwNjM4OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDg2NDcwKSxpPW4oODc1NzkpLGE9big4ODA3KSxjPW4oMTIyNzgpLHM9YSgoZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4scj10aGlzLml0ZXJhdG9yLG89dGhpcy5maWx0ZXJlcixhPXRoaXMubmV4dDs7KXtpZihlPWkoYS5jYWxsKHIsdCkpLHRoaXMuZG9uZT0hIWUuZG9uZSlyZXR1cm47aWYobj1lLnZhbHVlLGMocixvLG4pKXJldHVybiBufX0pKTtyKHt0YXJnZXQ6Ikl0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcyh7aXRlcmF0b3I6aSh0aGlzKSxmaWx0ZXJlcjpvKHQpfSl9fSl9LDk2NjU5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQxMzM0KSxpPW4oODY0NzApLGE9big4NzU3OSk7cih7dGFyZ2V0OiJJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se2ZpbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGEodGhpcyksaSh0KSxvKHRoaXMsKGZ1bmN0aW9uKGUpe2lmKHQoZSkpcmV0dXJuIG8uc3RvcChlKX0pLHZvaWQgMCwhMSwhMCkucmVzdWx0fX0pfSwxNDY4ODpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4NjQ3MCksaT1uKDg3NTc5KSxhPW4oNzM4OTApLGM9big4ODA3KSxzPW4oMTIyNzgpLHU9YygoZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4scixjLHU9dGhpcy5pdGVyYXRvcjs7KXtpZihjPXRoaXMuaW5uZXJJdGVyYXRvcil7aWYoIShlPWkodGhpcy5pbm5lck5leHQuY2FsbChjKSkpLmRvbmUpcmV0dXJuIGUudmFsdWU7dGhpcy5pbm5lckl0ZXJhdG9yPXRoaXMuaW5uZXJOZXh0PW51bGx9aWYoZT1pKHRoaXMubmV4dC5jYWxsKHUsdCkpLHRoaXMuZG9uZT0hIWUuZG9uZSlyZXR1cm47aWYobj1zKHUsdGhpcy5tYXBwZXIsZS52YWx1ZSksdm9pZCAwPT09KHI9YShuKSkpdGhyb3cgVHlwZUVycm9yKCIuZmxhdE1hcCBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhYmxlIG9iamVjdCIpO3RoaXMuaW5uZXJJdGVyYXRvcj1jPWkoci5jYWxsKG4pKSx0aGlzLmlubmVyTmV4dD1vKGMubmV4dCl9fSkpO3Ioe3RhcmdldDoiSXRlcmF0b3IiLHByb3RvOiEwLHJlYWw6ITB9LHtmbGF0TWFwOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdSh7aXRlcmF0b3I6aSh0aGlzKSxtYXBwZXI6byh0KSxpbm5lckl0ZXJhdG9yOm51bGwsaW5uZXJOZXh0Om51bGx9KX19KX0sNzM3ODpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big0MTMzNCksaT1uKDg3NTc5KTtyKHt0YXJnZXQ6Ikl0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7Zm9yRWFjaDpmdW5jdGlvbih0KXtvKGkodGhpcyksdCx2b2lkIDAsITEsITApfX0pfSwyNzQyODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDU2MjM4KSxpPW4oODY0NzApLGE9big4NzU3OSksYz1uKDE5MjA5KSxzPW4oODgwNyksdT1uKDczODkwKSxsPW8uSXRlcmF0b3IsZj1zKChmdW5jdGlvbih0KXt2YXIgZT1hKHRoaXMubmV4dC5jYWxsKHRoaXMuaXRlcmF0b3IsdCkpO2lmKCEodGhpcy5kb25lPSEhZS5kb25lKSlyZXR1cm4gZS52YWx1ZX0pLCEwKTtyKHt0YXJnZXQ6Ikl0ZXJhdG9yIixzdGF0OiEwfSx7ZnJvbTpmdW5jdGlvbih0KXt2YXIgZSxuPWModCkscj11KG4pO2lmKG51bGwhPXIpe2lmKChlPWkocikuY2FsbChuKSlpbnN0YW5jZW9mIGwpcmV0dXJuIGV9ZWxzZSBlPW47cmV0dXJuIG5ldyBmKHtpdGVyYXRvcjplfSl9fSl9LDMzNDM2OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDg2NDcwKSxpPW4oODc1NzkpLGE9big4ODA3KSxjPW4oMTIyNzgpLHM9YSgoZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVyYXRvcixuPWkodGhpcy5uZXh0LmNhbGwoZSx0KSk7aWYoISh0aGlzLmRvbmU9ISFuLmRvbmUpKXJldHVybiBjKGUsdGhpcy5tYXBwZXIsbi52YWx1ZSl9KSk7cih7dGFyZ2V0OiJJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se21hcDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHMoe2l0ZXJhdG9yOmkodGhpcyksbWFwcGVyOm8odCl9KX19KX0sODQzODg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNDEzMzQpLGk9big4NjQ3MCksYT1uKDg3NTc5KTtyKHt0YXJnZXQ6Ikl0ZXJhdG9yIixwcm90bzohMCxyZWFsOiEwfSx7cmVkdWNlOmZ1bmN0aW9uKHQpe2EodGhpcyksaSh0KTt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPDIsbj1lP3ZvaWQgMDphcmd1bWVudHNbMV07aWYobyh0aGlzLChmdW5jdGlvbihyKXtlPyhlPSExLG49cik6bj10KG4scil9KSx2b2lkIDAsITEsITApLGUpdGhyb3cgVHlwZUVycm9yKCJSZWR1Y2Ugb2YgZW1wdHkgaXRlcmF0b3Igd2l0aCBubyBpbml0aWFsIHZhbHVlIik7cmV0dXJuIG59fSl9LDU5NjIzOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQxMzM0KSxpPW4oODY0NzApLGE9big4NzU3OSk7cih7dGFyZ2V0OiJJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se3NvbWU6ZnVuY3Rpb24odCl7cmV0dXJuIGEodGhpcyksaSh0KSxvKHRoaXMsKGZ1bmN0aW9uKGUpe2lmKHQoZSkpcmV0dXJuIG8uc3RvcCgpfSksdm9pZCAwLCExLCEwKS5zdG9wcGVkfX0pfSwzMjg1MzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big4NzU3OSksaT1uKDQ1NjgwKSxhPW4oODgwNykoKGZ1bmN0aW9uKHQpe2lmKHRoaXMucmVtYWluaW5nLS0pe3ZhciBlPW8odGhpcy5uZXh0LmNhbGwodGhpcy5pdGVyYXRvcix0KSk7cmV0dXJuKHRoaXMuZG9uZT0hIWUuZG9uZSk/dm9pZCAwOmUudmFsdWV9dGhpcy5kb25lPSEwfSkpO3Ioe3RhcmdldDoiSXRlcmF0b3IiLHByb3RvOiEwLHJlYWw6ITB9LHt0YWtlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYSh7aXRlcmF0b3I6byh0aGlzKSxyZW1haW5pbmc6aSh0KX0pfX0pfSw2NzA3MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big0MTMzNCksaT1uKDg3NTc5KSxhPVtdLnB1c2g7cih7dGFyZ2V0OiJJdGVyYXRvciIscHJvdG86ITAscmVhbDohMH0se3RvQXJyYXk6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gbyhpKHRoaXMpLGEsdCwhMSwhMCksdH19KX0sNDg0NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDE0NjYpO3Ioe3RhcmdldDoiTWFwIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7ZGVsZXRlQWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pfSwzNTU0OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDY1NjcyKSxpPW4oODc1NzkpLGE9big0NjEzMCksYz1uKDQxOTg5KSxzPW4oNDEzMzQpO3Ioe3RhcmdldDoiTWFwIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7ZXZlcnk6ZnVuY3Rpb24odCl7dmFyIGU9aSh0aGlzKSxuPWMoZSkscj1hKHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyk7cmV0dXJuIXMobiwoZnVuY3Rpb24odCxuKXtpZighcihuLHQsZSkpcmV0dXJuIHMuc3RvcCgpfSksdm9pZCAwLCEwLCEwKS5zdG9wcGVkfX0pfSwxODg0NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDc3MDEpLGE9big4NzU3OSksYz1uKDg2NDcwKSxzPW4oNDYxMzApLHU9bigxMzk3OSksbD1uKDQxOTg5KSxmPW4oNDEzMzQpO3Ioe3RhcmdldDoiTWFwIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3ZhciBlPWEodGhpcyksbj1sKGUpLHI9cyh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89bmV3KHUoZSxpKCJNYXAiKSkpLGQ9YyhvLnNldCk7cmV0dXJuIGYobiwoZnVuY3Rpb24odCxuKXtyKG4sdCxlKSYmZC5jYWxsKG8sdCxuKX0pLHZvaWQgMCwhMCwhMCksb319KX0sNDkwNTA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big4NzU3OSksYT1uKDQ2MTMwKSxjPW4oNDE5ODkpLHM9big0MTMzNCk7cih7dGFyZ2V0OiJNYXAiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtmaW5kS2V5OmZ1bmN0aW9uKHQpe3ZhciBlPWkodGhpcyksbj1jKGUpLHI9YSh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3JldHVybiBzKG4sKGZ1bmN0aW9uKHQsbil7aWYocihuLHQsZSkpcmV0dXJuIHMuc3RvcCh0KX0pLHZvaWQgMCwhMCwhMCkucmVzdWx0fX0pfSwzNTY1NjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDg3NTc5KSxhPW4oNDYxMzApLGM9big0MTk4OSkscz1uKDQxMzM0KTtyKHt0YXJnZXQ6Ik1hcCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9aSh0aGlzKSxuPWMoZSkscj1hKHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyk7cmV0dXJuIHMobiwoZnVuY3Rpb24odCxuKXtpZihyKG4sdCxlKSlyZXR1cm4gcy5zdG9wKG4pfSksdm9pZCAwLCEwLCEwKS5yZXN1bHR9fSl9LDM4NzkyOmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJNYXAiLHN0YXQ6ITB9LHtmcm9tOm4oMTI5MDEpfSl9LDUzNTEzOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQxMzM0KSxpPW4oODY0NzApO3Ioe3RhcmdldDoiTWFwIixzdGF0OiEwfSx7Z3JvdXBCeTpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyB0aGlzO2koZSk7dmFyIHI9aShuLmhhcyksYT1pKG4uZ2V0KSxjPWkobi5zZXQpO3JldHVybiBvKHQsKGZ1bmN0aW9uKHQpe3ZhciBvPWUodCk7ci5jYWxsKG4sbyk/YS5jYWxsKG4sbykucHVzaCh0KTpjLmNhbGwobixvLFt0XSl9KSksbn19KX0sOTM4NDM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big4NzU3OSksYT1uKDQxOTg5KSxjPW4oMzgxODkpLHM9big0MTMzNCk7cih7dGFyZ2V0OiJNYXAiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gcyhhKGkodGhpcykpLChmdW5jdGlvbihlLG4pe2lmKGMobix0KSlyZXR1cm4gcy5zdG9wKCl9KSx2b2lkIDAsITAsITApLnN0b3BwZWR9fSl9LDk5MjU1OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQxMzM0KSxpPW4oODY0NzApO3Ioe3RhcmdldDoiTWFwIixzdGF0OiEwfSx7a2V5Qnk6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgdGhpcztpKGUpO3ZhciByPWkobi5zZXQpO3JldHVybiBvKHQsKGZ1bmN0aW9uKHQpe3IuY2FsbChuLGUodCksdCl9KSksbn19KX0sNjYyMjQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big4NzU3OSksYT1uKDQxOTg5KSxjPW4oNDEzMzQpO3Ioe3RhcmdldDoiTWFwIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7a2V5T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGMoYShpKHRoaXMpKSwoZnVuY3Rpb24oZSxuKXtpZihuPT09dClyZXR1cm4gYy5zdG9wKGUpfSksdm9pZCAwLCEwLCEwKS5yZXN1bHR9fSl9LDcxNzAwOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDY1NjcyKSxpPW4oNzcwMSksYT1uKDg3NTc5KSxjPW4oODY0NzApLHM9big0NjEzMCksdT1uKDEzOTc5KSxsPW4oNDE5ODkpLGY9big0MTMzNCk7cih7dGFyZ2V0OiJNYXAiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHttYXBLZXlzOmZ1bmN0aW9uKHQpe3ZhciBlPWEodGhpcyksbj1sKGUpLHI9cyh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89bmV3KHUoZSxpKCJNYXAiKSkpLGQ9YyhvLnNldCk7cmV0dXJuIGYobiwoZnVuY3Rpb24odCxuKXtkLmNhbGwobyxyKG4sdCxlKSxuKX0pLHZvaWQgMCwhMCwhMCksb319KX0sNjk1Mjk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big3NzAxKSxhPW4oODc1NzkpLGM9big4NjQ3MCkscz1uKDQ2MTMwKSx1PW4oMTM5NzkpLGw9big0MTk4OSksZj1uKDQxMzM0KTtyKHt0YXJnZXQ6Ik1hcCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se21hcFZhbHVlczpmdW5jdGlvbih0KXt2YXIgZT1hKHRoaXMpLG49bChlKSxyPXModCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPW5ldyh1KGUsaSgiTWFwIikpKSxkPWMoby5zZXQpO3JldHVybiBmKG4sKGZ1bmN0aW9uKHQsbil7ZC5jYWxsKG8sdCxyKG4sdCxlKSl9KSx2b2lkIDAsITAsITApLG99fSl9LDI3NzM0OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDY1NjcyKSxpPW4oODc1NzkpLGE9big4NjQ3MCksYz1uKDQxMzM0KTtyKHt0YXJnZXQ6Ik1hcCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se21lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1pKHRoaXMpLG49YShlLnNldCkscj0wO3I8YXJndW1lbnRzLmxlbmd0aDspYyhhcmd1bWVudHNbcisrXSxuLGUsITApO3JldHVybiBlfX0pfSwxOTkwOmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJNYXAiLHN0YXQ6ITB9LHtvZjpuKDI1MDI2KX0pfSw3NzM2OTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDg3NTc5KSxhPW4oODY0NzApLGM9big0MTk4OSkscz1uKDQxMzM0KTtyKHt0YXJnZXQ6Ik1hcCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se3JlZHVjZTpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMpLG49YyhlKSxyPWFyZ3VtZW50cy5sZW5ndGg8MixvPXI/dm9pZCAwOmFyZ3VtZW50c1sxXTtpZihhKHQpLHMobiwoZnVuY3Rpb24obixpKXtyPyhyPSExLG89aSk6bz10KG8saSxuLGUpfSksdm9pZCAwLCEwLCEwKSxyKXRocm93IFR5cGVFcnJvcigiUmVkdWNlIG9mIGVtcHR5IG1hcCB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTtyZXR1cm4gb319KX0sNjk4NDI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big4NzU3OSksYT1uKDQ2MTMwKSxjPW4oNDE5ODkpLHM9big0MTMzNCk7cih7dGFyZ2V0OiJNYXAiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtzb21lOmZ1bmN0aW9uKHQpe3ZhciBlPWkodGhpcyksbj1jKGUpLHI9YSh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3JldHVybiBzKG4sKGZ1bmN0aW9uKHQsbil7aWYocihuLHQsZSkpcmV0dXJuIHMuc3RvcCgpfSksdm9pZCAwLCEwLCEwKS5zdG9wcGVkfX0pfSw0MzI5MDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oMTQwNDQpKHt0YXJnZXQ6Ik1hcCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6big2NTY3Mil9LHt1cGRhdGVPckluc2VydDpuKDQ3OTI3KX0pfSw5NzkyODpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDg3NTc5KSxhPW4oODY0NzApO3Ioe3RhcmdldDoiTWFwIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7dXBkYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0aGlzKSxyPWFyZ3VtZW50cy5sZW5ndGg7YShlKTt2YXIgbz1uLmhhcyh0KTtpZighbyYmcjwzKXRocm93IFR5cGVFcnJvcigiVXBkYXRpbmcgYWJzZW50IHZhbHVlIik7dmFyIGM9bz9uLmdldCh0KTphKHI+Mj9hcmd1bWVudHNbMl06dm9pZCAwKSh0LG4pO3JldHVybiBuLnNldCh0LGUoYyx0LG4pKSxufX0pfSwxNDY4MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oMTQwNDQpKHt0YXJnZXQ6Ik1hcCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6big2NTY3Mil9LHt1cHNlcnQ6big0NzkyNyl9KX0sNzAyMjU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89TWF0aC5taW4saT1NYXRoLm1heDtyKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITB9LHtjbGFtcDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIG8obixpKGUsdCkpfX0pfSwyMzk5OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7REVHX1BFUl9SQUQ6TWF0aC5QSS8xODB9KX0sMTY4MDk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89MTgwL01hdGguUEk7cih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7ZGVncmVlczpmdW5jdGlvbih0KXtyZXR1cm4gdCpvfX0pfSw2NzE0MTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3NDIpLGk9big1MzI1MSk7cih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7ZnNjYWxlOmZ1bmN0aW9uKHQsZSxuLHIsYSl7cmV0dXJuIGkobyh0LGUsbixyLGEpKX19KX0sMzA2MTM6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITB9LHtpYWRkaDpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz10Pj4+MCxpPW4+Pj4wO3JldHVybihlPj4+MCkrKHI+Pj4wKSsoKG8maXwob3xpKSZ+KG8raT4+PjApKT4+PjMxKXwwfX0pfSw0OTc5OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7aW11bGg6ZnVuY3Rpb24odCxlKXt2YXIgbj02NTUzNSxyPSt0LG89K2UsaT1yJm4sYT1vJm4sYz1yPj4xNixzPW8+PjE2LHU9KGMqYT4+PjApKyhpKmE+Pj4xNik7cmV0dXJuIGMqcysodT4+MTYpKygoaSpzPj4+MCkrKHUmbik+PjE2KX19KX0sNjg0MDY6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6Ik1hdGgiLHN0YXQ6ITB9LHtpc3ViaDpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz10Pj4+MCxpPW4+Pj4wO3JldHVybihlPj4+MCktKHI+Pj4wKS0oKH5vJml8fihvXmkpJm8taT4+PjApPj4+MzEpfDB9fSl9LDkwNzY5OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7UkFEX1BFUl9ERUc6MTgwL01hdGguUEl9KX0sNTc4OTE6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89TWF0aC5QSS8xODA7cih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7cmFkaWFuczpmdW5jdGlvbih0KXtyZXR1cm4gdCpvfX0pfSwxNTcyMjpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiTWF0aCIsc3RhdDohMH0se3NjYWxlOm4oNzc0Mil9KX0sMTc2NTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDg3NTc5KSxpPW4oODk1NDIpLGE9big3MTIwMSksYz1uKDg5ODI3KSxzPSJTZWVkZWQgUmFuZG9tIix1PSJTZWVkZWQgUmFuZG9tIEdlbmVyYXRvciIsbD1jLnNldCxmPWMuZ2V0dGVyRm9yKHUpLGQ9YSgoZnVuY3Rpb24odCl7bCh0aGlzLHt0eXBlOnUsc2VlZDp0JTIxNDc0ODM2NDd9KX0pLHMsKGZ1bmN0aW9uKCl7dmFyIHQ9Zih0aGlzKTtyZXR1cm57dmFsdWU6KDEwNzM3NDE4MjMmKHQuc2VlZD0oMTEwMzUxNTI0NSp0LnNlZWQrMTIzNDUpJTIxNDc0ODM2NDcpKS8xMDczNzQxODIzLGRvbmU6ITF9fSkpO3Ioe3RhcmdldDoiTWF0aCIsc3RhdDohMCxmb3JjZWQ6ITB9LHtzZWVkZWRQUk5HOmZ1bmN0aW9uKHQpe3ZhciBlPW8odCkuc2VlZDtpZighaShlKSl0aHJvdyBUeXBlRXJyb3IoJ01hdGguc2VlZGVkUFJORygpIGFyZ3VtZW50IHNob3VsZCBoYXZlIGEgInNlZWQiIGZpZWxkIHdpdGggYSBmaW5pdGUgdmFsdWUuJyk7cmV0dXJuIG5ldyBkKGUpfX0pfSw3NzkwNzpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiTWF0aCIsc3RhdDohMH0se3NpZ25iaXQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9K3QpPT10JiYwPT10PzEvdD09LTEvMDp0PDB9fSl9LDQ0NjQ2OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJNYXRoIixzdGF0OiEwfSx7dW11bGg6ZnVuY3Rpb24odCxlKXt2YXIgbj02NTUzNSxyPSt0LG89K2UsaT1yJm4sYT1vJm4sYz1yPj4+MTYscz1vPj4+MTYsdT0oYyphPj4+MCkrKGkqYT4+PjE2KTtyZXR1cm4gYypzKyh1Pj4+MTYpKygoaSpzPj4+MCkrKHUmbik+Pj4xNil9fSl9LDc1NjQ3OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDQzNDE2KSxpPW4oNzg0NiksYT0iSW52YWxpZCBudW1iZXIgcmVwcmVzZW50YXRpb24iLGM9L15bXGRhLXpdKyQvO3Ioe3RhcmdldDoiTnVtYmVyIixzdGF0OiEwfSx7ZnJvbVN0cmluZzpmdW5jdGlvbih0LGUpe3ZhciBuLHIscz0xO2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBUeXBlRXJyb3IoYSk7aWYoIXQubGVuZ3RoKXRocm93IFN5bnRheEVycm9yKGEpO2lmKCItIj09dC5jaGFyQXQoMCkmJihzPS0xLCEodD10LnNsaWNlKDEpKS5sZW5ndGgpKXRocm93IFN5bnRheEVycm9yKGEpO2lmKChuPXZvaWQgMD09PWU/MTA6byhlKSk8Mnx8bj4zNil0aHJvdyBSYW5nZUVycm9yKCJJbnZhbGlkIHJhZGl4Iik7aWYoIWMudGVzdCh0KXx8KHI9aSh0LG4pKS50b1N0cmluZyhuKSE9PXQpdGhyb3cgU3ludGF4RXJyb3IoYSk7cmV0dXJuIHMqcn19KX0sODQzMDk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODY0MDMpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7aXRlcmF0ZUVudHJpZXM6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvKHQsImVudHJpZXMiKX19KX0sNzI5NjM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODY0MDMpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7aXRlcmF0ZUtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvKHQsImtleXMiKX19KX0sNTYzNTk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODY0MDMpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7aXRlcmF0ZVZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8odCwidmFsdWVzIil9fSl9LDIwMjM0OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDYyNTU2KSxpPW4oNjc1MzgpLGE9big4NjQ3MCksYz1uKDg3NTc5KSxzPW4oMTA1OTIpLHU9big1OTM3OSksbD1uKDM3NjIwKS5mLGY9big2Njk3MSksZD1uKDE5MjYpLHA9bigzMTA3NCksaD1uKDQxMzM0KSx2PW4oODM2MjApLGc9bigyMzcyNCkseT1uKDg5ODI3KSxtPWcoIm9ic2VydmFibGUiKSxiPXkuZ2V0LHg9eS5zZXQsdz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA6YSh0KX0sRT1mdW5jdGlvbih0KXt2YXIgZT10LmNsZWFudXA7aWYoZSl7dC5jbGVhbnVwPXZvaWQgMDt0cnl7ZSgpfWNhdGNoKHQpe3YodCl9fX0saj1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dC5vYnNlcnZlcn0sQz1mdW5jdGlvbih0LGUpe2lmKCFvKXt0LmNsb3NlZD0hMDt2YXIgbj1lLnN1YnNjcmlwdGlvbk9ic2VydmVyO24mJihuLmNsb3NlZD0hMCl9ZS5vYnNlcnZlcj12b2lkIDB9LGs9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXgodGhpcyx7Y2xlYW51cDp2b2lkIDAsb2JzZXJ2ZXI6Yyh0KSxzdWJzY3JpcHRpb25PYnNlcnZlcjp2b2lkIDB9KTtvfHwodGhpcy5jbG9zZWQ9ITEpO3RyeXsobj13KHQuc3RhcnQpKSYmbi5jYWxsKHQsdGhpcyl9Y2F0Y2godCl7dih0KX1pZighaihyKSl7dmFyIGk9ci5zdWJzY3JpcHRpb25PYnNlcnZlcj1uZXcgUyh0aGlzKTt0cnl7dmFyIHM9ZShpKSx1PXM7bnVsbCE9cyYmKHIuY2xlYW51cD0iZnVuY3Rpb24iPT10eXBlb2Ygcy51bnN1YnNjcmliZT9mdW5jdGlvbigpe3UudW5zdWJzY3JpYmUoKX06YShzKSl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgaS5lcnJvcih0KX1qKHIpJiZFKHIpfX07ay5wcm90b3R5cGU9ZCh7fSx7dW5zdWJzY3JpYmU6ZnVuY3Rpb24oKXt2YXIgdD1iKHRoaXMpO2oodCl8fChDKHRoaXMsdCksRSh0KSl9fSksbyYmbChrLnByb3RvdHlwZSwiY2xvc2VkIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBqKGIodGhpcykpfX0pO3ZhciBTPWZ1bmN0aW9uKHQpe3godGhpcyx7c3Vic2NyaXB0aW9uOnR9KSxvfHwodGhpcy5jbG9zZWQ9ITEpfTtTLnByb3RvdHlwZT1kKHt9LHtuZXh0OmZ1bmN0aW9uKHQpe3ZhciBlPWIoYih0aGlzKS5zdWJzY3JpcHRpb24pO2lmKCFqKGUpKXt2YXIgbj1lLm9ic2VydmVyO3RyeXt2YXIgcj13KG4ubmV4dCk7ciYmci5jYWxsKG4sdCl9Y2F0Y2godCl7dih0KX19fSxlcnJvcjpmdW5jdGlvbih0KXt2YXIgZT1iKHRoaXMpLnN1YnNjcmlwdGlvbixuPWIoZSk7aWYoIWoobikpe3ZhciByPW4ub2JzZXJ2ZXI7QyhlLG4pO3RyeXt2YXIgbz13KHIuZXJyb3IpO28/by5jYWxsKHIsdCk6dih0KX1jYXRjaCh0KXt2KHQpfUUobil9fSxjb21wbGV0ZTpmdW5jdGlvbigpe3ZhciB0PWIodGhpcykuc3Vic2NyaXB0aW9uLGU9Yih0KTtpZighaihlKSl7dmFyIG49ZS5vYnNlcnZlcjtDKHQsZSk7dHJ5e3ZhciByPXcobi5jb21wbGV0ZSk7ciYmci5jYWxsKG4pfWNhdGNoKHQpe3YodCl9RShlKX19fSksbyYmbChTLnByb3RvdHlwZSwiY2xvc2VkIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBqKGIoYih0aGlzKS5zdWJzY3JpcHRpb24pKX19KTt2YXIgTz1mdW5jdGlvbih0KXt1KHRoaXMsTywiT2JzZXJ2YWJsZSIpLHgodGhpcyx7c3Vic2NyaWJlcjphKHQpfSl9O2QoTy5wcm90b3R5cGUse3N1YnNjcmliZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBuZXcgaygiZnVuY3Rpb24iPT10eXBlb2YgdD97bmV4dDp0LGVycm9yOmU+MT9hcmd1bWVudHNbMV06dm9pZCAwLGNvbXBsZXRlOmU+Mj9hcmd1bWVudHNbMl06dm9pZCAwfTpzKHQpP3Q6e30sYih0aGlzKS5zdWJzY3JpYmVyKX19KSxkKE8se2Zyb206ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXM/dGhpczpPLG49dyhjKHQpW21dKTtpZihuKXt2YXIgcj1jKG4uY2FsbCh0KSk7cmV0dXJuIHIuY29uc3RydWN0b3I9PT1lP3I6bmV3IGUoKGZ1bmN0aW9uKHQpe3JldHVybiByLnN1YnNjcmliZSh0KX0pKX12YXIgbz1wKHQpO3JldHVybiBuZXcgZSgoZnVuY3Rpb24odCl7aChvLChmdW5jdGlvbihlKXtpZih0Lm5leHQoZSksdC5jbG9zZWQpcmV0dXJuIGguc3RvcCgpfSksdm9pZCAwLCExLCEwKSx0LmNvbXBsZXRlKCl9KSl9LG9mOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6TyxlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZSkscj0wO3I8ZTspbltyXT1hcmd1bWVudHNbcisrXTtyZXR1cm4gbmV3IHQoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8ZTtyKyspaWYodC5uZXh0KG5bcl0pLHQuY2xvc2VkKXJldHVybjt0LmNvbXBsZXRlKCl9KSl9fSksZihPLnByb3RvdHlwZSxtLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLHIoe2dsb2JhbDohMH0se09ic2VydmFibGU6T30pLGkoIk9ic2VydmFibGUiKX0sMjc3NTpmdW5jdGlvbih0LGUsbil7bigxNzYyOSl9LDczMjIwOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDg2NDcwKSxpPW4oNzcwMSksYT1uKDgzMDgzKSxjPW4oMzExNSkscz1uKDQxMzM0KSx1PSJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCI7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsbD1uLnJlamVjdCxmPWMoKGZ1bmN0aW9uKCl7dmFyIG49byhlLnJlc29sdmUpLGE9W10sYz0wLGY9MSxkPSExO3ModCwoZnVuY3Rpb24odCl7dmFyIG89YysrLHM9ITE7YS5wdXNoKHZvaWQgMCksZisrLG4uY2FsbChlLHQpLnRoZW4oKGZ1bmN0aW9uKHQpe3N8fGR8fChkPSEwLHIodCkpfSksKGZ1bmN0aW9uKHQpe3N8fGR8fChzPSEwLGFbb109dCwtLWZ8fGwobmV3KGkoIkFnZ3JlZ2F0ZUVycm9yIikpKGEsdSkpKX0pKX0pKSwtLWZ8fGwobmV3KGkoIkFnZ3JlZ2F0ZUVycm9yIikpKGEsdSkpfSkpO3JldHVybiBmLmVycm9yJiZsKGYudmFsdWUpLG4ucHJvbWlzZX19KX0sMTEwNzE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oODMwODMpLGk9bigzMTE1KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHt0cnk6ZnVuY3Rpb24odCl7dmFyIGU9by5mKHRoaXMpLG49aSh0KTtyZXR1cm4obi5lcnJvcj9lLnJlamVjdDplLnJlc29sdmUpKG4udmFsdWUpLGUucHJvbWlzZX19KX0sNDk2NDA6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big3NzAyMCksaT1uKDg3NTc5KSxhPW8udG9LZXksYz1vLnNldDtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtkZWZpbmVNZXRhZGF0YTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDw0P3ZvaWQgMDphKGFyZ3VtZW50c1szXSk7Yyh0LGUsaShuKSxyKX19KX0sNzQ5NjM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big3NzAyMCksaT1uKDg3NTc5KSxhPW8udG9LZXksYz1vLmdldE1hcCxzPW8uc3RvcmU7cih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwfSx7ZGVsZXRlTWV0YWRhdGE6ZnVuY3Rpb24odCxlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOmEoYXJndW1lbnRzWzJdKSxyPWMoaShlKSxuLCExKTtpZih2b2lkIDA9PT1yfHwhci5kZWxldGUodCkpcmV0dXJuITE7aWYoci5zaXplKXJldHVybiEwO3ZhciBvPXMuZ2V0KGUpO3JldHVybiBvLmRlbGV0ZShuKSwhIW8uc2l6ZXx8cy5kZWxldGUoZSl9fSl9LDQ5MTU1OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNzQwNjEpLGk9big3NzAyMCksYT1uKDg3NTc5KSxjPW4oNjQ5NjUpLHM9big0MTMzNCksdT1pLmtleXMsbD1pLnRvS2V5LGY9ZnVuY3Rpb24odCxlKXt2YXIgbj11KHQsZSkscj1jKHQpO2lmKG51bGw9PT1yKXJldHVybiBuO3ZhciBpLGEsbD1mKHIsZSk7cmV0dXJuIGwubGVuZ3RoP24ubGVuZ3RoPyhpPW5ldyBvKG4uY29uY2F0KGwpKSxzKGksKGE9W10pLnB1c2gsYSksYSk6bDpufTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXRNZXRhZGF0YUtleXM6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDwyP3ZvaWQgMDpsKGFyZ3VtZW50c1sxXSk7cmV0dXJuIGYoYSh0KSxlKX19KX0sNjk0NTk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwNDQpLG89big3NzAyMCksaT1uKDg3NTc5KSxhPW4oNjQ5NjUpLGM9by5oYXMscz1vLmdldCx1PW8udG9LZXksbD1mdW5jdGlvbih0LGUsbil7aWYoYyh0LGUsbikpcmV0dXJuIHModCxlLG4pO3ZhciByPWEoZSk7cmV0dXJuIG51bGwhPT1yP2wodCxyLG4pOnZvaWQgMH07cih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwfSx7Z2V0TWV0YWRhdGE6ZnVuY3Rpb24odCxlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOnUoYXJndW1lbnRzWzJdKTtyZXR1cm4gbCh0LGkoZSksbil9fSl9LDg3NDc0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oNzcwMjApLGk9big4NzU3OSksYT1vLmtleXMsYz1vLnRvS2V5O3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2dldE93bk1ldGFkYXRhS2V5czpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPDI/dm9pZCAwOmMoYXJndW1lbnRzWzFdKTtyZXR1cm4gYShpKHQpLGUpfX0pfSwyNjg5NjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3MDIwKSxpPW4oODc1NzkpLGE9by5nZXQsYz1vLnRvS2V5O3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2dldE93bk1ldGFkYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDpjKGFyZ3VtZW50c1syXSk7cmV0dXJuIGEodCxpKGUpLG4pfX0pfSw5NzQzMzpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3MDIwKSxpPW4oODc1NzkpLGE9big2NDk2NSksYz1vLmhhcyxzPW8udG9LZXksdT1mdW5jdGlvbih0LGUsbil7aWYoYyh0LGUsbikpcmV0dXJuITA7dmFyIHI9YShlKTtyZXR1cm4gbnVsbCE9PXImJnUodCxyLG4pfTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtoYXNNZXRhZGF0YTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8Mz92b2lkIDA6cyhhcmd1bWVudHNbMl0pO3JldHVybiB1KHQsaShlKSxuKX19KX0sNzEwODpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3MDIwKSxpPW4oODc1NzkpLGE9by5oYXMsYz1vLnRvS2V5O3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2hhc093bk1ldGFkYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDpjKGFyZ3VtZW50c1syXSk7cmV0dXJuIGEodCxpKGUpLG4pfX0pfSwyMzYzMTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDA0NCksbz1uKDc3MDIwKSxpPW4oODc1NzkpLGE9by50b0tleSxjPW8uc2V0O3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se21ldGFkYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7Yyh0LGUsaShuKSxhKHIpKX19fSl9LDkzOTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDk4MTc5KTtyKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se2FkZEFsbDpmdW5jdGlvbigpe3JldHVybiBpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KX0sNjE0Njc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9bigxNDY2KTtyKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se2RlbGV0ZUFsbDpmdW5jdGlvbigpe3JldHVybiBpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KX0sOTgzNTA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big3NzAxKSxhPW4oODc1NzkpLGM9big4NjQ3MCkscz1uKDEzOTc5KSx1PW4oNDEzMzQpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7ZGlmZmVyZW5jZTpmdW5jdGlvbih0KXt2YXIgZT1hKHRoaXMpLG49bmV3KHMoZSxpKCJTZXQiKSkpKGUpLHI9YyhuLmRlbGV0ZSk7cmV0dXJuIHUodCwoZnVuY3Rpb24odCl7ci5jYWxsKG4sdCl9KSksbn19KX0sMTYxMjc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big4NzU3OSksYT1uKDQ2MTMwKSxjPW4oNDE0NzUpLHM9big0MTMzNCk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtldmVyeTpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMpLG49YyhlKSxyPWEodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtyZXR1cm4hcyhuLChmdW5jdGlvbih0KXtpZighcih0LHQsZSkpcmV0dXJuIHMuc3RvcCgpfSksdm9pZCAwLCExLCEwKS5zdG9wcGVkfX0pfSw1MzU4OTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDc3MDEpLGE9big4NzU3OSksYz1uKDg2NDcwKSxzPW4oNDYxMzApLHU9bigxMzk3OSksbD1uKDQxNDc1KSxmPW4oNDEzMzQpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3ZhciBlPWEodGhpcyksbj1sKGUpLHI9cyh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89bmV3KHUoZSxpKCJTZXQiKSkpLGQ9YyhvLmFkZCk7cmV0dXJuIGYobiwoZnVuY3Rpb24odCl7cih0LHQsZSkmJmQuY2FsbChvLHQpfSksdm9pZCAwLCExLCEwKSxvfX0pfSw4MTA0MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDg3NTc5KSxhPW4oNDYxMzApLGM9big0MTQ3NSkscz1uKDQxMzM0KTtyKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9aSh0aGlzKSxuPWMoZSkscj1hKHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyk7cmV0dXJuIHMobiwoZnVuY3Rpb24odCl7aWYocih0LHQsZSkpcmV0dXJuIHMuc3RvcCh0KX0pLHZvaWQgMCwhMSwhMCkucmVzdWx0fX0pfSw5NzI4NDpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiU2V0IixzdGF0OiEwfSx7ZnJvbTpuKDEyOTAxKX0pfSw0MTcxODpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDc3MDEpLGE9big4NzU3OSksYz1uKDg2NDcwKSxzPW4oMTM5NzkpLHU9big0MTMzNCk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtpbnRlcnNlY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9YSh0aGlzKSxuPW5ldyhzKGUsaSgiU2V0IikpKSxyPWMoZS5oYXMpLG89YyhuLmFkZCk7cmV0dXJuIHUodCwoZnVuY3Rpb24odCl7ci5jYWxsKGUsdCkmJm8uY2FsbChuLHQpfSkpLG59fSl9LDU3MzcxOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDY1NjcyKSxpPW4oODc1NzkpLGE9big4NjQ3MCksYz1uKDQxMzM0KTtyKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se2lzRGlzam9pbnRGcm9tOmZ1bmN0aW9uKHQpe3ZhciBlPWkodGhpcyksbj1hKGUuaGFzKTtyZXR1cm4hYyh0LChmdW5jdGlvbih0KXtpZighMD09PW4uY2FsbChlLHQpKXJldHVybiBjLnN0b3AoKX0pKS5zdG9wcGVkfX0pfSw4OTIzMDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDc3MDEpLGE9big4NzU3OSksYz1uKDg2NDcwKSxzPW4oMzEwNzQpLHU9big0MTMzNCk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtpc1N1YnNldE9mOmZ1bmN0aW9uKHQpe3ZhciBlPXModGhpcyksbj1hKHQpLHI9bi5oYXM7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHImJihuPW5ldyhpKCJTZXQiKSkodCkscj1jKG4uaGFzKSksIXUoZSwoZnVuY3Rpb24odCl7aWYoITE9PT1yLmNhbGwobix0KSlyZXR1cm4gdS5zdG9wKCl9KSx2b2lkIDAsITEsITApLnN0b3BwZWR9fSl9LDMyMzAzOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDY1NjcyKSxpPW4oODc1NzkpLGE9big4NjQ3MCksYz1uKDQxMzM0KTtyKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se2lzU3VwZXJzZXRPZjpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMpLG49YShlLmhhcyk7cmV0dXJuIWModCwoZnVuY3Rpb24odCl7aWYoITE9PT1uLmNhbGwoZSx0KSlyZXR1cm4gYy5zdG9wKCl9KSkuc3RvcHBlZH19KX0sMTY3NTc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big4NzU3OSksYT1uKDQxNDc1KSxjPW4oNDEzMzQpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7am9pbjpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMpLG49YShlKSxyPXZvaWQgMD09PXQ/IiwiOlN0cmluZyh0KSxvPVtdO3JldHVybiBjKG4sby5wdXNoLG8sITEsITApLG8uam9pbihyKX19KX0sMTEwNzQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big3NzAxKSxhPW4oODc1NzkpLGM9big4NjQ3MCkscz1uKDQ2MTMwKSx1PW4oMTM5NzkpLGw9big0MTQ3NSksZj1uKDQxMzM0KTtyKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se21hcDpmdW5jdGlvbih0KXt2YXIgZT1hKHRoaXMpLG49bChlKSxyPXModCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPW5ldyh1KGUsaSgiU2V0IikpKSxkPWMoby5hZGQpO3JldHVybiBmKG4sKGZ1bmN0aW9uKHQpe2QuY2FsbChvLHIodCx0LGUpKX0pLHZvaWQgMCwhMSwhMCksb319KX0sMjQ1OTg6ZnVuY3Rpb24odCxlLG4pe24oMTQwNDQpKHt0YXJnZXQ6IlNldCIsc3RhdDohMH0se29mOm4oMjUwMjYpfSl9LDMzNTM5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDA0NCksbz1uKDY1NjcyKSxpPW4oODc1NzkpLGE9big4NjQ3MCksYz1uKDQxNDc1KSxzPW4oNDEzMzQpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7cmVkdWNlOmZ1bmN0aW9uKHQpe3ZhciBlPWkodGhpcyksbj1jKGUpLHI9YXJndW1lbnRzLmxlbmd0aDwyLG89cj92b2lkIDA6YXJndW1lbnRzWzFdO2lmKGEodCkscyhuLChmdW5jdGlvbihuKXtyPyhyPSExLG89bik6bz10KG8sbixuLGUpfSksdm9pZCAwLCExLCEwKSxyKXRocm93IFR5cGVFcnJvcigiUmVkdWNlIG9mIGVtcHR5IHNldCB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTtyZXR1cm4gb319KX0sMjQxMDM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big4NzU3OSksYT1uKDQ2MTMwKSxjPW4oNDE0NzUpLHM9big0MTMzNCk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtzb21lOmZ1bmN0aW9uKHQpe3ZhciBlPWkodGhpcyksbj1jKGUpLHI9YSh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3JldHVybiBzKG4sKGZ1bmN0aW9uKHQpe2lmKHIodCx0LGUpKXJldHVybiBzLnN0b3AoKX0pLHZvaWQgMCwhMSwhMCkuc3RvcHBlZH19KX0sNjYxODE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big3NzAxKSxhPW4oODc1NzkpLGM9big4NjQ3MCkscz1uKDEzOTc5KSx1PW4oNDEzMzQpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7c3ltbWV0cmljRGlmZmVyZW5jZTpmdW5jdGlvbih0KXt2YXIgZT1hKHRoaXMpLG49bmV3KHMoZSxpKCJTZXQiKSkpKGUpLHI9YyhuLmRlbGV0ZSksbz1jKG4uYWRkKTtyZXR1cm4gdSh0LChmdW5jdGlvbih0KXtyLmNhbGwobix0KXx8by5jYWxsKG4sdCl9KSksbn19KX0sNjI5MTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDc3MDEpLGE9big4NzU3OSksYz1uKDg2NDcwKSxzPW4oMTM5NzkpLHU9big0MTMzNCk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHt1bmlvbjpmdW5jdGlvbih0KXt2YXIgZT1hKHRoaXMpLG49bmV3KHMoZSxpKCJTZXQiKSkpKGUpO3JldHVybiB1KHQsYyhuLmFkZCksbiksbn19KX0sNzM0NjA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjAxNDApLmNoYXJBdDtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITB9LHthdDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQpfX0pfSwzMjA2MjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big3MTIwMSksaT1uKDcwMTMyKSxhPW4oODk4MjcpLGM9big2MDE0MCkscz1jLmNvZGVBdCx1PWMuY2hhckF0LGw9IlN0cmluZyBJdGVyYXRvciIsZj1hLnNldCxkPWEuZ2V0dGVyRm9yKGwpLHA9bygoZnVuY3Rpb24odCl7Zih0aGlzLHt0eXBlOmwsc3RyaW5nOnQsaW5kZXg6MH0pfSksIlN0cmluZyIsKGZ1bmN0aW9uKCl7dmFyIHQsZT1kKHRoaXMpLG49ZS5zdHJpbmcscj1lLmluZGV4O3JldHVybiByPj1uLmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Oih0PXUobixyKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6e2NvZGVQb2ludDpzKHQsMCkscG9zaXRpb246cn0sZG9uZTohMX0pfSkpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMH0se2NvZGVQb2ludHM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAoU3RyaW5nKGkodGhpcykpKX19KX0sNzQ1MjU6ZnVuY3Rpb24odCxlLG4pe24oODEyNzcpfSw2NDAyNjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big3MDEzMiksaT1uKDQzMjIzKSxhPW4oMjU0MTkpLGM9bigyMzcyNCkscz1uKDY1NjcyKSx1PWMoInJlcGxhY2UiKSxsPVJlZ0V4cC5wcm90b3R5cGU7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwfSx7cmVwbGFjZUFsbDpmdW5jdGlvbiB0KGUsbil7dmFyIHIsYyxmLGQscCxoLHYsZyx5PW8odGhpcyk7aWYobnVsbCE9ZSl7aWYoKHI9aShlKSkmJiF+U3RyaW5nKG8oImZsYWdzImluIGw/ZS5mbGFnczphLmNhbGwoZSkpKS5pbmRleE9mKCJnIikpdGhyb3cgVHlwZUVycm9yKCJgLnJlcGxhY2VBbGxgIGRvZXMgbm90IGFsbG93IG5vbi1nbG9iYWwgcmVnZXhlcyIpO2lmKHZvaWQgMCE9PShjPWVbdV0pKXJldHVybiBjLmNhbGwoZSx5LG4pO2lmKHMmJnIpcmV0dXJuIFN0cmluZyh5KS5yZXBsYWNlKGUsbil9aWYoZj1TdHJpbmcoeSksIiI9PT0oZD1TdHJpbmcoZSkpKXJldHVybiB0LmNhbGwoZiwvKD86KS9nLG4pO2lmKHA9Zi5zcGxpdChkKSwiZnVuY3Rpb24iIT10eXBlb2YgbilyZXR1cm4gcC5qb2luKFN0cmluZyhuKSk7Zm9yKHY9KGg9cFswXSkubGVuZ3RoLGc9MTtnPHAubGVuZ3RoO2crKyloKz1TdHJpbmcobihkLHYsZikpLHYrPWQubGVuZ3RoK3BbZ10ubGVuZ3RoLGgrPXBbZ107cmV0dXJuIGh9fSl9LDY5NDI6ZnVuY3Rpb24odCxlLG4pe24oOTIyNzUpKCJhc3luY0Rpc3Bvc2UiKX0sOTQyNDk6ZnVuY3Rpb24odCxlLG4pe24oOTIyNzUpKCJkaXNwb3NlIil9LDUxMzc0OmZ1bmN0aW9uKHQsZSxuKXtuKDkyMjc1KSgib2JzZXJ2YWJsZSIpfSw1Mzc3MjpmdW5jdGlvbih0LGUsbil7big5MjI3NSkoInBhdHRlcm5NYXRjaCIpfSw4NjA3NzpmdW5jdGlvbih0LGUsbil7big5MjI3NSkoInJlcGxhY2VBbGwiKX0sNjQ4MTM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9bigxNDY2KTtyKHt0YXJnZXQ6IldlYWtNYXAiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm99LHtkZWxldGVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSl9LDk5OTc5OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJXZWFrTWFwIixzdGF0OiEwfSx7ZnJvbTpuKDEyOTAxKX0pfSwxODIwNTpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiV2Vha01hcCIsc3RhdDohMH0se29mOm4oMjUwMjYpfSl9LDg3NTU1OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bigxNDA0NCkoe3RhcmdldDoiV2Vha01hcCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6big2NTY3Mil9LHt1cHNlcnQ6big0NzkyNyl9KX0sNjg5OTk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MDQ0KSxvPW4oNjU2NzIpLGk9big5ODE3OSk7cih7dGFyZ2V0OiJXZWFrU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpvfSx7YWRkQWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pfSw1MzgyNDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTQwNDQpLG89big2NTY3MiksaT1uKDE0NjYpO3Ioe3RhcmdldDoiV2Vha1NldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6b30se2RlbGV0ZUFsbDpmdW5jdGlvbigpe3JldHVybiBpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KX0sODU4OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDQ0KSh7dGFyZ2V0OiJXZWFrU2V0IixzdGF0OiEwfSx7ZnJvbTpuKDEyOTAxKX0pfSw2NDg5OTpmdW5jdGlvbih0LGUsbil7bigxNDA0NCkoe3RhcmdldDoiV2Vha1NldCIsc3RhdDohMH0se29mOm4oMjUwMjYpfSl9LDY3MDM5OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5NTU4KSxvPW4oNDcwOTQpLGk9bigzMTM2OCksYT1uKDY2OTcxKTtmb3IodmFyIGMgaW4gbyl7dmFyIHM9cltjXSx1PXMmJnMucHJvdG90eXBlO2lmKHUmJnUuZm9yRWFjaCE9PWkpdHJ5e2EodSwiZm9yRWFjaCIsaSl9Y2F0Y2godCl7dS5mb3JFYWNoPWl9fX0sNzk3OTk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODk1NTgpLG89big0NzA5NCksaT1uKDUwMDYzKSxhPW4oNjY5NzEpLGM9bigyMzcyNCkscz1jKCJpdGVyYXRvciIpLHU9YygidG9TdHJpbmdUYWciKSxsPWkudmFsdWVzO2Zvcih2YXIgZiBpbiBvKXt2YXIgZD1yW2ZdLHA9ZCYmZC5wcm90b3R5cGU7aWYocCl7aWYocFtzXSE9PWwpdHJ5e2EocCxzLGwpfWNhdGNoKHQpe3Bbc109bH1pZihwW3VdfHxhKHAsdSxmKSxvW2ZdKWZvcih2YXIgaCBpbiBpKWlmKHBbaF0hPT1pW2hdKXRyeXthKHAsaCxpW2hdKX1jYXRjaCh0KXtwW2hdPWlbaF19fX19LDc0MDEwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oODk1NTgpLGk9bigyMTc0NCk7cih7Z2xvYmFsOiEwLGJpbmQ6ITAsZW51bWVyYWJsZTohMCxmb3JjZWQ6IW8uc2V0SW1tZWRpYXRlfHwhby5jbGVhckltbWVkaWF0ZX0se3NldEltbWVkaWF0ZTppLnNldCxjbGVhckltbWVkaWF0ZTppLmNsZWFyfSl9LDY1OTc2OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oODk1NTgpLGk9big2NTU1NSksYT1uKDI0NTk0KSxjPW8ucHJvY2VzcyxzPSJwcm9jZXNzIj09YShjKTtyKHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxub1RhcmdldEdldDohMH0se3F1ZXVlTWljcm90YXNrOmZ1bmN0aW9uKHQpe3ZhciBlPXMmJmMuZG9tYWluO2koZT9lLmJpbmQodCk6dCl9fSl9LDgxOTk0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0MDQ0KSxvPW4oODk1NTgpLGk9bigzOTQ3NiksYT1bXS5zbGljZSxjPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MixvPXI/YS5jYWxsKGFyZ3VtZW50cywyKTp2b2lkIDA7cmV0dXJuIHQocj9mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2YgZT9lOkZ1bmN0aW9uKGUpKS5hcHBseSh0aGlzLG8pfTplLG4pfX07cih7Z2xvYmFsOiEwLGJpbmQ6ITAsZm9yY2VkOi9NU0lFIC5cLi8udGVzdChpKX0se3NldFRpbWVvdXQ6YyhvLnNldFRpbWVvdXQpLHNldEludGVydmFsOmMoby5zZXRJbnRlcnZhbCl9KX0sNTU1NzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oNTAwNjMpO3ZhciByPW4oMTQwNDQpLG89big3NzAxKSxpPW4oNTc1OTcpLGE9big5MjkxMyksYz1uKDE5MjYpLHM9big1MTEyOCksdT1uKDcxMjAxKSxsPW4oODk4MjcpLGY9big1OTM3OSksZD1uKDc2Mjk4KSxwPW4oNDYxMzApLGg9big1OTU5MSksdj1uKDg3NTc5KSxnPW4oMTA1OTIpLHk9big1MDg2OCksbT1uKDE0MjA5KSxiPW4oMzEwNzQpLHg9big3Mzg5MCksdz1uKDIzNzI0KSxFPW8oImZldGNoIiksaj1vKCJIZWFkZXJzIiksQz13KCJpdGVyYXRvciIpLGs9IlVSTFNlYXJjaFBhcmFtcyIsUz0iVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IiLE89bC5zZXQsQT1sLmdldHRlckZvcihrKSxJPWwuZ2V0dGVyRm9yKFMpLFQ9L1wrL2csTT1BcnJheSg0KSxfPWZ1bmN0aW9uKHQpe3JldHVybiBNW3QtMV18fChNW3QtMV09UmVnRXhwKCIoKD86JVtcXGRhLWZdezJ9KXsiK3QrIn0pIiwiZ2kiKSl9LEw9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQodCl9Y2F0Y2goZSl7cmV0dXJuIHR9fSxSPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShULCIgIiksbj00O3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGUpfWNhdGNoKHQpe2Zvcig7bjspZT1lLnJlcGxhY2UoXyhuLS0pLEwpO3JldHVybiBlfX0sUD0vWyEnKCl+XXwlMjAvZyxOPXsiISI6IiUyMSIsIiciOiIlMjciLCIoIjoiJTI4IiwiKSI6IiUyOSIsIn4iOiIlN0UiLCIlMjAiOiIrIn0sRj1mdW5jdGlvbih0KXtyZXR1cm4gTlt0XX0sRD1mdW5jdGlvbih0KXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoUCxGKX0sVT1mdW5jdGlvbih0LGUpe2lmKGUpZm9yKHZhciBuLHIsbz1lLnNwbGl0KCImIiksaT0wO2k8by5sZW5ndGg7KShuPW9baSsrXSkubGVuZ3RoJiYocj1uLnNwbGl0KCI9IiksdC5wdXNoKHtrZXk6UihyLnNoaWZ0KCkpLHZhbHVlOlIoci5qb2luKCI9IikpfSkpfSxCPWZ1bmN0aW9uKHQpe3RoaXMuZW50cmllcy5sZW5ndGg9MCxVKHRoaXMuZW50cmllcyx0KX0sej1mdW5jdGlvbih0LGUpe2lmKHQ8ZSl0aHJvdyBUeXBlRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzIil9LEg9dSgoZnVuY3Rpb24odCxlKXtPKHRoaXMse3R5cGU6UyxpdGVyYXRvcjpiKEEodCkuZW50cmllcyksa2luZDplfSl9KSwiSXRlcmF0b3IiLChmdW5jdGlvbigpe3ZhciB0PUkodGhpcyksZT10LmtpbmQsbj10Lml0ZXJhdG9yLm5leHQoKSxyPW4udmFsdWU7cmV0dXJuIG4uZG9uZXx8KG4udmFsdWU9ImtleXMiPT09ZT9yLmtleToidmFsdWVzIj09PWU/ci52YWx1ZTpbci5rZXksci52YWx1ZV0pLG59KSksVj1mdW5jdGlvbigpe2YodGhpcyxWLGspO3ZhciB0LGUsbixyLG8saSxhLGMscyx1PWFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwLGw9dGhpcyxwPVtdO2lmKE8obCx7dHlwZTprLGVudHJpZXM6cCx1cGRhdGVVUkw6ZnVuY3Rpb24oKXt9LHVwZGF0ZVNlYXJjaFBhcmFtczpCfSksdm9pZCAwIT09dSlpZihnKHUpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZih0PXgodSkpKWZvcihuPShlPXQuY2FsbCh1KSkubmV4dDshKHI9bi5jYWxsKGUpKS5kb25lOyl7aWYoKGE9KGk9KG89Yih2KHIudmFsdWUpKSkubmV4dCkuY2FsbChvKSkuZG9uZXx8KGM9aS5jYWxsKG8pKS5kb25lfHwhaS5jYWxsKG8pLmRvbmUpdGhyb3cgVHlwZUVycm9yKCJFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyIik7cC5wdXNoKHtrZXk6YS52YWx1ZSsiIix2YWx1ZTpjLnZhbHVlKyIifSl9ZWxzZSBmb3IocyBpbiB1KWQodSxzKSYmcC5wdXNoKHtrZXk6cyx2YWx1ZTp1W3NdKyIifSk7ZWxzZSBVKHAsInN0cmluZyI9PXR5cGVvZiB1PyI/Ij09PXUuY2hhckF0KDApP3Uuc2xpY2UoMSk6dTp1KyIiKX0scT1WLnByb3RvdHlwZTtjKHEse2FwcGVuZDpmdW5jdGlvbih0LGUpe3ooYXJndW1lbnRzLmxlbmd0aCwyKTt2YXIgbj1BKHRoaXMpO24uZW50cmllcy5wdXNoKHtrZXk6dCsiIix2YWx1ZTplKyIifSksbi51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe3ooYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9QSh0aGlzKSxuPWUuZW50cmllcyxyPXQrIiIsbz0wO288bi5sZW5ndGg7KW5bb10ua2V5PT09cj9uLnNwbGljZShvLDEpOm8rKztlLnVwZGF0ZVVSTCgpfSxnZXQ6ZnVuY3Rpb24odCl7eihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1BKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdLmtleT09PW4pcmV0dXJuIGVbcl0udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbih0KXt6KGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPUEodGhpcykuZW50cmllcyxuPXQrIiIscj1bXSxvPTA7bzxlLmxlbmd0aDtvKyspZVtvXS5rZXk9PT1uJiZyLnB1c2goZVtvXS52YWx1ZSk7cmV0dXJuIHJ9LGhhczpmdW5jdGlvbih0KXt6KGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPUEodGhpcykuZW50cmllcyxuPXQrIiIscj0wO3I8ZS5sZW5ndGg7KWlmKGVbcisrXS5rZXk9PT1uKXJldHVybiEwO3JldHVybiExfSxzZXQ6ZnVuY3Rpb24odCxlKXt6KGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBuLHI9QSh0aGlzKSxvPXIuZW50cmllcyxpPSExLGE9dCsiIixjPWUrIiIscz0wO3M8by5sZW5ndGg7cysrKShuPW9bc10pLmtleT09PWEmJihpP28uc3BsaWNlKHMtLSwxKTooaT0hMCxuLnZhbHVlPWMpKTtpfHxvLnB1c2goe2tleTphLHZhbHVlOmN9KSxyLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9QSh0aGlzKSxvPXIuZW50cmllcyxpPW8uc2xpY2UoKTtmb3Ioby5sZW5ndGg9MCxuPTA7bjxpLmxlbmd0aDtuKyspe2Zvcih0PWlbbl0sZT0wO2U8bjtlKyspaWYob1tlXS5rZXk+dC5rZXkpe28uc3BsaWNlKGUsMCx0KTticmVha31lPT09biYmby5wdXNoKHQpfXIudXBkYXRlVVJMKCl9LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49QSh0aGlzKS5lbnRyaWVzLHI9cCh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89MDtvPG4ubGVuZ3RoOylyKChlPW5bbysrXSkudmFsdWUsZS5rZXksdGhpcyl9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEgodGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEgodGhpcywidmFsdWVzIil9LGVudHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEgodGhpcywiZW50cmllcyIpfX0se2VudW1lcmFibGU6ITB9KSxhKHEsQyxxLmVudHJpZXMpLGEocSwidG9TdHJpbmciLChmdW5jdGlvbigpe2Zvcih2YXIgdCxlPUEodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goRCh0LmtleSkrIj0iK0QodC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0pLHtlbnVtZXJhYmxlOiEwfSkscyhWLGspLHIoe2dsb2JhbDohMCxmb3JjZWQ6IWl9LHtVUkxTZWFyY2hQYXJhbXM6Vn0pLGl8fCJmdW5jdGlvbiIhPXR5cGVvZiBFfHwiZnVuY3Rpb24iIT10eXBlb2Yganx8cih7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89W3RdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjEmJihnKGU9YXJndW1lbnRzWzFdKSYmKG49ZS5ib2R5LGgobik9PT1rJiYoKHI9ZS5oZWFkZXJzP25ldyBqKGUuaGVhZGVycyk6bmV3IGopLmhhcygiY29udGVudC10eXBlIil8fHIuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpLGU9eShlLHtib2R5Om0oMCxTdHJpbmcobikpLGhlYWRlcnM6bSgwLHIpfSkpKSxvLnB1c2goZSkpLEUuYXBwbHkodGhpcyxvKX19KSx0LmV4cG9ydHM9e1VSTFNlYXJjaFBhcmFtczpWLGdldFN0YXRlOkF9fSwxMzkxMDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oODIyMDEpO3ZhciByLG89bigxNDA0NCksaT1uKDYyNTU2KSxhPW4oNTc1OTcpLGM9big4OTU1OCkscz1uKDg2NDAxKSx1PW4oOTI5MTMpLGw9big1OTM3OSksZj1uKDc2Mjk4KSxkPW4oNzg2ODUpLHA9big4NTE2NiksaD1uKDYwMTQwKS5jb2RlQXQsdj1uKDY5OTI3KSxnPW4oNTExMjgpLHk9big1NTU3KSxtPW4oODk4MjcpLGI9Yy5VUkwseD15LlVSTFNlYXJjaFBhcmFtcyx3PXkuZ2V0U3RhdGUsRT1tLnNldCxqPW0uZ2V0dGVyRm9yKCJVUkwiKSxDPU1hdGguZmxvb3Isaz1NYXRoLnBvdyxTPSJJbnZhbGlkIHNjaGVtZSIsTz0iSW52YWxpZCBob3N0IixBPSJJbnZhbGlkIHBvcnQiLEk9L1tBLVphLXpdLyxUPS9bXGQrXC0uQS1aYS16XS8sTT0vXGQvLF89L14oMHh8MFgpLyxMPS9eWzAtN10rJC8sUj0vXlxkKyQvLFA9L15bXGRBLUZhLWZdKyQvLE49L1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIyUvOj9AW1xcXV0vLEY9L1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIy86P0BbXFxdXS8sRD0vXltcdTAwMDAtXHUwMDFGIF0rfFtcdTAwMDAtXHUwMDFGIF0rJC9nLFU9L1tcdTAwMDlcdTAwMEFcdTAwMERdL2csQj1mdW5jdGlvbih0LGUpe3ZhciBuLHIsbztpZigiWyI9PWUuY2hhckF0KDApKXtpZigiXSIhPWUuY2hhckF0KGUubGVuZ3RoLTEpKXJldHVybiBPO2lmKCEobj1IKGUuc2xpY2UoMSwtMSkpKSlyZXR1cm4gTzt0Lmhvc3Q9bn1lbHNlIGlmKEsodCkpe2lmKGU9dihlKSxOLnRlc3QoZSkpcmV0dXJuIE87aWYobnVsbD09PShuPXooZSkpKXJldHVybiBPO3QuaG9zdD1ufWVsc2V7aWYoRi50ZXN0KGUpKXJldHVybiBPO2ZvcihuPSIiLHI9cChlKSxvPTA7bzxyLmxlbmd0aDtvKyspbis9JChyW29dLHEpO3QuaG9zdD1ufX0sej1mdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEsYyxzPXQuc3BsaXQoIi4iKTtpZihzLmxlbmd0aCYmIiI9PXNbcy5sZW5ndGgtMV0mJnMucG9wKCksKGU9cy5sZW5ndGgpPjQpcmV0dXJuIHQ7Zm9yKG49W10scj0wO3I8ZTtyKyspe2lmKCIiPT0obz1zW3JdKSlyZXR1cm4gdDtpZihpPTEwLG8ubGVuZ3RoPjEmJiIwIj09by5jaGFyQXQoMCkmJihpPV8udGVzdChvKT8xNjo4LG89by5zbGljZSg4PT1pPzE6MikpLCIiPT09bylhPTA7ZWxzZXtpZighKDEwPT1pP1I6OD09aT9MOlApLnRlc3QobykpcmV0dXJuIHQ7YT1wYXJzZUludChvLGkpfW4ucHVzaChhKX1mb3Iocj0wO3I8ZTtyKyspaWYoYT1uW3JdLHI9PWUtMSl7aWYoYT49aygyNTYsNS1lKSlyZXR1cm4gbnVsbH1lbHNlIGlmKGE+MjU1KXJldHVybiBudWxsO2ZvcihjPW4ucG9wKCkscj0wO3I8bi5sZW5ndGg7cisrKWMrPW5bcl0qaygyNTYsMy1yKTtyZXR1cm4gY30sSD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEsYyxzPVswLDAsMCwwLDAsMCwwLDBdLHU9MCxsPW51bGwsZj0wLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jaGFyQXQoZil9O2lmKCI6Ij09ZCgpKXtpZigiOiIhPXQuY2hhckF0KDEpKXJldHVybjtmKz0yLGw9Kyt1fWZvcig7ZCgpOyl7aWYoOD09dSlyZXR1cm47aWYoIjoiIT1kKCkpe2ZvcihlPW49MDtuPDQmJlAudGVzdChkKCkpOyllPTE2KmUrcGFyc2VJbnQoZCgpLDE2KSxmKyssbisrO2lmKCIuIj09ZCgpKXtpZigwPT1uKXJldHVybjtpZihmLT1uLHU+NilyZXR1cm47Zm9yKHI9MDtkKCk7KXtpZihvPW51bGwscj4wKXtpZighKCIuIj09ZCgpJiZyPDQpKXJldHVybjtmKyt9aWYoIU0udGVzdChkKCkpKXJldHVybjtmb3IoO00udGVzdChkKCkpOyl7aWYoaT1wYXJzZUludChkKCksMTApLG51bGw9PT1vKW89aTtlbHNle2lmKDA9PW8pcmV0dXJuO289MTAqbytpfWlmKG8+MjU1KXJldHVybjtmKyt9c1t1XT0yNTYqc1t1XStvLDIhPSsrciYmNCE9cnx8dSsrfWlmKDQhPXIpcmV0dXJuO2JyZWFrfWlmKCI6Ij09ZCgpKXtpZihmKyssIWQoKSlyZXR1cm59ZWxzZSBpZihkKCkpcmV0dXJuO3NbdSsrXT1lfWVsc2V7aWYobnVsbCE9PWwpcmV0dXJuO2YrKyxsPSsrdX19aWYobnVsbCE9PWwpZm9yKGE9dS1sLHU9NzswIT11JiZhPjA7KWM9c1t1XSxzW3UtLV09c1tsK2EtMV0sc1tsKy0tYV09YztlbHNlIGlmKDghPXUpcmV0dXJuO3JldHVybiBzfSxWPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixvO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Zm9yKGU9W10sbj0wO248NDtuKyspZS51bnNoaWZ0KHQlMjU2KSx0PUModC8yNTYpO3JldHVybiBlLmpvaW4oIi4iKX1pZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihlPSIiLHI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwsbj0xLHI9bnVsbCxvPTAsaT0wO2k8ODtpKyspMCE9PXRbaV0/KG8+biYmKGU9cixuPW8pLHI9bnVsbCxvPTApOihudWxsPT09ciYmKHI9aSksKytvKTtyZXR1cm4gbz5uJiYoZT1yLG49byksZX0odCksbj0wO248ODtuKyspbyYmMD09PXRbbl18fChvJiYobz0hMSkscj09PW4/KGUrPW4/IjoiOiI6OiIsbz0hMCk6KGUrPXRbbl0udG9TdHJpbmcoMTYpLG48NyYmKGUrPSI6IikpKTtyZXR1cm4iWyIrZSsiXSJ9cmV0dXJuIHR9LHE9e30sVz1kKHt9LHEseyIgIjoxLCciJzoxLCI8IjoxLCI+IjoxLCJgIjoxfSksRz1kKHt9LFcseyIjIjoxLCI/IjoxLCJ7IjoxLCJ9IjoxfSksWj1kKHt9LEcseyIvIjoxLCI6IjoxLCI7IjoxLCI9IjoxLCJAIjoxLCJbIjoxLCJcXCI6MSwiXSI6MSwiXiI6MSwifCI6MX0pLCQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1oKHQsMCk7cmV0dXJuIG4+MzImJm48MTI3JiYhZihlLHQpP3Q6ZW5jb2RlVVJJQ29tcG9uZW50KHQpfSxZPXtmdHA6MjEsZmlsZTpudWxsLGh0dHA6ODAsaHR0cHM6NDQzLHdzOjgwLHdzczo0NDN9LEs9ZnVuY3Rpb24odCl7cmV0dXJuIGYoWSx0LnNjaGVtZSl9LEo9ZnVuY3Rpb24odCl7cmV0dXJuIiIhPXQudXNlcm5hbWV8fCIiIT10LnBhc3N3b3JkfSxYPWZ1bmN0aW9uKHQpe3JldHVybiF0Lmhvc3R8fHQuY2Fubm90QmVBQmFzZVVSTHx8ImZpbGUiPT10LnNjaGVtZX0sUT1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiAyPT10Lmxlbmd0aCYmSS50ZXN0KHQuY2hhckF0KDApKSYmKCI6Ij09KG49dC5jaGFyQXQoMSkpfHwhZSYmInwiPT1uKX0sdHQ9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHQubGVuZ3RoPjEmJlEodC5zbGljZSgwLDIpKSYmKDI9PXQubGVuZ3RofHwiLyI9PT0oZT10LmNoYXJBdCgyKSl8fCJcXCI9PT1lfHwiPyI9PT1lfHwiIyI9PT1lKX0sZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXRoLG49ZS5sZW5ndGg7IW58fCJmaWxlIj09dC5zY2hlbWUmJjE9PW4mJlEoZVswXSwhMCl8fGUucG9wKCl9LG50PWZ1bmN0aW9uKHQpe3JldHVybiIuIj09PXR8fCIlMmUiPT09dC50b0xvd2VyQ2FzZSgpfSxydD17fSxvdD17fSxpdD17fSxhdD17fSxjdD17fSxzdD17fSx1dD17fSxsdD17fSxmdD17fSxkdD17fSxwdD17fSxodD17fSx2dD17fSxndD17fSx5dD17fSxtdD17fSxidD17fSx4dD17fSx3dD17fSxFdD17fSxqdD17fSxDdD1mdW5jdGlvbih0LGUsbixvKXt2YXIgaSxhLGMscyx1LGw9bnx8cnQsZD0wLGg9IiIsdj0hMSxnPSExLHk9ITE7Zm9yKG58fCh0LnNjaGVtZT0iIix0LnVzZXJuYW1lPSIiLHQucGFzc3dvcmQ9IiIsdC5ob3N0PW51bGwsdC5wb3J0PW51bGwsdC5wYXRoPVtdLHQucXVlcnk9bnVsbCx0LmZyYWdtZW50PW51bGwsdC5jYW5ub3RCZUFCYXNlVVJMPSExLGU9ZS5yZXBsYWNlKEQsIiIpKSxlPWUucmVwbGFjZShVLCIiKSxpPXAoZSk7ZDw9aS5sZW5ndGg7KXtzd2l0Y2goYT1pW2RdLGwpe2Nhc2UgcnQ6aWYoIWF8fCFJLnRlc3QoYSkpe2lmKG4pcmV0dXJuIFM7bD1pdDtjb250aW51ZX1oKz1hLnRvTG93ZXJDYXNlKCksbD1vdDticmVhaztjYXNlIG90OmlmKGEmJihULnRlc3QoYSl8fCIrIj09YXx8Ii0iPT1hfHwiLiI9PWEpKWgrPWEudG9Mb3dlckNhc2UoKTtlbHNle2lmKCI6IiE9YSl7aWYobilyZXR1cm4gUztoPSIiLGw9aXQsZD0wO2NvbnRpbnVlfWlmKG4mJihLKHQpIT1mKFksaCl8fCJmaWxlIj09aCYmKEoodCl8fG51bGwhPT10LnBvcnQpfHwiZmlsZSI9PXQuc2NoZW1lJiYhdC5ob3N0KSlyZXR1cm47aWYodC5zY2hlbWU9aCxuKXJldHVybiB2b2lkKEsodCkmJllbdC5zY2hlbWVdPT10LnBvcnQmJih0LnBvcnQ9bnVsbCkpO2g9IiIsImZpbGUiPT10LnNjaGVtZT9sPWd0OksodCkmJm8mJm8uc2NoZW1lPT10LnNjaGVtZT9sPWF0OksodCk/bD1sdDoiLyI9PWlbZCsxXT8obD1jdCxkKyspOih0LmNhbm5vdEJlQUJhc2VVUkw9ITAsdC5wYXRoLnB1c2goIiIpLGw9d3QpfWJyZWFrO2Nhc2UgaXQ6aWYoIW98fG8uY2Fubm90QmVBQmFzZVVSTCYmIiMiIT1hKXJldHVybiBTO2lmKG8uY2Fubm90QmVBQmFzZVVSTCYmIiMiPT1hKXt0LnNjaGVtZT1vLnNjaGVtZSx0LnBhdGg9by5wYXRoLnNsaWNlKCksdC5xdWVyeT1vLnF1ZXJ5LHQuZnJhZ21lbnQ9IiIsdC5jYW5ub3RCZUFCYXNlVVJMPSEwLGw9anQ7YnJlYWt9bD0iZmlsZSI9PW8uc2NoZW1lP2d0OnN0O2NvbnRpbnVlO2Nhc2UgYXQ6aWYoIi8iIT1hfHwiLyIhPWlbZCsxXSl7bD1zdDtjb250aW51ZX1sPWZ0LGQrKzticmVhaztjYXNlIGN0OmlmKCIvIj09YSl7bD1kdDticmVha31sPXh0O2NvbnRpbnVlO2Nhc2Ugc3Q6aWYodC5zY2hlbWU9by5zY2hlbWUsYT09cil0LnVzZXJuYW1lPW8udXNlcm5hbWUsdC5wYXNzd29yZD1vLnBhc3N3b3JkLHQuaG9zdD1vLmhvc3QsdC5wb3J0PW8ucG9ydCx0LnBhdGg9by5wYXRoLnNsaWNlKCksdC5xdWVyeT1vLnF1ZXJ5O2Vsc2UgaWYoIi8iPT1hfHwiXFwiPT1hJiZLKHQpKWw9dXQ7ZWxzZSBpZigiPyI9PWEpdC51c2VybmFtZT1vLnVzZXJuYW1lLHQucGFzc3dvcmQ9by5wYXNzd29yZCx0Lmhvc3Q9by5ob3N0LHQucG9ydD1vLnBvcnQsdC5wYXRoPW8ucGF0aC5zbGljZSgpLHQucXVlcnk9IiIsbD1FdDtlbHNle2lmKCIjIiE9YSl7dC51c2VybmFtZT1vLnVzZXJuYW1lLHQucGFzc3dvcmQ9by5wYXNzd29yZCx0Lmhvc3Q9by5ob3N0LHQucG9ydD1vLnBvcnQsdC5wYXRoPW8ucGF0aC5zbGljZSgpLHQucGF0aC5wb3AoKSxsPXh0O2NvbnRpbnVlfXQudXNlcm5hbWU9by51c2VybmFtZSx0LnBhc3N3b3JkPW8ucGFzc3dvcmQsdC5ob3N0PW8uaG9zdCx0LnBvcnQ9by5wb3J0LHQucGF0aD1vLnBhdGguc2xpY2UoKSx0LnF1ZXJ5PW8ucXVlcnksdC5mcmFnbWVudD0iIixsPWp0fWJyZWFrO2Nhc2UgdXQ6aWYoIUsodCl8fCIvIiE9YSYmIlxcIiE9YSl7aWYoIi8iIT1hKXt0LnVzZXJuYW1lPW8udXNlcm5hbWUsdC5wYXNzd29yZD1vLnBhc3N3b3JkLHQuaG9zdD1vLmhvc3QsdC5wb3J0PW8ucG9ydCxsPXh0O2NvbnRpbnVlfWw9ZHR9ZWxzZSBsPWZ0O2JyZWFrO2Nhc2UgbHQ6aWYobD1mdCwiLyIhPWF8fCIvIiE9aC5jaGFyQXQoZCsxKSljb250aW51ZTtkKys7YnJlYWs7Y2FzZSBmdDppZigiLyIhPWEmJiJcXCIhPWEpe2w9ZHQ7Y29udGludWV9YnJlYWs7Y2FzZSBkdDppZigiQCI9PWEpe3YmJihoPSIlNDAiK2gpLHY9ITAsYz1wKGgpO2Zvcih2YXIgbT0wO208Yy5sZW5ndGg7bSsrKXt2YXIgYj1jW21dO2lmKCI6IiE9Ynx8eSl7dmFyIHg9JChiLFopO3k/dC5wYXNzd29yZCs9eDp0LnVzZXJuYW1lKz14fWVsc2UgeT0hMH1oPSIifWVsc2UgaWYoYT09cnx8Ii8iPT1hfHwiPyI9PWF8fCIjIj09YXx8IlxcIj09YSYmSyh0KSl7aWYodiYmIiI9PWgpcmV0dXJuIkludmFsaWQgYXV0aG9yaXR5IjtkLT1wKGgpLmxlbmd0aCsxLGg9IiIsbD1wdH1lbHNlIGgrPWE7YnJlYWs7Y2FzZSBwdDpjYXNlIGh0OmlmKG4mJiJmaWxlIj09dC5zY2hlbWUpe2w9bXQ7Y29udGludWV9aWYoIjoiIT1hfHxnKXtpZihhPT1yfHwiLyI9PWF8fCI/Ij09YXx8IiMiPT1hfHwiXFwiPT1hJiZLKHQpKXtpZihLKHQpJiYiIj09aClyZXR1cm4gTztpZihuJiYiIj09aCYmKEoodCl8fG51bGwhPT10LnBvcnQpKXJldHVybjtpZihzPUIodCxoKSlyZXR1cm4gcztpZihoPSIiLGw9YnQsbilyZXR1cm47Y29udGludWV9IlsiPT1hP2c9ITA6Il0iPT1hJiYoZz0hMSksaCs9YX1lbHNle2lmKCIiPT1oKXJldHVybiBPO2lmKHM9Qih0LGgpKXJldHVybiBzO2lmKGg9IiIsbD12dCxuPT1odClyZXR1cm59YnJlYWs7Y2FzZSB2dDppZighTS50ZXN0KGEpKXtpZihhPT1yfHwiLyI9PWF8fCI/Ij09YXx8IiMiPT1hfHwiXFwiPT1hJiZLKHQpfHxuKXtpZigiIiE9aCl7dmFyIHc9cGFyc2VJbnQoaCwxMCk7aWYodz42NTUzNSlyZXR1cm4gQTt0LnBvcnQ9Syh0KSYmdz09PVlbdC5zY2hlbWVdP251bGw6dyxoPSIifWlmKG4pcmV0dXJuO2w9YnQ7Y29udGludWV9cmV0dXJuIEF9aCs9YTticmVhaztjYXNlIGd0OmlmKHQuc2NoZW1lPSJmaWxlIiwiLyI9PWF8fCJcXCI9PWEpbD15dDtlbHNle2lmKCFvfHwiZmlsZSIhPW8uc2NoZW1lKXtsPXh0O2NvbnRpbnVlfWlmKGE9PXIpdC5ob3N0PW8uaG9zdCx0LnBhdGg9by5wYXRoLnNsaWNlKCksdC5xdWVyeT1vLnF1ZXJ5O2Vsc2UgaWYoIj8iPT1hKXQuaG9zdD1vLmhvc3QsdC5wYXRoPW8ucGF0aC5zbGljZSgpLHQucXVlcnk9IiIsbD1FdDtlbHNle2lmKCIjIiE9YSl7dHQoaS5zbGljZShkKS5qb2luKCIiKSl8fCh0Lmhvc3Q9by5ob3N0LHQucGF0aD1vLnBhdGguc2xpY2UoKSxldCh0KSksbD14dDtjb250aW51ZX10Lmhvc3Q9by5ob3N0LHQucGF0aD1vLnBhdGguc2xpY2UoKSx0LnF1ZXJ5PW8ucXVlcnksdC5mcmFnbWVudD0iIixsPWp0fX1icmVhaztjYXNlIHl0OmlmKCIvIj09YXx8IlxcIj09YSl7bD1tdDticmVha31vJiYiZmlsZSI9PW8uc2NoZW1lJiYhdHQoaS5zbGljZShkKS5qb2luKCIiKSkmJihRKG8ucGF0aFswXSwhMCk/dC5wYXRoLnB1c2goby5wYXRoWzBdKTp0Lmhvc3Q9by5ob3N0KSxsPXh0O2NvbnRpbnVlO2Nhc2UgbXQ6aWYoYT09cnx8Ii8iPT1hfHwiXFwiPT1hfHwiPyI9PWF8fCIjIj09YSl7aWYoIW4mJlEoaCkpbD14dDtlbHNlIGlmKCIiPT1oKXtpZih0Lmhvc3Q9IiIsbilyZXR1cm47bD1idH1lbHNle2lmKHM9Qih0LGgpKXJldHVybiBzO2lmKCJsb2NhbGhvc3QiPT10Lmhvc3QmJih0Lmhvc3Q9IiIpLG4pcmV0dXJuO2g9IiIsbD1idH1jb250aW51ZX1oKz1hO2JyZWFrO2Nhc2UgYnQ6aWYoSyh0KSl7aWYobD14dCwiLyIhPWEmJiJcXCIhPWEpY29udGludWV9ZWxzZSBpZihufHwiPyIhPWEpaWYobnx8IiMiIT1hKXtpZihhIT1yJiYobD14dCwiLyIhPWEpKWNvbnRpbnVlfWVsc2UgdC5mcmFnbWVudD0iIixsPWp0O2Vsc2UgdC5xdWVyeT0iIixsPUV0O2JyZWFrO2Nhc2UgeHQ6aWYoYT09cnx8Ii8iPT1hfHwiXFwiPT1hJiZLKHQpfHwhbiYmKCI/Ij09YXx8IiMiPT1hKSl7aWYoIi4uIj09PSh1PSh1PWgpLnRvTG93ZXJDYXNlKCkpfHwiJTJlLiI9PT11fHwiLiUyZSI9PT11fHwiJTJlJTJlIj09PXU/KGV0KHQpLCIvIj09YXx8IlxcIj09YSYmSyh0KXx8dC5wYXRoLnB1c2goIiIpKTpudChoKT8iLyI9PWF8fCJcXCI9PWEmJksodCl8fHQucGF0aC5wdXNoKCIiKTooImZpbGUiPT10LnNjaGVtZSYmIXQucGF0aC5sZW5ndGgmJlEoaCkmJih0Lmhvc3QmJih0Lmhvc3Q9IiIpLGg9aC5jaGFyQXQoMCkrIjoiKSx0LnBhdGgucHVzaChoKSksaD0iIiwiZmlsZSI9PXQuc2NoZW1lJiYoYT09cnx8Ij8iPT1hfHwiIyI9PWEpKWZvcig7dC5wYXRoLmxlbmd0aD4xJiYiIj09PXQucGF0aFswXTspdC5wYXRoLnNoaWZ0KCk7Ij8iPT1hPyh0LnF1ZXJ5PSIiLGw9RXQpOiIjIj09YSYmKHQuZnJhZ21lbnQ9IiIsbD1qdCl9ZWxzZSBoKz0kKGEsRyk7YnJlYWs7Y2FzZSB3dDoiPyI9PWE/KHQucXVlcnk9IiIsbD1FdCk6IiMiPT1hPyh0LmZyYWdtZW50PSIiLGw9anQpOmEhPXImJih0LnBhdGhbMF0rPSQoYSxxKSk7YnJlYWs7Y2FzZSBFdDpufHwiIyIhPWE/YSE9ciYmKCInIj09YSYmSyh0KT90LnF1ZXJ5Kz0iJTI3Ijp0LnF1ZXJ5Kz0iIyI9PWE/IiUyMyI6JChhLHEpKToodC5mcmFnbWVudD0iIixsPWp0KTticmVhaztjYXNlIGp0OmEhPXImJih0LmZyYWdtZW50Kz0kKGEsVykpfWQrK319LGt0PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1sKHRoaXMsa3QsIlVSTCIpLG89YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsYT1TdHJpbmcodCksYz1FKHIse3R5cGU6IlVSTCJ9KTtpZih2b2lkIDAhPT1vKWlmKG8gaW5zdGFuY2VvZiBrdCllPWoobyk7ZWxzZSBpZihuPUN0KGU9e30sU3RyaW5nKG8pKSl0aHJvdyBUeXBlRXJyb3Iobik7aWYobj1DdChjLGEsbnVsbCxlKSl0aHJvdyBUeXBlRXJyb3Iobik7dmFyIHM9Yy5zZWFyY2hQYXJhbXM9bmV3IHgsdT13KHMpO3UudXBkYXRlU2VhcmNoUGFyYW1zKGMucXVlcnkpLHUudXBkYXRlVVJMPWZ1bmN0aW9uKCl7Yy5xdWVyeT1TdHJpbmcocyl8fG51bGx9LGl8fChyLmhyZWY9T3QuY2FsbChyKSxyLm9yaWdpbj1BdC5jYWxsKHIpLHIucHJvdG9jb2w9SXQuY2FsbChyKSxyLnVzZXJuYW1lPVR0LmNhbGwociksci5wYXNzd29yZD1NdC5jYWxsKHIpLHIuaG9zdD1fdC5jYWxsKHIpLHIuaG9zdG5hbWU9THQuY2FsbChyKSxyLnBvcnQ9UnQuY2FsbChyKSxyLnBhdGhuYW1lPVB0LmNhbGwociksci5zZWFyY2g9TnQuY2FsbChyKSxyLnNlYXJjaFBhcmFtcz1GdC5jYWxsKHIpLHIuaGFzaD1EdC5jYWxsKHIpKX0sU3Q9a3QucHJvdG90eXBlLE90PWZ1bmN0aW9uKCl7dmFyIHQ9aih0aGlzKSxlPXQuc2NoZW1lLG49dC51c2VybmFtZSxyPXQucGFzc3dvcmQsbz10Lmhvc3QsaT10LnBvcnQsYT10LnBhdGgsYz10LnF1ZXJ5LHM9dC5mcmFnbWVudCx1PWUrIjoiO3JldHVybiBudWxsIT09bz8odSs9Ii8vIixKKHQpJiYodSs9bisocj8iOiIrcjoiIikrIkAiKSx1Kz1WKG8pLG51bGwhPT1pJiYodSs9IjoiK2kpKToiZmlsZSI9PWUmJih1Kz0iLy8iKSx1Kz10LmNhbm5vdEJlQUJhc2VVUkw/YVswXTphLmxlbmd0aD8iLyIrYS5qb2luKCIvIik6IiIsbnVsbCE9PWMmJih1Kz0iPyIrYyksbnVsbCE9PXMmJih1Kz0iIyIrcyksdX0sQXQ9ZnVuY3Rpb24oKXt2YXIgdD1qKHRoaXMpLGU9dC5zY2hlbWUsbj10LnBvcnQ7aWYoImJsb2IiPT1lKXRyeXtyZXR1cm4gbmV3IFVSTChlLnBhdGhbMF0pLm9yaWdpbn1jYXRjaCh0KXtyZXR1cm4ibnVsbCJ9cmV0dXJuImZpbGUiIT1lJiZLKHQpP2UrIjovLyIrVih0Lmhvc3QpKyhudWxsIT09bj8iOiIrbjoiIik6Im51bGwifSxJdD1mdW5jdGlvbigpe3JldHVybiBqKHRoaXMpLnNjaGVtZSsiOiJ9LFR0PWZ1bmN0aW9uKCl7cmV0dXJuIGoodGhpcykudXNlcm5hbWV9LE10PWZ1bmN0aW9uKCl7cmV0dXJuIGoodGhpcykucGFzc3dvcmR9LF90PWZ1bmN0aW9uKCl7dmFyIHQ9aih0aGlzKSxlPXQuaG9zdCxuPXQucG9ydDtyZXR1cm4gbnVsbD09PWU/IiI6bnVsbD09PW4/VihlKTpWKGUpKyI6IitufSxMdD1mdW5jdGlvbigpe3ZhciB0PWoodGhpcykuaG9zdDtyZXR1cm4gbnVsbD09PXQ/IiI6Vih0KX0sUnQ9ZnVuY3Rpb24oKXt2YXIgdD1qKHRoaXMpLnBvcnQ7cmV0dXJuIG51bGw9PT10PyIiOlN0cmluZyh0KX0sUHQ9ZnVuY3Rpb24oKXt2YXIgdD1qKHRoaXMpLGU9dC5wYXRoO3JldHVybiB0LmNhbm5vdEJlQUJhc2VVUkw/ZVswXTplLmxlbmd0aD8iLyIrZS5qb2luKCIvIik6IiJ9LE50PWZ1bmN0aW9uKCl7dmFyIHQ9aih0aGlzKS5xdWVyeTtyZXR1cm4gdD8iPyIrdDoiIn0sRnQ9ZnVuY3Rpb24oKXtyZXR1cm4gaih0aGlzKS5zZWFyY2hQYXJhbXN9LER0PWZ1bmN0aW9uKCl7dmFyIHQ9aih0aGlzKS5mcmFnbWVudDtyZXR1cm4gdD8iIyIrdDoiIn0sVXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm57Z2V0OnQsc2V0OmUsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fTtpZihpJiZzKFN0LHtocmVmOlV0KE90LChmdW5jdGlvbih0KXt2YXIgZT1qKHRoaXMpLG49U3RyaW5nKHQpLHI9Q3QoZSxuKTtpZihyKXRocm93IFR5cGVFcnJvcihyKTt3KGUuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXMoZS5xdWVyeSl9KSksb3JpZ2luOlV0KEF0KSxwcm90b2NvbDpVdChJdCwoZnVuY3Rpb24odCl7dmFyIGU9aih0aGlzKTtDdChlLFN0cmluZyh0KSsiOiIscnQpfSkpLHVzZXJuYW1lOlV0KFR0LChmdW5jdGlvbih0KXt2YXIgZT1qKHRoaXMpLG49cChTdHJpbmcodCkpO2lmKCFYKGUpKXtlLnVzZXJuYW1lPSIiO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWUudXNlcm5hbWUrPSQobltyXSxaKX19KSkscGFzc3dvcmQ6VXQoTXQsKGZ1bmN0aW9uKHQpe3ZhciBlPWoodGhpcyksbj1wKFN0cmluZyh0KSk7aWYoIVgoZSkpe2UucGFzc3dvcmQ9IiI7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspZS5wYXNzd29yZCs9JChuW3JdLFopfX0pKSxob3N0OlV0KF90LChmdW5jdGlvbih0KXt2YXIgZT1qKHRoaXMpO2UuY2Fubm90QmVBQmFzZVVSTHx8Q3QoZSxTdHJpbmcodCkscHQpfSkpLGhvc3RuYW1lOlV0KEx0LChmdW5jdGlvbih0KXt2YXIgZT1qKHRoaXMpO2UuY2Fubm90QmVBQmFzZVVSTHx8Q3QoZSxTdHJpbmcodCksaHQpfSkpLHBvcnQ6VXQoUnQsKGZ1bmN0aW9uKHQpe3ZhciBlPWoodGhpcyk7WChlKXx8KCIiPT0odD1TdHJpbmcodCkpP2UucG9ydD1udWxsOkN0KGUsdCx2dCkpfSkpLHBhdGhuYW1lOlV0KFB0LChmdW5jdGlvbih0KXt2YXIgZT1qKHRoaXMpO2UuY2Fubm90QmVBQmFzZVVSTHx8KGUucGF0aD1bXSxDdChlLHQrIiIsYnQpKX0pKSxzZWFyY2g6VXQoTnQsKGZ1bmN0aW9uKHQpe3ZhciBlPWoodGhpcyk7IiI9PSh0PVN0cmluZyh0KSk/ZS5xdWVyeT1udWxsOigiPyI9PXQuY2hhckF0KDApJiYodD10LnNsaWNlKDEpKSxlLnF1ZXJ5PSIiLEN0KGUsdCxFdCkpLHcoZS5zZWFyY2hQYXJhbXMpLnVwZGF0ZVNlYXJjaFBhcmFtcyhlLnF1ZXJ5KX0pKSxzZWFyY2hQYXJhbXM6VXQoRnQpLGhhc2g6VXQoRHQsKGZ1bmN0aW9uKHQpe3ZhciBlPWoodGhpcyk7IiIhPSh0PVN0cmluZyh0KSk/KCIjIj09dC5jaGFyQXQoMCkmJih0PXQuc2xpY2UoMSkpLGUuZnJhZ21lbnQ9IiIsQ3QoZSx0LGp0KSk6ZS5mcmFnbWVudD1udWxsfSkpfSksdShTdCwidG9KU09OIiwoZnVuY3Rpb24oKXtyZXR1cm4gT3QuY2FsbCh0aGlzKX0pLHtlbnVtZXJhYmxlOiEwfSksdShTdCwidG9TdHJpbmciLChmdW5jdGlvbigpe3JldHVybiBPdC5jYWxsKHRoaXMpfSkse2VudW1lcmFibGU6ITB9KSxiKXt2YXIgQnQ9Yi5jcmVhdGVPYmplY3RVUkwsenQ9Yi5yZXZva2VPYmplY3RVUkw7QnQmJnUoa3QsImNyZWF0ZU9iamVjdFVSTCIsKGZ1bmN0aW9uKHQpe3JldHVybiBCdC5hcHBseShiLGFyZ3VtZW50cyl9KSksenQmJnUoa3QsInJldm9rZU9iamVjdFVSTCIsKGZ1bmN0aW9uKHQpe3JldHVybiB6dC5hcHBseShiLGFyZ3VtZW50cyl9KSl9ZyhrdCwiVVJMIiksbyh7Z2xvYmFsOiEwLGZvcmNlZDohYSxzaGFtOiFpfSx7VVJMOmt0fSl9LDk4NDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oMTQwNDQpKHt0YXJnZXQ6IlVSTCIscHJvdG86ITAsZW51bWVyYWJsZTohMH0se3RvSlNPTjpmdW5jdGlvbigpe3JldHVybiBVUkwucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyl9fSl9LDM2NDY3OmZ1bmN0aW9uKHQsZSxuKXtuKDE0MDg2KX0sNjY1NTQ6ZnVuY3Rpb24odCxlLG4pe24oNDkzMCksbig2MzY0KX0sOTMyNzA6ZnVuY3Rpb24odCxlLG4pe24oNTM1MTMpLG4oOTkyNTUpLG4oNDg0NCksbigzNTU0KSxuKDE4ODQ0KSxuKDM1NjU2KSxuKDQ5MDUwKSxuKDkzODQzKSxuKDY2MjI0KSxuKDcxNzAwKSxuKDY5NTI5KSxuKDI3NzM0KSxuKDc3MzY5KSxuKDY5ODQyKSxuKDk3OTI4KSxuKDkzOSksbig2MTQ2NyksbigxNjEyNyksbig1MzU4OSksbig4MTA0MiksbigxNjc1NyksbigxMTA3NCksbigzMzUzOSksbigyNDEwMyksbig2NDgxMyksbig2ODk5OSksbig1MzgyNCl9LDg5NzQwOmZ1bmN0aW9uKHQsZSxuKXtuKDM4NzkyKSxuKDE5OTApLG4oOTcyODQpLG4oMjQ1OTgpLG4oOTk5NzkpLG4oMTgyMDUpLG4oODU4KSxuKDY0ODk5KX0sNjgwMDE6ZnVuY3Rpb24odCxlLG4pe24oMzA2MTMpLG4oNjg0MDYpLG4oNDk3OSksbig0NDY0Nil9LDI4Njk5OmZ1bmN0aW9uKHQsZSxuKXtuKDk5NjI4KTt2YXIgcj1uKDg5NTU4KTt0LmV4cG9ydHM9cn0sMTU2MjQ6ZnVuY3Rpb24odCxlLG4pe24oNTczNjApfSw4MTIxMzpmdW5jdGlvbih0LGUsbil7big2MTI5OCksbig0NzAwNCksbig2NzQ2Miksbig5MDY3KSxuKDIwMTI0KSxuKDIxMzcxKSxuKDM4OTg0KSxuKDY5MjM3KSxuKDI2NDk3KSxuKDUzMTY4KSxuKDczOTQ5KSxuKDg4MjExKSxuKDczNzYxKSxuKDQyMTk2KSxuKDQzMzMyKSxuKDkyNjAxKSxuKDIwNDc0KSxuKDU0NTU2KSxuKDQwNjM4KSxuKDk2NjU5KSxuKDE0Njg4KSxuKDczNzgpLG4oMjc0MjgpLG4oMzM0MzYpLG4oODQzODgpLG4oNTk2MjMpLG4oMzI4NTMpLG4oNjcwNzIpfSw2MjY3NzpmdW5jdGlvbih0LGUsbil7bigzNjU3MSksbig0MzA4Nil9LDM3NjEzOmZ1bmN0aW9uKHQsZSxuKXtuKDQzMjkwKSxuKDE0NjgyKSxuKDg3NTU1KX0sMTQ3MTU6ZnVuY3Rpb24odCxlLG4pe24oNzAyMjUpLG4oMjM5OSksbigxNjgwOSksbig2NzE0MSksbig5MDc2OSksbig1Nzg5MSksbigxNTcyMil9LDM2Njg2OmZ1bmN0aW9uKHQsZSxuKXtuKDc3OTA3KX0sNjc3OTM6ZnVuY3Rpb24odCxlLG4pe24oNzU2NDcpfSw5NDc3OmZ1bmN0aW9uKHQsZSxuKXtuKDg0MzA5KSxuKDcyOTYzKSxuKDU2MzU5KX0sNzIzNTQ6ZnVuY3Rpb24odCxlLG4pe24oMjAyMzQpLG4oNTEzNzQpfSw3NDY3OTpmdW5jdGlvbih0LGUsbil7big1Mzc3Mil9LDk0Nzk6ZnVuY3Rpb24odCxlLG4pe24oMjc3NSl9LDg1NjU5OmZ1bmN0aW9uKHQsZSxuKXtuKDk2NzUxKSxuKDczMjIwKX0sNTQ5ODY6ZnVuY3Rpb24odCxlLG4pe24oMTEwNzEpfSwxODgxOmZ1bmN0aW9uKHQsZSxuKXtuKDQ5NjQwKSxuKDc0OTYzKSxuKDY5NDU5KSxuKDQ5MTU1KSxuKDI2ODk2KSxuKDg3NDc0KSxuKDk3NDMzKSxuKDcxMDgpLG4oMjM2MzEpfSw1NzYwMzpmdW5jdGlvbih0LGUsbil7bigxNzY1KX0sODE1NDg6ZnVuY3Rpb24odCxlLG4pe24oOTgzNTApLG4oNDE3MTgpLG4oNTczNzEpLG4oODkyMzApLG4oMzIzMDMpLG4oNjI5MSksbig2NjE4MSl9LDIzMTAyOmZ1bmN0aW9uKHQsZSxuKXtuKDczNDYwKX0sNDQxNTM6ZnVuY3Rpb24odCxlLG4pe24oMzIwNjIpfSw3MzkyOmZ1bmN0aW9uKHQsZSxuKXtuKDc0NTI1KX0sNzc3OTpmdW5jdGlvbih0LGUsbil7big2NDAyNiksbig4NjA3Nyl9LDYwODI2OmZ1bmN0aW9uKHQsZSxuKXtuKDEzOTEwKSxuKDk4NCksbig1NTU3KX0sNTU5MzM6ZnVuY3Rpb24odCxlLG4pe24oNjk0Miksbig5NDI0OSl9LDg3NjAyOmZ1bmN0aW9uKHQsZSxuKXtuKDY4MDAxKSxuKDIzMTAyKSxuKDYwODI2KTt2YXIgcj1uKDk1OTY4KTt0LmV4cG9ydHM9cn0sOTU5Njg6ZnVuY3Rpb24odCxlLG4pe24oNjY1NTQpLG4oOTMyNzApLG4oODk3NDApLG4oNjI2NzcpLG4oMTQ3MTUpLG4oMzY2ODYpLG4oNjc3OTMpLG4oOTQ3Nyksbig3MjM1NCksbig3NDY3OSksbig1NDk4Niksbig1NzYwMyksbig0NDE1Myk7dmFyIHI9big0Nzk3Mik7dC5leHBvcnRzPXJ9LDQ3OTcyOmZ1bmN0aW9uKHQsZSxuKXtuKDM2NDY3KSxuKDgxMjEzKSxuKDM3NjEzKSxuKDgxNTQ4KSxuKDU1OTMzKTt2YXIgcj1uKDU5MDExKTt0LmV4cG9ydHM9cn0sNTkwMTE6ZnVuY3Rpb24odCxlLG4pe24oODU2NTkpLG4oNzc3OSk7dmFyIHI9big2ODY4NSk7dC5leHBvcnRzPXJ9LDY4Njg1OmZ1bmN0aW9uKHQsZSxuKXtuKDI4Njk5KSxuKDk0NzkpLG4oNzM5Mik7dmFyIHI9big1NjIzOCk7dC5leHBvcnRzPXJ9LDU3MzYwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUzMzM1KTt0LmV4cG9ydHM9cn0sNTMzMzU6ZnVuY3Rpb24odCxlLG4pe24oMTg4MSk7dmFyIHI9big4NzYwMik7dC5leHBvcnRzPXJ9LDkyNDA0OmZ1bmN0aW9uKHQsZSxuKXtuKDY3MDM5KSxuKDc5Nzk5KSxuKDc0MDEwKSxuKDY1OTc2KSxuKDgxOTk0KSxuKDEzOTEwKSxuKDk4NCksbig1NTU3KTt2YXIgcj1uKDU2MjM4KTt0LmV4cG9ydHM9cn0sMTg5ODY6ZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49ZnVuY3Rpb24odCxlKXt2YXIgbj10WzFdfHwiIixyPXRbM107aWYoIXIpcmV0dXJuIG47aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJ0b2Epe3ZhciBvPShhPXIsYz1idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShhKSkpKSxzPSJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwiLmNvbmNhdChjKSwiLyojICIuY29uY2F0KHMsIiAqLyIpKSxpPXIuc291cmNlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIvKiMgc291cmNlVVJMPSIuY29uY2F0KHIuc291cmNlUm9vdCkuY29uY2F0KHQsIiAqLyIpfSkpO3JldHVybltuXS5jb25jYXQoaSkuY29uY2F0KFtvXSkuam9pbigiXG4iKX12YXIgYSxjLHM7cmV0dXJuW25dLmpvaW4oIlxuIil9KGUsdCk7cmV0dXJuIGVbMl0/IkBtZWRpYSAiLmNvbmNhdChlWzJdLCIgeyIpLmNvbmNhdChuLCJ9Iik6bn0pKS5qb2luKCIiKX0sZS5pPWZ1bmN0aW9uKHQsbil7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bW251bGwsdCwiIl1dKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89W10uY29uY2F0KHRbcl0pO24mJihvWzJdP29bMl09IiIuY29uY2F0KG4sIiBhbmQgIikuY29uY2F0KG9bMl0pOm9bMl09biksZS5wdXNoKG8pfX0sZX19LDQ2Njc5OmZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30saT1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsYT1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLGM9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHModCxlLG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksdFtlXX10cnl7cyh7fSwiIil9Y2F0Y2godCl7cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bn19ZnVuY3Rpb24gdSh0LGUsbixyKXt2YXIgbz1lJiZlLnByb3RvdHlwZSBpbnN0YW5jZW9mIGc/ZTpnLGk9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksYT1uZXcgQShyfHxbXSk7cmV0dXJuIGkuX2ludm9rZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZjtyZXR1cm4gZnVuY3Rpb24obyxpKXtpZihyPT09cCl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihyPT09aCl7aWYoInRocm93Ij09PW8pdGhyb3cgaTtyZXR1cm4gVCgpfWZvcihuLm1ldGhvZD1vLG4uYXJnPWk7Oyl7dmFyIGE9bi5kZWxlZ2F0ZTtpZihhKXt2YXIgYz1rKGEsbik7aWYoYyl7aWYoYz09PXYpY29udGludWU7cmV0dXJuIGN9fWlmKCJuZXh0Ij09PW4ubWV0aG9kKW4uc2VudD1uLl9zZW50PW4uYXJnO2Vsc2UgaWYoInRocm93Ij09PW4ubWV0aG9kKXtpZihyPT09Zil0aHJvdyByPWgsbi5hcmc7bi5kaXNwYXRjaEV4Y2VwdGlvbihuLmFyZyl9ZWxzZSJyZXR1cm4iPT09bi5tZXRob2QmJm4uYWJydXB0KCJyZXR1cm4iLG4uYXJnKTtyPXA7dmFyIHM9bCh0LGUsbik7aWYoIm5vcm1hbCI9PT1zLnR5cGUpe2lmKHI9bi5kb25lP2g6ZCxzLmFyZz09PXYpY29udGludWU7cmV0dXJue3ZhbHVlOnMuYXJnLGRvbmU6bi5kb25lfX0idGhyb3ciPT09cy50eXBlJiYocj1oLG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9cy5hcmcpfX19KHQsbixhKSxpfWZ1bmN0aW9uIGwodCxlLG4pe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6dC5jYWxsKGUsbil9fWNhdGNoKHQpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOnR9fX10LndyYXA9dTt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLGQ9InN1c3BlbmRlZFlpZWxkIixwPSJleGVjdXRpbmciLGg9ImNvbXBsZXRlZCIsdj17fTtmdW5jdGlvbiBnKCl7fWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24gbSgpe312YXIgYj17fTtzKGIsaSwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTt2YXIgeD1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysdz14JiZ4KHgoSShbXSkpKTt3JiZ3IT09biYmci5jYWxsKHcsaSkmJihiPXcpO3ZhciBFPW0ucHJvdG90eXBlPWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYik7ZnVuY3Rpb24gaih0KXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ModCxlLChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKGUsdCl9KSl9KSl9ZnVuY3Rpb24gQyh0LGUpe2Z1bmN0aW9uIG4obyxpLGEsYyl7dmFyIHM9bCh0W29dLHQsaSk7aWYoInRocm93IiE9PXMudHlwZSl7dmFyIHU9cy5hcmcsZj11LnZhbHVlO3JldHVybiBmJiYib2JqZWN0Ij09dHlwZW9mIGYmJnIuY2FsbChmLCJfX2F3YWl0Iik/ZS5yZXNvbHZlKGYuX19hd2FpdCkudGhlbigoZnVuY3Rpb24odCl7bigibmV4dCIsdCxhLGMpfSksKGZ1bmN0aW9uKHQpe24oInRocm93Iix0LGEsYyl9KSk6ZS5yZXNvbHZlKGYpLnRoZW4oKGZ1bmN0aW9uKHQpe3UudmFsdWU9dCxhKHUpfSksKGZ1bmN0aW9uKHQpe3JldHVybiBuKCJ0aHJvdyIsdCxhLGMpfSkpfWMocy5hcmcpfXZhciBvO3RoaXMuX2ludm9rZT1mdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGkoKXtyZXR1cm4gbmV3IGUoKGZ1bmN0aW9uKGUsbyl7bih0LHIsZSxvKX0pKX1yZXR1cm4gbz1vP28udGhlbihpLGkpOmkoKX19ZnVuY3Rpb24gayh0LG4pe3ZhciByPXQuaXRlcmF0b3Jbbi5tZXRob2RdO2lmKHI9PT1lKXtpZihuLmRlbGVnYXRlPW51bGwsInRocm93Ij09PW4ubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybiYmKG4ubWV0aG9kPSJyZXR1cm4iLG4uYXJnPWUsayh0LG4pLCJ0aHJvdyI9PT1uLm1ldGhvZCkpcmV0dXJuIHY7bi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIHZ9dmFyIG89bChyLHQuaXRlcmF0b3Isbi5hcmcpO2lmKCJ0aHJvdyI9PT1vLnR5cGUpcmV0dXJuIG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9by5hcmcsbi5kZWxlZ2F0ZT1udWxsLHY7dmFyIGk9by5hcmc7cmV0dXJuIGk/aS5kb25lPyhuW3QucmVzdWx0TmFtZV09aS52YWx1ZSxuLm5leHQ9dC5uZXh0TG9jLCJyZXR1cm4iIT09bi5tZXRob2QmJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksbi5kZWxlZ2F0ZT1udWxsLHYpOmk6KG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSxuLmRlbGVnYXRlPW51bGwsdil9ZnVuY3Rpb24gUyh0KXt2YXIgZT17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKGUuY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYoZS5maW5hbGx5TG9jPXRbMl0sZS5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChlKX1mdW5jdGlvbiBPKHQpe3ZhciBlPXQuY29tcGxldGlvbnx8e307ZS50eXBlPSJub3JtYWwiLGRlbGV0ZSBlLmFyZyx0LmNvbXBsZXRpb249ZX1mdW5jdGlvbiBBKHQpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSx0LmZvckVhY2goUyx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBJKHQpe2lmKHQpe3ZhciBuPXRbaV07aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG89LTEsYT1mdW5jdGlvbiBuKCl7Zm9yKDsrK288dC5sZW5ndGg7KWlmKHIuY2FsbCh0LG8pKXJldHVybiBuLnZhbHVlPXRbb10sbi5kb25lPSExLG47cmV0dXJuIG4udmFsdWU9ZSxuLmRvbmU9ITAsbn07cmV0dXJuIGEubmV4dD1hfX1yZXR1cm57bmV4dDpUfX1mdW5jdGlvbiBUKCl7cmV0dXJue3ZhbHVlOmUsZG9uZTohMH19cmV0dXJuIHkucHJvdG90eXBlPW0scyhFLCJjb25zdHJ1Y3RvciIsbSkscyhtLCJjb25zdHJ1Y3RvciIseSkseS5kaXNwbGF5TmFtZT1zKG0sYywiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I7cmV0dXJuISFlJiYoZT09PXl8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0oZS5kaXNwbGF5TmFtZXx8ZS5uYW1lKSl9LHQubWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LG0pOih0Ll9fcHJvdG9fXz1tLHModCxjLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEUpLHR9LHQuYXdyYXA9ZnVuY3Rpb24odCl7cmV0dXJue19fYXdhaXQ6dH19LGooQy5wcm90b3R5cGUpLHMoQy5wcm90b3R5cGUsYSwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSx0LkFzeW5jSXRlcmF0b3I9Qyx0LmFzeW5jPWZ1bmN0aW9uKGUsbixyLG8saSl7dm9pZCAwPT09aSYmKGk9UHJvbWlzZSk7dmFyIGE9bmV3IEModShlLG4scixvKSxpKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP2E6YS5uZXh0KCkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZG9uZT90LnZhbHVlOmEubmV4dCgpfSkpfSxqKEUpLHMoRSxjLCJHZW5lcmF0b3IiKSxzKEUsaSwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSxzKEUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pKSx0LmtleXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlLnJldmVyc2UoKSxmdW5jdGlvbiBuKCl7Zm9yKDtlLmxlbmd0aDspe3ZhciByPWUucG9wKCk7aWYociBpbiB0KXJldHVybiBuLnZhbHVlPXIsbi5kb25lPSExLG59cmV0dXJuIG4uZG9uZT0hMCxufX0sdC52YWx1ZXM9SSxBLnByb3RvdHlwZT17Y29uc3RydWN0b3I6QSxyZXNldDpmdW5jdGlvbih0KXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD1lLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPWUsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goTyksIXQpZm9yKHZhciBuIGluIHRoaXMpInQiPT09bi5jaGFyQXQoMCkmJnIuY2FsbCh0aGlzLG4pJiYhaXNOYU4oK24uc2xpY2UoMSkpJiYodGhpc1tuXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgdD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZG9uZSl0aHJvdyB0O3ZhciBuPXRoaXM7ZnVuY3Rpb24gbyhyLG8pe3JldHVybiBjLnR5cGU9InRocm93IixjLmFyZz10LG4ubmV4dD1yLG8mJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksISFvfWZvcih2YXIgaT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7aT49MDstLWkpe3ZhciBhPXRoaXMudHJ5RW50cmllc1tpXSxjPWEuY29tcGxldGlvbjtpZigicm9vdCI9PT1hLnRyeUxvYylyZXR1cm4gbygiZW5kIik7aWYoYS50cnlMb2M8PXRoaXMucHJldil7dmFyIHM9ci5jYWxsKGEsImNhdGNoTG9jIiksdT1yLmNhbGwoYSwiZmluYWxseUxvYyIpO2lmKHMmJnUpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX1lbHNlIGlmKHMpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApfWVsc2V7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIG89dGhpcy50cnlFbnRyaWVzW25dO2lmKG8udHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChvLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxvLmZpbmFsbHlMb2Mpe3ZhciBpPW87YnJlYWt9fWkmJigiYnJlYWsiPT09dHx8ImNvbnRpbnVlIj09PXQpJiZpLnRyeUxvYzw9ZSYmZTw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgYT1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gYS50eXBlPXQsYS5hcmc9ZSxpPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWkuZmluYWxseUxvYyx2KTp0aGlzLmNvbXBsZXRlKGEpfSxjb21wbGV0ZTpmdW5jdGlvbih0LGUpe2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuImJyZWFrIj09PXQudHlwZXx8ImNvbnRpbnVlIj09PXQudHlwZT90aGlzLm5leHQ9dC5hcmc6InJldHVybiI9PT10LnR5cGU/KHRoaXMucnZhbD10aGlzLmFyZz10LmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09dC50eXBlJiZlJiYodGhpcy5uZXh0PWUpLHZ9LGZpbmlzaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U+PTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi5maW5hbGx5TG9jPT09dClyZXR1cm4gdGhpcy5jb21wbGV0ZShuLmNvbXBsZXRpb24sbi5hZnRlckxvYyksTyhuKSx2fX0sY2F0Y2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4udHJ5TG9jPT09dCl7dmFyIHI9bi5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1yLnR5cGUpe3ZhciBvPXIuYXJnO08obil9cmV0dXJuIG99fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpJKHQpLHJlc3VsdE5hbWU6bixuZXh0TG9jOnJ9LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9ZSksdn19LHR9KHQuZXhwb3J0cyk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1lfWNhdGNoKHQpeyJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzLnJlZ2VuZXJhdG9yUnVudGltZT1lOkZ1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKGUpfX19LGU9e307ZnVuY3Rpb24gbihyKXt2YXIgbz1lW3JdO2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uZXhwb3J0czt2YXIgaT1lW3JdPXtpZDpyLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkuZXhwb3J0c31uLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLHthOmV9KSxlfSxuLmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHIgaW4gZSluLm8oZSxyKSYmIW4ubyh0LHIpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHtlbnVtZXJhYmxlOiEwLGdldDplW3JdfSl9LG4uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKHQpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5yPWZ1bmN0aW9uKHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PXt9O24ucih0KSxuLmQodCx7ZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBDdH0sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGp0fX0pO3ZhciBlPW4oNjQxNTcpLHI9bi5uKGUpLG89KG4oNjA0OTEpLG4oNDY2NzkpLCJVUkxTZWFyY2hQYXJhbXMiaW4gc2VsZiksaT0iU3ltYm9sImluIHNlbGYmJiJpdGVyYXRvciJpbiBTeW1ib2wsYT0iRmlsZVJlYWRlciJpbiBzZWxmJiYiQmxvYiJpbiBzZWxmJiZmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEJsb2IsITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpLGM9IkZvcm1EYXRhImluIHNlbGYscz0iQXJyYXlCdWZmZXIiaW4gc2VsZjtpZihzKXZhciB1PVsiW29iamVjdCBJbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OEFycmF5XSIsIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwiW29iamVjdCBJbnQxNkFycmF5XSIsIltvYmplY3QgVWludDE2QXJyYXldIiwiW29iamVjdCBJbnQzMkFycmF5XSIsIltvYmplY3QgVWludDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDY0QXJyYXldIl0sbD1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ1LmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKT4tMX07ZnVuY3Rpb24gZih0KXtpZigic3RyaW5nIiE9dHlwZW9mIHQmJih0PVN0cmluZyh0KSksL1teYS16MC05XC0jJCUmJyorLl5fYHx+XS9pLnRlc3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUiKTtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGQodCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYodD1TdHJpbmcodCkpLHR9ZnVuY3Rpb24gcCh0KXt2YXIgZT17bmV4dDpmdW5jdGlvbigpe3ZhciBlPXQuc2hpZnQoKTtyZXR1cm57ZG9uZTp2b2lkIDA9PT1lLHZhbHVlOmV9fX07cmV0dXJuIGkmJihlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gZX0pLGV9ZnVuY3Rpb24gaCh0KXt0aGlzLm1hcD17fSx0IGluc3RhbmNlb2YgaD90LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dGhpcy5hcHBlbmQoZSx0KX0pLHRoaXMpOkFycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0aGlzLmFwcGVuZCh0WzBdLHRbMV0pfSksdGhpcyk6dCYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dGhpcy5hcHBlbmQoZSx0W2VdKX0pLHRoaXMpfWZ1bmN0aW9uIHYodCl7aWYodC5ib2R5VXNlZClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIikpO3QuYm9keVVzZWQ9ITB9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsbil7dC5vbmxvYWQ9ZnVuY3Rpb24oKXtlKHQucmVzdWx0KX0sdC5vbmVycm9yPWZ1bmN0aW9uKCl7bih0LmVycm9yKX19KSl9ZnVuY3Rpb24geSh0KXt2YXIgZT1uZXcgRmlsZVJlYWRlcixuPWcoZSk7cmV0dXJuIGUucmVhZEFzQXJyYXlCdWZmZXIodCksbn1mdW5jdGlvbiBtKHQpe2lmKHQuc2xpY2UpcmV0dXJuIHQuc2xpY2UoMCk7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodC5ieXRlTGVuZ3RoKTtyZXR1cm4gZS5zZXQobmV3IFVpbnQ4QXJyYXkodCkpLGUuYnVmZmVyfWZ1bmN0aW9uIGIoKXtyZXR1cm4gdGhpcy5ib2R5VXNlZD0hMSx0aGlzLl9pbml0Qm9keT1mdW5jdGlvbih0KXt2YXIgZTt0aGlzLl9ib2R5SW5pdD10LHQ/InN0cmluZyI9PXR5cGVvZiB0P3RoaXMuX2JvZHlUZXh0PXQ6YSYmQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZih0KT90aGlzLl9ib2R5QmxvYj10OmMmJkZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHQpP3RoaXMuX2JvZHlGb3JtRGF0YT10Om8mJlVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZih0KT90aGlzLl9ib2R5VGV4dD10LnRvU3RyaW5nKCk6cyYmYSYmKChlPXQpJiZEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlKSk/KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj1tKHQuYnVmZmVyKSx0aGlzLl9ib2R5SW5pdD1uZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpOnMmJihBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZih0KXx8bCh0KSk/dGhpcy5fYm9keUFycmF5QnVmZmVyPW0odCk6dGhpcy5fYm9keVRleHQ9dD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk6dGhpcy5fYm9keVRleHQ9IiIsdGhpcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIil8fCgic3RyaW5nIj09dHlwZW9mIHQ/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iik6dGhpcy5fYm9keUJsb2ImJnRoaXMuX2JvZHlCbG9iLnR5cGU/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLl9ib2R5QmxvYi50eXBlKTpvJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodCkmJnRoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IikpfSxhJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIHQ9dih0aGlzKTtpZih0KXJldHVybiB0O2lmKHRoaXMuX2JvZHlCbG9iKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iIik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSl9LHRoaXMuYXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm9keUFycmF5QnVmZmVyP3YodGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpOnRoaXMuYmxvYigpLnRoZW4oeSl9KSx0aGlzLnRleHQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scj12KHRoaXMpO2lmKHIpcmV0dXJuIHI7aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIHQ9dGhpcy5fYm9keUJsb2IsZT1uZXcgRmlsZVJlYWRlcixuPWcoZSksZS5yZWFkQXNUZXh0KHQpLG47aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXJldHVybiBQcm9taXNlLnJlc29sdmUoZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBVaW50OEFycmF5KHQpLG49bmV3IEFycmF5KGUubGVuZ3RoKSxyPTA7cjxlLmxlbmd0aDtyKyspbltyXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pO3JldHVybiBuLmpvaW4oIiIpfSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQiKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KX0sYyYmKHRoaXMuZm9ybURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihFKX0pLHRoaXMuanNvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpfSx0aGlzfWgucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbih0LGUpe3Q9Zih0KSxlPWQoZSk7dmFyIG49dGhpcy5tYXBbdF07dGhpcy5tYXBbdF09bj9uKyIsICIrZTplfSxoLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMubWFwW2YodCldfSxoLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9Zih0KSx0aGlzLmhhcyh0KT90aGlzLm1hcFt0XTpudWxsfSxoLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KGYodCkpfSxoLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLm1hcFtmKHQpXT1kKGUpfSxoLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIHRoaXMubWFwKXRoaXMubWFwLmhhc093blByb3BlcnR5KG4pJiZ0LmNhbGwoZSx0aGlzLm1hcFtuXSxuLHRoaXMpfSxoLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0LnB1c2gobil9KSkscCh0KX0saC5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSkpLHAodCl9LGgucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3QucHVzaChbbixlXSl9KSkscCh0KX0saSYmKGgucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09aC5wcm90b3R5cGUuZW50cmllcyk7dmFyIHg9WyJERUxFVEUiLCJHRVQiLCJIRUFEIiwiT1BUSU9OUyIsIlBPU1QiLCJQVVQiXTtmdW5jdGlvbiB3KHQsZSl7dmFyIG4scixvPShlPWV8fHt9KS5ib2R5O2lmKHQgaW5zdGFuY2VvZiB3KXtpZih0LmJvZHlVc2VkKXRocm93IG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpO3RoaXMudXJsPXQudXJsLHRoaXMuY3JlZGVudGlhbHM9dC5jcmVkZW50aWFscyxlLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IGgodC5oZWFkZXJzKSksdGhpcy5tZXRob2Q9dC5tZXRob2QsdGhpcy5tb2RlPXQubW9kZSx0aGlzLnNpZ25hbD10LnNpZ25hbCxvfHxudWxsPT10Ll9ib2R5SW5pdHx8KG89dC5fYm9keUluaXQsdC5ib2R5VXNlZD0hMCl9ZWxzZSB0aGlzLnVybD1TdHJpbmcodCk7aWYodGhpcy5jcmVkZW50aWFscz1lLmNyZWRlbnRpYWxzfHx0aGlzLmNyZWRlbnRpYWxzfHwic2FtZS1vcmlnaW4iLCFlLmhlYWRlcnMmJnRoaXMuaGVhZGVyc3x8KHRoaXMuaGVhZGVycz1uZXcgaChlLmhlYWRlcnMpKSx0aGlzLm1ldGhvZD0obj1lLm1ldGhvZHx8dGhpcy5tZXRob2R8fCJHRVQiLHI9bi50b1VwcGVyQ2FzZSgpLHguaW5kZXhPZihyKT4tMT9yOm4pLHRoaXMubW9kZT1lLm1vZGV8fHRoaXMubW9kZXx8bnVsbCx0aGlzLnNpZ25hbD1lLnNpZ25hbHx8dGhpcy5zaWduYWwsdGhpcy5yZWZlcnJlcj1udWxsLCgiR0VUIj09PXRoaXMubWV0aG9kfHwiSEVBRCI9PT10aGlzLm1ldGhvZCkmJm8pdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMiKTt0aGlzLl9pbml0Qm9keShvKX1mdW5jdGlvbiBFKHQpe3ZhciBlPW5ldyBGb3JtRGF0YTtyZXR1cm4gdC50cmltKCkuc3BsaXQoIiYiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0KXt2YXIgbj10LnNwbGl0KCI9Iikscj1uLnNoaWZ0KCkucmVwbGFjZSgvXCsvZywiICIpLG89bi5qb2luKCI9IikucmVwbGFjZSgvXCsvZywiICIpO2UuYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChyKSxkZWNvZGVVUklDb21wb25lbnQobykpfX0pKSxlfWZ1bmN0aW9uIGoodCl7dmFyIGU9bmV3IGg7cmV0dXJuIHQucmVwbGFjZSgvXHI/XG5bXHQgXSsvZywiICIpLnNwbGl0KC9ccj9cbi8pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQuc3BsaXQoIjoiKSxyPW4uc2hpZnQoKS50cmltKCk7aWYocil7dmFyIG89bi5qb2luKCI6IikudHJpbSgpO2UuYXBwZW5kKHIsbyl9fSkpLGV9ZnVuY3Rpb24gQyh0LGUpe2V8fChlPXt9KSx0aGlzLnR5cGU9ImRlZmF1bHQiLHRoaXMuc3RhdHVzPXZvaWQgMD09PWUuc3RhdHVzPzIwMDplLnN0YXR1cyx0aGlzLm9rPXRoaXMuc3RhdHVzPj0yMDAmJnRoaXMuc3RhdHVzPDMwMCx0aGlzLnN0YXR1c1RleHQ9InN0YXR1c1RleHQiaW4gZT9lLnN0YXR1c1RleHQ6Ik9LIix0aGlzLmhlYWRlcnM9bmV3IGgoZS5oZWFkZXJzKSx0aGlzLnVybD1lLnVybHx8IiIsdGhpcy5faW5pdEJvZHkodCl9dy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHcodGhpcyx7Ym9keTp0aGlzLl9ib2R5SW5pdH0pfSxiLmNhbGwody5wcm90b3R5cGUpLGIuY2FsbChDLnByb3RvdHlwZSksQy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEModGhpcy5fYm9keUluaXQse3N0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnRoaXMuc3RhdHVzVGV4dCxoZWFkZXJzOm5ldyBoKHRoaXMuaGVhZGVycyksdXJsOnRoaXMudXJsfSl9LEMuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQyhudWxsLHtzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cmV0dXJuIHQudHlwZT0iZXJyb3IiLHR9O3ZhciBrPVszMDEsMzAyLDMwMywzMDcsMzA4XTtDLnJlZGlyZWN0PWZ1bmN0aW9uKHQsZSl7aWYoLTE9PT1rLmluZGV4T2YoZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGUiKTtyZXR1cm4gbmV3IEMobnVsbCx7c3RhdHVzOmUsaGVhZGVyczp7bG9jYXRpb246dH19KX07dmFyIFM9c2VsZi5ET01FeGNlcHRpb247dHJ5e25ldyBTfWNhdGNoKHQpeyhTPWZ1bmN0aW9uKHQsZSl7dGhpcy5tZXNzYWdlPXQsdGhpcy5uYW1lPWU7dmFyIG49RXJyb3IodCk7dGhpcy5zdGFjaz1uLnN0YWNrfSkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxTLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TfWZ1bmN0aW9uIE8odCxlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7dmFyIG89bmV3IHcodCxlKTtpZihvLnNpZ25hbCYmby5zaWduYWwuYWJvcnRlZClyZXR1cm4gcihuZXcgUygiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSk7dmFyIGk9bmV3IFhNTEh0dHBSZXF1ZXN0O2Z1bmN0aW9uIGMoKXtpLmFib3J0KCl9aS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgdD17c3RhdHVzOmkuc3RhdHVzLHN0YXR1c1RleHQ6aS5zdGF0dXNUZXh0LGhlYWRlcnM6aihpLmdldEFsbFJlc3BvbnNlSGVhZGVycygpfHwiIil9O3QudXJsPSJyZXNwb25zZVVSTCJpbiBpP2kucmVzcG9uc2VVUkw6dC5oZWFkZXJzLmdldCgiWC1SZXF1ZXN0LVVSTCIpO3ZhciBlPSJyZXNwb25zZSJpbiBpP2kucmVzcG9uc2U6aS5yZXNwb25zZVRleHQ7bihuZXcgQyhlLHQpKX0saS5vbmVycm9yPWZ1bmN0aW9uKCl7cihuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSxpLm9udGltZW91dD1mdW5jdGlvbigpe3IobmV3IFR5cGVFcnJvcigiTmV0d29yayByZXF1ZXN0IGZhaWxlZCIpKX0saS5vbmFib3J0PWZ1bmN0aW9uKCl7cihuZXcgUygiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LGkub3BlbihvLm1ldGhvZCxvLnVybCwhMCksImluY2x1ZGUiPT09by5jcmVkZW50aWFscz9pLndpdGhDcmVkZW50aWFscz0hMDoib21pdCI9PT1vLmNyZWRlbnRpYWxzJiYoaS53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4gaSYmYSYmKGkucmVzcG9uc2VUeXBlPSJibG9iIiksby5oZWFkZXJzLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aS5zZXRSZXF1ZXN0SGVhZGVyKGUsdCl9KSksby5zaWduYWwmJihvLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYyksaS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09aS5yZWFkeVN0YXRlJiZvLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9KSxpLnNlbmQodm9pZCAwPT09by5fYm9keUluaXQ/bnVsbDpvLl9ib2R5SW5pdCl9KSl9ZnVuY3Rpb24gQSh0LGUpe2Zvcih2YXIgbj1bXSxyPVtdLG89YXJndW1lbnRzLmxlbmd0aDtvLS0gPjI7KW4ucHVzaChhcmd1bWVudHNbb10pO2Zvcig7bi5sZW5ndGg7KXt2YXIgaT1uLnBvcCgpO2lmKGkmJmkucG9wKWZvcihvPWkubGVuZ3RoO28tLTspbi5wdXNoKGlbb10pO2Vsc2UgbnVsbCE9aSYmITAhPT1pJiYhMSE9PWkmJnIucHVzaChpKX1yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90KGV8fHt9LHIpOntub2RlTmFtZTp0LGF0dHJpYnV0ZXM6ZXx8e30sY2hpbGRyZW46cixrZXk6ZSYmZS5rZXl9fU8ucG9seWZpbGw9ITAsc2VsZi5mZXRjaHx8KHNlbGYuZmV0Y2g9TyxzZWxmLkhlYWRlcnM9aCxzZWxmLlJlcXVlc3Q9dyxzZWxmLlJlc3BvbnNlPUMpO3ZhciBJPW4oNjYwODEpLFQ9bi5uKEkpLE09big5MjgxNiksXz1uLm4oTSksTD1uKDQ0Njc0KSxSPW4ubihMKSxQPW4oNDQ2MjEpLE49bi5uKFApLEY9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBEKHQpe3ZhciBlLG4scj10eXBlb2YgdCxvPSIiO2lmKCJzdHJpbmciPT09cnx8Im51bWJlciI9PT1yKXJldHVybiB0fHwiIjtpZihGKHQpJiZ0Lmxlbmd0aD4wKWZvcihlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKSIiIT09KHI9RCh0W2VdKSkmJihvKz0obyYmIiAiKStyKTtlbHNlIGZvcihlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmdFtlXSYmKG8rPShvJiYiICIpK2UpO3JldHVybiBvfXZhciBVPSJ4LXVsLWVudmlyb25tZW50LWlkIixCPSJ4LXVsLWFub255bW91cy1pZCIsej0ieC11bC11c2VyLWlkIixIPSJ4LXVsLXZpc2l0b3ItaWQiLFY9IngtdWwtaW5zdGFsbGF0aW9uLW1ldGhvZCIscT0id2ViLWd0bSIsVz0id2ViLXNlZ21lbnQiLEc9IndlYi1zbmlwcGV0IixaPSJ1bC1jdXN0b20tc3R5bGUiLCQ9InVsLWNhcmRfX2NvbnRhaW5lciIsWT0idWwtY2FyZC0tdmlkZW8iLEs9ImNsb3NlLWNvbnRhaW5lciIsSj0iY2xvc2UtYnRuIixYPSJsaWtlcnQtbnVtYmVyIixRPSJucHMtbnVtYmVyIix0dD0iY2hvaWNlIixldD0ic2VsZWN0LWxhYmVsIixudD0ic2VsZWN0LWNoZWNrYm94IixydD0ic2VsZWN0LXJhZGlvIixvdD0idWwtY2FyZF9fY2hvaWNlcyIsaXQ9InVsLWNhcmQtdGV4dF9faW5wdXQiLGF0PSItLWRlc2t0b3AiLGN0PSItLW1vYmlsZSIsc3Q9InVsLXF1ZXN0aW9uIix1dD0idWwtY2FwdGlvbiIsbHQ9ImZhZGUtaW4tdHJhbnNpdGlvbiIsZnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdCsoZT9jdDphdCksdF19O2Z1bmN0aW9uIGR0KHQsZSl7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHB0KHQsZSk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpOyJPYmplY3QiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PW58fCJTZXQiPT09bilyZXR1cm4gQXJyYXkuZnJvbSh0KTtpZigiQXJndW1lbnRzIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKXJldHVybiBwdCh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAsYz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249bi5jYWxsKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7Yz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihjKXRocm93IGl9fX19ZnVuY3Rpb24gcHQodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn12YXIgaHQ9InVsLWFwcCIsdnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmFwcDtuLnJ1bm5pbmd8fGUuZGVzdHJveShodCk7dmFyIG8saT1uLmRlY2suY2FyZHNbbi5kZWNrLmluZGV4XSxhPWkuQ2FyZCxjPWkucHJvcHMscz1pLnR5cGUsdT1pLm5hbWUsbD1uLmJvcmRlcixmPWZ1bmN0aW9uKCl7dmFyIHQ9TigpKFIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIFIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsZS5jbG9zZShodCk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCksZD1uLmRlY2suY2FyZHMscD1uLmRlY2suaW5kZXgsaD1uLmZvbnRGYW1pbHk/e2ZvbnRGYW1pbHk6bi5mb250RmFtaWx5LnJlcGxhY2UoIjsiLCIiKX06e30sdj1uLmVuZENhcmQsZz1mdW5jdGlvbigpe3ZhciB0PU4oKShSKCkubWFyaygoZnVuY3Rpb24gdChuKXtyZXR1cm4gUigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmUuYXBwLm5leHQoe2RhdGE6bixjb21wbGV0ZVN1cnZleTpmdW5jdGlvbigpe2UuZGVzdHJveShodCl9LGVuZENhcmQ6dn0pO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSx5PWR0KG4uYW5zd2Vyc3x8W10pO3RyeXt2YXIgbT1mdW5jdGlvbigpe3ZhciB0PW8udmFsdWU7aWYodC5xdWVzdGlvbklkPT09dSl7dmFyIGU7aWYoIm11bHRpcGxlY2hvaWNlIj09PXMpe3ZhciBuPWMub3B0aW9ucy5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZT09PXQudmFsdWV9KSk7aWYoIW4pcmV0dXJuImJyZWFrIjtlPXIoKSh7fSxuLmlkLG4udmFsdWUpfWVsc2UgZT10LnZhbHVlO3JldHVybiBnKHt2YWx1ZTplfSksImJyZWFrIn19O2Zvcih5LnMoKTshKG89eS5uKCkpLmRvbmU7KXtpZigiYnJlYWsiPT09bSgpKWJyZWFrfX1jYXRjaCh0KXt5LmUodCl9ZmluYWxseXt5LmYoKX1yZXR1cm4gQSgiZGl2Iix7Y2xhc3NOYW1lOiJ1bC1hcHAiLGlkOmh0LG9uY3JlYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1bInRyYW5zaXRpb25lbmQiLCJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwibW96VHJhbnNpdGlvbkVuZCJdLG89ITEsaT1mdW5jdGlvbiBuKCl7aWYoIW8mJndpbmRvdy5mcmFtZUVsZW1lbnQpe3ZhciBpPW5ldyBFdmVudCgidWw6ZnJhbWU6cmVuZGVyZWQiKTt3aW5kb3cuZnJhbWVFbGVtZW50LmRpc3BhdGNoRXZlbnQoaSl9bz0hMCxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4pfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGUudXBkYXRlKGh0KX0pLDMwMCl9O3IuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5hZGRFdmVudExpc3RlbmVyKGUsaSl9KSksbi5jb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2soKGZ1bmN0aW9uKCl7ZS5jbG9zZShodCl9KSksZS51cGRhdGUoaHQpfSh0KX0sb251cGRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZS51cGRhdGUoaHQpfSxzdHlsZTpofSxBKCJkaXYiLHtjbGFzc05hbWU6InVsLWFwcF9fY29udGFpbmVyIn0sQSgiZGl2Iix7Y2xhc3NOYW1lOkQoXygpKGZ0KCQsbi51c2VNb2JpbGVTdHlsaW5nKSkpLHN0eWxlOntib3JkZXJDb2xvcjpsfX0sQShhLFQoKSh7fSxjLHtib3JkZXI6bCxjbGFzc05hbWU6InVsLWNhcmQiLG5leHQ6ZyxlbmRDYXJkOnYsbG9jYWxlOm4ubG9jYWxlLHF1ZXN0aW9uSWQ6dSx1cGRhdGVIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS51cGRhdGUoaHQpfX0pKSksImVtYWlsIiE9PW4uaGVhZGVyc1sidXNlcmxlYXAtcGxhdGZvcm0iXSYmImxpbmsiIT09bi5oZWFkZXJzWyJ1c2VybGVhcC1wbGF0Zm9ybSJdJiYoIXZ8fHArMSE9PWQubGVuZ3RoKSYmQSgiZGl2Iix7Y2xhc3NOYW1lOkQoZnQoSyxuLnVzZU1vYmlsZVN0eWxpbmcpKX0sQSgiZGl2Iix7Y2xhc3NOYW1lOkosb25jbGljazpmLG9ua2V5cHJlc3M6ZnVuY3Rpb24odCl7MTM9PXQua2V5Q29kZSYmZigpfSxyb2xlOiJidXR0b24iLCJhcmlhLWxhYmVsIjoiQ2xvc2UgYnV0dG9uIix0YWJpbmRleDowfSxBKCJzdmciLHt3aWR0aDoiMThweCIsaGVpZ2h0OiIxOHB4Iix2aWV3Qm94OiIwIDAgMTMgMTMiLGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ9LEEoInBhdGgiLHtkOiJNMi41NDk2NCAxLjc4MzY5TDEuNzgzNjkgMi41NDk2NEw1LjczNDA1IDYuNUwxLjc4MzY5IDEwLjQ1MDRMMi41NDk2NCAxMS4yMTYzTDYuNSA3LjI2NTk1TDEwLjQ1MDQgMTEuMjE2M0wxMS4yMTYzIDEwLjQ1MDRMNy4yNjU5NSA2LjVMMTEuMjE2MyAyLjU0OTY0TDEwLjQ1MDQgMS43ODM2OUw2LjUgNS43MzQwNUwyLjU0OTY0IDEuNzgzNjlaIixmaWxsOiIjMjYyMTM2In0pKSkpKSl9LGd0PW4oNDcwNjYpLHl0PW4ubihndCksbXQ9bigzMDU5MyksYnQ9bi5uKG10KSx4dD1uKDQ0NTMpLHd0PW4ubih4dCksRXQ9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHdpbmRvdy5wYXJlbnQuSW50ZXJjb219Y2F0Y2godCl7fX0sanQ9ZnVuY3Rpb24oKXt2YXIgdD1FdCgpO3QmJih0LnVsX3dhc1Zpc2libGUmJnQoInVwZGF0ZSIse2hpZGVfZGVmYXVsdF9sYXVuY2hlcjohMX0pLGRlbGV0ZSB0LnVsX3dhc1Zpc2libGUpfSxDdD1mdW5jdGlvbigpe3ZhciB0PUV0KCk7dCYmKHQudWxfd2FzVmlzaWJsZT0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImlmcmFtZS5pbnRlcmNvbS1sYXVuY2hlci1mcmFtZSIpLHQudWxfd2FzVmlzaWJsZSYmdCgidXBkYXRlIix7aGlkZV9kZWZhdWx0X2xhdW5jaGVyOiEwfSkpfSxrdD1bdF0sU3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7YnQoKSh0aGlzLHQpfXJldHVybiB3dCgpKHQsbnVsbCxbe2tleToiZGlzYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtrdC5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kaXNhYmxlKCl9KSl9fSx7a2V5OiJlbmFibGUiLHZhbHVlOmZ1bmN0aW9uKCl7a3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5hYmxlKCl9KSl9fV0pLHR9KCksT3Q9big3NjM5MCksQXQ9bi5uKE90KSxJdD1mdW5jdGlvbigpe3JldHVybiBBKCJzdmciLHt3aWR0aDoiMTAwIixoZWlnaHQ6IjEzIix2aWV3Qm94OiIwIDAgMTAwIDEzIixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGFsdDoiUG93ZXJlZCBieSBTcHJpZyJ9LEEoInBhdGgiLHtkOiJNMy4wMzY5IDAuODM5OTgxSDAuMDI0OTAyM1Y4Ljk5OTk4SDEuMzIwOVY2LjUzOTk4SDIuODU2OUM0Ljg5NjkgNi41Mzk5OCA2LjI0MDkgNS4zNzU5OCA2LjI0MDkgMy42MjM5OEM2LjI0MDkgMS45NTU5OCA0Ljk2ODkgMC44Mzk5ODEgMy4wMzY5IDAuODM5OTgxWk0zLjAwMDkgNS4zNTE5OEgxLjMyMDlWMi4wMjc5OEgzLjAwMDlDNC4xNzY5IDIuMDI3OTggNC45Njg5IDIuNjc1OTggNC45Njg5IDMuNjIzOThDNC45Njg5IDQuNjU1OTggNC4xNzY5IDUuMzUxOTggMy4wMDA5IDUuMzUxOThaIixmaWxsOiIjNUQ2OTZGIn0pLEEoInBhdGgiLHtkOiJNOS45MDY1MyAzLjIxNTk4QzguMTU0NTMgMy4yMTU5OCA2LjkwNjUzIDQuNDUxOTggNi45MDY1MyA2LjE3OTk4QzYuOTA2NTMgNy45MDc5OCA4LjE1NDUzIDkuMTQzOTggOS45MDY1MyA5LjE0Mzk4QzExLjY1ODUgOS4xNDM5OCAxMi45MDY1IDcuOTA3OTggMTIuOTA2NSA2LjE3OTk4QzEyLjkwNjUgNC40NTE5OCAxMS42NTg1IDMuMjE1OTggOS45MDY1MyAzLjIxNTk4Wk05LjkwNjUzIDguMDE1OThDOC44ODY1MyA4LjAxNTk4IDguMTU0NTMgNy4yMzU5OCA4LjE1NDUzIDYuMTc5OThDOC4xNTQ1MyA1LjExMTk4IDguODg2NTMgNC4zNDM5OCA5LjkwNjUzIDQuMzQzOThDMTAuOTI2NSA0LjM0Mzk4IDExLjY1ODUgNS4xMTE5OCAxMS42NTg1IDYuMTc5OThDMTEuNjU4NSA3LjIzNTk4IDEwLjkyNjUgOC4wMTU5OCA5LjkwNjUzIDguMDE1OThaIixmaWxsOiIjNUQ2OTZGIn0pLEEoInBhdGgiLHtkOiJNMjAuOTYzMSAzLjM1OTk4TDE5LjczOTEgNy4xMTU5OEwxOC4zOTUxIDMuMzU5OThIMTcuMzI3MUwxNS45ODMxIDcuMTI3OThMMTQuNzU5MSAzLjM1OTk4SDEzLjQxNTFMMTUuNDQzMSA4Ljk5OTk4SDE2LjUzNTFMMTcuODY3MSA1LjA4Nzk4TDE5LjE4NzEgOC45OTk5OEgyMC4yNzkxTDIyLjMwNzEgMy4zNTk5OEgyMC45NjMxWiIsZmlsbDoiIzVENjk2RiJ9KSxBKCJwYXRoIix7ZDoiTTI1LjcyNDYgMy4yMTU5OEMyNC4wMDg2IDMuMjE1OTggMjIuODIwNiA0LjUxMTk4IDIyLjgyMDYgNi4xNzk5OEMyMi44MjA2IDcuODU5OTggMjQuMDIwNiA5LjE0Mzk4IDI1Ljc5NjYgOS4xNDM5OEMyNy4wMjA2IDkuMTQzOTggMjguMDE2NiA4LjU0Mzk4IDI4LjM3NjYgNy41MjM5OEgyNy4wMDg2QzI2Ljc4MDYgNy44ODM5OCAyNi4zNjA2IDguMDUxOTggMjUuODA4NiA4LjA1MTk4QzI0Ljc1MjYgOC4wNTE5OCAyNC4yMTI2IDcuNDAzOTggMjQuMDkyNiA2LjU1MTk4SDI4LjUyMDZDMjguNzYwNiA0LjY0Mzk4IDI3LjU5NjYgMy4yMTU5OCAyNS43MjQ2IDMuMjE1OThaTTI1LjczNjYgNC4yNzE5OEMyNi42MTI2IDQuMjcxOTggMjcuMjEyNiA0Ljc2Mzk4IDI3LjI4NDYgNS42ODc5OEgyNC4xMTY2QzI0LjI2MDYgNC44OTU5OCAyNC44MDA2IDQuMjcxOTggMjUuNzM2NiA0LjI3MTk4WiIsZmlsbDoiIzVENjk2RiJ9KSxBKCJwYXRoIix7ZDoiTTMxLjEyOTcgNC4xMjc5OFYzLjM1OTk4SDI5Ljg4MTdWOC45OTk5OEgzMS4xMjk3VjUuNDQ3OThDMzEuNjMzNyA0Ljc4Nzk4IDMyLjMxNzcgNC40NTE5OCAzMy4yMTc3IDQuNDE1OThWMy4yMzk5OEMzMi4zNTM3IDMuMjM5OTggMzEuNjQ1NyAzLjU2Mzk4IDMxLjEyOTcgNC4xMjc5OFoiLGZpbGw6IiM1RDY5NkYifSksQSgicGF0aCIse2Q6Ik0zNi44MjIyIDMuMjE1OThDMzUuMTA2MiAzLjIxNTk4IDMzLjkxODIgNC41MTE5OCAzMy45MTgyIDYuMTc5OThDMzMuOTE4MiA3Ljg1OTk4IDM1LjExODIgOS4xNDM5OCAzNi44OTQyIDkuMTQzOThDMzguMTE4MiA5LjE0Mzk4IDM5LjExNDIgOC41NDM5OCAzOS40NzQyIDcuNTIzOThIMzguMTA2MkMzNy44NzgyIDcuODgzOTggMzcuNDU4MiA4LjA1MTk4IDM2LjkwNjIgOC4wNTE5OEMzNS44NTAyIDguMDUxOTggMzUuMzEwMiA3LjQwMzk4IDM1LjE5MDIgNi41NTE5OEgzOS42MTgyQzM5Ljg1ODIgNC42NDM5OCAzOC42OTQyIDMuMjE1OTggMzYuODIyMiAzLjIxNTk4Wk0zNi44MzQyIDQuMjcxOThDMzcuNzEwMiA0LjI3MTk4IDM4LjMxMDIgNC43NjM5OCAzOC4zODIyIDUuNjg3OThIMzUuMjE0MkMzNS4zNTgyIDQuODk1OTggMzUuODk4MiA0LjI3MTk4IDM2LjgzNDIgNC4yNzE5OFoiLGZpbGw6IiM1RDY5NkYifSksQSgicGF0aCIse2Q6Ik00NS40ODg2IDAuNDc5OThWMy44MDM5OEM0NS4wMDg2IDMuNDMxOTggNDQuMzk2NiAzLjIxNTk4IDQzLjY3NjYgMy4yMTU5OEM0Mi4wOTI2IDMuMjE1OTggNDAuODIwNiA0LjUzNTk4IDQwLjgyMDYgNi4xNjc5OEM0MC44MjA2IDcuODIzOTggNDIuMDkyNiA5LjE0Mzk4IDQzLjY3NjYgOS4xNDM5OEM0NC4zOTY2IDkuMTQzOTggNDUuMDA4NiA4LjkyNzk4IDQ1LjQ4ODYgOC41NDM5OFY4Ljk5OTk4SDQ2LjcyNDZWMC40Nzk5OEg0NS40ODg2Wk00My44NTY2IDguMDE1OThDNDIuODI0NiA4LjAxNTk4IDQyLjA2ODYgNy4xNzU5OCA0Mi4wNjg2IDYuMTY3OThDNDIuMDY4NiA1LjE3MTk4IDQyLjgyNDYgNC4zNDM5OCA0My44NTY2IDQuMzQzOThDNDQuNDgwNiA0LjM0Mzk4IDQ1LjA2ODYgNC41NTk5OCA0NS40ODg2IDUuMTU5OThWNy4xODc5OEM0NS4wNjg2IDcuNzk5OTggNDQuNDgwNiA4LjAxNTk4IDQzLjg1NjYgOC4wMTU5OFoiLGZpbGw6IiM1RDY5NkYifSksQSgicGF0aCIse2Q6Ik01NC42Nzk3IDMuMjE1OThDNTMuOTU5NyAzLjIxNTk4IDUzLjM0NzcgMy40MzE5OCA1Mi44Nzk3IDMuNzkxOThWMC40Nzk5OEg1MS42MzE3VjguOTk5OThINTIuODc5N1Y4LjU1NTk4QzUzLjM0NzcgOC45Mjc5OCA1My45NTk3IDkuMTQzOTggNTQuNjc5NyA5LjE0Mzk4QzU2LjI2MzcgOS4xNDM5OCA1Ny41NDc3IDcuODIzOTggNTcuNTQ3NyA2LjE2Nzk4QzU3LjU0NzcgNC41MzU5OCA1Ni4yNjM3IDMuMjE1OTggNTQuNjc5NyAzLjIxNTk4Wk01NC40OTk3IDguMDE1OThDNTMuODc1NyA4LjAxNTk4IDUzLjI5OTcgNy43OTk5OCA1Mi44Nzk3IDcuMjExOThWNS4xMzU5OEM1My4yOTk3IDQuNTQ3OTggNTMuODc1NyA0LjM0Mzk4IDU0LjQ5OTcgNC4zNDM5OEM1NS41NDM3IDQuMzQzOTggNTYuMjk5NyA1LjE3MTk4IDU2LjI5OTcgNi4xNjc5OEM1Ni4yOTk3IDcuMTc1OTggNTUuNTQzNyA4LjAxNTk4IDU0LjQ5OTcgOC4wMTU5OFoiLGZpbGw6IiM1RDY5NkYifSksQSgicGF0aCIse2Q6Ik02My4zMzQ3IDMuMzQ3OThMNjEuMzkwNyA3Ljc2Mzk4TDU5LjI2NjcgMy4zNDc5OEg1Ny45MzQ3TDYwLjgxNDcgOS4wODM5OEw1OS42MjY3IDExLjc4NEg2MC45MzQ3TDY0LjY1NDcgMy4zNDc5OEg2My4zMzQ3WiIsZmlsbDoiIzVENjk2RiJ9KSxBKCJwYXRoIix7ZDoiTTcxLjE0NjYgNC4zNDY2MUM2OS44MDkyIDQuMDUwMzggNjkuMTMxIDMuNTMwMDEgNjkuMTMxIDIuODAwNjVDNjkuMTMxIDIuMDQ3MDUgNjkuODU0NiAxLjQ3ODIyIDcwLjgxNDIgMS40NzgyMkM3MS44MDM0IDEuNDc4MjIgNzIuNTQ5NiAyLjEwMzM5IDcyLjU0OTYgMi45MzIxVjIuOTk4MTNINzMuOTE2NVYyLjkzMjFDNzMuOTE2NSAxLjQxNzY0IDcyLjU4ODMgMC4yNzI3MDUgNzAuODI3MSAwLjI3MjcwNUM2OS45Nzg0IDAuMjcyNzA1IDY5LjIwMDkgMC41MzMxOTEgNjguNjM3OSAxLjAwNTdDNjguMzU4NCAxLjIzNjE5IDY4LjEzMzkgMS41MjQ4NyA2Ny45ODA1IDEuODUxMUM2Ny44MjcxIDIuMTc3MzMgNjcuNzQ4NiAyLjUzMzAzIDY3Ljc1MDYgMi44OTI3M0M2Ny43NDUxIDMuMjIyNTUgNjcuODEzNyAzLjU0OTQ5IDY3Ljk1MTUgMy44NDk5NEM2OC4wODk0IDQuMTUwMzggNjguMjkzIDQuNDE2ODYgNjguNTQ3OCA0LjYzMDEyQzY5LjAyMTggNS4wNDI2NiA2OS42OTQ1IDUuMzQ3OTggNzAuNTQ2MyA1LjUzODhDNzEuOTgwNiA1Ljg1NTAyIDcyLjcwNzggNi4zOTI5NiA3Mi43MDc4IDcuMTM2ODZDNzIuNzA3OCA3Ljk0MzE2IDcxLjkxNTYgOC41NTA3NiA3MC44NjgyIDguNTUwNzZDNjkuNzgwNCA4LjU1MDc2IDY4Ljk1OTkgNy44NzUzMSA2OC45NTk5IDYuOTc5OTZWNi45MTM5M0g2Ny41OTE4VjYuOTc5OTZDNjcuNTkxOCA4LjU2MzQ4IDY4Ljk5NDIgOS43NTY4OCA3MC44NTM1IDkuNzU2ODhDNzEuNzQyNiA5Ljc1Njg4IDcyLjU1ODggOS40ODczMSA3My4xNTE4IDguOTk2NjJDNzMuNDQ2IDguNzU4MzEgNzMuNjgyNyA4LjQ1ODEgNzMuODQ0NSA4LjExNzlDNzQuMDA2MyA3Ljc3NzcgNzQuMDg5MSA3LjQwNjExIDc0LjA4NyA3LjAzMDI0Qzc0LjA4NyA1LjY4NTQgNzMuMDk5MSA0Ljc4MjE3IDcxLjE0NjYgNC4zNDY2MVoiLGZpbGw6IiM1RDY5NkYifSksQSgicGF0aCIse2Q6Ik03OC43OTg2IDIuNTA4MDZDNzguMjg3NCAyLjUwMTc1IDc3Ljc4MjMgMi42MTc2IDc3LjMyNjMgMi44NDU3NkM3Ni44NzAzIDMuMDczOTEgNzYuNDc2OCAzLjQwNzU5IDc2LjE3OTUgMy44MTgzN1YyLjY2NzM4SDc0Ljg3ODlWMTIuMDc1Mkg3Ni4xNzk1VjguNDg3MTZDNzYuNDc2OCA4Ljg5NzkgNzYuODcwMyA5LjIzMTUyIDc3LjMyNjMgOS40NTk1N0M3Ny43ODI0IDkuNjg3NjMgNzguMjg3NSA5LjgwMzM1IDc4Ljc5ODYgOS43OTY4N0M4MC44MTY3IDkuNzk2ODcgODIuMzM4MSA4LjIzMDMxIDgyLjMzODEgNi4xNTI0NkM4Mi4zMzgxIDQuMDc0NjIgODAuODE2NyAyLjUwODA2IDc4Ljc5ODYgMi41MDgwNlpNODAuOTgzNSA2LjQyMjY0QzgwLjkzMTYgNi45NjI5IDgwLjY5MjEgNy40Njg3OSA4MC4zMDU2IDcuODU0NEM3OS45MTkgOC4yNDAwMSA3OS40MDkzIDguNDgxNTYgNzguODYzIDguNTM4MDRDNzguMTM2OSA4LjYxMDc0IDc3LjQ2MDUgOC40MDI5NSA3Ni45NTgzIDcuOTU0MDdDNzYuNDU2MSA3LjUwNTE4IDc2LjE3OTUgNi44NjM2NSA3Ni4xNzk1IDYuMTUyNDZDNzYuMTc5NSA0Ljc4NDYgNzcuMjEyMiAzLjc1Mjk1IDc4LjU4MTUgMy43NTI5NUM3OS4yOTA0IDMuNzUyOTUgNzkuOTMwNiA0LjAyMTkxIDgwLjM3NzYgNC41MTAxOEM4MC44Mzg3IDUuMDExMTYgODEuMDU0IDUuNjkwMjUgODAuOTgzNSA2LjQyMjY0WiIsZmlsbDoiIzVENjk2RiJ9KSxBKCJwYXRoIix7ZDoiTTk4LjI5MDggMi42NjkyVjMuODA3NDdDOTcuNjc3NiAyLjk3ODc1IDk2LjczMDIgMi41MDgwNiA5NS42NTgzIDIuNTA4MDZDOTMuNjQ4MiAyLjUwODA2IDkyLjEzMjMgNC4wNDYxNSA5Mi4xMzIzIDYuMDg1ODJDOTIuMTMyMyA4LjEyNTUgOTMuNjQ4MiA5LjY2Mjk5IDk1LjY1ODMgOS42NjI5OUM5Ni43MzQ1IDkuNjYyOTkgOTcuNjgxOSA5LjE5NzE0IDk4LjI5MDggOC4zNzY5MVY4LjU1MTk4Qzk4LjI5MDggOS45Njg5MSA5Ny4zOTA2IDEwLjg4NDMgOTUuOTk3NCAxMC44ODQzQzk1LjA1NjEgMTAuODg0MyA5NC4yNzE4IDEwLjQ3NjYgOTMuODk5NiA5Ljc5Mzg0TDkzLjg4MDYgOS43NTg3SDkyLjUzODlMOTIuNTY5NSA5Ljg0NjU0QzkyLjc5NjEgMTAuNTE0IDkzLjIzOTIgMTEuMDg4OSA5My44MzAzIDExLjQ4MjJDOTQuNDIzMyAxMS44NzIzIDk1LjE3MjYgMTIuMDc4MyA5NS45OTc0IDEyLjA3ODNDOTcuMDU1MiAxMi4wNzgzIDk3Ljk1NTQgMTEuNzQ1MSA5OC42MDE3IDExLjExNTdDOTkuMjQ4MSAxMC40ODYyIDk5LjU5MTUgOS42MDEyIDk5LjU5MTUgOC41Njc3M1YyLjY2OTJIOTguMjkwOFpNOTcuNTYxMSA3Ljg0MkM5Ny4wMDkyIDguMzY0MTggOTYuMjIyNSA4LjU4MzQ4IDk1LjQwMDEgOC40NDI5NEM5NC45MTMyIDguMzU3OTYgOTQuNDY2NCA4LjEyMTg0IDk0LjEyNDUgNy43Njg4OUM5My43ODI3IDcuNDE1OTMgOTMuNTYzNiA2Ljk2NDUyIDkzLjQ5OTIgNi40ODAxOUM5My4zODMzIDUuNjY1NDEgOTMuNjMxIDQuODkzNjQgOTQuMTc4NiA0LjM2NDE4Qzk0LjYzODMgMy45Mjc0MSA5NS4yNTQyIDMuNjg3ODggOTUuODkxOSAzLjY5NzgyQzk2LjA0NjQgMy42OTc5NSA5Ni4yMDA2IDMuNzEwMzEgOTYuMzUzMSAzLjczNDc3Qzk3LjM0NTkgMy44OTM0OSA5OC4xMzE0IDQuNzA0MDMgOTguMjYzMiA1LjcxMDI0Qzk4LjM3NDkgNi41MzgzNSA5OC4xMTc5IDcuMzE0MzYgOTcuNTYxMSA3Ljg0MloiLGZpbGw6IiM1RDY5NkYifSksQSgicGF0aCIse2Q6Ik05MC43MDUgMC4wOTk1OTc1QzkwLjQ2MDIgMC4wNDY3NzMgOTAuMjA0MyAwLjA5MTE5NzEgODkuOTkyNSAwLjIyMzI2OUM4OS43ODA2IDAuMzU1MzQgODkuNjI5OSAwLjU2NDQ1MiA4OS41NzI5IDAuODA1NDA5Qzg5LjUxNTkgMS4wNDYzNyA4OS41NTcxIDEuMjk5ODIgODkuNjg3NyAxLjUxMDk4Qzg5LjgxODMgMS43MjIxNSA5MC4wMjc3IDEuODc0MDcgOTAuMjcwOCAxLjkzMzkxQzkwLjM0MTUgMS45NDk1NCA5MC40MTM2IDEuOTU3NDcgOTAuNDg2IDEuOTU3NTRDOTAuNzIgMS45NTc5IDkwLjk0NTggMS44NzMyNSA5MS4xMjA2IDEuNzE5NzNDOTEuMjk1NSAxLjU2NjIgOTEuNDA3IDEuMzU0NTIgOTEuNDM0MSAxLjEyNUM5MS40NjExIDAuODk1NDcgOTEuNDAxNyAwLjY2NDEzNSA5MS4yNjczIDAuNDc1MDQ2QzkxLjEzMjkgMC4yODU5NTggOTAuOTMyNyAwLjE1MjMyNSA5MC43MDUgMC4wOTk1OTc1VjAuMDk5NTk3NVoiLGZpbGw6IiM1RDY5NkYifSksQSgicGF0aCIse2Q6Ik04OS44MzY2IDguMzkxNDNIODguNzE1Qzg3LjkxNzggOC4zOTE0MyA4Ny40Mzg5IDcuODU1MzEgODcuNDM4OSA2Ljk1NjkzQzg3LjQzODkgNi4wODA5NiA4Ny44NjgxIDUuMDM2NTkgODguNzQzMiAzLjc2NDQ0TDg4Ljc1NDggMy43NDc0OFYzLjM4ODI1TDg1LjAyNzEgMi44NjcyN0M4NS4wMjg0IDIuNzE1NTMgODQuOTg4NiAyLjU2NjIyIDg0LjkxMTggMi40MzQ3OEM4NC44MzUxIDIuMzAzMzUgODQuNzI0MSAyLjE5NDU4IDg0LjU5MDUgMi4xMTk3M0M4NC4yNTYzIDEuOTM4IDgzLjg5MDggMS45MzggODMuNTg3OSAyLjExMzY4QzgzLjQzNjEgMi4yMDIzIDgzLjMxMjIgMi4zMzA3NyA4My4yMyAyLjQ4NDhDODMuMTQ3NyAyLjYzODg0IDgzLjExMDMgMi44MTI0IDgzLjEyMTkgMi45ODYxOEM4My4xMzM2IDMuMTU5OTYgODMuMTkzOCAzLjMyNzE0IDgzLjI5NTggMy40NjkxNEM4My4zOTc5IDMuNjExMTQgODMuNTM3OSAzLjcyMjM4IDgzLjcwMDEgMy43OTA0OUw4Mi41NDA1IDkuNjM3NTNIODMuODI4M0w4NC44OTc3IDQuMDg1NTFMODYuOTExNSA0LjQyMTExQzg2LjM3MDEgNS4zODAwNyA4Ni4wOTUzIDYuMjc0MjEgODYuMDk1MyA3LjA3ODY5Qzg2LjA5NTMgOC41NjM0NyA4Ny4wMDQxIDkuNTM1NzYgODguNDczNCA5LjYyOTY1VjkuNjM3NTNIOTEuMTM0MVYyLjY5MDk5SDg5LjgzNjZWOC4zOTE0M1oiLGZpbGw6IiM1RDY5NkYifSkpfSxUdD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10LmFwcC5kZWNrLmNhcmRzfHxbXSxuPWUuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSkpLHI9dC5hcHAuZGVjay5pbmRleCxvPXQuYXBwLGk9by5zaG93U3VydmV5QnJhbmQsYT1vLm1hcmtldGluZ1VybCxjPW8uc2x1Z05hbWUscz1vLnN1cnZleUlkLHU9ZnVuY3Rpb24oKXtyZXR1cm4gaT9BKCJhIix7c3R5bGU6ImRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDVweCAwIDEwcHggMCIsaHJlZjoiIi5jb25jYXQoYSwiP3V0bV9zb3VyY2U9c3VydmV5X2JyYW5kaW5nJnV0bV9tZWRpdW09d2Vic2l0ZSZ1dG1fY2FtcGFpZ249IikuY29uY2F0KGMsIiZ1dG1fY29udGVudD0iKS5jb25jYXQocyksdGFyZ2V0OiJfYmxhbmsifSxJdCk6bnVsbH07aWYocisxPT09ZS5sZW5ndGh8fCFufHwxPT09bi5sZW5ndGgpcmV0dXJuIEEoImZvb3RlciIse2NsYXNzTmFtZToidWwtZm9vdGVyIn0sdSk7cmV0dXJuIEEoImZvb3RlciIse2NsYXNzTmFtZToidWwtZm9vdGVyIn0sKGZ1bmN0aW9uKCl7aWYobi5sZW5ndGg+MSYmbi5sZW5ndGg8PTEwKXt2YXIgZT1uLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gQSgic3BhbiIse2NsYXNzTmFtZToidWwtZm9vdGVyLWJ1YmJsZSIsa2V5Om4sc3R5bGU6cj09PW4/e2JhY2tncm91bmRDb2xvcjp0LmFwcC5ib3JkZXJ9Ontib3JkZXJDb2xvcjp0LmFwcC5ib3JkZXJ9fSl9KSk7cmV0dXJuIEEoImRpdiIse3N0eWxlOiJtYXJnaW4tYm90dG9tOiAxMHB4OyJ9LGUpfXJldHVybiBudWxsfSksdSl9fSxNdD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5jYXB0aW9uVGV4dD9BKCJwIix7aWQ6dXQsY2xhc3NOYW1lOnV0fSx0LmNhcHRpb25UZXh0KTpudWxsfSxfdD1mdW5jdGlvbih0LGUpe3JldHVybiBBKCJwIix0P3tpZDpzdCxjbGFzc05hbWU6c3Qscm9sZToiaGVhZGluZyJ9OntpZDpzdCxjbGFzc05hbWU6c3Qsc3R5bGU6Im1hcmdpbi1ib3R0b206IDE1cHgiLHJvbGU6ImhlYWRpbmcifSxlKX0sTHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuYnV0dG9uVGV4dD90LmJ1dHRvblRleHQ6Ik5leHQifSxSdD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5za2lwQnV0dG9uVGV4dD90LnNraXBCdXR0b25UZXh0OiJTa2lwIn0sUHQ9big5NzM0MyksTnQ9bi5uKFB0KTtmdW5jdGlvbiBGdCh0LGUpe2UodCl9dmFyIER0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuYm9yZGVyLG49dC5sYWJlbCxyPXQuc2VsZWN0ZWQsbz0odC5pbmRleCx0LmlkKSxpPXQub25TZWxlY3QsYT10LmlzUmFkaW8sYz10LnVzZU1vYmlsZVN0eWxpbmcscz1mdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hvaWNlLWRpdi0iLmNvbmNhdChvKSkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmFkaW8tIi5jb25jYXQobykpO24mJihuLnN0eWxlLmJvcmRlckNvbG9yPWUpLHImJihyLnN0eWxlLmJvcmRlcldpZHRoPSI2cHgiLHIuc3R5bGUuYm9yZGVyQ29sb3I9ZSxyLnN0eWxlLmJveFNoYWRvdz0ibm9uZSIpfSx1PWZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaG9pY2UtZGl2LSIuY29uY2F0KG8pKSxuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyYWRpby0iLmNvbmNhdChvKSk7ZSYmKGUuc3R5bGUuYm9yZGVyQ29sb3I9IiNlNmU2ZTYiKSxuJiYobi5zdHlsZS5ib3JkZXJXaWR0aD0iMXB4IixuLnN0eWxlLmJvcmRlckNvbG9yPSIjMzIzMjMyIixuLnN0eWxlLmJveFNoYWRvdz0iaW5zZXQgM3B4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEpIil9LGw9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKSx1KCksaShvKX0sZj17b25jbGljazpmdW5jdGlvbih0KXtyZXR1cm4gbCh0KX0sb25rZXlwcmVzczpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7MTMhPXQua2V5Q29kZSYmMzIhPXQua2V5Q29kZXx8bCh0KX0odCl9fTsib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8oZi5vbnRvdWNoc3RhcnQ9cyxmLm9udG91Y2hjYW5jZWw9dSxmLm9udG91Y2htb3ZlPXUsZi5vbnRvdWNoZW5kPXUpOihmLm9ubW91c2Vkb3duPXMsZi5vbm1vdXNlbGVhdmU9dSk7dmFyIGQ9YT8icmFkaW8tIi5jb25jYXQobyk6ImNoZWNrYm94LSIuY29uY2F0KG8pO3JldHVybiBBKCJkaXYiLFQoKSh7Y2xhc3NOYW1lOkQoZnQodHQsYykpLGlkOiJjaG9pY2UtZGl2LSIuY29uY2F0KG8pfSxmKSwhYSYmQSgiZGl2Iix7Y2xhc3NOYW1lOm50LGlkOmQsc3R5bGU6cj97YmFja2dyb3VuZENvbG9yOmUsYm9yZGVyQ29sb3I6ZSxib3hTaGFkb3c6Im5vbmUifTp7fSxyb2xlOiJjaGVja2JveCIsImFyaWEtbGFiZWxsZWRieSI6IiIuY29uY2F0KHN0LCIgbGFiZWwtIikuY29uY2F0KG8pLCJhcmlhLWNoZWNrZWQiOnIsdGFiaW5kZXg6MH0sciYmQSgic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMTAgMTAiLGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ9LEEoInBhdGgiLHtkOiJNOS4xNTM3NyAxLjMwNzc0TDQuMDc2ODUgOC4yMzA4MkwxLjMwNzYyIDUuMDAwMDUiLHN0cm9rZToid2hpdGUiLCJzdHJva2Utd2lkdGgiOiIyIiwic3Ryb2tlLWxpbmVjYXAiOiJyb3VuZCJ9KSkpLGEmJkEoImRpdiIse2NsYXNzTmFtZTpydCxpZDpkLHJvbGU6InJhZGlvIiwiYXJpYS1sYWJlbGxlZGJ5IjoiIi5jb25jYXQoc3QsIiBsYWJlbC0iKS5jb25jYXQobyksdGFiaW5kZXg6MH0pLEEoImxhYmVsIix7Y2xhc3NOYW1lOkQoZnQoZXQsYykpLGZvcjpkLGlkOiJsYWJlbC0iLmNvbmNhdChvKX0sbikpfTtjb25zdCBVdD0iaHR0cHM6Ly9jZG4uc3ByaWcuY29tIixCdD10PT50KyItbG9hZGluZy1zcGluZXIiLHp0PSJoaWRkZW4iLEh0PSJ2aXNpYmxlIixWdD0idWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24iLHF0PSJ1bC1yZWNvcmRpbmctaW4tc2Vzc2lvbiIsV3Q9W3t0eXBlOiJsaW5rIixjb250ZW50OmAke1V0fS9kZXBlbmRlbmNpZXMvdmlkZW9qcy1yZWNvcmQtNC41LjAubWluLmNzc2B9LHt0eXBlOiJzY3JpcHQiLGNvbnRlbnQ6YCR7VXR9L2RlcGVuZGVuY2llcy9SZWNvcmRSVEMtNS42LjIuanNgfSx7dHlwZToic2NyaXB0Iixjb250ZW50OmAke1V0fS9kZXBlbmRlbmNpZXMvYWRhcHRlci44LjAuMC5taW4uanNgfSx7dHlwZToic2NyaXB0Iixjb250ZW50OmAke1V0fS9kZXBlbmRlbmNpZXMvdmlkZW9qcy1yZWNvcmQtNC41LjAubWluLmpzYH0se3R5cGU6InNjcmlwdCIsY29udGVudDpgJHtVdH0vdXNlcmxlYXAtd2ViLXVwY2h1bmstdjIuMi4yLmpzYH1dLEd0PVt7dHlwZToibGluayIsY29udGVudDpgJHtVdH0vZGVwZW5kZW5jaWVzL3ZpZGVvLWpzLTcuMTguMC5taW4uY3NzYH0se3R5cGU6InNjcmlwdCIsY29udGVudDpgJHtVdH0vZGVwZW5kZW5jaWVzL3ZpZGVvLWpzLTcuMTguMC5taW4uanNgfSx7dHlwZToic3R5bGUiLGNvbnRlbnQ6Ii8qIHByb2dyZXNzIGNvbnRyb2wgc3R5bGVzICovXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtcHJvZ3Jlc3MtaG9sZGVyIHtcbiAgbWFyZ2luOiAwIDBweDtcbn1cblxuLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaGVpZ2h0OiAzcHg7XG4gIHdpZHRoOiAxMDAlO1xufVxuLyogcG9zaXRpb24gYW5kIGFsaWduIHRoZSBidXR0b25zIGFuZCBidXR0b24gdGV4dHMgKi9cbi51bC1jb250cm9sLXBhbmVsIHtcbiAgYm90dG9tOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGhlaWdodDogZml0LWNvbnRlbnQ7XG4gIHotaW5kZXg6IDI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNGOEY4Rjg7XG59XG5cbi51bC1idXR0b25zLXBhbmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgY29sb3I6IGJsYWNrO1xuICBoZWlnaHQ6IDUwcHg7XG4gIHBhZGRpbmc6IDJweCAxNHB4IDA7XG59XG5cbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCB7XG4gIGhlaWdodDogMzBweDtcbiAgd2lkdGg6IDQwcHg7XG59XG5cbi51bC1idXR0b25zLXBhbmVsID4gLnZqcy1idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGhlaWdodDogM2VtO1xuICB3aWR0aDogM2VtO1xuICBtYXJnaW46IDAgMTBweDtcbn1cblxuc3Bhbi51bC1idXR0b24tdGV4dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAyNXB4KTtcbiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxcHgsIDI1cHgpO1xufVxuXG4jdWwtY2FtZXJhLWJ1dHRvbiB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi51bC1pbmFjdGl2ZSB7XG4gIG9wYWNpdHk6IDAuMztcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnZpZGVvLWpzIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS1ob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgei1pbmRleDogMTtcbn1cblxuLnZqcy12b2x1bWUtYmFyLnZqcy1zbGlkZXItaG9yaXpvbnRhbCAudmpzLXZvbHVtZS1sZXZlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGJsYWNrO1xufVxuXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsLnZqcy1ob3Zlcixcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLXNsaWRlci1hY3RpdmUsXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsOmFjdGl2ZSB7XG4gIHdpZHRoOiA0MHB4O1xufVxuXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtc2xpZGVyLWFjdGl2ZSxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sOmFjdGl2ZSxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtaG92ZXIgLnZqcy1tdXRlLWNvbnRyb2wgfiAudmpzLXZvbHVtZS1jb250cm9sLFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy1ob3ZlciAudmpzLXZvbHVtZS1jb250cm9sLFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmFjdGl2ZSAudmpzLXZvbHVtZS1jb250cm9sLFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmZvY3VzIC52anMtdm9sdW1lLWNvbnRyb2wge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICBsZWZ0OiA0MHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4xcywgb3BhY2l0eSAwLjFzLCBoZWlnaHQgMC4xcywgd2lkdGggMC4xcywgbGVmdCAwcywgdG9wIDBzO1xufVxuXG4vKiBwbGF5IGJ1dHRvbiBjdXN0b21pemF0aW9uICovXG4udmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wge1xuICBjb2xvcjogYmxhY2s7XG59XG5cbi52aWRlby1qcyAudmpzLXBsYXktY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcbiAgY29udGVudDogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHZpZXdCb3g9JzAgMCAxMiAxMicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTEwLjUzNjMgNi40MDIyNkwxLjkzOTU4IDEwLjcwMDZDMS42NDAzNyAxMC44NTAyIDEuMjg4MzMgMTAuNjMyNiAxLjI4ODMzIDEwLjI5ODFWMS43MDE0QzEuMjg4MzMgMS4zNjY4OCAxLjY0MDM3IDEuMTQ5MzEgMS45Mzk1OCAxLjI5ODkxTDEwLjUzNjMgNS41OTcyN0MxMC44NjggNS43NjMxMSAxMC44NjggNi4yMzY0MiAxMC41MzYzIDYuNDAyMjZaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXCIpO1xufVxuXG4vKiBwb3NpdGlvbiBhbmQgc3R5bGUgdGhlIGN1cnJlbnQgdGltZXIgKi9cbi51bC10aW1lLXBhbmVsIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDgwcHg7XG4gIGxlZnQ6IDEwcHg7XG4gIGhlaWdodDogMjJweDtcbiAgY29sb3I6IGJsYWNrO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTBlMGViO1xuICBib3JkZXItcmFkaXVzOiAyM3B4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xufVxuXG4udmlkZW8tanMgLnZqcy1jdXJyZW50LXRpbWUsXG4udmpzLW5vLWZsZXggLnZqcy1jdXJyZW50LXRpbWUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi8qIHJlbW92ZSB0aGUgZG90IHByb2dyZXNzIGluZGljYXRvciAqL1xuLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzczpiZWZvcmUsXG4udmlkZW8tanMgLnZqcy12b2x1bWUtbGV2ZWw6YmVmb3JlLFxuLnZqcy1pY29uLWNpcmNsZTpiZWZvcmUsXG4udmpzLXNlZWstdG8tbGl2ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xuICBjb250ZW50OiBub25lO1xufVxuXG4udmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE5JyBoZWlnaHQ9JzE0JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTguODI1LjMyNEEuNzUuNzUgMCAwMTkuMjUgMXYxMS42NjdhLjc1Ljc1IDAgMDEtMS4yMTkuNTg1bC0zLjk2LTMuMTY5SDFhLjc1Ljc1IDAgMDEtLjc1LS43NXYtNWEuNzUuNzUgMCAwMS43NS0uNzVoMy4wN0w4LjAzMS40MTRhLjc1Ljc1IDAgMDEuNzk0LS4wOXpNNy43NSAyLjU2TDQuODAyIDQuOTJhLjc1Ljc1IDAgMDEtLjQ2OS4xNjRIMS43NXYzLjVoMi41ODNhLjc1Ljc1IDAgMDEuNDY5LjE2NWwyLjk0OCAyLjM1OFYyLjU2ek0xNC45MTEuNDdhLjc1Ljc1IDAgMDExLjA2MSAwIDkuMDg0IDkuMDg0IDAgMDEwIDEyLjg0NC43NS43NSAwIDAxLTEuMDYtMS4wNiA3LjU4NCA3LjU4NCAwIDAwMC0xMC43MjQuNzUuNzUgMCAwMTAtMS4wNnpNMTEuOTcgMy40MWEuNzUuNzUgMCAwMTEuMDYgMCA0LjkxNyA0LjkxNyAwIDAxMCA2Ljk1My43NS43NSAwIDExLTEuMDYtMS4wNiAzLjQxNyAzLjQxNyAwIDAwMC00LjgzMi43NS43NSAwIDAxMC0xLjA2eicgZmlsbD0nJTIzMjYyMTM2Jy8lM0UlM0Mvc3ZnJTNFXCIpO1xufVxuXG4udmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0wIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xuICBjb250ZW50OiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxOScgaGVpZ2h0PScxNCcgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTguNSAxLjE2N0w0LjMzMyA0LjVIMXY1aDMuMzMzTDguNSAxMi44MzNWMS4xNjd6TTE3LjE3IDQuNWwtNSA1TTEyLjE3IDQuNWw1IDUnIHN0cm9rZT0nJTIzMjYyMTM2JyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXCIpO1xufVxuXG4udmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0xIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xuICBjb250ZW50OiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxOScgaGVpZ2h0PScxNCcgdmlld0JveD0nMCAwIDE5IDE0JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTguODI0ODkgMC4zMjQwM0M5LjA4NDc0IDAuNDQ4OTIgOS4yNSAwLjcxMTcwMyA5LjI1IDEuMDAwMDFWMTIuNjY2N0M5LjI1IDEyLjk1NSA5LjA4NDc0IDEzLjIxNzggOC44MjQ4OSAxMy4zNDI3QzguNTY1MDQgMTMuNDY3NSA4LjI1NjYxIDEzLjQzMjQgOC4wMzE0OCAxMy4yNTIzTDQuMDcwMjUgMTAuMDgzM0gxQzAuNTg1Nzg2IDEwLjA4MzMgMC4yNSA5Ljc0NzU1IDAuMjUgOS4zMzMzNFY0LjMzMzM0QzAuMjUgMy45MTkxMyAwLjU4NTc4NiAzLjU4MzM0IDEgMy41ODMzNEg0LjA3MDI1TDguMDMxNDggMC40MTQzNTVDOC4yNTY2MSAwLjIzNDI1MyA4LjU2NTA0IDAuMTk5MTQgOC44MjQ4OSAwLjMyNDAzWk03Ljc1IDIuNTYwNDhMNC44MDE4NSA0LjkxODk5QzQuNjY4ODcgNS4wMjUzOCA0LjUwMzY0IDUuMDgzMzQgNC4zMzMzMyA1LjA4MzM0SDEuNzVWOC41ODMzNEg0LjMzMzMzQzQuNTAzNjQgOC41ODMzNCA0LjY2ODg3IDguNjQxMyA0LjgwMTg1IDguNzQ3NjlMNy43NSAxMS4xMDYyVjIuNTYwNDhaJyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQy9zdmclM0UlMEFcIik7XG59XG5cbi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTIgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE5JyBoZWlnaHQ9JzE0JyB2aWV3Qm94PScwIDAgMTkgMTQnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGwtcnVsZT0nZXZlbm9kZCcgY2xpcC1ydWxlPSdldmVub2RkJyBkPSdNOC44MjQ4OSAwLjMyNDAzQzkuMDg0NzQgMC40NDg5MiA5LjI1IDAuNzExNzAzIDkuMjUgMS4wMDAwMVYxMi42NjY3QzkuMjUgMTIuOTU1IDkuMDg0NzQgMTMuMjE3OCA4LjgyNDg5IDEzLjM0MjdDOC41NjUwNCAxMy40Njc1IDguMjU2NjEgMTMuNDMyNCA4LjAzMTQ4IDEzLjI1MjNMNC4wNzAyNSAxMC4wODMzSDFDMC41ODU3ODYgMTAuMDgzMyAwLjI1IDkuNzQ3NTUgMC4yNSA5LjMzMzM0VjQuMzMzMzRDMC4yNSAzLjkxOTEzIDAuNTg1Nzg2IDMuNTgzMzQgMSAzLjU4MzM0SDQuMDcwMjVMOC4wMzE0OCAwLjQxNDM1NUM4LjI1NjYxIDAuMjM0MjUzIDguNTY1MDQgMC4xOTkxNCA4LjgyNDg5IDAuMzI0MDNaTTcuNzUgMi41NjA0OEw0LjgwMTg1IDQuOTE4OTlDNC42Njg4NyA1LjAyNTM4IDQuNTAzNjQgNS4wODMzNCA0LjMzMzMzIDUuMDgzMzRIMS43NVY4LjU4MzM0SDQuMzMzMzNDNC41MDM2NCA4LjU4MzM0IDQuNjY4ODcgOC42NDEzIDQuODAxODUgOC43NDc2OUw3Ljc1IDExLjEwNjJWMi41NjA0OFonIGZpbGw9JyUyMzI2MjEzNicvJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTExLjk2OTggMy40MTEyNEMxMi4yNjI3IDMuMTE4MzkgMTIuNzM3NiAzLjExODQ2IDEzLjAzMDQgMy40MTE0QzEzLjk1MjEgNC4zMzM0MSAxNC40Njk5IDUuNTgzNzYgMTQuNDY5OSA2Ljg4NzQ4QzE0LjQ2OTkgOC4xOTEyMSAxMy45NTIxIDkuNDQxNTYgMTMuMDMwNCAxMC4zNjM2QzEyLjczNzYgMTAuNjU2NSAxMi4yNjI3IDEwLjY1NjYgMTEuOTY5OCAxMC4zNjM3QzExLjY3NjggMTAuMDcwOSAxMS42NzY3IDkuNTk2IDExLjk2OTYgOS4zMDMwN0MxMi42MTAxIDguNjYyMzUgMTIuOTY5OSA3Ljc5MzQ2IDEyLjk2OTkgNi44ODc0OEMxMi45Njk5IDUuOTgxNTEgMTIuNjEwMSA1LjExMjYyIDExLjk2OTYgNC40NzE5QzExLjY3NjcgNC4xNzg5NiAxMS42NzY4IDMuNzA0MDkgMTEuOTY5OCAzLjQxMTI0WicgZmlsbD0nJTIzMjYyMTM2Jy8lM0UlM0Mvc3ZnJTNFJTBBXCIpO1xufVxuXG4udmlkZW8tanMgLnZqcy12b2x1bWUtY29udHJvbDpob3ZlciAudmpzLW1vdXNlLWRpc3BsYXkge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi52aWRlby1qcyAudmpzLXBsYXktcHJvZ3Jlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcbn1cblxuLyogcG9zaXRpb24gdmlkZW8gcGxheWVyIGluc2lkZSB0aGUgY29udGFpbmVyICovXG4udmlkZW8tanMgLnZqcy10ZWNoIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbn1cblxuLnZpZGVvLWpzIC52anMtdGltZS10b29sdGlwIHtcbiAgcGFkZGluZzogMC4yNWVtIDAuNzVlbTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMzMzM7XG4gIGJhY2tncm91bmQ6ICNGQ0ZDRkQ7XG4gIGJvcmRlci1yYWRpdXM6IDk5cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyOiAxcHggc29saWQgI0UwRTBFQjtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRvcDogLTI1cHg7XG4gIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xufVxuXG4udmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzLnZqcy1zbGlkZXItYmFyIC52anMtdGltZS10b29sdGlwIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7XG59XG5cbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2wgLnZqcy1tb3VzZS1kaXNwbGF5IHtcbiAgei1pbmRleDogMjtcbn1cblxuLnVsLXZpZGVvLXBsYXllciB7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBoZWlnaHQ6IGF1dG87XG4gIGJvcmRlcjogMXB4IHNvbGlkICNFNkU2RTY7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJhY2tncm91bmQtY2xpcDogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnZpZGVvLWpzLnZqcy1mdWxsc2NyZWVuOm5vdCgudmpzLWlvcy1uYXRpdmUtZnMpIHtcbiAgYm9yZGVyOiBub25lO1xufVxuXG4jdWwtY2FyZC12aWRlb19fcGxheWVyX3JlY29yZGVyLXZpZGVvLXJlY29yZGVyLnZqcy1mdWxsc2NyZWVuIHtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi52aWRlby1qcyBkaXYudmpzLXByb2dyZXNzLWNvbnRyb2wge1xuICBtYXJnaW4tdG9wOiAtM3B4O1xufVxuXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtc2xpZGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI0IyQkJCRDtcbn1cblxuLnZqcy1yZWNvcmQudmlkZW8tanMgLnZqcy1jb250cm9sLnZqcy1idXR0b24udmpzLWZ1bGxzY3JlZW4tY29udHJvbCB7XG4gIHBvc2l0aW9uOnJlbGF0aXZlO1xufVxuXG4vKiBmaXggYSBzdWJ0bGUgbWlzYWxpZ25tZW50IGJ1ZyBvbiBjaXJjdWxhciBwbGF5IGNvbnRyb2wgYnV0dG9ucyAqL1xuLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDFweCwgMnB4KTtcbiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxcHgsIDVweCk7XG59XG5cbi52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtcGxheWluZyA+IC52anMtaWNvbi1wbGFjZWhvbGRlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMnB4KTtcbiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDRweCk7XG59XG5cbi8qIGZpeCBvcHBvc2l0ZSBtaXNhbGlnbm1lbnQgYnVnIG9uIG5vbmNpcmN1bGFyIGJ1dHRvbnMgKi9cbi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xufVxuXG4udmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGQ9J005LjgyMTQzIDIuNTQwMDRMMTIuMjYxNCAyLjU0MDA0QzEyLjkyNDIgMi41NDAwNCAxMy40NjE0IDMuMDc3MyAxMy40NjE0IDMuNzQwMDRMMTMuNDYxNCA2LjE4MDA0JyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J002LjE3OTU1IDEzLjQ2TDMuNzM5NTUgMTMuNDZDMy4wNzY4MSAxMy40NiAyLjUzOTU1IDEyLjkyMjcgMi41Mzk1NSAxMi4yNkwyLjUzOTU1IDkuODE5OTYnIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQ3BhdGggZD0nTTEyLjc3NzIgMy4yMjI2Nkw5LjM2NDc1IDYuNjM1MTYnIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQ3BhdGggZD0nTTYuMjk0MzQgOS43MDYwNUwyLjg4MTg0IDEzLjExODYnIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi52aWRlby1qcy52anMtZnVsbHNjcmVlbiAudmpzLWZ1bGxzY3JlZW4tY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcbiAgY29udGVudDogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGQ9J00xLjU4MyA5LjgxM0g1LjI1YTEgMSAwIDAxMSAxdjMuNjY2TTUuMzc1IDEwLjY4OEwxIDE1LjA2MU0xNC45MTcgNS44MTNIMTEuMjVhMSAxIDAgMDEtMS0xVjEuMTQ2TTE1LjA2MyAxbC00LjM3NiA0LjM3NScgc3Ryb2tlPSclMjMyNjIxMzYnIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtZW5kZWQgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtaWNvbi1yZXBsYXk6YmVmb3JlIHtcbiAgY29udGVudDogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHZpZXdCb3g9JzAgMCAxMiAxMicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTEwLjUzNjMgNi40MDIyNkwxLjkzOTU4IDEwLjcwMDZDMS42NDAzNyAxMC44NTAyIDEuMjg4MzMgMTAuNjMyNiAxLjI4ODMzIDEwLjI5ODFWMS43MDE0QzEuMjg4MzMgMS4zNjY4OCAxLjY0MDM3IDEuMTQ5MzEgMS45Mzk1OCAxLjI5ODkxTDEwLjUzNjMgNS41OTcyN0MxMC44NjggNS43NjMxMSAxMC44NjggNi4yMzY0MiAxMC41MzYzIDYuNDAyMjZaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXCIpO1xufVxuXG4udmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wudmpzLXBsYXlpbmcgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZqcy1pY29uLXBhdXNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NyZWN0IHg9JzMuNjE4ODUnIHk9JzIuMDYwNzQnIHdpZHRoPSczLjE2MTg1JyBoZWlnaHQ9JzExLjg4JyByeD0nMC45JyBmaWxsPSdibGFjaycgc3Ryb2tlPSclMjNFREVERUQnIHN0cm9rZS13aWR0aD0nMC42JyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQ3JlY3QgeD0nOS4yMTc5NycgeT0nMi4wNjA3NCcgd2lkdGg9JzMuMTYxODUnIGhlaWdodD0nMTEuODgnIHJ4PScwLjknIGZpbGw9J2JsYWNrJyBzdHJva2U9JyUyM0VERURFRCcgc3Ryb2tlLXdpZHRoPScwLjYnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRSUwQVwiKTtcbiAgcGFkZGluZzogMnB4O1xufVxuXG4udmpzLWVycm9yLWRpc3BsYXkge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4udWwtdmlkZW8tcGxheWVyLXZpZGVvIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4udWwtdmlkZW8tY29udGFpbmVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogYXV0bztcbiAgbGVmdDogMHB4O1xuICB0b3A6IDBweDtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG5cbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAvKiBJbnNpZGUgQXV0byBMYXlvdXQgKi9cblxuICBmbGV4OiBub25lO1xuICBvcmRlcjogMDtcbiAgZmxleC1ncm93OiAwO1xuICBtYXJnaW46IDEwcHggMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi52anMtcmVjb3JkIGJ1dHRvbi52anMtZGV2aWNlLWJ1dHRvbi52anMtY29udHJvbCB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgOTYpO1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIFJvYm90bywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgXCJBcHBsZSBDb2xvciBFbW9qaVwiLCBcIlNlZ29lIFVJIEVtb2ppXCIsIFwiU2Vnb2UgVUkgU3ltYm9sXCI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgbWFyZ2luOiAwO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBsaW5lLWhlaWdodDogMC42O1xuICBwYWRkaW5nOiAxMHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgei1pbmRleDogMztcbn1cblxuLnZqcy1yZWNvcmQgLnZqcy1kZXZpY2UtYnV0dG9uLnZqcy1jb250cm9sOmJlZm9yZSB7XG4gIGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50O1xuICBjb2xvcjogIzMzMztcbiAgY29udGVudDogXCJZb3VyIGJyb3dzZXIgbmVlZHMgdG8gYWNjZXNzIHlvdXIgY2FtZXJhIGFuZCBtaWNyb3Bob25lIGZvciB2aWRlbyByZWNvcmRpbmdcIjtcbiAgbGluZS1oZWlnaHQ6IDEzNSU7XG59XG5cbi52anMtcmVjb3JkIC52anMtZGV2aWNlLWJ1dHRvbi52anMtY29udHJvbC5wZXJtaXNzaW9uLWRlbmllZDpiZWZvcmUge1xuICBmb250LXNpemU6IDE2cHggIWltcG9ydGFudDtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGNvbnRlbnQ6IFwiVW5hYmxlIHRvIGFjY2VzcyB5b3VyIGNhbWVyYSBhbmQgbWljcm9waG9uZVwiO1xufVxuXG4udmpzLXJlY29yZCAudmpzLWRldmljZS1idXR0b24udmpzLWNvbnRyb2w6YWZ0ZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJhY2tncm91bmQ6ICNGMEYwRjU7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjb250ZW50OiBcIlJlcXVlc3QgUGVybWlzc2lvbnNcIjtcbiAgcGFkZGluZzogMWVtIDJlbTtcbiAgY29sb3I6ICMzMzM7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi52anMtcmVjb3JkIC52anMtZGV2aWNlLWJ1dHRvbi52anMtY29udHJvbC5wZXJtaXNzaW9uLWRlbmllZDphZnRlciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29udGVudDogXCJQbGVhc2UgZ28gdG8geW91ciBicm93c2VyIHNldHRpbmdzIGFuZCB1cGRhdGUgcGVybWlzc2lvbnMgdG8gZW5hYmxlIHJlY29yZGluZ1wiO1xuICBwYWRkaW5nOiAxZW07XG4gIGNvbG9yOiAjNEI1NzVEO1xuICBtYXJnaW46IDVweDtcbiAgbGluZS1oZWlnaHQ6IDEzNSU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnZqcy1jb250cm9sLnZqcy1idXR0b24udWwtdmlkZW8tcmVjb3JkZXItZGVsZXRlLWJ1dHRvbiwgLnZqcy1jb250cm9sLnZqcy1idXR0b24udWwtdmlkZW8tcmVjb3JkZXItdG9nZ2xlLWJ1dHRvbiwgLnZqcy1jb250cm9sLnZqcy1idXR0b24udWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24tYXVkaW8tb25seSwgLnZqcy1jb250cm9sLnZqcy1idXR0b24udWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi51bC12aWRlby1yZWNvcmRlci1kZWxldGUtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xuICBjb250ZW50OiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNOS4yMTIzNCA3LjM3NTQ5VjExLjExOTNNMi41MzkzMSA0LjI1NTk1SDEzLjQ1OTNIMi41MzkzMVpNNS41NzIzNCA0LjI1NTk1VjMuMDA4MzNDNS41NzIyMiAyLjg0NDMzIDUuNjAzNTQgMi42ODE5MiA1LjY2NDUgMi41MzAzOEM1LjcyNTQ2IDIuMzc4ODQgNS44MTQ4OCAyLjI0MTE1IDUuOTI3NjIgMi4xMjUxOUM2LjA0MDM3IDIuMDA5MjIgNi4xNzQyNCAxLjkxNzI2IDYuMzIxNTggMS44NTQ1NkM2LjQ2ODkyIDEuNzkxODUgNi42MjY4MyAxLjc1OTY0IDYuNzg2MjggMS43NTk3N0g5LjIxMjM0QzkuMzcxNzkgMS43NTk2NCA5LjUyOTcgMS43OTE4NSA5LjY3NzAzIDEuODU0NTZDOS44MjQzNyAxLjkxNzI2IDkuOTU4MjQgMi4wMDkyMiAxMC4wNzEgMi4xMjUxOUMxMC4xODM3IDIuMjQxMTUgMTAuMjczMiAyLjM3ODg0IDEwLjMzNDEgMi41MzAzOEMxMC4zOTUxIDIuNjgxOTIgMTAuNDI2NCAyLjg0NDMzIDEwLjQyNjMgMy4wMDgzM1Y0LjI1NTk1SDUuNTcyMzRaTTEyLjI0NjMgNC4yNTU5NVYxMi45OTEyQzEyLjI0NjMgMTMuMzIyMyAxMi4xMTg0IDEzLjYzOTkgMTEuODkwNyAxMy44NzQxQzExLjY2MzEgMTQuMTA4MiAxMS4zNTQzIDE0LjIzOTggMTEuMDMyMyAxNC4yMzk4SDQuOTY2MjhDNC42NDQzMiAxNC4yMzk4IDQuMzM1NTUgMTQuMTA4MiA0LjEwNzg5IDEzLjg3NDFDMy44ODAyMyAxMy42Mzk5IDMuNzUyMzQgMTMuMzIyMyAzLjc1MjM0IDEyLjk5MTJWNC4yNTU5NUgxMi4yNDYzWk02Ljc4NjI4IDcuMzc1NDlWMTEuMTE5M1Y3LjM3NTQ5Wicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRSUwQVwiKTtcbn1cblxuLnVsLXZpZGVvLXJlY29yZGVyLXRvZ2dsZS1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGQ9J004IDBDMTIuNDE4MyAwIDE2IDMuNTgxNzIgMTYgOEMxNiAxMi40MTgzIDEyLjQxODMgMTYgOCAxNkMzLjU4MTcyIDE2IDAgMTIuNDE4MyAwIDhDMCAzLjU4MTcyIDMuNTgxNzIgMCA4IDBaJyBmaWxsPSclMjNEMTUxNTMnLyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi51bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uLnVsLXJlY29yZGluZy1pbi1zZXNzaW9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xuICBjb250ZW50OiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxMicgaGVpZ2h0PScxMicgdmlld0JveD0nMCAwIDEyIDEyJyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNMTIgMTBMMTIgMkMxMiAwLjg5NTQzIDExLjEwNDYgLTQuODUzOTZlLTA3IDEwIC00LjM3MTE0ZS0wN0wyIC04Ljc0MjI4ZS0wOEMwLjg5NTQzIC0zLjkxNDA1ZS0wOCAtNC44NTM5NmUtMDcgMC44OTU0MzEgLTQuMzcxMTRlLTA3IDJMLTguNzQyMjhlLTA4IDEwQy0zLjkxNDA1ZS0wOCAxMS4xMDQ2IDAuODk1NDMxIDEyIDIgMTJMMTAgMTJDMTEuMTA0NiAxMiAxMiAxMS4xMDQ2IDEyIDEwWicgZmlsbD0nJTIzRDE1MTUzJy8lM0UlM0Mvc3ZnJTNFJTBBXCIpO1xufVxuXG4udWwtdmlkZW8tcmVjb3JkZXItZGVsZXRlLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsIC51bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgN3B4KTtcbiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDVweCk7XG59XG5cbi51bC1yZWNvcmRpbmctaW4tc2Vzc2lvbi51bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNXB4KTtcbn1cblxuLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDFweCwgN3B4KTtcbiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxcHgsIDZweCk7XG59XG5cbi51bC12aWRlby1yZWNvcmRlci1jYW1lcmEtb2ZmLWJ1dHRvbi1hdWRpby1vbmx5IC52anMtaWNvbi1wbGFjZWhvbGRlciB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC43NSkgdHJhbnNsYXRlKDFweCwgOHB4KTtcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuNzUpIHRyYW5zbGF0ZSgxcHgsIDhweCk7XG59XG5cbi8qIGZpeCBhIHN1YnRsZSBtaXNhbGlnbm1lbnQgYnVnIGZvciBmdWxsIHNjcmVlbiBidXR0b25zICovXG4udmpzLWZ1bGxzY3JlZW4gLnVsLXJlY29yZGluZy1pbi1zZXNzaW9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNnB4KTtcbiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDZweCk7XG59XG5cbi51bC12aWRlby1yZWNvcmRlci1jYW1lcmEtb2ZmLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcbiAgY29udGVudDogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHZpZXdCb3g9JzAgMCAxNiAxNicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ2cgY2xpcC1wYXRoPSd1cmwoJTIzY2xpcDBfMjY0NV80NjU0KSclM0UlM0NwYXRoIGQ9J00xNS4xNDkxIDQuNzVMMTAuNTk5MSA4TDE1LjE0OTEgMTEuMjVWNC43NVonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQ3BhdGggZD0nTTkuMjk5MTIgMy40NTAySDIuMTQ5MTJDMS40MzExNSAzLjQ1MDIgMC44NDkxMjEgNC4wMzIyMyAwLjg0OTEyMSA0Ljc1MDJWMTEuMjUwMkMwLjg0OTEyMSAxMS45NjgyIDEuNDMxMTUgMTIuNTUwMiAyLjE0OTEyIDEyLjU1MDJIOS4yOTkxMkMxMC4wMTcxIDEyLjU1MDIgMTAuNTk5MSAxMS45NjgyIDEwLjU5OTEgMTEuMjUwMlY0Ljc1MDJDMTAuNTk5MSA0LjAzMjIzIDEwLjAxNzEgMy40NTAyIDkuMjk5MTIgMy40NTAyWicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL2clM0UlM0NkZWZzJTNFJTNDY2xpcFBhdGggaWQ9J2NsaXAwXzI2NDVfNDY1NCclM0UlM0NyZWN0IHdpZHRoPScxNS42JyBoZWlnaHQ9JzE1LjYnIGZpbGw9J3doaXRlJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgwLjE5OTk1MSAwLjIwMDE5NSknLyUzRSUzQy9jbGlwUGF0aCUzRSUzQy9kZWZzJTNFJTNDL3N2ZyUzRVwiKTtcbn1cblxuLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uLWF1ZGlvLW9ubHkgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzIyJyBoZWlnaHQ9JzE1JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTS43NSAzQTIuNzUgMi43NSAwIDAxMy41LjI1aDkuMDgxQTIuNzUgMi43NSAwIDAxMTUuMzMxIDN2OWEyLjc1IDIuNzUgMCAwMS0yLjc1IDIuNzVIMy41QTIuNzUgMi43NSAwIDAxLjc1IDEyVjN6TTMuNSAxLjc1Yy0uNjkgMC0xLjI1LjU2LTEuMjUgMS4yNXY5YzAgLjY5LjU2IDEuMjUgMS4yNSAxLjI1aDkuMDgxYy42OSAwIDEuMjUtLjU2IDEuMjUtMS4yNVYzYzAtLjY5LS41Ni0xLjI1LTEuMjUtMS4yNUgzLjV6JyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBjbGlwLXJ1bGU9J2V2ZW5vZGQnIGQ9J00xNC41MyAyLjAzbC0xMiAxMi0xLjA2LTEuMDYgMTItMTIgMS4wNiAxLjA2ek0yMC44NyAxLjUyNWEuNzUuNzUgMCAwMS4zOC42NTJ2MTAuNTg4YS43NS43NSAwIDAxLTEuMTM0LjY0NGwtNS45Mi0zLjUzYS43NS43NSAwIDAxLS4zNjUtLjY0M3YtMy41M2EuNzUuNzUgMCAwMS4zNjYtLjY0NGw1LjkxOS0zLjUzYS43NS43NSAwIDAxLjc1NC0uMDA3em0tNS41MzkgNC42MDdWOC44MWw0LjQxOSAyLjYzNVYzLjQ5N2wtNC40MTkgMi42MzV6JyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi51bC11cGxvYWQtcHJvZ3Jlc3MtbGFiZWwge1xuICBwYWRkaW5nOiAwLjE1ZW0gMC43NWVtO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiAjMzMzO1xuICBiYWNrZ3JvdW5kOiAjRkNGQ0ZEO1xuICBib3JkZXItcmFkaXVzOiA5OXB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNFMEUwRUI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogNzVweDtcbiAgbGVmdDogY2FsYyg1MCUgLSA2NXB4KTtcbiAgd2lkdGg6IDEzMHB4O1xuICB6LWluZGV4OiA1O1xufVxuXG4udWwtdXBsb2FkLXByb2dyZXNzLWxhYmVsX190aW1lIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIG1hcmdpbi1sZWZ0OiAwLjhlbTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnVsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbF9fdGltZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlwiO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxMnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTBFMEVCO1xuICBtYXJnaW4tcmlnaHQ6IDAuOGVtO1xufVxuXG5Aa2V5ZnJhbWVzIGdyb3cge1xuICAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFQ0ZDO1xuICB9XG4gIDUwJSAge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTFERkY0O1xuICB9XG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUNGQztcbiAgfVxufVxuXG4udWwtYXVkaW8tcmVjb3JkZXItcGxhY2Vob2xkZXI6YmVmb3JlIHtcbiAgd2lkdGg6IDgwcHg7XG4gIGhlaWdodDogODBweDtcbiAgYm9yZGVyLXJhZGl1czogMTIwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNFRUVDRkM7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogY2FsYyg1MCUgLSA0MHB4KTtcbiAgdG9wOiBjYWxjKDUwJSAtIDQwcHgpO1xuICBhbmltYXRpb246IDZzIGluZmluaXRlIGdyb3c7XG4gIHRyYW5zZm9ybS1vcmlnaW46IDUwJSA2MCU7XG59XG5cbi51bC1hdWRpby1yZWNvcmRlci1wbGFjZWhvbGRlcjphZnRlciB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9Jzk4JyBoZWlnaHQ9Jzk4JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDbWFzayBpZD0nYScgbWFza1VuaXRzPSd1c2VyU3BhY2VPblVzZScgeD0nMCcgeT0nMCcgd2lkdGg9Jzk4JyBoZWlnaHQ9Jzk4JyUzRSUzQ2NpcmNsZSBjeD0nNDknIGN5PSc0OScgcj0nNDknIGZpbGw9JyUyM0VERUNGOCcvJTNFJTNDL21hc2slM0UlM0NnIG1hc2s9J3VybCglMjNhKSclM0UlM0NjaXJjbGUgY3g9JzQ5JyBjeT0nNDknIHI9JzUwJyBmaWxsPSclMjM2NDVDQzInLyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBjbGlwLXJ1bGU9J2V2ZW5vZGQnIGQ9J00xMS40MjIgODEuODEyYzUuNDA1LTE1LjU0NyAyMC4xODctMjYuNzA2IDM3LjU3Ni0yNi43MDYgMTcuMzkgMCAzMi4xNzIgMTEuMTU5IDM3LjU3NyAyNi43MDctOS4xNjQgMTAuNDMtMjIuNjAxIDE3LjAxMy0zNy41NzYgMTcuMDEzLTE0Ljk3NiAwLTI4LjQxNC02LjU4My0zNy41NzctMTcuMDE0eicgZmlsbD0nJTIzZmZmJyBmaWxsLW9wYWNpdHk9Jy42Jy8lM0UlM0NjaXJjbGUgY3g9JzQ5JyBjeT0nMjknIHI9JzE3JyBmaWxsPSclMjNmZmYnIGZpbGwtb3BhY2l0eT0nLjcnLyUzRSUzQy9nJTNFJTNDL3N2ZyUzRVwiKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiA1MCU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMC42KTtcbn1cblxuLnVsLWF1ZGlvLXJlY29yZGVyLXBsYWNlaG9sZGVyIHtcbiAgbWluLWhlaWdodDogMTUwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZkO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4udmpzLWZ1bGxzY3JlZW4gLnVsLWF1ZGlvLXJlY29yZGVyLXBsYWNlaG9sZGVyIHtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbn1cblxuQGtleWZyYW1lcyBncm93IHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUNGQztcbiAgfVxuICA1MCUgIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMik7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxREZGNDtcbiAgfVxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUVDRkM7XG4gIH1cbn1cblxuLnZqcy1mdWxsc2NyZWVuIC51bC1jb250cm9sLXBhbmVsIHtcbiAgaGVpZ2h0OiA4MHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODtcbn1cblxuLnVsLWJ1dHRvbnMtcGFuZWwge1xuICBtYXJnaW46IDEwcHg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4udmpzLXBsYXliYWNrLXJhdGUgLnZqcy1wbGF5YmFjay1yYXRlLXZhbHVlIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAzcHgpO1xufVxuXG4udmpzLXBsYXliYWNrLXJhdGUgLnZqcy1tZW51IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTZweCwgMTJweCk7XG4gIHBvc2l0aW9uOiB1bnNldDtcbn1cblxuLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IHtcbiAgbWFyZ2luLWJvdHRvbTogdW5zZXQ7XG59XG5cbi52anMtbWVudSBsaSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgcGFkZGluZzogNXB4IDA7XG59XG5cbi52anMtbWVudSBsaS52anMtc2VsZWN0ZWQge1xuICBjb2xvcjogbGlnaHRncmF5O1xufVxuXG4udmpzLW1lbnUgbGkudmpzLW1lbnUtaXRlbTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG59XG5cbi52anMtZnVsbHNjcmVlbiAudWwtYnV0dG9ucy1wYW5lbCB7XG4gIHRvcDogY2FsYyg1MCUgLSAzMHB4KTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4udmpzLWZ1bGxzY3JlZW4gLnZqcy1yZWNvcmQtaW5kaWNhdG9yLnZqcy1jb250cm9sIHtcbiAgYm90dG9tOiA5MHB4ICFpbXBvcnRhbnQ7XG59XG5cbi52anMtcmVjb3JkLnZpZGVvLWpzIGRpdi52anMtY29udHJvbC52anMtcmVjb3JkLWluZGljYXRvciB7XG4gIHBhZGRpbmc6IDAuM2VtIDAuNzVlbSAwLjE1ZW0gMTVweDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogIzMzMztcbiAgYmFja2dyb3VuZDogI0ZDRkNGRDtcbiAgYm9yZGVyLXJhZGl1czogOTlweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXI6IDFweCBzb2xpZCAjRTBFMEVCO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDc1cHg7XG4gIHRvcDogYXV0bztcbiAgbGVmdDogY2FsYyg1MCUgLSAyMXB4KTtcbiAgd2lkdGg6IDQzcHg7XG4gIGhlaWdodDogMTZweDtcbiAgei1pbmRleDogNDtcbn1cblxuLnZqcy1yZWNvcmQudmlkZW8tanMgZGl2LnZqcy1jb250cm9sLnZqcy1yZWNvcmQtaW5kaWNhdG9yOmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI0VCNTc1NztcbiAgd2lkdGg6IDZweDtcbiAgaGVpZ2h0OiA2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYW5pbWF0aW9uOiBub25lO1xuICB0b3A6IDRweDtcbiAgbGVmdDogNXB4O1xufVxuXG4udmpzLXJlY29yZC52aWRlby1qcyBkaXYudmpzLWNvbnRyb2wudmpzLXJlY29yZC1pbmRpY2F0b3I6YmVmb3JlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmb250LXNpemU6IDlweDtcbiAgYW5pbWF0aW9uOiBub25lO1xuICBvcGFjaXR5OiAxO1xuICBjb2xvcjogIzMzMztcbiAgdG9wOiBhdXRvO1xuICBsZWZ0OiBhdXRvO1xufVxuXG4udWwtdmlkZW8tcGxheWVyLWxvYWRpbmcge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDZyZW07XG4gIGhlaWdodDogNnJlbTtcblxufVxuLnVsLXZpZGVvLXBsYXllci1sb2FkaW5nIGRpdiB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiA4MCU7XG4gIGhlaWdodDogODAlO1xuICBtYXJnaW46IDVweDtcbiAgYm9yZGVyOiA1cHggc29saWQgIzY2NjtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBhbmltYXRpb246IGxkcy1yaW5nIDEuMnMgY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC41LCAxKSBpbmZpbml0ZTtcbiAgYm9yZGVyLWNvbG9yOiAjNjY2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xufVxuXG4uZmlyc3Qge1xuICBhbmltYXRpb24tZGVsYXk6IC0wLjQ1cztcbn1cbi5zZWNvbmQge1xuICBhbmltYXRpb24tZGVsYXk6IC0wLjNzO1xufVxuLnRoaXJkIHtcbiAgYW5pbWF0aW9uLWRlbGF5OiAtMC4xNXM7XG59XG5cbkBrZXlmcmFtZXMgbGRzLXJpbmcge1xuICAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxufVxuXG4udWwtdmlkZW8tYnRuIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNFNkU2RTY7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjAyKTtcbiAgcGFkZGluZzogOHB4O1xuICBmb250LXdlaWdodDogNTAwO1xuICBmb250LXNpemU6IDE1cHg7XG59XG5cbi51bC1yZWNvcmQtcmVzcG9uc2UtYnRuOmJlZm9yZSwgLnVsLXJlY29yZC1yZXNwb25zZS1idG46YWZ0ZXIsIC51bC1iYWNrLXF1ZXN0aW9uLWJ0bjpiZWZvcmUsIC51bC1iYWNrLXF1ZXN0aW9uLWJ0bjphZnRlciB7XG4gIG1hcmdpbjogMCA1cHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi51bC1yZWNvcmQtcmVzcG9uc2UtYnRuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NnIGNsaXAtcGF0aD0ndXJsKCUyM2NsaXAwXzI2NDVfNDY1NCknJTNFJTNDcGF0aCBkPSdNMTUuMTQ5MSA0Ljc1TDEwLjU5OTEgOEwxNS4xNDkxIDExLjI1VjQuNzVaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J005LjI5OTEyIDMuNDUwMkgyLjE0OTEyQzEuNDMxMTUgMy40NTAyIDAuODQ5MTIxIDQuMDMyMjMgMC44NDkxMjEgNC43NTAyVjExLjI1MDJDMC44NDkxMjEgMTEuOTY4MiAxLjQzMTE1IDEyLjU1MDIgMi4xNDkxMiAxMi41NTAySDkuMjk5MTJDMTAuMDE3MSAxMi41NTAyIDEwLjU5OTEgMTEuOTY4MiAxMC41OTkxIDExLjI1MDJWNC43NTAyQzEwLjU5OTEgNC4wMzIyMyAxMC4wMTcxIDMuNDUwMiA5LjI5OTEyIDMuNDUwMlonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9nJTNFJTNDZGVmcyUzRSUzQ2NsaXBQYXRoIGlkPSdjbGlwMF8yNjQ1XzQ2NTQnJTNFJTNDcmVjdCB3aWR0aD0nMTUuNicgaGVpZ2h0PScxNS42JyBmaWxsPSd3aGl0ZScgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMC4xOTk5NTEgMC4yMDAxOTUpJy8lM0UlM0MvY2xpcFBhdGglM0UlM0MvZGVmcyUzRSUzQy9zdmclM0VcIik7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAycHgpO1xufVxuXG4udWwtcmVjb3JkLXJlc3BvbnNlLWJ0bjphZnRlciB7XG4gIGNvbnRlbnQ6ICdSZWNvcmQgeW91ciBSZXNwb25zZSc7XG59XG5cbi51bC1iYWNrLXF1ZXN0aW9uLWJ0bjpiZWZvcmUge1xuICBjb250ZW50OiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNScgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE1IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNMTMuODc1NyA4LjIyMzYxTDEuMTExOCAxNC42MDU2QzAuOTQ1NTc4IDE0LjY4ODcgMC43NSAxNC41Njc4IDAuNzUgMTQuMzgyVjEuNjE4MDNDMC43NSAxLjQzMjE5IDAuOTQ1NTc5IDEuMzExMzEgMS4xMTE4IDEuMzk0NDNMMTMuODc1NyA3Ljc3NjM5QzE0LjA2IDcuODY4NTIgMTQuMDYgOC4xMzE0OCAxMy44NzU3IDguMjIzNjFaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXCIpO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC44NSkgdHJhbnNsYXRlKDAsIDFweCk7XG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgwLjg1KSB0cmFuc2xhdGUoMCwgMnB4KTtcbn1cblxuLnVsLWJhY2stcXVlc3Rpb24tYnRuOmFmdGVyIHtcbiAgY29udGVudDogJ0JhY2sgdG8gUXVlc3Rpb24nO1xufVxuXG4uaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi52aXNpYmxlIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbiAgYW5pbWF0aW9uOiBmYWRlIDAuM3M7XG59XG5cbkBrZXlmcmFtZXMgZmFkZSB7XG4gIDAlIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gIH1cblxuICAxMDAlIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuI3VsLXJlY29yZGluZy1jb3VudGRvd24tc2NyZWVuIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgY29sb3I6IGJsYWNrO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDE1cHg7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4udWwtY291bnRkb3duLXRleHQge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjVweCk7XG59XG5cbi52anMtZnVsbHNjcmVlbiA+ICN1bC1yZWNvcmRpbmctY291bnRkb3duLXNjcmVlbiB7XG4gIGZvbnQtc2l6ZTogMjVweDtcbiAgdHJhbnNmb3JtOiB1bnNldDtcbn1cblxuLnZqcy1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuI3VsLVNwZWVkIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMzVweCk7XG59XG5cbi52anMtcG9zdGVyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdW5zZXQ7XG59XG4ifV0sWnQ9Ii12aWRlby1wbGF5ZXIiLCR0PSItdmlkZW8tcmVjb3JkZXIiO2xldCBZdCxLdDtjb25zdCBKdD1hc3luYyh0LGUsbixyLG8saSk9Pntjb25zdCBhPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxjPXtzY3JlZW5XaWR0aDp3aW5kb3cuc2NyZWVuLndpZHRoLHNjcmVlbkhlaWdodDp3aW5kb3cuc2NyZWVuLmhlaWdodCxjbGllbnRXaWR0aDphLmNsaWVudFdpZHRoLGNsaWVudEhlaWdodDphLmNsaWVudEhlaWdodCxsb2NhdGlvbjp3aW5kb3cubG9jYXRpb24uaHJlZixsYW5ndWFnZTpuYXZpZ2F0b3IubGFuZ3VhZ2V9LHM9e2FjdGlvbjplLGVycjp7bWVzc2FnZTp0Lm1lc3NhZ2Usc3RhY2s6dC5zdGFja30sbWV0YTpjLHZpZDpvLGVudklkOml9Oyhhd2FpdCBmZXRjaChgJHtufS9zZGsvMS9lcnJvcnNgLHttZXRob2Q6IlBPU1QiLGNhY2hlOiJuby1jYWNoZSIsaGVhZGVyczp7Li4uciwidXNlcmxlYXAtcGxhdGZvcm0iOiJ2aWRlb19yZWNvcmRlciIsIngtdWwtZXJyb3IiOndpbmRvdy5idG9hKGB1c2VybGVhcC0ke0RhdGUubm93KCl9LWVycm9yYCl9LGJvZHk6SlNPTi5zdHJpbmdpZnkocyl9KSkub2t8fGNvbnNvbGUud2FybigiW1VzZXJMZWFwXSAoRVJSLTQ0NCkgRmFpbGVkIHRvIHJlcG9ydCBlcnJvciB0byBBUEkiLHQpfSxYdD0odCxlLG4pPT57aWYoMD09PWUubGVuZ3RoKXJldHVybiBuJiZuKCk7UHJvbWlzZS5hbGwoZS5yZWR1Y2UoKChlLG4pPT4oZS5wdXNoKCgodCx7dHlwZTplLGNvbnRlbnQ6bn0pPT5uZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtsZXQgaTsic2NyaXB0Ij09PWU/KGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksaS5zcmM9bik6ImxpbmsiPT09ZT8oaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksaS5yZWw9InN0eWxlc2hlZXQiLGkuaHJlZj1uLGkudHlwZT0idGV4dC9jc3MiKTooaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGkuaW5uZXJIVE1MPW4pLGkub25sb2FkPWZ1bmN0aW9uKCl7cihuKX0saS5vbmVycm9yPWZ1bmN0aW9uKCl7byhuKX0saS5hc3luYz0hMSxpLmlkPWJ0b2EobiksdC5hcHBlbmRDaGlsZChpKX0pKSkodCxuKSksZSkpLFtdKSkudGhlbigoKCk9PntuJiZuKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2NvbnNvbGUubG9nKHQrIiBmYWlsZWQgdG8gbG9hZCIpfSkpfSxRdD0odCxlLG4pPT57aWYoInN0YXJ0Ij09PWUmJih0LnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiKSwibm9uZSI9PT1lKXQuc3R5bGUudmlzaWJpbGl0eT16dDtlbHNlIGlmKCJzdWNjZXNzIj09PWUpdC5zdHlsZS52aXNpYmlsaXR5PXp0LHQuaW5uZXJIVE1MPSJVcGxvYWQgc3VjY2VlZGVkISI7ZWxzZXtjb25zdCBlPU1hdGgucm91bmQocGFyc2VGbG9hdChuKSk7dC5pbm5lckhUTUw9YFVwbG9hZGluZyA8c3BhbiBjbGFzcz0idWwtdXBsb2FkLXByb2dyZXNzLWxhYmVsX190aW1lIj4ke2V9JTwvc3Bhbj5gLHQuc3R5bGUuYmFja2dyb3VuZD1gbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjRTBFMEVCIDAlLCAjRTBFMEVCICR7ZX0lLCAjRkNGQ0ZEICR7ZX0lLCAjRkNGQ0ZEIDEwMCUpYH19LHRlPSh0LGUpPT57Y29uc3Qgbj1uZXcod2luZG93LnZpZGVvanMuZ2V0Q29tcG9uZW50KCJDb21wb25lbnQiKSkodCk7cmV0dXJuIG4uYWRkQ2xhc3MoInVsLWJ1dHRvbnMtcGFuZWwiKSxlLm1hcCgodD0+e24uYWRkQ2hpbGQodCl9KSksZWUobiksbn0sZWU9dD0+e3QuY2hpbGRyZW4oKS5mb3JFYWNoKCh0PT57aWYoaGVbdC5uYW1lX10pe2NvbnN0IGU9bmUoaGVbdC5uYW1lX10sYHVsLSR7aGVbdC5uYW1lX119YCk7dC5lbF8uYXBwZW5kQ2hpbGQoZSl9fSkpfSxuZT0odCxlPSIiKT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBuLmNsYXNzTmFtZT0idWwtYnV0dG9uLXRleHQiLG4uaW5uZXJIVE1MPXQsbi5pZD1lLG59LHJlPSh0LGUsbixyLG89ITEpPT57dC5hZGRDbGFzcygidWwtdmlkZW8tcGxheWVyIik7Y29uc3QgaT1uZXcod2luZG93LnZpZGVvanMuZ2V0Q29tcG9uZW50KCJDb21wb25lbnQiKSkodCk7aS5hZGRDbGFzcygidWwtY29udHJvbC1wYW5lbCIpLHQucHJvZ3Jlc3NCYXI9aS5hZGRDaGlsZCgiUHJvZ3Jlc3NDb250cm9sIiksbiYmdC5zcmMobiksdC5hdWRpb1BsYXllclBsYWNlaG9sZGVyPW5ldyh3aW5kb3cudmlkZW9qcy5nZXRDb21wb25lbnQoIkNvbXBvbmVudCIpKSh0KSx0LmF1ZGlvUGxheWVyUGxhY2Vob2xkZXIuYWRkQ2xhc3MoInVsLWF1ZGlvLXJlY29yZGVyLXBsYWNlaG9sZGVyIik7Y29uc3QgYT1uJiZuLnNyYz9kZShuLnNyYyk6bnVsbDshbnx8IW8mJmE/KHQuYXVkaW9QbGF5ZXJQbGFjZWhvbGRlci5oaWRlKCksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dC5pZCgpfV9odG1sNV9hcGlgKS5zdHlsZS5oZWlnaHQ9IjEwMCUiLGEmJnQucG9zdGVyKGEpKToodC5jaGlsZHJlbigpWzBdLmNsYXNzTGlzdC5hZGQoInZqcy1oaWRkZW4iKSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0LmlkKCl9X2h0bWw1X2FwaWApLnN0eWxlLmhlaWdodD0iMHB4IiksdC5vbigicGxheSIsKCgpPT57b3x8IW58fGF8fHNlKHQsITEpfSkpLHQuYWRkQ2hpbGQodC5hdWRpb1BsYXllclBsYWNlaG9sZGVyLHt9LDEpLGkuYWRkQ2hpbGQoZSksdC5hZGRDaGlsZChpKSxyJiZyKHQpfSxvZT0odCxlLG4scixvLGksYSxjPSExKT0+e0t0PURhdGUubm93KCk7Y29uc3Qgcz13aW5kb3cudmlkZW9qcyx1PXMoZSx7Y29udHJvbHM6ITEsYmlnUGxheUJ1dHRvbjohMSxmbHVpZDohMSx3aWR0aDoxMjgwLGhlaWdodDo3MjAscGxheXNpbmxpbmU6ITAscGx1Z2luczp7cmVjb3JkOnthdWRpbzohMCx2aWRlbzp7bWFuZGF0b3J5OnttaW5XaWR0aDoxMjgwLG1pbkhlaWdodDo3MjB9fSxmcmFtZVdpZHRoOjEyODAsZnJhbWVIZWlnaHQ6NzIwLG1heExlbmd0aDo2MDAsYXV0b011dGVEZXZpY2U6ITB9fX0pO3UucGF5bG9hZD1uO2NvbnN0IGw9dD0+e2NvbnN0IGU9VnQsbj1WdCsiLWF1ZGlvLW9ubHkiO1F0KHUudXBsb2FkUHJvZ3Jlc3NMYWJlbCwibm9uZSIpLFl0JiZZdC5zdGFydFRpbWU+PUt0JiZZdC5hYm9ydCgpO2NvbnN0IHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVsLWNhbWVyYS1idXR0b24iKTt0Pyh1LmNoaWxkcmVuKClbMF0uY2xhc3NMaXN0LmFkZCgidmpzLWhpZGRlbiIpLGgucmVtb3ZlQ2xhc3MoZSksaC5hZGRDbGFzcyhuKSxyLmlubmVySFRNTD1oZS5UdXJuT25DYW1lcmEsdS5hdWRpb1BsYXllclBsYWNlaG9sZGVyLnJlbW92ZUNsYXNzKCJ2anMtaGlkZGVuIiksd2luZG93Lm5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHt2aWRlbzohMCxhdWRpbzohMH0pLnRoZW4oKHQ9Pnt1LnJlY29yZCgpLm9uRGV2aWNlUmVhZHkodCksdC5nZXRWaWRlb1RyYWNrcygpLmZvckVhY2goKHQ9Pnt0LnN0b3AoKX0pKX0pKS5jYXRjaCh1LnJlY29yZCgpLm9uRGV2aWNlRXJyb3IuYmluZCh1LnJlY29yZCgpKSkpOih1LmNoaWxkcmVuKClbMF0uY2xhc3NMaXN0LnJlbW92ZSgidmpzLWhpZGRlbiIpLHUucmVjb3JkKCkuZ2V0RGV2aWNlKCksaC5yZW1vdmVDbGFzcyhuKSxoLmFkZENsYXNzKGUpLHIuaW5uZXJIVE1MPWhlLlR1cm5PZmZDYW1lcmEsdS5hdWRpb1BsYXllclBsYWNlaG9sZGVyLmFkZENsYXNzKCJ2anMtaGlkZGVuIikpfSxmPW5ldyhzLmdldENvbXBvbmVudCgiQnV0dG9uIikpKHUse2NsaWNrSGFuZGxlcjooKT0+e2YuaGFzQ2xhc3MoenQpfHwobCh1LmNhbWVyYU9mZiksbyhwZS5ERUxFVEUse30pLGgucmVtb3ZlQ2xhc3MoenQpLGYuYWRkQ2xhc3MoenQpKX19KTtmLmFkZENsYXNzKCJ1bC12aWRlby1yZWNvcmRlci1kZWxldGUtYnV0dG9uIiksZi5lbF8uYXBwZW5kQ2hpbGQobmUoaGUuRGVsZXRlQnV0dG9uLCJ1bC1kZWxldGUtYnV0dG9uIikpO2NvbnN0IGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkscD0oKT0+e2QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2anMtZnVsbHNjcmVlbiIpJiZ1LmNhbWVyYU9mZj9kLnN0eWxlLmRpc3BsYXk9InRhYmxlIjpkLnN0eWxlLmRpc3BsYXk9ImZsZXgifTtwKCk7Y29uc3QgaD1uZXcocy5nZXRDb21wb25lbnQoIkJ1dHRvbiIpKSh1LHtjbGlja0hhbmRsZXI6KCk9Pnt1LnJlY29yZCgpLmlzUmVjb3JkaW5nKCl8fCh1LmNhbWVyYU9mZj0hdS5jYW1lcmFPZmYsbCh1LmNhbWVyYU9mZiksIWYuaGFzQ2xhc3MoenQpJiZmLmFkZENsYXNzKHp0KSxvKHBlLkRFTEVURSx7fSkscCgpKX19KTtoLmFkZENsYXNzKFZ0KSxoLmVsXy5hcHBlbmRDaGlsZChuZShoZS5UdXJuT2ZmQ2FtZXJhLCJ1bC1jYW1lcmEtYnV0dG9uIikpO2NvbnN0IHY9bmV3KHMuZ2V0Q29tcG9uZW50KCJCdXR0b24iKSkodSx7Y2xpY2tIYW5kbGVyOigpPT57Y29uc3QgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidWwtcmVjb3JkZXItdG9nZ2xlIik7aWYodS5yZWNvcmQoKS5pc1JlY29yZGluZygpKXUucmVjb3JkKCkuc3RvcCgpLHQmJih0LmlubmVySFRNTD1oZS5SZWNvcmRCdXR0b24pLHYucmVtb3ZlQ2xhc3MocXQpLGYucmVtb3ZlQ2xhc3MoenQpO2Vsc2V7Y29uc3QgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidWwtcmVjb3JkaW5nLWNvdW50ZG93bi1zY3JlZW4iKTtpZihlKWUucmVtb3ZlKCksdCYmKHQuaW5uZXJIVE1MPWhlLlJlY29yZEJ1dHRvbiksbCh1LmNhbWVyYU9mZiksbyhwZS5ERUxFVEUse30pLGgucmVtb3ZlQ2xhc3MoenQpLGYuYWRkQ2xhc3MoenQpLHYucmVtb3ZlQ2xhc3MocXQpLG0uc2hvdygpO2Vsc2V7di5hZGRDbGFzcyhxdCksbS5oaWRlKCksaC5hZGRDbGFzcyh6dCksZi5hZGRDbGFzcyh6dCksdCYmKHQuaW5uZXJIVE1MPWhlLlN0b3BCdXR0b24pO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5pZD0idWwtcmVjb3JkaW5nLWNvdW50ZG93bi1zY3JlZW4iLGQuaW5zZXJ0QmVmb3JlKGUsZC5jaGlsZHJlblsxXSksZS5zdHlsZS5oZWlnaHQ9YCR7ZC5vZmZzZXRIZWlnaHR9cHhgLGllKHUsMyl9fX19KTt2LmFkZENsYXNzKCJ1bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uIiksdi5lbF8uYXBwZW5kQ2hpbGQobmUoaGUuUmVjb3JkQnV0dG9uLCJ1bC1yZWNvcmRlci10b2dnbGUiKSk7Y29uc3QgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7Zy5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLGcuY2xhc3NOYW1lPSJ1bC11cGxvYWQtcHJvZ3Jlc3MtbGFiZWwiLHQuYXBwZW5kQ2hpbGQoZyksdS51cGxvYWRQcm9ncmVzc0xhYmVsPWc7Y29uc3QgeT10ZSh1LFtmLGgsIlBsYXlUb2dnbGUiLHYsIkZ1bGxzY3JlZW5Ub2dnbGUiXSksbT15LmNoaWxkcmVuKCkuZmluZCgodD0+IkZ1bGxzY3JlZW5Ub2dnbGUiPT09dC5uYW1lXykpO20uaGFzQ2xhc3MoInZqcy1kaXNhYmxlZCIpJiZtLmhpZGUoKTtjb25zdCBiPXkuY2hpbGRyZW4oKS5maW5kKCh0PT4iUGxheVRvZ2dsZSI9PT10Lm5hbWVfKSk7Yi5oaWRlKCksaSYmaC5hZGRDbGFzcyh6dCksIWkmJmYuYWRkQ2xhc3MoenQpLHJlKHUseSxpLCExLGMpLHUub24oInN0b3BSZWNvcmQiLCgoKT0+e3YuaGlkZSgpLGIuc2hvdygpLG0uc2hvdygpLGYucmVtb3ZlQ2xhc3MoenQpfSkpLHUub24oImRldmljZVJlYWR5IiwoKCk9Pnt2LnNob3coKSxiLmhpZGUoKSxmLmFkZENsYXNzKHp0KX0pKSwoKHQsZSxuLHIsbyk9Pnt0Lm9uKCJkZXZpY2VFcnJvciIsKGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coImRldmljZSBlcnJvcjoiLHQuZGV2aWNlRXJyb3JDb2RlKSwiUGVybWlzc2lvbiBkZW5pZWQiPT09dC5kZXZpY2VFcnJvckNvZGUubWVzc2FnZT8odC5kZXZpY2VCdXR0b24uYWRkQ2xhc3MoInBlcm1pc3Npb24tZGVuaWVkIiksbiYmbihwZS5FUlJPUix7dHlwZTpwZS5QRVJNSVNTSU9OX0RFTklFRH0pKToobiYmbihwZS5FUlJPUix7dHlwZTpwZS5PVEhFUn0pLEp0KG5ldyBFcnJvcih0LmRldmljZUVycm9yQ29kZS5tZXNzYWdlKSwicmVjb3JkZXJEZXZpY2VFcnJvciIsZSxvLHQucGF5bG9hZC52aXNpdG9ySWQsdC5wYXlsb2FkLmVudklkKSl9KSksdC5vbigiZXJyb3IiLChmdW5jdGlvbihuLHIpe0p0KHJ8fHQuZXJyb3IoKSwicmVjb3JkZXJFcnJvciIsZSxvLHQucGF5bG9hZC52aXNpdG9ySWQsdC5wYXlsb2FkLmVudklkKX0pKSx0Lm9uKCJzdGFydFJlY29yZCIsKGZ1bmN0aW9uKGUsbil7cih0LnVwbG9hZFByb2dyZXNzTGFiZWwsIm5vbmUiKX0pKSx0Lm9uKCJmaW5pc2hSZWNvcmQiLChhc3luYyBmdW5jdGlvbigpe3IodC51cGxvYWRQcm9ncmVzc0xhYmVsLCJzdGFydCIsMCk7Y29uc3R7c3VydmV5SWQ6aSxxdWVzdGlvbklkOmEscmVzcG9uc2VHcm91cFVpZDpjLHZpc2l0b3JJZDpzLGVudklkOnV9PXQucGF5bG9hZDtpZighaSl7Y29uc3QgdD0iaW50ZXJuYWwgZXJyb3I6IG1pc3NpbmcgZmllbGRzIGluIHBheWxvYWQiO3JldHVybiBuJiZuKHBlLkVSUk9SLHt0eXBlOnBlLk9USEVSfSksSnQobmV3IEVycm9yKHQpLCJmaW5pc2hSZWNvcmQiLGUsbyxzLHUpLG51bGx9dC5yZWNvcmQoKS5zdG9wRGV2aWNlKCk7Y29uc3QgbD10LmNhbWVyYU9mZj9wZS5NRURJQV9UWVBFX0FVRElPOnBlLk1FRElBX1RZUEVfVklERU8sZj17c3VydmV5SWQ6aSx1cGRhdGVkQXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLG1lZGlhVHlwZTpsfTthJiYoZi5xdWVzdGlvbklkPWEpLGMmJihmLnJlc3BvbnNlR3JvdXBVaWQ9YykscyYmKGYudmlzaXRvcklkPXMpO2NvbnN0IGQ9YXdhaXQoYXN5bmMoKT0+e2NvbnN0IHI9YXdhaXQgZmV0Y2goYCR7ZX0vMi9lbnZpcm9ubWVudHMvaW50ZWdyYXRpb25zL3VwbG9hZGAse21ldGhvZDoiUE9TVCIsY2FjaGU6Im5vLWNhY2hlIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZil9KTtpZihyLm9rKXtjb25zdCB0PWF3YWl0IHIuanNvbigpO3JldHVybiBuJiZuKHBlLlVQTE9BRF9TVEFSVEVELHtbcGUuVVBMT0FEX0lEXTp0LnVwbG9hZC5pZCxbcGUuTUVESUFfVFlQRV06bH0pLHQudXBsb2FkLnVybH1yZXR1cm4gbiYmbihwZS5FUlJPUix7dHlwZTpwZS5PVEhFUixyZXNwb25zZTpyfSksSnQobmV3IEVycm9yKCJmYWlsZWQgdG8gZ2V0IHVwbG9hZCByZXNwb25zZSB3aXRoIHVybCIpLCJmaW5pc2hSZWNvcmQiLGUsbyx0LnBheWxvYWQudmlzaXRvcklkLHQucGF5bG9hZC5lbnZJZCksbnVsbH0pKCk7ZCYmKFl0PXdpbmRvdy5VcENodW5rLmNyZWF0ZVVwbG9hZCh7ZW5kcG9pbnQ6ZCxmaWxlOm5ldyBGaWxlKFt0LnJlY29yZGVkRGF0YV0sYHJlY29yZGluZyAke2x9ICR7RGF0ZS5ub3coKX1gKSxjaHVua1NpemU6NTEyMH0pLFl0LnN0YXJ0VGltZT1EYXRlLm5vdygpLFl0Lm9uKCJlcnJvciIsKG49PntyKHQudXBsb2FkUHJvZ3Jlc3NMYWJlbCwibm9uZSIpLEp0KG4sImZpbmlzaFJlY29yZCIsZSxvLHQucGF5bG9hZC52aXNpdG9ySWQsdC5wYXlsb2FkLmVudklkKX0pKSxZdC5vbigicHJvZ3Jlc3MiLChlPT57cih0LnVwbG9hZFByb2dyZXNzTGFiZWwsInByb2dyZXNzIixlLmRldGFpbCl9KSksWXQub24oInN1Y2Nlc3MiLCgoKT0+e3IodC51cGxvYWRQcm9ncmVzc0xhYmVsLCJzdWNjZXNzIiksbiYmbihwZS5VUExPQURfRklOSVNIRUQpfSkpKX0pKX0pKHUscixvLFF0LGEpLGkmJih1LmRldmljZUJ1dHRvbiYmdS5kZXZpY2VCdXR0b24uaGlkZSgpLHUuc3JjKGkpLGIuc2hvdygpLHYuaGlkZSgpLGYucmVtb3ZlQ2xhc3MoenQpKTtjb25zdCB4PVt7bmFtZToibWljcm9waG9uZSJ9XTshdS5jYW1lcmFPZmYmJngucHVzaCh7bmFtZToiY2FtZXJhIn0pLFByb21pc2UuYWxsKHgubWFwKCh0PT5uYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkodCkpKSkudGhlbigodD0+e3QucmVkdWNlKCgodCxlKT0+dCYiZ3JhbnRlZCI9PT1lLnN0YXRlKSwhMCkmJnUmJih1LmRldmljZUJ1dHRvbiYmdS5kZXZpY2VCdXR0b24uaGlkZSgpLCFpJiZ1LnJlY29yZCgpLmdldERldmljZSgpKX0pKS5jYXRjaCgodD0+e30pKX0saWU9KHQsZT0zKT0+e2NvbnN0IG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVsLXJlY29yZGluZy1jb3VudGRvd24tc2NyZWVuIik7biYmMD09PWU/KG4ucmVtb3ZlKCksdC5yZWNvcmQoKS5zdGFydCgpKTpuJiYobi5pbm5lckhUTUw9YDxzcGFuIGNsYXNzPSd1bC1jb3VudGRvd24tdGV4dCc+UmVjb3JkaW5nIGluLi4uICR7ZX08L3NwYW4+YCxzZXRUaW1lb3V0KCgoKT0+e2llKHQsZS0xKX0pLDFlMykpfSxhZT10PT57Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5jbGFzc05hbWU9InVsLXZpZGVvLWNvbnRhaW5lciIsZS5hcHBlbmRDaGlsZCgodD0+e2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuY2xhc3NOYW1lPSJ1bC12aWRlby1wbGF5ZXItbG9hZGluZyIsZS5pZD1CdCh0KSxbImZpcnN0Iiwic2Vjb25kIiwidGhpcmQiLCJmb3VydGgiXS5tYXAoKHQ9Pntjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NOYW1lPXQsZS5hcHBlbmRDaGlsZChuKX0pKSxlfSkodCkpLGV9LGNlPSh0LGUpPT57Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO24uaWQ9dCxuLmNsYXNzTmFtZT0idmlkZW8tanMgdmpzLWRlZmF1bHQtc2tpbiB1bC12aWRlby1wbGF5ZXItdmlkZW8iO2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpO3IuY2xhc3NOYW1lPSJ2anMtbm8tanMiLHIuaW5uZXJIVE1MPSJUbyB2aWV3IHRoaXMgdmlkZW8gcGxlYXNlIGVuYWJsZSBKYXZhU2NyaXB0LCBhbmQgY29uc2lkZXIgdXBncmFkaW5nIHRvIGEgd2ViIGJyb3dzZXIgdGhhdCI7Y29uc3Qgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIG8uaHJlZj0iaHR0cHM6Ly92aWRlb2pzLmNvbS9odG1sNS12aWRlby1zdXBwb3J0LyIsby50YXJnZXQ9Il9ibGFuayIsby5pbm5lckhUTUw9InN1cHBvcnRzIEhUTUw1IHZpZGVvIixyLmFwcGVuZENoaWxkKG8pLG4uYXBwZW5kQ2hpbGQociksZS5hcHBlbmRDaGlsZChuKSxlfSxzZT0odCxlKT0+e2U/KHQuY2hpbGRyZW4oKVswXS5jbGFzc0xpc3QuYWRkKCJ2anMtaGlkZGVuIiksdC5hdWRpb1BsYXllclBsYWNlaG9sZGVyLnNob3coKSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0LmlkKCl9X2h0bWw1X2FwaWApLnN0eWxlLmhlaWdodD0iMHB4Iik6KHQuY2hpbGRyZW4oKVswXS5jbGFzc0xpc3QucmVtb3ZlKCJ2anMtaGlkZGVuIiksdC5hdWRpb1BsYXllclBsYWNlaG9sZGVyLmhpZGUoKSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0LmlkKCl9X2h0bWw1X2FwaWApLnN0eWxlLmhlaWdodD0iMTAwJSIpfSx1ZT10PT57Y29uc3QgZT13aW5kb3cudmlkZW9qcyxuPXQrJHQ7aWYoZSl7dHJ5e2lmKCFlKG4pLnJlY29yZCgpLnN0cmVhbSlyZXR1cm59Y2F0Y2godCl7cmV0dXJufWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG4pJiZlKG4pLnJlY29yZCgpLnN0b3AoKSxlKG4pLnJlY29yZCgpLnN0b3BEZXZpY2UoKX19LGxlPXQ9Pnt3aW5kb3cudmlkZW9qcyh0K1p0KS5wYXVzZSgpfSxmZT0odCxlLG4scik9Pnt3aW5kb3cudmlkZW9qcyh0K1p0KTtjb25zdCBvPXdpbmRvdy52aWRlb2pzKHQrJHQpOygodCxlLG4pPT57Y29uc3Qgcj13aW5kb3cudmlkZW9qcyh0K1p0KTshci5wYXVzZWQoKSYmci5wYXVzZSgpLHIuc3JjKHtzcmM6ZSx0eXBlOiJhcHBsaWNhdGlvbi94LW1wZWdVUkwifSksci5jdXJyZW50VGltZSgwKSxzZShyLG4pO2NvbnN0IG89ZGUoZSk7IW4mJmUmJihvP3IucG9zdGVyKG8pOnNlKHIsITApKSxyLm9uKCJwbGF5IiwoKCk9PntufHwhZXx8b3x8c2UociwhMSl9KSl9KSh0LGUsciksby5yZWNvcmQoKS5yZXNldFN0YXRlKCksby5yZWNvcmQoKS5nZXREZXZpY2UoKTtpZihkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ1bC12aWRlby1yZWNvcmRlci1kZWxldGUtYnV0dG9uIilbMF0uY2xhc3NMaXN0LmFkZCh6dCksby5jYW1lcmFPZmYpe2RvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uLWF1ZGlvLW9ubHkiKVswXS5jbGFzc0xpc3QucmVtb3ZlKHp0KSx3aW5kb3cubmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe3ZpZGVvOiEwLGF1ZGlvOiEwfSkudGhlbigodD0+e28ucmVjb3JkKCkub25EZXZpY2VSZWFkeSh0KSx0LmdldFZpZGVvVHJhY2tzKCkuZm9yRWFjaCgodD0+e3Quc3RvcCgpfSkpfSkpLmNhdGNoKG8ucmVjb3JkKCkub25EZXZpY2VFcnJvci5iaW5kKG8ucmVjb3JkKCkpKX1lbHNle2RvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIilbMF0uY2xhc3NMaXN0LnJlbW92ZSh6dCl9by5wYXlsb2FkPW4sUXQoby51cGxvYWRQcm9ncmVzc0xhYmVsLCJub25lIiksS3Q9RGF0ZS5ub3coKX0sZGU9dD0+e2NvbnN0IGU9dC5tYXRjaCgvaHR0cHM6XC9cL3N0cmVhbS5tdXguY29tXC8oLiopLyksbj1lP2VbMV06bnVsbDtyZXR1cm4gbj9gaHR0cHM6Ly9pbWFnZS5tdXguY29tLyR7bn0vdGh1bWJuYWlsLmpwZz90aW1lPTBgOm51bGx9LHBlPXtVUExPQURfU1RBUlRFRDoidXBsb2FkLnN0YXJ0ZWQiLFVQTE9BRF9GSU5JU0hFRDoidXBsb2FkLmZpbmlzaGVkIixERUxFVEU6ImRlbGV0ZSIsRVJST1I6ImVycm9yIixNRURJQV9UWVBFOiJtZWRpYS50eXBlIixQRVJNSVNTSU9OX0RFTklFRDoicGVybWlzc2lvbl9kZW5pZWQiLE9USEVSOiJvdGhlciIsVVBMT0FEX0lEOiJ1cGxvYWQuaWQiLE1FRElBX1RZUEVfVklERU86InZpZGVvIixNRURJQV9UWVBFX0FVRElPOiJhdWRpbyJ9LGhlPXtQbGF5YmFja1JhdGVNZW51QnV0dG9uOiJTcGVlZCIsUGxheVRvZ2dsZToiUGxheSIsRnVsbHNjcmVlblRvZ2dsZToiRXhwYW5kIixUdXJuT25DYW1lcmE6IlR1cm4gb24iLFR1cm5PZmZDYW1lcmE6IlR1cm4gb2ZmIixEZWxldGVCdXR0b246IkRlbGV0ZSIsUmVjb3JkQnV0dG9uOiJSZWNvcmQiLFN0b3BCdXR0b246IlN0b3AiLFBhdXNlQnV0dG9uOiJQYXVzZSJ9O2Z1bmN0aW9uIHZlKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn12YXIgZ2U9InVsLWJ1dHRvbi1pbmFjdGl2ZSI7ZnVuY3Rpb24geWUodCxlKXtlKHQpfXZhciBtZT17ZXE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09ZX0sbmVxOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIXRoaXMuZXEodCxlKX0sZ3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lfSxndGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD49ZX0sbHQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlfSxsdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw9ZX0sbGlzdF9leGFjdDpmdW5jdGlvbih0LGUpe3JldHVybiEoIUFycmF5LmlzQXJyYXkodCl8fCFBcnJheS5pc0FycmF5KGUpKSYmdC5zbGljZSgpLnNvcnQoKS5qb2luKCIsIik9PT1lLnNsaWNlKCkuc29ydCgpLmpvaW4oIiwiKX0sbGlzdF9hbGw6ZnVuY3Rpb24odCxlKXtyZXR1cm4hKCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheShlKSkmJiFlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09dC5pbmRleE9mKGUpfSkpfSxsaXN0X2FsbzpmdW5jdGlvbih0LGUpe3JldHVybiEoIUFycmF5LmlzQXJyYXkodCl8fCFBcnJheS5pc0FycmF5KGUpKSYmZS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4tMSE9dC5pbmRleE9mKGUpfSkpfX07dmFyIGJlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj10aGlzO2J0KCkodGhpcyx0KSx0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQscil7bi5wYXlsb2FkPWUsbi5yZWplY3Q9cixuLnJlc29sdmU9dH0pKX1yZXR1cm4gd3QoKSh0LFt7a2V5OiJyZXNvbHZlUmVxdWVzdCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5yZXNvbHZlKHQpfX1dKSx0fSgpLHhlPW4oOTMxMzApLHdlPXhlLmRlbGF5LEVlPXhlLk5FVFdPUktfQ09ORklHLGplPSExLENlPSIiLGtlPSExLFNlPVtdO2Z1bmN0aW9uIE9lKHQpe3JldHVybiB0Ll9jb25maWcmJnQuX2NvbmZpZy5pbnN0YWxsYXRpb25NZXRob2Q/dC5fY29uZmlnLmluc3RhbGxhdGlvbk1ldGhvZDp0Ll9ndG0/cTp0Ll9zZWdtZW50P1c6R31mdW5jdGlvbiBBZSh0KXtqZT0hMCxDZT10fWZ1bmN0aW9uIEllKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGU9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwidXNlcmxlYXAtcGxhdGZvcm0iOiJ3ZWIiLCJ4LXVsLXNkay12ZXJzaW9uIjoiMi4xNC4yIn07aWYodC5lbnZJZCYmKGVbVV09dC5lbnZJZCksdC50b2tlbiYmKGUuQXV0aG9yaXphdGlvbj0iQmVhcmVyICIrdC50b2tlbiksdC51c2VySWQmJihlW3pdPXQudXNlcklkKSx0LnZpc2l0b3JJZCYmKGVbSF09dC52aXNpdG9ySWQpLHQucGFydG5lckFub255bW91c0lkJiYoZVtCXT10LnBhcnRuZXJBbm9ueW1vdXNJZCksdC5tb2JpbGVIZWFkZXJzSlNPTil7dmFyIG49SlNPTi5wYXJzZSh0Lm1vYmlsZUhlYWRlcnNKU09OKTtPYmplY3QuYXNzaWduKGUsbil9cmV0dXJuIGVbVl09T2UodCksdC5sb2NhbGUmJihlWyJhY2NlcHQtbGFuZ3VhZ2UiXT10LmxvY2FsZSksZX1mdW5jdGlvbiBUZSh0LGUsbil7cmV0dXJuIE1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBNZSgpe3JldHVybihNZT1OKCkoUigpLm1hcmsoKGZ1bmN0aW9uIHQoZSxuLHIpe3ZhciBvO3JldHVybiBSKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoIWUpe3QubmV4dD00O2JyZWFrfXJldHVybiB0LmFicnVwdCgicmV0dXJuIix7c3RhdHVzOjQyOX0pO2Nhc2UgNDpyZXR1cm4gbz1uZXcgYmUociksU2UucHVzaChvKSx0LmFicnVwdCgicmV0dXJuIixvLnByb21pc2UpO2Nhc2UgNzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIF9lKHQsZSl7cmV0dXJuIExlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBMZSgpe3JldHVybiBMZT1OKCkoUigpLm1hcmsoKGZ1bmN0aW9uIHQoZSxuKXt2YXIgcixvLGksYSxjLHMsdSxsLGYsZD1hcmd1bWVudHM7cmV0dXJuIFIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZihyPWQubGVuZ3RoPjImJnZvaWQgMCE9PWRbMl0/ZFsyXTowLG89ZC5sZW5ndGg+MyYmdm9pZCAwIT09ZFszXSYmZFszXSxpPWQubGVuZ3RoPjQmJnZvaWQgMCE9PWRbNF0mJmRbNF0sYT17dXJsOmUsb3B0aW9uczpuLGF0dGVtcHQ6cixzaG91bGREcm9wT25SYXRlTGltaXQ6b30sIWtlfHxpKXt0Lm5leHQ9NjticmVha31yZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsVGUobyxpLGEpKTtjYXNlIDY6aWYoYz17b2s6ITEscmVwb3J0RXJyb3I6ITF9LCFqZSl7dC5uZXh0PTEwO2JyZWFrfXJldHVybiBjb25zb2xlLmxvZygiVXNlckxlYXAgLSAiLmNvbmNhdChDZSkpLHQuYWJydXB0KCJyZXR1cm4iLGMpO2Nhc2UgMTA6cmV0dXJuIHQucHJldj0xMCxuLmhlYWRlcnM9T2JqZWN0LmFzc2lnbihJZSgpLG4uaGVhZGVycyksdC5uZXh0PTE0LGZldGNoKGUsbik7Y2FzZSAxNDppZig0MjkhPT0ocz10LnNlbnQpLnN0YXR1cyl7dC5uZXh0PTI0O2JyZWFrfWlmKCEoIWtlJiYhb3x8aSkpe3QubmV4dD0yMzticmVha31yZXR1cm4ga2U9ITAsdT1zLmhlYWRlcnMuaGFzKCJyYXRlbGltaXQtcmVzZXQiKT9OdW1iZXIocy5oZWFkZXJzLmdldCgicmF0ZWxpbWl0LXJlc2V0IikpOkVlLlJBVEVMSU1JVF9SRVNFVF9ERUZBVUxULHQuYWJydXB0KCJyZXR1cm4iLHdlKDFlMyp1KS50aGVuKE4oKShSKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiBSKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLF9lKGUsbiwwLG8sITApKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSkpKTtjYXNlIDIzOnJldHVybiB0LmFicnVwdCgicmV0dXJuIixUZShvLCExLGEpKTtjYXNlIDI0OmlmKGtlPSExLFNlLmxlbmd0aCYmKFNlLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9dC5wYXlsb2FkO19lKGUudXJsLGUub3B0aW9ucyxlLmF0dGVtcHQsZS5zaG91bGREcm9wT25SYXRlTGltaXQpLnRoZW4oKGZ1bmN0aW9uKGUpe3QucmVzb2x2ZVJlcXVlc3QoZSl9KSl9KSksU2U9W10pLCFzLm9rKXt0Lm5leHQ9NDE7YnJlYWt9aWYoMjQ5IT09cy5zdGF0dXMpe3QubmV4dD0zMDticmVha31yZXR1cm4gQWUoKSx0LmFicnVwdCgicmV0dXJuIixjKTtjYXNlIDMwOnJldHVybiB0Lm5leHQ9MzIscy50ZXh0KCk7Y2FzZSAzMjpyZXR1cm4gbD10LnNlbnQsdC5wcmV2PTMzLGwmJiJPSyIhPT1sJiYocy5qc29uPUpTT04ucGFyc2UobCkpLHQuYWJydXB0KCJyZXR1cm4iLHMpO2Nhc2UgMzg6cmV0dXJuIHQucHJldj0zOCx0LnQwPXQuY2F0Y2goMzMpLHQuYWJydXB0KCJyZXR1cm4iLHtvazohMSxyZXBvcnRFcnJvcjohMCxlcnJvcjpuZXcgRXJyb3IoImZhaWxlZCBwYXJzaW5nIHJlc3BvbnNlIGpzb24gZm9yICIuY29uY2F0KGUsIiAtICIpLmNvbmNhdChsKSl9KTtjYXNlIDQxOnJldHVybiB0LmFicnVwdCgicmV0dXJuIixzKTtjYXNlIDQ0OmlmKHQucHJldj00NCx0LnQxPXQuY2F0Y2goMTApLCEoKGY9cisxKT4yKSl7dC5uZXh0PTQ5O2JyZWFrfXJldHVybiB0LmFicnVwdCgicmV0dXJuIix7b2s6ITEscmVwb3J0RXJyb3I6ITEsZXJyb3I6dC50MX0pO2Nhc2UgNDk6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHdlKDFlMypmKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBfZShlLG4sZil9KSkpO2Nhc2UgNTA6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LG51bGwsW1sxMCw0NF0sWzMzLDM4XV0pfSkpKSxMZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gUmUodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1JlKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cigpKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpSZShPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBOZSh0LGUsbil7cmV0dXJuIEZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBGZSgpe3JldHVybiBGZT1OKCkoUigpLm1hcmsoKGZ1bmN0aW9uIHQoZSxuLHIpe3ZhciBvLGksYSxjLHMsdSxsLGY7cmV0dXJuIFIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gbz1lLm1vZGUsaT1lLnVzZXJJZCxhPWUuZW52SWQsYz1lLmFwaVVSTCxzPWUuaGVhZGVycyx1PXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbD17bW9kZTpvLHNjcmVlbldpZHRoOndpbmRvdy5zY3JlZW4ud2lkdGgsc2NyZWVuSGVpZ2h0OndpbmRvdy5zY3JlZW4uaGVpZ2h0LGNsaWVudFdpZHRoOnUuY2xpZW50V2lkdGgsY2xpZW50SGVpZ2h0OnUuY2xpZW50SGVpZ2h0LGxvY2F0aW9uOndpbmRvdy5sb2NhdGlvbi5ocmVmLGxhbmd1YWdlOndpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V9LGY9e2FjdGlvbjpuLGVycjp7bWVzc2FnZTpyLm1lc3NhZ2Usc3RhY2s6ci5zdGFja30sbWV0YTpsLHZpZDppLGVudklkOmF9LHQubmV4dD02LF9lKCIiLmNvbmNhdChjLCIvc2RrLzEvZXJyb3JzIikse21ldGhvZDoiUE9TVCIsaGVhZGVyczpPYmplY3QuYXNzaWduKHsieC11bC1lcnJvciI6d2luZG93LmJ0b2EoInVzZXJsZWFwLSIuY29uY2F0KERhdGUubm93KCksIi1lcnJvciIpKX0scyksYm9keTpKU09OLnN0cmluZ2lmeShmKX0pO2Nhc2UgNjp0LnNlbnQub2t8fGNvbnNvbGUud2FybigiW1VzZXJMZWFwXSAoRVJSLTQ0NCkgRmFpbGVkIHRvIHJlcG9ydCBlcnJvciB0byBBUEkiLHIpO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKSxGZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIERlPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC51c2VySWR8fHQubWV0YSYmInRlc3QiPT09dC5tZXRhLm1vZGV8fHQuaXNQcmV2aWV3fSxVZT17c3VydmV5SWQ6bnVsbCxydW5uaW5nOiExLGZyYW1lOm51bGwsZW52SWQ6bnVsbCx1c2VySWQ6bnVsbCxtZXRhOnt9LGJvcmRlcjpudWxsLGZvbnRGYW1pbHk6bnVsbCxmb250RmFtaWx5VVJMOm51bGwsdGltZW91dDpudWxsLGludGVydmFsOm51bGwsbW9kZTpudWxsLGRlY2s6e2luZGV4OjAsY2FyZHM6W119LGNvbnRleHQ6e30sc2VuZGluZzohMSxjYXJkczp7b3BlbjpmdW5jdGlvbih0KXt2YXIgZT10LmNsYXNzTmFtZSxuPXQubWVzc2FnZSxyPXQucHJvcGVydGllcyxvPSh0LmxvY2FsZSx0Lm5leHQpLGk9dC5xdWVzdGlvbklkO3JldHVybiBmdW5jdGlvbih0LGEpe3ZhciBjPXQuYXBwLHM9Yy51c2VNb2JpbGVTdHlsaW5nLHU9Yy5ib3JkZXIsbD1EKFtlLCJ1bC1jYXJkLS10ZXh0IixsdF0pLGY9TXQociksZD1yJiZyLm9wZW5UZXh0UGxhY2Vob2xkZXI/ci5vcGVuVGV4dFBsYWNlaG9sZGVyOm51bGw7cmV0dXJuIEEoImZvcm0iLHtpZDoidGV4dC1mb3JtIixjbGFzc05hbWU6bCxvbnN1Ym1pdDpmdW5jdGlvbih0KXtyZXR1cm4gRnQodCxvKX0sa2V5Oml9LF90KGYsbiksZixBKCJkaXYiLHtjbGFzc05hbWU6InVsLWNhcmQtdGV4dCJ9LEEoImRpdiIse2NsYXNzTmFtZToidWwtY2FyZC10ZXh0X19jb250YWluZXIifSxBKCJ0ZXh0YXJlYSIseyJkYXRhLWdyYW1tIjoiZmFsc2UiLG1heGxlbmd0aDoiNTAwMCIsY2xhc3NOYW1lOkQoZnQoaXQscykpLG5hbWU6InRleHQiLHBsYWNlaG9sZGVyOmQsImFyaWEtcGxhY2Vob2xkZXIiOmQsImFyaWEtbXVsdGlsaW5lIjoidHJ1ZSIsdmFsdWU6dC5vcGVuVGV4dC52YWx1ZSxvbmNyZWF0ZTpOdCgpLG9uaW5wdXQ6ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksYS5vcGVuVGV4dC5vblRleHRDaGFuZ2UodC50YXJnZXQudmFsdWUpfSxvbmZvY3VzOmZ1bmN0aW9uKHQpe3QudGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yPXV9LG9uYmx1cjpmdW5jdGlvbih0KXt0LnRhcmdldC5zdHlsZS5ib3JkZXJDb2xvcj0iI2U2ZTZlNiJ9LHRhYmluZGV4OjAsImFyaWEtbGFiZWxsZWRieSI6c3QsY29udGVudGVkaXRhYmxlOiJ0cnVlIixyb2xlOiJ0ZXh0Ym94IiwiYXJpYS1sYWJlbCI6ZH0pKSxBKCJidXR0b24iLHtpZDoidWwtY2FyZC10ZXh0X19idXR0b24iLGNsYXNzTmFtZToidWwtY2FyZC10ZXh0X19idXR0b24iLHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6dX0sb25jbGljazpmdW5jdGlvbihlKXsoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCksZG9jdW1lbnQuZm9ybXNbInRleHQtZm9ybSJdKSYmKEZ0KHQub3BlblRleHQudmFsdWUudHJpbSgpLG8pLHQub3BlblRleHQudmFsdWU9IiIpfSxyb2xlOiJidXR0b24iLCJhcmlhLWxhYmVsbGVkYnkiOiIiLmNvbmNhdChzdCwiIHVsLWNhcmQtdGV4dF9fYnV0dG9uIil9LEx0KHIpKSksQShUdCxudWxsKSl9fSx0ZXh0dXJscHJvbXB0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xhc3NOYW1lLG49dC5tZXNzYWdlLHI9dC5wcm9wZXJ0aWVzLG89KHQubG9jYWxlLHQubmV4dCksaT10LnF1ZXN0aW9uSWQ7cmV0dXJuIGZ1bmN0aW9uKHQsYSl7dmFyIGM9RChbZSwidWwtY2FyZF9fdGV4dC11cmwtcHJvbXB0IixsdF0pLHM9dC5hcHAuYm9yZGVyO3JldHVybiBBKCJkaXYiLHtjbGFzc05hbWU6YyxrZXk6aX0sQSgicCIse2lkOnN0LGNsYXNzTmFtZToidWwtcXVlc3Rpb24ifSxuKSxBKCJkaXYiLHtpZDoidWwtY2FyZF9fdGV4dC11cmwtYm9keS1jb250YWluZXIiLGNsYXNzTmFtZToidWwtY2FyZF9fdGV4dC11cmwtYm9keS1jb250YWluZXIifSwociYmci5ib2R5P3IuYm9keS5zcGxpdCgvXG5ccypcbi9nKTpbXSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gQSgicCIse2NsYXNzTmFtZToidWwtY2FyZF9fdGV4dC11cmwtcHJvbXB0LWJvZHkifSx0KX0pKSksQSgiYSIse2lkOiJ1bC1jYXJkLXRleHRfX2J1dHRvbiIsY2xhc3NOYW1lOiJ1bC1jYXJkLXRleHRfX2J1dHRvbiB1bC1jYXJkX190ZXh0LXVybC1wcm9tcHQtYnV0dG9uIixzdHlsZTp7YmFja2dyb3VuZENvbG9yOnMsIm1hcmdpbi1yaWdodCI6ImF1dG8iLCJ0ZXh0LW92ZXJmbG93IjoiZWxsaXBzaXMiLHRleHREZWNvcmF0aW9uOiJub25lIixvdmVyZmxvdzoidmlzaWJsZSJ9LG9uY2xpY2s6ZnVuY3Rpb24odCl7bygpfSxvbmtleXByZXNzOmZ1bmN0aW9uKHQpezEzIT10LmtleUNvZGUmJjMyIT10LmtleUNvZGV8fG8oKX0saHJlZjpyJiZyLmJ1dHRvblVybCx0YXJnZXQ6Il9ibGFuayIscm9sZToiYnV0dG9uIix0YWJpbmRleDowLCJhcmlhLWxhYmVsbGVkYnkiOiIiLmNvbmNhdChzdCwiIHVsLWNhcmQtdGV4dF9fYnV0dG9uIiksImFyaWEtZGVzY3JpYmVkYnkiOiJ1bC1jYXJkX190ZXh0LXVybC1ib2R5LWNvbnRhaW5lciJ9LHImJnIuYnV0dG9uVGV4dD9yLmJ1dHRvblRleHQ6Ik5leHQiKSxBKFR0LG51bGwpKX19LG11bHRpcGxlY2hvaWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xhc3NOYW1lLG49dC5ib3JkZXIsbz10Lm1lc3NhZ2UsaT10LnByb3BlcnRpZXMsYT0odC5sb2NhbGUsdC5vcHRpb25zKSxjPXZvaWQgMD09PWE/W106YSxzPXQubmV4dCx1PXQucXVlc3Rpb25JZDtyZXR1cm4gZnVuY3Rpb24odCxhKXt2YXIgbD10LmFwcC51c2VNb2JpbGVTdHlsaW5nLGY9RChbZSwidWwtY2FyZC0tbXVsdGlwbGUiLGx0XSk7ZnVuY3Rpb24gZCh0LGUpe3Moe3ZhbHVlOnIoKSh7fSx0LGUpfSl9dmFyIHA9Yy5tYXAoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5pZCxvPXQubGFiZWwsaT10LnZhbHVlO3JldHVybiBBKER0LHtib3JkZXI6bixpbmRleDplLGxhYmVsOm8sdGFiaW5kZXg6ZSsxLG9uU2VsZWN0OmQuYmluZChudWxsLHIsaSksaWQ6cixpc1JhZGlvOiEwLHVzZU1vYmlsZVN0eWxpbmc6bH0pfSkpLGg9TXQoaSk7cmV0dXJuIEEoImRpdiIse2NsYXNzTmFtZTpmLGtleTp1fSxfdChoLG8pLGgsQSgiZGl2Iix7Y2xhc3NOYW1lOkQoZnQob3QsbCkpLHJvbGU6InJhZGlvZ3JvdXAiLCJhcmlhLWxhYmVsZWRieSI6c3R9LHApLEEoVHQsbnVsbCkpfX0sbXVsdGlwbGVzZWxlY3Q6ZnVuY3Rpb24odCl7dmFyIGU9dC5jbGFzc05hbWUsbj10LmJvcmRlcixyPXQubWVzc2FnZSxvPXQucHJvcGVydGllcyxpPSh0LmxvY2FsZSx0Lm9wdGlvbnMpLGE9dm9pZCAwPT09aT9bXTppLGM9KHQuaXNMYXN0LHQubmV4dCkscz10LnF1ZXN0aW9uSWQ7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7dmFyIHU9RChbZSwidWwtY2FyZC0tbXVsdGlwbGUiLGx0XSksbD10Lm11bHRpcGxlc2VsZWN0LnNlbGVjdGVkT3B0aW9ucyxmPWkubXVsdGlwbGVzZWxlY3QsZD1mLmluaXQscD1mLnJlc2V0LGg9Zi51cGRhdGVTZWxlY3RlZCx2PXQuYXBwLnVzZU1vYmlsZVN0eWxpbmcsZz1mdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSxmdW5jdGlvbih0LGUpe2Uoe3ZhbHVlOnR9KX0odC5tdWx0aXBsZXNlbGVjdC5zZWxlY3RlZE9wdGlvbnMsYykscCgpfSx5PWEubWFwKChmdW5jdGlvbih0LGUpe3ZhciByPXQuaWQsbz10LmxhYmVsO3QudmFsdWU7cmV0dXJuIEEoRHQse2JvcmRlcjpuLGluZGV4OmUsbGFiZWw6byxvblNlbGVjdDpoLHNlbGVjdGVkOmxbcl0saWQ6cixpc1JhZGlvOiExLHVzZU1vYmlsZVN0eWxpbmc6dn0pfSkpLG09TXQobyk7cmV0dXJuIEEoImZvcm0iLHtpZDoidGV4dC1mb3JtIixjbGFzc05hbWU6dSxvbnN1Ym1pdDpnLG9uY3JlYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBlPXt9LGEuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVt0LmlkXT0hMX0pKSx2b2lkIGQoZSk7dmFyIGV9LGtleTpzfSxfdChtLHIpLG0sQSgiZGl2Iix7Y2xhc3NOYW1lOkQoZnQob3QsdikpLHJvbGU6InJhZGlvZ3JvdXAifSx5KSxBKCJkaXYiLHtjbGFzc05hbWU6InVsLWNhcmQtdGV4dCJ9LEEoImJ1dHRvbiIse2lkOiJ1bC1jYXJkLXRleHRfX2J1dHRvbiIsY2xhc3NOYW1lOiJ1bC1jYXJkLXRleHRfX2J1dHRvbiIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjpufSxvbmNsaWNrOmcscm9sZToiYnV0dG9uIiwiYXJpYS1sYWJlbGxlZGJ5IjoiIi5jb25jYXQoc3QsIiB1bC1jYXJkLXRleHRfX2J1dHRvbiIpfSxMdChvKSkpLEEoVHQsbnVsbCkpfX0sbGlrZXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuYm9yZGVyLG49dC5jbGFzc05hbWUscj0odC5sb2NhbGUsdC5sYWJlbHMpLG89dC5tZXNzYWdlLGk9dC5wcm9wZXJ0aWVzLGE9dC5uZXh0LGM9dC5xdWVzdGlvbklkO3JldHVybiBmdW5jdGlvbih0LHMpe3ZhciB1PXQuYXBwLGw9dS51c2VNb2JpbGVTdHlsaW5nLGY9dS5kZWNrLmluZGV4LGQ9RChbbiwidWwtY2FyZC0tbGlrZXJ0IixsdF0pLHA9ciYmci5sZWZ0LGg9ciYmci5yaWdodCx2PV8oKShBcnJheSg1KSkubWFwKChmdW5jdGlvbih0LG4pe3ZhciByPW4rMSxvPSJvcHRpb24tIi5jb25jYXQociksaT1mdW5jdGlvbih0KXt0LnRhcmdldC5zdHlsZS56SW5kZXg9Mix0LnRhcmdldC5zdHlsZS5ib3JkZXJDb2xvcj1lfSxjPWZ1bmN0aW9uKHQpe3QudGFyZ2V0LnN0eWxlLnpJbmRleD0iYXV0byIsdC50YXJnZXQuc3R5bGUuYm9yZGVyQ29sb3I9IiNlNmU2ZTYifSxzPXtvbmNsaWNrOmZ1bmN0aW9uKCl7cmV0dXJuIGEocil9LG9ua2V5cHJlc3M6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpezEzIT10LmtleUNvZGUmJjMyIT10LmtleUNvZGV8fGEocil9KHQpfX07cmV0dXJuIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/KHMub250b3VjaHN0YXJ0PWkscy5vbnRvdWNoY2FuY2VsPWMscy5vbnRvdWNobW92ZT1jLHMub250b3VjaGVuZD1jKToocy5vbm1vdXNlZG93bj1pLHMub25tb3VzZWxlYXZlPWMpLEEoImRpdiIsVCgpKHtpZDpvLGNsYXNzTmFtZTpEKFtdLmNvbmNhdChfKCkoZnQoWCxsKSksXygpKGZ0KCIiLmNvbmNhdChYLCItIikuY29uY2F0KHIpLGwpKSkpfSxzLHsiYXJpYS1sYWJlbGxlZGJ5IjoiIi5jb25jYXQoc3QsIiAiKS5jb25jYXQobykscm9sZToidGV4dGJveCIsdGFiaW5kZXg6MCwiYXJpYS1kZXNjcmliZWRieSI6dXR9KSxyKX0pKSxnPU10KGkpO3JldHVybiBBKCJmb3JtIix7Y2xhc3NOYW1lOmQsa2V5OmN9LF90KGcsbyksZyxmJTI9PTAmJkEoImRpdiIsbnVsbCksQSgiZGl2Iix7Y2xhc3NOYW1lOiJ1bC1jYXJkLS1saWtlcnRfX251bWJlcnMifSx2KSxBKCJkaXYiLHtjbGFzc05hbWU6InVsLWNhcmQtLWxpa2VydF9fbGFiZWxzIn0sQSgic3BhbiIsbnVsbCxwKSxBKCJzcGFuIixudWxsLGgpKSxBKFR0LG51bGwpKX19LHRoYW5rczpmdW5jdGlvbih0KXt2YXIgZT10LmVuZENhcmQsbj10LmJvcmRlcixyPXQuY2xhc3NOYW1lLG89KHQubG9jYWxlLHQucXVlc3Rpb25JZCk7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7dmFyIGE9RChbciwidWwtY2FyZC0tdGhhbmtzIixsdF0pLGM9ZSYmZS5zdWJoZWFkZXI/QSgicCIse2NsYXNzTmFtZToidWwtY2FwdGlvbiJ9LGUuc3ViaGVhZGVyKTpudWxsLHM9ZSYmZS5oZWFkbGluZT9lLmhlYWRsaW5lOm51bGw7cmV0dXJuIEEoImRpdiIse2NsYXNzTmFtZTphLGtleTpvfSxBKCJkaXYiLHtvbmNyZWF0ZTpmdW5jdGlvbigpe3JldHVybiBpLmFwcC5jb21wbGV0ZSgpfX0sQSgiZGl2Iix7Y2xhc3NOYW1lOiJ1bC1jYXJkLS10aGFua3MtY29udGVudCJ9LEEoImRpdiIse2NsYXNzTmFtZToidWwtdGhhbmtzLWNoZWNrIn0sQSgic3ZnIix7d2lkdGg6IjgxIixoZWlnaHQ6Ijk5Iix2aWV3Qm94OiIwIDAgODEgOTkiLGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImFyaWEtbGFiZWxsZWRieSI6InRpdGxlIn0sQSgicGF0aCIseyJmaWxsLXJ1bGUiOiJldmVub2RkIiwiY2xpcC1ydWxlIjoiZXZlbm9kZCIsZDoiTTQwLjUgNzdDNjAuOTM0NSA3NyA3Ny41IDYwLjQzNDUgNzcuNSA0MEM3Ny41IDE5LjU2NTUgNjAuOTM0NSAzIDQwLjUgM0MyMC4wNjU1IDMgMy41IDE5LjU2NTUgMy41IDQwQzMuNSA2MC40MzQ1IDIwLjA2NTUgNzcgNDAuNSA3N1pNODAuNSA0MEM4MC41IDYyLjA5MTQgNjIuNTkxNCA4MCA0MC41IDgwQzE4LjQwODYgODAgMC41IDYyLjA5MTQgMC41IDQwQzAuNSAxNy45MDg2IDE4LjQwODYgMCA0MC41IDBDNjIuNTkxNCAwIDgwLjUgMTcuOTA4NiA4MC41IDQwWiIsZmlsbDpufSksQSgicGF0aCIseyJmaWxsLXJ1bGUiOiJldmVub2RkIiwiY2xpcC1ydWxlIjoiZXZlbm9kZCIsZDoiTTU1LjAyNSAyMi45MDQ2QzU1LjYyOTkgMjMuNDcwNSA1NS42NjE2IDI0LjQxOTggNTUuMDk1NiAyNS4wMjQ3QzU0Ljg3MjQgMjUuMjYzNCA1NC42MTA5IDI1LjUyODUgNTQuMzE1NyAyNS44Mjc3QzUyLjI1NDcgMjcuOTE2OCA0OC41NTQ5IDMxLjY2NyA0NC44MTM1IDM5LjY2NThDNDMuMjgxOCA0Mi45NDA2IDQyLjA4NjQgNDUuODM4NiA0MS4wODIzIDQ4LjI3MjlDNDAuNjUzOSA0OS4zMTE2IDQwLjI2MDMgNTAuMjY1OSAzOS44OTAyIDUxLjEyOUMzOS4yODcgNTIuNTM1OSAzOC43MjQ4IDUzLjc1MDggMzguMTc0NCA1NC42MjVDMzcuODk5NyA1NS4wNjEzIDM3LjU4MDYgNTUuNDkwNSAzNy4yMDE3IDU1LjgyNDVDMzYuODIwMSA1Ni4xNjA3IDM2LjI2MTMgNTYuNSAzNS41NDU3IDU2LjVDMzQuNjc0MiA1Ni41IDM0LjA4OTIgNTUuOTY5MiAzMy43Nzc0IDU1LjYwODNDMzMuNDUwMiA1NS4yMjk2IDMzLjE3NTIgNTQuNzUxMSAzMi45Mzk2IDU0LjMwMUMzMi43MzA1IDUzLjkwMTMgMzIuNTA4OCA1My40MzY3IDMyLjI3OTcgNTIuOTU2NUMzMi4yNDI5IDUyLjg3OTQgMzIuMjA1OSA1Mi44MDE5IDMyLjE2ODggNTIuNzI0M0MzMS44OTQyIDUyLjE0OTkgMzEuNTk1OSA1MS41MzQgMzEuMjUzNyA1MC44ODY4QzI5Ljg4ODYgNDguMzA1IDI3Ljg1MzkgNDUuMjg3OCAyNC4yMzQzIDQzLjEzODJDMjMuNTIyIDQyLjcxNTIgMjMuMjg3NSA0MS43OTQ5IDIzLjcxMDUgNDEuMDgyNkMyNC4xMzM1IDQwLjM3MDMgMjUuMDUzOSA0MC4xMzU4IDI1Ljc2NjIgNDAuNTU4OEMzMC4wNTU2IDQzLjEwNjIgMzIuNDE0OSA0Ni42NjQ3IDMzLjkwNTggNDkuNDg0NUMzNC4yNzc2IDUwLjE4NzYgMzQuNTk3MyA1MC44NDg3IDM0Ljg3NTMgNTEuNDMwMkMzNC45MTQ3IDUxLjUxMjQgMzQuOTUyOSA1MS41OTI2IDM0Ljk5MDIgNTEuNjcwN0MzNS4yMjIyIDUyLjE1NjcgMzUuNDE2NCA1Mi41NjM3IDM1LjU5NzggNTIuOTEwMkMzNS42MTUxIDUyLjk0MzQgMzUuNjMyMSA1Mi45NzU0IDM1LjY0ODUgNTMuMDA2MUMzNi4wNTY1IDUyLjM1MzEgMzYuNTM0MSA1MS4zNDM0IDM3LjEzMyA0OS45NDY4QzM3LjQ3ODEgNDkuMTQxOCAzNy44NTcyIDQ4LjIyMjkgMzguMjc2MSA0Ny4yMDc0QzM5LjI4ODYgNDQuNzUzMiA0MC41MzM5IDQxLjczNDcgNDIuMDk2MSAzOC4zOTQ4QzQ2LjA1OTEgMjkuOTIyMSA1MC4wNjQxIDI1Ljg2NDggNTIuMTUzNSAyMy43NDgyQzUyLjQ0MjMgMjMuNDU1NiA1Mi42OTQ0IDIzLjIwMDIgNTIuOTA0OCAyMi45NzUzQzUzLjQ3MDggMjIuMzcwMyA1NC40MiAyMi4zMzg3IDU1LjAyNSAyMi45MDQ2Wk0zNS4xOTk0IDUzLjU4OTJDMzUuMTk5NCA1My41ODkyIDM1LjIgNTMuNTg4OCAzNS4yMDEyIDUzLjU4NzlDMzUuMiA1My41ODg5IDM1LjE5OTQgNTMuNTg5MyAzNS4xOTk0IDUzLjU4OTJaTTM2LjA2NjYgNTMuNjY4MkMzNi4wNzMyIDUzLjY3NCAzNi4wNzY1IDUzLjY3NzUgMzYuMDc2NSA1My42Nzc3QzM2LjA3NjUgNTMuNjc4IDM2LjA3MzIgNTMuNjc1MSAzNi4wNjY2IDUzLjY2ODJaIixmaWxsOm59KSxBKCJwYXRoIix7ZDoiTTY5LjUgOTdDNjkuNSA5OC4xMDQ2IDU2LjI5MjQgOTkgNDAgOTlDMjMuNzA3NiA5OSAxMC41IDk4LjEwNDYgMTAuNSA5N0MxMC41IDk1Ljg5NTQgMjMuNzA3NiA5NSA0MCA5NUM1Ni4yOTI0IDk1IDY5LjUgOTUuODk1NCA2OS41IDk3WiIsZmlsbDoiYmxhY2siLCJmaWxsLW9wYWNpdHkiOiIwLjIifSkpKSxBKCJwIix7Y2xhc3NOYW1lOnN0LGlkOnN0fSxzKSxjKSxBKFR0LG51bGwpKSl9fSxucHM6ZnVuY3Rpb24odCl7dmFyIGU9dC5ib3JkZXIsbj10LmNsYXNzTmFtZSxyPSh0LmxvY2FsZSx0LmxhYmVscyksbz10Lm1lc3NhZ2UsaT10LnByb3BlcnRpZXMsYT10Lm5leHQsYz10LnF1ZXN0aW9uSWQ7cmV0dXJuIGZ1bmN0aW9uKHQscyl7dmFyIHU9dC5hcHAsbD11LnVzZU1vYmlsZVN0eWxpbmcsZj11LmRlY2suaW5kZXgsZD1EKFtuLCJ1bC1jYXJkLS1ucHMiLGx0XSkscD1yJiZyLmxlZnQsaD1yJiZyLnJpZ2h0LHY9XygpKEFycmF5KDExKSkubWFwKChmdW5jdGlvbih0LG4pe3ZhciByPW4sbz0ib3B0aW9uLSIuY29uY2F0KHIpLGk9ZnVuY3Rpb24odCl7dC50YXJnZXQuc3R5bGUuekluZGV4PTIsdC50YXJnZXQuc3R5bGUuYm9yZGVyQ29sb3I9ZX0sYz1mdW5jdGlvbih0KXt0LnRhcmdldC5zdHlsZS56SW5kZXg9ImF1dG8iLHQudGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yPSIjZTZlNmU2In0scz17b25jbGljazpmdW5jdGlvbigpe3JldHVybiBhKHIpfSxvbmtleXByZXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXsxMyE9dC5rZXlDb2RlJiYzMiE9dC5rZXlDb2RlfHxhKHIpfSh0KX19O3JldHVybiJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50PyhzLm9udG91Y2hzdGFydD1pLHMub250b3VjaGNhbmNlbD1jLHMub250b3VjaG1vdmU9YyxzLm9udG91Y2hlbmQ9Yyk6KHMub25tb3VzZWRvd249aSxzLm9ubW91c2VsZWF2ZT1jKSxBKCJkaXYiLFQoKSh7Y2xhc3NOYW1lOkQoW10uY29uY2F0KF8oKShmdChRLGwpKSxfKCkoZnQoIiIuY29uY2F0KFEsIi0iKS5jb25jYXQociksbCkpKSl9LHMseyJhcmlhLWxhYmVsbGVkYnkiOiIiLmNvbmNhdChzdCwiICIpLmNvbmNhdChvKSxyb2xlOiJyYWRpbyIsdGFiaW5kZXg6MCxpZDpvfSkscil9KSksZz1NdChpKTtyZXR1cm4gQSgiZm9ybSIse2NsYXNzTmFtZTpkLGtleTpjfSxfdChnLG8pLGcsZiUyPT0wJiZBKCJkaXYiLG51bGwpLEEoImRpdiIse2NsYXNzTmFtZToidWwtY2FyZC0tbnBzX19udW1iZXJzIn0sdiksQSgiZGl2Iix7Y2xhc3NOYW1lOiJ1bC1jYXJkLS1ucHNfX2xhYmVscyJ9LEEoInNwYW4iLG51bGwscCksQSgic3BhbiIsbnVsbCxoKSksQShUdCxudWxsKSl9fSx2aWRlb3ZvaWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xhc3NOYW1lLG49dC5tZXNzYWdlLG89dC5wcm9wZXJ0aWVzLGk9dC5uZXh0LGE9dC5xdWVzdGlvbklkLGM9dC51cGRhdGVIZWlnaHQ7cmV0dXJuIGZ1bmN0aW9uKHQscyl7dmFyIHU9RChbZSxZXSksbD0idWwtY2FyZC12aWRlb19fcGxheWVyX3JlY29yZGVyIixmPSJ1bC1jYXJkLXZpZGVvX19uZXh0X2J1dHRvbiIsZD0idWwtdmlkZW8taW50ZXJ2aWV3LWZvcm0iLHA9InVsLXF1ZXN0aW9uLXBsYXllci1jb250YWluZXIiLGg9InVsLXJlY29yZGVyLXBsYXllci1jb250YWluZXIiLHY9byYmby52aWRlb1VybCxnPXQuYXBwLHk9Zy5zdXJ2ZXlJZCxtPWcucmVzcG9uc2VHcm91cFVpZCxiPWcuYXBpVVJMLHg9Zy51c2VySWQsdz1nLmJvcmRlcixFPWcuZW52SWQsaj1nLmhlYWRlcnM7aWYodC5jYXJkRGF0YXx8KHQuY2FyZERhdGE9e30pLHQuY2FyZERhdGEudXBsb2FkSWQ9dm9pZCAwLHQuY2FyZERhdGEuYnV0dG9uVGV4dD1MdChvKSx0LmNhcmREYXRhLnNraXBCdXR0b25UZXh0PVJ0KG8pLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGwpKXtmZShsLHYse3N1cnZleUlkOnkscmVzcG9uc2VHcm91cFVpZDptLHF1ZXN0aW9uSWQ6YSx2aXNpdG9ySWQ6eH0sby5tZWRpYVR5cGU9PT1wZS5NRURJQV9UWVBFX0FVRElPKTt2YXIgQz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChmKTtDLmlubmVyVGV4dD10LmNhcmREYXRhLnNraXBCdXR0b25UZXh0LEMuY2xhc3NMaXN0LmFkZChnZSl9dmFyIGs9ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChmKTtlPT09cGUuVVBMT0FEX1NUQVJURUQ/KHQuY2FyZERhdGEudXBsb2FkSWQ9bltwZS5VUExPQURfSURdLHIuaW5uZXJUZXh0PXQuY2FyZERhdGEuYnV0dG9uVGV4dCxyLmNsYXNzTGlzdC5yZW1vdmUoZ2UpLE9iamVjdC5hc3NpZ24oci5zdHlsZSx7YmFja2dyb3VuZENvbG9yOnd9KSk6ZT09PXBlLkRFTEVURSYmKHQuY2FyZERhdGEudXBsb2FkSWQ9bnVsbCxyLmNsYXNzTGlzdC5hZGQoZ2UpLHIuaW5uZXJUZXh0PXQuY2FyZERhdGEuc2tpcEJ1dHRvblRleHQsT2JqZWN0LmFzc2lnbihyLnN0eWxlLHtiYWNrZ3JvdW5kQ29sb3I6IiJ9KSl9LFM9ZnVuY3Rpb24odCxlKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtyZXR1cm4gbi5jbGFzc05hbWU9IiIuY29uY2F0KCJ1bC12aWRlby1idG4iLCIgIikuY29uY2F0KHQpLG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSxmdW5jdGlvbigpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF0sZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChwKSxuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGgpO3Q/KGUuY2xhc3NMaXN0LnJlbW92ZSh6dCksZS5jbGFzc0xpc3QuYWRkKEh0KSxuLmNsYXNzTGlzdC5hZGQoenQpLG4uY2xhc3NMaXN0LnJlbW92ZShIdCkpOihsZShsKSxlLmNsYXNzTGlzdC5hZGQoenQpLGUuY2xhc3NMaXN0LnJlbW92ZShIdCksbi5jbGFzc0xpc3QucmVtb3ZlKHp0KSxuLmNsYXNzTGlzdC5hZGQoSHQpKX0oZSl9KSksbn0sTz1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuaWQ9InVsLXF1ZXN0aW9uLXBsYXllci1jb250YWluZXIiLHQuY2xhc3NOYW1lPSJ1bC12aWRlby1jb250YWluZXIgIi5jb25jYXQoSHQpLHQuYXBwZW5kQ2hpbGQoKCh0LGUsbixyPSExLG89Imh0dHBzOi8vYXBpLnNwcmlnLmNvbSIpPT57Y29uc3QgaT10K1p0LGE9YWUoaSk7cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlY3VyaXR5cG9saWN5dmlvbGF0aW9uIiwodD0+e0p0KG5ldyBFcnJvcihgVm9pY2UgJiBWaWRlbyBmZWF0dXJlIHZpb2xhdGVzICR7dC52aW9sYXRlZERpcmVjdGl2ZX0gd2ViIHBhZ2UgQ1NQIHBvbGljaWVzIGZvciB0aGUgcXVlc3Rpb24gcGxheWVyLmApLCJwbGF5ZXJEZXZpY2VFcnJvciIsbyx7fSl9KSksWHQoYSxHdCwoKCk9Pntkb2N1bWVudC5nZXRFbGVtZW50QnlJZChCdChpKSkucmVtb3ZlKCksY2UoaSxhKTtjb25zdCB0PXdpbmRvdy52aWRlb2pzKGkse3BsYXlzaW5saW5lOiEwLHBsYXliYWNrUmF0ZXM6Wy41LDEsMS41LDJdfSksbz10ZSh0LFsiUGxheWJhY2tSYXRlTWVudUJ1dHRvbiIsIlBsYXlUb2dnbGUiLCJGdWxsc2NyZWVuVG9nZ2xlIl0pLGM9by5jaGlsZHJlbigpLmZpbmQoKHQ9PiJGdWxsc2NyZWVuVG9nZ2xlIj09PXQubmFtZV8pKTtjLmhhc0NsYXNzKCJ2anMtZGlzYWJsZWQiKSYmYy5oaWRlKCkscmUodCxvLGUsbixyKX0pKSxhfSkobCx7c3JjOnYsdHlwZToiYXBwbGljYXRpb24veC1tcGVnVVJMIn0sdm9pZCAwLG8ubWVkaWFUeXBlPT09cGUuTUVESUFfVFlQRV9BVURJTyxiKSk7dmFyIGU9UygidWwtcmVjb3JkLXJlc3BvbnNlLWJ0biIsITEpO3JldHVybiB0LmFwcGVuZENoaWxkKGUpLHR9LEk9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmlkPSJ1bC1yZWNvcmRlci1wbGF5ZXItY29udGFpbmVyIix0LmNsYXNzTmFtZT0idWwtdmlkZW8tY29udGFpbmVyICIuY29uY2F0KHp0KTt2YXIgZT1TKCJ1bC1iYWNrLXF1ZXN0aW9uLWJ0biIsITApO3JldHVybiB0LmFwcGVuZENoaWxkKGUpLHQuYXBwZW5kQ2hpbGQoKCh0LGU9e30sbj0iaHR0cHM6Ly9hcGkudXNlcmxlYXAuY29tIixyLG8saSxhPSExKT0+e2NvbnN0IGM9dCskdCxzPWFlKGMpO3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWN1cml0eXBvbGljeXZpb2xhdGlvbiIsKHQ9Pntjb25zdCBlPXdpbmRvdy52aWRlb2pzKGMpO0p0KG5ldyBFcnJvcihgVm9pY2UgJiBWaWRlbyBmZWF0dXJlIHZpb2xhdGVzICR7dC52aW9sYXRlZERpcmVjdGl2ZX0gd2ViIHBhZ2UgQ1NQIHBvbGljaWVzIGZvciB0aGUgcmVjb3JkZXIgcGxheWVyLmApLCJyZWNvcmRlckRldmljZUVycm9yIixuLGksZS5wYXlsb2FkLnZpc2l0b3JJZCxlLnBheWxvYWQuZW52SWQpfSkpLFh0KHMsR3QuY29uY2F0KFd0KSwoKCk9PntjZShjLHMpLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEJ0KGMpKS5yZW1vdmUoKSxvZShzLGMsZSxuLHIsbyxpLGEpfSkpLHN9KShsLHtzdXJ2ZXlJZDp5LHJlc3BvbnNlR3JvdXBVaWQ6bSxxdWVzdGlvbklkOmEsdmlzaXRvcklkOngsZW52SWQ6RX0sYixrLCExLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP3ZlKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cigpKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTp2ZShPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH0oe30saix7IngtdWwtdmlkZW8tcmVjb3JkZXItb3JpZ2luIjoic2RrIn0pLG8ubWVkaWFUeXBlPT09cGUuTUVESUFfVFlQRV9BVURJTykpLHR9LFQ9TXQobyk7cmV0dXJuIEEoImRpdiIse2NsYXNzTmFtZTpsdCxrZXk6YX0sQSgiZm9ybSIse2lkOmQsY2xhc3NOYW1lOnUsb25jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgUmVzaXplT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBjKCl9KSksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoWSkpO3Qub2JzZXJ2ZShlKX0sb25zdWJtaXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHllKHQsaSl9fSxfdChULG4pLFQsQSgiZGl2Iix7aWQ6InVsLWNhcmQtdm9pY2VfX3ZpZGVvIn0sQSgiZGl2Iix7aWQ6bCxvbmNyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGwpO3JldHVybiB0LmFwcGVuZENoaWxkKE8oKSksdC5hcHBlbmRDaGlsZChJKCkpLHR9fSksQSgiYnV0dG9uIix7aWQ6ZixjbGFzc05hbWU6InVsLWNhcmQtdGV4dF9fYnV0dG9uICIuY29uY2F0KGdlKSxvbmNsaWNrOmZ1bmN0aW9uKGUpe2lmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLHVlKGwpLGRvY3VtZW50LmZvcm1zW2RdKXt0LmNhcmREYXRhLnVwbG9hZElkP3llKHt9LGkpOnllKHtkZWxldGVkQXQ6RGF0ZS5ub3coKX0saSk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaCkuY2xhc3NMaXN0LmFkZCh6dCksbi5jbGFzc0xpc3QucmVtb3ZlKHp0KX19LHJvbGU6ImJ1dHRvbiJ9LFJ0KG8pKSksQShUdCxudWxsKSkpfX19LGxvY2FsZToiZW4iLGFwaVVSTDoiaHR0cHM6Ly9hcGkudXNlcmxlYXAuY29tIixzaG93U3VydmV5QnJhbmQ6ITAsbWFya2V0aW5nVXJsOiJodHRwczovL3VzZXJsZWFwLmNvbSIsc2x1Z05hbWU6bnVsbCxyZXNwb25zZUdyb3VwVWlkOm51bGwsaGVhZGVyczp7fSxpc1ByZXZpZXc6ITEsYW5zd2VyczpbXSxjdXN0b21NZXRhZGF0YTp7fX0sQmU9e2luaXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5zdXJ2ZXlJZCxuPXQuZnJhbWUscj10LmNhcmRzLG89dC5lbnZJZCxpPXQudXNlcklkLGE9dC5tZXRhLGM9dC5ib3JkZXIscz10LmZvbnRGYW1pbHksdT10LmZvbnRGYW1pbHlVUkwsbD10Lm1vZGUsZj10LmNvbnRleHQsZD10LmxvY2FsZSxwPXQuYXBpVVJMLGg9dC5zaG93U3VydmV5QnJhbmQsdj10Lm1hcmtldGluZ1VybCxnPXQuc2x1Z05hbWUseT10LnJlc3BvbnNlR3JvdXBVaWQsbT10LmhlYWRlcnMsYj10LmVuZENhcmQseD10LmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljayx3PXQuaXNQcmV2aWV3LEU9dC5hbnN3ZXJzLGo9dC5jdXN0b21NZXRhZGF0YSxDPXQuZXhwZXJpbWVudEZsYWdzLGs9dC51c2VNb2JpbGVTdHlsaW5nLFM9dC5ldmVudEVtaXR0ZXI7cmV0dXJuIGZ1bmN0aW9uKHQsTyl7cmV0dXJuIFBlKHt9LE8uYWRkRGVjayh7ZGVjazpyLGhhc0VuZENhcmQ6Yn0pLHtzdXJ2ZXlJZDplLHJ1bm5pbmc6ITAsZnJhbWU6bixlbnZJZDpvLHVzZXJJZDppLG1ldGE6YSxib3JkZXI6Yyxmb250RmFtaWx5OnMsZm9udEZhbWlseVVSTDp1LHRpbWVvdXQ6MSxtb2RlOmwsY29udGV4dDpmLGxvY2FsZTpkLGFwaVVSTDpwLHNob3dTdXJ2ZXlCcmFuZDpoLG1hcmtldGluZ1VybDp2LHNsdWdOYW1lOmcscmVzcG9uc2VHcm91cFVpZDp5LGhlYWRlcnM6bSxlbmRDYXJkOmIsY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrOngsaXNQcmV2aWV3OncsYW5zd2VyczpFLGN1c3RvbU1ldGFkYXRhOmosZXhwZXJpbWVudEZsYWdzOkMsdXNlTW9iaWxlU3R5bGluZzprLGV2ZW50RW1pdHRlcjpTfSl9fSxhZGREZWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGVjayxuPXQuaGFzRW5kQ2FyZDtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBQZSh7fSxlLHtDYXJkOnQuY2FyZHNbZS50eXBlXX0pfSkpO3JldHVybiBuJiZyLnB1c2goe0NhcmQ6dC5jYXJkcy50aGFua3N9KSx7ZGVjazp7aW5kZXg6MCxjYXJkczpyfX19fSxjb21wbGV0ZTpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybntpbnRlcnZhbDpzZXRJbnRlcnZhbChlLmRlZHVjdCwxZTMpfX19LHNlZW46ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtEZSh0KXx8ZS50cmFja0hpc3Rvcnkoe2V2ZW50OiJzZWVuIixpc05ldzohMH0pfX0sY2xvc2U6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighRGUodCkpcmV0dXJuIGUudHJhY2tIaXN0b3J5KHtldmVudDoiY2xvc2VkIn0pfX0sc3VibWl0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucmVzcG9uc2Usbj10LnJlc3BvbnNlR3JvdXBVaWQscj10LmNvbXBsZXRlZEF0O3JldHVybiBmdW5jdGlvbigpe3ZhciB0PU4oKShSKCkubWFyaygoZnVuY3Rpb24gdChvKXt2YXIgaSxhO3JldHVybiBSKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYobiYmIURlKG8pKXt0Lm5leHQ9MjticmVha31yZXR1cm4gdC5hYnJ1cHQoInJldHVybiIpO2Nhc2UgMjpyZXR1cm4gaT17cmVzcG9uc2VHcm91cFVpZDpuLG1ldGE6by5tZXRhLGN1c3RvbU1ldGFkYXRhOm8uY3VzdG9tTWV0YWRhdGEscmVzcG9uc2VzOltlXSxjb21wbGV0ZWRBdDpyfSx0Lm5leHQ9NSxfZSgiIi5jb25jYXQoby5hcGlVUkwsIi9zZGsvMS9lbnZpcm9ubWVudHMvIikuY29uY2F0KG8uZW52SWQsIi92aXNpdG9ycy8iKS5jb25jYXQoby51c2VySWQsIi9yZXNwb25zZXMvc3VibWl0Iikse2JvZHk6SlNPTi5zdHJpbmdpZnkoaSksaGVhZGVyczpvLmhlYWRlcnMsbWV0aG9kOiJQT1NUIn0pO2Nhc2UgNTppZihhPXQuc2VudCxkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKSxhLm9rKXt0Lm5leHQ9MTM7YnJlYWt9aWYoIWEucmVwb3J0RXJyb3Ipe3QubmV4dD0xMjticmVha31yZXR1cm4gY29uc29sZS53YXJuKCJbVXNlckxlYXBdIChFUlItNDI3KSBGYWlsZWQgdG8gc3VibWl0IHJlc3BvbnNlIixhLmVycm9yKSx0Lm5leHQ9MTIsTmUobywic3VibWl0UmVzcG9uc2UiLGEuZXJyb3IpO2Nhc2UgMTI6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDEzOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSxkZWR1Y3Q6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC50aW1lb3V0LTE7cmV0dXJuIGU8PTA/KGNsZWFySW50ZXJ2YWwodC5pbnRlcnZhbCksU3QuZW5hYmxlKCkse3J1bm5pbmc6ITEsaW50ZXJ2YWw6bnVsbCx0aW1lb3V0OmV9KTp7dGltZW91dDplfX19LG5leHQ6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIHI9RGF0ZS5ub3coKSxvPWUuZGVjayxpPW8uY2FyZHMsYT1vLmluZGV4LGM9aVthXSxzPWMubmFtZSx1PWMudHlwZSxsPWUucmVzcG9uc2VHcm91cFVpZCxmPSJvYmplY3QiPT09QXQoKSh0LmRhdGEpP3QuZGF0YTp7dmFsdWU6dC5kYXRhfSxkPWYudmFsdWU7aVthXS52YWx1ZT1kLGYucXVlc3Rpb25JZD1zLGYuYW5zd2VyZWRBdD1yO3ZhciBwPXtyZXNwb25zZTpmLHJlc3BvbnNlR3JvdXBVaWQ6bCx0eXBlOnV9LGg9Im11bHRpcGxlY2hvaWNlIj09PXU/T2JqZWN0LnZhbHVlcyhkKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4hMSE9PXR9KSk6ZCx2PSJ2aWRlb3ZvaWNlIiE9PXV8fCFmLmRlbGV0ZWRBdDsibXVsdGlwbGVzZWxlY3QiPT09dSYmKGg9aVthXS5wcm9wcy5vcHRpb25zLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZFtlLmlkXSYmdC5wdXNoKGUudmFsdWUpLHR9KSxbXSkpO3ZhciBnPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPSEoYXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0pfHxhcmd1bWVudHNbNF07aWYoZT49dC5sZW5ndGh8fGU8MClyZXR1cm4gbnVsbDtmb3IodmFyIGk9dFtlXSYmdFtlXS5wcm9wcyYmdFtlXS5wcm9wcy5yb3V0aW5nT3B0aW9uc3x8W10sYT1NYXRoLm1pbihlKzEsdC5sZW5ndGgtMSksYz1udWxsLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIHU9aVtzXSxsPXUuY29tcGFyYXRvcixmPXUudGFyZ2V0LGQ9dS52YWx1ZTtpZigiYW5zd2VyZWQiPT09bCYmbyl7Yz1wYXJzZUludChmLDEwKTticmVha31pZihtZVtsXSYmbWVbbF0obixkKSl7Yz1wYXJzZUludChmLDEwKTticmVha319cmV0dXJuIG51bGw9PT1jJiZlPT09dC5sZW5ndGgtMT9udWxsOi0xPT09Yz9yP3QubGVuZ3RoLTE6bnVsbDpudWxsPT09Yz9hOmN9KGksYSxoLCEhdC5lbmRDYXJkLHYpO2lmKG51bGw9PT1nKXJldHVybiBwLmNvbXBsZXRlZEF0PXIsbi5zdWJtaXQocCksdm9pZCB0LmNvbXBsZXRlU3VydmV5KCk7aVtnXS5DYXJkPT09ZS5jYXJkcy50aGFua3MmJihwLmNvbXBsZXRlZEF0PXIpO3ZhciB5PW4uc3VibWl0KHApO3JldHVybiBpW2ddLkNhcmQhPWUuY2FyZHMudGhhbmtzJiZ5LmZpbmFsbHkoKGZ1bmN0aW9uKCl7bi50cmFja0hpc3Rvcnkoe2V2ZW50OiJzZWVuIixpbmRleDpnfSl9KSkse2RlY2s6e2NhcmRzOmksaW5kZXg6Z319fX0sdHJhY2tIaXN0b3J5OmZ1bmN0aW9uKHQpe3ZhciBlPXQuZXZlbnQsbj10LmluZGV4LHI9dC5pc05ldyxvPXZvaWQgMCE9PXImJnI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9TigpKFIoKS5tYXJrKChmdW5jdGlvbiB0KHIpe3ZhciBpLGEsYyxzLHUsbDtyZXR1cm4gUigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKCFEZShyKSl7dC5uZXh0PTI7YnJlYWt9cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDI6cmV0dXJuIGk9ci5kZWNrLGE9aS5jYXJkcyxjPWkuaW5kZXgscz12b2lkIDAhPT1uP2Fbbl06YVtjXSx1PXtzaWQ6ci5zdXJ2ZXlJZCxxaWQ6cy5uYW1lLGFjdGlvbjplLHZpZDpyLnVzZXJJZCxlaWQ6ci5lbnZJZCxpc05ldzpvLHJlc3BvbnNlR3JvdXBVaWQ6ci5yZXNwb25zZUdyb3VwVWlkfSx0Lm5leHQ9NyxfZSgiIi5jb25jYXQoci5hcGlVUkwsIi9zZGsvMS92aXNpdG9ycy8iKS5jb25jYXQoci51c2VySWQsIi9zdXJ2ZXlzLyIpLmNvbmNhdChyLnN1cnZleUlkLCIvaGlzdG9yeSIpLHtib2R5OkpTT04uc3RyaW5naWZ5KHUpLGhlYWRlcnM6ci5oZWFkZXJzLG1ldGhvZDoiUE9TVCJ9KTtjYXNlIDc6aWYoKGw9dC5zZW50KS5vayl7dC5uZXh0PTEzO2JyZWFrfWlmKCFsLnJlcG9ydEVycm9yKXt0Lm5leHQ9MTM7YnJlYWt9cmV0dXJuIGNvbnNvbGUud2FybigiW1VzZXJMZWFwXSAoRVJSLTQyOCkgRmFpbGVkIHRvIHRyYWNrIHN1cnZleSBldmVudCIsbC5lcnJvciksdC5uZXh0PTEzLE5lKHIsInRyYWNrSGlzdG9yeSIsbC5lcnJvcik7Y2FzZSAxMzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKX19O2Z1bmN0aW9uIHplKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBIZSh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj96ZShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3IoKSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6emUoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9dmFyIFZlPXtpbml0OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gSGUoe30sZSx7c2VsZWN0ZWRPcHRpb25zOnR9KX19LHJlc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBIZSh7fSx0LHtzZWxlY3RlZE9wdGlvbnM6e319KX19LHVwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtpZihudWxsIT10KXt2YXIgbj1PYmplY3QuYXNzaWduKGUuc2VsZWN0ZWRPcHRpb25zKTtyZXR1cm4gblt0XT0hblt0XSxIZSh7fSxlLHtzZWxlY3RlZE9wdGlvbnM6bn0pfX19fTtmdW5jdGlvbiBxZSh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59dmFyIFdlPXtvblRleHRDaGFuZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9xZShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3IoKSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6cWUoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9KHt9LGUse3ZhbHVlOnR9KX19fSxHZT0ic3VydmV5LmFwcGVhcmVkIixaZT0ic3VydmV5LmZhZGluZ091dCIsJGU9InN1cnZleS53aWxsQ2xvc2UiLFllPXtWRVJJRllfVklFV19WRVJTSU9OOiJ2ZXJpZnkudmlldy52ZXJzaW9uIn0sS2U9e1ZJRVdfVkVSU0lPTjoidmlldy52ZXJzaW9uIn0sSmU9ImNsb3NlLmNsaWNrIixYZT0ic3VydmV5LmNvbXBsZXRlZCI7ZnVuY3Rpb24gUWUodCl7cmV0dXJuIndlYiIhPT10WyJ1c2VybGVhcC1wbGF0Zm9ybSJdfWZ1bmN0aW9uIHRuKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn12YXIgZW49e2luaXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5mcmFtZSxuPXQuY2FyZHMscj10LnN1cnZleUlkLG89dC5lbnZJZCxpPXQudXNlcklkLGE9dC5tZXRhLGM9dC5ib3JkZXIscz10LmZvbnRGYW1pbHksdT10LmZvbnRGYW1pbHlVUkwsbD10LmNvbnRleHQsZj10LmxvY2FsZSxkPXQuYXBpVVJMLHA9dC5zaG93U3VydmV5QnJhbmQsaD10Lm1hcmtldGluZ1VybCx2PXQuc2x1Z05hbWUsZz10LnJlc3BvbnNlR3JvdXBVaWQseT10LmhlYWRlcnMsbT10LmVuZENhcmQsYj10LmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljayx4PXQuaXNQcmV2aWV3LHc9dC5hbnN3ZXJzLEU9dC5jdXN0b21NZXRhZGF0YSxqPXQuZXhwZXJpbWVudEZsYWdzLEM9dC51c2VNb2JpbGVTdHlsaW5nLGs9dC5tb2JpbGVQbGF0Zm9ybSxTPXQuZXZlbnRFbWl0dGVyO3JldHVybiBmdW5jdGlvbih0LE8pe3ZhciBBPVFlKHkpP3dpbmRvdy5kb2N1bWVudDp3aW5kb3cucGFyZW50LmRvY3VtZW50O08uYXBwLmluaXQoe2ZyYW1lOkEuZ2V0RWxlbWVudEJ5SWQoZSksc3VydmV5SWQ6cixjYXJkczpuLGVudklkOm8sdXNlcklkOmksbWV0YTphLGJvcmRlcjpjLGZvbnRGYW1pbHk6cyxmb250RmFtaWx5VVJMOnUsY29udGV4dDpsLGxvY2FsZTpmLGFwaVVSTDpkLHNob3dTdXJ2ZXlCcmFuZDpwLG1hcmtldGluZ1VybDpoLHNsdWdOYW1lOnYscmVzcG9uc2VHcm91cFVpZDpnLGhlYWRlcnM6eSxlbmRDYXJkOm0sY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrOmIsaXNQcmV2aWV3OngsYW5zd2Vyczp3LGN1c3RvbU1ldGFkYXRhOkUsZXhwZXJpbWVudEZsYWdzOmosdXNlTW9iaWxlU3R5bGluZzpDLG1vYmlsZVBsYXRmb3JtOmssZXZlbnRFbWl0dGVyOlN9KSxPLmFwcC5zZWVuKCl9fSx1cGRhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUuYXBwLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCkuY2xhc3NMaXN0O24ucnVubmluZyYmIXIuY29udGFpbnMoInVsLWFwcC0tdmlzaWJsZSIpJiYoUWUobi5oZWFkZXJzKT9yLmFkZCgidWwtYXBwLS12aXNpYmxlIik6KHIuYWRkKCJ1bC1hcHAtLW92ZXJsYXkiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3IuYWRkKCJ1bC1hcHAtLXZpc2libGUiKX0pLDEwMCkpLG4uZXZlbnRFbWl0dGVyJiZuLmV2ZW50RW1pdHRlci5lbWl0KEdlKSksUWUobi5oZWFkZXJzKXx8bi5mcmFtZS5zZXRIZWlnaHQoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoJCkpO3JldHVybihlP2Uuc2Nyb2xsSGVpZ2h0OjYwMCkrKGUmJmUucGFyZW50RWxlbWVudD9lLnBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LWUuY2xpZW50SGVpZ2h0OjApfShkb2N1bWVudCkpfX0sZmFkZW91dDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1OKCkoUigpLm1hcmsoKGZ1bmN0aW9uIGUobil7dmFyIHIsbztyZXR1cm4gUigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKHI9bi5hcHAsbz1yLmV2ZW50RW1pdHRlciwhUWUoci5oZWFkZXJzKSl7ZS5uZXh0PTQ7YnJlYWt9cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDQ6cmV0dXJuIG8uZW1pdChaZSksZS5hYnJ1cHQoInJldHVybiIsbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3ZhciBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpO24uYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKHQpeyJvcGFjaXR5Ij09PXQucHJvcGVydHlOYW1lJiZlKCl9KSksbi5jbGFzc0xpc3QucmVtb3ZlKCJ1bC1hcHAtLXZpc2libGUiKX0pKSk7Y2FzZSA2OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5pbml0aWF0b3I7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQuYXBwLHI9bi5mcmFtZSxvPW4uZXZlbnRFbWl0dGVyO1siaW9zIiwiYW5kcm9pZCJdLmluY2x1ZGVzKG4uaGVhZGVyc1sidXNlcmxlYXAtcGxhdGZvcm0iXSkmJm8uZW1pdCgkZSx7aW5pdGlhdG9yOmV9KSxRZShuLmhlYWRlcnMpfHwoby5lbWl0KCRlLHtpbml0aWF0b3I6ZX0pLHIucmVtb3ZlKCkpfX0sY2xvc2U6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9TigpKFIoKS5tYXJrKChmdW5jdGlvbiBlKG4scil7cmV0dXJuIFIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsci5mYWRlb3V0KHQpO2Nhc2UgMjpyZXR1cm4gZS5uZXh0PTQsci5hcHAuY2xvc2UoKTtjYXNlIDQ6U3QuZW5hYmxlKCksci5yZW1vdmUoe2luaXRpYXRvcjpKZX0pO2Nhc2UgNjpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKTtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSxkZXN0cm95OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPU4oKShSKCkubWFyaygoZnVuY3Rpb24gZShuLHIpe3JldHVybiBSKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHIuZmFkZW91dCh0KTtjYXNlIDI6U3QuZW5hYmxlKCksci5yZW1vdmUoe2luaXRpYXRvcjpYZX0pO2Nhc2UgNDpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKTtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfX0sbm49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/dG4oT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyKCkodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnRuKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fSh7YXBwOkJlLG11bHRpcGxlc2VsZWN0OlZlLG9wZW5UZXh0OldlfSxlbikscm49e2FwcDpVZSxtdWx0aXBsZXNlbGVjdDp7c2VsZWN0ZWRPcHRpb25zOnt9fSxvcGVuVGV4dDp7dmFsdWU6IiJ9fTt2YXIgb249d2luZG93Ll9fY2ZnLGFuPW9uLmZyYW1lLGNuPW9uLmVudklkLHNuPW9uLnN1cnZleUlkLHVuPW9uLnVzZXJJZCxsbj1vbi5jYXJkcyxmbj1vbi5tb2RlLGRuPW9uLmJvcmRlcixwbj12b2lkIDA9PT1kbj8iIzY2NjRmNyI6ZG4saG49b24uY29udGV4dCx2bj1vbi5sb2NhbGUsZ249b24uZm9udEZhbWlseSx5bj1vbi5mb250RmFtaWx5VVJMLG1uPW9uLmFwaVVSTCxibj1vbi5zaG93U3VydmV5QnJhbmQseG49b24ubWFya2V0aW5nVXJsLHduPW9uLnNsdWdOYW1lLEVuPW9uLnJlc3BvbnNlR3JvdXBVaWQsam49b24uaGVhZGVycyxDbj1vbi5lbmRDYXJkLGtuPW9uLmN1c3RvbVN0eWxlcyxTbj1vbi5jb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2ssT249b24uaXNQcmV2aWV3LEFuPW9uLmFuc3dlcnMsSW49b24uY3VzdG9tTWV0YWRhdGEsVG49b24uZXhwZXJpbWVudEZsYWdzLE1uPW9uLnVzZU1vYmlsZVN0eWxpbmcsX249b24ubW9iaWxlUGxhdGZvcm0sTG49b24uZXZlbnRFbWl0dGVyLFJuPWRvY3VtZW50LmhlYWQsUG49TG58fGFuLmV2ZW50RW1pdHRlcjtQbiYmUG4uZW1pdChZZS5WRVJJRllfVklFV19WRVJTSU9OLHIoKSh7fSxLZS5WSUVXX1ZFUlNJT04sIjIuMTQuMiIpKTt2YXIgTm49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtpZihObi50eXBlPSJ0ZXh0L2NzcyIsTm4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoeXQoKSkpLFJuLmFwcGVuZENoaWxkKE5uKSxrbiYmZnVuY3Rpb24odCxlKXt2YXIgbj10LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7bi50eXBlPSJ0ZXh0L2NzcyIsbi50ZXh0Q29udGVudD1lLG4uaWQ9Wix0LmhlYWQuYXBwZW5kQ2hpbGQobil9KGRvY3VtZW50LGtuKSxnbiYmeW4mJnBhcmVudCl7dmFyIEZuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTtGbi5yZWw9InN0eWxlc2hlZXQiLEZuLmhyZWY9eW4sUm4uYXBwZW5kQ2hpbGQoRm4pfXZhciBEbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpPVtdLm1hcCxhPXImJnIuY2hpbGRyZW5bMF18fG51bGwsYz1hJiZmdW5jdGlvbiB0KGUpe3JldHVybntub2RlTmFtZTplLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYXR0cmlidXRlczp7fSxjaGlsZHJlbjppLmNhbGwoZS5jaGlsZE5vZGVzLChmdW5jdGlvbihlKXtyZXR1cm4gMz09PWUubm9kZVR5cGU/ZS5ub2RlVmFsdWU6dChlKX0pKX19KGEpLHM9W10sdT0hMCxsPXYodCksZj1mdW5jdGlvbiB0KGUsbixyKXtmb3IodmFyIG8gaW4gcikiZnVuY3Rpb24iPT10eXBlb2YgcltvXT9mdW5jdGlvbih0LG8pe3JbdF09ZnVuY3Rpb24odCl7dmFyIGk9byh0KTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaSYmKGk9aSh5KGUsbCkscikpLGkmJmkhPT0obj15KGUsbCkpJiYhaS50aGVuJiZoKGw9ZyhlLHYobixpKSxsKSksaX19KG8scltvXSk6dChlLmNvbmNhdChvKSxuW29dPXYobltvXSkscltvXT12KHJbb10pKTtyZXR1cm4gcn0oW10sbCx2KGUpKTtyZXR1cm4gaCgpLGY7ZnVuY3Rpb24gZCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9kKHQobCxmKSk6bnVsbCE9dD90OiIifWZ1bmN0aW9uIHAoKXtvPSFvO3ZhciB0PWQobik7Zm9yKHImJiFvJiYoYT1DKHIsYSxjLGM9dCkpLHU9ITE7cy5sZW5ndGg7KXMucG9wKCkoKX1mdW5jdGlvbiBoKCl7b3x8KG89ITAsc2V0VGltZW91dChwKSl9ZnVuY3Rpb24gdih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KW5bcl09dFtyXTtmb3IodmFyIHIgaW4gZSluW3JdPWVbcl07cmV0dXJuIG59ZnVuY3Rpb24gZyh0LGUsbil7dmFyIHI9e307cmV0dXJuIHQubGVuZ3RoPyhyW3RbMF1dPXQubGVuZ3RoPjE/Zyh0LnNsaWNlKDEpLGUsblt0WzBdXSk6ZSx2KG4scikpOmV9ZnVuY3Rpb24geSh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7KWU9ZVt0W24rK11dO3JldHVybiBlfWZ1bmN0aW9uIG0odCl7cmV0dXJuIHQ/dC5rZXk6bnVsbH1mdW5jdGlvbiBiKHQpe3JldHVybiB0LmN1cnJlbnRUYXJnZXQuZXZlbnRzW3QudHlwZV0odCl9ZnVuY3Rpb24geCh0LGUsbixyLG8pe2lmKCJrZXkiPT09ZSk7ZWxzZSBpZigic3R5bGUiPT09ZSlpZigic3RyaW5nIj09dHlwZW9mIG4pdC5zdHlsZS5jc3NUZXh0PW47ZWxzZSBmb3IodmFyIGkgaW4ic3RyaW5nIj09dHlwZW9mIHImJihyPXQuc3R5bGUuY3NzVGV4dD0iIiksdihyLG4pKXt2YXIgYT1udWxsPT1ufHxudWxsPT1uW2ldPyIiOm5baV07Ii0iPT09aVswXT90LnN0eWxlLnNldFByb3BlcnR5KGksYSk6dC5zdHlsZVtpXT1hfWVsc2UibyI9PT1lWzBdJiYibiI9PT1lWzFdPyhlPWUuc2xpY2UoMiksdC5ldmVudHM/cnx8KHI9dC5ldmVudHNbZV0pOnQuZXZlbnRzPXt9LHQuZXZlbnRzW2VdPW4sbj9yfHx0LmFkZEV2ZW50TGlzdGVuZXIoZSxiKTp0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxiKSk6ZSBpbiB0JiYibGlzdCIhPT1lJiYidHlwZSIhPT1lJiYiZHJhZ2dhYmxlIiE9PWUmJiJzcGVsbGNoZWNrIiE9PWUmJiJ0cmFuc2xhdGUiIT09ZSYmIW8/dFtlXT1udWxsPT1uPyIiOm46bnVsbCE9biYmITEhPT1uJiZ0LnNldEF0dHJpYnV0ZShlLG4pLG51bGwhPW4mJiExIT09bnx8dC5yZW1vdmVBdHRyaWJ1dGUoZSl9ZnVuY3Rpb24gdyh0LGUpe3ZhciBuPSJzdHJpbmciPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0P2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpOihlPWV8fCJzdmciPT09dC5ub2RlTmFtZSk/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdC5ub2RlTmFtZSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0Lm5vZGVOYW1lKSxyPXQuYXR0cmlidXRlcztpZihyKXtyLm9uY3JlYXRlJiZzLnB1c2goKGZ1bmN0aW9uKCl7ci5vbmNyZWF0ZShuKX0pKTtmb3IodmFyIG89MDtvPHQuY2hpbGRyZW4ubGVuZ3RoO28rKyluLmFwcGVuZENoaWxkKHcodC5jaGlsZHJlbltvXT1kKHQuY2hpbGRyZW5bb10pLGUpKTtmb3IodmFyIGkgaW4gcil4KG4saSxyW2ldLG51bGwsZSl9cmV0dXJuIG59ZnVuY3Rpb24gRSh0LGUpe3ZhciBuPWUuYXR0cmlidXRlcztpZihuKXtmb3IodmFyIHI9MDtyPGUuY2hpbGRyZW4ubGVuZ3RoO3IrKylFKHQuY2hpbGROb2Rlc1tyXSxlLmNoaWxkcmVuW3JdKTtuLm9uZGVzdHJveSYmbi5vbmRlc3Ryb3kodCl9cmV0dXJuIHR9ZnVuY3Rpb24gaih0LGUsbil7ZnVuY3Rpb24gcigpe3QucmVtb3ZlQ2hpbGQoRShlLG4pKX12YXIgbz1uLmF0dHJpYnV0ZXMmJm4uYXR0cmlidXRlcy5vbnJlbW92ZTtvP28oZSxyKTpyKCl9ZnVuY3Rpb24gQyh0LGUsbixyLG8pe2lmKHI9PT1uKTtlbHNlIGlmKG51bGw9PW58fG4ubm9kZU5hbWUhPT1yLm5vZGVOYW1lKXt2YXIgaT13KHIsbyk7dC5pbnNlcnRCZWZvcmUoaSxlKSxudWxsIT1uJiZqKHQsZSxuKSxlPWl9ZWxzZSBpZihudWxsPT1uLm5vZGVOYW1lKWUubm9kZVZhbHVlPXI7ZWxzZXshZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBvIGluIHYoZSxuKSluW29dIT09KCJ2YWx1ZSI9PT1vfHwiY2hlY2tlZCI9PT1vP3Rbb106ZVtvXSkmJngodCxvLG5bb10sZVtvXSxyKTt2YXIgaT11P24ub25jcmVhdGU6bi5vbnVwZGF0ZTtpJiZzLnB1c2goKGZ1bmN0aW9uKCl7aSh0LGUpfSkpfShlLG4uYXR0cmlidXRlcyxyLmF0dHJpYnV0ZXMsbz1vfHwic3ZnIj09PXIubm9kZU5hbWUpO2Zvcih2YXIgYT17fSxjPXt9LGw9W10sZj1uLmNoaWxkcmVuLHA9ci5jaGlsZHJlbixoPTA7aDxmLmxlbmd0aDtoKyspe2xbaF09ZS5jaGlsZE5vZGVzW2hdLG51bGwhPSh5PW0oZltoXSkpJiYoYVt5XT1bbFtoXSxmW2hdXSl9aD0wO2Zvcih2YXIgZz0wO2c8cC5sZW5ndGg7KXt2YXIgeT1tKGZbaF0pLGI9bShwW2ddPWQocFtnXSkpO2lmKGNbeV0paCsrO2Vsc2UgaWYobnVsbD09Ynx8YiE9PW0oZltoKzFdKSlpZihudWxsPT1ifHx1KW51bGw9PXkmJihDKGUsbFtoXSxmW2hdLHBbZ10sbyksZysrKSxoKys7ZWxzZXt2YXIgRT1hW2JdfHxbXTt5PT09Yj8oQyhlLEVbMF0sRVsxXSxwW2ddLG8pLGgrKyk6RVswXT9DKGUsZS5pbnNlcnRCZWZvcmUoRVswXSxsW2hdKSxFWzFdLHBbZ10sbyk6QyhlLGxbaF0sbnVsbCxwW2ddLG8pLGNbYl09cFtnXSxnKyt9ZWxzZSBudWxsPT15JiZqKGUsbFtoXSxmW2hdKSxoKyt9Zm9yKDtoPGYubGVuZ3RoOyludWxsPT1tKGZbaF0pJiZqKGUsbFtoXSxmW2hdKSxoKys7Zm9yKHZhciBoIGluIGEpY1toXXx8aihlLGFbaF1bMF0sYVtoXVsxXSl9cmV0dXJuIGV9fShybixubix2dCxRZShqbik/d2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFuKTpkb2N1bWVudC5ib2R5KTtEbi5pbml0KHtzdXJ2ZXlJZDpzbixmcmFtZTphbixlbnZJZDpjbix1c2VySWQ6dW4sY2FyZHM6bG4sbW9kZTpmbixtZXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGlyZWN0RW1iZWQsbj10Lm1vZGUscj12b2lkIDA9PT1uP251bGw6bixvPWU/d2luZG93OndpbmRvdy5wYXJlbnQsaT1vLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtyZXR1cm57bW9kZTpyLHN3Om8uc2NyZWVuLndpZHRoLHNoOm8uc2NyZWVuLmhlaWdodCxjdzppLmNsaWVudFdpZHRoLGNoOmkuY2xpZW50SGVpZ2h0LHA6by5sb2NhdGlvbi5ocmVmLGw6by5uYXZpZ2F0b3IubGFuZ3VhZ2V9fSh7bW9kZTpmbixkaXJlY3RFbWJlZDpRZShqbil9KSxib3JkZXI6cG4sZm9udEZhbWlseTpnbixjb250ZXh0OmhuLGxvY2FsZTp2bixhcGlVUkw6bW4sc2hvd1N1cnZleUJyYW5kOmJuLG1hcmtldGluZ1VybDp4bixzbHVnTmFtZTp3bixyZXNwb25zZUdyb3VwVWlkOkVuLGhlYWRlcnM6am4sZW5kQ2FyZDpDbixjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2s6U24saXNQcmV2aWV3Ok9uLGFuc3dlcnM6QW4sY3VzdG9tTWV0YWRhdGE6SW4sZXhwZXJpbWVudEZsYWdzOlRuLHVzZU1vYmlsZVN0eWxpbmc6TW4sbW9iaWxlUGxhdGZvcm06X24sZXZlbnRFbWl0dGVyOkxufSl9KCl9KCk7";
|
|
1
|
+
declare var _default: "LyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAl2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7CgovKioqLyAiLi9zcmMvc2hhcmVkL2NvbmZsaWN0aW5nX3dpZGdldHMvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy9zaGFyZWQvY29uZmxpY3Rpbmdfd2lkZ2V0cy9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gQ29uZmxpY3RpbmdXaWRnZXRzOyB9Ci8qIGhhcm1vbnkgZXhwb3J0ICovIH0pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjayAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfY2xhc3NDYWxsQ2hlY2tfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NyZWF0ZUNsYXNzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NyZWF0ZUNsYXNzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jcmVhdGVDbGFzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9pbnRlcmNvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9pbnRlcmNvbSAqLyAiLi9zcmMvc2hhcmVkL2NvbmZsaWN0aW5nX3dpZGdldHMvaW50ZXJjb20uanMiKTsKCgoKdmFyIHdpZGdldHMgPSBbX2ludGVyY29tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19dOwoKdmFyIENvbmZsaWN0aW5nV2lkZ2V0cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gQ29uZmxpY3RpbmdXaWRnZXRzKCkgewogICAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0aGlzLCBDb25mbGljdGluZ1dpZGdldHMpOwogIH0KCiAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jcmVhdGVDbGFzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKShDb25mbGljdGluZ1dpZGdldHMsIG51bGwsIFt7CiAgICBrZXk6ICJkaXNhYmxlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgICB3aWRnZXRzLmZvckVhY2goZnVuY3Rpb24gKHcpIHsKICAgICAgICByZXR1cm4gdy5kaXNhYmxlKCk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImVuYWJsZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlKCkgewogICAgICB3aWRnZXRzLmZvckVhY2goZnVuY3Rpb24gKHcpIHsKICAgICAgICByZXR1cm4gdy5lbmFibGUoKTsKICAgICAgfSk7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gQ29uZmxpY3RpbmdXaWRnZXRzOwp9KCk7CgoKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3NoYXJlZC9jb25mbGljdGluZ193aWRnZXRzL2ludGVyY29tLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL2NvbmZsaWN0aW5nX3dpZGdldHMvaW50ZXJjb20uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJlbmFibGUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZW5hYmxlOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJkaXNhYmxlIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGRpc2FibGU7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGdsb2JhbCB3aW5kb3csIGRvY3VtZW50ICovCnZhciBnZXRJbnRlcmNvbSA9IGZ1bmN0aW9uIGdldEludGVyY29tKCkgewogIHRyeSB7CiAgICByZXR1cm4gd2luZG93LnBhcmVudC5JbnRlcmNvbTsKICB9IGNhdGNoIChlcnIpIHt9Cn07Cgp2YXIgZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkgewogIHZhciBJbnRlcmNvbSA9IGdldEludGVyY29tKCk7CiAgaWYgKCFJbnRlcmNvbSkgcmV0dXJuOwoKICBpZiAoSW50ZXJjb20udWxfd2FzVmlzaWJsZSkgewogICAgSW50ZXJjb20oJ3VwZGF0ZScsIHsKICAgICAgaGlkZV9kZWZhdWx0X2xhdW5jaGVyOiBmYWxzZQogICAgfSk7CiAgfQoKICBkZWxldGUgSW50ZXJjb20udWxfd2FzVmlzaWJsZTsKfTsKdmFyIGRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkgewogIHZhciBJbnRlcmNvbSA9IGdldEludGVyY29tKCk7CiAgaWYgKCFJbnRlcmNvbSkgcmV0dXJuOwogIEludGVyY29tLnVsX3dhc1Zpc2libGUgPSAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZS5pbnRlcmNvbS1sYXVuY2hlci1mcmFtZScpOwoKICBpZiAoSW50ZXJjb20udWxfd2FzVmlzaWJsZSkgewogICAgSW50ZXJjb20oJ3VwZGF0ZScsIHsKICAgICAgaGlkZV9kZWZhdWx0X2xhdW5jaGVyOiB0cnVlCiAgICB9KTsKICB9Cn07CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJBUFBfTU9ERVMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gQVBQX01PREVTOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJQQUdFX1VSTF9FVkVOVF9OQU1FIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFBBR0VfVVJMX0VWRU5UX05BTUU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIkhFQURFUlMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gSEVBREVSUzsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiSU5TVEFMTEFUSU9OX01FVEhPRCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBJTlNUQUxMQVRJT05fTUVUSE9EOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJDU1NfQ09OU1RBTlRTIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIENTU19DT05TVEFOVFM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIkVYUEVSSU1FTlRfRkxBR1MiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gRVhQRVJJTUVOVF9GTEFHUzsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiTU9CSUxFX01BWF9XSURUSCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBNT0JJTEVfTUFYX1dJRFRIOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJnZXRDbGFzc2VzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGdldENsYXNzZXM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldFBsYXRmb3JtQ2xhc3MiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0UGxhdGZvcm1DbGFzczsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiTU9CSUxFX1BMQVRGT1JNX0hFQURFUlMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gTU9CSUxFX1BMQVRGT1JNX0hFQURFUlM7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qKgogKiBWYXJpb3VzIG1vZGVzIHRoYXQgdGhlIGFwcCBjYW4gYmUgaW4uIEZvciBub3cgdGVzdCBpcyB0aGUKICogb25seSBvbmUgdGhhdCBtYXR0ZXJzCiAqIEB0eXBlIHtPYmplY3R9CiAqLwp2YXIgQVBQX01PREVTID0gewogIHRlc3Q6ICd0ZXN0Jwp9Owp2YXIgUEFHRV9VUkxfRVZFTlRfTkFNRSA9ICdwYWdlVXJsJzsKdmFyIEhFQURFUlMgPSB7CiAgRU5WSVJPTk1FTlRfSUQ6ICd4LXVsLWVudmlyb25tZW50LWlkJywKICBQQVJUTkVSX0FOT05ZTU9VU19JRDogJ3gtdWwtYW5vbnltb3VzLWlkJywKICBVU0VSX0lEOiAneC11bC11c2VyLWlkJywKICBWSVNJVE9SX0lEOiAneC11bC12aXNpdG9yLWlkJywKICBJTlNUQUxMQVRJT05fTUVUSE9EOiAneC11bC1pbnN0YWxsYXRpb24tbWV0aG9kJwp9Owp2YXIgSU5TVEFMTEFUSU9OX01FVEhPRCA9IHsKICBOUE06ICd3ZWItbnBtJywKICBHVE06ICd3ZWItZ3RtJywKICBTRUdNRU5UOiAnd2ViLXNlZ21lbnQnLAogIFNOSVBQRVQ6ICd3ZWItc25pcHBldCcKfTsKdmFyIENTU19DT05TVEFOVFMgPSB7CiAgQ1VTVE9NX1NUWUxFX1RBR19JRDogJ3VsLWN1c3RvbS1zdHlsZScsCiAgQ0FSRF9DT05UQUlORVJfQ0xBU1M6ICd1bC1jYXJkX19jb250YWluZXInLAogIFZJREVPX0NBUkRfQ0xBU1M6ICd1bC1jYXJkLS12aWRlbycsCiAgQ0xPU0VfQ09OVEFJTkVSX0NMQVNTOiAnY2xvc2UtY29udGFpbmVyJywKICBDTE9TRV9CVVRUT05fQ0xBU1M6ICdjbG9zZS1idG4nLAogIExJS0VSVF9OVU1CRVJfQ0xBU1M6ICdsaWtlcnQtbnVtYmVyJywKICBOUFNfTlVNQkVSX0NMQVNTOiAnbnBzLW51bWJlcicsCiAgQ0hPSUNFX0NMQVNTOiAnY2hvaWNlJywKICBDSE9JQ0VfTEFCRUxfQ0xBU1M6ICdzZWxlY3QtbGFiZWwnLAogIENIT0lDRV9DSEVDS0JPWF9DTEFTUzogJ3NlbGVjdC1jaGVja2JveCcsCiAgQ0hPSUNFX1JBRElPX0NMQVNTOiAnc2VsZWN0LXJhZGlvJywKICBDSE9JQ0VfR1JPVVBfQ0xBU1M6ICd1bC1jYXJkX19jaG9pY2VzJywKICBPUEVOX1RFWFRfSU5QVVQ6ICd1bC1jYXJkLXRleHRfX2lucHV0JywKICBERVNLVE9QX1NVRkZJWDogJy0tZGVza3RvcCcsCiAgTU9CSUxFX1NVRkZJWDogJy0tbW9iaWxlJywKICBRVUVTVElPTl9IRUFERVJfQ0xBU1M6ICd1bC1xdWVzdGlvbicsCiAgQ0FQVElPTl9DTEFTUzogJ3VsLWNhcHRpb24nLAogIEZBREVfSU5fQ0xBU1M6ICdmYWRlLWluLXRyYW5zaXRpb24nLAogIENBUkRfTUFJTl9DT05URU5UOiAndWwtY2FyZC1tYWluLWNvbnRlbnQnCn07CnZhciBFWFBFUklNRU5UX0ZMQUdTID0gewogIFNVUlZFWV9NT0JJTEVfU1RZTElORzogJ3N1cnZleS1tb2JpbGUtc3R5bGluZycKfTsKdmFyIE1PQklMRV9NQVhfV0lEVEggPSA1MDA7CnZhciBnZXRDbGFzc2VzID0gZnVuY3Rpb24gZ2V0Q2xhc3NlcyhiYXNlQ2xhc3MsIHVzZU1vYmlsZVN0eWxpbmcpIHsKICB2YXIgc3VmZml4ID0gdXNlTW9iaWxlU3R5bGluZyA/IENTU19DT05TVEFOVFMuTU9CSUxFX1NVRkZJWCA6IENTU19DT05TVEFOVFMuREVTS1RPUF9TVUZGSVg7CiAgcmV0dXJuIFtiYXNlQ2xhc3MgKyBzdWZmaXgsIGJhc2VDbGFzc107Cn07CnZhciBnZXRQbGF0Zm9ybUNsYXNzID0gZnVuY3Rpb24gZ2V0UGxhdGZvcm1DbGFzcyhiYXNlQ2xhc3MsIHBsYXRmb3JtKSB7CiAgcmV0dXJuIFtiYXNlQ2xhc3MsICIiLmNvbmNhdChiYXNlQ2xhc3MsICJfXyIpLmNvbmNhdChwbGF0Zm9ybSldOwp9Owp2YXIgTU9CSUxFX1BMQVRGT1JNX0hFQURFUlMgPSBbJ2lvcycsICdhbmRyb2lkJ107CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy9zaGFyZWQvZGVmZXJyZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL2RlZmVycmVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NsYXNzQ2FsbENoZWNrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NsYXNzQ2FsbENoZWNrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfY3JlYXRlQ2xhc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfY3JlYXRlQ2xhc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NyZWF0ZUNsYXNzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwoKCgp2YXIgRGVmZXJyZWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIERlZmVycmVkKHBheWxvYWQpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0aGlzLCBEZWZlcnJlZCk7CgogICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBfdGhpcy5wYXlsb2FkID0gcGF5bG9hZDsKICAgICAgX3RoaXMucmVqZWN0ID0gcmVqZWN0OwogICAgICBfdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTsKICAgIH0pOwogIH0KCiAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jcmVhdGVDbGFzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKShEZWZlcnJlZCwgW3sKICAgIGtleTogInJlc29sdmVSZXF1ZXN0IiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlUmVxdWVzdChyZXN1bHQpIHsKICAgICAgdGhpcy5yZXNvbHZlKHJlc3VsdCk7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gRGVmZXJyZWQ7Cn0oKTsKCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKERlZmVycmVkKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL25ldHdvcmsuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJraWxsTmV0d29ya1JlcXVlc3RzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGtpbGxOZXR3b3JrUmVxdWVzdHM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldEh0dHBIZWFkZXJzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGdldEh0dHBIZWFkZXJzOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJ1bEZldGNoIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHVsRmV0Y2g7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgd2hhdHdnX2ZldGNoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISB3aGF0d2ctZmV0Y2ggKi8gIi4vbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9kZWZlcnJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9kZWZlcnJlZCAqLyAiLi9zcmMvc2hhcmVkL2RlZmVycmVkLmpzIik7CgoKCi8qZ2xvYmFsIGZldGNoICovCgoKCgp2YXIgX3JlcXVpcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL25ldHdvcmtIZWxwZXIgKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrSGVscGVyLmpzIiksCiAgICBkZWxheSA9IF9yZXF1aXJlLmRlbGF5LAogICAgTkVUV09SS19DT05GSUcgPSBfcmVxdWlyZS5ORVRXT1JLX0NPTkZJRzsKCnZhciBraWxsc3dpdGNoID0gZmFsc2U7CnZhciBraWxsc3dpdGNoUmVhc29uID0gJyc7CnZhciBpc1JhdGVMaW1pdGVkID0gZmFsc2U7CnZhciBwZW5kaW5nUmVxdWVzdFF1ZXVlID0gW107CgpmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25NZXRob2RIZWFkZXIoU3ByaWcpIHsKICBpZiAoU3ByaWcuX2NvbmZpZyAmJiBTcHJpZy5fY29uZmlnLmluc3RhbGxhdGlvbk1ldGhvZCkgcmV0dXJuIFNwcmlnLl9jb25maWcuaW5zdGFsbGF0aW9uTWV0aG9kOwogIGlmIChTcHJpZy5fZ3RtKSByZXR1cm4gX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLklOU1RBTExBVElPTl9NRVRIT0QuR1RNOwogIGlmIChTcHJpZy5fc2VnbWVudCkgcmV0dXJuIF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5JTlNUQUxMQVRJT05fTUVUSE9ELlNFR01FTlQ7CiAgcmV0dXJuIF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5JTlNUQUxMQVRJT05fTUVUSE9ELlNOSVBQRVQ7Cn0KCmZ1bmN0aW9uIGtpbGxOZXR3b3JrUmVxdWVzdHMocmVhc29uKSB7CiAga2lsbHN3aXRjaCA9IHRydWU7CiAga2lsbHN3aXRjaFJlYXNvbiA9IHJlYXNvbjsKfQpmdW5jdGlvbiBnZXRIdHRwSGVhZGVycygpIHsKICB2YXIgU3ByaWcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9OwogIHZhciBoZWFkZXJzID0gewogICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICd1c2VybGVhcC1wbGF0Zm9ybSc6ICd3ZWInLAogICAgJ3gtdWwtc2RrLXZlcnNpb24nOiAnMi4xNC40JyAvL3ZlcnNpb24gaGVyZSBkb2Vzbid0IG1hdHRlci4gaXQgaXMgc3RyaW5nLXJlcGxhY2VkIHdoZW4gY29tcGlsZWQKCiAgfTsKICBpZiAoU3ByaWcuZW52SWQpIGhlYWRlcnNbX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkhFQURFUlMuRU5WSVJPTk1FTlRfSURdID0gU3ByaWcuZW52SWQ7CiAgaWYgKFNwcmlnLnRva2VuKSBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmVhcmVyICcgKyBTcHJpZy50b2tlbjsKICBpZiAoU3ByaWcudXNlcklkKSBoZWFkZXJzW19jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5IRUFERVJTLlVTRVJfSURdID0gU3ByaWcudXNlcklkOwogIGlmIChTcHJpZy52aXNpdG9ySWQpIGhlYWRlcnNbX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkhFQURFUlMuVklTSVRPUl9JRF0gPSBTcHJpZy52aXNpdG9ySWQ7CiAgaWYgKFNwcmlnLnBhcnRuZXJBbm9ueW1vdXNJZCkgaGVhZGVyc1tfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uSEVBREVSUy5QQVJUTkVSX0FOT05ZTU9VU19JRF0gPSBTcHJpZy5wYXJ0bmVyQW5vbnltb3VzSWQ7CgogIGlmIChTcHJpZy5tb2JpbGVIZWFkZXJzSlNPTikgewogICAgdmFyIG1vYmlsZUhlYWRlcnMgPSBKU09OLnBhcnNlKFNwcmlnLm1vYmlsZUhlYWRlcnNKU09OKTsKICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgbW9iaWxlSGVhZGVycyk7CiAgfQoKICBoZWFkZXJzW19jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5IRUFERVJTLklOU1RBTExBVElPTl9NRVRIT0RdID0gZ2V0SW5zdGFsbGF0aW9uTWV0aG9kSGVhZGVyKFNwcmlnKTsKICBpZiAoU3ByaWcubG9jYWxlKSBoZWFkZXJzWydhY2NlcHQtbGFuZ3VhZ2UnXSA9IFNwcmlnLmxvY2FsZTsgLy8gY3VzdG9tIHNldCBsb2NhbGUgb3ZlcnJpZGVzIG9yaWdpbmFsIGhlYWRlciBsb2NhbGVzCgogIHJldHVybiBoZWFkZXJzOwp9CgpmdW5jdGlvbiBkcm9wT3JRdWV1ZVJlcXVlc3QoX3gsIF94MiwgX3gzKSB7CiAgcmV0dXJuIF9kcm9wT3JRdWV1ZVJlcXVlc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gX2Ryb3BPclF1ZXVlUmVxdWVzdCgpIHsKICBfZHJvcE9yUXVldWVSZXF1ZXN0ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNob3VsZERyb3BPblJhdGVMaW1pdCwgaXNSYXRlTGltaXRSZXRyeSwgcmVxdWVzdEluZm8pIHsKICAgIHZhciBkZWZlcnJlZFJlcXVlc3Q7CiAgICByZXR1cm4gX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICB3aGlsZSAoMSkgewogICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCFzaG91bGREcm9wT25SYXRlTGltaXQpIHsKICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIHN0YXR1czogNDI5CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgZGVmZXJyZWRSZXF1ZXN0ID0gbmV3IF9kZWZlcnJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJkZWZhdWx0Il0ocmVxdWVzdEluZm8pOwogICAgICAgICAgICBwZW5kaW5nUmVxdWVzdFF1ZXVlLnB1c2goZGVmZXJyZWRSZXF1ZXN0KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgZGVmZXJyZWRSZXF1ZXN0LnByb21pc2UpOwoKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBfY2FsbGVlKTsKICB9KSk7CiAgcmV0dXJuIF9kcm9wT3JRdWV1ZVJlcXVlc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gdWxGZXRjaChfeDQsIF94NSkgewogIHJldHVybiBfdWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBfdWxGZXRjaCgpIHsKICBfdWxGZXRjaCA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTModXJsLCBvcHRpb25zKSB7CiAgICB2YXIgYXR0ZW1wdCwKICAgICAgICBzaG91bGREcm9wT25SYXRlTGltaXQsCiAgICAgICAgc2hvdWxkUmV0cnlSZXF1ZXN0LAogICAgICAgIHJlcXVlc3RJbmZvLAogICAgICAgIGtpbGxzd2l0Y2hSZXNwb25zZSwKICAgICAgICByZXN1bHQsCiAgICAgICAgc2hvdWxkUmV0cnlDdXJyZW50UmVxdWVzdCwKICAgICAgICByYXRlTGltaXRSZXNldFRpbWUsCiAgICAgICAgcmVzcG9uc2VUZXh0LAogICAgICAgIG5ld0F0dGVtcHQsCiAgICAgICAgX2FyZ3MzID0gYXJndW1lbnRzOwogICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICB3aGlsZSAoMSkgewogICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBhdHRlbXB0ID0gX2FyZ3MzLmxlbmd0aCA+IDIgJiYgX2FyZ3MzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnczNbMl0gOiAwOwogICAgICAgICAgICBzaG91bGREcm9wT25SYXRlTGltaXQgPSBfYXJnczMubGVuZ3RoID4gMyAmJiBfYXJnczNbM10gIT09IHVuZGVmaW5lZCA/IF9hcmdzM1szXSA6IGZhbHNlOwogICAgICAgICAgICBzaG91bGRSZXRyeVJlcXVlc3QgPSBfYXJnczMubGVuZ3RoID4gNCAmJiBfYXJnczNbNF0gIT09IHVuZGVmaW5lZCA/IF9hcmdzM1s0XSA6IGZhbHNlOwogICAgICAgICAgICAvLyBkcm9wIG9yIHF1ZXVlIHJlcXVlc3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmF0ZSBsaW1pdCBzdGF0dXMKICAgICAgICAgICAgcmVxdWVzdEluZm8gPSB7CiAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucywKICAgICAgICAgICAgICBhdHRlbXB0OiBhdHRlbXB0LAogICAgICAgICAgICAgIHNob3VsZERyb3BPblJhdGVMaW1pdDogc2hvdWxkRHJvcE9uUmF0ZUxpbWl0CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIShpc1JhdGVMaW1pdGVkICYmICFzaG91bGRSZXRyeVJlcXVlc3QpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA2OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgZHJvcE9yUXVldWVSZXF1ZXN0KHNob3VsZERyb3BPblJhdGVMaW1pdCwgc2hvdWxkUmV0cnlSZXF1ZXN0LCByZXF1ZXN0SW5mbykpOwoKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAga2lsbHN3aXRjaFJlc3BvbnNlID0gewogICAgICAgICAgICAgIG9rOiBmYWxzZSwKICAgICAgICAgICAgICByZXBvcnRFcnJvcjogZmFsc2UKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICgha2lsbHN3aXRjaCkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJVc2VyTGVhcCAtICIuY29uY2F0KGtpbGxzd2l0Y2hSZWFzb24pKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIGtpbGxzd2l0Y2hSZXNwb25zZSk7CgogICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAxMDsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihnZXRIdHRwSGVhZGVycygpLCBvcHRpb25zLmhlYWRlcnMpOwogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDE0OwogICAgICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBvcHRpb25zKTsKCiAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dDMuc2VudDsKCiAgICAgICAgICAgIGlmICghKHJlc3VsdC5zdGF0dXMgPT09IDQyOSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZXRyeSBpZiByYXRlIGxpbWl0IGlzIG5vdCBpbiBlZmZlY3QgeWV0IGFuZCB0aGUgcmVxdWVzdCBpcyBub3QgZHJvcHBhYmxlCiAgICAgICAgICAgIHNob3VsZFJldHJ5Q3VycmVudFJlcXVlc3QgPSAhaXNSYXRlTGltaXRlZCAmJiAhc2hvdWxkRHJvcE9uUmF0ZUxpbWl0IHx8IHNob3VsZFJldHJ5UmVxdWVzdDsKCiAgICAgICAgICAgIGlmICghc2hvdWxkUmV0cnlDdXJyZW50UmVxdWVzdCkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlzUmF0ZUxpbWl0ZWQgPSB0cnVlOwogICAgICAgICAgICByYXRlTGltaXRSZXNldFRpbWUgPSByZXN1bHQuaGVhZGVycy5oYXMoJ3JhdGVsaW1pdC1yZXNldCcpID8gTnVtYmVyKHJlc3VsdC5oZWFkZXJzLmdldCgncmF0ZWxpbWl0LXJlc2V0JykpIDogTkVUV09SS19DT05GSUcuUkFURUxJTUlUX1JFU0VUX0RFRkFVTFQ7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCBkZWxheShyYXRlTGltaXRSZXNldFRpbWUgKiAxMDAwKS50aGVuKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHsKICAgICAgICAgICAgICByZXR1cm4gX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgdWxGZXRjaCh1cmwsIG9wdGlvbnMsIDAsIHNob3VsZERyb3BPblJhdGVMaW1pdCwgdHJ1ZSkpOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgICAgICB9KSkpKTsKCiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgZHJvcE9yUXVldWVSZXF1ZXN0KHNob3VsZERyb3BPblJhdGVMaW1pdCwgZmFsc2UsIHJlcXVlc3RJbmZvKSk7CgogICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgaXNSYXRlTGltaXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0UXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RRdWV1ZS5tYXAoZnVuY3Rpb24gKGRlZmVycmVkUmVxdWVzdCkgewogICAgICAgICAgICAgICAgdmFyIF9kZWZlcnJlZFJlcXVlc3QkcGF5bCA9IGRlZmVycmVkUmVxdWVzdC5wYXlsb2FkLAogICAgICAgICAgICAgICAgICAgIHVybCA9IF9kZWZlcnJlZFJlcXVlc3QkcGF5bC51cmwsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IF9kZWZlcnJlZFJlcXVlc3QkcGF5bC5vcHRpb25zLAogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQgPSBfZGVmZXJyZWRSZXF1ZXN0JHBheWwuYXR0ZW1wdCwKICAgICAgICAgICAgICAgICAgICBzaG91bGREcm9wT25SYXRlTGltaXQgPSBfZGVmZXJyZWRSZXF1ZXN0JHBheWwuc2hvdWxkRHJvcE9uUmF0ZUxpbWl0OwogICAgICAgICAgICAgICAgdWxGZXRjaCh1cmwsIG9wdGlvbnMsIGF0dGVtcHQsIHNob3VsZERyb3BPblJhdGVMaW1pdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgIGRlZmVycmVkUmVxdWVzdC5yZXNvbHZlUmVxdWVzdChyZXN1bHQpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RRdWV1ZSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXJlc3VsdC5vaykgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghKHJlc3VsdC5zdGF0dXMgPT09IDI0OSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDMwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBraWxsTmV0d29ya1JlcXVlc3RzKCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCBraWxsc3dpdGNoUmVzcG9uc2UpOwoKICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMzI7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGV4dCgpOwoKICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgIHJlc3BvbnNlVGV4dCA9IF9jb250ZXh0My5zZW50OwogICAgICAgICAgICBfY29udGV4dDMucHJldiA9IDMzOwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlVGV4dCAmJiByZXNwb25zZVRleHQgIT09ICdPSycpIHsKICAgICAgICAgICAgICByZXN1bHQuanNvbiA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHJlc3VsdCk7CgogICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAzODsKICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzWyJjYXRjaCJdKDMzKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBvazogZmFsc2UsCiAgICAgICAgICAgICAgcmVwb3J0RXJyb3I6IHRydWUsCiAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcigiZmFpbGVkIHBhcnNpbmcgcmVzcG9uc2UganNvbiBmb3IgIi5jb25jYXQodXJsLCAiIC0gIikuY29uY2F0KHJlc3BvbnNlVGV4dCkpCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgIGNhc2UgNDE6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCByZXN1bHQpOwoKICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gNDQ7CiAgICAgICAgICAgIF9jb250ZXh0My50MSA9IF9jb250ZXh0M1siY2F0Y2giXSgxMCk7CiAgICAgICAgICAgIC8vcmV0cnkKICAgICAgICAgICAgbmV3QXR0ZW1wdCA9IGF0dGVtcHQgKyAxOwoKICAgICAgICAgICAgaWYgKCEobmV3QXR0ZW1wdCA+IDIpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0OTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBvazogZmFsc2UsCiAgICAgICAgICAgICAgcmVwb3J0RXJyb3I6IGZhbHNlLAogICAgICAgICAgICAgIGVycm9yOiBfY29udGV4dDMudDEKICAgICAgICAgICAgfSk7CgogICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIGRlbGF5KG5ld0F0dGVtcHQgKiAxMDAwKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gdWxGZXRjaCh1cmwsIG9wdGlvbnMsIG5ld0F0dGVtcHQpOwogICAgICAgICAgICB9KSk7CgogICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgX2NhbGxlZTMsIG51bGwsIFtbMTAsIDQ0XSwgWzMzLCAzOF1dKTsKICB9KSk7CiAgcmV0dXJuIF91bEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn0KCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrSGVscGVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL25ldHdvcmtIZWxwZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJkZWxheSI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBkZWxheTsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiTkVUV09SS19DT05GSUciOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gTkVUV09SS19DT05GSUc7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7CmZ1bmN0aW9uIGRlbGF5KHQsIHYpIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgIHNldFRpbWVvdXQocmVzb2x2ZS5iaW5kKG51bGwsIHYpLCB0KTsKICB9KTsKfQp2YXIgTkVUV09SS19DT05GSUcgPSB7CiAgUkFURUxJTUlUX1JFU0VUX0RFRkFVTFQ6IDEwIC8vIDEwcyB0byByZXN0YXJ0IHJhdGUgbGltaXQgcmV0cnkKCn07CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy9zaGFyZWQvc2hvdWxkRGlyZWN0RW1iZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL3Nob3VsZERpcmVjdEVtYmVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gc2hvdWxkRGlyZWN0RW1iZWQ7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qKgogKiBHZXQgdHJ1ZSBvciBmYWxzZSBmb3Igd2hldGhlciB0byBkaXJlY3QgZW1iZWQgZnJvbSBwbGF0Zm9ybSBoZWFkZXJzCiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucyA9IHt9XQogKiBAcmV0dXJuIHtPYmplY3R9IFVzZXIgbWV0YSBpbmZvcm1hdGlvbgogKi8KZnVuY3Rpb24gc2hvdWxkRGlyZWN0RW1iZWQoX3JlZikgewogIHZhciBwbGF0Zm9ybSA9IF9yZWZbJ3VzZXJsZWFwLXBsYXRmb3JtJ107CiAgcmV0dXJuIHBsYXRmb3JtICE9PSAnd2ViJzsKfQoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvc2hhcmVkL3Rvb2wuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy9zaGFyZWQvdG9vbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgIm92ZXJyaWRlU3R5bGVzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIG92ZXJyaWRlU3R5bGVzOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJjYWxjdWxhdGVGcmFtZUhlaWdodCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBjYWxjdWxhdGVGcmFtZUhlaWdodDsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7Ci8vIGZvciBzaGFyZWQgZnVuY3Rpb25zIGFjcm9zcyB0aGUgc2RrCgp2YXIgb3ZlcnJpZGVTdHlsZXMgPSBmdW5jdGlvbiBvdmVycmlkZVN0eWxlcyhkb2N1bWVudCwgc3R5bGVTdHJpbmcpIHsKICB2YXIgb3ZlcnJpZGVTdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogIG92ZXJyaWRlU3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnOwogIG92ZXJyaWRlU3R5bGVzLnRleHRDb250ZW50ID0gc3R5bGVTdHJpbmc7CiAgb3ZlcnJpZGVTdHlsZXMuaWQgPSBfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQ1NTX0NPTlNUQU5UUy5DVVNUT01fU1RZTEVfVEFHX0lEOwogIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQob3ZlcnJpZGVTdHlsZXMpOwp9Owp2YXIgY2FsY3VsYXRlRnJhbWVIZWlnaHQgPSBmdW5jdGlvbiBjYWxjdWxhdGVGcmFtZUhlaWdodChkb2N1bWVudCkgewogIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkNTU19DT05TVEFOVFMuQ0FSRF9DT05UQUlORVJfQ0xBU1MpKTsKICB2YXIgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyID8gY29udGFpbmVyLnNjcm9sbEhlaWdodCA6IDYwMDsKICB2YXIgd2hpdGVTcGFjZSA9IGNvbnRhaW5lciAmJiBjb250YWluZXIucGFyZW50RWxlbWVudCA/IGNvbnRhaW5lci5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQgOiAwOwogIHJldHVybiBjb250YWluZXJIZWlnaHQgKyB3aGl0ZVNwYWNlOwp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvc2hhcmVkL3VsRXZlbnRzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3NoYXJlZC91bEV2ZW50cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJ1bEV2ZW50cyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyB1bEV2ZW50czsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiaW50ZXJuYWxFdmVudHMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gaW50ZXJuYWxFdmVudHM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIkRJU01JU1NfUkVBU09OUyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBESVNNSVNTX1JFQVNPTlM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIlNVUlZFWV9TVEFURSI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBTVVJWRVlfU1RBVEU7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8vIFVzZXJMZWFwIGV2ZW50IGNvbnN0YW50cwovLyBldmVudCBjb252ZW50aW9uCi8vIGV2ZW50IG5hbWU6IGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQgaGFwcGVuZWQKLy8gIHBheWxvYWQ6IHsKLy8gICAgbmFtZTogJ2V2ZW50IG5hbWUnLAovLyAgICBkZXNjcmlwdGl2ZURhdGFOYW1lOiBkYXRhCi8vICB9CnZhciB1bEV2ZW50cyA9IHsKICAvLyBwYXNzaW5nIGludG8gY29udHJvbGxlcgogIFNVUlZFWV9MSUZFX0NZQ0xFOiAnc3VydmV5LmxpZmVDeWNsZScsCiAgU1VSVkVZX0RJTUVOU0lPTlM6ICdzdXJ2ZXkuZGltZW5zaW9ucycsCiAgU1VSVkVZX0hFSUdIVDogJ3N1cnZleS5oZWlnaHQnLAogIFNVUlZFWV9QUkVTRU5URUQ6ICdzdXJ2ZXkucHJlc2VudGVkJywKICBTVVJWRVlfQVBQRUFSRUQ6ICdzdXJ2ZXkuYXBwZWFyZWQnLAogIFNVUlZFWV9GQURJTkdfT1VUOiAnc3VydmV5LmZhZGluZ091dCcsCiAgU1VSVkVZX1dJTExfQ0xPU0U6ICdzdXJ2ZXkud2lsbENsb3NlJywKICBTVVJWRVlfQ0xPU0VEOiAnc3VydmV5LmNsb3NlZCcsCiAgU0RLX1JFQURZOiAnc2RrLnJlYWR5JywKICAvLyBwYXNzaW5nIGludG8gdmlldwogIENMT1NFX1NVUlZFWV9PTl9PVkVSTEFZX0NMSUNLOiAnY2xvc2Uuc3VydmV5Lm92ZXJsYXlDbGljaycsCiAgVklTSVRPUl9JRF9VUERBVEVEOiAndmlzaXRvci5pZC51cGRhdGVkJwp9OyAvLyBldmVudHMgbm90IGVtaXR0ZWQgZXh0ZXJuYWxseSBhbmQgbm90IGluIHRoZSBkb2N1bWVudGF0aW9uCgp2YXIgaW50ZXJuYWxFdmVudHMgPSB7CiAgbmFtZTogewogICAgVkVSSUZZX1ZJRVdfVkVSU0lPTjogJ3ZlcmlmeS52aWV3LnZlcnNpb24nCiAgfSwKICBkYXRhOiB7CiAgICBWSUVXX1ZFUlNJT046ICd2aWV3LnZlcnNpb24nCiAgfQp9Owp2YXIgRElTTUlTU19SRUFTT05TID0gewogIENMT1NFRDogJ2Nsb3NlLmNsaWNrJywKICAvLyB1c2VyIGNsaWNrZWQgdGhlIGNsb3NlIGJ1dHRvbgogIENPTVBMRVRFOiAnc3VydmV5LmNvbXBsZXRlZCcsCiAgLy8gdXNlciBhbnN3ZXJlZCBhbGwgcXVlc3Rpb25zCiAgUEFHRV9DSEFOR0U6ICdwYWdlLmNoYW5nZScsCiAgLy8gcHJvZHVjdENvbmZpZy5kaXNtaXNzT25QYWdlQ2hhbmdlID09IHRydWUgYW5kIHdlIGRldGVjdGVkIGEgcGFnZSBjaGFuZ2UgKGV4Y2x1ZGVzIGhhc2gvcXVlcnkgcGFyYW0gY2hhbmdlcykKICBBUEk6ICdhcGknLAogIC8vIEpTIGNhbGxlZCBTcHJpZygnZGlzbWlzc0FjdGl2ZVN1cnZleScpCiAgT1ZFUlJJREU6ICdvdmVycmlkZScgLy8gSlMgY2FsbGVkIFNwcmlnKCdkaXNwbGF5U3VydmV5JywgU1VSVkVZX0lEKQoKfTsKdmFyIFNVUlZFWV9TVEFURSA9IHsKICBSRUFEWTogJ3JlYWR5JywKICBOT19TVVJWRVk6ICdubyBzdXJ2ZXknCn07CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L0FwcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvQXBwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19Gb290ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9jb21wb25lbnRzL0Zvb3RlciAqLyAiLi9zcmMvdmlldy9jb21wb25lbnRzL0Zvb3Rlci5qcyIpOwoKCgoKCgpmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1siQEBpdGVyYXRvciJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQoKZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KCmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQoKCgoKIC8vIGltcG9ydCBjbG9zZUljb24gZnJvbSAnLi9hc3NldHMvY2xvc2Uuc3ZnJzsKCi8qKgogKiBAY29uc3Qge1N0cmluZ30gRGVjayBpZAogKi8KCnZhciBhcHBJZCA9ICd1bC1hcHAnOwovKioKICogRnJhbWUgYXBwbGljYXRpb24KICogQHJldHVybiB7RnVuY3Rpb259IEZyYW1lIGFwcAogKi8KCnZhciBBcHAgPSBmdW5jdGlvbiBBcHAoX3JlZiwgYWN0aW9ucykgewogIHZhciBhcHAgPSBfcmVmLmFwcDsKCiAgLy8gSWYgYXBwbGljYXRpb24gaGFzIHN0b3BwZWQgcnVubmluZywgc2h1dCBpdCBkb3duCiAgaWYgKCFhcHAucnVubmluZykgewogICAgYWN0aW9ucy5kZXN0cm95KGFwcElkKTsKICB9CgogIHZhciBfYXBwJGRlY2skY2FyZHMkYXBwJGQgPSBhcHAuZGVjay5jYXJkc1thcHAuZGVjay5pbmRleF0sCiAgICAgIENhcmQgPSBfYXBwJGRlY2skY2FyZHMkYXBwJGQuQ2FyZCwKICAgICAgcHJvcHMgPSBfYXBwJGRlY2skY2FyZHMkYXBwJGQucHJvcHMsCiAgICAgIHR5cGUgPSBfYXBwJGRlY2skY2FyZHMkYXBwJGQudHlwZSwKICAgICAgbmFtZSA9IF9hcHAkZGVjayRjYXJkcyRhcHAkZC5uYW1lOwogIHZhciBib3JkZXIgPSBhcHAuYm9yZGVyOwogIC8qKgogICAqIERpc3BhdGNoIHRvIGZyYW1lIHBhcmVudCB0aGF0IGFwcCBoYXMgcmVuZGVyZWQKICAgKi8KCiAgdmFyIG9uQ3JlYXRlID0gZnVuY3Rpb24gb25DcmVhdGUoZWwpIHsKICAgIHZhciB0cmFuc2l0aW9ucyA9IFsndHJhbnNpdGlvbmVuZCcsICd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ21velRyYW5zaXRpb25FbmQnXTsKICAgIHZhciB0cmFuc2l0aW9uRW5kZWQgPSBmYWxzZTsKCiAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoKSB7CiAgICAgIC8vIG11bHRpcGxlIHRyYW5zaXRpb25FbmQgZXZlbnRzIG1heSBmaXJlLAogICAgICAvLyBzbyBvbmx5IGxldCB0aGUgcmVuZGVyZWQgZXZlbnQgZmlyZSBvbmNlCiAgICAgIGlmICghdHJhbnNpdGlvbkVuZGVkICYmIHdpbmRvdy5mcmFtZUVsZW1lbnQpIHsKICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ3VsOmZyYW1lOnJlbmRlcmVkJyk7CiAgICAgICAgd2luZG93LmZyYW1lRWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgfQoKICAgICAgdHJhbnNpdGlvbkVuZGVkID0gdHJ1ZTsKICAgICAgdHJhbnNpdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodHJhbnNpdGlvbikgewogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbiwgaGFuZGxlcik7CiAgICAgIH0pOyAvL3RyaWdnZXIgYW4gdXBkYXRlIGFmdGVyIHRyYW5zaXRpb25zIGFyZSBjb21wbGV0ZQogICAgICAvL3NwZWNpZmljYWxseSwgZm9udCBsb2FkaW5nIHRoYXQgY2FuIGNoYW5nZSBkaW1lbnNpb25zIG9mIHRoZSBjb250YWluZXIKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBhY3Rpb25zLnVwZGF0ZShhcHBJZCk7CiAgICAgIH0sIDMwMCk7CiAgICB9OwoKICAgIHRyYW5zaXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHRyYW5zaXRpb24pIHsKICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uLCBoYW5kbGVyKTsKICAgIH0pOwogICAgYXBwLmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljayhmdW5jdGlvbiAoKSB7CiAgICAgIGFjdGlvbnMuY2xvc2UoYXBwSWQpOwogICAgfSk7CiAgICBhY3Rpb25zLnVwZGF0ZShhcHBJZCk7CiAgfTsKICAvKioKICAgKiBEaXNwYXRjaCB0byBmcmFtZSBwYXJlbnQgdGhhdCBhcHAgaXMgY2xvc2luZwogICAqLwoKCiAgdmFyIGNsb3NlQXBwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmMiA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMuY2xvc2UoYXBwSWQpOwoKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlKTsKICAgIH0pKTsKCiAgICByZXR1cm4gZnVuY3Rpb24gY2xvc2VBcHAoKSB7CiAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgLyoqCiAgICogQ2xvc2UgYXBwIGlmIHVzZXIgdXNlcyBlbnRlciBrZXkKICAgKi8KCgogIHZhciBvbktleVByZXNzQ2xvc2VBcHAgPSBmdW5jdGlvbiBvbktleVByZXNzQ2xvc2VBcHAoZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgY2xvc2VBcHAoKTsKICB9OwoKICB2YXIgc3RlcHMgPSBhcHAuZGVjay5jYXJkczsKICB2YXIgY3VycmVudFN0ZXAgPSBhcHAuZGVjay5pbmRleDsKICB2YXIgZGl2U3R5bGUgPSBhcHAuZm9udEZhbWlseSA/IHsKICAgIGZvbnRGYW1pbHk6IGFwcC5mb250RmFtaWx5LnJlcGxhY2UoJzsnLCAnJykKICB9IDoge307CiAgdmFyIGVuZENhcmQgPSBhcHAuZW5kQ2FyZDsKCiAgdmFyIG5leHRGdW5jdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjMgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2FzeW5jVG9HZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX19kZWZhdWx0KCkoIC8qI19fUFVSRV9fKi9fYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGRhdGEpIHsKICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIC8vIG5leHRGdW5jdGlvbiBpbmNsdWRlcyB0aGUgbm9ybWFsIG5leHQgZnVuY3Rpb24gd2l0aCBhIGNvbXBsZXRlU3VydmV5IHJvdXRpbmUgdG8gY2FsbCB3aGVuIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdXJ2ZXkKICAgICAgICAgICAgICBhY3Rpb25zLmFwcC5uZXh0KHsKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBjb21wbGV0ZVN1cnZleTogZnVuY3Rpb24gY29tcGxldGVTdXJ2ZXkoKSB7CiAgICAgICAgICAgICAgICAgIGFjdGlvbnMuZGVzdHJveShhcHBJZCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZW5kQ2FyZDogZW5kQ2FyZAogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTIpOwogICAgfSkpOwoKICAgIHJldHVybiBmdW5jdGlvbiBuZXh0RnVuY3Rpb24oX3gpIHsKICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKCiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGFwcC5hbnN3ZXJzIHx8IFtdKSwKICAgICAgX3N0ZXA7CgogIHRyeSB7CiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHsKICAgICAgdmFyIGFuc3dlciA9IF9zdGVwLnZhbHVlOwoKICAgICAgaWYgKGFuc3dlci5xdWVzdGlvbklkID09PSBuYW1lKSB7CiAgICAgICAgdmFyIGRhdGE7CgogICAgICAgIGlmICh0eXBlID09PSAnbXVsdGlwbGVjaG9pY2UnKSB7CiAgICAgICAgICB2YXIgb3B0aW9uID0gcHJvcHMub3B0aW9ucy5maW5kKGZ1bmN0aW9uIChfcmVmNCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmNC52YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBhbnN3ZXIudmFsdWU7CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICghb3B0aW9uKSByZXR1cm4gImJyZWFrIjsKICAgICAgICAgIGRhdGEgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKHt9LCBvcHRpb24uaWQsIG9wdGlvbi52YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGEgPSBhbnN3ZXIudmFsdWU7CiAgICAgICAgfQoKICAgICAgICBuZXh0RnVuY3Rpb24oewogICAgICAgICAgdmFsdWU6IGRhdGEKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gImJyZWFrIjsKICAgICAgfQogICAgfTsKCiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgewogICAgICB2YXIgX3JldCA9IF9sb29wKCk7CgogICAgICBpZiAoX3JldCA9PT0gImJyZWFrIikgYnJlYWs7CiAgICB9CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBfaXRlcmF0b3IuZShlcnIpOwogIH0gZmluYWxseSB7CiAgICBfaXRlcmF0b3IuZigpOwogIH0KCiAgdmFyIHNob3dDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIHNob3dDbG9zZUJ1dHRvbigpIHsKICAgIC8vIGRvbid0IHNob3cgY2xvc2UgYnV0dG9uIHdoZW4gd2UncmUgZGlyZWN0bHkgZW1iZWRkZWQgb24gbGluay9lbWFpbCBzdHVkaWVzCiAgICBpZiAoYXBwLmhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10gPT09ICdlbWFpbCcgfHwgYXBwLmhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10gPT09ICdsaW5rJykgcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGVyZSdzIGFuIGVuZCBjYXJkIGFuZCB3ZSdyZSBvbiB0aGUgbGFzdCBzdGVwICh0aGUgZW5kIGNhcmQpLCBoaWRlIHRoZSBjbG9zZSBidXR0b24sIGVsc2Ugc2hvdyBpdC4KCiAgICByZXR1cm4gIWVuZENhcmQgfHwgY3VycmVudFN0ZXAgKyAxICE9PSBzdGVwcy5sZW5ndGg7CiAgfTsKCiAgdmFyIGdldFN0dWR5U3R5bGUgPSBmdW5jdGlvbiBnZXRTdHVkeVN0eWxlKCkgewogICAgLy8gTGluayBzdHVkeSBkbyBub3QgaGF2ZSBib3JkZXJzIHVubGlrZSB3ZWIKICAgIGlmIChhcHAuaGVhZGVyc1sndXNlcmxlYXAtcGxhdGZvcm0nXSA9PT0gJ2xpbmsnKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYm94U2hhZG93OiAndW5zZXQnLAogICAgICAgIGJvcmRlclJhZGl1czogJ3Vuc2V0JywKICAgICAgICBib3JkZXI6ICdub25lICFpbXBvcnRhbnQnCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYXBwLnVzZU1vYmlsZVN0eWxpbmcgPyB7CiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlcgogICAgICB9IDogewogICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXIsCiAgICAgICAgbWFyZ2luOiAnMTVweCcKICAgICAgfTsKICAgIH0KICB9OwoKICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5oKSgiZGl2IiwgewogICAgY2xhc3NOYW1lOiAidWwtYXBwIiwKICAgIGlkOiBhcHBJZCwKICAgIG9uY3JlYXRlOiBmdW5jdGlvbiBvbmNyZWF0ZShlbCkgewogICAgICByZXR1cm4gb25DcmVhdGUoZWwpOwogICAgfSwKICAgIG9udXBkYXRlOiBmdW5jdGlvbiBvbnVwZGF0ZSgpIHsKICAgICAgcmV0dXJuIGFjdGlvbnMudXBkYXRlKGFwcElkKTsKICAgIH0sCiAgICBzdHlsZTogZGl2U3R5bGUKICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6ICJ1bC1hcHBfX2NvbnRhaW5lciIKICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19bImRlZmF1bHQiXSkoX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fX2RlZmF1bHQoKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5DQVJEX0NPTlRBSU5FUl9DTEFTUywgYXBwLnVzZU1vYmlsZVN0eWxpbmcpKSksCiAgICBzdHlsZTogZ2V0U3R1ZHlTdHlsZSgpCiAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5oKShDYXJkLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoe30sIHByb3BzLCB7CiAgICBib3JkZXI6IGJvcmRlciwKICAgIGNsYXNzTmFtZTogInVsLWNhcmQiLAogICAgbmV4dDogbmV4dEZ1bmN0aW9uLAogICAgZW5kQ2FyZDogZW5kQ2FyZCwKICAgIGxvY2FsZTogYXBwLmxvY2FsZSwKICAgIHF1ZXN0aW9uSWQ6IG5hbWUsCiAgICB1cGRhdGVIZWlnaHQ6IGZ1bmN0aW9uIHVwZGF0ZUhlaWdodCgpIHsKICAgICAgcmV0dXJuIGFjdGlvbnMudXBkYXRlKGFwcElkKTsKICAgIH0KICB9KSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uaCkoX3ZpZXdfY29tcG9uZW50c19Gb290ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdLCBudWxsKSksIHNob3dDbG9zZUJ1dHRvbigpICYmICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uaCkoImRpdiIsIHsKICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX1siZGVmYXVsdCJdKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5DTE9TRV9DT05UQUlORVJfQ0xBU1MsIGFwcC51c2VNb2JpbGVTdHlsaW5nKSkKICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6IF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5DTE9TRV9CVVRUT05fQ0xBU1MsCiAgICBvbmNsaWNrOiBjbG9zZUFwcCwKICAgIG9ua2V5cHJlc3M6IG9uS2V5UHJlc3NDbG9zZUFwcCwKICAgIHJvbGU6ICJidXR0b24iLAogICAgImFyaWEtbGFiZWwiOiAiQ2xvc2UgYnV0dG9uIiwKICAgIHRhYmluZGV4OiAwCiAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5oKSgic3ZnIiwgewogICAgd2lkdGg6ICIxOHB4IiwKICAgIGhlaWdodDogIjE4cHgiLAogICAgdmlld0JveDogIjAgMCAxMyAxMyIsCiAgICBmaWxsOiAibm9uZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTIuNTQ5NjQgMS43ODM2OUwxLjc4MzY5IDIuNTQ5NjRMNS43MzQwNSA2LjVMMS43ODM2OSAxMC40NTA0TDIuNTQ5NjQgMTEuMjE2M0w2LjUgNy4yNjU5NUwxMC40NTA0IDExLjIxNjNMMTEuMjE2MyAxMC40NTA0TDcuMjY1OTUgNi41TDExLjIxNjMgMi41NDk2NEwxMC40NTA0IDEuNzgzNjlMNi41IDUuNzM0MDVMMi41NDk2NCAxLjc4MzY5WiIsCiAgICBmaWxsOiAiIzI2MjEzNiIKICB9KSkpKSkpOwp9OwoKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il0gPSAoQXBwKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvTGlrZXJ0Q2FyZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L0xpa2VydENhcmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZXh0ZW5kc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZXh0ZW5kc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZXh0ZW5kc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2hlbHBlcnMvY2FyZCAqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCgoKCi8qKgogKiBMaWtlcnQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmNsYXNzTmFtZSBBZGRpdGlvbmFsIGNsYXNzbmFtZXMKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLm1lc3NhZ2UgTWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm5leHQgUHJvY2VlZCBtZXRob2QKICogQHJldHVybiB7T2JqZWN0fSBMaWtlcnQgY2FyZAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uIChfcmVmKSB7CiAgdmFyIGJvcmRlciA9IF9yZWYuYm9yZGVyLAogICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgIGxhYmVscyA9IF9yZWYubGFiZWxzLAogICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlLAogICAgICBwcm9wZXJ0aWVzID0gX3JlZi5wcm9wZXJ0aWVzLAogICAgICBuZXh0ID0gX3JlZi5uZXh0LAogICAgICBxdWVzdGlvbklkID0gX3JlZi5xdWVzdGlvbklkOwogIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikgewogICAgdmFyIF9zdGF0ZSRhcHAgPSBzdGF0ZS5hcHAsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZyA9IF9zdGF0ZSRhcHAudXNlTW9iaWxlU3R5bGluZywKICAgICAgICBpbmRleCA9IF9zdGF0ZSRhcHAuZGVjay5pbmRleCwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOwogICAgdmFyIGNsYXNzZXMgPSAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKFtjbGFzc05hbWUsICd1bC1jYXJkLS1saWtlcnQnLCBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuRkFERV9JTl9DTEFTU10pOwogICAgdmFyIGxlZnRMYWJlbCA9IGxhYmVscyAmJiBsYWJlbHMubGVmdDsKICAgIHZhciByaWdodExhYmVsID0gbGFiZWxzICYmIGxhYmVscy5yaWdodDsKCiAgICB2YXIgbnVtcyA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoQXJyYXkoNSkpLm1hcChmdW5jdGlvbiAoXywgaSkgewogICAgICB2YXIgbnVtID0gaSArIDE7CiAgICAgIHZhciBkaXZJZCA9ICJvcHRpb24tIi5jb25jYXQobnVtKTsKCiAgICAgIHZhciBzZXRBY3RpdmVCb3JkZXIgPSBmdW5jdGlvbiBzZXRBY3RpdmVCb3JkZXIoZSkgewogICAgICAgIGUudGFyZ2V0LnN0eWxlLnpJbmRleCA9IDI7CiAgICAgICAgZS50YXJnZXQuc3R5bGUuYm9yZGVyQ29sb3IgPSBib3JkZXI7CiAgICAgIH07CgogICAgICB2YXIgc2V0RGVmYXVsdEJvcmRlciA9IGZ1bmN0aW9uIHNldERlZmF1bHRCb3JkZXIoZSkgewogICAgICAgIGUudGFyZ2V0LnN0eWxlLnpJbmRleCA9ICdhdXRvJzsKICAgICAgICBlLnRhcmdldC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZTZlNmU2JzsKICAgICAgfTsKCiAgICAgIHZhciBvbktleVByZXNzID0gZnVuY3Rpb24gb25LZXlQcmVzcyhlKSB7CiAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMyB8fCBlLmtleUNvZGUgPT0gMzIpIG5leHQobnVtKTsKICAgICAgfTsKCiAgICAgIHZhciBjbGlja0FyZ3MgPSB7CiAgICAgICAgb25jbGljazogZnVuY3Rpb24gb25jbGljaygpIHsKICAgICAgICAgIHJldHVybiBuZXh0KG51bSk7CiAgICAgICAgfSwKICAgICAgICBvbmtleXByZXNzOiBmdW5jdGlvbiBvbmtleXByZXNzKGUpIHsKICAgICAgICAgIHJldHVybiBvbktleVByZXNzKGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaHN0YXJ0ID0gc2V0QWN0aXZlQm9yZGVyOwogICAgICAgIGNsaWNrQXJncy5vbnRvdWNoY2FuY2VsID0gc2V0RGVmYXVsdEJvcmRlcjsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaG1vdmUgPSBzZXREZWZhdWx0Qm9yZGVyOwogICAgICAgIGNsaWNrQXJncy5vbnRvdWNoZW5kID0gc2V0RGVmYXVsdEJvcmRlcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGlja0FyZ3Mub25tb3VzZWRvd24gPSBzZXRBY3RpdmVCb3JkZXI7CiAgICAgICAgY2xpY2tBcmdzLm9ubW91c2VsZWF2ZSA9IHNldERlZmF1bHRCb3JkZXI7CiAgICAgIH0KCiAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJkaXYiLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoewogICAgICAgIGlkOiBkaXZJZCwKICAgICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW10uY29uY2F0KF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRDbGFzc2VzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuTElLRVJUX05VTUJFUl9DTEFTUywgdXNlTW9iaWxlU3R5bGluZykpLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2xhc3NlcykoIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5MSUtFUlRfTlVNQkVSX0NMQVNTLCAiLSIpLmNvbmNhdChudW0pLCB1c2VNb2JpbGVTdHlsaW5nKSkpKQogICAgICB9LCBjbGlja0FyZ3MsIHsKICAgICAgICAiYXJpYS1sYWJlbGxlZGJ5IjogIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5RVUVTVElPTl9IRUFERVJfQ0xBU1MsICIgIikuY29uY2F0KGRpdklkKSwKICAgICAgICByb2xlOiAidGV4dGJveCIsCiAgICAgICAgdGFiaW5kZXg6IDAsCiAgICAgICAgImFyaWEtZGVzY3JpYmVkYnkiOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FQVElPTl9DTEFTUwogICAgICB9KSwgbnVtKTsKICAgIH0pOwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImZvcm0iLCB7CiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCBpbmRleCAlIDIgPT09IDAgJiYgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgbnVsbCkKICAgIC8qIGFsdGVybmF0ZSBkaXYgc3RydWN0dXJlIHRvIHByZXZlbnQgYWN0aXZlIHN0YXRlIGNhY2hpbmcgaXNzdWVzIHdpdGggY29uc2VjdXRpdmUgcXVlc3Rpb25zICovCiAgICAsICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbGlrZXJ0X19udW1iZXJzIgogICAgfSwgbnVtcyksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbGlrZXJ0X19sYWJlbHMiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJzcGFuIiwgbnVsbCwgbGVmdExhYmVsKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgic3BhbiIsIG51bGwsIHJpZ2h0TGFiZWwpKSkpOwogIH07Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9NdWx0aXBsZUNob2ljZUNhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L011bHRpcGxlQ2hvaWNlQ2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19jb21wb25lbnRzX1NlbGVjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L2NvbXBvbmVudHMvU2VsZWN0ICovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvU2VsZWN0LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2hlbHBlcnMvY2FyZCAqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCgoKCgovKioKICogTXVsdGlwbGVDaG9pY2UgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZQogKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUubWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyY2FwdGlvblRleHQKICogQHBhcmFtIHtBcnJheX0gc3RhdGUub3B0aW9ucwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdGF0ZS5uZXh0CiAqIEByZXR1cm4ge09iamVjdH0gTXVsdGlwbGVDaG9pY2UgY2FyZAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uIChfcmVmKSB7CiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLAogICAgICBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucywKICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8gW10gOiBfcmVmJG9wdGlvbnMsCiAgICAgIG5leHQgPSBfcmVmLm5leHQsCiAgICAgIHF1ZXN0aW9uSWQgPSBfcmVmLnF1ZXN0aW9uSWQ7CiAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICB2YXIgX3N0YXRlJGFwcCA9IHN0YXRlLmFwcCwKICAgICAgICB1c2VNb2JpbGVTdHlsaW5nID0gX3N0YXRlJGFwcC51c2VNb2JpbGVTdHlsaW5nLAogICAgICAgIGhlYWRlcnMgPSBfc3RhdGUkYXBwLmhlYWRlcnM7CiAgICB2YXIgY2xhc3NlcyA9ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW2NsYXNzTmFtZSwgJ3VsLWNhcmQtLW11bHRpcGxlJywgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5DU1NfQ09OU1RBTlRTLkZBREVfSU5fQ0xBU1NdKTsKCiAgICBmdW5jdGlvbiBzdWJtaXQoaWQsIHZhbHVlKSB7CiAgICAgIG5leHQoewogICAgICAgIHZhbHVlOiBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKHt9LCBpZCwgdmFsdWUpCiAgICAgIH0pOwogICAgfQoKICAgIHZhciBjaG9pY2VzID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKF9yZWYyLCBpbmRleCkgewogICAgICB2YXIgaWQgPSBfcmVmMi5pZCwKICAgICAgICAgIGxhYmVsID0gX3JlZjIubGFiZWwsCiAgICAgICAgICB2YWx1ZSA9IF9yZWYyLnZhbHVlOwogICAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKShfdmlld19jb21wb25lbnRzX1NlbGVjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJkZWZhdWx0Il0sIHsKICAgICAgICBib3JkZXI6IGJvcmRlciwKICAgICAgICBpbmRleDogaW5kZXgsCiAgICAgICAgbGFiZWw6IGxhYmVsLAogICAgICAgIHRhYmluZGV4OiBpbmRleCArIDEsCiAgICAgICAgb25TZWxlY3Q6IHN1Ym1pdC5iaW5kKG51bGwsIGlkLCB2YWx1ZSksCiAgICAgICAgaWQ6IGlkLAogICAgICAgIGlzUmFkaW86IHRydWUsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZzogdXNlTW9iaWxlU3R5bGluZwogICAgICB9KTsKICAgIH0pOwogICAgdmFyIGNhcHRpb24gPSAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2FwdGlvbikocHJvcGVydGllcyk7CiAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldFBsYXRmb3JtQ2xhc3MpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uQ1NTX0NPTlNUQU5UUy5DQVJEX01BSU5fQ09OVEVOVCwgaGVhZGVyc1sndXNlcmxlYXAtcGxhdGZvcm0nXSkpKQogICAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6IGNsYXNzZXMsCiAgICAgIGtleTogcXVlc3Rpb25JZAogICAgfSwgKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmdldEhlYWRsaW5lKShjYXB0aW9uLCBtZXNzYWdlKSwgY2FwdGlvbiwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5nZXRDbGFzc2VzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLkNTU19DT05TVEFOVFMuQ0hPSUNFX0dST1VQX0NMQVNTLCB1c2VNb2JpbGVTdHlsaW5nKSksCiAgICAgIHJvbGU6ICJyYWRpb2dyb3VwIiwKICAgICAgImFyaWEtbGFiZWxlZGJ5IjogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUwogICAgfSwgY2hvaWNlcykpKTsKICB9Owp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvTXVsdGlwbGVTZWxlY3RDYXJkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9NdWx0aXBsZVNlbGVjdENhcmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNsYXNzY2F0ICovICIuL25vZGVfbW9kdWxlcy9jbGFzc2NhdC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vaGVscGVycy9jYXJkICovICIuL3NyYy92aWV3L2hlbHBlcnMvY2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19TZWxlY3RfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9jb21wb25lbnRzL1NlbGVjdCAqLyAiLi9zcmMvdmlldy9jb21wb25lbnRzL1NlbGVjdC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19Gb290ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9jb21wb25lbnRzL0Zvb3RlciAqLyAiLi9zcmMvdmlldy9jb21wb25lbnRzL0Zvb3Rlci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3NoYXJlZC9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKCgoKCgoKCi8qKgogKiBTdWJtaXNzaW9uCiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50CiAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQKICovCgpmdW5jdGlvbiBzdWJtaXQodmFsdWUsIG5leHQpIHsKICBuZXh0KHsKICAgIHZhbHVlOiB2YWx1ZQogIH0pOwp9Ci8qKgogKiBNdWx0aXBsZVNlbGVjdCBDYXJkCiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZQogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUuY2xhc3NOYW1lCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5tZXNzYWdlCiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFByb3BlcnRpZXMgaW5jbHVkaW5nIGNhcHRpb24gYnV0dG9uIGFuZCBvcGVuVGV4dFBsYWNob2xkZXIKICogQHBhcmFtIHtBcnJheX0gc3RhdGUub3B0aW9ucwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdGF0ZS5uZXh0CiAqIEByZXR1cm4ge09iamVjdH0gTXVsdGlwbGVTZWxlY3QgY2FyZAogKi8KCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgYm9yZGVyID0gX3JlZi5ib3JkZXIsCiAgICAgIG1lc3NhZ2UgPSBfcmVmLm1lc3NhZ2UsCiAgICAgIHByb3BlcnRpZXMgPSBfcmVmLnByb3BlcnRpZXMsCiAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLAogICAgICBfcmVmJG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsCiAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IFtdIDogX3JlZiRvcHRpb25zLAogICAgICBpc0xhc3QgPSBfcmVmLmlzTGFzdCwKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tbXVsdGlwbGUnLCBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLkNTU19DT05TVEFOVFMuRkFERV9JTl9DTEFTU10pOwogICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IHN0YXRlLm11bHRpcGxlc2VsZWN0LnNlbGVjdGVkT3B0aW9uczsKICAgIHZhciBfYWN0aW9uJG11bHRpcGxlc2VsZWMgPSBhY3Rpb24ubXVsdGlwbGVzZWxlY3QsCiAgICAgICAgaW5pdCA9IF9hY3Rpb24kbXVsdGlwbGVzZWxlYy5pbml0LAogICAgICAgIHJlc2V0ID0gX2FjdGlvbiRtdWx0aXBsZXNlbGVjLnJlc2V0LAogICAgICAgIHVwZGF0ZVNlbGVjdGVkID0gX2FjdGlvbiRtdWx0aXBsZXNlbGVjLnVwZGF0ZVNlbGVjdGVkOwogICAgdmFyIF9zdGF0ZSRhcHAgPSBzdGF0ZS5hcHAsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZyA9IF9zdGF0ZSRhcHAudXNlTW9iaWxlU3R5bGluZywKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOwoKICAgIHZhciBvbkNyZWF0ZSA9IGZ1bmN0aW9uIG9uQ3JlYXRlKCkgewogICAgICB2YXIgc2VsZWN0aW9ucyA9IHt9OwogICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG8pIHsKICAgICAgICBzZWxlY3Rpb25zW28uaWRdID0gZmFsc2U7CiAgICAgIH0pOwogICAgICBpbml0KHNlbGVjdGlvbnMpOwogICAgfTsKCiAgICB2YXIgaGFuZGxlU3VibWl0ID0gZnVuY3Rpb24gaGFuZGxlU3VibWl0KGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzdWJtaXQoc3RhdGUubXVsdGlwbGVzZWxlY3Quc2VsZWN0ZWRPcHRpb25zLCBuZXh0KTsKICAgICAgcmVzZXQoKTsKICAgIH07CgogICAgdmFyIGNob2ljZXMgPSBvcHRpb25zLm1hcChmdW5jdGlvbiAoX3JlZjIsIGluZGV4KSB7CiAgICAgIHZhciBpZCA9IF9yZWYyLmlkLAogICAgICAgICAgbGFiZWwgPSBfcmVmMi5sYWJlbCwKICAgICAgICAgIHZhbHVlID0gX3JlZjIudmFsdWU7CiAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKF92aWV3X2NvbXBvbmVudHNfU2VsZWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bImRlZmF1bHQiXSwgewogICAgICAgIGJvcmRlcjogYm9yZGVyLAogICAgICAgIGluZGV4OiBpbmRleCwKICAgICAgICBsYWJlbDogbGFiZWwsCiAgICAgICAgb25TZWxlY3Q6IHVwZGF0ZVNlbGVjdGVkLAogICAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZE9wdGlvbnNbaWRdLAogICAgICAgIGlkOiBpZCwKICAgICAgICBpc1JhZGlvOiBmYWxzZSwKICAgICAgICB1c2VNb2JpbGVTdHlsaW5nOiB1c2VNb2JpbGVTdHlsaW5nCiAgICAgIH0pOwogICAgfSk7CiAgICB2YXIgY2FwdGlvbiA9ICgwLF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5nZXRDYXB0aW9uKShwcm9wZXJ0aWVzKTsKICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZ2V0UGxhdGZvcm1DbGFzcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5DU1NfQ09OU1RBTlRTLkNBUkRfTUFJTl9DT05URU5ULCBoZWFkZXJzWyd1c2VybGVhcC1wbGF0Zm9ybSddKSkpCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJmb3JtIiwgewogICAgICBpZDogInRleHQtZm9ybSIsCiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAgb25zdWJtaXQ6IGhhbmRsZVN1Ym1pdCwKICAgICAgb25jcmVhdGU6IGZ1bmN0aW9uIG9uY3JlYXRlKGVsKSB7CiAgICAgICAgcmV0dXJuIG9uQ3JlYXRlKGVsKTsKICAgICAgfSwKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uQ1NTX0NPTlNUQU5UUy5DSE9JQ0VfR1JPVVBfQ0xBU1MsIHVzZU1vYmlsZVN0eWxpbmcpKSwKICAgICAgcm9sZTogInJhZGlvZ3JvdXAiCiAgICB9LCBjaG9pY2VzKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICJ1bC1jYXJkLXRleHQiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJidXR0b24iLCB7CiAgICAgIGlkOiAidWwtY2FyZC10ZXh0X19idXR0b24iLAogICAgICBjbGFzc05hbWU6ICJ1bC1jYXJkLXRleHRfX2J1dHRvbiIsCiAgICAgIHN0eWxlOiB7CiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBib3JkZXIKICAgICAgfSwKICAgICAgb25jbGljazogaGFuZGxlU3VibWl0LAogICAgICByb2xlOiAiYnV0dG9uIiwKICAgICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIHVsLWNhcmQtdGV4dF9fYnV0dG9uIikKICAgIH0sICgwLF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5nZXRCdXR0b25UZXh0KShwcm9wZXJ0aWVzKSkpKSk7CiAgfTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L05wc0NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9OcHNDYXJkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcyAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY2xhc3NjYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NsYXNzY2F0L3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9oZWxwZXJzL2NhcmQgKi8gIi4vc3JjL3ZpZXcvaGVscGVycy9jYXJkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwoKCgoKCgovKioKICogTnBzIENhcmQKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5jbGFzc05hbWUgQWRkaXRpb25hbCBjbGFzc25hbWVzCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5tZXNzYWdlIE1lc3NhZ2UKICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgUHJvcGVydGllcyBpbmNsdWRpbmcgY2FwdGlvbiBidXR0b24gYW5kIG9wZW5UZXh0UGxhY2hvbGRlcgogKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdGF0ZS5uZXh0IFByb2NlZWQgbWV0aG9kCiAqIEByZXR1cm4ge09iamVjdH0gTnBzIGNhcmQKICovCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsCiAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLAogICAgICBsYWJlbHMgPSBfcmVmLmxhYmVscywKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBfc3RhdGUkYXBwID0gc3RhdGUuYXBwLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfc3RhdGUkYXBwLnVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgaW5kZXggPSBfc3RhdGUkYXBwLmRlY2suaW5kZXgsCiAgICAgICAgaGVhZGVycyA9IF9zdGF0ZSRhcHAuaGVhZGVyczsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tbnBzJywgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5DU1NfQ09OU1RBTlRTLkZBREVfSU5fQ0xBU1NdKTsKICAgIHZhciBsZWZ0TGFiZWwgPSBsYWJlbHMgJiYgbGFiZWxzLmxlZnQ7CiAgICB2YXIgcmlnaHRMYWJlbCA9IGxhYmVscyAmJiBsYWJlbHMucmlnaHQ7CgogICAgdmFyIG51bXMgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKEFycmF5KDExKSkubWFwKGZ1bmN0aW9uIChfLCBpKSB7CiAgICAgIHZhciBudW0gPSBpOwogICAgICB2YXIgZGl2SWQgPSAib3B0aW9uLSIuY29uY2F0KG51bSk7CgogICAgICB2YXIgc2V0QWN0aXZlQm9yZGVyID0gZnVuY3Rpb24gc2V0QWN0aXZlQm9yZGVyKGUpIHsKICAgICAgICBlLnRhcmdldC5zdHlsZS56SW5kZXggPSAyOwogICAgICAgIGUudGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyOwogICAgICB9OwoKICAgICAgdmFyIHNldERlZmF1bHRCb3JkZXIgPSBmdW5jdGlvbiBzZXREZWZhdWx0Qm9yZGVyKGUpIHsKICAgICAgICBlLnRhcmdldC5zdHlsZS56SW5kZXggPSAnYXV0byc7CiAgICAgICAgZS50YXJnZXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2U2ZTZlNic7CiAgICAgIH07CgogICAgICB2YXIgb25LZXlQcmVzcyA9IGZ1bmN0aW9uIG9uS2V5UHJlc3MoZSkgewogICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDMyKSBuZXh0KG51bSk7CiAgICAgIH07CgogICAgICB2YXIgY2xpY2tBcmdzID0gewogICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uIG9uY2xpY2soKSB7CiAgICAgICAgICByZXR1cm4gbmV4dChudW0pOwogICAgICAgIH0sCiAgICAgICAgb25rZXlwcmVzczogZnVuY3Rpb24gb25rZXlwcmVzcyhlKSB7CiAgICAgICAgICByZXR1cm4gb25LZXlQcmVzcyhlKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7CiAgICAgICAgY2xpY2tBcmdzLm9udG91Y2hzdGFydCA9IHNldEFjdGl2ZUJvcmRlcjsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaGNhbmNlbCA9IHNldERlZmF1bHRCb3JkZXI7CiAgICAgICAgY2xpY2tBcmdzLm9udG91Y2htb3ZlID0gc2V0RGVmYXVsdEJvcmRlcjsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaGVuZCA9IHNldERlZmF1bHRCb3JkZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xpY2tBcmdzLm9ubW91c2Vkb3duID0gc2V0QWN0aXZlQm9yZGVyOwogICAgICAgIGNsaWNrQXJncy5vbm1vdXNlbGVhdmUgPSBzZXREZWZhdWx0Qm9yZGVyOwogICAgICB9CgogICAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKHsKICAgICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW10uY29uY2F0KF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRDbGFzc2VzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuTlBTX05VTUJFUl9DTEFTUywgdXNlTW9iaWxlU3R5bGluZykpLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2xhc3NlcykoIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5OUFNfTlVNQkVSX0NMQVNTLCAiLSIpLmNvbmNhdChudW0pLCB1c2VNb2JpbGVTdHlsaW5nKSkpKQogICAgICB9LCBjbGlja0FyZ3MsIHsKICAgICAgICAiYXJpYS1sYWJlbGxlZGJ5IjogIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5RVUVTVElPTl9IRUFERVJfQ0xBU1MsICIgIikuY29uY2F0KGRpdklkKSwKICAgICAgICByb2xlOiAicmFkaW8iLAogICAgICAgIHRhYmluZGV4OiAwLAogICAgICAgIGlkOiBkaXZJZAogICAgICB9KSwgbnVtKTsKICAgIH0pOwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImZvcm0iLCB7CiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCBpbmRleCAlIDIgPT09IDAgJiYgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgbnVsbCkKICAgIC8qIGFsdGVybmF0ZSBkaXYgc3RydWN0dXJlIHRvIHByZXZlbnQgYWN0aXZlIHN0YXRlIGNhY2hpbmcgaXNzdWVzIHdpdGggY29uc2VjdXRpdmUgcXVlc3Rpb25zICovCiAgICAsICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbnBzX19udW1iZXJzIgogICAgfSwgbnVtcyksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbnBzX19sYWJlbHMiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJzcGFuIiwgbnVsbCwgbGVmdExhYmVsKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgic3BhbiIsIG51bGwsIHJpZ2h0TGFiZWwpKSkpOwogIH07Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9PcGVuVGV4dENhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L09wZW5UZXh0Q2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBhdXRvc2l6ZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgYXV0b3NpemUgKi8gIi4vbm9kZV9tb2R1bGVzL2F1dG9zaXplL2Rpc3QvYXV0b3NpemUuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGF1dG9zaXplX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oYXV0b3NpemVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY2xhc3NjYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NsYXNzY2F0L3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9oZWxwZXJzL2NhcmQgKi8gIi4vc3JjL3ZpZXcvaGVscGVycy9jYXJkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwoKCgoKCgovKioKICogU3VibWlzc2lvbgogKiBAcGFyYW0ge0V2ZW50fSBldmVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0CiAqLwoKZnVuY3Rpb24gc3VibWl0KHZhbHVlLCBuZXh0KSB7CiAgbmV4dCh2YWx1ZSk7Cn0KLyoqCiAqIFRleHQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZSBPcGVuVGV4dENhcmQgY2xhc3MKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLm1lc3NhZ2UgTWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm5leHQgTmV4dCBjYXJkIGNhbGxiYWNrCiAqIEByZXR1cm4ge09iamVjdH0gVGV4dCBjYXJkCiAqLwoKCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uIChfcmVmKSB7CiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLAogICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlLAogICAgICBwcm9wZXJ0aWVzID0gX3JlZi5wcm9wZXJ0aWVzLAogICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZSwKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBfc3RhdGUkYXBwID0gc3RhdGUuYXBwLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfc3RhdGUkYXBwLnVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgYm9yZGVyID0gX3N0YXRlJGFwcC5ib3JkZXIsCiAgICAgICAgaGVhZGVycyA9IF9zdGF0ZSRhcHAuaGVhZGVyczsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tdGV4dCcsIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5GQURFX0lOX0NMQVNTXSk7CgogICAgdmFyIGdldFRyaW1tZWRWYWx1ZSA9IGZ1bmN0aW9uIGdldFRyaW1tZWRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHN0YXRlLm9wZW5UZXh0LnZhbHVlLnRyaW0oKTsKICAgIH07CgogICAgdmFyIGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1sndGV4dC1mb3JtJ107CiAgICAgIGlmICghZm9ybSkgcmV0dXJuOwogICAgICB2YXIgdmFsdWUgPSBnZXRUcmltbWVkVmFsdWUoKTsKICAgICAgc3VibWl0KHZhbHVlLCBuZXh0KTsKICAgICAgc3RhdGUub3BlblRleHQudmFsdWUgPSAnJzsKICAgIH07CgogICAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgYWN0aW9uLm9wZW5UZXh0Lm9uVGV4dENoYW5nZShlLnRhcmdldC52YWx1ZSk7CiAgICB9OwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgdmFyIG9wZW5UZXh0UGxhY2Vob2xkZXIgPSBwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMub3BlblRleHRQbGFjZWhvbGRlciA/IHByb3BlcnRpZXMub3BlblRleHRQbGFjZWhvbGRlciA6IG51bGw7CgogICAgdmFyIHNldEFjdGl2ZUJvcmRlciA9IGZ1bmN0aW9uIHNldEFjdGl2ZUJvcmRlcihlKSB7CiAgICAgIGUudGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyOwogICAgfTsKCiAgICB2YXIgc2V0RGVmYXVsdEJvcmRlciA9IGZ1bmN0aW9uIHNldERlZmF1bHRCb3JkZXIoZSkgewogICAgICBlLnRhcmdldC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZTZlNmU2JzsKICAgIH07CgogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImZvcm0iLCB7CiAgICAgIGlkOiAidGV4dC1mb3JtIiwKICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLAogICAgICBvbnN1Ym1pdDogZnVuY3Rpb24gb25zdWJtaXQoZXZlbnQpIHsKICAgICAgICByZXR1cm4gc3VibWl0KGV2ZW50LCBuZXh0KTsKICAgICAgfSwKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogInVsLWNhcmQtdGV4dCIKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC10ZXh0X19jb250YWluZXIiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJ0ZXh0YXJlYSIsIHsKICAgICAgImRhdGEtZ3JhbW0iOiAiZmFsc2UiLAogICAgICBtYXhsZW5ndGg6ICI1MDAwIiwKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2xhc3NlcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5DU1NfQ09OU1RBTlRTLk9QRU5fVEVYVF9JTlBVVCwgdXNlTW9iaWxlU3R5bGluZykpLAogICAgICBuYW1lOiAidGV4dCIsCiAgICAgIHBsYWNlaG9sZGVyOiBvcGVuVGV4dFBsYWNlaG9sZGVyLAogICAgICAiYXJpYS1wbGFjZWhvbGRlciI6IG9wZW5UZXh0UGxhY2Vob2xkZXIsCiAgICAgICJhcmlhLW11bHRpbGluZSI6ICJ0cnVlIiwKICAgICAgdmFsdWU6IHN0YXRlLm9wZW5UZXh0LnZhbHVlLAogICAgICBvbmNyZWF0ZTogKGF1dG9zaXplX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKSwKICAgICAgb25pbnB1dDogaGFuZGxlQ2hhbmdlLAogICAgICBvbmZvY3VzOiBzZXRBY3RpdmVCb3JkZXIsCiAgICAgIG9uYmx1cjogc2V0RGVmYXVsdEJvcmRlciwKICAgICAgdGFiaW5kZXg6IDAsCiAgICAgICJhcmlhLWxhYmVsbGVkYnkiOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgICBjb250ZW50ZWRpdGFibGU6ICJ0cnVlIiwKICAgICAgcm9sZTogInRleHRib3giLAogICAgICAiYXJpYS1sYWJlbCI6IG9wZW5UZXh0UGxhY2Vob2xkZXIKICAgIH0pKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiYnV0dG9uIiwgewogICAgICBpZDogInVsLWNhcmQtdGV4dF9fYnV0dG9uIiwKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC10ZXh0X19idXR0b24iLAogICAgICBzdHlsZTogewogICAgICAgIGJhY2tncm91bmRDb2xvcjogYm9yZGVyCiAgICAgIH0sCiAgICAgIG9uY2xpY2s6IGhhbmRsZVN1Ym1pdCwKICAgICAgcm9sZTogImJ1dHRvbiIsCiAgICAgICJhcmlhLWxhYmVsbGVkYnkiOiAiIi5jb25jYXQoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywgIiB1bC1jYXJkLXRleHRfX2J1dHRvbiIpCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0QnV0dG9uVGV4dCkocHJvcGVydGllcykpKSkpOwogIH07Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwoKCgoKLyoqCiAqIFRleHQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZSBUZXh0VXJsQnV0dG9uIGNsYXNzCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5tZXNzYWdlIE1lc3NhZ2UKICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgUHJvcGVydGllcyBpbmNsdWRpbmcgYnV0dG9uIHRleHQKICogQHBhcmFtIHtGdW5jdGlvbn0gc3RhdGUubmV4dCBOZXh0IGNhcmQgY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fSBUZXh0IGNhcmQKICovCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgIG5leHQgPSBfcmVmLm5leHQsCiAgICAgIHF1ZXN0aW9uSWQgPSBfcmVmLnF1ZXN0aW9uSWQ7CiAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICB2YXIgY2xhc3NlcyA9ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bImRlZmF1bHQiXSkoW2NsYXNzTmFtZSwgJ3VsLWNhcmRfX3RleHQtdXJsLXByb21wdCcsIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5GQURFX0lOX0NMQVNTXSk7CiAgICB2YXIgX3N0YXRlJGFwcCA9IHN0YXRlLmFwcCwKICAgICAgICBib3JkZXIgPSBfc3RhdGUkYXBwLmJvcmRlciwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOwoKICAgIHZhciBoYW5kbGVMaW5rQnV0dG9uVGFwID0gZnVuY3Rpb24gaGFuZGxlTGlua0J1dHRvblRhcChlKSB7CiAgICAgIG5leHQoKTsKICAgIH07CgogICAgdmFyIGhhbmRsZUtleVByZXNzTGlua0J1dHRvbiA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzTGlua0J1dHRvbihlKSB7CiAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDMyKSBuZXh0KCk7CiAgICB9OwoKICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uZ2V0UGxhdGZvcm1DbGFzcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkNBUkRfTUFJTl9DT05URU5ULCBoZWFkZXJzWyd1c2VybGVhcC1wbGF0Zm9ybSddKSkpCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwIiwgewogICAgICBpZDogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywKICAgICAgY2xhc3NOYW1lOiAidWwtcXVlc3Rpb24iCiAgICB9LCBtZXNzYWdlKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiZGl2IiwgewogICAgICBpZDogInVsLWNhcmRfX3RleHQtdXJsLWJvZHktY29udGFpbmVyIiwKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZF9fdGV4dC11cmwtYm9keS1jb250YWluZXIiCiAgICB9LCAocHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLmJvZHkgPyBwcm9wZXJ0aWVzLmJvZHkuc3BsaXQoL1xuXHMqXG4vZykgOiBbXSkubWFwKGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwIiwgewogICAgICAgIGNsYXNzTmFtZTogInVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1ib2R5IgogICAgICB9LCBsaW5lKTsKICAgIH0pKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiYSIsIHsKICAgICAgaWQ6ICJ1bC1jYXJkLXRleHRfX2J1dHRvbiIsCiAgICAgIGNsYXNzTmFtZTogInVsLWNhcmQtdGV4dF9fYnV0dG9uIHVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1idXR0b24iLAogICAgICBzdHlsZTogewogICAgICAgIGJhY2tncm91bmRDb2xvcjogYm9yZGVyLAogICAgICAgICdtYXJnaW4tcmlnaHQnOiAnYXV0bycsCiAgICAgICAgJ3RleHQtb3ZlcmZsb3cnOiAnZWxsaXBzaXMnLAogICAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsCiAgICAgICAgb3ZlcmZsb3c6ICd2aXNpYmxlJwogICAgICB9LAogICAgICBvbmNsaWNrOiBoYW5kbGVMaW5rQnV0dG9uVGFwLAogICAgICBvbmtleXByZXNzOiBoYW5kbGVLZXlQcmVzc0xpbmtCdXR0b24sCiAgICAgIGhyZWY6IHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5idXR0b25VcmwsCiAgICAgIHRhcmdldDogIl9ibGFuayIsCiAgICAgIHJvbGU6ICJidXR0b24iLAogICAgICB0YWJpbmRleDogMCwKICAgICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIHVsLWNhcmQtdGV4dF9fYnV0dG9uIiksCiAgICAgICJhcmlhLWRlc2NyaWJlZGJ5IjogInVsLWNhcmRfX3RleHQtdXJsLWJvZHktY29udGFpbmVyIgogICAgfSwgcHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLmJ1dHRvblRleHQgPyBwcm9wZXJ0aWVzLmJ1dHRvblRleHQgOiAnTmV4dCcpKSk7CiAgfTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L1RoYW5rc0NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9UaGFua3NDYXJkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY2xhc3NjYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NsYXNzY2F0L3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3NoYXJlZC9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKCgoKCi8qKgogKiBUaGFua3MgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmNsYXNzTmFtZSBBZGRpdGlvbmFsIGNsYXNzbmFtZXMKICogQHBhcmFtIHtPYmplY3R9IGVuZENhcmQgSGVhZGxpbmUgYW5kIG9wdGlvbmFsIHN1YmhlYWRlcgogKiBAcGFyYW0ge051bWJlcn0gc3RhdGUudGltZW91dCBUaGFua3MgdGltZW91dAogKiBAcmV0dXJuIHtPYmplY3R9IFRoYW5rcyBjYXJkCiAqLwoKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il0gPSAoZnVuY3Rpb24gKF9yZWYpIHsKICB2YXIgZW5kQ2FyZCA9IF9yZWYuZW5kQ2FyZCwKICAgICAgYm9yZGVyID0gX3JlZi5ib3JkZXIsCiAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLAogICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZSwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tdGhhbmtzJywgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkZBREVfSU5fQ0xBU1NdKTsKICAgIHZhciBjYXB0aW9uID0gZW5kQ2FyZCAmJiBlbmRDYXJkLnN1YmhlYWRlciA/ICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInAiLCB7CiAgICAgIGNsYXNzTmFtZTogInVsLWNhcHRpb24iCiAgICB9LCBlbmRDYXJkLnN1YmhlYWRlcikgOiBudWxsOwogICAgdmFyIGhlYWRsaW5lID0gZW5kQ2FyZCAmJiBlbmRDYXJkLmhlYWRsaW5lID8gZW5kQ2FyZC5oZWFkbGluZSA6IG51bGw7CiAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bImRlZmF1bHQiXSkoX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLmdldFBsYXRmb3JtQ2xhc3MpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5DQVJEX01BSU5fQ09OVEVOVCwgc3RhdGUuYXBwLmhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLAogICAgICBrZXk6IHF1ZXN0aW9uSWQKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgb25jcmVhdGU6IGZ1bmN0aW9uIG9uY3JlYXRlKCkgewogICAgICAgIHJldHVybiBhY3Rpb24uYXBwLmNvbXBsZXRlKCk7CiAgICAgIH0KICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tdGhhbmtzLWNvbnRlbnQiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogInVsLXRoYW5rcy1jaGVjayIKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInN2ZyIsIHsKICAgICAgd2lkdGg6ICI4MSIsCiAgICAgIGhlaWdodDogIjk5IiwKICAgICAgdmlld0JveDogIjAgMCA4MSA5OSIsCiAgICAgIGZpbGw6ICJub25lIiwKICAgICAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICAgICJhcmlhLWxhYmVsbGVkYnkiOiAidGl0bGUiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwYXRoIiwgewogICAgICAiZmlsbC1ydWxlIjogImV2ZW5vZGQiLAogICAgICAiY2xpcC1ydWxlIjogImV2ZW5vZGQiLAogICAgICBkOiAiTTQwLjUgNzdDNjAuOTM0NSA3NyA3Ny41IDYwLjQzNDUgNzcuNSA0MEM3Ny41IDE5LjU2NTUgNjAuOTM0NSAzIDQwLjUgM0MyMC4wNjU1IDMgMy41IDE5LjU2NTUgMy41IDQwQzMuNSA2MC40MzQ1IDIwLjA2NTUgNzcgNDAuNSA3N1pNODAuNSA0MEM4MC41IDYyLjA5MTQgNjIuNTkxNCA4MCA0MC41IDgwQzE4LjQwODYgODAgMC41IDYyLjA5MTQgMC41IDQwQzAuNSAxNy45MDg2IDE4LjQwODYgMCA0MC41IDBDNjIuNTkxNCAwIDgwLjUgMTcuOTA4NiA4MC41IDQwWiIsCiAgICAgIGZpbGw6IGJvcmRlcgogICAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInBhdGgiLCB7CiAgICAgICJmaWxsLXJ1bGUiOiAiZXZlbm9kZCIsCiAgICAgICJjbGlwLXJ1bGUiOiAiZXZlbm9kZCIsCiAgICAgIGQ6ICJNNTUuMDI1IDIyLjkwNDZDNTUuNjI5OSAyMy40NzA1IDU1LjY2MTYgMjQuNDE5OCA1NS4wOTU2IDI1LjAyNDdDNTQuODcyNCAyNS4yNjM0IDU0LjYxMDkgMjUuNTI4NSA1NC4zMTU3IDI1LjgyNzdDNTIuMjU0NyAyNy45MTY4IDQ4LjU1NDkgMzEuNjY3IDQ0LjgxMzUgMzkuNjY1OEM0My4yODE4IDQyLjk0MDYgNDIuMDg2NCA0NS44Mzg2IDQxLjA4MjMgNDguMjcyOUM0MC42NTM5IDQ5LjMxMTYgNDAuMjYwMyA1MC4yNjU5IDM5Ljg5MDIgNTEuMTI5QzM5LjI4NyA1Mi41MzU5IDM4LjcyNDggNTMuNzUwOCAzOC4xNzQ0IDU0LjYyNUMzNy44OTk3IDU1LjA2MTMgMzcuNTgwNiA1NS40OTA1IDM3LjIwMTcgNTUuODI0NUMzNi44MjAxIDU2LjE2MDcgMzYuMjYxMyA1Ni41IDM1LjU0NTcgNTYuNUMzNC42NzQyIDU2LjUgMzQuMDg5MiA1NS45NjkyIDMzLjc3NzQgNTUuNjA4M0MzMy40NTAyIDU1LjIyOTYgMzMuMTc1MiA1NC43NTExIDMyLjkzOTYgNTQuMzAxQzMyLjczMDUgNTMuOTAxMyAzMi41MDg4IDUzLjQzNjcgMzIuMjc5NyA1Mi45NTY1QzMyLjI0MjkgNTIuODc5NCAzMi4yMDU5IDUyLjgwMTkgMzIuMTY4OCA1Mi43MjQzQzMxLjg5NDIgNTIuMTQ5OSAzMS41OTU5IDUxLjUzNCAzMS4yNTM3IDUwLjg4NjhDMjkuODg4NiA0OC4zMDUgMjcuODUzOSA0NS4yODc4IDI0LjIzNDMgNDMuMTM4MkMyMy41MjIgNDIuNzE1MiAyMy4yODc1IDQxLjc5NDkgMjMuNzEwNSA0MS4wODI2QzI0LjEzMzUgNDAuMzcwMyAyNS4wNTM5IDQwLjEzNTggMjUuNzY2MiA0MC41NTg4QzMwLjA1NTYgNDMuMTA2MiAzMi40MTQ5IDQ2LjY2NDcgMzMuOTA1OCA0OS40ODQ1QzM0LjI3NzYgNTAuMTg3NiAzNC41OTczIDUwLjg0ODcgMzQuODc1MyA1MS40MzAyQzM0LjkxNDcgNTEuNTEyNCAzNC45NTI5IDUxLjU5MjYgMzQuOTkwMiA1MS42NzA3QzM1LjIyMjIgNTIuMTU2NyAzNS40MTY0IDUyLjU2MzcgMzUuNTk3OCA1Mi45MTAyQzM1LjYxNTEgNTIuOTQzNCAzNS42MzIxIDUyLjk3NTQgMzUuNjQ4NSA1My4wMDYxQzM2LjA1NjUgNTIuMzUzMSAzNi41MzQxIDUxLjM0MzQgMzcuMTMzIDQ5Ljk0NjhDMzcuNDc4MSA0OS4xNDE4IDM3Ljg1NzIgNDguMjIyOSAzOC4yNzYxIDQ3LjIwNzRDMzkuMjg4NiA0NC43NTMyIDQwLjUzMzkgNDEuNzM0NyA0Mi4wOTYxIDM4LjM5NDhDNDYuMDU5MSAyOS45MjIxIDUwLjA2NDEgMjUuODY0OCA1Mi4xNTM1IDIzLjc0ODJDNTIuNDQyMyAyMy40NTU2IDUyLjY5NDQgMjMuMjAwMiA1Mi45MDQ4IDIyLjk3NTNDNTMuNDcwOCAyMi4zNzAzIDU0LjQyIDIyLjMzODcgNTUuMDI1IDIyLjkwNDZaTTM1LjE5OTQgNTMuNTg5MkMzNS4xOTk0IDUzLjU4OTIgMzUuMiA1My41ODg4IDM1LjIwMTIgNTMuNTg3OUMzNS4yIDUzLjU4ODkgMzUuMTk5NCA1My41ODkzIDM1LjE5OTQgNTMuNTg5MlpNMzYuMDY2NiA1My42NjgyQzM2LjA3MzIgNTMuNjc0IDM2LjA3NjUgNTMuNjc3NSAzNi4wNzY1IDUzLjY3NzdDMzYuMDc2NSA1My42NzggMzYuMDczMiA1My42NzUxIDM2LjA2NjYgNTMuNjY4MloiLAogICAgICBmaWxsOiBib3JkZXIKICAgIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwYXRoIiwgewogICAgICBkOiAiTTY5LjUgOTdDNjkuNSA5OC4xMDQ2IDU2LjI5MjQgOTkgNDAgOTlDMjMuNzA3NiA5OSAxMC41IDk4LjEwNDYgMTAuNSA5N0MxMC41IDk1Ljg5NTQgMjMuNzA3NiA5NSA0MCA5NUM1Ni4yOTI0IDk1IDY5LjUgOTUuODk1NCA2OS41IDk3WiIsCiAgICAgIGZpbGw6ICJibGFjayIsCiAgICAgICJmaWxsLW9wYWNpdHkiOiAiMC4yIgogICAgfSkpKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgicCIsIHsKICAgICAgY2xhc3NOYW1lOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgICBpZDogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUwogICAgfSwgaGVhZGxpbmUpLCBjYXB0aW9uKSkpKTsKICB9Owp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvVm9pY2VWaWRlb0NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvVm9pY2VWaWRlb0NhcmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19jb21wb25lbnRzX0Zvb3Rlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L2NvbXBvbmVudHMvRm9vdGVyICovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvRm9vdGVyLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyICovICIuL25vZGVfbW9kdWxlcy9AdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2hlbHBlcnMvY2FyZCAqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQoKZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfQoKCgoKCgoKdmFyIElOQUNUSVZFX0JVVFRPTiA9ICd1bC1idXR0b24taW5hY3RpdmUnOwovKioKICogU3VibWlzc2lvbgogKiBAcGFyYW0ge0V2ZW50fSBldmVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0CiAqLwoKZnVuY3Rpb24gc3VibWl0KHZhbHVlLCBuZXh0KSB7CiAgbmV4dCh2YWx1ZSk7Cn0KLyoqCiAqIFRleHQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZSBPcGVuVGV4dENhcmQgY2xhc3MKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLm1lc3NhZ2UgTWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm5leHQgTmV4dCBjYXJkIGNhbGxiYWNrCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5hcGlVUkwgVVJMIGZvciBVc2VyTGVhcCBhcGkgcmVxdWVzdAogKiBAcmV0dXJuIHtPYmplY3R9IFRleHQgY2FyZAogKi8KCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZCwKICAgICAgdXBkYXRlSGVpZ2h0ID0gX3JlZi51cGRhdGVIZWlnaHQ7CiAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICB2YXIgY2xhc3NlcyA9ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW2NsYXNzTmFtZSwgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5DU1NfQ09OU1RBTlRTLlZJREVPX0NBUkRfQ0xBU1NdKTsKICAgIHZhciBQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCA9ICd1bC1jYXJkLXZpZGVvX19wbGF5ZXJfcmVjb3JkZXInOwogICAgdmFyIE5FWFRfQlVUVE9OX0lEID0gJ3VsLWNhcmQtdmlkZW9fX25leHRfYnV0dG9uJzsKICAgIHZhciBGT1JNX0lEID0gJ3VsLXZpZGVvLWludGVydmlldy1mb3JtJzsKICAgIHZhciBRVUVTVElPTl9WSURFT19TQ1JFRU5fSUQgPSAndWwtcXVlc3Rpb24tcGxheWVyLWNvbnRhaW5lcic7CiAgICB2YXIgUkVTUE9OU0VfVklERU9fU0NSRUVOX0lEID0gJ3VsLXJlY29yZGVyLXBsYXllci1jb250YWluZXInOwogICAgdmFyIFFVRVNUSU9OX1JFU1BPTlNFX0JUTlMgPSAndWwtdmlkZW8tYnRuJzsKICAgIHZhciBzdXJ2ZXlWaWRlb1VybCA9IHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy52aWRlb1VybDsKICAgIHZhciBfc3RhdGUkYXBwID0gc3RhdGUuYXBwLAogICAgICAgIHN1cnZleUlkID0gX3N0YXRlJGFwcC5zdXJ2ZXlJZCwKICAgICAgICByZXNwb25zZUdyb3VwVWlkID0gX3N0YXRlJGFwcC5yZXNwb25zZUdyb3VwVWlkLAogICAgICAgIGFwaVVSTCA9IF9zdGF0ZSRhcHAuYXBpVVJMLAogICAgICAgIHZpc2l0b3JJZCA9IF9zdGF0ZSRhcHAudXNlcklkLAogICAgICAgIGJvcmRlciA9IF9zdGF0ZSRhcHAuYm9yZGVyLAogICAgICAgIGVudklkID0gX3N0YXRlJGFwcC5lbnZJZCwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOyAvLyBuZWVkIHRvIHVzZSBzdGF0ZSBwcm9wZXJ0eSBiZWNhdXNlIGh5cGVyYXBwIHJldXNlcyBjb21wb25lbnQgc3RhdGUuCiAgICAvLyBXZSBoYWQgYSBidWcgd2hlcmUgdXBsb2FkSWQgd2FzIG5vdCB1cGRhdGluZyBmb3Igc3Vic2VxdWVudCBxdWVzdGlvbnMKCiAgICBpZiAoIXN0YXRlLmNhcmREYXRhKSBzdGF0ZS5jYXJkRGF0YSA9IHt9OwogICAgc3RhdGUuY2FyZERhdGEudXBsb2FkSWQgPSB1bmRlZmluZWQ7CiAgICBzdGF0ZS5jYXJkRGF0YS5idXR0b25UZXh0ID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldEJ1dHRvblRleHQpKHByb3BlcnRpZXMpOwogICAgc3RhdGUuY2FyZERhdGEuc2tpcEJ1dHRvblRleHQgPSAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZ2V0U2tpcEJ1dHRvblRleHQpKHByb3BlcnRpZXMpOwogICAgdmFyIGV4aXN0aW5nUGxheWVyQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUExBWUVSX1JFQ09SREVSX0VMRU1FTlRfSUQpOwoKICAgIGlmIChleGlzdGluZ1BsYXllckNvbnRhaW5lcikgewogICAgICAvLyB3ZSBhcmUgYXQgYSByZWZyZXNoIHNjZW5hcmlvCiAgICAgICgwLF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5yZWZyZXNoUGxheWVyUmVjb3JkZXJDb21ibykoUExBWUVSX1JFQ09SREVSX0VMRU1FTlRfSUQsIHN1cnZleVZpZGVvVXJsLCB7CiAgICAgICAgc3VydmV5SWQ6IHN1cnZleUlkLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgcXVlc3Rpb25JZDogcXVlc3Rpb25JZCwKICAgICAgICB2aXNpdG9ySWQ6IHZpc2l0b3JJZAogICAgICB9LCBwcm9wZXJ0aWVzLm1lZGlhVHlwZSA9PT0gX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlJFQ09SREVSLk1FRElBX1RZUEVfQVVESU8pOwogICAgICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoTkVYVF9CVVRUT05fSUQpOwogICAgICBidXR0b24uaW5uZXJUZXh0ID0gc3RhdGUuY2FyZERhdGEuc2tpcEJ1dHRvblRleHQ7CiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKElOQUNUSVZFX0JVVFRPTik7CiAgICB9CgogICAgdmFyIHZpZGVvUmVjb3JkZXJDYWxsYmFjayA9IGZ1bmN0aW9uIHZpZGVvUmVjb3JkZXJDYWxsYmFjayhzdGF0dXMsIGRhdGEpIHsKICAgICAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKE5FWFRfQlVUVE9OX0lEKTsKCiAgICAgIGlmIChzdGF0dXMgPT09IF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5SRUNPUkRFUi5VUExPQURfU1RBUlRFRCkgewogICAgICAgIHN0YXRlLmNhcmREYXRhLnVwbG9hZElkID0gZGF0YVtfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uUkVDT1JERVIuVVBMT0FEX0lEXTsKICAgICAgICBidXR0b24uaW5uZXJUZXh0ID0gc3RhdGUuY2FyZERhdGEuYnV0dG9uVGV4dDsKICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZShJTkFDVElWRV9CVVRUT04pOwogICAgICAgIE9iamVjdC5hc3NpZ24oYnV0dG9uLnN0eWxlLCB7CiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJvcmRlcgogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlJFQ09SREVSLkRFTEVURSkgewogICAgICAgIHN0YXRlLmNhcmREYXRhLnVwbG9hZElkID0gbnVsbDsKICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChJTkFDVElWRV9CVVRUT04pOwogICAgICAgIGJ1dHRvbi5pbm5lclRleHQgPSBzdGF0ZS5jYXJkRGF0YS5za2lwQnV0dG9uVGV4dDsKICAgICAgICBPYmplY3QuYXNzaWduKGJ1dHRvbi5zdHlsZSwgewogICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnJwogICAgICAgIH0pOwogICAgICB9IC8vIGVsc2UgaWYgKHN0YXR1cyA9PT0gUkVDT1JERVIuRVJST1IpICAvLyB0b2RvIHNob3cgYSBwZXJtaXNzaW9uIGRlbmllZCBzY3JlZW4gaW5zdGVhZCBvZiB0aGUgcmVjb3JkZXIgYXQgdGhpcyBwb2ludAoKICAgIH07CgogICAgdmFyIGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgKDAsX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnN0b3BSZWNvcmRpbmcpKFBMQVlFUl9SRUNPUkRFUl9FTEVNRU5UX0lEKTsKICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1tGT1JNX0lEXTsKICAgICAgaWYgKCFmb3JtKSByZXR1cm47CgogICAgICBpZiAoc3RhdGUuY2FyZERhdGEudXBsb2FkSWQpIHsKICAgICAgICAvLyB1c2VyIHN1Ym1pdHRlZCBhIHZhbGlkIHZpZGVvLCB3aGljaCB3aWxsIGJlIHN0b3JlZCBvbiB0aGUgcmVzcG9uc2UgdmlhIHdlYmhvb2sKICAgICAgICBzdWJtaXQoe30sIG5leHQpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIHVzZXIgbmV2ZXIgcmVjb3JkZWQgYSB2aWRlbywgb3IgcmVjb3JkZWQgaXQgYnV0IHRoZW4gZGVsZXRlZCBpdCBiZWZvcmUgY29udGludWluZwogICAgICAgIHN1Ym1pdCh7CiAgICAgICAgICBkZWxldGVkQXQ6IERhdGUubm93KCkKICAgICAgICB9LCBuZXh0KTsKICAgICAgfSAvLyBTaG93IHF1ZXN0aW9uIHZpZGVvIHBsYXllciBmb3IgYW55IGZvbGxvd2luZyBWK1YgY2FyZHMKCgogICAgICB2YXIgZ2V0UXVlc3Rpb25WaWRlbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFFVRVNUSU9OX1ZJREVPX1NDUkVFTl9JRCk7CiAgICAgIHZhciBnZXRSZXNwb25zZVZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUkVTUE9OU0VfVklERU9fU0NSRUVOX0lEKTsKICAgICAgZ2V0UmVzcG9uc2VWaWRlby5jbGFzc0xpc3QuYWRkKF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5ISURERU5fQ0xBU1MpOwogICAgICBnZXRRdWVzdGlvblZpZGVvLmNsYXNzTGlzdC5yZW1vdmUoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkhJRERFTl9DTEFTUyk7CiAgICB9OwoKICAgIHZhciBoYW5kbGVTY3JlZW5DaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVTY3JlZW5DaGFuZ2UoKSB7CiAgICAgIHZhciBzaG93UXVlc3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7CiAgICAgIHZhciBnZXRRdWVzdGlvblZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUVVFU1RJT05fVklERU9fU0NSRUVOX0lEKTsKICAgICAgdmFyIGdldFJlc3BvbnNlVmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChSRVNQT05TRV9WSURFT19TQ1JFRU5fSUQpOwoKICAgICAgaWYgKHNob3dRdWVzdGlvbikgewogICAgICAgIGdldFF1ZXN0aW9uVmlkZW8uY2xhc3NMaXN0LnJlbW92ZShfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uSElEREVOX0NMQVNTKTsKICAgICAgICBnZXRRdWVzdGlvblZpZGVvLmNsYXNzTGlzdC5hZGQoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlZJU0lCTEVfQ0xBU1MpOwogICAgICAgIGdldFJlc3BvbnNlVmlkZW8uY2xhc3NMaXN0LmFkZChfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uSElEREVOX0NMQVNTKTsKICAgICAgICBnZXRSZXNwb25zZVZpZGVvLmNsYXNzTGlzdC5yZW1vdmUoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlZJU0lCTEVfQ0xBU1MpOwogICAgICB9IGVsc2UgewogICAgICAgICgwLF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5wYXVzZVF1ZXN0aW9uUGxheWVyKShQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCk7CiAgICAgICAgZ2V0UXVlc3Rpb25WaWRlby5jbGFzc0xpc3QuYWRkKF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5ISURERU5fQ0xBU1MpOwogICAgICAgIGdldFF1ZXN0aW9uVmlkZW8uY2xhc3NMaXN0LnJlbW92ZShfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uVklTSUJMRV9DTEFTUyk7CiAgICAgICAgZ2V0UmVzcG9uc2VWaWRlby5jbGFzc0xpc3QucmVtb3ZlKF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5ISURERU5fQ0xBU1MpOwogICAgICAgIGdldFJlc3BvbnNlVmlkZW8uY2xhc3NMaXN0LmFkZChfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uVklTSUJMRV9DTEFTUyk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHNldFJlc2l6ZU9ic2VydmVyID0gZnVuY3Rpb24gc2V0UmVzaXplT2JzZXJ2ZXIoKSB7CiAgICAgIC8vIExpc3RlbiBmb3IgaGVpZ2h0IGNoYW5nZXMsIGFuZCB1cGRhdGUgYXBwIGhlaWdodCB3aGVuIHRoZXkgb2NjdXIuCiAgICAgIHZhciB2aWRlb0NhcmRSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgIHJldHVybiB1cGRhdGVIZWlnaHQoKTsKICAgICAgfSk7CiAgICAgIHZhciB2aWRlb0NhcmRFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5WSURFT19DQVJEX0NMQVNTKSk7CiAgICAgIHZpZGVvQ2FyZFJlc2l6ZU9ic2VydmVyLm9ic2VydmUodmlkZW9DYXJkRWxlbSk7CiAgICB9OwoKICAgIHZhciBhcHBlbmRQbGF5ZXJSZWNvcmRlciA9IGZ1bmN0aW9uIGFwcGVuZFBsYXllclJlY29yZGVyKCkgewogICAgICB2YXIgdmlkZW9Db250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCk7CiAgICAgIHZpZGVvQ29udGFpbmVyLmFwcGVuZENoaWxkKGdldFF1ZXN0aW9uUGxheWVyU2NyZWVuKCkpOwogICAgICB2aWRlb0NvbnRhaW5lci5hcHBlbmRDaGlsZChnZXRSZWNvcmRlclBsYXllclNjcmVlbigpKTsKICAgICAgcmV0dXJuIHZpZGVvQ29udGFpbmVyOwogICAgfTsKCiAgICB2YXIgY3JlYXRlTmF2aWdhdGlvbkJ0biA9IGZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25CdG4oY2xhc3NOYW1lLCBjYW5IYW5kbGVTY3JlZW5DaGFuZ2UpIHsKICAgICAgdmFyIG5ld0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICBuZXdCdXR0b24uY2xhc3NOYW1lID0gIiIuY29uY2F0KFFVRVNUSU9OX1JFU1BPTlNFX0JUTlMsICIgIikuY29uY2F0KGNsYXNzTmFtZSk7CiAgICAgIG5ld0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgaGFuZGxlU2NyZWVuQ2hhbmdlKGNhbkhhbmRsZVNjcmVlbkNoYW5nZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QnV0dG9uOwogICAgfTsgLy8gVitWIHF1ZXN0aW9uIGFuZCByZXNwb25zZSBhcmUgc2VwYXJhdGVkIGludG8gdHdvIHNjcmVlbnMgbm93LgogICAgLy8gVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBxdWVzdGlvbiBzY3JlZW4uCgoKICAgIHZhciBnZXRRdWVzdGlvblBsYXllclNjcmVlbiA9IGZ1bmN0aW9uIGdldFF1ZXN0aW9uUGxheWVyU2NyZWVuKCkgewogICAgICB2YXIgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuaWQgPSAndWwtcXVlc3Rpb24tcGxheWVyLWNvbnRhaW5lcic7CiAgICAgIHF1ZXN0aW9uUGxheWVyQ29udGFpbmVyLmNsYXNzTmFtZSA9ICJ1bC12aWRlby1jb250YWluZXIgIi5jb25jYXQoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlZJU0lCTEVfQ0xBU1MpOyAvLyBhcHBlbmQgdmlkZW8gcXVlc3Rpb24KCiAgICAgIHF1ZXN0aW9uUGxheWVyQ29udGFpbmVyLmFwcGVuZENoaWxkKCgwLF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy52aWRlb1BsYXllcikoUExBWUVSX1JFQ09SREVSX0VMRU1FTlRfSUQsIHsKICAgICAgICBzcmM6IHN1cnZleVZpZGVvVXJsLAogICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnCiAgICAgIH0sIHVuZGVmaW5lZCwgcHJvcGVydGllcy5tZWRpYVR5cGUgPT09IF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5SRUNPUkRFUi5NRURJQV9UWVBFX0FVRElPLCBhcGlVUkwpKTsgLy8gYXBwZW5kIHJlc3BvbnNlIGJ1dHRvbgoKICAgICAgdmFyIHJlY29yZFJlc3BvbnNlQnRuID0gY3JlYXRlTmF2aWdhdGlvbkJ0bigndWwtcmVjb3JkLXJlc3BvbnNlLWJ0bicsIGZhbHNlKTsKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQocmVjb3JkUmVzcG9uc2VCdG4pOwogICAgICByZXR1cm4gcXVlc3Rpb25QbGF5ZXJDb250YWluZXI7CiAgICB9OyAvLyBWK1YgcXVlc3Rpb24gYW5kIHJlc3BvbnNlIGFyZSBzZXBhcmF0ZWQgaW50byB0d28gc2NyZWVucyBub3cuCiAgICAvLyBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHJlc3BvbnNlIHNjcmVlbi4KCgogICAgdmFyIGdldFJlY29yZGVyUGxheWVyU2NyZWVuID0gZnVuY3Rpb24gZ2V0UmVjb3JkZXJQbGF5ZXJTY3JlZW4oKSB7CiAgICAgIHZhciBxdWVzdGlvblBsYXllckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBxdWVzdGlvblBsYXllckNvbnRhaW5lci5pZCA9ICd1bC1yZWNvcmRlci1wbGF5ZXItY29udGFpbmVyJzsKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuY2xhc3NOYW1lID0gInVsLXZpZGVvLWNvbnRhaW5lciAiLmNvbmNhdChfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uSElEREVOX0NMQVNTKTsgLy8gYXBwZW5kIGJhY2sgdG8gcXVlc3Rpb24gYnV0dG9uCgogICAgICB2YXIgcXVlc3Rpb25TY3JlZW5CdG4gPSBjcmVhdGVOYXZpZ2F0aW9uQnRuKCd1bC1iYWNrLXF1ZXN0aW9uLWJ0bicsIHRydWUpOwogICAgICBxdWVzdGlvblBsYXllckNvbnRhaW5lci5hcHBlbmRDaGlsZChxdWVzdGlvblNjcmVlbkJ0bik7IC8vIGFwcGVuZCByZXNwb25zZSB2aWRlbwoKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoKDAsX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnZpZGVvUmVjb3JkZXJQbGF5ZXIpKFBMQVlFUl9SRUNPUkRFUl9FTEVNRU5UX0lELCB7CiAgICAgICAgc3VydmV5SWQ6IHN1cnZleUlkLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgcXVlc3Rpb25JZDogcXVlc3Rpb25JZCwKICAgICAgICB2aXNpdG9ySWQ6IHZpc2l0b3JJZCwKICAgICAgICBlbnZJZDogZW52SWQKICAgICAgfSwgYXBpVVJMLCB2aWRlb1JlY29yZGVyQ2FsbGJhY2ssIGZhbHNlLCBfb2JqZWN0U3ByZWFkKHt9LCBoZWFkZXJzLCB7CiAgICAgICAgJ3gtdWwtdmlkZW8tcmVjb3JkZXItb3JpZ2luJzogJ3NkaycKICAgICAgfSksIHByb3BlcnRpZXMubWVkaWFUeXBlID09PSBfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uUkVDT1JERVIuTUVESUFfVFlQRV9BVURJTykpOwogICAgICByZXR1cm4gcXVlc3Rpb25QbGF5ZXJDb250YWluZXI7CiAgICB9OwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSksCiAgICAgIHN0eWxlOiB7CiAgICAgICAgbWFyZ2luVG9wOiAndW5zZXQnCiAgICAgIH0KICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLkNTU19DT05TVEFOVFMuRkFERV9JTl9DTEFTUywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJmb3JtIiwgewogICAgICBpZDogRk9STV9JRCwKICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLAogICAgICBvbmNyZWF0ZTogc2V0UmVzaXplT2JzZXJ2ZXIsCiAgICAgIG9uc3VibWl0OiBmdW5jdGlvbiBvbnN1Ym1pdChldmVudCkgewogICAgICAgIHJldHVybiBzdWJtaXQoZXZlbnQsIG5leHQpOwogICAgICB9CiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJkaXYiLCB7CiAgICAgIGlkOiAidWwtY2FyZC12b2ljZV9fdmlkZW8iCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJkaXYiLCB7CiAgICAgIGlkOiBQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCwKICAgICAgb25jcmVhdGU6IGFwcGVuZFBsYXllclJlY29yZGVyCiAgICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiYnV0dG9uIiwgewogICAgICBpZDogTkVYVF9CVVRUT05fSUQsCiAgICAgIGNsYXNzTmFtZTogInVsLWNhcmQtdGV4dF9fYnV0dG9uICIuY29uY2F0KElOQUNUSVZFX0JVVFRPTiksCiAgICAgIG9uY2xpY2s6IGhhbmRsZVN1Ym1pdCwKICAgICAgcm9sZTogImJ1dHRvbiIKICAgIH0sICgwLF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5nZXRTa2lwQnV0dG9uVGV4dCkocHJvcGVydGllcykpKSkpKTsKICB9Owp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvY29tcG9uZW50cy9Gb290ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvY29tcG9uZW50cy9Gb290ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19Mb2dvX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvY29tcG9uZW50cy9Mb2dvLmpzICovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvTG9nby5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfdXRpbF9za2lwTG9naWNIZWxwZXJzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvdXRpbC9za2lwTG9naWNIZWxwZXJzICovICIuL3NyYy92aWV3L3V0aWwvc2tpcExvZ2ljSGVscGVycy5qcyIpOwoKCgovKioKICogRm9vdGVyIGNvbXBvbmVudAogKiBAcmV0dXJuIHtPYmplY3R9IENvbXBvbmVudAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uICgpIHsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlKSB7CiAgICB2YXIgc3RlcHMgPSBzdGF0ZS5hcHAuZGVjay5jYXJkcyB8fCBbXTsKICAgIHZhciBxdWVzdGlvblN0ZXBzID0gc3RlcHMuZmlsdGVyKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgIHJldHVybiBzdGVwLnR5cGU7CiAgICB9KTsKICAgIHZhciBjdXJyZW50U3RlcCA9IHN0YXRlLmFwcC5kZWNrLmluZGV4OwogICAgdmFyIF9zdGF0ZSRhcHAgPSBzdGF0ZS5hcHAsCiAgICAgICAgc2hvd1N1cnZleUJyYW5kID0gX3N0YXRlJGFwcC5zaG93U3VydmV5QnJhbmQsCiAgICAgICAgbWFya2V0aW5nVXJsID0gX3N0YXRlJGFwcC5tYXJrZXRpbmdVcmwsCiAgICAgICAgc2x1Z05hbWUgPSBfc3RhdGUkYXBwLnNsdWdOYW1lLAogICAgICAgIHN1cnZleUlkID0gX3N0YXRlJGFwcC5zdXJ2ZXlJZCwKICAgICAgICB2aWV3ZWRDYXJkQ291bnQgPSBfc3RhdGUkYXBwLnZpZXdlZENhcmRDb3VudCwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzLAogICAgICAgIGRlY2sgPSBfc3RhdGUkYXBwLmRlY2ssCiAgICAgICAgYm9yZGVyID0gX3N0YXRlJGFwcC5ib3JkZXI7CiAgICB2YXIgbWF4UmVtYWluaW5nQ2FyZHMgPSAoMCxfdmlld191dGlsX3NraXBMb2dpY0hlbHBlcnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5nZXRNYXhSZW1haW5pbmdDYXJkcykoZGVjay5jYXJkcyB8fCBbXSwgZGVjay5pbmRleCk7IC8vIGNvdW50IHRoZSBjdXJyZW50IGNhcmQgYXMgdmlld2VkIHNvIHRoZXJlIGlzIG5vdCAwIHByb2dyZXNzIGZvciBmaXJzdCBxdWVzdGlvbi4KICAgIC8vIG5vdGUgdGhpcyBpbmNyZWFzZXMgdG90YWwgZGVub21pbmF0b3IgYnkgMQogICAgLy8gZXg6IGlmIHRoZXJlIGFyZSAyIHF1ZXN0aW9ucywgaXQgd2lsbCBsb29rIDEvMyBkb25lIGZvciB0aGUgZmlyc3QgcXVlc3Rpb24sIGFuZCAyLzMgZG9uZSBmb3IgdGhlIHNlY29uZC4KCiAgICB2YXIgcGFkZGVkVmlld2VkQ2FyZENvdW50ID0gdmlld2VkQ2FyZENvdW50ICsgMTsKICAgIHZhciBmcmFjdGlvbkNvbXBsZXRlZCA9IHBhZGRlZFZpZXdlZENhcmRDb3VudCAvIChwYWRkZWRWaWV3ZWRDYXJkQ291bnQgKyBtYXhSZW1haW5pbmdDYXJkcyk7CgogICAgdmFyIGJyYW5kZWRMb2dvID0gZnVuY3Rpb24gYnJhbmRlZExvZ28oKSB7CiAgICAgIHJldHVybiBzaG93U3VydmV5QnJhbmQgPyAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJhIiwgewogICAgICAgIHN0eWxlOiAiZGlzcGxheTogYmxvY2s7IG1hcmdpbjogNXB4IDAgMTBweCAwIiwKICAgICAgICBocmVmOiAiIi5jb25jYXQobWFya2V0aW5nVXJsLCAiP3V0bV9zb3VyY2U9c3VydmV5X2JyYW5kaW5nJnV0bV9tZWRpdW09d2Vic2l0ZSZ1dG1fY2FtcGFpZ249IikuY29uY2F0KHNsdWdOYW1lLCAiJnV0bV9jb250ZW50PSIpLmNvbmNhdChzdXJ2ZXlJZCksCiAgICAgICAgdGFyZ2V0OiAiX2JsYW5rIgogICAgICB9LCBfdmlld19jb21wb25lbnRzX0xvZ29fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1siZGVmYXVsdCJdKSA6IG51bGw7CiAgICB9OyAvLyBUaGVyZSdzIG9ubHkgMSBxdWVzdGlvbiBpbiB0aGUgc3R1ZHksIG5vIHByb2dyZXNzIGJhcgoKCiAgICBpZiAoIXF1ZXN0aW9uU3RlcHMgfHwgcXVlc3Rpb25TdGVwcy5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoImZvb3RlciIsIHsKICAgICAgICBjbGFzc05hbWU6ICJ1bC1mb290ZXIiCiAgICAgIH0sIGJyYW5kZWRMb2dvKTsKICAgIH0KCiAgICB2YXIgcHJvZ3Jlc3NJbmRpY2F0b3IgPSBmdW5jdGlvbiBwcm9ncmVzc0luZGljYXRvcigpIHsKICAgICAgaWYgKHF1ZXN0aW9uU3RlcHMubGVuZ3RoID4gMSkgewogICAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJkaXYiLCB7CiAgICAgICAgICBpZDogInVsLXByb2dyZXNzLWJhci1jb250YWluZXIiCiAgICAgICAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgiZGl2IiwgewogICAgICAgICAgaWQ6ICJ1bC1wcm9ncmVzcy1iYXItY3VycmVudCIsCiAgICAgICAgICBzdHlsZTogZ2V0UHJvZ3Jlc3NXaWR0aCgpCiAgICAgICAgfSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIHZhciBnZXRQcm9ncmVzc1dpZHRoID0gZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NXaWR0aCgpIHsKICAgICAgdmFyIHByb2dyZXNzQmFyV2lkdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWwtcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcicpOyAvLyBUaGUgZmlyc3QgcXVlc3Rpb24gZG9lc24ndCBoYXZlIERPTSBmdWxseSByZW5kZXJlZCB5ZXQKCiAgICAgIHZhciB0b3RhbFdpZHRoID0gcHJvZ3Jlc3NCYXJXaWR0aCA/IHByb2dyZXNzQmFyV2lkdGguY2xpZW50V2lkdGggOiAyNTA7CiAgICAgIHZhciBnZXRPbGRXaWR0aCA9IHByb2dyZXNzQmFyV2lkdGggPyAiIi5jb25jYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VsLXByb2dyZXNzLWJhci1jdXJyZW50Jykuc3R5bGUud2lkdGgucmVwbGFjZSgncHgnLCAnJykpIDogMDsKICAgICAgdmFyIGdldE5ld1dpZHRoID0gIiIuY29uY2F0KHBhcnNlRmxvYXQoKGZyYWN0aW9uQ29tcGxldGVkICogdG90YWxXaWR0aCkudG9GaXhlZCg0KSkpOwogICAgICBpZiAoZ2V0T2xkV2lkdGggIT09IGdldE5ld1dpZHRoKSBhZGRBbmltYXRpb24oZ2V0T2xkV2lkdGgsIGdldE5ld1dpZHRoKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aDogIiIuY29uY2F0KGdldE5ld1dpZHRoLCAicHgiKSwKICAgICAgICBhbmltYXRpb246ICJncm93UmlnaHQgMXMiLAogICAgICAgIGJvcmRlcjogIjFweCBzb2xpZCAiLmNvbmNhdChib3JkZXIgPyBib3JkZXIgOiAnIzAwMCcpCiAgICAgIH07CiAgICB9OyAvLyBEeW5hbWljYWxseSBhZGQga2V5ZnJhbWUgYW5pbWF0aW9uIGZvciBwcm9ncmVzcyBiYXIgdG8gaW5jcmVhc2UKCgogICAgdmFyIGFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIGFkZEFuaW1hdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHZhciBjc3NBbmltYXRpb24gPSAiXG4gICAgICBAa2V5ZnJhbWVzIGdyb3dSaWdodCB7XG4gICAgICAgIGZyb20ge1xuICAgICAgICAgIHdpZHRoOiAiLmNvbmNhdChzdGFydCwgInB4O1xuICAgICAgICB9XG4gICAgICAgIHRvIHtcbiAgICAgICAgICB3aWR0aDogIikuY29uY2F0KGVuZCwgInB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgIik7CiAgICAgIHZhciBkeW5hbWljU3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgZHluYW1pY1N0eWxlcy50eXBlID0gJ3RleHQvY3NzJzsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkeW5hbWljU3R5bGVzKTsKICAgICAgZHluYW1pY1N0eWxlcy5zaGVldC5pbnNlcnRSdWxlKGNzc0FuaW1hdGlvbiwgZHluYW1pY1N0eWxlcy5sZW5ndGgpOwogICAgfTsKCiAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgiZm9vdGVyIiwgewogICAgICBjbGFzc05hbWU6ICJ1bC1mb290ZXIgIi5jb25jYXQoaGVhZGVyc1sndXNlcmxlYXAtcGxhdGZvcm0nXSA9PT0gJ2xpbmsnID8gJ3VsLWZvb3Rlcl9fbGluaycgOiAnJyksCiAgICAgIGtleTogY3VycmVudFN0ZXAKICAgIH0sIHByb2dyZXNzSW5kaWNhdG9yLCBicmFuZGVkTG9nbyk7CiAgfTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvTG9nby5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvY29tcG9uZW50cy9Mb2dvLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7CgovKioKICogVXNlckxlYXAgbG9nbyBjb21wb25lbnQKICogQHJldHVybiB7T2JqZWN0fSBMb2dvIGNvbXBvbmVudAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uICgpIHsKICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgic3ZnIiwgewogICAgd2lkdGg6ICIxMDAiLAogICAgaGVpZ2h0OiAiMTMiLAogICAgdmlld0JveDogIjAgMCAxMDAgMTMiLAogICAgZmlsbDogIm5vbmUiLAogICAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICBhbHQ6ICJQb3dlcmVkIGJ5IFNwcmlnIgogIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTMuMDM2OSAwLjgzOTk4MUgwLjAyNDkwMjNWOC45OTk5OEgxLjMyMDlWNi41Mzk5OEgyLjg1NjlDNC44OTY5IDYuNTM5OTggNi4yNDA5IDUuMzc1OTggNi4yNDA5IDMuNjIzOThDNi4yNDA5IDEuOTU1OTggNC45Njg5IDAuODM5OTgxIDMuMDM2OSAwLjgzOTk4MVpNMy4wMDA5IDUuMzUxOThIMS4zMjA5VjIuMDI3OThIMy4wMDA5QzQuMTc2OSAyLjAyNzk4IDQuOTY4OSAyLjY3NTk4IDQuOTY4OSAzLjYyMzk4QzQuOTY4OSA0LjY1NTk4IDQuMTc2OSA1LjM1MTk4IDMuMDAwOSA1LjM1MTk4WiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNOS45MDY1MyAzLjIxNTk4QzguMTU0NTMgMy4yMTU5OCA2LjkwNjUzIDQuNDUxOTggNi45MDY1MyA2LjE3OTk4QzYuOTA2NTMgNy45MDc5OCA4LjE1NDUzIDkuMTQzOTggOS45MDY1MyA5LjE0Mzk4QzExLjY1ODUgOS4xNDM5OCAxMi45MDY1IDcuOTA3OTggMTIuOTA2NSA2LjE3OTk4QzEyLjkwNjUgNC40NTE5OCAxMS42NTg1IDMuMjE1OTggOS45MDY1MyAzLjIxNTk4Wk05LjkwNjUzIDguMDE1OThDOC44ODY1MyA4LjAxNTk4IDguMTU0NTMgNy4yMzU5OCA4LjE1NDUzIDYuMTc5OThDOC4xNTQ1MyA1LjExMTk4IDguODg2NTMgNC4zNDM5OCA5LjkwNjUzIDQuMzQzOThDMTAuOTI2NSA0LjM0Mzk4IDExLjY1ODUgNS4xMTE5OCAxMS42NTg1IDYuMTc5OThDMTEuNjU4NSA3LjIzNTk4IDEwLjkyNjUgOC4wMTU5OCA5LjkwNjUzIDguMDE1OThaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk0yMC45NjMxIDMuMzU5OThMMTkuNzM5MSA3LjExNTk4TDE4LjM5NTEgMy4zNTk5OEgxNy4zMjcxTDE1Ljk4MzEgNy4xMjc5OEwxNC43NTkxIDMuMzU5OThIMTMuNDE1MUwxNS40NDMxIDguOTk5OThIMTYuNTM1MUwxNy44NjcxIDUuMDg3OThMMTkuMTg3MSA4Ljk5OTk4SDIwLjI3OTFMMjIuMzA3MSAzLjM1OTk4SDIwLjk2MzFaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk0yNS43MjQ2IDMuMjE1OThDMjQuMDA4NiAzLjIxNTk4IDIyLjgyMDYgNC41MTE5OCAyMi44MjA2IDYuMTc5OThDMjIuODIwNiA3Ljg1OTk4IDI0LjAyMDYgOS4xNDM5OCAyNS43OTY2IDkuMTQzOThDMjcuMDIwNiA5LjE0Mzk4IDI4LjAxNjYgOC41NDM5OCAyOC4zNzY2IDcuNTIzOThIMjcuMDA4NkMyNi43ODA2IDcuODgzOTggMjYuMzYwNiA4LjA1MTk4IDI1LjgwODYgOC4wNTE5OEMyNC43NTI2IDguMDUxOTggMjQuMjEyNiA3LjQwMzk4IDI0LjA5MjYgNi41NTE5OEgyOC41MjA2QzI4Ljc2MDYgNC42NDM5OCAyNy41OTY2IDMuMjE1OTggMjUuNzI0NiAzLjIxNTk4Wk0yNS43MzY2IDQuMjcxOThDMjYuNjEyNiA0LjI3MTk4IDI3LjIxMjYgNC43NjM5OCAyNy4yODQ2IDUuNjg3OThIMjQuMTE2NkMyNC4yNjA2IDQuODk1OTggMjQuODAwNiA0LjI3MTk4IDI1LjczNjYgNC4yNzE5OFoiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTMxLjEyOTcgNC4xMjc5OFYzLjM1OTk4SDI5Ljg4MTdWOC45OTk5OEgzMS4xMjk3VjUuNDQ3OThDMzEuNjMzNyA0Ljc4Nzk4IDMyLjMxNzcgNC40NTE5OCAzMy4yMTc3IDQuNDE1OThWMy4yMzk5OEMzMi4zNTM3IDMuMjM5OTggMzEuNjQ1NyAzLjU2Mzk4IDMxLjEyOTcgNC4xMjc5OFoiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTM2LjgyMjIgMy4yMTU5OEMzNS4xMDYyIDMuMjE1OTggMzMuOTE4MiA0LjUxMTk4IDMzLjkxODIgNi4xNzk5OEMzMy45MTgyIDcuODU5OTggMzUuMTE4MiA5LjE0Mzk4IDM2Ljg5NDIgOS4xNDM5OEMzOC4xMTgyIDkuMTQzOTggMzkuMTE0MiA4LjU0Mzk4IDM5LjQ3NDIgNy41MjM5OEgzOC4xMDYyQzM3Ljg3ODIgNy44ODM5OCAzNy40NTgyIDguMDUxOTggMzYuOTA2MiA4LjA1MTk4QzM1Ljg1MDIgOC4wNTE5OCAzNS4zMTAyIDcuNDAzOTggMzUuMTkwMiA2LjU1MTk4SDM5LjYxODJDMzkuODU4MiA0LjY0Mzk4IDM4LjY5NDIgMy4yMTU5OCAzNi44MjIyIDMuMjE1OThaTTM2LjgzNDIgNC4yNzE5OEMzNy43MTAyIDQuMjcxOTggMzguMzEwMiA0Ljc2Mzk4IDM4LjM4MjIgNS42ODc5OEgzNS4yMTQyQzM1LjM1ODIgNC44OTU5OCAzNS44OTgyIDQuMjcxOTggMzYuODM0MiA0LjI3MTk4WiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNNDUuNDg4NiAwLjQ3OTk4VjMuODAzOThDNDUuMDA4NiAzLjQzMTk4IDQ0LjM5NjYgMy4yMTU5OCA0My42NzY2IDMuMjE1OThDNDIuMDkyNiAzLjIxNTk4IDQwLjgyMDYgNC41MzU5OCA0MC44MjA2IDYuMTY3OThDNDAuODIwNiA3LjgyMzk4IDQyLjA5MjYgOS4xNDM5OCA0My42NzY2IDkuMTQzOThDNDQuMzk2NiA5LjE0Mzk4IDQ1LjAwODYgOC45Mjc5OCA0NS40ODg2IDguNTQzOThWOC45OTk5OEg0Ni43MjQ2VjAuNDc5OThINDUuNDg4NlpNNDMuODU2NiA4LjAxNTk4QzQyLjgyNDYgOC4wMTU5OCA0Mi4wNjg2IDcuMTc1OTggNDIuMDY4NiA2LjE2Nzk4QzQyLjA2ODYgNS4xNzE5OCA0Mi44MjQ2IDQuMzQzOTggNDMuODU2NiA0LjM0Mzk4QzQ0LjQ4MDYgNC4zNDM5OCA0NS4wNjg2IDQuNTU5OTggNDUuNDg4NiA1LjE1OTk4VjcuMTg3OThDNDUuMDY4NiA3Ljc5OTk4IDQ0LjQ4MDYgOC4wMTU5OCA0My44NTY2IDguMDE1OThaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk01NC42Nzk3IDMuMjE1OThDNTMuOTU5NyAzLjIxNTk4IDUzLjM0NzcgMy40MzE5OCA1Mi44Nzk3IDMuNzkxOThWMC40Nzk5OEg1MS42MzE3VjguOTk5OThINTIuODc5N1Y4LjU1NTk4QzUzLjM0NzcgOC45Mjc5OCA1My45NTk3IDkuMTQzOTggNTQuNjc5NyA5LjE0Mzk4QzU2LjI2MzcgOS4xNDM5OCA1Ny41NDc3IDcuODIzOTggNTcuNTQ3NyA2LjE2Nzk4QzU3LjU0NzcgNC41MzU5OCA1Ni4yNjM3IDMuMjE1OTggNTQuNjc5NyAzLjIxNTk4Wk01NC40OTk3IDguMDE1OThDNTMuODc1NyA4LjAxNTk4IDUzLjI5OTcgNy43OTk5OCA1Mi44Nzk3IDcuMjExOThWNS4xMzU5OEM1My4yOTk3IDQuNTQ3OTggNTMuODc1NyA0LjM0Mzk4IDU0LjQ5OTcgNC4zNDM5OEM1NS41NDM3IDQuMzQzOTggNTYuMjk5NyA1LjE3MTk4IDU2LjI5OTcgNi4xNjc5OEM1Ni4yOTk3IDcuMTc1OTggNTUuNTQzNyA4LjAxNTk4IDU0LjQ5OTcgOC4wMTU5OFoiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTYzLjMzNDcgMy4zNDc5OEw2MS4zOTA3IDcuNzYzOThMNTkuMjY2NyAzLjM0Nzk4SDU3LjkzNDdMNjAuODE0NyA5LjA4Mzk4TDU5LjYyNjcgMTEuNzg0SDYwLjkzNDdMNjQuNjU0NyAzLjM0Nzk4SDYzLjMzNDdaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk03MS4xNDY2IDQuMzQ2NjFDNjkuODA5MiA0LjA1MDM4IDY5LjEzMSAzLjUzMDAxIDY5LjEzMSAyLjgwMDY1QzY5LjEzMSAyLjA0NzA1IDY5Ljg1NDYgMS40NzgyMiA3MC44MTQyIDEuNDc4MjJDNzEuODAzNCAxLjQ3ODIyIDcyLjU0OTYgMi4xMDMzOSA3Mi41NDk2IDIuOTMyMVYyLjk5ODEzSDczLjkxNjVWMi45MzIxQzczLjkxNjUgMS40MTc2NCA3Mi41ODgzIDAuMjcyNzA1IDcwLjgyNzEgMC4yNzI3MDVDNjkuOTc4NCAwLjI3MjcwNSA2OS4yMDA5IDAuNTMzMTkxIDY4LjYzNzkgMS4wMDU3QzY4LjM1ODQgMS4yMzYxOSA2OC4xMzM5IDEuNTI0ODcgNjcuOTgwNSAxLjg1MTFDNjcuODI3MSAyLjE3NzMzIDY3Ljc0ODYgMi41MzMwMyA2Ny43NTA2IDIuODkyNzNDNjcuNzQ1MSAzLjIyMjU1IDY3LjgxMzcgMy41NDk0OSA2Ny45NTE1IDMuODQ5OTRDNjguMDg5NCA0LjE1MDM4IDY4LjI5MyA0LjQxNjg2IDY4LjU0NzggNC42MzAxMkM2OS4wMjE4IDUuMDQyNjYgNjkuNjk0NSA1LjM0Nzk4IDcwLjU0NjMgNS41Mzg4QzcxLjk4MDYgNS44NTUwMiA3Mi43MDc4IDYuMzkyOTYgNzIuNzA3OCA3LjEzNjg2QzcyLjcwNzggNy45NDMxNiA3MS45MTU2IDguNTUwNzYgNzAuODY4MiA4LjU1MDc2QzY5Ljc4MDQgOC41NTA3NiA2OC45NTk5IDcuODc1MzEgNjguOTU5OSA2Ljk3OTk2VjYuOTEzOTNINjcuNTkxOFY2Ljk3OTk2QzY3LjU5MTggOC41NjM0OCA2OC45OTQyIDkuNzU2ODggNzAuODUzNSA5Ljc1Njg4QzcxLjc0MjYgOS43NTY4OCA3Mi41NTg4IDkuNDg3MzEgNzMuMTUxOCA4Ljk5NjYyQzczLjQ0NiA4Ljc1ODMxIDczLjY4MjcgOC40NTgxIDczLjg0NDUgOC4xMTc5Qzc0LjAwNjMgNy43Nzc3IDc0LjA4OTEgNy40MDYxMSA3NC4wODcgNy4wMzAyNEM3NC4wODcgNS42ODU0IDczLjA5OTEgNC43ODIxNyA3MS4xNDY2IDQuMzQ2NjFaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk03OC43OTg2IDIuNTA4MDZDNzguMjg3NCAyLjUwMTc1IDc3Ljc4MjMgMi42MTc2IDc3LjMyNjMgMi44NDU3NkM3Ni44NzAzIDMuMDczOTEgNzYuNDc2OCAzLjQwNzU5IDc2LjE3OTUgMy44MTgzN1YyLjY2NzM4SDc0Ljg3ODlWMTIuMDc1Mkg3Ni4xNzk1VjguNDg3MTZDNzYuNDc2OCA4Ljg5NzkgNzYuODcwMyA5LjIzMTUyIDc3LjMyNjMgOS40NTk1N0M3Ny43ODI0IDkuNjg3NjMgNzguMjg3NSA5LjgwMzM1IDc4Ljc5ODYgOS43OTY4N0M4MC44MTY3IDkuNzk2ODcgODIuMzM4MSA4LjIzMDMxIDgyLjMzODEgNi4xNTI0NkM4Mi4zMzgxIDQuMDc0NjIgODAuODE2NyAyLjUwODA2IDc4Ljc5ODYgMi41MDgwNlpNODAuOTgzNSA2LjQyMjY0QzgwLjkzMTYgNi45NjI5IDgwLjY5MjEgNy40Njg3OSA4MC4zMDU2IDcuODU0NEM3OS45MTkgOC4yNDAwMSA3OS40MDkzIDguNDgxNTYgNzguODYzIDguNTM4MDRDNzguMTM2OSA4LjYxMDc0IDc3LjQ2MDUgOC40MDI5NSA3Ni45NTgzIDcuOTU0MDdDNzYuNDU2MSA3LjUwNTE4IDc2LjE3OTUgNi44NjM2NSA3Ni4xNzk1IDYuMTUyNDZDNzYuMTc5NSA0Ljc4NDYgNzcuMjEyMiAzLjc1Mjk1IDc4LjU4MTUgMy43NTI5NUM3OS4yOTA0IDMuNzUyOTUgNzkuOTMwNiA0LjAyMTkxIDgwLjM3NzYgNC41MTAxOEM4MC44Mzg3IDUuMDExMTYgODEuMDU0IDUuNjkwMjUgODAuOTgzNSA2LjQyMjY0WiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNOTguMjkwOCAyLjY2OTJWMy44MDc0N0M5Ny42Nzc2IDIuOTc4NzUgOTYuNzMwMiAyLjUwODA2IDk1LjY1ODMgMi41MDgwNkM5My42NDgyIDIuNTA4MDYgOTIuMTMyMyA0LjA0NjE1IDkyLjEzMjMgNi4wODU4MkM5Mi4xMzIzIDguMTI1NSA5My42NDgyIDkuNjYyOTkgOTUuNjU4MyA5LjY2Mjk5Qzk2LjczNDUgOS42NjI5OSA5Ny42ODE5IDkuMTk3MTQgOTguMjkwOCA4LjM3NjkxVjguNTUxOThDOTguMjkwOCA5Ljk2ODkxIDk3LjM5MDYgMTAuODg0MyA5NS45OTc0IDEwLjg4NDNDOTUuMDU2MSAxMC44ODQzIDk0LjI3MTggMTAuNDc2NiA5My44OTk2IDkuNzkzODRMOTMuODgwNiA5Ljc1ODdIOTIuNTM4OUw5Mi41Njk1IDkuODQ2NTRDOTIuNzk2MSAxMC41MTQgOTMuMjM5MiAxMS4wODg5IDkzLjgzMDMgMTEuNDgyMkM5NC40MjMzIDExLjg3MjMgOTUuMTcyNiAxMi4wNzgzIDk1Ljk5NzQgMTIuMDc4M0M5Ny4wNTUyIDEyLjA3ODMgOTcuOTU1NCAxMS43NDUxIDk4LjYwMTcgMTEuMTE1N0M5OS4yNDgxIDEwLjQ4NjIgOTkuNTkxNSA5LjYwMTIgOTkuNTkxNSA4LjU2NzczVjIuNjY5Mkg5OC4yOTA4Wk05Ny41NjExIDcuODQyQzk3LjAwOTIgOC4zNjQxOCA5Ni4yMjI1IDguNTgzNDggOTUuNDAwMSA4LjQ0Mjk0Qzk0LjkxMzIgOC4zNTc5NiA5NC40NjY0IDguMTIxODQgOTQuMTI0NSA3Ljc2ODg5QzkzLjc4MjcgNy40MTU5MyA5My41NjM2IDYuOTY0NTIgOTMuNDk5MiA2LjQ4MDE5QzkzLjM4MzMgNS42NjU0MSA5My42MzEgNC44OTM2NCA5NC4xNzg2IDQuMzY0MThDOTQuNjM4MyAzLjkyNzQxIDk1LjI1NDIgMy42ODc4OCA5NS44OTE5IDMuNjk3ODJDOTYuMDQ2NCAzLjY5Nzk1IDk2LjIwMDYgMy43MTAzMSA5Ni4zNTMxIDMuNzM0NzdDOTcuMzQ1OSAzLjg5MzQ5IDk4LjEzMTQgNC43MDQwMyA5OC4yNjMyIDUuNzEwMjRDOTguMzc0OSA2LjUzODM1IDk4LjExNzkgNy4zMTQzNiA5Ny41NjExIDcuODQyWiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNOTAuNzA1IDAuMDk5NTk3NUM5MC40NjAyIDAuMDQ2NzczIDkwLjIwNDMgMC4wOTExOTcxIDg5Ljk5MjUgMC4yMjMyNjlDODkuNzgwNiAwLjM1NTM0IDg5LjYyOTkgMC41NjQ0NTIgODkuNTcyOSAwLjgwNTQwOUM4OS41MTU5IDEuMDQ2MzcgODkuNTU3MSAxLjI5OTgyIDg5LjY4NzcgMS41MTA5OEM4OS44MTgzIDEuNzIyMTUgOTAuMDI3NyAxLjg3NDA3IDkwLjI3MDggMS45MzM5MUM5MC4zNDE1IDEuOTQ5NTQgOTAuNDEzNiAxLjk1NzQ3IDkwLjQ4NiAxLjk1NzU0QzkwLjcyIDEuOTU3OSA5MC45NDU4IDEuODczMjUgOTEuMTIwNiAxLjcxOTczQzkxLjI5NTUgMS41NjYyIDkxLjQwNyAxLjM1NDUyIDkxLjQzNDEgMS4xMjVDOTEuNDYxMSAwLjg5NTQ3IDkxLjQwMTcgMC42NjQxMzUgOTEuMjY3MyAwLjQ3NTA0NkM5MS4xMzI5IDAuMjg1OTU4IDkwLjkzMjcgMC4xNTIzMjUgOTAuNzA1IDAuMDk5NTk3NVYwLjA5OTU5NzVaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk04OS44MzY2IDguMzkxNDNIODguNzE1Qzg3LjkxNzggOC4zOTE0MyA4Ny40Mzg5IDcuODU1MzEgODcuNDM4OSA2Ljk1NjkzQzg3LjQzODkgNi4wODA5NiA4Ny44NjgxIDUuMDM2NTkgODguNzQzMiAzLjc2NDQ0TDg4Ljc1NDggMy43NDc0OFYzLjM4ODI1TDg1LjAyNzEgMi44NjcyN0M4NS4wMjg0IDIuNzE1NTMgODQuOTg4NiAyLjU2NjIyIDg0LjkxMTggMi40MzQ3OEM4NC44MzUxIDIuMzAzMzUgODQuNzI0MSAyLjE5NDU4IDg0LjU5MDUgMi4xMTk3M0M4NC4yNTYzIDEuOTM4IDgzLjg5MDggMS45MzggODMuNTg3OSAyLjExMzY4QzgzLjQzNjEgMi4yMDIzIDgzLjMxMjIgMi4zMzA3NyA4My4yMyAyLjQ4NDhDODMuMTQ3NyAyLjYzODg0IDgzLjExMDMgMi44MTI0IDgzLjEyMTkgMi45ODYxOEM4My4xMzM2IDMuMTU5OTYgODMuMTkzOCAzLjMyNzE0IDgzLjI5NTggMy40NjkxNEM4My4zOTc5IDMuNjExMTQgODMuNTM3OSAzLjcyMjM4IDgzLjcwMDEgMy43OTA0OUw4Mi41NDA1IDkuNjM3NTNIODMuODI4M0w4NC44OTc3IDQuMDg1NTFMODYuOTExNSA0LjQyMTExQzg2LjM3MDEgNS4zODAwNyA4Ni4wOTUzIDYuMjc0MjEgODYuMDk1MyA3LjA3ODY5Qzg2LjA5NTMgOC41NjM0NyA4Ny4wMDQxIDkuNTM1NzYgODguNDczNCA5LjYyOTY1VjkuNjM3NTNIOTEuMTM0MVYyLjY5MDk5SDg5LjgzNjZWOC4zOTE0M1oiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSkpOwp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvY29tcG9uZW50cy9TZWxlY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvY29tcG9uZW50cy9TZWxlY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcyAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNsYXNzY2F0ICovICIuL25vZGVfbW9kdWxlcy9jbGFzc2NhdC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi8uLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCgovKioKICogU2VsZWN0IGNvbXBvbmVudAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmJvcmRlciBUaGVtZSBib3JkZXIgY29sb3IKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmxhYmVsIENob2ljZSBsYWJlbAogKiBAcGFyYW0ge051bWJlcn0gc3RhdGUuaW5kZXggVGFiIGluZGV4CiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm9uc2VsZWN0IE9uIHNlbGVjdCBoYW5kbGVyCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5pZCBJZCBvZiB0aGUgb3B0aW9uCiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdGUuaXNyYWRpbyBSYWRpbyBvciBjaGVja2JveCBvcHRpb24KICogQHBhcmFtIHtCb29sZWFufSBzdGF0ZS51c2Vtb2JpbGVzdHlsaW5nIE1vYmlsZSB2cyBkZXNrdG9wIHN0eWxpbmcKICogQHBhcmFtIHtCb29sZWFufSBzdGF0ZS5zZWxlY3RlZCBJZiBjaGVja2JveCBvcHRpb24gaXMgc2VsZWN0ZWQKICogQHJldHVybiB7T2JqZWN0fSBDb21wb25lbnQKICovCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsLAogICAgICBzZWxlY3RlZCA9IF9yZWYuc2VsZWN0ZWQsCiAgICAgIGluZGV4ID0gX3JlZi5pbmRleCwKICAgICAgaWQgPSBfcmVmLmlkLAogICAgICBvblNlbGVjdCA9IF9yZWYub25TZWxlY3QsCiAgICAgIGlzUmFkaW8gPSBfcmVmLmlzUmFkaW8sCiAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfcmVmLnVzZU1vYmlsZVN0eWxpbmc7CgogIHZhciBzZXRBY3RpdmVTdHlsZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZVN0eWxlKGUpIHsKICAgIHZhciBjaG9pY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hvaWNlLWRpdi0iLmNvbmNhdChpZCkpOwogICAgdmFyIHJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJhZGlvLSIuY29uY2F0KGlkKSk7CiAgICBpZiAoY2hvaWNlKSBjaG9pY2Uuc3R5bGUuYm9yZGVyQ29sb3IgPSBib3JkZXI7CgogICAgaWYgKHJhZGlvKSB7CiAgICAgIHJhZGlvLnN0eWxlLmJvcmRlcldpZHRoID0gJzZweCc7CiAgICAgIHJhZGlvLnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyOwogICAgICByYWRpby5zdHlsZS5ib3hTaGFkb3cgPSAnbm9uZSc7CiAgICB9CiAgfTsKCiAgdmFyIHNldERlZmF1bHRTdHlsZSA9IGZ1bmN0aW9uIHNldERlZmF1bHRTdHlsZShlKSB7CiAgICB2YXIgY2hvaWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNob2ljZS1kaXYtIi5jb25jYXQoaWQpKTsKICAgIHZhciByYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyYWRpby0iLmNvbmNhdChpZCkpOwogICAgaWYgKGNob2ljZSkgY2hvaWNlLnN0eWxlLmJvcmRlckNvbG9yID0gJyNlNmU2ZTYnOwoKICAgIGlmIChyYWRpbykgewogICAgICByYWRpby5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHgnOwogICAgICByYWRpby5zdHlsZS5ib3JkZXJDb2xvciA9ICcjMzIzMjMyJzsKICAgICAgcmFkaW8uc3R5bGUuYm94U2hhZG93ID0gJ2luc2V0IDNweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xKSc7CiAgICB9CiAgfTsKCiAgdmFyIG9uQ2xpY2tFdmVudCA9IGZ1bmN0aW9uIG9uQ2xpY2tFdmVudChlKSB7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgc2V0RGVmYXVsdFN0eWxlKGUpOwogICAgb25TZWxlY3QoaWQpOwogIH07CgogIHZhciBvbktleVByZXNzID0gZnVuY3Rpb24gb25LZXlQcmVzcyhlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSAzMikgb25DbGlja0V2ZW50KGUpOwogIH07CgogIHZhciBjbGlja0FyZ3MgPSB7CiAgICBvbmNsaWNrOiBmdW5jdGlvbiBvbmNsaWNrKGUpIHsKICAgICAgcmV0dXJuIG9uQ2xpY2tFdmVudChlKTsKICAgIH0sCiAgICBvbmtleXByZXNzOiBmdW5jdGlvbiBvbmtleXByZXNzKGUpIHsKICAgICAgcmV0dXJuIG9uS2V5UHJlc3MoZSk7CiAgICB9CiAgfTsKCiAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgewogICAgY2xpY2tBcmdzLm9udG91Y2hzdGFydCA9IHNldEFjdGl2ZVN0eWxlOwogICAgY2xpY2tBcmdzLm9udG91Y2hjYW5jZWwgPSBzZXREZWZhdWx0U3R5bGU7CiAgICBjbGlja0FyZ3Mub250b3VjaG1vdmUgPSBzZXREZWZhdWx0U3R5bGU7CiAgICBjbGlja0FyZ3Mub250b3VjaGVuZCA9IHNldERlZmF1bHRTdHlsZTsKICB9IGVsc2UgewogICAgY2xpY2tBcmdzLm9ubW91c2Vkb3duID0gc2V0QWN0aXZlU3R5bGU7CiAgICBjbGlja0FyZ3Mub25tb3VzZWxlYXZlID0gc2V0RGVmYXVsdFN0eWxlOwogIH0KCiAgdmFyIGRpdklkID0gaXNSYWRpbyA/ICJyYWRpby0iLmNvbmNhdChpZCkgOiAiY2hlY2tib3gtIi5jb25jYXQoaWQpOwogIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoewogICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJkZWZhdWx0Il0pKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uZ2V0Q2xhc3NlcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkNIT0lDRV9DTEFTUywgdXNlTW9iaWxlU3R5bGluZykpLAogICAgaWQ6ICJjaG9pY2UtZGl2LSIuY29uY2F0KGlkKQogIH0sIGNsaWNrQXJncyksICFpc1JhZGlvICYmICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgIGNsYXNzTmFtZTogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkNIT0lDRV9DSEVDS0JPWF9DTEFTUywKICAgIGlkOiBkaXZJZCwKICAgIHN0eWxlOiBzZWxlY3RlZCA/IHsKICAgICAgYmFja2dyb3VuZENvbG9yOiBib3JkZXIsCiAgICAgIGJvcmRlckNvbG9yOiBib3JkZXIsCiAgICAgIGJveFNoYWRvdzogJ25vbmUnCiAgICB9IDoge30sCiAgICByb2xlOiAiY2hlY2tib3giLAogICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIGxhYmVsLSIpLmNvbmNhdChpZCksCiAgICAiYXJpYS1jaGVja2VkIjogc2VsZWN0ZWQsCiAgICB0YWJpbmRleDogMAogIH0sIHNlbGVjdGVkICYmICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInN2ZyIsIHsKICAgIHdpZHRoOiAiMTAiLAogICAgaGVpZ2h0OiAiMTAiLAogICAgdmlld0JveDogIjAgMCAxMCAxMCIsCiAgICBmaWxsOiAibm9uZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTkuMTUzNzcgMS4zMDc3NEw0LjA3Njg1IDguMjMwODJMMS4zMDc2MiA1LjAwMDA1IiwKICAgIHN0cm9rZTogIndoaXRlIiwKICAgICJzdHJva2Utd2lkdGgiOiAiMiIsCiAgICAic3Ryb2tlLWxpbmVjYXAiOiAicm91bmQiCiAgfSkpKSwgaXNSYWRpbyAmJiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6IF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5DSE9JQ0VfUkFESU9fQ0xBU1MsCiAgICBpZDogZGl2SWQsCiAgICByb2xlOiAicmFkaW8iLAogICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIGxhYmVsLSIpLmNvbmNhdChpZCksCiAgICB0YWJpbmRleDogMAogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJsYWJlbCIsIHsKICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5DSE9JQ0VfTEFCRUxfQ0xBU1MsIHVzZU1vYmlsZVN0eWxpbmcpKSwKICAgIGZvcjogZGl2SWQsCiAgICBpZDogImxhYmVsLSIuY29uY2F0KGlkKQogIH0sIGxhYmVsKSk7Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L2hlbHBlcnMvY2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldENhcHRpb24iOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0Q2FwdGlvbjsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiZ2V0SGVhZGxpbmUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0SGVhZGxpbmU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldEJ1dHRvblRleHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0QnV0dG9uVGV4dDsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiZ2V0U2tpcEJ1dHRvblRleHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0U2tpcEJ1dHRvblRleHQ7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uL3NoYXJlZC9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKLy8gZm9yIHNoYXJlZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBxdWVzdGlvbi9jYXJkIHZpZXdzCgoKdmFyIGdldENhcHRpb24gPSBmdW5jdGlvbiBnZXRDYXB0aW9uKHByb3BlcnRpZXMpIHsKICByZXR1cm4gcHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLmNhcHRpb25UZXh0ID8gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicCIsIHsKICAgIGlkOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLkNTU19DT05TVEFOVFMuQ0FQVElPTl9DTEFTUywKICAgIGNsYXNzTmFtZTogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5DU1NfQ09OU1RBTlRTLkNBUFRJT05fQ0xBU1MKICB9LCBwcm9wZXJ0aWVzLmNhcHRpb25UZXh0KSA6IG51bGw7Cn07CnZhciBnZXRIZWFkbGluZSA9IGZ1bmN0aW9uIGdldEhlYWRsaW5lKGNhcHRpb24sIG1lc3NhZ2UpIHsKICByZXR1cm4gY2FwdGlvbiA/ICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInAiLCB7CiAgICBpZDogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywKICAgIGNsYXNzTmFtZTogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywKICAgIHJvbGU6ICJoZWFkaW5nIgogIH0sIG1lc3NhZ2UpIDogKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicCIsIHsKICAgIGlkOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgY2xhc3NOYW1lOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgc3R5bGU6ICJtYXJnaW4tYm90dG9tOiAxNXB4IiwKICAgIHJvbGU6ICJoZWFkaW5nIgogIH0sIG1lc3NhZ2UpOwp9Owp2YXIgZ2V0QnV0dG9uVGV4dCA9IGZ1bmN0aW9uIGdldEJ1dHRvblRleHQocHJvcGVydGllcykgewogIHJldHVybiBwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMuYnV0dG9uVGV4dCA/IHByb3BlcnRpZXMuYnV0dG9uVGV4dCA6ICdOZXh0JzsKfTsKdmFyIGdldFNraXBCdXR0b25UZXh0ID0gZnVuY3Rpb24gZ2V0U2tpcEJ1dHRvblRleHQocHJvcGVydGllcykgewogIHJldHVybiBwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMuc2tpcEJ1dHRvblRleHQgPyBwcm9wZXJ0aWVzLnNraXBCdXR0b25UZXh0IDogJ1NraXAnOwp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9zdG9yZS9hY3Rpb25zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvc3RvcmUvYWN0aW9ucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25mbGljdGluZ193aWRnZXRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3NoYXJlZC9jb25mbGljdGluZ193aWRnZXRzICovICIuL3NyYy9zaGFyZWQvY29uZmxpY3Rpbmdfd2lkZ2V0cy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZHVsZXNfYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZHVsZXMvYXBwICovICIuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvYXBwLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfbW9kdWxlc19tdWx0aXBsZXNlbGVjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2R1bGVzL211bHRpcGxlc2VsZWN0ICovICIuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvbXVsdGlwbGVzZWxlY3QuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tb2R1bGVzX29wZW5UZXh0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZHVsZXMvb3BlblRleHQgKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9vcGVuVGV4dC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vc2hhcmVkL3VsRXZlbnRzICovICIuL3NyYy9zaGFyZWQvdWxFdmVudHMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uL3NoYXJlZC9zaG91bGREaXJlY3RFbWJlZCAqLyAiLi9zcmMvc2hhcmVkL3Nob3VsZERpcmVjdEVtYmVkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX3Rvb2xfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uL3NoYXJlZC90b29sICovICIuL3NyYy9zaGFyZWQvdG9vbC5qcyIpOwoKCgoKZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CgpmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9CgovKiBnbG9iYWxzIHdpbmRvdywgZG9jdW1lbnQgKi8KCgoKCgoKCgp2YXIgYWN0aW9ucyA9IHsKICAvKioKICAgKiBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiBzdGF0ZSBmb3IgdGhpcyB1c2VyCiAgICogQHBhcmFtIHtTdHJpbmd9IGZyYW1lIEZyYW1lJ3MgaWQKICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwSWQgQXBwbGljYXRpb24gdHJhY2tpbmcgaWQKICAgKiBAcGFyYW0ge1N0cmluZ30gdXNlcklkIFVzZXIgdHJhY2tpbmcgaWQKICAgKiBAcGFyYW0ge09iamVjdH0gbWV0YSBVc2VyIG1ldGEgaW5mb3JtYXRpb24KICAgKiBAcGFyYW0ge1N0cmluZ30gYm9yZGVyIEJvcmRlciBjb2xvciBvZiB0aGUgd2lkZ2V0CiAgICovCiAgaW5pdDogZnVuY3Rpb24gaW5pdChfcmVmKSB7CiAgICB2YXIgZnJhbWUgPSBfcmVmLmZyYW1lLAogICAgICAgIGNhcmRzID0gX3JlZi5jYXJkcywKICAgICAgICBzdXJ2ZXlJZCA9IF9yZWYuc3VydmV5SWQsCiAgICAgICAgZW52SWQgPSBfcmVmLmVudklkLAogICAgICAgIHVzZXJJZCA9IF9yZWYudXNlcklkLAogICAgICAgIG1ldGEgPSBfcmVmLm1ldGEsCiAgICAgICAgYm9yZGVyID0gX3JlZi5ib3JkZXIsCiAgICAgICAgZm9udEZhbWlseSA9IF9yZWYuZm9udEZhbWlseSwKICAgICAgICBmb250RmFtaWx5VVJMID0gX3JlZi5mb250RmFtaWx5VVJMLAogICAgICAgIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsCiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgICAgYXBpVVJMID0gX3JlZi5hcGlVUkwsCiAgICAgICAgc2hvd1N1cnZleUJyYW5kID0gX3JlZi5zaG93U3VydmV5QnJhbmQsCiAgICAgICAgbWFya2V0aW5nVXJsID0gX3JlZi5tYXJrZXRpbmdVcmwsCiAgICAgICAgc2x1Z05hbWUgPSBfcmVmLnNsdWdOYW1lLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQgPSBfcmVmLnJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgaGVhZGVycyA9IF9yZWYuaGVhZGVycywKICAgICAgICBlbmRDYXJkID0gX3JlZi5lbmRDYXJkLAogICAgICAgIGNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljayA9IF9yZWYuY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrLAogICAgICAgIGlzUHJldmlldyA9IF9yZWYuaXNQcmV2aWV3LAogICAgICAgIGFuc3dlcnMgPSBfcmVmLmFuc3dlcnMsCiAgICAgICAgY3VzdG9tTWV0YWRhdGEgPSBfcmVmLmN1c3RvbU1ldGFkYXRhLAogICAgICAgIGV4cGVyaW1lbnRGbGFncyA9IF9yZWYuZXhwZXJpbWVudEZsYWdzLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfcmVmLnVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgbW9iaWxlUGxhdGZvcm0gPSBfcmVmLm1vYmlsZVBsYXRmb3JtLAogICAgICAgIGV2ZW50RW1pdHRlciA9IF9yZWYuZXZlbnRFbWl0dGVyLAogICAgICAgIHZpZXdlZENhcmRDb3VudCA9IF9yZWYudmlld2VkQ2FyZENvdW50OwogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9ucykgewogICAgICB2YXIgZG9jID0gKDAsX3NoYXJlZF9zaG91bGREaXJlY3RFbWJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fWyJkZWZhdWx0Il0pKGhlYWRlcnMpID8gd2luZG93LmRvY3VtZW50IDogd2luZG93LnBhcmVudC5kb2N1bWVudDsKICAgICAgYWN0aW9ucy5hcHAuaW5pdCh7CiAgICAgICAgZnJhbWU6IGRvYy5nZXRFbGVtZW50QnlJZChmcmFtZSksCiAgICAgICAgc3VydmV5SWQ6IHN1cnZleUlkLAogICAgICAgIGNhcmRzOiBjYXJkcywKICAgICAgICBlbnZJZDogZW52SWQsCiAgICAgICAgdXNlcklkOiB1c2VySWQsCiAgICAgICAgbWV0YTogbWV0YSwKICAgICAgICBib3JkZXI6IGJvcmRlciwKICAgICAgICBmb250RmFtaWx5OiBmb250RmFtaWx5LAogICAgICAgIGZvbnRGYW1pbHlVUkw6IGZvbnRGYW1pbHlVUkwsCiAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICBsb2NhbGU6IGxvY2FsZSwKICAgICAgICBhcGlVUkw6IGFwaVVSTCwKICAgICAgICBzaG93U3VydmV5QnJhbmQ6IHNob3dTdXJ2ZXlCcmFuZCwKICAgICAgICBtYXJrZXRpbmdVcmw6IG1hcmtldGluZ1VybCwKICAgICAgICBzbHVnTmFtZTogc2x1Z05hbWUsCiAgICAgICAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgICAgIGVuZENhcmQ6IGVuZENhcmQsCiAgICAgICAgY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrOiBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2ssCiAgICAgICAgaXNQcmV2aWV3OiBpc1ByZXZpZXcsCiAgICAgICAgYW5zd2VyczogYW5zd2VycywKICAgICAgICBjdXN0b21NZXRhZGF0YTogY3VzdG9tTWV0YWRhdGEsCiAgICAgICAgZXhwZXJpbWVudEZsYWdzOiBleHBlcmltZW50RmxhZ3MsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZzogdXNlTW9iaWxlU3R5bGluZywKICAgICAgICBtb2JpbGVQbGF0Zm9ybTogbW9iaWxlUGxhdGZvcm0sCiAgICAgICAgZXZlbnRFbWl0dGVyOiBldmVudEVtaXR0ZXIsCiAgICAgICAgdmlld2VkQ2FyZENvdW50OiB2aWV3ZWRDYXJkQ291bnQKICAgICAgfSk7CiAgICAgIGFjdGlvbnMuYXBwLnNlZW4oKTsKICAgIH07CiAgfSwKCiAgLyoqCiAgICogVXBkYXRlIHRoZSBwYXJlbnQgY29udGFpbmVyJ3MgaGVpZ2h0CiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIEFwcCBpZCBhdHRyaWJ1dGUKICAgKi8KICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShpZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChfcmVmMikgewogICAgICB2YXIgYXBwID0gX3JlZjIuYXBwOwogICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgdmFyIGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0OyAvLyBIYW5kbGUgaW5pdGlhbCBhbmltYXRpb24KCiAgICAgIGlmIChhcHAucnVubmluZyAmJiAhY2xhc3NMaXN0LmNvbnRhaW5zKCd1bC1hcHAtLXZpc2libGUnKSkgewogICAgICAgIGlmICgoMCxfc2hhcmVkX3Nob3VsZERpcmVjdEVtYmVkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImRlZmF1bHQiXSkoYXBwLmhlYWRlcnMpKSB7CiAgICAgICAgICBjbGFzc0xpc3QuYWRkKCd1bC1hcHAtLXZpc2libGUnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2xhc3NMaXN0LmFkZCgndWwtYXBwLS1vdmVybGF5Jyk7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgY2xhc3NMaXN0LmFkZCgndWwtYXBwLS12aXNpYmxlJyk7CiAgICAgICAgICB9LCAxMDApOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFwcC5ldmVudEVtaXR0ZXIpIGFwcC5ldmVudEVtaXR0ZXIuZW1pdChfc2hhcmVkX3VsRXZlbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18udWxFdmVudHMuU1VSVkVZX0FQUEVBUkVEKTsKICAgICAgfQoKICAgICAgaWYgKCEoMCxfc2hhcmVkX3Nob3VsZERpcmVjdEVtYmVkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImRlZmF1bHQiXSkoYXBwLmhlYWRlcnMpKSB7CiAgICAgICAgYXBwLmZyYW1lLnNldEhlaWdodCgoMCxfc2hhcmVkX3Rvb2xfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5jYWxjdWxhdGVGcmFtZUhlaWdodCkoZG9jdW1lbnQpKTsKICAgICAgfQogICAgfTsKICB9LAoKICAvKioKICAgKiBGYWRlIGFwcCBET00gb3V0CiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIEFwcCBpZCBhdHRyaWJ1dGUKICAgKi8KICBmYWRlb3V0OiBmdW5jdGlvbiBmYWRlb3V0KGlkKSB7CiAgICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgdmFyIF9yZWY0ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKF9yZWYzKSB7CiAgICAgICAgdmFyIGFwcCwgZXZlbnRFbWl0dGVyOwogICAgICAgIHJldHVybiBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgYXBwID0gX3JlZjMuYXBwOwogICAgICAgICAgICAgICAgZXZlbnRFbWl0dGVyID0gYXBwLmV2ZW50RW1pdHRlcjsKCiAgICAgICAgICAgICAgICBpZiAoISgwLF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdKShhcHAuaGVhZGVycykpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOwoKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChfc2hhcmVkX3VsRXZlbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18udWxFdmVudHMuU1VSVkVZX0ZBRElOR19PVVQpOwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKF9yZWY1KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IF9yZWY1LnByb3BlcnR5TmFtZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gJ29wYWNpdHknKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgndWwtYXBwLS12aXNpYmxlJyk7CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94KSB7CiAgICAgICAgcmV0dXJuIF9yZWY0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9KCk7CiAgfSwKCiAgLyoqCiAgICogUmVtb3ZlIHRoZSBhcHAgRE9NIGVsZW1lbnQKICAgKi8KICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShfcmVmNikgewogICAgdmFyIGluaXRpYXRvciA9IF9yZWY2LmluaXRpYXRvcjsKICAgIHJldHVybiBmdW5jdGlvbiAoX3JlZjcpIHsKICAgICAgdmFyIGFwcCA9IF9yZWY3LmFwcDsKICAgICAgdmFyIGZyYW1lID0gYXBwLmZyYW1lLAogICAgICAgICAgZXZlbnRFbWl0dGVyID0gYXBwLmV2ZW50RW1pdHRlcjsKICAgICAgdmFyIGlzTW9iaWxlID0gWydpb3MnLCAnYW5kcm9pZCddLmluY2x1ZGVzKGFwcC5oZWFkZXJzWyd1c2VybGVhcC1wbGF0Zm9ybSddKTsKICAgICAgaWYgKGlzTW9iaWxlKSBldmVudEVtaXR0ZXIuZW1pdChfc2hhcmVkX3VsRXZlbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18udWxFdmVudHMuU1VSVkVZX1dJTExfQ0xPU0UsIHsKICAgICAgICBpbml0aWF0b3I6IGluaXRpYXRvcgogICAgICB9KTsKICAgICAgaWYgKCgwLF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdKShhcHAuaGVhZGVycykpIHJldHVybjsKICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLnVsRXZlbnRzLlNVUlZFWV9XSUxMX0NMT1NFLCB7CiAgICAgICAgaW5pdGlhdG9yOiBpbml0aWF0b3IKICAgICAgfSk7CiAgICAgIGZyYW1lLnJlbW92ZSgpOwogICAgfTsKICB9LAoKICAvKioKICAgKiBDbG9zZXMgdGhlIHN1cnZleSB3aGVuIHVzZXIgWCdzIG91dCBvciBjbGlja3Mgb3ZlcmxheSB0byBkaXNtaXNzCiAgICogc3VibWl0cyBhbiBldmVudCB0byByZWNvcmQgaW4gdGhlIGFwaQogICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBBcHAgaWQgYXR0cmlidXRlCiAgICovCiAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKGlkKSB7CiAgICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgdmFyIF9yZWY4ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMihfLCBhY3Rpb25zKSB7CiAgICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMuZmFkZW91dChpZCk7CgogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDsKICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLmFwcC5jbG9zZSgpOwoKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBfc2hhcmVkX2NvbmZsaWN0aW5nX3dpZGdldHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgYWN0aW9ucy5yZW1vdmUoewogICAgICAgICAgICAgICAgICBpbml0aWF0b3I6IF9zaGFyZWRfdWxFdmVudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5ESVNNSVNTX1JFQVNPTlMuQ0xPU0VECiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUyKTsKICAgICAgfSkpOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDIsIF94MykgewogICAgICAgIHJldHVybiBfcmVmOC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfSgpOwogIH0sCgogIC8qKgogICAqIENsb3NlcyB0aGUgc3VydmV5IGFmdGVyIGNvbXBsZXRpbmcgdGhlIHN1cnZleQogICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBBcHAgaWQgYXR0cmlidXRlCiAgICovCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveShpZCkgewogICAgcmV0dXJuIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgIHZhciBfcmVmOSA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoXywgYWN0aW9ucykgewogICAgICAgIHJldHVybiBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLmZhZGVvdXQoaWQpOwoKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBfc2hhcmVkX2NvbmZsaWN0aW5nX3dpZGdldHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgYWN0aW9ucy5yZW1vdmUoewogICAgICAgICAgICAgICAgICBpbml0aWF0b3I6IF9zaGFyZWRfdWxFdmVudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5ESVNNSVNTX1JFQVNPTlMuQ09NUExFVEUKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZTMpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94NCwgX3g1KSB7CiAgICAgICAgcmV0dXJuIF9yZWY5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9KCk7CiAgfQp9OwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChfb2JqZWN0U3ByZWFkKHsKICBhcHA6IF9tb2R1bGVzX2FwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmFjdGlvbnMsCiAgbXVsdGlwbGVzZWxlY3Q6IF9tb2R1bGVzX211bHRpcGxlc2VsZWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uYWN0aW9ucywKICBvcGVuVGV4dDogX21vZHVsZXNfb3BlblRleHRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5hY3Rpb25zCn0sIGFjdGlvbnMpKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9hcHAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9hcHAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgInN0YXRlIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHN0YXRlOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJhY3Rpb25zIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGFjdGlvbnM7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3R5cGVvZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3R5cGVvZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25mbGljdGluZ193aWRnZXRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3NoYXJlZC9jb25mbGljdGluZ193aWRnZXRzICovICIuL3NyYy9zaGFyZWQvY29uZmxpY3Rpbmdfd2lkZ2V0cy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfTGlrZXJ0Q2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L0xpa2VydENhcmQgKi8gIi4vc3JjL3ZpZXcvTGlrZXJ0Q2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfT3BlblRleHRDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvT3BlblRleHRDYXJkICovICIuL3NyYy92aWV3L09wZW5UZXh0Q2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfVGV4dFVybEJ1dHRvbkNhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZCAqLyAiLi9zcmMvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfTXVsdGlwbGVDaG9pY2VDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvTXVsdGlwbGVDaG9pY2VDYXJkICovICIuL3NyYy92aWV3L011bHRpcGxlQ2hvaWNlQ2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfTXVsdGlwbGVTZWxlY3RDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvTXVsdGlwbGVTZWxlY3RDYXJkICovICIuL3NyYy92aWV3L011bHRpcGxlU2VsZWN0Q2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfVm9pY2VWaWRlb0NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvVm9pY2VWaWRlb0NhcmQgKi8gIi4vc3JjL3ZpZXcvVm9pY2VWaWRlb0NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF92aWV3X05wc0NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvTnBzQ2FyZCAqLyAiLi9zcmMvdmlldy9OcHNDYXJkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19UaGFua3NDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L1RoYW5rc0NhcmQgKi8gIi4vc3JjL3ZpZXcvVGhhbmtzQ2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfdXRpbF9za2lwTG9naWNIZWxwZXJzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L3V0aWwvc2tpcExvZ2ljSGVscGVycyAqLyAiLi9zcmMvdmlldy91dGlsL3NraXBMb2dpY0hlbHBlcnMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfbmV0d29ya19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvc2hhcmVkL25ldHdvcmsgKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrLmpzIik7CgoKCgoKZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CgpmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9CgovKiBnbG9iYWxzIGRvY3VtZW50LCB3aW5kb3cgKi8KCgoKCgoKCgoKCgoKZnVuY3Rpb24gcmVwb3J0RXJyb3IoX3gsIF94MiwgX3gzKSB7CiAgcmV0dXJuIF9yZXBvcnRFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBfcmVwb3J0RXJyb3IoKSB7CiAgX3JlcG9ydEVycm9yID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhzdGF0ZSwgYWN0aW9uLCBlcnIpIHsKICAgIHZhciBtb2RlLCB2aWQsIGVudklkLCBhcGlVUkwsIGhlYWRlcnMsIHBkZSwgbWV0YSwgYm9keSwgcmVzdWx0OwogICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICB3aGlsZSAoMSkgewogICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBtb2RlID0gc3RhdGUubW9kZSwgdmlkID0gc3RhdGUudXNlcklkLCBlbnZJZCA9IHN0YXRlLmVudklkLCBhcGlVUkwgPSBzdGF0ZS5hcGlVUkwsIGhlYWRlcnMgPSBzdGF0ZS5oZWFkZXJzOwogICAgICAgICAgICBwZGUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICBtZXRhID0gewogICAgICAgICAgICAgIG1vZGU6IG1vZGUsCiAgICAgICAgICAgICAgc2NyZWVuV2lkdGg6IHdpbmRvdy5zY3JlZW4ud2lkdGgsCiAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmhlaWdodCwKICAgICAgICAgICAgICBjbGllbnRXaWR0aDogcGRlLmNsaWVudFdpZHRoLAogICAgICAgICAgICAgIGNsaWVudEhlaWdodDogcGRlLmNsaWVudEhlaWdodCwKICAgICAgICAgICAgICBsb2NhdGlvbjogd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICAgICAgICAgICAgbGFuZ3VhZ2U6IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYm9keSA9IHsKICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbiwKICAgICAgICAgICAgICBlcnI6IHsKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLAogICAgICAgICAgICAgICAgc3RhY2s6IGVyci5zdGFjawogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgbWV0YTogbWV0YSwKICAgICAgICAgICAgICB2aWQ6IHZpZCwKICAgICAgICAgICAgICBlbnZJZDogZW52SWQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA2OwogICAgICAgICAgICByZXR1cm4gKDAsX3NoYXJlZF9uZXR3b3JrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fLnVsRmV0Y2gpKCIiLmNvbmNhdChhcGlVUkwsICIvc2RrLzEvZXJyb3JzIiksIHsKICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHsKICAgICAgICAgICAgICAgICd4LXVsLWVycm9yJzogd2luZG93LmJ0b2EoInVzZXJsZWFwLSIuY29uY2F0KERhdGUubm93KCksICItZXJyb3IiKSkKICAgICAgICAgICAgICB9LCBoZWFkZXJzKSwKICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KQogICAgICAgICAgICB9KTsKCiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHJlc3VsdCA9IF9jb250ZXh0My5zZW50OwoKICAgICAgICAgICAgaWYgKCFyZXN1bHQub2spIHsKICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIltVc2VyTGVhcF0gKEVSUi00NDQpIEZhaWxlZCB0byByZXBvcnQgZXJyb3IgdG8gQVBJIiwgZXJyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgX2NhbGxlZTMpOwogIH0pKTsKICByZXR1cm4gX3JlcG9ydEVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn0KCnZhciBza2lwV3JpdGVGb3JBY3Rpb24gPSBmdW5jdGlvbiBza2lwV3JpdGVGb3JBY3Rpb24oc3RhdGUpIHsKICByZXR1cm4gc3RhdGUudXNlcklkID09PSAwIHx8IHN0YXRlLm1ldGEgJiYgc3RhdGUubWV0YS5tb2RlID09PSAndGVzdCcgfHwgc3RhdGUuaXNQcmV2aWV3Owp9OwovKioKICogQXBwIGluaXRpYWwgc3RhdGUKICovCgoKdmFyIHN0YXRlID0gewogIC8qKgogICAqIEBwcm9wIHtTdHJpbmd9IHN1cnZleUlkIFRoaXMgaWQgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB3aGljaCBzdXJ2ZXkgaXMgYmVpbmcgdXNlZAogICAqLwogIHN1cnZleUlkOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7Qm9vbGVhbn0gcnVubmluZyBJZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZywgaWYgYGZhbHNlYCB0aGUKICAgKiAgIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCBhbmQgZGVzdHJveSBpdHNlbGYKICAgKi8KICBydW5uaW5nOiBmYWxzZSwKCiAgLyoqCiAgICogQHByb3Age0RPTUVsZW1lbnR9IGZyYW1lIFJlZmVyZW5jZSB0byB0aGUgaG9zdCBmcmFtZQogICAqLwogIGZyYW1lOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSBlbnZJZCBFbnZpcm9ubWVudCBJZAogICAqLwogIGVudklkOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSB1c2VySWQgVHJhY2tlZCB1c2VyIGlkCiAgICovCiAgdXNlcklkOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7T2JqZWN0fSBtZXRhIFVzZXIgbWV0YSBpbmZvcm1hdGlvbgogICAqLwogIG1ldGE6IHt9LAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSBib3JkZXIgV2lkZ2V0IGJvcmRlciBjb2xvcgogICAqLwogIGJvcmRlcjogbnVsbCwKCiAgLyoqCiAgICogQHByb3Age1N0cmluZ30gZm9udEZhbWlseSBDU1MgY2xhc3MgbmFtZSB0byBhZGQgdG8gdWwtYXBwCiAgICovCiAgZm9udEZhbWlseTogbnVsbCwKCiAgLyoqCiAgICogQHByb3Age1N0cmluZ30gZm9udEZhbWlseVVSTCBVUkwgdG8gZGVmaW5lZCBmb250IGZhbWlseSBpZiBub3Qgc3lzdGVtIGZvbnQKICAgKi8KICBmb250RmFtaWx5VVJMOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7TnVtYmVyfSB0aW1lb3V0IENvdW50ZG93biB0aW1lcgogICAqLwogIHRpbWVvdXQ6IG51bGwsCgogIC8qKgogICAqIEBwcm9wIHtOdW1iZXJ9IGludGVydmFsIENvdW50ZG93biBpbnRlcnZhbCBpZAogICAqLwogIGludGVydmFsOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSBtb2RlIFdpZGdldCBtb2RlLCB1c2VkIHdoZW4gc3dpdGNoaW5nIHRvICd0ZXN0JwogICAqLwogIG1vZGU6IG51bGwsCgogIC8qKgogICAqIEBwcm9wIHtPYmplY3R9IGRlY2sgQ3VycmVudGx5IHNlbGVjdGVkIGRlY2sgdG8gZGlzcGxheQogICAqIEBwcm9wIHtOdW1iZXJ9IGRlY2suaW5kZXggQ3VycmVudCBjYXJkIGluZGV4CiAgICogQHByb3Age0FycmF5fSBkZWNrLmNhcmRzIENhcmRzIHRvIGRpc3BsYXkKICAgKi8KICBkZWNrOiB7CiAgICBpbmRleDogMCwKICAgIGNhcmRzOiBbXQogIH0sCiAgY29udGV4dDoge30sCiAgc2VuZGluZzogZmFsc2UsCgogIC8qKgogICAqIEBwcm9wIHtPYmplY3R9IGNhcmRzIEF2YWlsYWJsZSBjYXJkcyB0byB1c2UKICAgKi8KICBjYXJkczogewogICAgb3BlbjogX3ZpZXdfT3BlblRleHRDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19bImRlZmF1bHQiXSwKICAgIHRleHR1cmxwcm9tcHQ6IF92aWV3X1RleHRVcmxCdXR0b25DYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19bImRlZmF1bHQiXSwKICAgIG11bHRpcGxlY2hvaWNlOiBfdmlld19NdWx0aXBsZUNob2ljZUNhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdLAogICAgbXVsdGlwbGVzZWxlY3Q6IF92aWV3X011bHRpcGxlU2VsZWN0Q2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fWyJkZWZhdWx0Il0sCiAgICBsaWtlcnQ6IF92aWV3X0xpa2VydENhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfX1siZGVmYXVsdCJdLAogICAgdGhhbmtzOiBfdmlld19UaGFua3NDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fWyJkZWZhdWx0Il0sCiAgICBucHM6IF92aWV3X05wc0NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX19bImRlZmF1bHQiXSwKICAgIHZpZGVvdm9pY2U6IF92aWV3X1ZvaWNlVmlkZW9DYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fWyJkZWZhdWx0Il0KICB9LAogIGxvY2FsZTogJ2VuJywKICBhcGlVUkw6ICdodHRwczovL2FwaS51c2VybGVhcC5jb20nLAogIHNob3dTdXJ2ZXlCcmFuZDogdHJ1ZSwKICBtYXJrZXRpbmdVcmw6ICdodHRwczovL3VzZXJsZWFwLmNvbScsCiAgc2x1Z05hbWU6IG51bGwsCiAgcmVzcG9uc2VHcm91cFVpZDogbnVsbCwKICBoZWFkZXJzOiB7fSwKCiAgLyoqCiAgICogQHByb3Age0Jvb2xlYW59IGlzUHJldmlldyBzZXQgdG8gYHRydWVgIGZvciBwcmV2aWV3IG1vZGU6IHJlc3BvbnNlcyBhcmUgbm90IHdyaXR0ZW4KICAgKiBhbmQgc3VydmV5IHJlc2V0cyB1cG9uIGNvbXBsZXRpb24gaW4gdGhpcyBjYXNlCiAgICovCiAgaXNQcmV2aWV3OiBmYWxzZSwKCiAgLyoqCiAgICogQHByb3Age0FycmF5fSBhbnN3ZXJzIGEgbGlzdCBvZiB7IHF1ZXN0aW9uSWQsIHZhbHVlIH0gdmFsdWVzLgogICAqIElmIGEgdmFsaWQgcmVzcG9uc2UgdmFsdWUgaXMgc3VwcGxpZWQgZm9yIGEgcXVlc3Rpb25JZCwgdGhhdCBxdWVzdGlvbiB3aWxsIGJlIHNraXBwZWQsIGFuZCBhbnN3ZXIgc2F2ZWQuCiAgICogRm9yIG5vdywgb25seSBhIHJlc3BvbnNlIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiBpcyBzdXBwb3J0ZWQuCiAgICovCiAgYW5zd2VyczogW10sCgogIC8qKgogICAqIEBwcm9wIHtPYmplY3R9IGN1c3RvbU1ldGFkYXRhIGFuIG9iamVjdCB3aXRoIGF0IG1vc3QgMjUga2V5cywgd2l0aCB0aGUgY29tYmluZWQgbGVuZ3RoIGtleXMgYW5kIHZhbHVlcyBhdCBtb3N0IDEwMDAgY2hhcmFjdGVycywKICAgKiB1c2VkIHRvIHN0b3JlIGFyYml0cmFyeSBtZXRhZGF0YSByZWxhdGVkIHRvIHRoaXMgcmVzcG9uc2UsCiAgICogZm9yIGV4YW1wbGUsIHRvIGFzc29jaWF0ZSBpdCB3aXRoIGFuIEEvQiB0ZXN0IC8gZmFjaWxhdGUgZG93bnN0cmVhbSBhbmFseXNpcy4KICAgKi8KICBjdXN0b21NZXRhZGF0YToge30sCgogIC8qKgogICAqIEBwcm9wIHtudW1iZXJ9IHZpZXdlZENhcmRDb3VudCBjb3VudCBvZiB2aWV3ZWQgY2FyZHMsIHVzZWQgZm9yIHByb2dyZXNzIGluZGljYXRvcgogICAqLwogIHZpZXdlZENhcmRDb3VudDogMAp9OwovKioKICogQXBwIGFjdGlvbnMKICovCgp2YXIgYWN0aW9ucyA9IHsKICAvKioKICAgKiBJbml0aWFsaXplIHN0YXRlCiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKICAgKiBAcGFyYW0ge1N0cmluZ30gcGF5bG9hZC5yZXNwb25zZUdyb3VwSWQKICAgKiBAcGFyYW0ge1N0cmluZ30gcGF5bG9hZC5mcmFtZQogICAqIEBwYXJhbSB7U3RyaW5nfSBwYXlsb2FkLmVudklkCiAgICogQHBhcmFtIHtTdHJpbmd9IHBheWxvYWQudXNlcklkCiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWQubWV0YQogICAqIEBwYXJhbSB7U3RyaW5nfSBwYXlsb2FkLm1vZGUKICAgKi8KICBpbml0OiBmdW5jdGlvbiBpbml0KF9yZWYpIHsKICAgIHZhciBzdXJ2ZXlJZCA9IF9yZWYuc3VydmV5SWQsCiAgICAgICAgZnJhbWUgPSBfcmVmLmZyYW1lLAogICAgICAgIGNhcmRzID0gX3JlZi5jYXJkcywKICAgICAgICBlbnZJZCA9IF9yZWYuZW52SWQsCiAgICAgICAgdXNlcklkID0gX3JlZi51c2VySWQsCiAgICAgICAgbWV0YSA9IF9yZWYubWV0YSwKICAgICAgICBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgICBmb250RmFtaWx5ID0gX3JlZi5mb250RmFtaWx5LAogICAgICAgIGZvbnRGYW1pbHlVUkwgPSBfcmVmLmZvbnRGYW1pbHlVUkwsCiAgICAgICAgbW9kZSA9IF9yZWYubW9kZSwKICAgICAgICBjb250ZXh0ID0gX3JlZi5jb250ZXh0LAogICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLAogICAgICAgIGFwaVVSTCA9IF9yZWYuYXBpVVJMLAogICAgICAgIHNob3dTdXJ2ZXlCcmFuZCA9IF9yZWYuc2hvd1N1cnZleUJyYW5kLAogICAgICAgIG1hcmtldGluZ1VybCA9IF9yZWYubWFya2V0aW5nVXJsLAogICAgICAgIHNsdWdOYW1lID0gX3JlZi5zbHVnTmFtZSwKICAgICAgICByZXNwb25zZUdyb3VwVWlkID0gX3JlZi5yZXNwb25zZUdyb3VwVWlkLAogICAgICAgIGhlYWRlcnMgPSBfcmVmLmhlYWRlcnMsCiAgICAgICAgZW5kQ2FyZCA9IF9yZWYuZW5kQ2FyZCwKICAgICAgICBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2sgPSBfcmVmLmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljaywKICAgICAgICBpc1ByZXZpZXcgPSBfcmVmLmlzUHJldmlldywKICAgICAgICBhbnN3ZXJzID0gX3JlZi5hbnN3ZXJzLAogICAgICAgIGN1c3RvbU1ldGFkYXRhID0gX3JlZi5jdXN0b21NZXRhZGF0YSwKICAgICAgICBleHBlcmltZW50RmxhZ3MgPSBfcmVmLmV4cGVyaW1lbnRGbGFncywKICAgICAgICB1c2VNb2JpbGVTdHlsaW5nID0gX3JlZi51c2VNb2JpbGVTdHlsaW5nLAogICAgICAgIGV2ZW50RW1pdHRlciA9IF9yZWYuZXZlbnRFbWl0dGVyOwogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBhY3Rpb24uYWRkRGVjayh7CiAgICAgICAgZGVjazogY2FyZHMsCiAgICAgICAgaGFzRW5kQ2FyZDogZW5kQ2FyZAogICAgICB9KSwgewogICAgICAgIHN1cnZleUlkOiBzdXJ2ZXlJZCwKICAgICAgICBydW5uaW5nOiB0cnVlLAogICAgICAgIGZyYW1lOiBmcmFtZSwKICAgICAgICBlbnZJZDogZW52SWQsCiAgICAgICAgdXNlcklkOiB1c2VySWQsCiAgICAgICAgbWV0YTogbWV0YSwKICAgICAgICBib3JkZXI6IGJvcmRlciwKICAgICAgICBmb250RmFtaWx5OiBmb250RmFtaWx5LAogICAgICAgIGZvbnRGYW1pbHlVUkw6IGZvbnRGYW1pbHlVUkwsCiAgICAgICAgdGltZW91dDogMSwKICAgICAgICBtb2RlOiBtb2RlLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgbG9jYWxlOiBsb2NhbGUsCiAgICAgICAgYXBpVVJMOiBhcGlVUkwsCiAgICAgICAgc2hvd1N1cnZleUJyYW5kOiBzaG93U3VydmV5QnJhbmQsCiAgICAgICAgbWFya2V0aW5nVXJsOiBtYXJrZXRpbmdVcmwsCiAgICAgICAgc2x1Z05hbWU6IHNsdWdOYW1lLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgaGVhZGVyczogaGVhZGVycywKICAgICAgICBlbmRDYXJkOiBlbmRDYXJkLAogICAgICAgIGNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljazogY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrLAogICAgICAgIGlzUHJldmlldzogaXNQcmV2aWV3LAogICAgICAgIGFuc3dlcnM6IGFuc3dlcnMsCiAgICAgICAgY3VzdG9tTWV0YWRhdGE6IGN1c3RvbU1ldGFkYXRhLAogICAgICAgIGV4cGVyaW1lbnRGbGFnczogZXhwZXJpbWVudEZsYWdzLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmc6IHVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgZXZlbnRFbWl0dGVyOiBldmVudEVtaXR0ZXIsCiAgICAgICAgdmlld2VkQ2FyZENvdW50OiAwCiAgICAgIH0pOwogICAgfTsKICB9LAoKICAvKioKICAgKiBBZGQgZGVjayB0byB1c2UKICAgKiBAcGFyYW0ge0FycmF5fSBkZWNrIERlY2sgb2YgY2FyZHMKICAgKiBAcmV0dXJuIHtPYmplY3R9IERlY2sgc3RhdGUKICAgKi8KICBhZGREZWNrOiBmdW5jdGlvbiBhZGREZWNrKF9yZWYyKSB7CiAgICB2YXIgZGVjayA9IF9yZWYyLmRlY2ssCiAgICAgICAgaGFzRW5kQ2FyZCA9IF9yZWYyLmhhc0VuZENhcmQ7CiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIHZhciBjYXJkcyA9IGRlY2subWFwKGZ1bmN0aW9uIChjYXJkKSB7CiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGNhcmQsIHsKICAgICAgICAgIENhcmQ6IHN0YXRlLmNhcmRzW2NhcmQudHlwZV0KICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBpZiAoaGFzRW5kQ2FyZCkgewogICAgICAgIGNhcmRzLnB1c2goewogICAgICAgICAgQ2FyZDogc3RhdGUuY2FyZHMudGhhbmtzCiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZGVjazogewogICAgICAgICAgaW5kZXg6IDAsCiAgICAgICAgICBjYXJkczogY2FyZHMKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogIH0sCgogIC8qKgogICAqIFN0YXJ0IHRoZSBjbG9zaW5nIGNvdW50ZG93bgogICAqIEByZXR1cm4ge09iamVjdH0gSW50ZXJ2YWwgY291bnRkb3duIGlkCiAgICovCiAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW50ZXJ2YWw6IHNldEludGVydmFsKGFjdGlvbi5kZWR1Y3QsIDEwMDApCiAgICAgIH07CiAgICB9OwogIH0sCgogIC8qKgogICAqIFNhdmVzIGEgJ3NlZW4nIGV2ZW50IHNvIHRoZSBBUEkgY2FuIHRyYWNrIHdoYXQgd2FzIHNlZW4KICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBvbiBhIHN1Y2Nlc3NmdWwgUFVUCiAgICovCiAgc2VlbjogZnVuY3Rpb24gc2VlbigpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikgewogICAgICBpZiAoc2tpcFdyaXRlRm9yQWN0aW9uKHN0YXRlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgYWN0aW9uLnRyYWNrSGlzdG9yeSh7CiAgICAgICAgZXZlbnQ6ICdzZWVuJywKICAgICAgICBpc05ldzogdHJ1ZQogICAgICB9KTsKICAgIH07CiAgfSwKCiAgLyoqCiAgICogU2F2ZXMgYSAnY2xvc2UnIGV2ZW50IHNvIHRoZSBBUEkgY2FuIHRyYWNrIHdoYXQgd2FzIHNlZW4KICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBvbiBhIHN1Y2Nlc3NmdWwgUFVUCiAgICovCiAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIGlmIChza2lwV3JpdGVGb3JBY3Rpb24oc3RhdGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICByZXR1cm4gYWN0aW9uLnRyYWNrSGlzdG9yeSh7CiAgICAgICAgZXZlbnQ6ICdjbG9zZWQnCiAgICAgIH0pOwogICAgfTsKICB9LAoKICAvKioKICAgKiBTdWJtaXQgcGF5bG9hZCByZXNwb25zZQogICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBTdWJtaXNzaW9uCiAgICogQHBhcmFtIHtJbnRlZ2VyfSByZXNwb25zZS5xdWVzdGlvbklkIHRoZSBxdWVzdGlvbklkIGZvciB0aGUgc3VydmV5IHF1ZXN0aW9uCiAgICogQHBhcmFtIHtJbnRlZ2VyfFN0cmluZ3xPYmplY3R9IHJlc3BvbnNlLnZhbHVlIHRoZSBjb2xsZWN0ZWQgcmVzcG9uc2UgZm9yIHRoZSBzdXJ2ZXkgcXVlc3Rpb24KICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBvbiBhIHN1Y2Nlc3NmdWwgc3VibWl0CiAgICovCiAgc3VibWl0OiBmdW5jdGlvbiBzdWJtaXQoX3JlZjMpIHsKICAgIHZhciByZXNwb25zZSA9IF9yZWYzLnJlc3BvbnNlLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQgPSBfcmVmMy5yZXNwb25zZUdyb3VwVWlkLAogICAgICAgIGNvbXBsZXRlZEF0ID0gX3JlZjMuY29tcGxldGVkQXQ7CiAgICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgdmFyIF9yZWY0ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKHN0YXRlKSB7CiAgICAgICAgdmFyIHBheWxvYWQsIHJlc3VsdDsKICAgICAgICByZXR1cm4gX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmICghKCFyZXNwb25zZUdyb3VwVWlkIHx8IHNraXBXcml0ZUZvckFjdGlvbihzdGF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKCiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcGF5bG9hZCA9IHsKICAgICAgICAgICAgICAgICAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICAgICAgICAgICAgICAgICAgbWV0YTogc3RhdGUubWV0YSwKICAgICAgICAgICAgICAgICAgY3VzdG9tTWV0YWRhdGE6IHN0YXRlLmN1c3RvbU1ldGFkYXRhLAogICAgICAgICAgICAgICAgICByZXNwb25zZXM6IFtyZXNwb25zZV0sCiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBjb21wbGV0ZWRBdAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1OwogICAgICAgICAgICAgICAgcmV0dXJuICgwLF9zaGFyZWRfbmV0d29ya19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXy51bEZldGNoKSgiIi5jb25jYXQoc3RhdGUuYXBpVVJMLCAiL3Nkay8xL2Vudmlyb25tZW50cy8iKS5jb25jYXQoc3RhdGUuZW52SWQsICIvdmlzaXRvcnMvIikuY29uY2F0KHN0YXRlLnVzZXJJZCwgIi9yZXNwb25zZXMvc3VibWl0IiksIHsKICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksCiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHN0YXRlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpOwoKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQub2spIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5yZXBvcnRFcnJvcikgewogICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiW1VzZXJMZWFwXSAoRVJSLTQyNykgRmFpbGVkIHRvIHN1Ym1pdCByZXNwb25zZSIsIHJlc3VsdC5lcnJvcik7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0RXJyb3Ioc3RhdGUsICdzdWJtaXRSZXNwb25zZScsIHJlc3VsdC5lcnJvcik7CgogICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKCiAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94NCkgewogICAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfSgpOwogIH0sCgogIC8qKgogICAqIERlZHVjdCBmcm9tIHRoZSB0aW1lb3V0CiAgICogQHJldHVybiB7T2JqZWN0fSBEZWR1Y3RlZCB0aW1lb3V0IHN0YXRlCiAgICovCiAgZGVkdWN0OiBmdW5jdGlvbiBkZWR1Y3QoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIHZhciB0aW1lb3V0ID0gc3RhdGUudGltZW91dCAtIDE7CgogICAgICBpZiAodGltZW91dCA8PSAwKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChzdGF0ZS5pbnRlcnZhbCk7CiAgICAgICAgX3NoYXJlZF9jb25mbGljdGluZ193aWRnZXRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bImRlZmF1bHQiXS5lbmFibGUoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcnVubmluZzogZmFsc2UsCiAgICAgICAgICBpbnRlcnZhbDogbnVsbCwKICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQKICAgICAgfTsKICAgIH07CiAgfSwKCiAgLyoqCiAgICogQ29udGludWUgb24gdG8gdGhlIG5leHQgY2FyZCBpbiB0aGUgZGVjawogICAqIEByZXR1cm4ge09iamVjdH0gSW5jcmVtZW50IGRlY2sKICAgKi8KICBuZXh0OiBmdW5jdGlvbiBuZXh0KHBhcmFtcykgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIC8vIFN0b3JlIHRoZSB2YWx1ZSBpbnRvIHRoZSBjYXJkcwogICAgICB2YXIgYW5zd2VyZWRBdCA9IERhdGUubm93KCk7CiAgICAgIHZhciBfc3RhdGUkZGVjayA9IHN0YXRlLmRlY2ssCiAgICAgICAgICBjYXJkcyA9IF9zdGF0ZSRkZWNrLmNhcmRzLAogICAgICAgICAgaW5kZXggPSBfc3RhdGUkZGVjay5pbmRleDsKICAgICAgdmFyIF9jYXJkcyRpbmRleCA9IGNhcmRzW2luZGV4XSwKICAgICAgICAgIHF1ZXN0aW9uSWQgPSBfY2FyZHMkaW5kZXgubmFtZSwKICAgICAgICAgIHR5cGUgPSBfY2FyZHMkaW5kZXgudHlwZTsKICAgICAgdmFyIHJlc3BvbnNlR3JvdXBVaWQgPSBzdGF0ZS5yZXNwb25zZUdyb3VwVWlkOwogICAgICB2YXIgcmVzcG9uc2UgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3R5cGVvZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKShwYXJhbXMuZGF0YSkgPT09ICdvYmplY3QnID8gcGFyYW1zLmRhdGEgOiB7CiAgICAgICAgdmFsdWU6IHBhcmFtcy5kYXRhCiAgICAgIH07CiAgICAgIHZhciB2YWx1ZSA9IHJlc3BvbnNlLnZhbHVlOwogICAgICBjYXJkc1tpbmRleF0udmFsdWUgPSB2YWx1ZTsKICAgICAgcmVzcG9uc2UucXVlc3Rpb25JZCA9IHF1ZXN0aW9uSWQ7CiAgICAgIHJlc3BvbnNlLmFuc3dlcmVkQXQgPSBhbnN3ZXJlZEF0OwogICAgICB2YXIgc3VibWlzc2lvbiA9IHsKICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsCiAgICAgICAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICAgICAgICB0eXBlOiB0eXBlCiAgICAgIH07CiAgICAgIHZhciByb3V0aW5nVmFsdWUgPSB0eXBlID09PSAnbXVsdGlwbGVjaG9pY2UnID8gT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZmluZChmdW5jdGlvbiAodikgewogICAgICAgIHJldHVybiB2ICE9PSBmYWxzZTsKICAgICAgfSkgOiB2YWx1ZTsgLy8gTXVsdGlDaG9pY2UgTXVsdGkgU2VsZWN0LCBzaG91bGQgdGVzdCByb3V0ZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgb3B0aW9ucwoKICAgICAgdmFyIGhhc1ZhbGlkQW5zd2VyID0gdHlwZSA9PT0gJ3ZpZGVvdm9pY2UnICYmIHJlc3BvbnNlLmRlbGV0ZWRBdCA/IGZhbHNlIDogdHJ1ZTsKCiAgICAgIGlmICh0eXBlID09PSAnbXVsdGlwbGVzZWxlY3QnKSB7CiAgICAgICAgcm91dGluZ1ZhbHVlID0gY2FyZHNbaW5kZXhdLnByb3BzLm9wdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChhY2N1bXVsYXRvciwgb3B0aW9uKSB7CiAgICAgICAgICBpZiAodmFsdWVbb3B0aW9uLmlkXSkgewogICAgICAgICAgICBhY2N1bXVsYXRvci5wdXNoKG9wdGlvbi52YWx1ZSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICAgIH0sIFtdKTsKICAgICAgfQoKICAgICAgdmFyIHJvdXRpbmdUYXJnZXQgPSAoMCxfdmlld191dGlsX3NraXBMb2dpY0hlbHBlcnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX18uZ2V0TmV4dENhcmRJbmRleCkoY2FyZHMsIGluZGV4LCByb3V0aW5nVmFsdWUsICEhcGFyYW1zLmVuZENhcmQsIGhhc1ZhbGlkQW5zd2VyKTsKCiAgICAgIGlmIChyb3V0aW5nVGFyZ2V0ID09PSBudWxsKSB7CiAgICAgICAgLy8gbm8gbW9yZSBuZXh0IGluZGV4LCBzdXJ2ZXkgY29tcGxldGVkCiAgICAgICAgc3VibWlzc2lvbi5jb21wbGV0ZWRBdCA9IGFuc3dlcmVkQXQ7CiAgICAgICAgYWN0aW9uLnN1Ym1pdChzdWJtaXNzaW9uKTsKICAgICAgICBwYXJhbXMuY29tcGxldGVTdXJ2ZXkoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoY2FyZHNbcm91dGluZ1RhcmdldF0uQ2FyZCA9PT0gc3RhdGUuY2FyZHMudGhhbmtzKSB7CiAgICAgICAgc3VibWlzc2lvbi5jb21wbGV0ZWRBdCA9IGFuc3dlcmVkQXQ7CiAgICAgIH0KCiAgICAgIHZhciBwID0gYWN0aW9uLnN1Ym1pdChzdWJtaXNzaW9uKTsKCiAgICAgIGlmIChjYXJkc1tyb3V0aW5nVGFyZ2V0XS5DYXJkICE9IHN0YXRlLmNhcmRzLnRoYW5rcykgewogICAgICAgIHAuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICBhY3Rpb24udHJhY2tIaXN0b3J5KHsKICAgICAgICAgICAgZXZlbnQ6ICdzZWVuJywKICAgICAgICAgICAgaW5kZXg6IHJvdXRpbmdUYXJnZXQKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIHZpZXdlZENhcmRDb3VudDogc3RhdGUudmlld2VkQ2FyZENvdW50ICsgMSwKICAgICAgICBkZWNrOiB7CiAgICAgICAgICBjYXJkczogY2FyZHMsCiAgICAgICAgICBpbmRleDogcm91dGluZ1RhcmdldAogICAgICAgIH0KICAgICAgfTsKICAgIH07CiAgfSwKICB0cmFja0hpc3Rvcnk6IGZ1bmN0aW9uIHRyYWNrSGlzdG9yeShfcmVmNSkgewogICAgdmFyIGV2ZW50ID0gX3JlZjUuZXZlbnQsCiAgICAgICAgaWR4ID0gX3JlZjUuaW5kZXgsCiAgICAgICAgX3JlZjUkaXNOZXcgPSBfcmVmNS5pc05ldywKICAgICAgICBpc05ldyA9IF9yZWY1JGlzTmV3ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWY1JGlzTmV3OwogICAgcmV0dXJuIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgIHZhciBfcmVmNiA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoc3RhdGUpIHsKICAgICAgICB2YXIgX3N0YXRlJGRlY2syLCBjYXJkcywgaW5kZXgsIGNhcmQsIGhpc3QsIHJlc3VsdDsKCiAgICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgaWYgKCFza2lwV3JpdGVGb3JBY3Rpb24oc3RhdGUpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIpOwoKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBfc3RhdGUkZGVjazIgPSBzdGF0ZS5kZWNrLCBjYXJkcyA9IF9zdGF0ZSRkZWNrMi5jYXJkcywgaW5kZXggPSBfc3RhdGUkZGVjazIuaW5kZXg7CiAgICAgICAgICAgICAgICBjYXJkID0gaWR4ICE9PSB1bmRlZmluZWQgPyBjYXJkc1tpZHhdIDogY2FyZHNbaW5kZXhdOwogICAgICAgICAgICAgICAgaGlzdCA9IHsKICAgICAgICAgICAgICAgICAgc2lkOiBzdGF0ZS5zdXJ2ZXlJZCwKICAgICAgICAgICAgICAgICAgcWlkOiBjYXJkLm5hbWUsCiAgICAgICAgICAgICAgICAgIGFjdGlvbjogZXZlbnQsCiAgICAgICAgICAgICAgICAgIHZpZDogc3RhdGUudXNlcklkLAogICAgICAgICAgICAgICAgICBlaWQ6IHN0YXRlLmVudklkLAogICAgICAgICAgICAgICAgICBpc05ldzogaXNOZXcsCiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHN0YXRlLnJlc3BvbnNlR3JvdXBVaWQKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDc7CiAgICAgICAgICAgICAgICByZXR1cm4gKDAsX3NoYXJlZF9uZXR3b3JrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fLnVsRmV0Y2gpKCIiLmNvbmNhdChzdGF0ZS5hcGlVUkwsICIvc2RrLzEvdmlzaXRvcnMvIikuY29uY2F0KHN0YXRlLnVzZXJJZCwgIi9zdXJ2ZXlzLyIpLmNvbmNhdChzdGF0ZS5zdXJ2ZXlJZCwgIi9oaXN0b3J5IiksIHsKICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoaGlzdCksCiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHN0YXRlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQyLnNlbnQ7CgogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5vaykgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5yZXBvcnRFcnJvcikgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIltVc2VyTGVhcF0gKEVSUi00MjgpIEZhaWxlZCB0byB0cmFjayBzdXJ2ZXkgZXZlbnQiLCByZXN1bHQuZXJyb3IpOwogICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMzsKICAgICAgICAgICAgICAgIHJldHVybiByZXBvcnRFcnJvcihzdGF0ZSwgJ3RyYWNrSGlzdG9yeScsIHJlc3VsdC5lcnJvcik7CgogICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94NSkgewogICAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfSgpOwogIH0KfTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9tdWx0aXBsZXNlbGVjdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvbXVsdGlwbGVzZWxlY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAic3RhdGUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gc3RhdGU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImFjdGlvbnMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gYWN0aW9uczsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwoKCmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQoKZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfQoKLyoqCiAqIE11bHRpcGxlIFNlbGVjdCBpbml0aWFsIHN0YXRlCiAqLwp2YXIgc3RhdGUgPSB7CiAgc2VsZWN0ZWRPcHRpb25zOiB7fQp9OwovKioKICogTXVsdGlwbGUgU2VsZWN0IGFjdGlvbnMKICovCgp2YXIgYWN0aW9ucyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0KG9wdGlvbnMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7CiAgICAgICAgc2VsZWN0ZWRPcHRpb25zOiBvcHRpb25zCiAgICAgIH0pOwogICAgfTsKICB9LAogIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7CiAgICAgICAgc2VsZWN0ZWRPcHRpb25zOiB7fQogICAgICB9KTsKICAgIH07CiAgfSwKICB1cGRhdGVTZWxlY3RlZDogZnVuY3Rpb24gdXBkYXRlU2VsZWN0ZWQoaWQpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgaWYgKGlkID09IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBzZWxlY3RlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHN0YXRlLnNlbGVjdGVkT3B0aW9ucyk7CiAgICAgIHNlbGVjdGVkT3B0aW9uc1tpZF0gPSAhc2VsZWN0ZWRPcHRpb25zW2lkXTsKICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7CiAgICAgICAgc2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZE9wdGlvbnMKICAgICAgfSk7CiAgICB9OwogIH0KfTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9vcGVuVGV4dC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvb3BlblRleHQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAic3RhdGUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gc3RhdGU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImFjdGlvbnMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gYWN0aW9uczsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwoKCmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQoKZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfQoKLyoqCiAqIFRleHQgaW5pdGlhbCBzdGF0ZQogKi8KdmFyIHN0YXRlID0gewogIHZhbHVlOiAnJwp9OwovKioKICogVGV4dCBhY3Rpb25zCiAqLwoKdmFyIGFjdGlvbnMgPSB7CiAgb25UZXh0Q2hhbmdlOiBmdW5jdGlvbiBvblRleHRDaGFuZ2UodGV4dCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSkgewogICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHsKICAgICAgICB2YWx1ZTogdGV4dAogICAgICB9KTsKICAgIH07CiAgfQp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9zdG9yZS9zdGF0ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9zdG9yZS9zdGF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tb2R1bGVzX2FwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2R1bGVzL2FwcCAqLyAiLi9zcmMvdmlldy9zdG9yZS9tb2R1bGVzL2FwcC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZHVsZXNfbXVsdGlwbGVzZWxlY3RfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vbW9kdWxlcy9tdWx0aXBsZXNlbGVjdCAqLyAiLi9zcmMvdmlldy9zdG9yZS9tb2R1bGVzL211bHRpcGxlc2VsZWN0LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfbW9kdWxlc19vcGVuVGV4dF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2R1bGVzL29wZW5UZXh0ICovICIuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvb3BlblRleHQuanMiKTsKCgoKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il0gPSAoewogIGFwcDogX21vZHVsZXNfYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3RhdGUsCiAgbXVsdGlwbGVzZWxlY3Q6IF9tb2R1bGVzX211bHRpcGxlc2VsZWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uc3RhdGUsCiAgb3BlblRleHQ6IF9tb2R1bGVzX29wZW5UZXh0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uc3RhdGUKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L3V0aWwvZ2V0VXNlck1ldGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy91dGlsL2dldFVzZXJNZXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0VXNlck1ldGE7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGdsb2JhbHMgd2luZG93ICovCgovKioKICogR2V0IGJhc2ljIHVzZXIgbWV0YSBpbmZvcm1hdGlvbgogKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMgPSB7fV0KICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1ldGEgPSBudWxsXQogKiBAcmV0dXJuIHtPYmplY3R9IFVzZXIgbWV0YSBpbmZvcm1hdGlvbgogKi8KZnVuY3Rpb24gZ2V0VXNlck1ldGEoX3JlZikgewogIHZhciBkaXJlY3RFbWJlZCA9IF9yZWYuZGlyZWN0RW1iZWQsCiAgICAgIF9yZWYkbW9kZSA9IF9yZWYubW9kZSwKICAgICAgbW9kZSA9IF9yZWYkbW9kZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkbW9kZTsKICB2YXIgbWF5YmVQYXJlbnRXaW5kb3cgPSBkaXJlY3RFbWJlZCA/IHdpbmRvdyA6IHdpbmRvdy5wYXJlbnQ7CiAgdmFyIHBkZSA9IG1heWJlUGFyZW50V2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICByZXR1cm4gewogICAgbW9kZTogbW9kZSwKICAgIHN3OiBtYXliZVBhcmVudFdpbmRvdy5zY3JlZW4ud2lkdGgsCiAgICBzaDogbWF5YmVQYXJlbnRXaW5kb3cuc2NyZWVuLmhlaWdodCwKICAgIGN3OiBwZGUuY2xpZW50V2lkdGgsCiAgICBjaDogcGRlLmNsaWVudEhlaWdodCwKICAgIHA6IG1heWJlUGFyZW50V2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICBsOiBtYXliZVBhcmVudFdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UKICB9Owp9CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L3V0aWwvc2tpcExvZ2ljSGVscGVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvdXRpbC9za2lwTG9naWNIZWxwZXJzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAiZ2V0TmV4dENhcmRJbmRleCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBnZXROZXh0Q2FyZEluZGV4OyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJnZXRNYXhSZW1haW5pbmdDYXJkcyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBnZXRNYXhSZW1haW5pbmdDYXJkczsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZiAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190eXBlb2ZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18pOwoKCgp2YXIgQU5TV0VSRUQgPSAxOwp2YXIgY29tcGFyYXRvcnMgPSB7CiAgZXE6IGZ1bmN0aW9uIGVxKGEsIGIpIHsKICAgIHJldHVybiBhID09IGI7CiAgfSwKICBuZXE6IGZ1bmN0aW9uIG5lcShhLCBiKSB7CiAgICByZXR1cm4gIXRoaXMuZXEoYSwgYik7CiAgfSwKICBndDogZnVuY3Rpb24gZ3QoYSwgYikgewogICAgcmV0dXJuIGEgPiBiOwogIH0sCiAgZ3RlOiBmdW5jdGlvbiBndGUoYSwgYikgewogICAgcmV0dXJuIGEgPj0gYjsKICB9LAogIGx0OiBmdW5jdGlvbiBsdChhLCBiKSB7CiAgICByZXR1cm4gYSA8IGI7CiAgfSwKICBsdGU6IGZ1bmN0aW9uIGx0ZShhLCBiKSB7CiAgICByZXR1cm4gYSA8PSBiOwogIH0sCiAgLy8gbXVsdGlzZWxlY3QgY29tcGFyYXRvcnMKCiAgLyoqCiAgICogYSBpcyBleGFjdGx5IGIKICAgKiBAcGFyYW0ge1tTdHJpbmddfSBhCiAgICogQHBhcmFtIHtbU3RyaW5nXX0gYgogICAqLwogIGxpc3RfZXhhY3Q6IGZ1bmN0aW9uIGxpc3RfZXhhY3QoYSwgYikgewogICAgaWYgKCFBcnJheS5pc0FycmF5KGEpIHx8ICFBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gYS5zbGljZSgpLnNvcnQoKS5qb2luKCcsJykgPT09IGIuc2xpY2UoKS5zb3J0KCkuam9pbignLCcpOwogIH0sCgogIC8qKgogICAqIGEgY29udGFpbnMgYgogICAqIEBwYXJhbSB7W1N0cmluZ119IGEKICAgKiBAcGFyYW0ge1tTdHJpbmddfSBiCiAgICovCiAgbGlzdF9hbGw6IGZ1bmN0aW9uIGxpc3RfYWxsKGEsIGIpIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShhKSB8fCAhQXJyYXkuaXNBcnJheShiKSkgcmV0dXJuIGZhbHNlOyAvLyB0aGVyZSdzIG5vIHNvbWUgdmFsdWUgaW4gYiB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gYSBpcyBsb2dpY2FsbHkgZXF1aXZhbGVudCB0byBhbGwgdmFsdWUgaW4gYiBleGlzdCBpbiBhCgogICAgcmV0dXJuICFiLnNvbWUoZnVuY3Rpb24gKHZhbCkgewogICAgICByZXR1cm4gYS5pbmRleE9mKHZhbCkgPT09IC0xOwogICAgfSk7CiAgfSwKCiAgLyoqCiAgICogYSBoYXMgYXQgbGVhc3Qgb25lIHZhbHVlIGZyb20gYgogICAqIEBwYXJhbSB7W1N0cmluZ119IGEKICAgKiBAcGFyYW0ge1tTdHJpbmddfSBiCiAgICovCiAgbGlzdF9hbG86IGZ1bmN0aW9uIGxpc3RfYWxvKGEsIGIpIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShhKSB8fCAhQXJyYXkuaXNBcnJheShiKSkgcmV0dXJuIGZhbHNlOyAvLyBzb21lIHZhbHVlIGV4aXN0IGluIGIgdGhhdCBhbHNvIGV4aXN0IGluIGEKCiAgICByZXR1cm4gYi5zb21lKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgcmV0dXJuIGEuaW5kZXhPZih2YWwpICE9IC0xOwogICAgfSk7CiAgfQp9OwovKioKICogQHBhcmFtIHtBcnJheSBvZiBvYmplY3RzfSBjYXJkcyAtIEFycmF5IG9mIGFsbCBjYXJkcwogKiBAcGFyYW0ge0ludH0gaW5kZXggLSBDdXJyZW50IGluZGV4IGluIHRoZSBjYXJkcwogKiBAcGFyYW0ge0FueX0gc2VsZWN0ZWRWYWx1ZSAtIFZhbHVlIHRoYXQgd2FzIHNlbGVjdGVkIHdoaWNoIGRldGVybWluZXMgcm91dGluZyBvcHRpb25zCiAqIEBwYXJhbSB7Qm9vbGVhbn0gaGFzRW5kQ2FyZCAtIGlzIHRoZSB0aGFua3MgY2FyZCBjb25maWd1cmVkCiAqIEByZXR1cm5zIHtJbnR9IG9wdGlvbmFsIG5leHQgaW5kZXggdmFsdWUsIGlmIG5leHQgaW5kZXggaXMgbnVsbCwgc3VydmV5IGVuZHMgaW1tZWRpYXRlbHkKICovCgp2YXIgZ2V0TmV4dENhcmRJbmRleCA9IGZ1bmN0aW9uIGdldE5leHRDYXJkSW5kZXgoY2FyZHMsIGluZGV4LCBzZWxlY3RlZFZhbHVlLCBoYXNFbmRDYXJkKSB7CiAgdmFyIGhhc1ZhbGlkQW5zd2VyID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlOwogIGlmIChpbmRleCA+PSBjYXJkcy5sZW5ndGggfHwgaW5kZXggPCAwKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBzY2VuYXJpbwoKICB2YXIgcm91dGluZ09wdGlvbnMgPSBjYXJkc1tpbmRleF0gJiYgY2FyZHNbaW5kZXhdLnByb3BzICYmIGNhcmRzW2luZGV4XS5wcm9wcy5yb3V0aW5nT3B0aW9ucyB8fCBbXTsKICB2YXIgc2FmZU5leHRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgMSwgY2FyZHMubGVuZ3RoIC0gMSk7CiAgdmFyIHJvdXRpbmdUYXJnZXQgPSBudWxsOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdXRpbmdPcHRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgX3JvdXRpbmdPcHRpb25zJGkgPSByb3V0aW5nT3B0aW9uc1tpXSwKICAgICAgICBjb21wYXJhdG9yID0gX3JvdXRpbmdPcHRpb25zJGkuY29tcGFyYXRvciwKICAgICAgICB0YXJnZXQgPSBfcm91dGluZ09wdGlvbnMkaS50YXJnZXQsCiAgICAgICAgdmFsdWUgPSBfcm91dGluZ09wdGlvbnMkaS52YWx1ZTsKCiAgICBpZiAoY29tcGFyYXRvciA9PT0gJ2Fuc3dlcmVkJyAmJiBoYXNWYWxpZEFuc3dlcikgewogICAgICByb3V0aW5nVGFyZ2V0ID0gcGFyc2VJbnQodGFyZ2V0LCAxMCk7CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIGlmIChjb21wYXJhdG9yc1tjb21wYXJhdG9yXSAmJiBjb21wYXJhdG9yc1tjb21wYXJhdG9yXShzZWxlY3RlZFZhbHVlLCB2YWx1ZSkpIHsKICAgICAgcm91dGluZ1RhcmdldCA9IHBhcnNlSW50KHRhcmdldCwgMTApOwogICAgICBicmVhazsKICAgIH0KICB9IC8vIHRoZSAyIGVuZCBzY2VuYXJpb3MgYXJlOgogIC8vIDEuIHdoZW4gdGhlcmUncyBubyByb3V0aW5nIGFuZCBpbmRleCBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZC4KICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZXJlJ3Mgbm8gZW5kIGNhcmQKCgogIGlmIChyb3V0aW5nVGFyZ2V0ID09PSBudWxsICYmIGluZGV4ID09PSBjYXJkcy5sZW5ndGggLSAxKSByZXR1cm4gbnVsbDsgLy8gMi4gdGFyZ2V0IHNwZWNpZnkgc2tpcCB0byBlbmQKICAvLyBUaGVuLCB3aGVuIHRoZXJlJ3MgZW5kIGNhcmQgdGhlIGVuZCBpbmRleCBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheQogIC8vIE90aGVyd2lzZSwgdGhlcmUncyBubyBlbmQgaW5kZXgKCiAgaWYgKHJvdXRpbmdUYXJnZXQgPT09IC0xKSByZXR1cm4gaGFzRW5kQ2FyZCA/IGNhcmRzLmxlbmd0aCAtIDEgOiBudWxsOwogIHJldHVybiByb3V0aW5nVGFyZ2V0ID09PSBudWxsID8gc2FmZU5leHRJbmRleCA6IHJvdXRpbmdUYXJnZXQ7Cn07CnZhciBNQVhfTEVOR1RIX1RPX0NBTENVTEFURV9TVUJTRVRTID0gMTM7IC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNzczODM2L2hvdy10by1maW5kLWFsbC1zdWJzZXRzLW9mLWEtc2V0LWluLWphdmFzY3JpcHQtcG93ZXJzZXQtb2YtYXJyYXkKCnZhciBnZXRBbGxTdWJzZXRzID0gZnVuY3Rpb24gZ2V0QWxsU3Vic2V0cyhhcnJheSkgewogIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKHN1YnNldHMsIHZhbHVlKSB7CiAgICByZXR1cm4gc3Vic2V0cy5jb25jYXQoc3Vic2V0cy5tYXAoZnVuY3Rpb24gKHNldCkgewogICAgICByZXR1cm4gW10uY29uY2F0KF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0KCkoc2V0KSwgW3ZhbHVlXSk7CiAgICB9KSk7CiAgfSwgW1tdXSk7Cn07CgpmdW5jdGlvbiBnZW5lcmF0ZVBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMoY2FyZCkgewogIHN3aXRjaCAoY2FyZC50eXBlKSB7CiAgICBjYXNlICdtdWx0aXBsZXNlbGVjdCc6CiAgICAgIC8vIHJldHVybiBudWxsIGlmIGludmFsaWQgb3B0aW9ucwogICAgICBpZiAoIWNhcmQgfHwgIWNhcmQucHJvcHMgfHwgIWNhcmQucHJvcHMub3B0aW9ucykgcmV0dXJuIG51bGw7CgogICAgICBpZiAoY2FyZC5wcm9wcy5vcHRpb25zLmxlbmd0aCA+IE1BWF9MRU5HVEhfVE9fQ0FMQ1VMQVRFX1NVQlNFVFMpIHsKICAgICAgICAvLyAyICoqIE1BWF9MRU5HVEhfVE9fQ0FMQ1VMQVRFX1NVQlNFVFMgKDEzKSA9IDgxOTIuIGFib3ZlIHRoaXMgbGltaXQsIGNvbXB1dGF0aW9uIG1heSBiZSB0b28gc2xvdy4KICAgICAgICAvLyBXZSBzaG91bGQgYWxtb3N0IG5ldmVyIHNlZSBtb3JlIHRoYW4gMTMgb3B0aW9ucywgYnV0IGluIHRoaXMgZWRnZSBjYXNlLCBvbmx5IGNvbnNpZGVyIGxlbmd0aC0xIGNvbWJpbmF0aW9ucy4KICAgICAgICAvLyBUaGlzIG1heSBsZWFkIHRvIGFuIGluYWNjdXJhdGUgY2FsY3VsYXRpb24sIGJ1dCB3ZSBwcmVmZXIgdGhhdCB0aGFuIHBvb3IgcGVyZm9ybWFuY2UuCiAgICAgICAgcmV0dXJuIGNhcmQucHJvcHMub3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgcmV0dXJuIFtvcHRpb24udmFsdWVdOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gZ2V0QWxsU3Vic2V0cyhjYXJkLnByb3BzLm9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb24pIHsKICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlOwogICAgICB9KSk7CgogICAgY2FzZSAnbXVsdGlwbGVjaG9pY2UnOgogICAgICAvLyByZXR1cm4gbnVsbCBpZiBpbnZhbGlkIG9wdGlvbnMKICAgICAgaWYgKCFjYXJkIHx8ICFjYXJkLnByb3BzIHx8ICFjYXJkLnByb3BzLm9wdGlvbnMpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gY2FyZC5wcm9wcy5vcHRpb25zLm1hcChmdW5jdGlvbiAob3B0aW9uKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZTsKICAgICAgfSk7CgogICAgY2FzZSAnbGlrZXJ0JzoKICAgICAgcmV0dXJuIFsxLCAyLCAzLCA0LCA1XTsKCiAgICBjYXNlICducHMnOgogICAgICByZXR1cm4gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldOwoKICAgIGNhc2UgJ3ZpZGVvdm9pY2UnOgogICAgY2FzZSAnb3Blbic6CiAgICBjYXNlICd0ZXh0dXJscHJvbXB0JzoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBbQU5TV0VSRURdOwogIH0KfQoKdmFyIGdldE1heFJlbWFpbmluZ0NhcmRzID0gZnVuY3Rpb24gZ2V0TWF4UmVtYWluaW5nQ2FyZHMocmF3Q2FyZHMsIGluZGV4KSB7CiAgdmFyIF9jYWNoZTsKCiAgLy8gcmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVtYWluaW5nIGNhcmRzLCBpbmNsdWRpbmcgdGhpcyBjYXJkCiAgaWYgKCFyYXdDYXJkcyB8fCAhcmF3Q2FyZHMubGVuZ3RoIHx8IGluZGV4ID49IHJhd0NhcmRzLmxlbmd0aCB8fCBpbmRleCA8IDApIHJldHVybiAwOyAvLyBpbnZhbGlkIHNjZW5hcmlvCgogIGlmICghcmF3Q2FyZHNbaW5kZXhdLnR5cGUpIHsKICAgIC8vIHRoaXMgaXMgdGhlIHRoYW5rIHlvdSBjYXJkCiAgICByZXR1cm4gMDsKICB9IC8vIGZpbHRlciBvdXQgdGhhbmsgeW91IGNhcmQgZnJvbSBjYWxjdWxhdGlvbiwgaWYgcHJlc2VudAoKCiAgdmFyIGNhcmRzID0gcmF3Q2FyZHMuZmlsdGVyKGZ1bmN0aW9uIChjYXJkKSB7CiAgICByZXR1cm4gY2FyZC50eXBlOwogIH0pOyAvLyB0aGlzIGlzIHRoZSBsYXN0IGNhcmQsIHNvIHdlIGNhbiBzaG9ydC1jaXJjdWl0LgoKICBpZiAoaW5kZXggPT09IGNhcmRzLmxlbmd0aCAtIDEpIHJldHVybiAxOyAvLyByb3V0aW5nVGFyZ2V0IG9mIGVuZCBjYXJkIGlzIC0xLCBpbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSBubyBxdWVzdGlvbnMgbGVmdC4KCiAgdmFyIGNhY2hlID0gKF9jYWNoZSA9IHt9LCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKF9jYWNoZSwgY2FyZHMubGVuZ3RoIC0gMSwgMSksIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoX2NhY2hlLCAtMSwgMCksIF9jYWNoZSk7IC8vIGZvciBlYWNoIGNhcmQgaW4gcmV2ZXJzZSBvcmRlciwgZW5kaW5nIHdpdGggdGhlIGN1cnJlbnQgZGVzaXJlZCBpbmRleCwgY29tcHV0ZSB0aGUgbG9uZ2VzdCBwb3NzaWJsZQogIC8vIG51bWJlciBvZiByZW1haW5pbmcgY2FyZHMsIGNvbnNpZGVyaW5nIHRoZSB2YWx1ZXMgb2YgbG9uZ2VzdCBwb3NzaWJsZSBudW1iZXIgb2YgcmVtYWluaW5nIGNhcmRzIGFmdGVyIGl0LgoKICBmb3IgKHZhciBjdXJyZW50SW5kZXggPSBjYXJkcy5sZW5ndGggLSAyOyBjdXJyZW50SW5kZXggPj0gaW5kZXg7IGN1cnJlbnRJbmRleC0tKSB7CiAgICB2YXIgY2FyZCA9IGNhcmRzW2N1cnJlbnRJbmRleF07CiAgICB2YXIgcm91dGluZ09wdGlvbnMgPSBjYXJkICYmIGNhcmQucHJvcHMgJiYgY2FyZC5wcm9wcy5yb3V0aW5nT3B0aW9ucyB8fCBbXTsgLy8gaWYgdGhlcmUgYXJlbid0IHJvdXRpbmcgb3B0aW9ucywgd2UgaGF2ZSB0byBnbyB0byB0aGUgbmV4dCBxdWVzdGlvbgoKICAgIGlmIChyb3V0aW5nT3B0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgY2FjaGVbY3VycmVudEluZGV4XSA9IGNhY2hlW2N1cnJlbnRJbmRleCArIDFdICsgMTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgdmFyIG1heFJlbWFpbmluZ0NhcmRzID0gMDsKICAgIHZhciBwb3NzaWJsZVNlbGVjdGVkVmFsdWVzID0gZ2VuZXJhdGVQb3NzaWJsZVNlbGVjdGVkVmFsdWVzKGNhcmQpOwoKICAgIGlmIChwb3NzaWJsZVNlbGVjdGVkVmFsdWVzID09PSBudWxsKSB7CiAgICAgIC8vIGludmFsaWQgcXVlc3Rpb24gb3B0aW9ucywgc2hvcnQtY2lyY3VpdCB3aXRoIHJlbWFpbmluZyBjYXJkIGNvdW50CiAgICAgIHJldHVybiBjYXJkcy5sZW5ndGggLSAxIC0gaW5kZXg7CiAgICB9IC8vIGNvbnNpZGVyIGVhY2ggcm91dGluZyBvcHRpb246IGlmIGl0J3MgcG9zc2libGUgZm9yIGl0IHRvIG1hdGNoLAogICAgLy8gY29uc2lkZXIgd2hlcmUgaXQgbGVhZHMgYXMgcGFydCBvZiBjb21wdXRpbmcgdGhlIGxvbmdlc3QgcG9zc2libGUgbnVtYmVyIG9mIHJlbWFpbmluZyBjYXJkcy4KCgogICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aocm91dGluZ09wdGlvbkluZGV4KSB7CiAgICAgIGlmIChwb3NzaWJsZVNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIC8vIHJlbWFpbmluZyByb3V0aW5nT3B0aW9ucyBhcmUgbmV2ZXIgY29uc2lkZXJlZAogICAgICAgIHJldHVybiAiYnJlYWsiOwogICAgICB9CgogICAgICB2YXIgX3JvdXRpbmdPcHRpb25zJHJvdXRpID0gcm91dGluZ09wdGlvbnNbcm91dGluZ09wdGlvbkluZGV4XSwKICAgICAgICAgIGNvbXBhcmF0b3IgPSBfcm91dGluZ09wdGlvbnMkcm91dGkuY29tcGFyYXRvciwKICAgICAgICAgIHRhcmdldCA9IF9yb3V0aW5nT3B0aW9ucyRyb3V0aS50YXJnZXQsCiAgICAgICAgICB2YWx1ZSA9IF9yb3V0aW5nT3B0aW9ucyRyb3V0aS52YWx1ZTsgLy8gZmlsdGVyIG91dCBhbnkgcmVtYWluaW5nIHBvc3NpYmxlIHZhbHVlcyB0aGF0IG1hdGNoIHRoZSBjdXJyZW50IHJvdXRpbmcgb3B0aW9uCgogICAgICB2YXIgbmV3UG9zc2libGVTZWxlY3RlZFZhbHVlcyA9IHBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKGZ1bmN0aW9uIChzZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgcmV0dXJuICEoY29tcGFyYXRvciA9PT0gJ2Fuc3dlcmVkJyB8fCBjb21wYXJhdG9yc1tjb21wYXJhdG9yXSAmJiBjb21wYXJhdG9yc1tjb21wYXJhdG9yXShzZWxlY3RlZFZhbHVlLCB2YWx1ZSkpOwogICAgICB9KTsgLy8gaWYgYW55dGhpbmcgd2FzIGZpbHRlcmVkIG91dCwgaXQncyBwb3NzaWJsZSB0byBtYXRjaCB0aGUgcm91dGluZyBvcHRpb25zLCBzbyB1c2Ugcm91dGluZyB0YXJnZXQKCiAgICAgIGlmIChuZXdQb3NzaWJsZVNlbGVjdGVkVmFsdWVzLmxlbmd0aCA8IHBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgdmFyIHJvdXRpbmdUYXJnZXQgPSBwYXJzZUludCh0YXJnZXQsIDEwKTsKCiAgICAgICAgaWYgKHJvdXRpbmdUYXJnZXQgIT09IC0xICYmIHJvdXRpbmdUYXJnZXQgPD0gY3VycmVudEluZGV4IHx8IHJvdXRpbmdUYXJnZXQgPj0gY2FyZHMubGVuZ3RoKSB7CiAgICAgICAgICAvLyBpbnZhbGlkIHJvdXRpbmcgdGFyZ2V0LCBzaG9ydC1jaXJjdWl0IHdpdGggcmVtYWluaW5nIGNhcmQgY291bnQKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHY6IGNhcmRzLmxlbmd0aCAtIDEgLSBpbmRleAogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG1heFJlbWFpbmluZ0NhcmRzID0gTWF0aC5tYXgoY2FjaGVbcm91dGluZ1RhcmdldF0gKyAxLCBtYXhSZW1haW5pbmdDYXJkcyk7CiAgICAgIH0KCiAgICAgIHBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMgPSBuZXdQb3NzaWJsZVNlbGVjdGVkVmFsdWVzOwogICAgfTsKCiAgICBmb3IgKHZhciByb3V0aW5nT3B0aW9uSW5kZXggPSAwOyByb3V0aW5nT3B0aW9uSW5kZXggPCByb3V0aW5nT3B0aW9ucy5sZW5ndGg7IHJvdXRpbmdPcHRpb25JbmRleCsrKSB7CiAgICAgIHZhciBfcmV0ID0gX2xvb3Aocm91dGluZ09wdGlvbkluZGV4KTsKCiAgICAgIGlmIChfcmV0ID09PSAiYnJlYWsiKSBicmVhazsKICAgICAgaWYgKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKF9yZXQpID09PSAib2JqZWN0IikgcmV0dXJuIF9yZXQudjsKICAgIH0KCiAgICBpZiAocG9zc2libGVTZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwIHx8IGNhcmQudHlwZSA9PT0gJ3ZpZGVvdm9pY2UnKSB7CiAgICAgIC8vIGl0J3MgcG9zc2libGUgdG8gbm90IG1hdGNoIGFueSBvZiB0aGUgcm91dGluZyB2YWx1ZXMgYW5kIGdvIHRvIHRoZSBuZXh0IHF1ZXN0aW9uCiAgICAgIC8vIChhbHdheXMgcG9zc2libGUgYnkgc2VsZWN0aW5nIFNraXAgb24gYSB2aWRlbyBxdWVzdGlvbikKICAgICAgbWF4UmVtYWluaW5nQ2FyZHMgPSBNYXRoLm1heChjYWNoZVtjdXJyZW50SW5kZXggKyAxXSArIDEsIG1heFJlbWFpbmluZ0NhcmRzKTsKICAgIH0KCiAgICBjYWNoZVtjdXJyZW50SW5kZXhdID0gbWF4UmVtYWluaW5nQ2FyZHM7CiAgfQoKICByZXR1cm4gY2FjaGVbaW5kZXhdOwp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9jYXJkLmNzcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9jYXJkLmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gSW1wb3J0cwp2YXIgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwovLyBNb2R1bGUKZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsICIudWwtY2FyZCB7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIG1hcmdpbjogYXV0bztcbn1cblxuLnVsLWNhcmRfX2NvbnRhaW5lci0tZGVza3RvcCB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4udWwtY2FyZF9fY29udGFpbmVyLS1tb2JpbGUge1xuICBib3JkZXItd2lkdGg6IDA7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLnVsLWNhcmRfX2NvbnRhaW5lciB7XG4gIHBhZGRpbmc6IDIwcHggMjBweCA1cHggMjBweDtcbiAgZmxleDogMSAxIGF1dG87XG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgbGluZS1oZWlnaHQ6IDIzcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgZmxleC1ncm93OiAxO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi51bC1jYXJkLW1haW4tY29udGVudF9fbGluayB7XG4gIGZsZXgtZ3JvdzogNTU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBhZGRpbmctYm90dG9tOiAzNSU7XG59XG5cbi51bC1jYXJkLW1haW4tY29udGVudF9fd2ViIHtcbiAgcGFkZGluZy10b3A6IDE1cHg7XG59XG5cbi51bC1xdWVzdGlvbiB7XG4gIGZsZXg6IDEgMCBhdXRvO1xuICBjb2xvcjogIzM0MzQ0MjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDEyNSU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLnVsLWNhcHRpb24ge1xuICBmbGV4OiAxIDAgYXV0bztcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMzAuMzUlO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xuICBjb2xvcjogIzZjNmM2ZTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLnVsLWNhcmRfX2Nob2ljZXMge1xuICBtYXJnaW46IDVweCAwIDAgMDtcbiAgZmxleDogMSAwO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5jaG9pY2UtLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG59XG5cbi5jaG9pY2UtLWRlc2t0b3Age1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2O1xufVxuXG4uY2hvaWNlIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcblxuICBtYXJnaW4tYm90dG9tOiA3cHg7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIHBhZGRpbmc6IDEwcHggMjBweCAxMHB4IDE1cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wMSk7XG59XG5cbi5jaG9pY2UtLWRlc2t0b3A6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xufVxuXG4uY2hvaWNlLS1kZXNrdG9wOmFjdGl2ZSxcbi5jaG9pY2UtLW1vYmlsZTphY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xufVxuXG4udWwtdGhhbmtzLWNoZWNrIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4udWwtY2FyZC0tdGhhbmtzLWNvbnRlbnQge1xuICBwYWRkaW5nOiAyMHB4IDAgMTBweCAwO1xufVxuXG4udWwtY2FyZC0tdGhhbmtzIC51bC1xdWVzdGlvbiB7XG4gIHBhZGRpbmctdG9wOiAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi51bC1jYXJkLS10aGFua3MgLnVsLWNhcHRpb24ge1xuICBwYWRkaW5nLXRvcDogMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICBoeXBoZW5zOiBhdXRvO1xuICBoeXBoZW5hdGUtbGltaXQtbGluZXM6IG5vLWxpbWl0O1xufVxuXG4uc2VsZWN0LWNoZWNrYm94IHtcbiAgaGVpZ2h0OiAxNnB4O1xuICB3aWR0aDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjMzIzMjMyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3gtc2hhZG93OiBpbnNldCAzcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICd0cmFuc3BhcmVudCc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uc2VsZWN0LXJhZGlvIHtcbiAgaGVpZ2h0OiAxNnB4O1xuICB3aWR0aDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzMyMzIzMjtcbiAgZGlzcGxheTogZmxleDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAndHJhbnNwYXJlbnQnO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLmZhZGUtaW4tdHJhbnNpdGlvbiB7XG4gIGFuaW1hdGlvbjogZmFkZUluIDQwMG1zIGVhc2UtaW47XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBmYWRlSW4gNDAwbXMgZWFzZS1pbjtcbiAgLW1vei1hbmltYXRpb246IGZhZGVJbiA0MDBtcyBlYXNlLWluO1xuICAtby1hbmltYXRpb246IGZhZGVJbiA0MDBtcyBlYXNlLWluO1xuICAtbXMtYW5pbWF0aW9uOiBmYWRlSW4gNDAwbXMgZWFzZS1pbjtcbn1cblxuQGtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtbW96LWtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtby1rZXlmcmFtZXMgZmFkZUluIHtcbiAgMCUge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuXG5ALW1zLWtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG4iLCAiIl0pOwovLyBFeHBvcnRzCm1vZHVsZS5leHBvcnRzID0gZXhwb3J0czsKCgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L3N0eWxlcy9pbmRleC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9zdHlsZXMvaW5kZXguY3NzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwp2YXIgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8wX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Jlc2V0LmNzcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9yZXNldC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jYXJkLmNzcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9jYXJkLmNzcyIpOwp2YXIgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8yX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2xpa2VydC5jc3MgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvbGlrZXJ0LmNzcyIpOwp2YXIgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8zX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL211bHRpc2VsZWN0LmNzcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9tdWx0aXNlbGVjdC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ucHMuY3NzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL25wcy5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNV9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90ZXh0LWNhcmQuY3NzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3RleHQtY2FyZC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNl9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90ZXh0LXVybC1wcm9tcHQuY3NzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3RleHQtdXJsLXByb21wdC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfN19fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi92b2ljZS12aWRlby5jc3MgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdm9pY2UtdmlkZW8uY3NzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwpleHBvcnRzLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8wX19fKTsKZXhwb3J0cy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyk7CmV4cG9ydHMuaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzJfX18pOwpleHBvcnRzLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8zX19fKTsKZXhwb3J0cy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNF9fXyk7CmV4cG9ydHMuaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzVfX18pOwpleHBvcnRzLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF82X19fKTsKZXhwb3J0cy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfN19fXyk7Ci8vIE1vZHVsZQpleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgImh0bWwsXG5ib2R5IHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsICdBcHBsZSBDb2xvciBFbW9qaScsXG4gICAgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCc7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG5iIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuI3VsLWFwcCB7XG4gIG9wYWNpdHk6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBmbGV4LWdyb3c6IDI7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbiN1bC1hcHAudWwtYXBwLS1vdmVybGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDA7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xcyBlYXNlLW91dDtcbn1cblxuI3VsLWFwcC51bC1hcHAtLXZpc2libGUge1xuICBvcGFjaXR5OiAxO1xuICBib3R0b206IDA7XG59XG5cbi51bC1hcHBfX2NvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1heC1oZWlnaHQ6IDEwMHZoO1xufVxuXG4udWwtZm9vdGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG1hcmdpbi10b3A6IGF1dG87XG4gIGZsZXgtZ3JvdzogMTtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi51bC1mb290ZXItYnViYmxlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW46IDAgM3B4O1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbn1cblxuLmNsb3NlLWNvbnRhaW5lci0tZGVza3RvcCxcbi5jbG9zZS1jb250YWluZXItLW1vYmlsZSB7XG4gIGhlaWdodDogMjJweDtcbiAgd2lkdGg6IDIycHg7XG4gIGJvcmRlci1yYWRpdXM6IDIycHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uY2xvc2UtY29udGFpbmVyLS1kZXNrdG9wIHtcbiAgdG9wOiAyNXB4O1xuICByaWdodDogMjVweDtcbn1cblxuLmNsb3NlLWNvbnRhaW5lci0tbW9iaWxlIHtcbiAgdG9wOiAxNXB4O1xuICByaWdodDogMTBweDtcbn1cblxuLmNsb3NlLWNvbnRhaW5lciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLmNsb3NlLWJ0biB7XG4gIGhlaWdodDogMThweDtcbiAgd2lkdGg6IDE4cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi51bC1hcHBfX2NvbnRhaW5lciB7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlLW91dDtcbn1cblxuI3VsLXByb2dyZXNzLWJhci1jb250YWluZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAycHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBtYXgtd2lkdGg6IDI1MHB4O1xuICBtYXJnaW46IDI1cHggMDtcbn1cblxuI3VsLXByb2dyZXNzLWJhci1jdXJyZW50IHtcbiAgd2lkdGg6IDBweDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XG4iLCAiIl0pOwovLyBFeHBvcnRzCm1vZHVsZS5leHBvcnRzID0gZXhwb3J0czsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL2xpa2VydC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9saWtlcnQuY3NzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwpleHBvcnRzID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKGZhbHNlKTsKLy8gTW9kdWxlCmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCAiLyogaWRlbnRpY2FsIHRvIG5wcy5jc3MsIG90aGVyIHRoYW4gY2xhc3MgbmFtZXMuICovXG4udWwtY2FyZC0tbGlrZXJ0X19udW1iZXJzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBmbGV4OiAxIDA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW46IDVweCAwIDAgMDtcbn1cblxuLmxpa2VydC1udW1iZXItLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMnB4O1xufVxuXG4ubGlrZXJ0LW51bWJlci0tZGVza3RvcCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ubGlrZXJ0LW51bWJlciB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZsZXg6IDEgMDtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDEpO1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBoZWlnaHQ6IDY3cHg7XG59XG5cbi5saWtlcnQtbnVtYmVyOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5saWtlcnQtbnVtYmVyLS1kZXNrdG9wOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLmxpa2VydC1udW1iZXItMSB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4O1xufVxuXG4ubGlrZXJ0LW51bWJlci01IHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDVweDtcbn1cblxuLnVsLWNhcmQtLWxpa2VydF9fbGFiZWxzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXg6IDEgMDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTVweDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW46IDdweCAwIDEwcHggMDtcbn1cblxuLnVsLWNhcmQtLWxpa2VydF9fbGFiZWxzIHNwYW46bGFzdC1jaGlsZCB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuIiwgIiJdKTsKLy8gRXhwb3J0cwptb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9tdWx0aXNlbGVjdC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL211bHRpc2VsZWN0LmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwpleHBvcnRzID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKGZhbHNlKTsKLy8gTW9kdWxlCmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCAiLnNlbGVjdC1sYWJlbCB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmctbGVmdDogMTVweDtcbn1cbiIsICIiXSk7Ci8vIEV4cG9ydHMKbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvbnBzLmNzcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL25wcy5jc3MgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gSW1wb3J0cwp2YXIgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwovLyBNb2R1bGUKZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsICIvKiBpZGVudGljYWwgdG8gbGlrZXJ0LmNzcywgb3RoZXIgdGhhbiBjbGFzcyBuYW1lcy4gKi9cbi51bC1jYXJkLS1ucHNfX251bWJlcnMge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXg6IDEgMDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG1hcmdpbjogNXB4IDAgMCAwO1xufVxuXG4ubnBzLW51bWJlci0tbW9iaWxlIHtcbiAgYm9yZGVyOiAycHggc29saWQgI2U2ZTZlNjtcbiAgbWFyZ2luLWxlZnQ6IC0ycHg7XG59XG5cbi5ucHMtbnVtYmVyLS1kZXNrdG9wIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5ucHMtbnVtYmVyIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZmxleDogMSAwO1xuXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wMSk7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gIGhlaWdodDogNjdweDtcbn1cblxuLm5wcy1udW1iZXI6YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLm5wcy1udW1iZXItLWRlc2t0b3A6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICBmb250LXdlaWdodDogNTAwO1xufVxuXG4ubnBzLW51bWJlci0wIHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNXB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA1cHg7XG59XG5cbi5ucHMtbnVtYmVyLTEwIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDVweDtcbn1cblxuLnVsLWNhcmQtLW5wc19fbGFiZWxzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXg6IDEgMDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTVweDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW46IDdweCAwIDEwcHggMDtcbn1cblxuLnVsLWNhcmQtLW5wc19fbGFiZWxzIHNwYW46bGFzdC1jaGlsZCB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuIiwgIiJdKTsKLy8gRXhwb3J0cwptb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9yZXNldC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3Jlc2V0LmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwpleHBvcnRzID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKGZhbHNlKTsKLy8gTW9kdWxlCmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCAiLyoqXG4gKiBtaW5pcmVzZXQuY3NzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vamd0aG1zL21pbmlyZXNldC5jc3NcbiAqL1xuXG5odG1sLFxuYm9keSxcbnAsXG5vbCxcbnVsLFxubGksXG5kbCxcbmR0LFxuZGQsXG5ibG9ja3F1b3RlLFxuZmlndXJlLFxuZmllbGRzZXQsXG5sZWdlbmQsXG50ZXh0YXJlYSxcbnByZSxcbmlmcmFtZSxcbmhyLFxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2IHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBmb250LXNpemU6IDEwMCU7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG5cbnVsIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuYnV0dG9uLFxuaW5wdXQsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIG1hcmdpbjogMDtcbn1cblxuaHRtbCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbiosICo6YmVmb3JlLCAqOmFmdGVyIHtcbiAgYm94LXNpemluZzogaW5oZXJpdDtcbn1cbiIsICIiXSk7Ci8vIEV4cG9ydHMKbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdGV4dC1jYXJkLmNzcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3RleHQtY2FyZC5jc3MgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gSW1wb3J0cwp2YXIgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwovLyBNb2R1bGUKZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsICIudWwtY2FyZC10ZXh0IHtcbiAgZmxleDogMSAwIGF1dG87XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nOiAwO1xufVxuXG4udWwtY2FyZC10ZXh0X19jb250YWluZXIge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICBmbGV4OiAxIDAgMTAwJTtcbn1cblxuLnVsLWNhcmQtdGV4dF9faW5wdXQtLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG4gIG1heC1oZWlnaHQ6IDYzcHg7XG59XG5cbi51bC1jYXJkLXRleHRfX2lucHV0LS1kZXNrdG9wIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjtcbiAgbWF4LWhlaWdodDogMTUwcHg7XG59XG5cbi51bC1jYXJkLXRleHRfX2lucHV0IHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAxKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgY29sb3I6ICMzNDM0NDI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgJ0FwcGxlIENvbG9yIEVtb2ppJyxcbiAgICAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJztcbiAgbWluLWhlaWdodDogNjNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMTJweDtcbiAgcmVzaXplOiBub25lO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xufVxuXG4udWwtY2FyZC10ZXh0X19pbnB1dDo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogcmdiYSgxMDgsIDEwOCwgMTEwLCAwLjUpO1xufVxuXG4udWwtY2FyZC10ZXh0X19pbnB1dDpmb2N1cyB7XG4gIG91dGxpbmU6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4udWwtY2FyZC10ZXh0X19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBsaW5lLWhlaWdodDogMThweDtcbiAgcGFkZGluZzogMTAuNXB4IDIxcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuIiwgIiJdKTsKLy8gRXhwb3J0cwptb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy90ZXh0LXVybC1wcm9tcHQuY3NzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdGV4dC11cmwtcHJvbXB0LmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBJbXBvcnRzCnZhciBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiKTsKZXhwb3J0cyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhmYWxzZSk7Ci8vIE1vZHVsZQpleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgIi51bC1jYXJkX190ZXh0LXVybC1ib2R5LWNvbnRhaW5lcixcbi51bC1jYXJkX190ZXh0LXVybC1wcm9tcHQtYm9keSB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbi51bC1jYXJkX190ZXh0LXVybC1wcm9tcHQtYm9keSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgbGluZS1oZWlnaHQ6IDEzMC4zNSU7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gIGNvbG9yOiAjMzQzNDQyO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG59XG5cbi51bC1jYXJkX190ZXh0LXVybC1wcm9tcHQtYm9keTpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1idXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbi51bC1jYXJkX190ZXh0LXVybC1ib2R5LWNvbnRhaW5lciB7XG4gIG1pbi1oZWlnaHQ6IDJlbTtcbn1cbiIsICIiXSk7Ci8vIEV4cG9ydHMKbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdm9pY2UtdmlkZW8uY3NzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy92b2ljZS12aWRlby5jc3MgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBJbXBvcnRzCnZhciBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiKTsKZXhwb3J0cyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhmYWxzZSk7Ci8vIE1vZHVsZQpleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgIi51bC1jYXJkLS12aWRlbyB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG59XG5cbiN1bC1jYXJkLXZvaWNlX192aWRlbyB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG4udWwtY2FyZC10ZXh0X19idXR0b24udWwtYnV0dG9uLWluYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgY29sb3I6ICM1ZDY5NmYgIWltcG9ydGFudDtcbn1cblxuI3VsLWNhcmQtdmlkZW9fX3BsYXllcl9yZWNvcmRlciB7XG4gIHdpZHRoOiAxMDAlO1xuICB3aWR0aDogLW1vei1hdmFpbGFibGU7IC8qIFdlYktpdC1iYXNlZCBicm93c2VycyB3aWxsIGlnbm9yZSB0aGlzLiAqL1xuICB3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZTsgLyogTW96aWxsYS1iYXNlZCBicm93c2VycyB3aWxsIGlnbm9yZSB0aGlzLiAqL1xuICB3aWR0aDogZmlsbC1hdmFpbGFibGU7XG59XG4iLCAiIl0pOwovLyBFeHBvcnRzCm1vZHVsZS5leHBvcnRzID0gZXhwb3J0czsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgewogICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgYXJyMltpXSA9IGFycltpXTsKICAgIH0KCiAgICByZXR1cm4gYXJyMjsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgdHJ5IHsKICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJlamVjdChlcnJvcik7CiAgICByZXR1cm47CiAgfQoKICBpZiAoaW5mby5kb25lKSB7CiAgICByZXNvbHZlKHZhbHVlKTsKICB9IGVsc2UgewogICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogIH0KfQoKZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsKICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CgogICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgewogICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgIH0KCiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICB9KTsKICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICB9Cn0KCmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgcmV0dXJuIENvbnN0cnVjdG9yOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICBpZiAoa2V5IGluIG9iaikgewogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSk7CiAgfSBlbHNlIHsKICAgIG9ialtrZXldID0gdmFsdWU7CiAgfQoKICByZXR1cm4gb2JqOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKZnVuY3Rpb24gX2V4dGVuZHMoKSB7CiAgbW9kdWxlLmV4cG9ydHMgPSBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgewogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsKCiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsKICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdGFyZ2V0OwogIH07CgogIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9leHRlbmRzOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gIltvYmplY3QgQXJndW1lbnRzXSIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXk7CgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7CiAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UiKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQ7CgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBhcnJheVdpdGhvdXRIb2xlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYXJyYXlXaXRob3V0SG9sZXMgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiKTsKCnZhciBpdGVyYWJsZVRvQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2l0ZXJhYmxlVG9BcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiKTsKCnZhciBub25JdGVyYWJsZVNwcmVhZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vbm9uSXRlcmFibGVTcHJlYWQgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVTcHJlYWQuanMiKTsKCmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsKICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogIGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7CiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH07CiAgfSBlbHNlIHsKICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7CiAgICB9OwogIH0KCiAgcmV0dXJuIF90eXBlb2Yob2JqKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISByZWdlbmVyYXRvci1ydW50aW1lICovICIuL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJISURERU5fQ0xBU1MiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gSElEREVOX0NMQVNTOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJWSVNJQkxFX0NMQVNTIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFZJU0lCTEVfQ0xBU1M7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgInZpZGVvUGxheWVyIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHZpZGVvUGxheWVyOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJ2aWRlb1JlY29yZGVyUGxheWVyIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHZpZGVvUmVjb3JkZXJQbGF5ZXI7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgInZpZGVvUGxheWVyUmVjb3JkZXJDb21ibyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyB2aWRlb1BsYXllclJlY29yZGVyQ29tYm87IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlc3Ryb3lQbGF5ZXIiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZGVzdHJveVBsYXllcjsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAic3RvcFJlY29yZGluZyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBzdG9wUmVjb3JkaW5nOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJyZXNldFBsYXllclNvdXJjZSI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyByZXNldFBsYXllclNvdXJjZTsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAicGF1c2VRdWVzdGlvblBsYXllciI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBwYXVzZVF1ZXN0aW9uUGxheWVyOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJyZWZyZXNoUGxheWVyUmVjb3JkZXJDb21ibyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyByZWZyZXNoUGxheWVyUmVjb3JkZXJDb21ibzsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiUkVDT1JERVIiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gUkVDT1JERVI7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8vIFRvIHRlc3Qgc3RhZ2luZyBDRE4sIHRlbXBvcmFyaWx5IHVwZGF0ZSB0aGlzIGxpbmsgdG8gJ2h0dHBzOi8vY2RuLXN0YWdpbmcuc3ByaWcuY29tJwpjb25zdCBDRE5fTElOSyA9ICdodHRwczovL2Nkbi5zcHJpZy5jb20nOwoKY29uc3QgdmlkZW9QbGF5ZXJDc3MgPSBgLyogcHJvZ3Jlc3MgY29udHJvbCBzdHlsZXMgKi8KLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbCAudmpzLXByb2dyZXNzLWhvbGRlciB7CiAgbWFyZ2luOiAwIDBweDsKfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGhlaWdodDogM3B4OwogIHdpZHRoOiAxMDAlOwp9Ci8qIHBvc2l0aW9uIGFuZCBhbGlnbiB0aGUgYnV0dG9ucyBhbmQgYnV0dG9uIHRleHRzICovCi51bC1jb250cm9sLXBhbmVsIHsKICBib3R0b206IDA7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICBoZWlnaHQ6IGZpdC1jb250ZW50OwogIHotaW5kZXg6IDI7CiAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODsKfQoKLnVsLWJ1dHRvbnMtcGFuZWwgewogIGRpc3BsYXk6IGZsZXg7CiAgY29sb3I6IGJsYWNrOwogIGhlaWdodDogNTBweDsKICBwYWRkaW5nOiAycHggMTRweCAwOwp9CgoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgewogIGhlaWdodDogMzBweDsKICB3aWR0aDogNDBweDsKfQoKLnVsLWJ1dHRvbnMtcGFuZWwgPiAudmpzLWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgaGVpZ2h0OiAzZW07CiAgd2lkdGg6IDNlbTsKICBtYXJnaW46IDAgMTBweDsKfQoKc3Bhbi51bC1idXR0b24tdGV4dCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMjVweCk7CiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxcHgsIDI1cHgpOwp9CgojdWwtY2FtZXJhLWJ1dHRvbiB7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnVsLWluYWN0aXZlIHsKICBvcGFjaXR5OiAwLjM7CiAgY3Vyc29yOiBkZWZhdWx0OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoudmlkZW8tanMgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgei1pbmRleDogMTsKfQoKLnZqcy12b2x1bWUtYmFyLnZqcy1zbGlkZXItaG9yaXpvbnRhbCAudmpzLXZvbHVtZS1sZXZlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Cn0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLWhvdmVyLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsLnZqcy1zbGlkZXItYWN0aXZlLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsOmFjdGl2ZSB7CiAgd2lkdGg6IDQwcHg7Cn0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy1zbGlkZXItYWN0aXZlLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbDphY3RpdmUsCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtaG92ZXIgLnZqcy1tdXRlLWNvbnRyb2wgfiAudmpzLXZvbHVtZS1jb250cm9sLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wsCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbCwKLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmZvY3VzIC52anMtdm9sdW1lLWNvbnRyb2wgewogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgbGVmdDogNDBweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjFzLCBvcGFjaXR5IDAuMXMsIGhlaWdodCAwLjFzLCB3aWR0aCAwLjFzLCBsZWZ0IDBzLCB0b3AgMHM7Cn0KCi8qIHBsYXkgYnV0dG9uIGN1c3RvbWl6YXRpb24gKi8KLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sIHsKICBjb2xvcjogYmxhY2s7Cn0KCi52aWRlby1qcyAudmpzLXBsYXktY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyB2aWV3Qm94PScwIDAgMTIgMTInIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGQ9J00xMC41MzYzIDYuNDAyMjZMMS45Mzk1OCAxMC43MDA2QzEuNjQwMzcgMTAuODUwMiAxLjI4ODMzIDEwLjYzMjYgMS4yODgzMyAxMC4yOTgxVjEuNzAxNEMxLjI4ODMzIDEuMzY2ODggMS42NDAzNyAxLjE0OTMxIDEuOTM5NTggMS4yOTg5MUwxMC41MzYzIDUuNTk3MjdDMTAuODY4IDUuNzYzMTEgMTAuODY4IDYuMjM2NDIgMTAuNTM2MyA2LjQwMjI2Wicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRSIpOwp9CgovKiBwb3NpdGlvbiBhbmQgc3R5bGUgdGhlIGN1cnJlbnQgdGltZXIgKi8KLnVsLXRpbWUtcGFuZWwgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDgwcHg7CiAgbGVmdDogMTBweDsKICBoZWlnaHQ6IDIycHg7CiAgY29sb3I6IGJsYWNrOwogIGJvcmRlcjogMXB4IHNvbGlkICNlMGUwZWI7CiAgYm9yZGVyLXJhZGl1czogMjNweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICB3aWR0aDogZml0LWNvbnRlbnQ7Cn0KCi52aWRlby1qcyAudmpzLWN1cnJlbnQtdGltZSwKLnZqcy1uby1mbGV4IC52anMtY3VycmVudC10aW1lIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgovKiByZW1vdmUgdGhlIGRvdCBwcm9ncmVzcyBpbmRpY2F0b3IgKi8KLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzczpiZWZvcmUsCi52aWRlby1qcyAudmpzLXZvbHVtZS1sZXZlbDpiZWZvcmUsCi52anMtaWNvbi1jaXJjbGU6YmVmb3JlLAoudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IG5vbmU7Cn0KCi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE5JyBoZWlnaHQ9JzE0JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTguODI1LjMyNEEuNzUuNzUgMCAwMTkuMjUgMXYxMS42NjdhLjc1Ljc1IDAgMDEtMS4yMTkuNTg1bC0zLjk2LTMuMTY5SDFhLjc1Ljc1IDAgMDEtLjc1LS43NXYtNWEuNzUuNzUgMCAwMS43NS0uNzVoMy4wN0w4LjAzMS40MTRhLjc1Ljc1IDAgMDEuNzk0LS4wOXpNNy43NSAyLjU2TDQuODAyIDQuOTJhLjc1Ljc1IDAgMDEtLjQ2OS4xNjRIMS43NXYzLjVoMi41ODNhLjc1Ljc1IDAgMDEuNDY5LjE2NWwyLjk0OCAyLjM1OFYyLjU2ek0xNC45MTEuNDdhLjc1Ljc1IDAgMDExLjA2MSAwIDkuMDg0IDkuMDg0IDAgMDEwIDEyLjg0NC43NS43NSAwIDAxLTEuMDYtMS4wNiA3LjU4NCA3LjU4NCAwIDAwMC0xMC43MjQuNzUuNzUgMCAwMTAtMS4wNnpNMTEuOTcgMy40MWEuNzUuNzUgMCAwMTEuMDYgMCA0LjkxNyA0LjkxNyAwIDAxMCA2Ljk1My43NS43NSAwIDExLTEuMDYtMS4wNiAzLjQxNyAzLjQxNyAwIDAwMC00LjgzMi43NS43NSAwIDAxMC0xLjA2eicgZmlsbD0nJTIzMjYyMTM2Jy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTAgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxOScgaGVpZ2h0PScxNCcgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTguNSAxLjE2N0w0LjMzMyA0LjVIMXY1aDMuMzMzTDguNSAxMi44MzNWMS4xNjd6TTE3LjE3IDQuNWwtNSA1TTEyLjE3IDQuNWw1IDUnIHN0cm9rZT0nJTIzMjYyMTM2JyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTEgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxOScgaGVpZ2h0PScxNCcgdmlld0JveD0nMCAwIDE5IDE0JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTguODI0ODkgMC4zMjQwM0M5LjA4NDc0IDAuNDQ4OTIgOS4yNSAwLjcxMTcwMyA5LjI1IDEuMDAwMDFWMTIuNjY2N0M5LjI1IDEyLjk1NSA5LjA4NDc0IDEzLjIxNzggOC44MjQ4OSAxMy4zNDI3QzguNTY1MDQgMTMuNDY3NSA4LjI1NjYxIDEzLjQzMjQgOC4wMzE0OCAxMy4yNTIzTDQuMDcwMjUgMTAuMDgzM0gxQzAuNTg1Nzg2IDEwLjA4MzMgMC4yNSA5Ljc0NzU1IDAuMjUgOS4zMzMzNFY0LjMzMzM0QzAuMjUgMy45MTkxMyAwLjU4NTc4NiAzLjU4MzM0IDEgMy41ODMzNEg0LjA3MDI1TDguMDMxNDggMC40MTQzNTVDOC4yNTY2MSAwLjIzNDI1MyA4LjU2NTA0IDAuMTk5MTQgOC44MjQ4OSAwLjMyNDAzWk03Ljc1IDIuNTYwNDhMNC44MDE4NSA0LjkxODk5QzQuNjY4ODcgNS4wMjUzOCA0LjUwMzY0IDUuMDgzMzQgNC4zMzMzMyA1LjA4MzM0SDEuNzVWOC41ODMzNEg0LjMzMzMzQzQuNTAzNjQgOC41ODMzNCA0LjY2ODg3IDguNjQxMyA0LjgwMTg1IDguNzQ3NjlMNy43NSAxMS4xMDYyVjIuNTYwNDhaJyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQy9zdmclM0UlMEEiKTsKfQoKLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE5JyBoZWlnaHQ9JzE0JyB2aWV3Qm94PScwIDAgMTkgMTQnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGwtcnVsZT0nZXZlbm9kZCcgY2xpcC1ydWxlPSdldmVub2RkJyBkPSdNOC44MjQ4OSAwLjMyNDAzQzkuMDg0NzQgMC40NDg5MiA5LjI1IDAuNzExNzAzIDkuMjUgMS4wMDAwMVYxMi42NjY3QzkuMjUgMTIuOTU1IDkuMDg0NzQgMTMuMjE3OCA4LjgyNDg5IDEzLjM0MjdDOC41NjUwNCAxMy40Njc1IDguMjU2NjEgMTMuNDMyNCA4LjAzMTQ4IDEzLjI1MjNMNC4wNzAyNSAxMC4wODMzSDFDMC41ODU3ODYgMTAuMDgzMyAwLjI1IDkuNzQ3NTUgMC4yNSA5LjMzMzM0VjQuMzMzMzRDMC4yNSAzLjkxOTEzIDAuNTg1Nzg2IDMuNTgzMzQgMSAzLjU4MzM0SDQuMDcwMjVMOC4wMzE0OCAwLjQxNDM1NUM4LjI1NjYxIDAuMjM0MjUzIDguNTY1MDQgMC4xOTkxNCA4LjgyNDg5IDAuMzI0MDNaTTcuNzUgMi41NjA0OEw0LjgwMTg1IDQuOTE4OTlDNC42Njg4NyA1LjAyNTM4IDQuNTAzNjQgNS4wODMzNCA0LjMzMzMzIDUuMDgzMzRIMS43NVY4LjU4MzM0SDQuMzMzMzNDNC41MDM2NCA4LjU4MzM0IDQuNjY4ODcgOC42NDEzIDQuODAxODUgOC43NDc2OUw3Ljc1IDExLjEwNjJWMi41NjA0OFonIGZpbGw9JyUyMzI2MjEzNicvJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTExLjk2OTggMy40MTEyNEMxMi4yNjI3IDMuMTE4MzkgMTIuNzM3NiAzLjExODQ2IDEzLjAzMDQgMy40MTE0QzEzLjk1MjEgNC4zMzM0MSAxNC40Njk5IDUuNTgzNzYgMTQuNDY5OSA2Ljg4NzQ4QzE0LjQ2OTkgOC4xOTEyMSAxMy45NTIxIDkuNDQxNTYgMTMuMDMwNCAxMC4zNjM2QzEyLjczNzYgMTAuNjU2NSAxMi4yNjI3IDEwLjY1NjYgMTEuOTY5OCAxMC4zNjM3QzExLjY3NjggMTAuMDcwOSAxMS42NzY3IDkuNTk2IDExLjk2OTYgOS4zMDMwN0MxMi42MTAxIDguNjYyMzUgMTIuOTY5OSA3Ljc5MzQ2IDEyLjk2OTkgNi44ODc0OEMxMi45Njk5IDUuOTgxNTEgMTIuNjEwMSA1LjExMjYyIDExLjk2OTYgNC40NzE5QzExLjY3NjcgNC4xNzg5NiAxMS42NzY4IDMuNzA0MDkgMTEuOTY5OCAzLjQxMTI0WicgZmlsbD0nJTIzMjYyMTM2Jy8lM0UlM0Mvc3ZnJTNFJTBBIik7Cn0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1jb250cm9sOmhvdmVyIC52anMtbW91c2UtZGlzcGxheSB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKfQoKLyogcG9zaXRpb24gdmlkZW8gcGxheWVyIGluc2lkZSB0aGUgY29udGFpbmVyICovCi52aWRlby1qcyAudmpzLXRlY2ggewogIHBvc2l0aW9uOiBzdGF0aWM7Cn0KCi52aWRlby1qcyAudmpzLXRpbWUtdG9vbHRpcCB7CiAgcGFkZGluZzogMC4yNWVtIDAuNzVlbTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGNvbG9yOiAjMzMzOwogIGJhY2tncm91bmQ6ICNGQ0ZDRkQ7CiAgYm9yZGVyLXJhZGl1czogOTlweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgYm9yZGVyOiAxcHggc29saWQgI0UwRTBFQjsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgdG9wOiAtMjVweDsKICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDsKICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CgoudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzLnZqcy1zbGlkZXItYmFyIC52anMtdGltZS10b29sdGlwIHsKICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbCAudmpzLW1vdXNlLWRpc3BsYXkgewogIHotaW5kZXg6IDI7Cn0KCi51bC12aWRlby1wbGF5ZXIgewogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBoZWlnaHQ6IGF1dG87CiAgYm9yZGVyOiAxcHggc29saWQgI0U2RTZFNjsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBiYWNrZ3JvdW5kLWNsaXA6IGJvcmRlci1ib3g7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnZpZGVvLWpzLnZqcy1mdWxsc2NyZWVuOm5vdCgudmpzLWlvcy1uYXRpdmUtZnMpIHsKICBib3JkZXI6IG5vbmU7Cn0KCiN1bC1jYXJkLXZpZGVvX19wbGF5ZXJfcmVjb3JkZXItdmlkZW8tcmVjb3JkZXIudmpzLWZ1bGxzY3JlZW4gewogIGRpc3BsYXk6IHRhYmxlOwp9CgoudmlkZW8tanMgZGl2LnZqcy1wcm9ncmVzcy1jb250cm9sIHsKICBtYXJnaW4tdG9wOiAtM3B4Owp9CgoudmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtc2xpZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjJCQkJEOwp9CgoudmpzLXJlY29yZC52aWRlby1qcyAudmpzLWNvbnRyb2wudmpzLWJ1dHRvbi52anMtZnVsbHNjcmVlbi1jb250cm9sIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKfQoKLyogZml4IGEgc3VidGxlIG1pc2FsaWdubWVudCBidWcgb24gY2lyY3VsYXIgcGxheSBjb250cm9sIGJ1dHRvbnMgKi8KLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCAycHgpOwogIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCA1cHgpOwp9CgoudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wudmpzLXBsYXlpbmcgPiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMnB4KTsKICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNHB4KTsKfQoKLyogZml4IG9wcG9zaXRlIG1pc2FsaWdubWVudCBidWcgb24gbm9uY2lyY3VsYXIgYnV0dG9ucyAqLwoudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwp9CgoudmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNOS44MjE0MyAyLjU0MDA0TDEyLjI2MTQgMi41NDAwNEMxMi45MjQyIDIuNTQwMDQgMTMuNDYxNCAzLjA3NzMgMTMuNDYxNCAzLjc0MDA0TDEzLjQ2MTQgNi4xODAwNCcgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDcGF0aCBkPSdNNi4xNzk1NSAxMy40NkwzLjczOTU1IDEzLjQ2QzMuMDc2ODEgMTMuNDYgMi41Mzk1NSAxMi45MjI3IDIuNTM5NTUgMTIuMjZMMi41Mzk1NSA5LjgxOTk2JyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J00xMi43NzcyIDMuMjIyNjZMOS4zNjQ3NSA2LjYzNTE2JyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J002LjI5NDM0IDkuNzA2MDVMMi44ODE4NCAxMy4xMTg2JyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcy52anMtZnVsbHNjcmVlbiAudmpzLWZ1bGxzY3JlZW4tY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNMS41ODMgOS44MTNINS4yNWExIDEgMCAwMTEgMXYzLjY2Nk01LjM3NSAxMC42ODhMMSAxNS4wNjFNMTQuOTE3IDUuODEzSDExLjI1YTEgMSAwIDAxLTEtMVYxLjE0Nk0xNS4wNjMgMWwtNC4zNzYgNC4zNzUnIHN0cm9rZT0nJTIzMjYyMTM2JyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtZW5kZWQgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtaWNvbi1yZXBsYXk6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyB2aWV3Qm94PScwIDAgMTIgMTInIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGQ9J00xMC41MzYzIDYuNDAyMjZMMS45Mzk1OCAxMC43MDA2QzEuNjQwMzcgMTAuODUwMiAxLjI4ODMzIDEwLjYzMjYgMS4yODgzMyAxMC4yOTgxVjEuNzAxNEMxLjI4ODMzIDEuMzY2ODggMS42NDAzNyAxLjE0OTMxIDEuOTM5NTggMS4yOTg5MUwxMC41MzYzIDUuNTk3MjdDMTAuODY4IDUuNzYzMTEgMTAuODY4IDYuMjM2NDIgMTAuNTM2MyA2LjQwMjI2Wicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRSIpOwp9CgoudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wudmpzLXBsYXlpbmcgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZqcy1pY29uLXBhdXNlOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcmVjdCB4PSczLjYxODg1JyB5PScyLjA2MDc0JyB3aWR0aD0nMy4xNjE4NScgaGVpZ2h0PScxMS44OCcgcng9JzAuOScgZmlsbD0nYmxhY2snIHN0cm9rZT0nJTIzRURFREVEJyBzdHJva2Utd2lkdGg9JzAuNicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0NyZWN0IHg9JzkuMjE3OTcnIHk9JzIuMDYwNzQnIHdpZHRoPSczLjE2MTg1JyBoZWlnaHQ9JzExLjg4JyByeD0nMC45JyBmaWxsPSdibGFjaycgc3Ryb2tlPSclMjNFREVERUQnIHN0cm9rZS13aWR0aD0nMC42JyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0UlMEEiKTsKICBwYWRkaW5nOiAycHg7Cn0KCi52anMtZXJyb3ItZGlzcGxheSB7CiAgZGlzcGxheTogbm9uZTsKfQoKLnVsLXZpZGVvLXBsYXllci12aWRlbyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHRvcDogMDsKICBsZWZ0OiAwOwogIHdpZHRoOiAxMDAlOwp9CgoudWwtdmlkZW8tY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IGF1dG87CiAgbGVmdDogMHB4OwogIHRvcDogMHB4OwoKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogIGJvcmRlci1yYWRpdXM6IDRweDsKCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CgogIC8qIEluc2lkZSBBdXRvIExheW91dCAqLwoKICBmbGV4OiBub25lOwogIG9yZGVyOiAwOwogIGZsZXgtZ3JvdzogMDsKICBtYXJnaW46IDEwcHggMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLnZqcy1yZWNvcmQgYnV0dG9uLnZqcy1kZXZpY2UtYnV0dG9uLnZqcy1jb250cm9sIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDk2KTsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsICJBcHBsZSBDb2xvciBFbW9qaSIsICJTZWdvZSBVSSBFbW9qaSIsICJTZWdvZSBVSSBTeW1ib2wiOwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICBsZWZ0OiAwOwogIHRvcDogMDsKICBtYXJnaW46IDA7CiAgYm9yZGVyLXJhZGl1czogMDsKICBsaW5lLWhlaWdodDogMC42OwogIHBhZGRpbmc6IDEwcHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgei1pbmRleDogMzsKfQoKLnZqcy1yZWNvcmQgLnZqcy1kZXZpY2UtYnV0dG9uLnZqcy1jb250cm9sOmJlZm9yZSB7CiAgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMzMzM7CiAgY29udGVudDogIllvdXIgYnJvd3NlciBuZWVkcyB0byBhY2Nlc3MgeW91ciBjYW1lcmEgYW5kIG1pY3JvcGhvbmUgZm9yIHZpZGVvIHJlY29yZGluZyI7CiAgbGluZS1oZWlnaHQ6IDEzNSU7Cn0KCi52anMtcmVjb3JkIC52anMtZGV2aWNlLWJ1dHRvbi52anMtY29udHJvbC5wZXJtaXNzaW9uLWRlbmllZDpiZWZvcmUgewogIGZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OwogIGNvbG9yOiAjMjYyMTM2OwogIGNvbnRlbnQ6ICJVbmFibGUgdG8gYWNjZXNzIHlvdXIgY2FtZXJhIGFuZCBtaWNyb3Bob25lIjsKfQoKLnZqcy1yZWNvcmQgLnZqcy1kZXZpY2UtYnV0dG9uLnZqcy1jb250cm9sOmFmdGVyIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgYmFja2dyb3VuZDogI0YwRjBGNTsKICBmb250LXNpemU6IDEzcHg7CiAgYm9yZGVyLXJhZGl1czogNHB4OwogIGNvbnRlbnQ6ICJSZXF1ZXN0IFBlcm1pc3Npb25zIjsKICBwYWRkaW5nOiAxZW0gMmVtOwogIGNvbG9yOiAjMzMzOwogIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi52anMtcmVjb3JkIC52anMtZGV2aWNlLWJ1dHRvbi52anMtY29udHJvbC5wZXJtaXNzaW9uLWRlbmllZDphZnRlciB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGJhY2tncm91bmQ6IHdoaXRlOwogIGZvbnQtc2l6ZTogMTNweDsKICBjb250ZW50OiAiUGxlYXNlIGdvIHRvIHlvdXIgYnJvd3NlciBzZXR0aW5ncyBhbmQgdXBkYXRlIHBlcm1pc3Npb25zIHRvIGVuYWJsZSByZWNvcmRpbmciOwogIHBhZGRpbmc6IDFlbTsKICBjb2xvcjogIzRCNTc1RDsKICBtYXJnaW46IDVweDsKICBsaW5lLWhlaWdodDogMTM1JTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLWRlbGV0ZS1idXR0b24sIC52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLXRvZ2dsZS1idXR0b24sIC52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uLWF1ZGlvLW9ubHksIC52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIHsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi51bC12aWRlby1yZWNvcmRlci1kZWxldGUtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHZpZXdCb3g9JzAgMCAxNiAxNicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTkuMjEyMzQgNy4zNzU0OVYxMS4xMTkzTTIuNTM5MzEgNC4yNTU5NUgxMy40NTkzSDIuNTM5MzFaTTUuNTcyMzQgNC4yNTU5NVYzLjAwODMzQzUuNTcyMjIgMi44NDQzMyA1LjYwMzU0IDIuNjgxOTIgNS42NjQ1IDIuNTMwMzhDNS43MjU0NiAyLjM3ODg0IDUuODE0ODggMi4yNDExNSA1LjkyNzYyIDIuMTI1MTlDNi4wNDAzNyAyLjAwOTIyIDYuMTc0MjQgMS45MTcyNiA2LjMyMTU4IDEuODU0NTZDNi40Njg5MiAxLjc5MTg1IDYuNjI2ODMgMS43NTk2NCA2Ljc4NjI4IDEuNzU5NzdIOS4yMTIzNEM5LjM3MTc5IDEuNzU5NjQgOS41Mjk3IDEuNzkxODUgOS42NzcwMyAxLjg1NDU2QzkuODI0MzcgMS45MTcyNiA5Ljk1ODI0IDIuMDA5MjIgMTAuMDcxIDIuMTI1MTlDMTAuMTgzNyAyLjI0MTE1IDEwLjI3MzIgMi4zNzg4NCAxMC4zMzQxIDIuNTMwMzhDMTAuMzk1MSAyLjY4MTkyIDEwLjQyNjQgMi44NDQzMyAxMC40MjYzIDMuMDA4MzNWNC4yNTU5NUg1LjU3MjM0Wk0xMi4yNDYzIDQuMjU1OTVWMTIuOTkxMkMxMi4yNDYzIDEzLjMyMjMgMTIuMTE4NCAxMy42Mzk5IDExLjg5MDcgMTMuODc0MUMxMS42NjMxIDE0LjEwODIgMTEuMzU0MyAxNC4yMzk4IDExLjAzMjMgMTQuMjM5OEg0Ljk2NjI4QzQuNjQ0MzIgMTQuMjM5OCA0LjMzNTU1IDE0LjEwODIgNC4xMDc4OSAxMy44NzQxQzMuODgwMjMgMTMuNjM5OSAzLjc1MjM0IDEzLjMyMjMgMy43NTIzNCAxMi45OTEyVjQuMjU1OTVIMTIuMjQ2M1pNNi43ODYyOCA3LjM3NTQ5VjExLjExOTNWNy4zNzU0OVonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0UlMEEiKTsKfQoKLnVsLXZpZGVvLXJlY29yZGVyLXRvZ2dsZS1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNOCAwQzEyLjQxODMgMCAxNiAzLjU4MTcyIDE2IDhDMTYgMTIuNDE4MyAxMi40MTgzIDE2IDggMTZDMy41ODE3MiAxNiAwIDEyLjQxODMgMCA4QzAgMy41ODE3MiAzLjU4MTcyIDAgOCAwWicgZmlsbD0nJTIzRDE1MTUzJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi51bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uLnVsLXJlY29yZGluZy1pbi1zZXNzaW9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHZpZXdCb3g9JzAgMCAxMiAxMicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTEyIDEwTDEyIDJDMTIgMC44OTU0MyAxMS4xMDQ2IC00Ljg1Mzk2ZS0wNyAxMCAtNC4zNzExNGUtMDdMMiAtOC43NDIyOGUtMDhDMC44OTU0MyAtMy45MTQwNWUtMDggLTQuODUzOTZlLTA3IDAuODk1NDMxIC00LjM3MTE0ZS0wNyAyTC04Ljc0MjI4ZS0wOCAxMEMtMy45MTQwNWUtMDggMTEuMTA0NiAwLjg5NTQzMSAxMiAyIDEyTDEwIDEyQzExLjEwNDYgMTIgMTIgMTEuMTA0NiAxMiAxMFonIGZpbGw9JyUyM0QxNTE1MycvJTNFJTNDL3N2ZyUzRSUwQSIpOwp9CgoudWwtdmlkZW8tcmVjb3JkZXItZGVsZXRlLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsIC51bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCA3cHgpOwogIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCA1cHgpOwp9CgoudWwtcmVjb3JkaW5nLWluLXNlc3Npb24udWwtdmlkZW8tcmVjb3JkZXItdG9nZ2xlLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNXB4KTsKfQoKLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCA3cHgpOwogIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCA2cHgpOwp9CgoudWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24tYXVkaW8tb25seSAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogc2NhbGUoMC43NSkgdHJhbnNsYXRlKDFweCwgOHB4KTsKICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC43NSkgdHJhbnNsYXRlKDFweCwgOHB4KTsKfQoKLyogZml4IGEgc3VidGxlIG1pc2FsaWdubWVudCBidWcgZm9yIGZ1bGwgc2NyZWVuIGJ1dHRvbnMgKi8KLnZqcy1mdWxsc2NyZWVuIC51bC1yZWNvcmRpbmctaW4tc2Vzc2lvbiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNnB4KTsKICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNnB4KTsKfQoKLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHZpZXdCb3g9JzAgMCAxNiAxNicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ2cgY2xpcC1wYXRoPSd1cmwoJTIzY2xpcDBfMjY0NV80NjU0KSclM0UlM0NwYXRoIGQ9J00xNS4xNDkxIDQuNzVMMTAuNTk5MSA4TDE1LjE0OTEgMTEuMjVWNC43NVonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQ3BhdGggZD0nTTkuMjk5MTIgMy40NTAySDIuMTQ5MTJDMS40MzExNSAzLjQ1MDIgMC44NDkxMjEgNC4wMzIyMyAwLjg0OTEyMSA0Ljc1MDJWMTEuMjUwMkMwLjg0OTEyMSAxMS45NjgyIDEuNDMxMTUgMTIuNTUwMiAyLjE0OTEyIDEyLjU1MDJIOS4yOTkxMkMxMC4wMTcxIDEyLjU1MDIgMTAuNTk5MSAxMS45NjgyIDEwLjU5OTEgMTEuMjUwMlY0Ljc1MDJDMTAuNTk5MSA0LjAzMjIzIDEwLjAxNzEgMy40NTAyIDkuMjk5MTIgMy40NTAyWicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL2clM0UlM0NkZWZzJTNFJTNDY2xpcFBhdGggaWQ9J2NsaXAwXzI2NDVfNDY1NCclM0UlM0NyZWN0IHdpZHRoPScxNS42JyBoZWlnaHQ9JzE1LjYnIGZpbGw9J3doaXRlJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgwLjE5OTk1MSAwLjIwMDE5NSknLyUzRSUzQy9jbGlwUGF0aCUzRSUzQy9kZWZzJTNFJTNDL3N2ZyUzRSIpOwp9CgoudWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24tYXVkaW8tb25seSAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzIyJyBoZWlnaHQ9JzE1JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTS43NSAzQTIuNzUgMi43NSAwIDAxMy41LjI1aDkuMDgxQTIuNzUgMi43NSAwIDAxMTUuMzMxIDN2OWEyLjc1IDIuNzUgMCAwMS0yLjc1IDIuNzVIMy41QTIuNzUgMi43NSAwIDAxLjc1IDEyVjN6TTMuNSAxLjc1Yy0uNjkgMC0xLjI1LjU2LTEuMjUgMS4yNXY5YzAgLjY5LjU2IDEuMjUgMS4yNSAxLjI1aDkuMDgxYy42OSAwIDEuMjUtLjU2IDEuMjUtMS4yNVYzYzAtLjY5LS41Ni0xLjI1LTEuMjUtMS4yNUgzLjV6JyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBjbGlwLXJ1bGU9J2V2ZW5vZGQnIGQ9J00xNC41MyAyLjAzbC0xMiAxMi0xLjA2LTEuMDYgMTItMTIgMS4wNiAxLjA2ek0yMC44NyAxLjUyNWEuNzUuNzUgMCAwMS4zOC42NTJ2MTAuNTg4YS43NS43NSAwIDAxLTEuMTM0LjY0NGwtNS45Mi0zLjUzYS43NS43NSAwIDAxLS4zNjUtLjY0M3YtMy41M2EuNzUuNzUgMCAwMS4zNjYtLjY0NGw1LjkxOS0zLjUzYS43NS43NSAwIDAxLjc1NC0uMDA3em0tNS41MzkgNC42MDdWOC44MWw0LjQxOSAyLjYzNVYzLjQ5N2wtNC40MTkgMi42MzV6JyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQy9zdmclM0UiKTsKfQoKLnVsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbCB7CiAgcGFkZGluZzogMC4xNWVtIDAuNzVlbTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGZvbnQtc2l6ZTogMTJweDsKICBjb2xvcjogIzMzMzsKICBiYWNrZ3JvdW5kOiAjRkNGQ0ZEOwogIGJvcmRlci1yYWRpdXM6IDk5cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGJvcmRlcjogMXB4IHNvbGlkICNFMEUwRUI7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDc1cHg7CiAgbGVmdDogY2FsYyg1MCUgLSA2NXB4KTsKICB3aWR0aDogMTMwcHg7CiAgei1pbmRleDogNTsKfQoKLnVsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbF9fdGltZSB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgbWFyZ2luLWxlZnQ6IDAuOGVtOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi51bC11cGxvYWQtcHJvZ3Jlc3MtbGFiZWxfX3RpbWU6YmVmb3JlIHsKICBjb250ZW50OiAiIjsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICB3aWR0aDogMXB4OwogIGhlaWdodDogMTJweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTBFMEVCOwogIG1hcmdpbi1yaWdodDogMC44ZW07Cn0KCkBrZXlmcmFtZXMgZ3JvdyB7CiAgMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUVDRkM7CiAgfQogIDUwJSAgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0UxREZGNDsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUNGQzsKICB9Cn0KCi51bC1hdWRpby1yZWNvcmRlci1wbGFjZWhvbGRlcjpiZWZvcmUgewogIHdpZHRoOiA4MHB4OwogIGhlaWdodDogODBweDsKICBib3JkZXItcmFkaXVzOiAxMjBweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFQ0ZDOwogIGNvbnRlbnQ6ICIiOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiBjYWxjKDUwJSAtIDQwcHgpOwogIHRvcDogY2FsYyg1MCUgLSA0MHB4KTsKICBhbmltYXRpb246IDZzIGluZmluaXRlIGdyb3c7CiAgdHJhbnNmb3JtLW9yaWdpbjogNTAlIDYwJTsKfQoKLnVsLWF1ZGlvLXJlY29yZGVyLXBsYWNlaG9sZGVyOmFmdGVyIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9Jzk4JyBoZWlnaHQ9Jzk4JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDbWFzayBpZD0nYScgbWFza1VuaXRzPSd1c2VyU3BhY2VPblVzZScgeD0nMCcgeT0nMCcgd2lkdGg9Jzk4JyBoZWlnaHQ9Jzk4JyUzRSUzQ2NpcmNsZSBjeD0nNDknIGN5PSc0OScgcj0nNDknIGZpbGw9JyUyM0VERUNGOCcvJTNFJTNDL21hc2slM0UlM0NnIG1hc2s9J3VybCglMjNhKSclM0UlM0NjaXJjbGUgY3g9JzQ5JyBjeT0nNDknIHI9JzUwJyBmaWxsPSclMjM2NDVDQzInLyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBjbGlwLXJ1bGU9J2V2ZW5vZGQnIGQ9J00xMS40MjIgODEuODEyYzUuNDA1LTE1LjU0NyAyMC4xODctMjYuNzA2IDM3LjU3Ni0yNi43MDYgMTcuMzkgMCAzMi4xNzIgMTEuMTU5IDM3LjU3NyAyNi43MDctOS4xNjQgMTAuNDMtMjIuNjAxIDE3LjAxMy0zNy41NzYgMTcuMDEzLTE0Ljk3NiAwLTI4LjQxNC02LjU4My0zNy41NzctMTcuMDE0eicgZmlsbD0nJTIzZmZmJyBmaWxsLW9wYWNpdHk9Jy42Jy8lM0UlM0NjaXJjbGUgY3g9JzQ5JyBjeT0nMjknIHI9JzE3JyBmaWxsPSclMjNmZmYnIGZpbGwtb3BhY2l0eT0nLjcnLyUzRSUzQy9nJTNFJTNDL3N2ZyUzRSIpOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiA1MCU7CiAgdG9wOiA1MCU7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMC42KTsKfQoKLnVsLWF1ZGlvLXJlY29yZGVyLXBsYWNlaG9sZGVyIHsKICBtaW4taGVpZ2h0OiAxNTBweDsKICB3aWR0aDogMTAwJTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZkOwogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLnZqcy1mdWxsc2NyZWVuIC51bC1hdWRpby1yZWNvcmRlci1wbGFjZWhvbGRlciB7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9CgpAa2V5ZnJhbWVzIGdyb3cgewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFQ0ZDOwogIH0KICA1MCUgIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFMURGRjQ7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUVDRkM7CiAgfQp9CgoudmpzLWZ1bGxzY3JlZW4gLnVsLWNvbnRyb2wtcGFuZWwgewogIGhlaWdodDogODBweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgd2lkdGg6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIGJhY2tncm91bmQtY29sb3I6ICNGOEY4Rjg7Cn0KCi51bC1idXR0b25zLXBhbmVsIHsKICBtYXJnaW46IDEwcHg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi52anMtcGxheWJhY2stcmF0ZSAudmpzLXBsYXliYWNrLXJhdGUtdmFsdWUgewogIGZvbnQtc2l6ZTogMTJweDsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAzcHgpOwp9CgoudmpzLXBsYXliYWNrLXJhdGUgLnZqcy1tZW51IHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNnB4LCAxMnB4KTsKICBwb3NpdGlvbjogdW5zZXQ7Cn0KCi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IHsKICBtYXJnaW4tYm90dG9tOiB1bnNldDsKfQoKLnZqcy1tZW51IGxpIHsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogNXB4IDA7Cn0KCi52anMtbWVudSBsaS52anMtc2VsZWN0ZWQgewogIGNvbG9yOiBsaWdodGdyYXk7Cn0KCi52anMtbWVudSBsaS52anMtbWVudS1pdGVtOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpOwp9CgoudmpzLWZ1bGxzY3JlZW4gLnVsLWJ1dHRvbnMtcGFuZWwgewogIHRvcDogY2FsYyg1MCUgLSAzMHB4KTsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi52anMtZnVsbHNjcmVlbiAudmpzLXJlY29yZC1pbmRpY2F0b3IudmpzLWNvbnRyb2wgewogIGJvdHRvbTogOTBweCAhaW1wb3J0YW50Owp9CgoudmpzLXJlY29yZC52aWRlby1qcyBkaXYudmpzLWNvbnRyb2wudmpzLXJlY29yZC1pbmRpY2F0b3IgewogIHBhZGRpbmc6IDAuM2VtIDAuNzVlbSAwLjE1ZW0gMTVweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGZvbnQtc2l6ZTogMTJweDsKICBjb2xvcjogIzMzMzsKICBiYWNrZ3JvdW5kOiAjRkNGQ0ZEOwogIGJvcmRlci1yYWRpdXM6IDk5cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGJvcmRlcjogMXB4IHNvbGlkICNFMEUwRUI7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDc1cHg7CiAgdG9wOiBhdXRvOwogIGxlZnQ6IGNhbGMoNTAlIC0gMjFweCk7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxNnB4OwogIHotaW5kZXg6IDQ7Cn0KCi52anMtcmVjb3JkLnZpZGVvLWpzIGRpdi52anMtY29udHJvbC52anMtcmVjb3JkLWluZGljYXRvcjphZnRlciB7CiAgY29udGVudDogIiI7CiAgYmFja2dyb3VuZC1jb2xvcjogI0VCNTc1NzsKICB3aWR0aDogNnB4OwogIGhlaWdodDogNnB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBhbmltYXRpb246IG5vbmU7CiAgdG9wOiA0cHg7CiAgbGVmdDogNXB4Owp9CgoudmpzLXJlY29yZC52aWRlby1qcyBkaXYudmpzLWNvbnRyb2wudmpzLXJlY29yZC1pbmRpY2F0b3I6YmVmb3JlIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgZm9udC1zaXplOiA5cHg7CiAgYW5pbWF0aW9uOiBub25lOwogIG9wYWNpdHk6IDE7CiAgY29sb3I6ICMzMzM7CiAgdG9wOiBhdXRvOwogIGxlZnQ6IGF1dG87Cn0KCi51bC12aWRlby1wbGF5ZXItbG9hZGluZyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aWR0aDogNnJlbTsKICBoZWlnaHQ6IDZyZW07Cgp9Ci51bC12aWRlby1wbGF5ZXItbG9hZGluZyBkaXYgewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiA4MCU7CiAgaGVpZ2h0OiA4MCU7CiAgbWFyZ2luOiA1cHg7CiAgYm9yZGVyOiA1cHggc29saWQgIzY2NjsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgYW5pbWF0aW9uOiBsZHMtcmluZyAxLjJzIGN1YmljLWJlemllcigwLjUsIDAsIDAuNSwgMSkgaW5maW5pdGU7CiAgYm9yZGVyLWNvbG9yOiAjNjY2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50Owp9CgouZmlyc3QgewogIGFuaW1hdGlvbi1kZWxheTogLTAuNDVzOwp9Ci5zZWNvbmQgewogIGFuaW1hdGlvbi1kZWxheTogLTAuM3M7Cn0KLnRoaXJkIHsKICBhbmltYXRpb24tZGVsYXk6IC0wLjE1czsKfQoKQGtleWZyYW1lcyBsZHMtcmluZyB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KCi51bC12aWRlby1idG4gewogIHdpZHRoOiAxMDAlOwogIGJvcmRlcjogMXB4IHNvbGlkICNFNkU2RTY7CiAgYm9yZGVyLXJhZGl1czogNHB4OwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wMik7CiAgcGFkZGluZzogOHB4OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgZm9udC1zaXplOiAxNXB4Owp9CgoudWwtcmVjb3JkLXJlc3BvbnNlLWJ0bjpiZWZvcmUsIC51bC1yZWNvcmQtcmVzcG9uc2UtYnRuOmFmdGVyLCAudWwtYmFjay1xdWVzdGlvbi1idG46YmVmb3JlLCAudWwtYmFjay1xdWVzdGlvbi1idG46YWZ0ZXIgewogIG1hcmdpbjogMCA1cHg7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnVsLXJlY29yZC1yZXNwb25zZS1idG46YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NnIGNsaXAtcGF0aD0ndXJsKCUyM2NsaXAwXzI2NDVfNDY1NCknJTNFJTNDcGF0aCBkPSdNMTUuMTQ5MSA0Ljc1TDEwLjU5OTEgOEwxNS4xNDkxIDExLjI1VjQuNzVaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J005LjI5OTEyIDMuNDUwMkgyLjE0OTEyQzEuNDMxMTUgMy40NTAyIDAuODQ5MTIxIDQuMDMyMjMgMC44NDkxMjEgNC43NTAyVjExLjI1MDJDMC44NDkxMjEgMTEuOTY4MiAxLjQzMTE1IDEyLjU1MDIgMi4xNDkxMiAxMi41NTAySDkuMjk5MTJDMTAuMDE3MSAxMi41NTAyIDEwLjU5OTEgMTEuOTY4MiAxMC41OTkxIDExLjI1MDJWNC43NTAyQzEwLjU5OTEgNC4wMzIyMyAxMC4wMTcxIDMuNDUwMiA5LjI5OTEyIDMuNDUwMlonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9nJTNFJTNDZGVmcyUzRSUzQ2NsaXBQYXRoIGlkPSdjbGlwMF8yNjQ1XzQ2NTQnJTNFJTNDcmVjdCB3aWR0aD0nMTUuNicgaGVpZ2h0PScxNS42JyBmaWxsPSd3aGl0ZScgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMC4xOTk5NTEgMC4yMDAxOTUpJy8lM0UlM0MvY2xpcFBhdGglM0UlM0MvZGVmcyUzRSUzQy9zdmclM0UiKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAycHgpOwp9CgoudWwtcmVjb3JkLXJlc3BvbnNlLWJ0bjphZnRlciB7CiAgY29udGVudDogJ1JlY29yZCB5b3VyIFJlc3BvbnNlJzsKfQoKLnVsLWJhY2stcXVlc3Rpb24tYnRuOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNScgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE1IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNMTMuODc1NyA4LjIyMzYxTDEuMTExOCAxNC42MDU2QzAuOTQ1NTc4IDE0LjY4ODcgMC43NSAxNC41Njc4IDAuNzUgMTQuMzgyVjEuNjE4MDNDMC43NSAxLjQzMjE5IDAuOTQ1NTc5IDEuMzExMzEgMS4xMTE4IDEuMzk0NDNMMTMuODc1NyA3Ljc3NjM5QzE0LjA2IDcuODY4NTIgMTQuMDYgOC4xMzE0OCAxMy44NzU3IDguMjIzNjFaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHRyYW5zZm9ybTogc2NhbGUoMC44NSkgdHJhbnNsYXRlKDAsIDFweCk7CiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuODUpIHRyYW5zbGF0ZSgwLCAycHgpOwp9CgoudWwtYmFjay1xdWVzdGlvbi1idG46YWZ0ZXIgewogIGNvbnRlbnQ6ICdCYWNrIHRvIFF1ZXN0aW9uJzsKfQoKLmhpZGRlbiB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogIG9wYWNpdHk6IDA7CiAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoudmlzaWJsZSB7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBvcGFjaXR5OiAxOwogIGFuaW1hdGlvbjogZmFkZSAwLjNzOwp9CgpAa2V5ZnJhbWVzIGZhZGUgewogIDAlIHsKICAgICAgb3BhY2l0eTogMDsKICB9CgogIDEwMCUgewogICAgICBvcGFjaXR5OiAxOwogIH0KfQoKI3VsLXJlY29yZGluZy1jb3VudGRvd24tc2NyZWVuIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgY29sb3I6IGJsYWNrOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtc2l6ZTogMTVweDsKICB6LWluZGV4OiAxOwogIGRpc3BsYXk6IHRhYmxlOwp9CgoudWwtY291bnRkb3duLXRleHQgewogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgZGlzcGxheTogdGFibGUtY2VsbDsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjVweCk7Cn0KCi52anMtZnVsbHNjcmVlbiA+ICN1bC1yZWNvcmRpbmctY291bnRkb3duLXNjcmVlbiB7CiAgZm9udC1zaXplOiAyNXB4OwogIHRyYW5zZm9ybTogdW5zZXQ7Cn0KCi52anMtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCiN1bC1TcGVlZCB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMzVweCk7Cn0KCi52anMtcG9zdGVyIHsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB1bnNldDsKfQpgOwoKY29uc3Qgc3Bpbm5lciA9IChwbGF5ZXJJZCkgPT4gewogIGNvbnN0IHNwaW5uZXJDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICBzcGlubmVyQ29udGFpbmVyLmNsYXNzTmFtZSA9ICd1bC12aWRlby1wbGF5ZXItbG9hZGluZyc7CiAgc3Bpbm5lckNvbnRhaW5lci5pZCA9IGdldFNwaW5uZXJJZChwbGF5ZXJJZCk7CiAgWydmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnLCAnZm91cnRoJ10ubWFwKChkaXZOYW1lKSA9PiB7CiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGRpdk5hbWU7CiAgICBzcGlubmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpOwogIH0pOwogIHJldHVybiBzcGlubmVyQ29udGFpbmVyOwp9Owpjb25zdCBnZXRTcGlubmVySWQgPSAocGxheWVySWQpID0+IHsKICByZXR1cm4gcGxheWVySWQgKyAnLWxvYWRpbmctc3BpbmVyJzsKfTsKCmNvbnN0IEhJRERFTl9DTEFTUyA9ICdoaWRkZW4nOwpjb25zdCBWSVNJQkxFX0NMQVNTID0gJ3Zpc2libGUnOwoKY29uc3QgQ0FNRVJBX09GRl9CVVRUT05fQ0xBU1MgPSAndWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24nOwpjb25zdCBSRUNPUkRJTkdfSU5fU0VTU0lPTiA9ICd1bC1yZWNvcmRpbmctaW4tc2Vzc2lvbic7CmNvbnN0IHJlY29yZGVyU2NyaXB0cyA9IFsKICB7IHR5cGU6ICdsaW5rJywgY29udGVudDogYCR7Q0ROX0xJTkt9L2RlcGVuZGVuY2llcy92aWRlb2pzLXJlY29yZC00LjUuMC5taW4uY3NzYCB9LAogIHsgdHlwZTogJ3NjcmlwdCcsIGNvbnRlbnQ6IGAke0NETl9MSU5LfS9kZXBlbmRlbmNpZXMvUmVjb3JkUlRDLTUuNi4yLmpzYCB9LAogIHsgdHlwZTogJ3NjcmlwdCcsIGNvbnRlbnQ6IGAke0NETl9MSU5LfS9kZXBlbmRlbmNpZXMvYWRhcHRlci44LjAuMC5taW4uanNgIH0sCiAgeyB0eXBlOiAnc2NyaXB0JywgY29udGVudDogYCR7Q0ROX0xJTkt9L2RlcGVuZGVuY2llcy92aWRlb2pzLXJlY29yZC00LjUuMC5taW4uanNgIH0sCiAgeyB0eXBlOiAnc2NyaXB0JywgY29udGVudDogYCR7Q0ROX0xJTkt9L3VzZXJsZWFwLXdlYi11cGNodW5rLXYyLjIuMi5qc2AgfSwKXTsKY29uc3QgdmlkZW9QbGF5ZXJTY3JpcHRzID0gWwogIHsgdHlwZTogJ2xpbmsnLCBjb250ZW50OiBgJHtDRE5fTElOS30vZGVwZW5kZW5jaWVzL3ZpZGVvLWpzLTcuMTguMC5taW4uY3NzYCB9LAogIHsgdHlwZTogJ3NjcmlwdCcsIGNvbnRlbnQ6IGAke0NETl9MSU5LfS9kZXBlbmRlbmNpZXMvdmlkZW8tanMtNy4xOC4wLm1pbi5qc2AgfSwKICB7IHR5cGU6ICdzdHlsZScsIGNvbnRlbnQ6IHZpZGVvUGxheWVyQ3NzIH0sCl07CmNvbnN0IFZJREVPX1BMQVlFUl9QT1NURklYID0gJy12aWRlby1wbGF5ZXInOwpjb25zdCBWSURFT19SRUNPUkRFUl9QT1NURklYID0gJy12aWRlby1yZWNvcmRlcic7CmxldCB1cGxvYWQ7CmxldCBjdXJyZW50UGxheWVyU2Vzc2lvbjsKCi8qKgogKgogKiBAcGFyYW0ge0Vycm9yfSBlcnIgdGhlIGVycm9yIGJlaW5nIHJlcG9ydGVkCiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdGhlIGFjdGlvbiBkdXJpbmcgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkCiAqIEBwYXJhbSB7U3RyaW5nfSBhcGlCYXNlIGJhc2UgdXJsIGZvciB0aGUgYXBpIGNhbGxzIGRlZmF1bHQgaXMgcHJvZCBhcGkKICogQHBhcmFtIHsneC11bC12aWRlby1yZWNvcmRlci1vcmlnaW4nOiAnZGFzaGJvYXJkJyB8ICdzZGsnfSBoZWFkZXJzIHJlcXVlc3QgaGVhZGVycyBmb3IgZXJyb3IgbG9nZ2luZyAocG90ZW50aWFsbHkgY29udGFpbnMgYWRkaXRpb25hbCBoZWFkZXJzKQogKiBAcGFyYW0ge1N0cmluZ30gdmlzaXRvcklkIG9wdGlvbmFsCiAqIEBwYXJhbSB7U3RyaW5nfSBlbnZJZCBvcHRpb25hbAogKi8KY29uc3QgcmVwb3J0RXJyb3IgPSBhc3luYyAoZXJyLCBhY3Rpb24sIGFwaUJhc2UsIGhlYWRlcnMsIHZpc2l0b3JJZCwgZW52SWQpID0+IHsKICBjb25zdCBwZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgY29uc3QgbWV0YSA9IHsKICAgIHNjcmVlbldpZHRoOiB3aW5kb3cuc2NyZWVuLndpZHRoLAogICAgc2NyZWVuSGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmhlaWdodCwKICAgIGNsaWVudFdpZHRoOiBwZGUuY2xpZW50V2lkdGgsCiAgICBjbGllbnRIZWlnaHQ6IHBkZS5jbGllbnRIZWlnaHQsCiAgICBsb2NhdGlvbjogd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICBsYW5ndWFnZTogbmF2aWdhdG9yLmxhbmd1YWdlLAogIH07CiAgY29uc3QgYm9keSA9IHsKICAgIGFjdGlvbiwKICAgIGVycjogeyBtZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFjayB9LAogICAgbWV0YSwKICAgIHZpZDogdmlzaXRvcklkLAogICAgZW52SWQsCiAgfTsKCiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2goYCR7YXBpQmFzZX0vc2RrLzEvZXJyb3JzYCwgewogICAgbWV0aG9kOiAnUE9TVCcsCiAgICBjYWNoZTogJ25vLWNhY2hlJywKICAgIGhlYWRlcnM6IHsKICAgICAgLi4uaGVhZGVycywKICAgICAgJ3VzZXJsZWFwLXBsYXRmb3JtJzogJ3ZpZGVvX3JlY29yZGVyJywKICAgICAgJ3gtdWwtZXJyb3InOiB3aW5kb3cuYnRvYShgdXNlcmxlYXAtJHtEYXRlLm5vdygpfS1lcnJvcmApLAogICAgfSwKICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogIH0pOwoKICBpZiAoIXJlc3VsdC5vaykgewogICAgY29uc29sZS53YXJuKGBbVXNlckxlYXBdIChFUlItNDQ0KSBGYWlsZWQgdG8gcmVwb3J0IGVycm9yIHRvIEFQSWAsIGVycik7CiAgfQp9OwoKLyoqCiAqCiAqIEBwYXJhbSB7aHRtbCBlbGVtZW50fSBwYXJlbnRFbGVtZW50IHBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0aGUgY3JlYXRlZCBlbGVtZW50cwogKiBAcGFyYW0ge3t0eXBlLCBjb250ZW50fX0gc2NyaXB0RGF0YSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc2NyaXB0J3MgdHlwZSBhbmQgdGhlIGNvbnRlbnQKICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzY3JpcHQgaXMgbG9hZGVkCiAqLwpjb25zdCBsb2FkU2NyaXB0ID0gKHBhcmVudEVsZW1lbnQsIHsgdHlwZSwgY29udGVudCB9KSA9PiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgbGV0IGVsZW1lbnQ7CiAgICBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHsKICAgICAgLy8gcmVtb3RlIGpzCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgZWxlbWVudC5zcmMgPSBjb250ZW50OwogICAgfSBlbHNlIGlmICh0eXBlID09PSAnbGluaycpIHsKICAgICAgLy8gcmVtb3RlIHN0eWxlCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgIGVsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICBlbGVtZW50LmhyZWYgPSBjb250ZW50OwogICAgICBlbGVtZW50LnR5cGUgPSAndGV4dC9jc3MnOwogICAgfSBlbHNlIHsKICAgICAgLy8gbG9jYWwgc3R5bGUKICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudDsKICAgIH0KICAgIGVsZW1lbnQub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlc29sdmUoY29udGVudCk7CiAgICB9OwogICAgZWxlbWVudC5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlamVjdChjb250ZW50KTsKICAgIH07CiAgICBlbGVtZW50LmFzeW5jID0gZmFsc2U7CiAgICBlbGVtZW50LmlkID0gYnRvYShjb250ZW50KTsKICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CiAgfSk7Cn07CgovKioKICoKICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50RWxlbWVudCBwYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdGhlIGNyZWF0ZWQgZWxlbWVudHMKICogQHBhcmFtIHtbe3R5cGU6IFN0cmluZywgY29udGVudDogVVJJIFN0cmluZ31dfSBzY3JpcHRzIChvcHRpb25hbCkgYWRkaXRpb25hbCBzY3JpcHRzIHRvIGFkZCB0byB0aGUgbG9hZCBxdWV1ZQogKiBAcGFyYW0geygpPT57fX0gb25sb2FkQ2FsbGJhY2sgKG9wdGlvbmFsKSBjYWxsYmFjayB0byBpbmZvcm0gd2hlbiB0aGUgcGxheWVyIGhhcyBsb2FkZWQKICogQHBhcmFtIHthcGlCYXNlOiBTdHJpbmcsIGhlYWRlcnM6IEpTT04sIHZpc2l0b3JJZDogU3RyaW5nLCBlbnZJZDogU3RyaW5nfSBlcnJvckxvZ2dpbmdEZXRhaWxzIGlmIHByZXNlbnQsIHNlbmQgc2NyaXB0IGxvYWQgZXJyb3IKICovCmNvbnN0IGxvYWRQbGF5ZXJTY3JpcHRzID0gKHBhcmVudEVsZW1lbnQsIHNjcmlwdHMsIG9ubG9hZENhbGxiYWNrKSA9PiB7CiAgaWYgKHNjcmlwdHMubGVuZ3RoID09PSAwKSByZXR1cm4gb25sb2FkQ2FsbGJhY2sgJiYgb25sb2FkQ2FsbGJhY2soKTsKICBQcm9taXNlLmFsbCgKICAgIHNjcmlwdHMucmVkdWNlKChwcmV2LCBjdXIpID0+IHsKICAgICAgcHJldi5wdXNoKGxvYWRTY3JpcHQocGFyZW50RWxlbWVudCwgY3VyKSk7CiAgICAgIHJldHVybiBwcmV2OwogICAgfSwgW10pCiAgKQogICAgLnRoZW4oKCkgPT4gewogICAgICBvbmxvYWRDYWxsYmFjayAmJiBvbmxvYWRDYWxsYmFjaygpOwogICAgfSkKICAgIC5jYXRjaChmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgY29uc29sZS5sb2coc2NyaXB0ICsgJyBmYWlsZWQgdG8gbG9hZCcpOwogICAgfSk7Cn07Cgpjb25zdCBzZXRVcGxvYWRQcm9ncmVzcyA9ICh1cGxvYWRQcm9ncmVzc0xhYmVsLCB0eXBlLCBmcmFjdGlvbikgPT4gewogIGlmICh0eXBlID09PSAnc3RhcnQnKSB7CiAgICB1cGxvYWRQcm9ncmVzc0xhYmVsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CiAgfQogIGlmICh0eXBlID09PSAnbm9uZScpIHsKICAgIHVwbG9hZFByb2dyZXNzTGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9IEhJRERFTl9DTEFTUzsKICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdWNjZXNzJykgewogICAgdXBsb2FkUHJvZ3Jlc3NMYWJlbC5zdHlsZS52aXNpYmlsaXR5ID0gSElEREVOX0NMQVNTOwogICAgdXBsb2FkUHJvZ3Jlc3NMYWJlbC5pbm5lckhUTUwgPSAnVXBsb2FkIHN1Y2NlZWRlZCEnOwogIH0gZWxzZSB7CiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGZyYWN0aW9uKSk7CiAgICB1cGxvYWRQcm9ncmVzc0xhYmVsLmlubmVySFRNTCA9IGBVcGxvYWRpbmcgPHNwYW4gY2xhc3M9InVsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbF9fdGltZSI+JHtwZXJjZW50fSU8L3NwYW4+YDsKICAgIHVwbG9hZFByb2dyZXNzTGFiZWwuc3R5bGUuYmFja2dyb3VuZCA9IGBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNFMEUwRUIgMCUsICNFMEUwRUIgJHtwZXJjZW50fSUsICNGQ0ZDRkQgJHtwZXJjZW50fSUsICNGQ0ZDRkQgMTAwJSlgOwogIH0KfTsKCmNvbnN0IHNldHVwUmVjb3JkRXZlbnRzSGFuZGxpbmcgPSAocGxheWVyLCBhcGlCYXNlLCByZWNvcmRFdmVudHNDYWxsYmFjaywgc2V0VXBsb2FkUHJvZ3Jlc3MsIGhlYWRlcnMpID0+IHsKICAvLyBlcnJvciBoYW5kbGluZwogIHBsYXllci5vbignZGV2aWNlRXJyb3InLCBmdW5jdGlvbigpIHsKICAgIGNvbnNvbGUubG9nKCdkZXZpY2UgZXJyb3I6JywgcGxheWVyLmRldmljZUVycm9yQ29kZSk7CiAgICBpZiAocGxheWVyLmRldmljZUVycm9yQ29kZS5tZXNzYWdlID09PSAnUGVybWlzc2lvbiBkZW5pZWQnKSB7CiAgICAgIHBsYXllci5kZXZpY2VCdXR0b24uYWRkQ2xhc3MoJ3Blcm1pc3Npb24tZGVuaWVkJyk7CiAgICAgIHJlY29yZEV2ZW50c0NhbGxiYWNrICYmIHJlY29yZEV2ZW50c0NhbGxiYWNrKFJFQ09SREVSLkVSUk9SLCB7IHR5cGU6IFJFQ09SREVSLlBFUk1JU1NJT05fREVOSUVEIH0pOwogICAgfSBlbHNlIHsKICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2sgJiYgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuRVJST1IsIHsgdHlwZTogUkVDT1JERVIuT1RIRVIgfSk7CiAgICAgIHJlcG9ydEVycm9yKAogICAgICAgIG5ldyBFcnJvcihwbGF5ZXIuZGV2aWNlRXJyb3JDb2RlLm1lc3NhZ2UpLAogICAgICAgICdyZWNvcmRlckRldmljZUVycm9yJywKICAgICAgICBhcGlCYXNlLAogICAgICAgIGhlYWRlcnMsCiAgICAgICAgcGxheWVyLnBheWxvYWQudmlzaXRvcklkLAogICAgICAgIHBsYXllci5wYXlsb2FkLmVudklkCiAgICAgICk7CiAgICB9CiAgfSk7CgogIHBsYXllci5vbignZXJyb3InLCBmdW5jdGlvbihlbGVtZW50LCBlcnJvcikgewogICAgcmVwb3J0RXJyb3IoZXJyb3IgfHwgcGxheWVyLmVycm9yKCksICdyZWNvcmRlckVycm9yJywgYXBpQmFzZSwgaGVhZGVycywgcGxheWVyLnBheWxvYWQudmlzaXRvcklkLCBwbGF5ZXIucGF5bG9hZC5lbnZJZCk7CiAgfSk7CgogIHBsYXllci5vbignc3RhcnRSZWNvcmQnLCBmdW5jdGlvbihlbGVtZW50LCBlcnJvcikgewogICAgc2V0VXBsb2FkUHJvZ3Jlc3MocGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwsICdub25lJyk7CiAgfSk7CgogIC8vIHVzZXIgY29tcGxldGVkIHJlY29yZGluZyBhbmQgc3RyZWFtIGlzIGF2YWlsYWJsZQogIHBsYXllci5vbignZmluaXNoUmVjb3JkJywgYXN5bmMgZnVuY3Rpb24oKSB7CiAgICBzZXRVcGxvYWRQcm9ncmVzcyhwbGF5ZXIudXBsb2FkUHJvZ3Jlc3NMYWJlbCwgJ3N0YXJ0JywgMCk7CgogICAgY29uc3QgeyBzdXJ2ZXlJZCwgcXVlc3Rpb25JZCwgcmVzcG9uc2VHcm91cFVpZCwgdmlzaXRvcklkLCBlbnZJZCB9ID0gcGxheWVyLnBheWxvYWQ7CiAgICBpZiAoIXN1cnZleUlkKSB7CiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdpbnRlcm5hbCBlcnJvcjogbWlzc2luZyBmaWVsZHMgaW4gcGF5bG9hZCc7CiAgICAgIHJlY29yZEV2ZW50c0NhbGxiYWNrICYmIHJlY29yZEV2ZW50c0NhbGxiYWNrKFJFQ09SREVSLkVSUk9SLCB7IHR5cGU6IFJFQ09SREVSLk9USEVSIH0pOwogICAgICByZXBvcnRFcnJvcihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSwgJ2ZpbmlzaFJlY29yZCcsIGFwaUJhc2UsIGhlYWRlcnMsIHZpc2l0b3JJZCwgZW52SWQpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwbGF5ZXIucmVjb3JkKCkuc3RvcERldmljZSgpOyAvLyB0dXJucyBvZmYgY2FtZXJhIGFuZCBsaWdodAogICAgLy8gdGhlIGJsb2Igb2JqZWN0IGNvbnRhaW5zIHRoZSByZWNvcmRlZCBkYXRhIHRoYXQKICAgIC8vIGNhbiBiZSBkb3dubG9hZGVkIGJ5IHRoZSB1c2VyLCBzdG9yZWQgb24gc2VydmVyIGV0Yy4KICAgIGNvbnN0IG1lZGlhVHlwZSA9IHBsYXllci5jYW1lcmFPZmYgPyBSRUNPUkRFUi5NRURJQV9UWVBFX0FVRElPIDogUkVDT1JERVIuTUVESUFfVFlQRV9WSURFTzsKICAgIGNvbnN0IGJvZHkgPSB7CiAgICAgIHN1cnZleUlkLAogICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgbWVkaWFUeXBlLAogICAgfTsKCiAgICBpZiAocXVlc3Rpb25JZCkgYm9keS5xdWVzdGlvbklkID0gcXVlc3Rpb25JZDsKICAgIGlmIChyZXNwb25zZUdyb3VwVWlkKSBib2R5LnJlc3BvbnNlR3JvdXBVaWQgPSByZXNwb25zZUdyb3VwVWlkOwogICAgaWYgKHZpc2l0b3JJZCkgYm9keS52aXNpdG9ySWQgPSB2aXNpdG9ySWQ7CgogICAgY29uc3QgY3JlYXRlVXBsb2FkID0gYXN5bmMgKCkgPT4gewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaUJhc2V9LzIvZW52aXJvbm1lbnRzL2ludGVncmF0aW9ucy91cGxvYWRgLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgY2FjaGU6ICduby1jYWNoZScsCiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgIH0pOwogICAgICBpZiAocmVzcG9uc2Uub2spIHsKICAgICAgICBjb25zdCB1cGxvYWRSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgICByZWNvcmRFdmVudHNDYWxsYmFjayAmJgogICAgICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuVVBMT0FEX1NUQVJURUQsIHsKICAgICAgICAgICAgW1JFQ09SREVSLlVQTE9BRF9JRF06IHVwbG9hZFJlc3BvbnNlLnVwbG9hZC5pZCwKICAgICAgICAgICAgW1JFQ09SREVSLk1FRElBX1RZUEVdOiBtZWRpYVR5cGUsCiAgICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdXBsb2FkUmVzcG9uc2UudXBsb2FkLnVybDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWNvcmRFdmVudHNDYWxsYmFjayAmJiByZWNvcmRFdmVudHNDYWxsYmFjayhSRUNPUkRFUi5FUlJPUiwgeyB0eXBlOiBSRUNPUkRFUi5PVEhFUiwgcmVzcG9uc2UgfSk7CiAgICAgICAgcmVwb3J0RXJyb3IoCiAgICAgICAgICBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBnZXQgdXBsb2FkIHJlc3BvbnNlIHdpdGggdXJsJyksCiAgICAgICAgICAnZmluaXNoUmVjb3JkJywKICAgICAgICAgIGFwaUJhc2UsCiAgICAgICAgICBoZWFkZXJzLAogICAgICAgICAgcGxheWVyLnBheWxvYWQudmlzaXRvcklkLAogICAgICAgICAgcGxheWVyLnBheWxvYWQuZW52SWQKICAgICAgICApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIGNvbnN0IHVybCA9IGF3YWl0IGNyZWF0ZVVwbG9hZCgpOwogICAgaWYgKCF1cmwpIHJldHVybjsKCiAgICB1cGxvYWQgPSB3aW5kb3cuVXBDaHVuay5jcmVhdGVVcGxvYWQoewogICAgICAvLyBlbmRwb2ludCBjb21wdXRlZCBmcm9tIGJhY2tlbmQgc2VwYXJhdGVseSBhbmQgaGFja2VkIHRvZ2V0aGVyCiAgICAgIGVuZHBvaW50OiB1cmwsCiAgICAgIGZpbGU6IG5ldyBGaWxlKFtwbGF5ZXIucmVjb3JkZWREYXRhXSwgYHJlY29yZGluZyAke21lZGlhVHlwZX0gJHtEYXRlLm5vdygpfWApLAogICAgICBjaHVua1NpemU6IDUxMjAsIC8vIFVwbG9hZHMgdGhlIGZpbGUgaW4gfjVtYiBjaHVua3MKICAgIH0pOwogICAgdXBsb2FkLnN0YXJ0VGltZSA9IERhdGUubm93KCk7CgogICAgLy8gc3Vic2NyaWJlIHRvIGV2ZW50cwogICAgdXBsb2FkLm9uKCdlcnJvcicsIChlcnIpID0+IHsKICAgICAgc2V0VXBsb2FkUHJvZ3Jlc3MocGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwsICdub25lJyk7CiAgICAgIHJlcG9ydEVycm9yKGVyciwgJ2ZpbmlzaFJlY29yZCcsIGFwaUJhc2UsIGhlYWRlcnMsIHBsYXllci5wYXlsb2FkLnZpc2l0b3JJZCwgcGxheWVyLnBheWxvYWQuZW52SWQpOwogICAgfSk7CgogICAgdXBsb2FkLm9uKCdwcm9ncmVzcycsIChwcm9ncmVzcykgPT4gewogICAgICBzZXRVcGxvYWRQcm9ncmVzcyhwbGF5ZXIudXBsb2FkUHJvZ3Jlc3NMYWJlbCwgJ3Byb2dyZXNzJywgcHJvZ3Jlc3MuZGV0YWlsKTsKICAgIH0pOwoKICAgIHVwbG9hZC5vbignc3VjY2VzcycsICgpID0+IHsKICAgICAgc2V0VXBsb2FkUHJvZ3Jlc3MocGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwsICdzdWNjZXNzJyk7CiAgICAgIHJlY29yZEV2ZW50c0NhbGxiYWNrICYmIHJlY29yZEV2ZW50c0NhbGxiYWNrKFJFQ09SREVSLlVQTE9BRF9GSU5JU0hFRCk7CiAgICB9KTsKICB9KTsKfTsKCmNvbnN0IG1ha2VCdXR0b25zUGFuZWwgPSAocGxheWVyLCBjaGlsZHJlbikgPT4gewogIGNvbnN0IGJ1dHRvbnNQYW5lbCA9IG5ldyAod2luZG93LnZpZGVvanMuZ2V0Q29tcG9uZW50KCdDb21wb25lbnQnKSkocGxheWVyKTsKICBidXR0b25zUGFuZWwuYWRkQ2xhc3MoJ3VsLWJ1dHRvbnMtcGFuZWwnKTsKICBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7CiAgICBidXR0b25zUGFuZWwuYWRkQ2hpbGQoY2hpbGQpOwogIH0pOwoKICBhZGRUZXh0VG9CdXR0b25zUGFuZWwoYnV0dG9uc1BhbmVsKTsKCiAgcmV0dXJuIGJ1dHRvbnNQYW5lbDsKfTsKCmNvbnN0IGFkZFRleHRUb0J1dHRvbnNQYW5lbCA9IChidXR0b25zUGFuZWwpID0+IHsKICBidXR0b25zUGFuZWwuY2hpbGRyZW4oKS5mb3JFYWNoKChidXR0b24pID0+IHsKICAgIGlmIChCVVRUT05fTkFNRV9USVRMRVtidXR0b24ubmFtZV9dKSB7CiAgICAgIGNvbnN0IGJ1dHRvblRleHRFbCA9IGNyZWF0ZUJ1dHRvblRleHQoQlVUVE9OX05BTUVfVElUTEVbYnV0dG9uLm5hbWVfXSwgYHVsLSR7QlVUVE9OX05BTUVfVElUTEVbYnV0dG9uLm5hbWVfXX1gKTsKICAgICAgY29uc3QgZ2V0QnV0dG9uRWwgPSBidXR0b24uZWxfOwoKICAgICAgZ2V0QnV0dG9uRWwuYXBwZW5kQ2hpbGQoYnV0dG9uVGV4dEVsKTsKICAgIH0KICB9KTsKfQoKY29uc3QgY3JlYXRlQnV0dG9uVGV4dCA9IChidXR0b25OYW1lLCBpZCA9ICcnKSA9PiB7CiAgY29uc3QgYnV0dG9uVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBidXR0b25UZXh0LmNsYXNzTmFtZSA9ICd1bC1idXR0b24tdGV4dCc7CiAgYnV0dG9uVGV4dC5pbm5lckhUTUwgPSBidXR0b25OYW1lOwogIGJ1dHRvblRleHQuaWQgPSBpZDsKCiAgcmV0dXJuIGJ1dHRvblRleHQ7Cn0KCmNvbnN0IHByZXBhcmVWaWRlb1BsYXllciA9IChwbGF5ZXIsIGJ1dHRvbnNQYW5lbCwgc291cmNlLCBvbmxvYWRDYWxsYmFjaywgaXNBdWRpb1N0cmVhbSA9IGZhbHNlKSA9PiB7CiAgcGxheWVyLmFkZENsYXNzKCd1bC12aWRlby1wbGF5ZXInKTsKICBjb25zdCBjb250cm9scyA9IG5ldyAod2luZG93LnZpZGVvanMuZ2V0Q29tcG9uZW50KCdDb21wb25lbnQnKSkocGxheWVyKTsKICBjb250cm9scy5hZGRDbGFzcygndWwtY29udHJvbC1wYW5lbCcpOwogIHBsYXllci5wcm9ncmVzc0JhciA9IGNvbnRyb2xzLmFkZENoaWxkKCdQcm9ncmVzc0NvbnRyb2wnKTsKICBzb3VyY2UgJiYgcGxheWVyLnNyYyhzb3VyY2UpOwogIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyID0gbmV3ICh3aW5kb3cudmlkZW9qcy5nZXRDb21wb25lbnQoJ0NvbXBvbmVudCcpKShwbGF5ZXIpOwogIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLmFkZENsYXNzKCd1bC1hdWRpby1yZWNvcmRlci1wbGFjZWhvbGRlcicpOwogIGNvbnN0IHRodW1ibmFpbCA9IHNvdXJjZSAmJiBzb3VyY2Uuc3JjID8gZ2V0UG9zdGVyVGh1bWJuYWlsKHNvdXJjZS5zcmMpIDogbnVsbDsKICBpZiAoc291cmNlICYmIChpc0F1ZGlvU3RyZWFtIHx8ICF0aHVtYm5haWwpKSB7IC8vIEhhbmRsZSBhdWRpbyBzdHJlYW0gT1Igbm9uLWV4aXN0aW5nIHRodW1ibmFpbCB3aXRoIHNvdXJjZSBwbGF5ZXIKICAgIHBsYXllci5jaGlsZHJlbigpWzBdLmNsYXNzTGlzdC5hZGQoJ3Zqcy1oaWRkZW4nKTsgLy8gaGlkZSB0aGUgdmlkZW8gc2NyZWVuIHdoZW4gY2FtZXJhIGlzIG9mZgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cGxheWVyLmlkKCl9X2h0bWw1X2FwaWApLnN0eWxlLmhlaWdodCA9ICcwcHgnOwogIH0gZWxzZSB7IC8vIEhhbmRsZSB2aWRlbyBzdHJlYW0KICAgIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLmhpZGUoKTsgLy8gbm90IGEgcmVjb3JkZXIgaW4gcGxheWJhY2sgbW9kZSBzbyBoaWRlIHBsYWNlaG9sZGVyIGlmIHRoZXJlIGlzIGEgcG9zdGVyCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtwbGF5ZXIuaWQoKX1faHRtbDVfYXBpYCkuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgaWYgKHRodW1ibmFpbCkgcGxheWVyLnBvc3Rlcih0aHVtYm5haWwpOwogIH0KCiAgcGxheWVyLm9uKCdwbGF5JywgKCkgPT4gewogICAgLy8gaGlkZSBhdWRpbyBwbGFjZWhvbGRlciBpbiBjYXNlIGl0IHdhcyB0b2dnbGVkIGVhcmxpZXIgd2hlbiBwb3N0ZXIgZGlkbid0IGV4aXN0CiAgICBpZiAoIWlzQXVkaW9TdHJlYW0gJiYgc291cmNlICYmICF0aHVtYm5haWwpIHsKICAgICAgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIGZhbHNlKTsKICAgIH0KICB9KTsKCiAgcGxheWVyLmFkZENoaWxkKHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLCB7fSwgMSk7IC8vIGZpcnN0IGNoaWxkIGlzIHRoZSB2aWRlbyBlbGVtZW50IGRvIG5vdCByZXNldAogIGNvbnRyb2xzLmFkZENoaWxkKGJ1dHRvbnNQYW5lbCk7CiAgcGxheWVyLmFkZENoaWxkKGNvbnRyb2xzKTsKICBvbmxvYWRDYWxsYmFjayAmJiBvbmxvYWRDYWxsYmFjayhwbGF5ZXIpOwp9OwoKY29uc3QgcHJlcGFyZVJlY29yZGVyID0gKAogIHZpZGVvUGxheWVyQ29udGFpbmVyLAogIHBsYXllcklkLAogIHBheWxvYWQsCiAgYXBpQmFzZSwKICByZWNvcmRFdmVudHNDYWxsYmFjaywKICBzb3VyY2UsCiAgaGVhZGVycywKICBpc0F1ZGlvU3RyZWFtID0gZmFsc2UKKSA9PiB7CiAgY3VycmVudFBsYXllclNlc3Npb24gPSBEYXRlLm5vdygpOwogIGNvbnN0IHZpZGVvanMgPSB3aW5kb3cudmlkZW9qczsKICBjb25zdCBvcHRpb25zID0gewogICAgY29udHJvbHM6IGZhbHNlLAogICAgYmlnUGxheUJ1dHRvbjogZmFsc2UsCiAgICBmbHVpZDogZmFsc2UsCiAgICB3aWR0aDogMTI4MCwKICAgIGhlaWdodDogNzIwLAogICAgcGxheXNpbmxpbmU6IHRydWUsCiAgICBwbHVnaW5zOiB7CiAgICAgIHJlY29yZDogewogICAgICAgIGF1ZGlvOiB0cnVlLAogICAgICAgIHZpZGVvOiB7CiAgICAgICAgICAvLyB2aWRlbyBjb25zdHJhaW50czogc2V0IHJlc29sdXRpb24gb2YgY2FtZXJhCiAgICAgICAgICBtYW5kYXRvcnk6IHsKICAgICAgICAgICAgbWluV2lkdGg6IDEyODAsCiAgICAgICAgICAgIG1pbkhlaWdodDogNzIwLAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIC8vIGRpbWVuc2lvbnMgb2YgY2FwdHVyZWQgdmlkZW8gZnJhbWVzCiAgICAgICAgZnJhbWVXaWR0aDogMTI4MCwKICAgICAgICBmcmFtZUhlaWdodDogNzIwLAogICAgICAgIG1heExlbmd0aDogNjAwLCAvLyBzZXQgMTAtbWluIG1heCBsZW5ndGgKICAgICAgICBhdXRvTXV0ZURldmljZTogdHJ1ZSwKICAgICAgfSwKICAgIH0sCiAgfTsKCiAgY29uc3QgcGxheWVyID0gdmlkZW9qcyhwbGF5ZXJJZCwgb3B0aW9ucyk7CiAgcGxheWVyLnBheWxvYWQgPSBwYXlsb2FkOwogIGNvbnN0IHJlc3RhcnREZXZpY2UgPSAoY2FtZXJhT2ZmKSA9PiB7CiAgICBjb25zdCBjYW1lcmFPbkNsYXNzID0gQ0FNRVJBX09GRl9CVVRUT05fQ0xBU1M7CiAgICBjb25zdCBjYW1lcmFPZmZDbGFzcyA9IENBTUVSQV9PRkZfQlVUVE9OX0NMQVNTICsgJy1hdWRpby1vbmx5JzsKICAgIHNldFVwbG9hZFByb2dyZXNzKHBsYXllci51cGxvYWRQcm9ncmVzc0xhYmVsLCAnbm9uZScpOwogICAgdXBsb2FkICYmIHVwbG9hZC5zdGFydFRpbWUgPj0gY3VycmVudFBsYXllclNlc3Npb24gJiYgdXBsb2FkLmFib3J0KCk7CiAgICBjb25zdCBjYW1lcmFCdXR0b25UeHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWwtY2FtZXJhLWJ1dHRvbicpCiAgICBpZiAoY2FtZXJhT2ZmKSB7CiAgICAgIHBsYXllci5jaGlsZHJlbigpWzBdLmNsYXNzTGlzdC5hZGQoJ3Zqcy1oaWRkZW4nKTsgLy8gaGlkZSB0aGUgdmlkZW8gc2NyZWVuIHdoZW4gY2FtZXJhIGlzIG9mZgogICAgICBjYW1lcmFPZmZCdXR0b24ucmVtb3ZlQ2xhc3MoY2FtZXJhT25DbGFzcyk7CiAgICAgIGNhbWVyYU9mZkJ1dHRvbi5hZGRDbGFzcyhjYW1lcmFPZmZDbGFzcyk7CiAgICAgIGNhbWVyYUJ1dHRvblR4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5UdXJuT25DYW1lcmE7CiAgICAgIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLnJlbW92ZUNsYXNzKCd2anMtaGlkZGVuJyk7CiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubWVkaWFEZXZpY2VzCiAgICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlLCBhdWRpbzogdHJ1ZSB9KQogICAgICAgIC50aGVuKChzdHJlYW0pID0+IHsKICAgICAgICAgIHBsYXllci5yZWNvcmQoKS5vbkRldmljZVJlYWR5KHN0cmVhbSk7CiAgICAgICAgICBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5mb3JFYWNoKChzdHJlYW0pID0+IHsKICAgICAgICAgICAgc3RyZWFtLnN0b3AoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pCiAgICAgICAgLmNhdGNoKHBsYXllci5yZWNvcmQoKS5vbkRldmljZUVycm9yLmJpbmQocGxheWVyLnJlY29yZCgpKSk7CiAgICB9IGVsc2UgewogICAgICBwbGF5ZXIuY2hpbGRyZW4oKVswXS5jbGFzc0xpc3QucmVtb3ZlKCd2anMtaGlkZGVuJyk7CiAgICAgIHBsYXllci5yZWNvcmQoKS5nZXREZXZpY2UoKTsKICAgICAgY2FtZXJhT2ZmQnV0dG9uLnJlbW92ZUNsYXNzKGNhbWVyYU9mZkNsYXNzKTsKICAgICAgY2FtZXJhT2ZmQnV0dG9uLmFkZENsYXNzKGNhbWVyYU9uQ2xhc3MpOwogICAgICBjYW1lcmFCdXR0b25UeHQuaW5uZXJIVE1MID0gQlVUVE9OX05BTUVfVElUTEUuVHVybk9mZkNhbWVyYTsKICAgICAgcGxheWVyLmF1ZGlvUGxheWVyUGxhY2Vob2xkZXIuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTsKICAgIH0KICB9OwogIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IG5ldyAodmlkZW9qcy5nZXRDb21wb25lbnQoJ0J1dHRvbicpKShwbGF5ZXIsIHsKICAgIGNsaWNrSGFuZGxlcjogKCkgPT4gewogICAgICBpZiAoZGVsZXRlQnV0dG9uLmhhc0NsYXNzKEhJRERFTl9DTEFTUykpIHJldHVybjsKICAgICAgcmVzdGFydERldmljZShwbGF5ZXIuY2FtZXJhT2ZmKTsKICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuREVMRVRFLCB7fSk7CiAgICAgIGNhbWVyYU9mZkJ1dHRvbi5yZW1vdmVDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICBkZWxldGVCdXR0b24uYWRkQ2xhc3MoSElEREVOX0NMQVNTKTsKICAgIH0sCiAgfSk7CiAgZGVsZXRlQnV0dG9uLmFkZENsYXNzKCd1bC12aWRlby1yZWNvcmRlci1kZWxldGUtYnV0dG9uJyk7CiAgZGVsZXRlQnV0dG9uLmVsXy5hcHBlbmRDaGlsZChjcmVhdGVCdXR0b25UZXh0KEJVVFRPTl9OQU1FX1RJVExFLkRlbGV0ZUJ1dHRvbiwgJ3VsLWRlbGV0ZS1idXR0b24nKSk7CgogIGNvbnN0IHZpZGVvUGxheWVyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwbGF5ZXJJZCk7CgogIGNvbnN0IHVwZGF0ZVBsYXllckRpc3BsYXkgPSAoKSA9PiB7CiAgICBpZiAodmlkZW9QbGF5ZXJFbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Zqcy1mdWxsc2NyZWVuJykgJiYgcGxheWVyLmNhbWVyYU9mZikgdmlkZW9QbGF5ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlJzsKICAgIGVsc2UgdmlkZW9QbGF5ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogIH0KCiAgdXBkYXRlUGxheWVyRGlzcGxheSgpOwoKICBjb25zdCBjYW1lcmFPZmZCdXR0b24gPSBuZXcgKHZpZGVvanMuZ2V0Q29tcG9uZW50KCdCdXR0b24nKSkocGxheWVyLCB7CiAgICBjbGlja0hhbmRsZXI6ICgpID0+IHsKICAgICAgaWYgKHBsYXllci5yZWNvcmQoKS5pc1JlY29yZGluZygpKSByZXR1cm47CiAgICAgIHBsYXllci5jYW1lcmFPZmYgPSAhcGxheWVyLmNhbWVyYU9mZjsKICAgICAgcmVzdGFydERldmljZShwbGF5ZXIuY2FtZXJhT2ZmKTsKICAgICAgIWRlbGV0ZUJ1dHRvbi5oYXNDbGFzcyhISURERU5fQ0xBU1MpICYmIGRlbGV0ZUJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICByZWNvcmRFdmVudHNDYWxsYmFjayhSRUNPUkRFUi5ERUxFVEUsIHt9KTsKICAgICAgdXBkYXRlUGxheWVyRGlzcGxheSgpOwogICAgfSwKICB9KTsKICBjYW1lcmFPZmZCdXR0b24uYWRkQ2xhc3MoQ0FNRVJBX09GRl9CVVRUT05fQ0xBU1MpOwogIGNhbWVyYU9mZkJ1dHRvbi5lbF8uYXBwZW5kQ2hpbGQoY3JlYXRlQnV0dG9uVGV4dChCVVRUT05fTkFNRV9USVRMRS5UdXJuT2ZmQ2FtZXJhLCAndWwtY2FtZXJhLWJ1dHRvbicpKTsKCiAgY29uc3QgcmVjb3JkVG9nZ2xlID0gbmV3ICh2aWRlb2pzLmdldENvbXBvbmVudCgnQnV0dG9uJykpKHBsYXllciwgewogICAgY2xpY2tIYW5kbGVyOiAoKSA9PiB7CiAgICAgIGNvbnN0IHJlY29yZEJ1dHRvblRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWwtcmVjb3JkZXItdG9nZ2xlJyk7CiAgICAgIGlmICghcGxheWVyLnJlY29yZCgpLmlzUmVjb3JkaW5nKCkpIHsKICAgICAgICBjb25zdCBnZXRDb3VudGRvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bC1yZWNvcmRpbmctY291bnRkb3duLXNjcmVlbicpOwogICAgICAgIGlmIChnZXRDb3VudGRvd25FbCkgeyAvLyBTdG9wcGluZyByZWNvcmRlciBiZWZvcmUgcmVjb3JkaW5nIHN0YXJ0cwogICAgICAgICAgZ2V0Q291bnRkb3duRWwucmVtb3ZlKCk7CiAgICAgICAgICBpZiAocmVjb3JkQnV0dG9uVGV4dCkgcmVjb3JkQnV0dG9uVGV4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5SZWNvcmRCdXR0b247CiAgICAgICAgICByZXN0YXJ0RGV2aWNlKHBsYXllci5jYW1lcmFPZmYpOwogICAgICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuREVMRVRFLCB7fSk7CiAgICAgICAgICBjYW1lcmFPZmZCdXR0b24ucmVtb3ZlQ2xhc3MoSElEREVOX0NMQVNTKTsKICAgICAgICAgIGRlbGV0ZUJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICAgICAgcmVjb3JkVG9nZ2xlLnJlbW92ZUNsYXNzKFJFQ09SRElOR19JTl9TRVNTSU9OKTsKICAgICAgICAgIGV4cGFuZFRvZ2dsZS5zaG93KCk7CiAgICAgICAgfSBlbHNlIHsgLy8gc3RhcnQgcmVjb3JkaW5nCiAgICAgICAgICByZWNvcmRUb2dnbGUuYWRkQ2xhc3MoUkVDT1JESU5HX0lOX1NFU1NJT04pOwogICAgICAgICAgZXhwYW5kVG9nZ2xlLmhpZGUoKTsKICAgICAgICAgIGNhbWVyYU9mZkJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICAgICAgZGVsZXRlQnV0dG9uLmFkZENsYXNzKEhJRERFTl9DTEFTUyk7CiAgICAgICAgICBpZiAocmVjb3JkQnV0dG9uVGV4dCkgcmVjb3JkQnV0dG9uVGV4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5TdG9wQnV0dG9uOwoKICAgICAgICAgIGNvbnN0IHJlY29yZGluZ1ByZXZpZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgIHJlY29yZGluZ1ByZXZpZXcuaWQgPSAndWwtcmVjb3JkaW5nLWNvdW50ZG93bi1zY3JlZW4nOwogICAgICAgICAgdmlkZW9QbGF5ZXJFbC5pbnNlcnRCZWZvcmUocmVjb3JkaW5nUHJldmlldywgdmlkZW9QbGF5ZXJFbC5jaGlsZHJlblsxXSk7CiAgICAgICAgICByZWNvcmRpbmdQcmV2aWV3LnN0eWxlLmhlaWdodCA9IGAke3ZpZGVvUGxheWVyRWwub2Zmc2V0SGVpZ2h0fXB4YDsKICAgICAgICAgIHJlY29yZGluZ0NvdW50ZG93blN0YXJ0KHBsYXllciwgMyk7IC8vIHJlY29yZGluZyBzdGFydHMgb25jZSBjb3VudGRvd24gaXMgZmluaXNoZWQKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxheWVyLnJlY29yZCgpLnN0b3AoKTsKICAgICAgICBpZiAocmVjb3JkQnV0dG9uVGV4dCkgcmVjb3JkQnV0dG9uVGV4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5SZWNvcmRCdXR0b247CiAgICAgICAgcmVjb3JkVG9nZ2xlLnJlbW92ZUNsYXNzKFJFQ09SRElOR19JTl9TRVNTSU9OKTsKICAgICAgICBkZWxldGVCdXR0b24ucmVtb3ZlQ2xhc3MoSElEREVOX0NMQVNTKTsKICAgICAgfQogICAgfSwKICB9KTsKICByZWNvcmRUb2dnbGUuYWRkQ2xhc3MoJ3VsLXZpZGVvLXJlY29yZGVyLXRvZ2dsZS1idXR0b24nKTsKICByZWNvcmRUb2dnbGUuZWxfLmFwcGVuZENoaWxkKGNyZWF0ZUJ1dHRvblRleHQoQlVUVE9OX05BTUVfVElUTEUuUmVjb3JkQnV0dG9uLCAndWwtcmVjb3JkZXItdG9nZ2xlJykpOwoKICBjb25zdCB1cGxvYWRQcm9ncmVzc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOwogIHVwbG9hZFByb2dyZXNzTGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwogIHVwbG9hZFByb2dyZXNzTGFiZWwuY2xhc3NOYW1lID0gJ3VsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbCc7CiAgdmlkZW9QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodXBsb2FkUHJvZ3Jlc3NMYWJlbCk7CiAgcGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwgPSB1cGxvYWRQcm9ncmVzc0xhYmVsOwoKICBjb25zdCBidXR0b25zUGFuZWwgPSBtYWtlQnV0dG9uc1BhbmVsKHBsYXllciwgWwogICAgZGVsZXRlQnV0dG9uLAogICAgY2FtZXJhT2ZmQnV0dG9uLAogICAgJ1BsYXlUb2dnbGUnLAogICAgcmVjb3JkVG9nZ2xlLAogICAgJ0Z1bGxzY3JlZW5Ub2dnbGUnLAogIF0pOwoKICBjb25zdCBleHBhbmRUb2dnbGUgPSBidXR0b25zUGFuZWwuY2hpbGRyZW4oKS5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZV8gPT09ICdGdWxsc2NyZWVuVG9nZ2xlJyk7CiAgaWYgKGV4cGFuZFRvZ2dsZS5oYXNDbGFzcygndmpzLWRpc2FibGVkJykpIHsKICAgIGV4cGFuZFRvZ2dsZS5oaWRlKCk7CiAgfQoKICAvLyBoaWRlIHBsYXkgdG9nZ2xlIGZvciByZWNvcmRlcgogIGNvbnN0IHBsYXlUb2dnbGUgPSBidXR0b25zUGFuZWwuY2hpbGRyZW4oKS5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZV8gPT09ICdQbGF5VG9nZ2xlJyk7CiAgcGxheVRvZ2dsZS5oaWRlKCk7CgogIHNvdXJjZSAmJiBjYW1lcmFPZmZCdXR0b24uYWRkQ2xhc3MoSElEREVOX0NMQVNTKTsKICAhc291cmNlICYmIGRlbGV0ZUJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwoKICBwcmVwYXJlVmlkZW9QbGF5ZXIocGxheWVyLCBidXR0b25zUGFuZWwsIHNvdXJjZSwgZmFsc2UsIGlzQXVkaW9TdHJlYW0pOwoKICBwbGF5ZXIub24oJ3N0b3BSZWNvcmQnLCAoKSA9PiB7CiAgICByZWNvcmRUb2dnbGUuaGlkZSgpOwogICAgcGxheVRvZ2dsZS5zaG93KCk7CiAgICBleHBhbmRUb2dnbGUuc2hvdygpOwogICAgZGVsZXRlQnV0dG9uLnJlbW92ZUNsYXNzKEhJRERFTl9DTEFTUyk7CiAgfSk7CgogIHBsYXllci5vbignZGV2aWNlUmVhZHknLCAoKSA9PiB7CiAgICByZWNvcmRUb2dnbGUuc2hvdygpOwogICAgcGxheVRvZ2dsZS5oaWRlKCk7CiAgICBkZWxldGVCdXR0b24uYWRkQ2xhc3MoSElEREVOX0NMQVNTKTsKICB9KTsKCiAgc2V0dXBSZWNvcmRFdmVudHNIYW5kbGluZyhwbGF5ZXIsIGFwaUJhc2UsIHJlY29yZEV2ZW50c0NhbGxiYWNrLCBzZXRVcGxvYWRQcm9ncmVzcywgaGVhZGVycyk7CiAgLy8gU2hvdyB2aWRlbyBpZiBzb3VyY2UgZXhpc3QuCiAgaWYgKHNvdXJjZSkgewogICAgcGxheWVyLmRldmljZUJ1dHRvbiAmJiBwbGF5ZXIuZGV2aWNlQnV0dG9uLmhpZGUoKTsKICAgIHBsYXllci5zcmMoc291cmNlKTsKICAgIHBsYXlUb2dnbGUuc2hvdygpOwogICAgcmVjb3JkVG9nZ2xlLmhpZGUoKTsKICAgIGRlbGV0ZUJ1dHRvbi5yZW1vdmVDbGFzcyhISURERU5fQ0xBU1MpOwogIH0KCiAgLy8gTG9va2luZyBmb3Igc2F2ZWQgcGVybWlzc2lvbnMgaW4gYnJvd3Nlci4gTm90ZSwgbmF2aWdhdG9yLnBlcm1pc3Npb25zIGlzIGV4cGVyaW1lbnRhbCBvbiBzb21lIGJyb3dzZXJzLgogIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QZXJtaXNzaW9ucy9xdWVyeQogIGNvbnN0IHBlcm1pc3Npb25EZXNjcmlwdG9ycyA9IFt7IG5hbWU6ICdtaWNyb3Bob25lJyB9XTsKICAhcGxheWVyLmNhbWVyYU9mZiAmJiBwZXJtaXNzaW9uRGVzY3JpcHRvcnMucHVzaCh7IG5hbWU6ICdjYW1lcmEnIH0pOwogIFByb21pc2UuYWxsKHBlcm1pc3Npb25EZXNjcmlwdG9ycy5tYXAoKHBlcm1pc3Npb25EZXNjcmlwdG9yKSA9PiBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkocGVybWlzc2lvbkRlc2NyaXB0b3IpKSkKICAudGhlbigoc3RhdHVzKSA9PiB7CiAgICBjb25zdCBhbGxHcmFudGVkID0gc3RhdHVzLnJlZHVjZSgocHJldiwgY3VyKSA9PiB7CiAgICAgIHJldHVybiBwcmV2ICYgKGN1ci5zdGF0ZSA9PT0gJ2dyYW50ZWQnKTsKICAgIH0sIHRydWUpOwogICAgaWYgKGFsbEdyYW50ZWQgJiYgcGxheWVyKSB7CiAgICAgIHBsYXllci5kZXZpY2VCdXR0b24gJiYgcGxheWVyLmRldmljZUJ1dHRvbi5oaWRlKCk7CiAgICAgICFzb3VyY2UgJiYgcGxheWVyLnJlY29yZCgpLmdldERldmljZSgpOwogICAgfQogIH0pLmNhdGNoKChlKSA9PiB7CiAgICAvLyBmYWlsIHNpbGVudGx5CiAgfSkKfTsKCi8vIFJlY3Vyc2l2ZSBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIGNvdW50ZG93biBvbiByZWNvcmRpbmcgcGxheWVyIHNjcmVlbgpjb25zdCByZWNvcmRpbmdDb3VudGRvd25TdGFydCA9IChwbGF5ZXIsIHN0YXJ0aW5nTnVtID0gMykgPT4gewogIGNvbnN0IGdldENvdW50ZG93bkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VsLXJlY29yZGluZy1jb3VudGRvd24tc2NyZWVuJyk7CiAgaWYgKGdldENvdW50ZG93bkVsICYmIHN0YXJ0aW5nTnVtID09PSAwKSB7CiAgICAvLyByZW1vdmUgcmVjb3JkaW5nIHNjcmVlbiBvbmNlIGl0IGhpdHMgMCB0byBzdGFydCB0aGUgcmVjb3JkaW5nLgogICAgZ2V0Q291bnRkb3duRWwucmVtb3ZlKCk7CiAgICBwbGF5ZXIucmVjb3JkKCkuc3RhcnQoKTsKICB9IGVsc2UgaWYgKGdldENvdW50ZG93bkVsKSB7CiAgICBnZXRDb3VudGRvd25FbC5pbm5lckhUTUwgPSBgPHNwYW4gY2xhc3M9J3VsLWNvdW50ZG93bi10ZXh0Jz5SZWNvcmRpbmcgaW4uLi4gJHtzdGFydGluZ051bX08L3NwYW4+YDsKCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgcmVjb3JkaW5nQ291bnRkb3duU3RhcnQocGxheWVyLCBzdGFydGluZ051bSAtIDEpOwogICAgfSwgMTAwMCk7CiAgfQp9Cgpjb25zdCBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lciA9IChwbGF5ZXJJZCkgPT4gewogIGNvbnN0IHZpZGVvUGxheWVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgdmlkZW9QbGF5ZXJDb250YWluZXIuY2xhc3NOYW1lID0gJ3VsLXZpZGVvLWNvbnRhaW5lcic7CiAgdmlkZW9QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bpbm5lcihwbGF5ZXJJZCkpOwogIHJldHVybiB2aWRlb1BsYXllckNvbnRhaW5lcjsKfTsKCmNvbnN0IGNyZWF0ZVZpZGVvUGxheWVyQ29tcG9uZW50cyA9IChwbGF5ZXJJZCwgdmlkZW9QbGF5ZXJDb250YWluZXIpID0+IHsKICBjb25zdCB2aWRlb1BsYXllciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7CiAgdmlkZW9QbGF5ZXIuaWQgPSBwbGF5ZXJJZDsKICB2aWRlb1BsYXllci5jbGFzc05hbWUgPSAndmlkZW8tanMgdmpzLWRlZmF1bHQtc2tpbiB1bC12aWRlby1wbGF5ZXItdmlkZW8nOwoKICBjb25zdCBjb21wYXRpYmlsaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOwogIGNvbXBhdGliaWxpdHkuY2xhc3NOYW1lID0gJ3Zqcy1uby1qcyc7CiAgY29tcGF0aWJpbGl0eS5pbm5lckhUTUwgPSAnVG8gdmlldyB0aGlzIHZpZGVvIHBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCwgYW5kIGNvbnNpZGVyIHVwZ3JhZGluZyB0byBhIHdlYiBicm93c2VyIHRoYXQnOwogIGNvbnN0IGNvbXBhdGliaWxpdHlMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogIGNvbXBhdGliaWxpdHlMaW5rLmhyZWYgPSAnaHR0cHM6Ly92aWRlb2pzLmNvbS9odG1sNS12aWRlby1zdXBwb3J0Lyc7CiAgY29tcGF0aWJpbGl0eUxpbmsudGFyZ2V0ID0gJ19ibGFuayc7CiAgY29tcGF0aWJpbGl0eUxpbmsuaW5uZXJIVE1MID0gJ3N1cHBvcnRzIEhUTUw1IHZpZGVvJzsKICBjb21wYXRpYmlsaXR5LmFwcGVuZENoaWxkKGNvbXBhdGliaWxpdHlMaW5rKTsKICB2aWRlb1BsYXllci5hcHBlbmRDaGlsZChjb21wYXRpYmlsaXR5KTsKICB2aWRlb1BsYXllckNvbnRhaW5lci5hcHBlbmRDaGlsZCh2aWRlb1BsYXllcik7CiAgcmV0dXJuIHZpZGVvUGxheWVyQ29udGFpbmVyOwp9OwoKY29uc3QgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlciA9IChwbGF5ZXIsIGlzQXVkaW9TdHJlYW0pID0+IHsKICBpZiAoaXNBdWRpb1N0cmVhbSkgewogICAgcGxheWVyLmNoaWxkcmVuKClbMF0uY2xhc3NMaXN0LmFkZCgndmpzLWhpZGRlbicpOyAvLyBoaWRlIHRoZSB2aWRlbyBzY3JlZW4gd2hlbiBjYW1lcmEgaXMgb2ZmCiAgICBwbGF5ZXIuYXVkaW9QbGF5ZXJQbGFjZWhvbGRlci5zaG93KCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtwbGF5ZXIuaWQoKX1faHRtbDVfYXBpYCkuc3R5bGUuaGVpZ2h0ID0gJzBweCc7CiAgfSBlbHNlIHsKICAgIHBsYXllci5jaGlsZHJlbigpWzBdLmNsYXNzTGlzdC5yZW1vdmUoJ3Zqcy1oaWRkZW4nKTsgLy8gaGlkZSB0aGUgdmlkZW8gc2NyZWVuIHdoZW4gY2FtZXJhIGlzIG9mZgogICAgcGxheWVyLmF1ZGlvUGxheWVyUGxhY2Vob2xkZXIuaGlkZSgpOyAvLyBub3QgYSByZWNvcmRlciBpbiBwbGF5YmFjayBtb2RlIHNvIGhpZGUgcGxhY2Vob2xkZXIKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3BsYXllci5pZCgpfV9odG1sNV9hcGlgKS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7CiAgfQp9OwoKLy8gcHVibGljIGFwaQoKLyoqCiAqCiAqIEBwYXJhbSB7U3RyaW5nfSBwbGF5ZXJJZCB1bmlxdWUgaWQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIncyBjb250YWluZXIKICogQHBhcmFtIHt7c3JjOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHNvdXJjZSBzcmMgcHJvcGVydGllcyB0byBiZSBwbHVnZ2VkIGludG8gdGhlIHBsYXllciwgZXguIHtzcmM6ICd1cmwnLCB0eXBlOiAnYXBwbGljYXRpb24veC1tcGVnVVJMJyB9CiAqIEBwYXJhbSB7Kn0gb25sb2FkQ2FsbGJhY2sgKG9wdGlvbmFsKSBjYWxsYmFjayB0byBpbmZvcm0gd2hlbiB0aGUgcGxheWVyIGhhcyBsb2FkZWQKICogQHBhcmFtIHtib29sZWFufSBpc0F1ZGlvU3RyZWFtIHRydWUgaWYgbWVkaWEgdHlwZSBmb3IgdGhlIHBsYXliYWNrIGlzIGF1ZGlvIG9ubHkgZGVmYXVsdCBmYWxzZQogKiBAcGFyYW0ge1N0cmluZ30gYXBpQmFzZSBiYXNlIHVybCBmb3IgdGhlIGFwaSBjYWxscy4gZGVmYXVsdCBpcyBwcm9kIGFwaQogKiBAcmV0dXJucyBodG1sIGVsZW1lbnQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIgY29udGFpbmVyCiAqLwpjb25zdCB2aWRlb1BsYXllciA9IChjb250YWluZXJJZCwgc291cmNlLCBvbmxvYWRDYWxsYmFjaywgaXNBdWRpb1N0cmVhbSA9IGZhbHNlLCBhcGlCYXNlID0gJ2h0dHBzOi8vYXBpLnNwcmlnLmNvbScpID0+IHsKICBjb25zdCBwbGF5ZXJJZCA9IGNvbnRhaW5lcklkICsgVklERU9fUExBWUVSX1BPU1RGSVg7CiAgY29uc3QgdmlkZW9QbGF5ZXJDb250YWluZXIgPSBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lcihwbGF5ZXJJZCk7CgogIC8vIEFkZCBldmVudCBsaXN0ZW5lciBiZWZvcmUgbG9hZGluZyB0aGlyZCBwYXJ0eSBzY3JpcHRzIGluIHRvIGxvZyBhbnkgQ1NQIHZpb2xhdGlvbnMKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWN1cml0eXBvbGljeXZpb2xhdGlvbiIsIChlKSA9PiB7CiAgICByZXBvcnRFcnJvcigKICAgICAgbmV3IEVycm9yKGBWb2ljZSAmIFZpZGVvIGZlYXR1cmUgdmlvbGF0ZXMgJHtlLnZpb2xhdGVkRGlyZWN0aXZlfSB3ZWIgcGFnZSBDU1AgcG9saWNpZXMgZm9yIHRoZSBxdWVzdGlvbiBwbGF5ZXIuYCksCiAgICAgICdwbGF5ZXJEZXZpY2VFcnJvcicsCiAgICAgIGFwaUJhc2UsCiAgICAgIHt9LAogICAgKTsKICB9KTsKCiAgbG9hZFBsYXllclNjcmlwdHModmlkZW9QbGF5ZXJDb250YWluZXIsIHZpZGVvUGxheWVyU2NyaXB0cywgKCkgPT4gewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0U3Bpbm5lcklkKHBsYXllcklkKSkucmVtb3ZlKCk7CiAgICBjcmVhdGVWaWRlb1BsYXllckNvbXBvbmVudHMocGxheWVySWQsIHZpZGVvUGxheWVyQ29udGFpbmVyKTsKICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgIHBsYXlzaW5saW5lOiB0cnVlLAogICAgICBwbGF5YmFja1JhdGVzOiBbMC41LCAxLCAxLjUsIDJdLAogICAgfQoKICAgIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKHBsYXllcklkLCBvcHRpb25zKTsKICAgIGNvbnN0IGJ1dHRvbnNQYW5lbCA9IG1ha2VCdXR0b25zUGFuZWwocGxheWVyLCBbJ1BsYXliYWNrUmF0ZU1lbnVCdXR0b24nLCAnUGxheVRvZ2dsZScsICdGdWxsc2NyZWVuVG9nZ2xlJ10pOwogICAgY29uc3QgZXhwYW5kVG9nZ2xlID0gYnV0dG9uc1BhbmVsLmNoaWxkcmVuKCkuZmluZCgoY2hpbGQpID0+IGNoaWxkLm5hbWVfID09PSAnRnVsbHNjcmVlblRvZ2dsZScpOwogICAgaWYgKGV4cGFuZFRvZ2dsZS5oYXNDbGFzcygndmpzLWRpc2FibGVkJykpIHsKICAgICAgZXhwYW5kVG9nZ2xlLmhpZGUoKTsKICAgIH0KICAgIHByZXBhcmVWaWRlb1BsYXllcigKICAgICAgcGxheWVyLAogICAgICBidXR0b25zUGFuZWwsCiAgICAgIHNvdXJjZSwKICAgICAgb25sb2FkQ2FsbGJhY2ssCiAgICAgIGlzQXVkaW9TdHJlYW0KICAgICk7CiAgfSk7CiAgcmV0dXJuIHZpZGVvUGxheWVyQ29udGFpbmVyOwp9OwoKLyoqCiAqCiAqIEBwYXJhbSB7U3RyaW5nfSBwbGF5ZXJJZCB1bmlxdWUgaWQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIncyBjb250YWluZXIKICogQHBhcmFtIHtKU09OfSBwYXlsb2FkIGFwaS1yZWxhdGVkIGpzb24gY29uZmlndXJhdGlvbiBvYmplY3QKICogQHBhcmFtIHtTdHJpbmd9IGFwaUJhc2UgYmFzZSB1cmwgZm9yIHRoZSBhcGkgY2FsbHMuIGRlZmF1bHQgaXMgcHJvZCBhcGkKICogQHBhcmFtIHsoc3RhdHVzOiBTdHJpbmcsIGRhdGE6IE9iamVjdCkgPT4gVm9pZH0gcmVjb3JkRXZlbnRzQ2FsbGJhY2sgY2FsbGJhY2sgdG8gdGhlIG91dHNpZGUgd29ybGQgdG8gbm90aWZ5IHVwbG9hZCBzdGF0dXMKICogQHBhcmFtIHt7c3JjOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHNvdXJjZSBzcmMgcHJvcGVydGllcyB0byBiZSBwbHVnZ2VkIGludG8gdGhlIHBsYXllciwgZXguIHtzcmM6ICd1cmwnLCB0eXBlOiAnYXBwbGljYXRpb24veC1tcGVnVVJMJyB9CiAqIEBwYXJhbSB7J3gtdWwtdmlkZW8tcmVjb3JkZXItb3JpZ2luJzogJ2Rhc2hib2FyZCcgfCAnc2RrJ30gaGVhZGVycyByZXF1ZXN0IGhlYWRlcnMgZm9yIGVycm9yIGxvZ2dpbmcgKHBvdGVudGlhbGx5IGNvbnRhaW5zIGFkZGl0aW9uYWwgaGVhZGVycykKICogQHBhcmFtIHtib29sZWFufSBpc0F1ZGlvU3RyZWFtIHRydWUgaWYgbWVkaWEgdHlwZSBmb3IgdGhlIHBsYXliYWNrIGlzIGF1ZGlvIG9ubHkgZGVmYXVsdCBmYWxzZQogKiBAcmV0dXJucyBodG1sIGVsZW1lbnQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIgY29udGFpbmVyCiAqLwpjb25zdCB2aWRlb1JlY29yZGVyUGxheWVyID0gKAogIHBsYXllcklkLAogIHBheWxvYWQgPSB7fSwKICBhcGlCYXNlID0gJ2h0dHBzOi8vYXBpLnVzZXJsZWFwLmNvbScsCiAgcmVjb3JkRXZlbnRzQ2FsbGJhY2ssCiAgc291cmNlLAogIGhlYWRlcnMsCiAgaXNBdWRpb1N0cmVhbSA9IGZhbHNlCikgPT4gewogIGNvbnN0IHZpZGVvSWQgPSBwbGF5ZXJJZCArIFZJREVPX1JFQ09SREVSX1BPU1RGSVg7CiAgY29uc3QgdmlkZW9QbGF5ZXJDb250YWluZXIgPSBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lcih2aWRlb0lkKTsKCiAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyIGJlZm9yZSBsb2FkaW5nIHRoaXJkIHBhcnR5IHNjcmlwdHMgaW4gdG8gbG9nIGFueSBDU1AgdmlvbGF0aW9ucwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlY3VyaXR5cG9saWN5dmlvbGF0aW9uIiwgKGUpID0+IHsKICAgIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKHZpZGVvSWQpOwogICAgcmVwb3J0RXJyb3IoCiAgICAgIG5ldyBFcnJvcihgVm9pY2UgJiBWaWRlbyBmZWF0dXJlIHZpb2xhdGVzICR7ZS52aW9sYXRlZERpcmVjdGl2ZX0gd2ViIHBhZ2UgQ1NQIHBvbGljaWVzIGZvciB0aGUgcmVjb3JkZXIgcGxheWVyLmApLAogICAgICAncmVjb3JkZXJEZXZpY2VFcnJvcicsCiAgICAgIGFwaUJhc2UsCiAgICAgIGhlYWRlcnMsCiAgICAgIHBsYXllci5wYXlsb2FkLnZpc2l0b3JJZCwKICAgICAgcGxheWVyLnBheWxvYWQuZW52SWQKICAgICk7CiAgfSk7CgogIGxvYWRQbGF5ZXJTY3JpcHRzKHZpZGVvUGxheWVyQ29udGFpbmVyLCB2aWRlb1BsYXllclNjcmlwdHMuY29uY2F0KHJlY29yZGVyU2NyaXB0cyksICgpID0+IHsKICAgIGNyZWF0ZVZpZGVvUGxheWVyQ29tcG9uZW50cyh2aWRlb0lkLCB2aWRlb1BsYXllckNvbnRhaW5lcik7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRTcGlubmVySWQodmlkZW9JZCkpLnJlbW92ZSgpOwogICAgcHJlcGFyZVJlY29yZGVyKAogICAgICB2aWRlb1BsYXllckNvbnRhaW5lciwKICAgICAgdmlkZW9JZCwKICAgICAgcGF5bG9hZCwKICAgICAgYXBpQmFzZSwKICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2ssCiAgICAgIHNvdXJjZSwKICAgICAgaGVhZGVycywKICAgICAgaXNBdWRpb1N0cmVhbQogICAgKTsKICB9KTsKICByZXR1cm4gdmlkZW9QbGF5ZXJDb250YWluZXI7Cn07CgovKioKICoKICogQHBhcmFtIHtTdHJpbmd9IGNvbnRhaW5lcklkIHVuaXF1ZSBpZCBmb3IgdGhlIHZpZGVvIHBsYXllcidzIGNvbnRhaW5lcgogKiBAcGFyYW0ge0pTT059IHBheWxvYWQgYXBpLXJlbGF0ZWQganNvbiBjb25maWd1cmF0aW9uIG9iamVjdAogKiBAcGFyYW0ge3tzcmM6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gc291cmNlIHNyYyBwcm9wZXJ0aWVzIGZvciB0aGUgcGxheWVyCiAqIEBwYXJhbSB7U3RyaW5nfSBhcGlCYXNlIGJhc2UgdXJsIGZvciB0aGUgYXBpIGNhbGxzIGRlZmF1bHQgaXMgcHJvZCBhcGkKICogQHBhcmFtIHsoc3RhdHVzOiBTdHJpbmcsIGRhdGE6IE9iamVjdCkgPT4gVm9pZH0gcmVjb3JkRXZlbnRzQ2FsbGJhY2sgY2FsbGJhY2sgdG8gdGhlIG91dHNpZGUgd29ybGQgdG8gbm90aWZ5IHVwbG9hZCBzdGF0dXMKICogQHBhcmFtIHsneC11bC12aWRlby1yZWNvcmRlci1vcmlnaW4nOiAnZGFzaGJvYXJkJyB8ICdzZGsnfSBoZWFkZXJzIHJlcXVlc3QgaGVhZGVycyBmb3IgZXJyb3IgbG9nZ2luZyAocG90ZW50aWFsbHkgY29udGFpbnMgYWRkaXRpb25hbCBoZWFkZXJzKQogKiBAcGFyYW0ge2Jvb2xlYW59IGlzQXVkaW9TdHJlYW0gdHJ1ZSBpZiBtZWRpYSB0eXBlIGZvciB0aGUgcGxheWJhY2sgaXMgYXVkaW8gb25seSBkZWZhdWx0IGZhbHNlCiAqIEByZXR1cm5zIGh0bWwgZWxlbWVudCBmb3IgdGhlIGNvbWJvIGNvbnRhaW5lcgogKi8KY29uc3QgdmlkZW9QbGF5ZXJSZWNvcmRlckNvbWJvID0gKAogIGNvbnRhaW5lcklkLAogIHBheWxvYWQgPSB7fSwKICBzb3VyY2UsCiAgYXBpQmFzZSA9ICdodHRwczovL2FwaS51c2VybGVhcC5jb20nLAogIHJlY29yZEV2ZW50c0NhbGxiYWNrLAogIGhlYWRlcnMsCiAgaXNBdWRpb1N0cmVhbSA9IGZhbHNlCikgPT4gewogIGNvbnN0IHZpZGVvUGxheWVySWQgPSBjb250YWluZXJJZCArIFZJREVPX1BMQVlFUl9QT1NURklYOwogIGNvbnN0IHZpZGVvUmVjb3JkZXJJZCA9IGNvbnRhaW5lcklkICsgVklERU9fUkVDT1JERVJfUE9TVEZJWDsKICBjb25zdCBjb21ib0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGNvbnN0IHZpZGVvUGxheWVyQ29udGFpbmVyID0gY3JlYXRlVmlkZW9QbGF5ZXJDb250YWluZXIodmlkZW9QbGF5ZXJJZCk7CiAgY29uc3QgcmVjb3JkZXJDb250YWluZXIgPSBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lcih2aWRlb1JlY29yZGVySWQpOwogIGNvbWJvQ29udGFpbmVyLmFwcGVuZENoaWxkKHZpZGVvUGxheWVyQ29udGFpbmVyKTsKICBjb21ib0NvbnRhaW5lci5hcHBlbmRDaGlsZChyZWNvcmRlckNvbnRhaW5lcik7CgogIGxvYWRQbGF5ZXJTY3JpcHRzKGNvbWJvQ29udGFpbmVyLCB2aWRlb1BsYXllclNjcmlwdHMuY29uY2F0KHJlY29yZGVyU2NyaXB0cyksICgpID0+IHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFNwaW5uZXJJZCh2aWRlb1BsYXllcklkKSkucmVtb3ZlKCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRTcGlubmVySWQodmlkZW9SZWNvcmRlcklkKSkucmVtb3ZlKCk7CiAgICBjcmVhdGVWaWRlb1BsYXllckNvbXBvbmVudHModmlkZW9QbGF5ZXJJZCwgdmlkZW9QbGF5ZXJDb250YWluZXIpOwogICAgY3JlYXRlVmlkZW9QbGF5ZXJDb21wb25lbnRzKHZpZGVvUmVjb3JkZXJJZCwgcmVjb3JkZXJDb250YWluZXIpOwogICAgY29uc3QgcGxheWVyID0gd2luZG93LnZpZGVvanModmlkZW9QbGF5ZXJJZCwgeyBwbGF5c2lubGluZTogdHJ1ZSwgcGxheWJhY2tSYXRlczogWzAuNSwgMSwgMS41LCAyXSB9KTsKCiAgICBwcmVwYXJlVmlkZW9QbGF5ZXIoCiAgICAgIHBsYXllciwKICAgICAgbWFrZUJ1dHRvbnNQYW5lbChwbGF5ZXIsIFsnUGxheWJhY2tSYXRlTWVudUJ1dHRvbicsICdQbGF5VG9nZ2xlJywgJ0Z1bGxzY3JlZW5Ub2dnbGUnXSksCiAgICAgIHNvdXJjZSwKICAgICAgZmFsc2UsCiAgICAgIGlzQXVkaW9TdHJlYW0KICAgICk7CiAgICBwcmVwYXJlUmVjb3JkZXIocmVjb3JkZXJDb250YWluZXIsIHZpZGVvUmVjb3JkZXJJZCwgcGF5bG9hZCwgYXBpQmFzZSwgcmVjb3JkRXZlbnRzQ2FsbGJhY2ssIGZhbHNlLCBoZWFkZXJzKTsKICB9KTsKICByZXR1cm4gY29tYm9Db250YWluZXI7Cn07CgovKioKICogQHBhcmFtIHtTdHJpbmd9IGNvbnRhaW5lcklkIHBsYXllciBpZCB0byBiZSBkZXN0cm95ZWQsIHRoaXMgd2lsbCByZW1vdmUgYWxsIHRoZSB2aWRlbyBwbGF5ZXIgYW5kIHJlY29yZGVyIGluc3RhbmNlcyBvbiB0aGUgcGFnZSB3aXRoIHRoZSBpZAogKiBAcmV0dXJucwogKi8KY29uc3QgZGVzdHJveVBsYXllciA9IChjb250YWluZXJJZCkgPT4gewogIGNvbnN0IHZpZGVvanMgPSB3aW5kb3cudmlkZW9qczsKICBjb25zdCB2aWRlb1BsYXllcklkID0gY29udGFpbmVySWQgKyBWSURFT19QTEFZRVJfUE9TVEZJWDsKICBjb25zdCB2aWRlb1JlY29yZGVySWQgPSBjb250YWluZXJJZCArIFZJREVPX1JFQ09SREVSX1BPU1RGSVg7CiAgaWYgKCF2aWRlb2pzKSByZXR1cm47CiAgc3RvcFJlY29yZGluZyhjb250YWluZXJJZCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpICYmIHZpZGVvanMoY29udGFpbmVySWQpLmRpc3Bvc2UoKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWRlb1BsYXllcklkKSAmJiB2aWRlb2pzKHZpZGVvUGxheWVySWQpLmRpc3Bvc2UoKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWRlb1JlY29yZGVySWQpICYmIHZpZGVvanModmlkZW9SZWNvcmRlcklkKS5kaXNwb3NlKCk7Cn07CgovKioKICoKICogQHBhcmFtIHtzdHJpbmd9IGNvbnRhaW5lcklkIGNvbnRhaW5lciBpZCBzdXBwbGllZCBwcmV2aW91c2x5IHRvIGNyZWF0ZSB0aGUgdmlkZW8gY29tcG9uZW5ldAogKiBAcmV0dXJucwogKi8KY29uc3Qgc3RvcFJlY29yZGluZyA9IChjb250YWluZXJJZCkgPT4gewogIGNvbnN0IHZpZGVvanMgPSB3aW5kb3cudmlkZW9qczsKICBjb25zdCB2aWRlb1JlY29yZGVySWQgPSBjb250YWluZXJJZCArIFZJREVPX1JFQ09SREVSX1BPU1RGSVg7CiAgaWYgKCF2aWRlb2pzKSByZXR1cm47CiAgdHJ5IHsKICAgIGlmICghdmlkZW9qcyh2aWRlb1JlY29yZGVySWQpLnJlY29yZCgpLnN0cmVhbSkgcmV0dXJuOyAvLyB0cnlpbmcgdG8gc3RvcCBhIG5vbiBleGlzdGVudCBzdHJlYW0gd2lsbCBjcmFzaAogIH0gY2F0Y2ggKGUpIHsKICAgIHJldHVybjsKICB9CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmlkZW9SZWNvcmRlcklkKSAmJgogICAgdmlkZW9qcyh2aWRlb1JlY29yZGVySWQpCiAgICAgIC5yZWNvcmQoKQogICAgICAuc3RvcCgpOwogIHZpZGVvanModmlkZW9SZWNvcmRlcklkKQogICAgLnJlY29yZCgpCiAgICAuc3RvcERldmljZSgpOwp9OwoKLyoqCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZXJJZCB0aGUgY29udGFpbmVyIGlkCiAqIEBwYXJhbSB7dXJsIHN0cmluZ30gc3JjVXJsIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBzb3VyY2UKICogQHBhcmFtIHtib29sZWFufSBpc0F1ZGlvU3RyZWFtIHRydWUgaWYgbWVkaWEgdHlwZSBmb3IgdGhlIHBsYXliYWNrIGlzIGF1ZGlvIG9ubHkgZGVmYXVsdCBmYWxzZQogKi8KY29uc3QgcmVzZXRQbGF5ZXJTb3VyY2UgPSAoY29udGFpbmVySWQsIHNyY1VybCwgaXNBdWRpb1N0cmVhbSkgPT4gewogIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKGNvbnRhaW5lcklkICsgVklERU9fUExBWUVSX1BPU1RGSVgpOwogICFwbGF5ZXIucGF1c2VkKCkgJiYgcGxheWVyLnBhdXNlKCk7CiAgcGxheWVyLnNyYyh7IHNyYzogc3JjVXJsLCB0eXBlOiAnYXBwbGljYXRpb24veC1tcGVnVVJMJyB9KTsKICBwbGF5ZXIuY3VycmVudFRpbWUoMCk7CiAgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIGlzQXVkaW9TdHJlYW0pOwogIGNvbnN0IHRodW1ibmFpbCA9IGdldFBvc3RlclRodW1ibmFpbChzcmNVcmwpOwogIGlmICghaXNBdWRpb1N0cmVhbSAmJiBzcmNVcmwpIHsKICAgIGlmICh0aHVtYm5haWwpIHBsYXllci5wb3N0ZXIodGh1bWJuYWlsKTsKICAgIGVsc2UgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIHRydWUpOyAvLyB0b2dnbGUgYXVkaW8gcGxhY2Vob2xkZXIgaWYgcG9zdGVyIGRvZXNuJ3QgZXhpc3Q7CiAgfQoKICAvLyBoYXZlIHRvIHJlc2V0IHBsYXkgYWN0aW9uIGFnYWluIGluIGhlcmUgc2luY2UgcmVzZXQgcGxheWVyIGRvZXMgbm90IHVwZGF0ZSBpc0F1ZGlvU3RyZWFtIHZhcmlhYmxlCiAgcGxheWVyLm9uKCdwbGF5JywgKCkgPT4gewogICAgLy8gaGlkZSBhdWRpbyBwbGFjZWhvbGRlciBpbiBjYXNlIGl0IHdhcyB0b2dnbGVkIGVhcmxpZXIgd2hlbiBwb3N0ZXIgZGlkbid0IGV4aXN0CiAgICBpZiAoIWlzQXVkaW9TdHJlYW0gJiYgc3JjVXJsICYmICF0aHVtYm5haWwpIHsKICAgICAgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIGZhbHNlKTsKICAgIH0KICB9KTsKfTsKCmNvbnN0IHBhdXNlUXVlc3Rpb25QbGF5ZXIgPSAocGxheWVySWQpID0+IHsKICBjb25zdCBwbGF5ZXIgPSB3aW5kb3cudmlkZW9qcyhwbGF5ZXJJZCArIFZJREVPX1BMQVlFUl9QT1NURklYKTsKICBwbGF5ZXIucGF1c2UoKTsKfQoKLyoqCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZXJJZCB0aGUgcGxheWVyIHJlY29yZGVyJ3MgY29udGFpbmVyIGlkCiAqIEBwYXJhbSB7Kn0gdmlkZW9VcmwgdXJsIGZvciB0aGUgbmV3IHZpZGVvIHRvIHBsYXkKICovCmNvbnN0IHJlZnJlc2hQbGF5ZXJSZWNvcmRlckNvbWJvID0gKGNvbnRhaW5lcklkLCB2aWRlb1VybCwgcGF5bG9hZCwgaXNBdWRpb1N0cmVhbSkgPT4gewogIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKGNvbnRhaW5lcklkICsgVklERU9fUExBWUVSX1BPU1RGSVgpOwogIGNvbnN0IHJlY29yZGVyID0gd2luZG93LnZpZGVvanMoY29udGFpbmVySWQgKyBWSURFT19SRUNPUkRFUl9QT1NURklYKTsKICByZXNldFBsYXllclNvdXJjZShjb250YWluZXJJZCwgdmlkZW9VcmwsIGlzQXVkaW9TdHJlYW0pOwogIHJlY29yZGVyLnJlY29yZCgpLnJlc2V0U3RhdGUoKTsKICByZWNvcmRlci5yZWNvcmQoKS5nZXREZXZpY2UoKTsKCiAgLy8gUmVzZXQgZGVsZXRlIGFuZCBjYW1lcmEgYnV0dG9uIG9uIGNvbnRyb2wgcGFuZWwgZm9yIHJlY29yZGVyIHBsYXllcgogIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3VsLXZpZGVvLXJlY29yZGVyLWRlbGV0ZS1idXR0b24nKVswXTsKICBkZWxldGVCdXR0b24uY2xhc3NMaXN0LmFkZChISURERU5fQ0xBU1MpOwoKICAvLyBhZnRlciByZWZyZXNoaW5nIGRldmljZXMgd2UgbmVlZCB0byB0dXJuIG9mZiBjYW1lcmEgYWdhaW4gaWYgdGhlIGNhbWVyYSB3YXMgcHJldmlvdXNseSB0dXJuZWQgb2ZmCiAgaWYgKHJlY29yZGVyLmNhbWVyYU9mZikgewogICAgY29uc3QgY2FtZXJhQXVkaW9CdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd1bC12aWRlby1yZWNvcmRlci1jYW1lcmEtb2ZmLWJ1dHRvbi1hdWRpby1vbmx5JylbMF07CiAgICBjYW1lcmFBdWRpb0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKEhJRERFTl9DTEFTUyk7CgogICAgd2luZG93Lm5hdmlnYXRvci5tZWRpYURldmljZXMKICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlLCBhdWRpbzogdHJ1ZSB9KQogICAgICAudGhlbigoc3RyZWFtKSA9PiB7CiAgICAgICAgcmVjb3JkZXIucmVjb3JkKCkub25EZXZpY2VSZWFkeShzdHJlYW0pOwogICAgICAgIHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpLmZvckVhY2goKHN0cmVhbSkgPT4gewogICAgICAgICAgc3RyZWFtLnN0b3AoKTsKICAgICAgICB9KTsKICAgICAgfSkKICAgICAgLmNhdGNoKHJlY29yZGVyLnJlY29yZCgpLm9uRGV2aWNlRXJyb3IuYmluZChyZWNvcmRlci5yZWNvcmQoKSkpOwogIH0gZWxzZSB7CiAgICBjb25zdCBjYW1lcmFCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd1bC12aWRlby1yZWNvcmRlci1jYW1lcmEtb2ZmLWJ1dHRvbicpWzBdOwogICAgY2FtZXJhQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoSElEREVOX0NMQVNTKTsKICB9CiAgcmVjb3JkZXIucGF5bG9hZCA9IHBheWxvYWQ7CiAgc2V0VXBsb2FkUHJvZ3Jlc3MocmVjb3JkZXIudXBsb2FkUHJvZ3Jlc3NMYWJlbCwgJ25vbmUnKTsKICBjdXJyZW50UGxheWVyU2Vzc2lvbiA9IERhdGUubm93KCk7Cn07Cgpjb25zdCBnZXRQb3N0ZXJUaHVtYm5haWwgPSAoc291cmNlKSA9PiB7CiAgY29uc3QgZmluZE11eElkID0gc291cmNlLm1hdGNoKC9odHRwczpcL1wvc3RyZWFtLm11eC5jb21cLyguKikvKTsgLy8gTWF0Y2ggcmV0dXJucyBhbiBhcnJheSwgbm90IHRoZSBleGFjdCBtYXRjaGVkIHN0cmluZwogIGNvbnN0IG11eElkID0gZmluZE11eElkID8gZmluZE11eElkWzFdIDogbnVsbDsKICByZXR1cm4gbXV4SWQgPyBgaHR0cHM6Ly9pbWFnZS5tdXguY29tLyR7bXV4SWR9L3RodW1ibmFpbC5qcGc/dGltZT0wYCA6IG51bGw7Cn0KCi8qKgogKiBDb25zdGFudHMgZm9yIHJlY29yZGVyIGNhbGxiYWNrIGV2ZW50cyBhbmQgZGF0YQogKi8KY29uc3QgUkVDT1JERVIgPSB7CiAgLy8gZXZlbnRzCiAgVVBMT0FEX1NUQVJURUQ6ICd1cGxvYWQuc3RhcnRlZCcsCiAgVVBMT0FEX0ZJTklTSEVEOiAndXBsb2FkLmZpbmlzaGVkJywKICBERUxFVEU6ICdkZWxldGUnLAogIEVSUk9SOiAnZXJyb3InLAogIE1FRElBX1RZUEU6ICdtZWRpYS50eXBlJywKICAvLyBlcnJvciB0eXBlcwogIFBFUk1JU1NJT05fREVOSUVEOiAncGVybWlzc2lvbl9kZW5pZWQnLAogIE9USEVSOiAnb3RoZXInLAogIC8vZGF0YQogIFVQTE9BRF9JRDogJ3VwbG9hZC5pZCcsCiAgTUVESUFfVFlQRV9WSURFTzogJ3ZpZGVvJywKICBNRURJQV9UWVBFX0FVRElPOiAnYXVkaW8nLAp9OwoKY29uc3QgQlVUVE9OX05BTUVfVElUTEUgPSB7CiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbjogJ1NwZWVkJywKICBQbGF5VG9nZ2xlOiAnUGxheScsCiAgRnVsbHNjcmVlblRvZ2dsZTogJ0V4cGFuZCcsCiAgVHVybk9uQ2FtZXJhOiAnVHVybiBvbicsCiAgVHVybk9mZkNhbWVyYTogJ1R1cm4gb2ZmJywKICBEZWxldGVCdXR0b246ICdEZWxldGUnLAogIFJlY29yZEJ1dHRvbjogJ1JlY29yZCcsCiAgU3RvcEJ1dHRvbjogJ1N0b3AnLAogIFBhdXNlQnV0dG9uOiAnUGF1c2UnLAp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvYXV0b3NpemUvZGlzdC9hdXRvc2l6ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvYXV0b3NpemUvZGlzdC9hdXRvc2l6ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKdmFyIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXywgX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXywgX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX187LyohCglhdXRvc2l6ZSA0LjAuMgoJbGljZW5zZTogTUlUCglodHRwOi8vd3d3LmphY2tsbW9vcmUuY29tL2F1dG9zaXplCiovCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CglpZiAodHJ1ZSkgewoJCSEoX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXyA9IFttb2R1bGUsIGV4cG9ydHNdLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPSAoZmFjdG9yeSksCgkJX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gPSAodHlwZW9mIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9PT0gJ2Z1bmN0aW9uJyA/CgkJKF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXy5hcHBseShleHBvcnRzLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fKSkgOiBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18pLAoJCV9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fICE9PSB1bmRlZmluZWQgJiYgKG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18pKTsKCX0gZWxzZSB7IHZhciBtb2Q7IH0KfSkodGhpcywgZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBtYXAgPSB0eXBlb2YgTWFwID09PSAiZnVuY3Rpb24iID8gbmV3IE1hcCgpIDogZnVuY3Rpb24gKCkgewoJCXZhciBrZXlzID0gW107CgkJdmFyIHZhbHVlcyA9IFtdOwoKCQlyZXR1cm4gewoJCQloYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHsKCQkJCXJldHVybiBrZXlzLmluZGV4T2Yoa2V5KSA+IC0xOwoJCQl9LAoJCQlnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKCQkJCXJldHVybiB2YWx1ZXNba2V5cy5pbmRleE9mKGtleSldOwoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CgkJCQlpZiAoa2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7CgkJCQkJa2V5cy5wdXNoKGtleSk7CgkJCQkJdmFsdWVzLnB1c2godmFsdWUpOwoJCQkJfQoJCQl9LAoJCQlkZWxldGU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7CgkJCQl2YXIgaW5kZXggPSBrZXlzLmluZGV4T2Yoa2V5KTsKCQkJCWlmIChpbmRleCA+IC0xKSB7CgkJCQkJa2V5cy5zcGxpY2UoaW5kZXgsIDEpOwoJCQkJCXZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpOwoJCQkJfQoJCQl9CgkJfTsKCX0oKTsKCgl2YXIgY3JlYXRlRXZlbnQgPSBmdW5jdGlvbiBjcmVhdGVFdmVudChuYW1lKSB7CgkJcmV0dXJuIG5ldyBFdmVudChuYW1lLCB7IGJ1YmJsZXM6IHRydWUgfSk7Cgl9OwoJdHJ5IHsKCQluZXcgRXZlbnQoJ3Rlc3QnKTsKCX0gY2F0Y2ggKGUpIHsKCQkvLyBJRSBkb2VzIG5vdCBzdXBwb3J0IGBuZXcgRXZlbnQoKWAKCQljcmVhdGVFdmVudCA9IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KG5hbWUpIHsKCQkJdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpOwoJCQlldnQuaW5pdEV2ZW50KG5hbWUsIHRydWUsIGZhbHNlKTsKCQkJcmV0dXJuIGV2dDsKCQl9OwoJfQoKCWZ1bmN0aW9uIGFzc2lnbih0YSkgewoJCWlmICghdGEgfHwgIXRhLm5vZGVOYW1lIHx8IHRhLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnIHx8IG1hcC5oYXModGEpKSByZXR1cm47CgoJCXZhciBoZWlnaHRPZmZzZXQgPSBudWxsOwoJCXZhciBjbGllbnRXaWR0aCA9IG51bGw7CgkJdmFyIGNhY2hlZEhlaWdodCA9IG51bGw7CgoJCWZ1bmN0aW9uIGluaXQoKSB7CgkJCXZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhLCBudWxsKTsKCgkJCWlmIChzdHlsZS5yZXNpemUgPT09ICd2ZXJ0aWNhbCcpIHsKCQkJCXRhLnN0eWxlLnJlc2l6ZSA9ICdub25lJzsKCQkJfSBlbHNlIGlmIChzdHlsZS5yZXNpemUgPT09ICdib3RoJykgewoJCQkJdGEuc3R5bGUucmVzaXplID0gJ2hvcml6b250YWwnOwoJCQl9CgoJCQlpZiAoc3R5bGUuYm94U2l6aW5nID09PSAnY29udGVudC1ib3gnKSB7CgkJCQloZWlnaHRPZmZzZXQgPSAtKHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdCb3R0b20pKTsKCQkJfSBlbHNlIHsKCQkJCWhlaWdodE9mZnNldCA9IHBhcnNlRmxvYXQoc3R5bGUuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCk7CgkJCX0KCQkJLy8gRml4IHdoZW4gYSB0ZXh0YXJlYSBpcyBub3Qgb24gZG9jdW1lbnQgYm9keSBhbmQgaGVpZ2h0T2Zmc2V0IGlzIE5vdCBhIE51bWJlcgoJCQlpZiAoaXNOYU4oaGVpZ2h0T2Zmc2V0KSkgewoJCQkJaGVpZ2h0T2Zmc2V0ID0gMDsKCQkJfQoKCQkJdXBkYXRlKCk7CgkJfQoKCQlmdW5jdGlvbiBjaGFuZ2VPdmVyZmxvdyh2YWx1ZSkgewoJCQl7CgkJCQkvLyBDaHJvbWUvU2FmYXJpLXNwZWNpZmljIGZpeDoKCQkJCS8vIFdoZW4gdGhlIHRleHRhcmVhIHktb3ZlcmZsb3cgaXMgaGlkZGVuLCBDaHJvbWUvU2FmYXJpIGRvIG5vdCByZWZsb3cgdGhlIHRleHQgdG8gYWNjb3VudCBmb3IgdGhlIHNwYWNlCgkJCQkvLyBtYWRlIGF2YWlsYWJsZSBieSByZW1vdmluZyB0aGUgc2Nyb2xsYmFyLiBUaGUgZm9sbG93aW5nIGZvcmNlcyB0aGUgbmVjZXNzYXJ5IHRleHQgcmVmbG93LgoJCQkJdmFyIHdpZHRoID0gdGEuc3R5bGUud2lkdGg7CgkJCQl0YS5zdHlsZS53aWR0aCA9ICcwcHgnOwoJCQkJLy8gRm9yY2UgcmVmbG93OgoJCQkJLyoganNoaW50IGlnbm9yZTpzdGFydCAqLwoJCQkJdGEub2Zmc2V0V2lkdGg7CgkJCQkvKiBqc2hpbnQgaWdub3JlOmVuZCAqLwoJCQkJdGEuc3R5bGUud2lkdGggPSB3aWR0aDsKCQkJfQoKCQkJdGEuc3R5bGUub3ZlcmZsb3dZID0gdmFsdWU7CgkJfQoKCQlmdW5jdGlvbiBnZXRQYXJlbnRPdmVyZmxvd3MoZWwpIHsKCQkJdmFyIGFyciA9IFtdOwoKCQkJd2hpbGUgKGVsICYmIGVsLnBhcmVudE5vZGUgJiYgZWwucGFyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKCQkJCWlmIChlbC5wYXJlbnROb2RlLnNjcm9sbFRvcCkgewoJCQkJCWFyci5wdXNoKHsKCQkJCQkJbm9kZTogZWwucGFyZW50Tm9kZSwKCQkJCQkJc2Nyb2xsVG9wOiBlbC5wYXJlbnROb2RlLnNjcm9sbFRvcAoJCQkJCX0pOwoJCQkJfQoJCQkJZWwgPSBlbC5wYXJlbnROb2RlOwoJCQl9CgoJCQlyZXR1cm4gYXJyOwoJCX0KCgkJZnVuY3Rpb24gcmVzaXplKCkgewoJCQlpZiAodGEuc2Nyb2xsSGVpZ2h0ID09PSAwKSB7CgkJCQkvLyBJZiB0aGUgc2Nyb2xsSGVpZ2h0IGlzIDAsIHRoZW4gdGhlIGVsZW1lbnQgcHJvYmFibHkgaGFzIGRpc3BsYXk6bm9uZSBvciBpcyBkZXRhY2hlZCBmcm9tIHRoZSBET00uCgkJCQlyZXR1cm47CgkJCX0KCgkJCXZhciBvdmVyZmxvd3MgPSBnZXRQYXJlbnRPdmVyZmxvd3ModGEpOwoJCQl2YXIgZG9jVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7IC8vIE5lZWRlZCBmb3IgTW9iaWxlIElFICh0aWNrZXQgIzI0MCkKCgkJCXRhLnN0eWxlLmhlaWdodCA9ICcnOwoJCQl0YS5zdHlsZS5oZWlnaHQgPSB0YS5zY3JvbGxIZWlnaHQgKyBoZWlnaHRPZmZzZXQgKyAncHgnOwoKCQkJLy8gdXNlZCB0byBjaGVjayBpZiBhbiB1cGRhdGUgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IG9uIHdpbmRvdy5yZXNpemUKCQkJY2xpZW50V2lkdGggPSB0YS5jbGllbnRXaWR0aDsKCgkJCS8vIHByZXZlbnRzIHNjcm9sbC1wb3NpdGlvbiBqdW1waW5nCgkJCW92ZXJmbG93cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgewoJCQkJZWwubm9kZS5zY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3A7CgkJCX0pOwoKCQkJaWYgKGRvY1RvcCkgewoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IGRvY1RvcDsKCQkJfQoJCX0KCgkJZnVuY3Rpb24gdXBkYXRlKCkgewoJCQlyZXNpemUoKTsKCgkJCXZhciBzdHlsZUhlaWdodCA9IE1hdGgucm91bmQocGFyc2VGbG9hdCh0YS5zdHlsZS5oZWlnaHQpKTsKCQkJdmFyIGNvbXB1dGVkID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGEsIG51bGwpOwoKCQkJLy8gVXNpbmcgb2Zmc2V0SGVpZ2h0IGFzIGEgcmVwbGFjZW1lbnQgZm9yIGNvbXB1dGVkLmhlaWdodCBpbiBJRSwgYmVjYXVzZSBJRSBkb2VzIG5vdCBhY2NvdW50IHVzZSBvZiBib3JkZXItYm94CgkJCXZhciBhY3R1YWxIZWlnaHQgPSBjb21wdXRlZC5ib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcgPyBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoY29tcHV0ZWQuaGVpZ2h0KSkgOiB0YS5vZmZzZXRIZWlnaHQ7CgoJCQkvLyBUaGUgYWN0dWFsIGhlaWdodCBub3QgbWF0Y2hpbmcgdGhlIHN0eWxlIGhlaWdodCAoc2V0IHZpYSB0aGUgcmVzaXplIG1ldGhvZCkgaW5kaWNhdGVzIHRoYXQgCgkJCS8vIHRoZSBtYXgtaGVpZ2h0IGhhcyBiZWVuIGV4Y2VlZGVkLCBpbiB3aGljaCBjYXNlIHRoZSBvdmVyZmxvdyBzaG91bGQgYmUgYWxsb3dlZC4KCQkJaWYgKGFjdHVhbEhlaWdodCA8IHN0eWxlSGVpZ2h0KSB7CgkJCQlpZiAoY29tcHV0ZWQub3ZlcmZsb3dZID09PSAnaGlkZGVuJykgewoJCQkJCWNoYW5nZU92ZXJmbG93KCdzY3JvbGwnKTsKCQkJCQlyZXNpemUoKTsKCQkJCQlhY3R1YWxIZWlnaHQgPSBjb21wdXRlZC5ib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcgPyBNYXRoLnJvdW5kKHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGEsIG51bGwpLmhlaWdodCkpIDogdGEub2Zmc2V0SGVpZ2h0OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gTm9ybWFsbHkga2VlcCBvdmVyZmxvdyBzZXQgdG8gaGlkZGVuLCB0byBhdm9pZCBmbGFzaCBvZiBzY3JvbGxiYXIgYXMgdGhlIHRleHRhcmVhIGV4cGFuZHMuCgkJCQlpZiAoY29tcHV0ZWQub3ZlcmZsb3dZICE9PSAnaGlkZGVuJykgewoJCQkJCWNoYW5nZU92ZXJmbG93KCdoaWRkZW4nKTsKCQkJCQlyZXNpemUoKTsKCQkJCQlhY3R1YWxIZWlnaHQgPSBjb21wdXRlZC5ib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcgPyBNYXRoLnJvdW5kKHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGEsIG51bGwpLmhlaWdodCkpIDogdGEub2Zmc2V0SGVpZ2h0OwoJCQkJfQoJCQl9CgoJCQlpZiAoY2FjaGVkSGVpZ2h0ICE9PSBhY3R1YWxIZWlnaHQpIHsKCQkJCWNhY2hlZEhlaWdodCA9IGFjdHVhbEhlaWdodDsKCQkJCXZhciBldnQgPSBjcmVhdGVFdmVudCgnYXV0b3NpemU6cmVzaXplZCcpOwoJCQkJdHJ5IHsKCQkJCQl0YS5kaXNwYXRjaEV2ZW50KGV2dCk7CgkJCQl9IGNhdGNoIChlcnIpIHsKCQkJCQkvLyBGaXJlZm94IHdpbGwgdGhyb3cgYW4gZXJyb3Igb24gZGlzcGF0Y2hFdmVudCBmb3IgYSBkZXRhY2hlZCBlbGVtZW50CgkJCQkJLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg5Mzc2CgkJCQl9CgkJCX0KCQl9CgoJCXZhciBwYWdlUmVzaXplID0gZnVuY3Rpb24gcGFnZVJlc2l6ZSgpIHsKCQkJaWYgKHRhLmNsaWVudFdpZHRoICE9PSBjbGllbnRXaWR0aCkgewoJCQkJdXBkYXRlKCk7CgkJCX0KCQl9OwoKCQl2YXIgZGVzdHJveSA9IGZ1bmN0aW9uIChzdHlsZSkgewoJCQl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcGFnZVJlc2l6ZSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIHVwZGF0ZSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVwZGF0ZSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdhdXRvc2l6ZTpkZXN0cm95JywgZGVzdHJveSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdhdXRvc2l6ZTp1cGRhdGUnLCB1cGRhdGUsIGZhbHNlKTsKCgkJCU9iamVjdC5rZXlzKHN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKCQkJCXRhLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldOwoJCQl9KTsKCgkJCW1hcC5kZWxldGUodGEpOwoJCX0uYmluZCh0YSwgewoJCQloZWlnaHQ6IHRhLnN0eWxlLmhlaWdodCwKCQkJcmVzaXplOiB0YS5zdHlsZS5yZXNpemUsCgkJCW92ZXJmbG93WTogdGEuc3R5bGUub3ZlcmZsb3dZLAoJCQlvdmVyZmxvd1g6IHRhLnN0eWxlLm92ZXJmbG93WCwKCQkJd29yZFdyYXA6IHRhLnN0eWxlLndvcmRXcmFwCgkJfSk7CgoJCXRhLmFkZEV2ZW50TGlzdGVuZXIoJ2F1dG9zaXplOmRlc3Ryb3knLCBkZXN0cm95LCBmYWxzZSk7CgoJCS8vIElFOSBkb2VzIG5vdCBmaXJlIG9ucHJvcGVydHljaGFuZ2Ugb3Igb25pbnB1dCBmb3IgZGVsZXRpb25zLAoJCS8vIHNvIGJpbmRpbmcgdG8gb25rZXl1cCB0byBjYXRjaCBtb3N0IG9mIHRob3NlIGV2ZW50cy4KCQkvLyBUaGVyZSBpcyBubyB3YXkgdGhhdCBJIGtub3cgb2YgdG8gZGV0ZWN0IHNvbWV0aGluZyBsaWtlICdjdXQnIGluIElFOS4KCQlpZiAoJ29ucHJvcGVydHljaGFuZ2UnIGluIHRhICYmICdvbmlucHV0JyBpbiB0YSkgewoJCQl0YS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVwZGF0ZSwgZmFsc2UpOwoJCX0KCgkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHBhZ2VSZXNpemUsIGZhbHNlKTsKCQl0YS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHVwZGF0ZSwgZmFsc2UpOwoJCXRhLmFkZEV2ZW50TGlzdGVuZXIoJ2F1dG9zaXplOnVwZGF0ZScsIHVwZGF0ZSwgZmFsc2UpOwoJCXRhLnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nOwoJCXRhLnN0eWxlLndvcmRXcmFwID0gJ2JyZWFrLXdvcmQnOwoKCQltYXAuc2V0KHRhLCB7CgkJCWRlc3Ryb3k6IGRlc3Ryb3ksCgkJCXVwZGF0ZTogdXBkYXRlCgkJfSk7CgoJCWluaXQoKTsKCX0KCglmdW5jdGlvbiBkZXN0cm95KHRhKSB7CgkJdmFyIG1ldGhvZHMgPSBtYXAuZ2V0KHRhKTsKCQlpZiAobWV0aG9kcykgewoJCQltZXRob2RzLmRlc3Ryb3koKTsKCQl9Cgl9CgoJZnVuY3Rpb24gdXBkYXRlKHRhKSB7CgkJdmFyIG1ldGhvZHMgPSBtYXAuZ2V0KHRhKTsKCQlpZiAobWV0aG9kcykgewoJCQltZXRob2RzLnVwZGF0ZSgpOwoJCX0KCX0KCgl2YXIgYXV0b3NpemUgPSBudWxsOwoKCS8vIERvIG5vdGhpbmcgaW4gTm9kZS5qcyBlbnZpcm9ubWVudCBhbmQgSUU4IChvciBsb3dlcikKCWlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgIT09ICdmdW5jdGlvbicpIHsKCQlhdXRvc2l6ZSA9IGZ1bmN0aW9uIGF1dG9zaXplKGVsKSB7CgkJCXJldHVybiBlbDsKCQl9OwoJCWF1dG9zaXplLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZWwpIHsKCQkJcmV0dXJuIGVsOwoJCX07CgkJYXV0b3NpemUudXBkYXRlID0gZnVuY3Rpb24gKGVsKSB7CgkJCXJldHVybiBlbDsKCQl9OwoJfSBlbHNlIHsKCQlhdXRvc2l6ZSA9IGZ1bmN0aW9uIGF1dG9zaXplKGVsLCBvcHRpb25zKSB7CgkJCWlmIChlbCkgewoJCQkJQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5sZW5ndGggPyBlbCA6IFtlbF0sIGZ1bmN0aW9uICh4KSB7CgkJCQkJcmV0dXJuIGFzc2lnbih4LCBvcHRpb25zKTsKCQkJCX0pOwoJCQl9CgkJCXJldHVybiBlbDsKCQl9OwoJCWF1dG9zaXplLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZWwpIHsKCQkJaWYgKGVsKSB7CgkJCQlBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVsLmxlbmd0aCA/IGVsIDogW2VsXSwgZGVzdHJveSk7CgkJCX0KCQkJcmV0dXJuIGVsOwoJCX07CgkJYXV0b3NpemUudXBkYXRlID0gZnVuY3Rpb24gKGVsKSB7CgkJCWlmIChlbCkgewoJCQkJQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5sZW5ndGggPyBlbCA6IFtlbF0sIHVwZGF0ZSk7CgkJCX0KCQkJcmV0dXJuIGVsOwoJCX07Cgl9CgoJZXhwb3J0cy5kZWZhdWx0ID0gYXV0b3NpemU7Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jbGFzc2NhdC9zcmMvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gY2M7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7CnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheQoKZnVuY3Rpb24gY2MobmFtZXMpIHsKICB2YXIgaQogIHZhciBsZW4KICB2YXIgdG1wID0gdHlwZW9mIG5hbWVzCiAgdmFyIG91dCA9ICIiCgogIGlmICh0bXAgPT09ICJzdHJpbmciIHx8IHRtcCA9PT0gIm51bWJlciIpIHJldHVybiBuYW1lcyB8fCAiIgoKICBpZiAoaXNBcnJheShuYW1lcykgJiYgbmFtZXMubGVuZ3RoID4gMCkgewogICAgZm9yIChpID0gMCwgbGVuID0gbmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgaWYgKCh0bXAgPSBjYyhuYW1lc1tpXSkpICE9PSAiIikgb3V0ICs9IChvdXQgJiYgIiAiKSArIHRtcAogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgaW4gbmFtZXMpIHsKICAgICAgaWYgKG5hbWVzLmhhc093blByb3BlcnR5KGkpICYmIG5hbWVzW2ldKSBvdXQgKz0gKG91dCAmJiAiICIpICsgaQogICAgfQogIH0KCiAgcmV0dXJuIG91dAp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmNyZWF0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmZyb20tZW50cmllcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcm9tLWVudHJpZXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5pcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5pcy1leHRlbnNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLWV4dGVuc2libGUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuaXMtZnJvemVuICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLWZyb3plbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5pcy1zZWFsZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtc2VhbGVkLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QucHJldmVudC1leHRlbnNpb25zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LnNlYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Quc2VhbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1nZXR0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLWdldHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtc2V0dGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QubG9va3VwLWdldHRlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5sb29rdXAtZ2V0dGVyLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1zZXR0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QubG9va3VwLXNldHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmZ1bmN0aW9uLmJpbmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkub2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmNvcHktd2l0aGluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29weS13aXRoaW4uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5ldmVyeSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmV2ZXJ5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZmlsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZmxhdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5mbGF0LW1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuam9pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5sYXN0LWluZGV4LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubGFzdC1pbmRleC1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5Lm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS1yaWdodCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS1yaWdodC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnJldmVyc2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZXZlcnNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnNvbWUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb21lLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuc29ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BlY2llcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmF3LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLmNvZGUtcG9pbnQtYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuY29kZS1wb2ludC1hdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcucGFkLWVuZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcucmVwZWF0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy50cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1zdGFydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXN0YXJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLmFuY2hvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hbmNob3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuYmlnICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJpZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5ibGluayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ibGluay5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5ib2xkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJvbGQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuZml4ZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZml4ZWQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuZm9udGNvbG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZvbnRjb2xvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0YWxpY3MuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcubGluayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdHJpa2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3ViICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1Yi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5zdXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3VwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucGFyc2UtaW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtaW50LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucGFyc2UtZmxvYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5lcHNpbG9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmVwc2lsb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtZmluaXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWZpbml0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5pcy1zYWZlLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubnVtYmVyLm1heC1zYWZlLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5taW4tc2FmZS1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci50by1wcmVjaXNpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tcHJlY2lzaW9uLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5hY29zaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYWNvc2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmFzaW5oICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5hc2luaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGguYXRhbmggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmF0YW5oLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5jYnJ0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jYnJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5jbHozMiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguY2x6MzIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmNvc2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmNvc2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmV4cG0xICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5leHBtMS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGguZnJvdW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5mcm91bmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmh5cG90ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGguaW11bCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaW11bC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGgubG9nMTAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmxvZzEwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5sb2cxcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgubG9nMXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmxvZzIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmxvZzIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnNpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpZ24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnNpbmggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpbmguanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnRhbmggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRhbmguanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnRydW5jICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC50cnVuYy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmRhdGUubm93ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS5ub3cuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5kYXRlLnRvLWpzb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLWpzb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5kYXRlLnRvLWlzby1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLWlzby1zdHJpbmcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tc3RyaW5nLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuZGF0ZS50by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc2V0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc2V0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMud2Vhay1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLndlYWstc2V0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1zZXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuaXMtdmlldyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5pcy12aWV3LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuZGF0YS12aWV3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0YS12aWV3LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50OC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQxNi1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDE2LWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDE2LWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDE2LWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQzMi1hcnJheS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZsb2F0MzItYXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mbG9hdDMyLWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQ2NC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZsb2F0NjQtYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lm9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkub2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5jb3B5LXdpdGhpbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmNvcHktd2l0aGluLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5ldmVyeS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maWxsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsdGVyLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1pbmRleC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZvci1lYWNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZm9yLWVhY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmluY2x1ZGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW5kZXgtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmRleC1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaXRlcmF0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5qb2luICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuam9pbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lmxhc3QtaW5kZXgtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5sYXN0LWluZGV4LW9mLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLXJpZ2h0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLXJpZ2h0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmV2ZXJzZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJldmVyc2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zbGljZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNsaWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29tZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnN1YmFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc3ViYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tbG9jYWxlLXN0cmluZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXN0cmluZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXN0cmluZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmFwcGx5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5jb25zdHJ1Y3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmNvbnN0cnVjdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LmhhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuaGFzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5vd24ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Qub3duLWtleXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5zZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnNldC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgcGF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhdGg7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2VzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2luZGV4LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJvcG9zYWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9pbmRleC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3dlYiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy93ZWIvaW5kZXguanMiKTsKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ludGVybmFscy9wYXRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhdGg7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHsKICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpOwogIH0gcmV0dXJuIGl0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkgewogICAgdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIiArIFN0cmluZyhpdCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7CiAgfSByZXR1cm4gaXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7Cgp2YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7CnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTsKCi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXQovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlcwppZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIGNyZWF0ZShudWxsKSk7Cn0KCi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc10KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7CiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBjaGFyQXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIpLmNoYXJBdDsKCi8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXgKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUywgaW5kZXgsIHVuaWNvZGUpIHsKICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGNoYXJBdChTLCBpbmRleCkubGVuZ3RoIDogMSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkgewogIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTsKICB9IHJldHVybiBpdDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmICghaXNPYmplY3QoaXQpKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGFuIG9iamVjdCcpOwogIH0gcmV0dXJuIGl0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiKTsKCnZhciBEYXRhVmlldyA9IGdsb2JhbC5EYXRhVmlldzsKdmFyIERhdGFWaWV3UHJvdG90eXBlID0gRGF0YVZpZXcgJiYgRGF0YVZpZXcucHJvdG90eXBlOwp2YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTsKdmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlOwp2YXIgVWludDhDbGFtcGVkQXJyYXkgPSBnbG9iYWwuVWludDhDbGFtcGVkQXJyYXk7CnZhciBVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSA9IFVpbnQ4Q2xhbXBlZEFycmF5ICYmIFVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZTsKdmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTsKdmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXlQcm90b3R5cGUgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5UHJvdG90eXBlKTsKdmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CnZhciBpc1Byb3RvdHlwZU9mID0gT2JqZWN0UHJvdG90eXBlLmlzUHJvdG90eXBlT2Y7Cgp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKdmFyIFRZUEVEX0FSUkFZX1RBRyA9IHVpZCgnVFlQRURfQVJSQVlfVEFHJyk7CnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gISEoZ2xvYmFsLkFycmF5QnVmZmVyICYmIERhdGFWaWV3KTsKLy8gRml4aW5nIG5hdGl2ZSB0eXBlZCBhcnJheXMgaW4gT3BlcmEgUHJlc3RvIGNyYXNoZXMgdGhlIGJyb3dzZXIsIHNlZSAjNTk1CnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJzsKdmFyIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gZmFsc2U7CnZhciBOQU1FOwoKdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0ID0gewogIEludDhBcnJheTogMSwKICBVaW50OEFycmF5OiAxLAogIFVpbnQ4Q2xhbXBlZEFycmF5OiAxLAogIEludDE2QXJyYXk6IDIsCiAgVWludDE2QXJyYXk6IDIsCiAgSW50MzJBcnJheTogNCwKICBVaW50MzJBcnJheTogNCwKICBGbG9hdDMyQXJyYXk6IDQsCiAgRmxvYXQ2NEFycmF5OiA4Cn07Cgp2YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7CiAgdmFyIGtsYXNzID0gY2xhc3NvZihpdCk7CiAgcmV0dXJuIGtsYXNzID09PSAnRGF0YVZpZXcnIHx8IGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpOwp9OwoKdmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBpc09iamVjdChpdCkgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBjbGFzc29mKGl0KSk7Cn07Cgp2YXIgYVR5cGVkQXJyYXkgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoaXNUeXBlZEFycmF5KGl0KSkgcmV0dXJuIGl0OwogIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7Cn07Cgp2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7CiAgaWYgKHNldFByb3RvdHlwZU9mKSB7CiAgICBpZiAoaXNQcm90b3R5cGVPZi5jYWxsKFR5cGVkQXJyYXksIEMpKSByZXR1cm4gQzsKICB9IGVsc2UgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIGlmIChoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIE5BTUUpKSB7CiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKEMgPT09IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciB8fCBpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBDKSkpIHsKICAgICAgcmV0dXJuIEM7CiAgICB9CiAgfSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvcicpOwp9OwoKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7CiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuOwogIGlmIChmb3JjZWQpIGZvciAodmFyIEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHsKICAgICAgZGVsZXRlIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGVbS0VZXTsKICAgIH0KICB9CiAgaWYgKCFUeXBlZEFycmF5UHJvdG90eXBlW0tFWV0gfHwgZm9yY2VkKSB7CiAgICByZWRlZmluZShUeXBlZEFycmF5UHJvdG90eXBlLCBLRVksIGZvcmNlZCA/IHByb3BlcnR5CiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSk7CiAgfQp9OwoKdmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7CiAgdmFyIEFSUkFZLCBUeXBlZEFycmF5Q29uc3RydWN0b3I7CiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuOwogIGlmIChzZXRQcm90b3R5cGVPZikgewogICAgaWYgKGZvcmNlZCkgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldOwogICAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSkpIHsKICAgICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV07CiAgICAgIH0KICAgIH0KICAgIGlmICghVHlwZWRBcnJheVtLRVldIHx8IGZvcmNlZCkgewogICAgICAvLyBWOCB+IENocm9tZSA0OS01MCBgJVR5cGVkQXJyYXklYCBtZXRob2RzIGFyZSBub24td3JpdGFibGUgbm9uLWNvbmZpZ3VyYWJsZQogICAgICB0cnkgewogICAgICAgIHJldHVybiByZWRlZmluZShUeXBlZEFycmF5LCBLRVksIGZvcmNlZCA/IHByb3BlcnR5IDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KICAgIH0gZWxzZSByZXR1cm47CiAgfQogIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07CiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkgewogICAgICByZWRlZmluZShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpOwogICAgfQogIH0KfTsKCmZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogIGlmICghZ2xvYmFsW05BTUVdKSBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gZmFsc2U7Cn0KCi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlCmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCB0eXBlb2YgVHlwZWRBcnJheSAhPSAnZnVuY3Rpb24nIHx8IFR5cGVkQXJyYXkgPT09IEZ1bmN0aW9uLnByb3RvdHlwZSkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cKICBUeXBlZEFycmF5ID0gZnVuY3Rpb24gVHlwZWRBcnJheSgpIHsKICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTsKICB9OwogIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKICAgIGlmIChnbG9iYWxbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXSwgVHlwZWRBcnJheSk7CiAgfQp9CgppZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIVR5cGVkQXJyYXlQcm90b3R5cGUgfHwgVHlwZWRBcnJheVByb3RvdHlwZSA9PT0gT2JqZWN0UHJvdG90eXBlKSB7CiAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkucHJvdG90eXBlOwogIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKICAgIGlmIChnbG9iYWxbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXS5wcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOwogIH0KfQoKLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW4KaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUpICE9PSBUeXBlZEFycmF5UHJvdG90eXBlKSB7CiAgc2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOwp9CgppZiAoREVTQ1JJUFRPUlMgJiYgIWhhcyhUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgewogIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gdHJ1ZTsKICBkZWZpbmVQcm9wZXJ0eShUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7IGdldDogZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkOwogIH0gfSk7CiAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSBpZiAoZ2xvYmFsW05BTUVdKSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsW05BTUVdLCBUWVBFRF9BUlJBWV9UQUcsIE5BTUUpOwogIH0KfQoKLy8gV2ViS2l0IGJ1ZyAtIHRoZSBzYW1lIHBhcmVudCBwcm90b3R5cGUgZm9yIHR5cGVkIGFycmF5cyBhbmQgZGF0YSB2aWV3CmlmIChOQVRJVkVfQVJSQVlfQlVGRkVSICYmIHNldFByb3RvdHlwZU9mICYmIGdldFByb3RvdHlwZU9mKERhdGFWaWV3UHJvdG90eXBlKSAhPT0gT2JqZWN0UHJvdG90eXBlKSB7CiAgc2V0UHJvdG90eXBlT2YoRGF0YVZpZXdQcm90b3R5cGUsIE9iamVjdFByb3RvdHlwZSk7Cn0KCm1vZHVsZS5leHBvcnRzID0gewogIE5BVElWRV9BUlJBWV9CVUZGRVI6IE5BVElWRV9BUlJBWV9CVUZGRVIsCiAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUywKICBUWVBFRF9BUlJBWV9UQUc6IFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEICYmIFRZUEVEX0FSUkFZX1RBRywKICBhVHlwZWRBcnJheTogYVR5cGVkQXJyYXksCiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciwKICBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLAogIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QsCiAgaXNWaWV3OiBpc1ZpZXcsCiAgaXNUeXBlZEFycmF5OiBpc1R5cGVkQXJyYXksCiAgVHlwZWRBcnJheTogVHlwZWRBcnJheSwKICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIikuTkFUSVZFX0FSUkFZX0JVRkZFUjsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmVBbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9JbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanMiKTsKdmFyIElFRUU3NTQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaWVlZTc1NCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciBhcnJheUZpbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktZmlsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwoKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7CnZhciBEQVRBX1ZJRVcgPSAnRGF0YVZpZXcnOwp2YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7CnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJzsKdmFyIFdST05HX0lOREVYID0gJ1dyb25nIGluZGV4JzsKdmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07CnZhciAkQXJyYXlCdWZmZXIgPSBOYXRpdmVBcnJheUJ1ZmZlcjsKdmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddOwp2YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yOwoKdmFyIHBhY2tJRUVFNzU0ID0gSUVFRTc1NC5wYWNrOwp2YXIgdW5wYWNrSUVFRTc1NCA9IElFRUU3NTQudW5wYWNrOwoKdmFyIHBhY2tJbnQ4ID0gZnVuY3Rpb24gKG51bWJlcikgewogIHJldHVybiBbbnVtYmVyICYgMHhGRl07Cn07Cgp2YXIgcGFja0ludDE2ID0gZnVuY3Rpb24gKG51bWJlcikgewogIHJldHVybiBbbnVtYmVyICYgMHhGRiwgbnVtYmVyID4+IDggJiAweEZGXTsKfTsKCnZhciBwYWNrSW50MzIgPSBmdW5jdGlvbiAobnVtYmVyKSB7CiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkYsIG51bWJlciA+PiAxNiAmIDB4RkYsIG51bWJlciA+PiAyNCAmIDB4RkZdOwp9OwoKdmFyIHVucGFja0ludDMyID0gZnVuY3Rpb24gKGJ1ZmZlcikgewogIHJldHVybiBidWZmZXJbM10gPDwgMjQgfCBidWZmZXJbMl0gPDwgMTYgfCBidWZmZXJbMV0gPDwgOCB8IGJ1ZmZlclswXTsKfTsKCnZhciBwYWNrRmxvYXQzMiA9IGZ1bmN0aW9uIChudW1iZXIpIHsKICByZXR1cm4gcGFja0lFRUU3NTQobnVtYmVyLCAyMywgNCk7Cn07Cgp2YXIgcGFja0Zsb2F0NjQgPSBmdW5jdGlvbiAobnVtYmVyKSB7CiAgcmV0dXJuIHBhY2tJRUVFNzU0KG51bWJlciwgNTIsIDgpOwp9OwoKdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwga2V5KSB7CiAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3JbUFJPVE9UWVBFXSwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldOyB9IH0pOwp9OwoKdmFyIGdldCA9IGZ1bmN0aW9uICh2aWV3LCBjb3VudCwgaW5kZXgsIGlzTGl0dGxlRW5kaWFuKSB7CiAgdmFyIGludEluZGV4ID0gdG9JbmRleChpbmRleCk7CiAgdmFyIHN0b3JlID0gZ2V0SW50ZXJuYWxTdGF0ZSh2aWV3KTsKICBpZiAoaW50SW5kZXggKyBjb3VudCA+IHN0b3JlLmJ5dGVMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpOwogIHZhciBieXRlcyA9IGdldEludGVybmFsU3RhdGUoc3RvcmUuYnVmZmVyKS5ieXRlczsKICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHN0b3JlLmJ5dGVPZmZzZXQ7CiAgdmFyIHBhY2sgPSBieXRlcy5zbGljZShzdGFydCwgc3RhcnQgKyBjb3VudCk7CiAgcmV0dXJuIGlzTGl0dGxlRW5kaWFuID8gcGFjayA6IHBhY2sucmV2ZXJzZSgpOwp9OwoKdmFyIHNldCA9IGZ1bmN0aW9uICh2aWV3LCBjb3VudCwgaW5kZXgsIGNvbnZlcnNpb24sIHZhbHVlLCBpc0xpdHRsZUVuZGlhbikgewogIHZhciBpbnRJbmRleCA9IHRvSW5kZXgoaW5kZXgpOwogIHZhciBzdG9yZSA9IGdldEludGVybmFsU3RhdGUodmlldyk7CiAgaWYgKGludEluZGV4ICsgY291bnQgPiBzdG9yZS5ieXRlTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTsKICB2YXIgYnl0ZXMgPSBnZXRJbnRlcm5hbFN0YXRlKHN0b3JlLmJ1ZmZlcikuYnl0ZXM7CiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyBzdG9yZS5ieXRlT2Zmc2V0OwogIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgYnl0ZXNbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogY291bnQgLSBpIC0gMV07Cn07CgppZiAoIU5BVElWRV9BUlJBWV9CVUZGRVIpIHsKICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHsKICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpOwogICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7CiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgICAgYnl0ZXM6IGFycmF5RmlsbC5jYWxsKG5ldyBBcnJheShieXRlTGVuZ3RoKSwgMCksCiAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgKICAgIH0pOwogICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDsKICB9OwoKICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHsKICAgIGFuSW5zdGFuY2UodGhpcywgJERhdGFWaWV3LCBEQVRBX1ZJRVcpOwogICAgYW5JbnN0YW5jZShidWZmZXIsICRBcnJheUJ1ZmZlciwgREFUQV9WSUVXKTsKICAgIHZhciBidWZmZXJMZW5ndGggPSBnZXRJbnRlcm5hbFN0YXRlKGJ1ZmZlcikuYnl0ZUxlbmd0aDsKICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoYnl0ZU9mZnNldCk7CiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpOwogICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpOwogICAgaWYgKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTsKICAgIHNldEludGVybmFsU3RhdGUodGhpcywgewogICAgICBidWZmZXI6IGJ1ZmZlciwKICAgICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aCwKICAgICAgYnl0ZU9mZnNldDogb2Zmc2V0CiAgICB9KTsKICAgIGlmICghREVTQ1JJUFRPUlMpIHsKICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CiAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAgIHRoaXMuYnl0ZU9mZnNldCA9IG9mZnNldDsKICAgIH0KICB9OwoKICBpZiAoREVTQ1JJUFRPUlMpIHsKICAgIGFkZEdldHRlcigkQXJyYXlCdWZmZXIsICdieXRlTGVuZ3RoJyk7CiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnVmZmVyJyk7CiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnl0ZUxlbmd0aCcpOwogICAgYWRkR2V0dGVyKCREYXRhVmlldywgJ2J5dGVPZmZzZXQnKTsKICB9CgogIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7CiAgICBnZXRJbnQ4OiBmdW5jdGlvbiBnZXRJbnQ4KGJ5dGVPZmZzZXQpIHsKICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDsKICAgIH0sCiAgICBnZXRVaW50ODogZnVuY3Rpb24gZ2V0VWludDgoYnl0ZU9mZnNldCkgewogICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdOwogICAgfSwKICAgIGdldEludDE2OiBmdW5jdGlvbiBnZXRJbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjsKICAgIH0sCiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07CiAgICB9LAogICAgZ2V0SW50MzI6IGZ1bmN0aW9uIGdldEludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHsKICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpOwogICAgfSwKICAgIGdldFVpbnQzMjogZnVuY3Rpb24gZ2V0VWludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHsKICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpID4+PiAwOwogICAgfSwKICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpLCAyMyk7CiAgICB9LAogICAgZ2V0RmxvYXQ2NDogZnVuY3Rpb24gZ2V0RmxvYXQ2NChieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCksIDUyKTsKICAgIH0sCiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7CiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSW50OCwgdmFsdWUpOwogICAgfSwKICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkgewogICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0ludDgsIHZhbHVlKTsKICAgIH0sCiAgICBzZXRJbnQxNjogZnVuY3Rpb24gc2V0SW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHsKICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJbnQxNiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTsKICAgIH0sCiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0ludDE2LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpOwogICAgfSwKICAgIHNldEludDMyOiBmdW5jdGlvbiBzZXRJbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0ludDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpOwogICAgfSwKICAgIHNldFVpbnQzMjogZnVuY3Rpb24gc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSW50MzIsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7CiAgICB9LAogICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0MzIsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7CiAgICB9LAogICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0NjQsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7CiAgICB9CiAgfSk7Cn0gZWxzZSB7CiAgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7CiAgICBOYXRpdmVBcnJheUJ1ZmZlcigxKTsKICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcKICB9KSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcKICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcigxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldwogICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKE5hTik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3CiAgICByZXR1cm4gTmF0aXZlQXJyYXlCdWZmZXIubmFtZSAhPSBBUlJBWV9CVUZGRVI7CiAgfSkpIHsKICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkgewogICAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlcik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQXJyYXlCdWZmZXIodG9JbmRleChsZW5ndGgpKTsKICAgIH07CiAgICB2YXIgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXSA9IE5hdGl2ZUFycmF5QnVmZmVyW1BST1RPVFlQRV07CiAgICBmb3IgKHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVBcnJheUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHsKICAgICAgaWYgKCEoKGtleSA9IGtleXNbaisrXSkgaW4gJEFycmF5QnVmZmVyKSkgewogICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSgkQXJyYXlCdWZmZXIsIGtleSwgTmF0aXZlQXJyYXlCdWZmZXJba2V5XSk7CiAgICAgIH0KICAgIH0KICAgIEFycmF5QnVmZmVyUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJEFycmF5QnVmZmVyOwogIH0KICAvLyBpT1MgU2FmYXJpIDcueCBidWcKICB2YXIgdGVzdFZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpOwogIHZhciBuYXRpdmVTZXRJbnQ4ID0gJERhdGFWaWV3W1BST1RPVFlQRV0uc2V0SW50ODsKICB0ZXN0Vmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpOwogIHRlc3RWaWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7CiAgaWYgKHRlc3RWaWV3LmdldEludDgoMCkgfHwgIXRlc3RWaWV3LmdldEludDgoMSkpIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7CiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7CiAgICAgIG5hdGl2ZVNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7CiAgICB9LAogICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7CiAgICAgIG5hdGl2ZVNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7CiAgICB9CiAgfSwgeyB1bnNhZmU6IHRydWUgfSk7Cn0KCnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTsKc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpOwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciwKICBEYXRhVmlldzogJERhdGFWaWV3Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktY29weS13aXRoaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1jb3B5LXdpdGhpbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwoKdmFyIG1pbiA9IE1hdGgubWluOwoKLy8gYEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmNvcHl3aXRoaW4KbW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7CiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTsKICB2YXIgbGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7CiAgdmFyIGZyb20gPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7CiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkOwogIHZhciBjb3VudCA9IG1pbigoZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW4pKSAtIGZyb20sIGxlbiAtIHRvKTsKICB2YXIgaW5jID0gMTsKICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7CiAgICBpbmMgPSAtMTsKICAgIGZyb20gKz0gY291bnQgLSAxOwogICAgdG8gKz0gY291bnQgLSAxOwogIH0KICB3aGlsZSAoY291bnQtLSA+IDApIHsKICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTsKICAgIGVsc2UgZGVsZXRlIE9bdG9dOwogICAgdG8gKz0gaW5jOwogICAgZnJvbSArPSBpbmM7CiAgfSByZXR1cm4gTzsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1maWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1maWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9BYnNvbHV0ZUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWxsCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiAsIHN0YXJ0ID0gMCwgZW5kID0gQGxlbmd0aCAqLykgewogIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKTsKICB2YXIgZW5kID0gYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDsKICB2YXIgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpOwogIHdoaWxlIChlbmRQb3MgPiBpbmRleCkgT1tpbmRleCsrXSA9IHZhbHVlOwogIHJldHVybiBPOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZvckVhY2g7CnZhciBzbG9wcHlBcnJheU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaAptb2R1bGUuZXhwb3J0cyA9IHNsb3BweUFycmF5TWV0aG9kKCdmb3JFYWNoJykgPyBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSA6IFtdLmZvckVhY2g7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIik7CnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwoKLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykgewogIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTsKICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7CiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTsKICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0OwogIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpOwogIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlCiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHsKICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTsKICAgIG5leHQgPSBpdGVyYXRvci5uZXh0OwogICAgcmVzdWx0ID0gbmV3IEMoKTsKICAgIGZvciAoOyEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmU7IGluZGV4KyspIHsKICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZwogICAgICAgID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpCiAgICAgICAgOiBzdGVwLnZhbHVlCiAgICAgICk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7CiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgewogICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdKTsKICAgIH0KICB9CiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4OwogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbgp2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7CiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkgewogICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7CiAgICB2YXIgdmFsdWU7CiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtCiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkgewogICAgICB2YWx1ZSA9IE9baW5kZXgrK107CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTsKICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3QKICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgewogICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7CiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlcwogIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksCiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZgogIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSkKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKCnZhciBwdXNoID0gW10ucHVzaDsKCi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkgewogIHZhciBJU19NQVAgPSBUWVBFID09IDE7CiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjsKICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMzsKICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7CiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7CiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7CiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHsKICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpOwogICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQsIDMpOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTsKICAgIHZhciBpbmRleCA9IDA7CiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlOwogICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7CiAgICB2YXIgdmFsdWUsIHJlc3VsdDsKICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikgewogICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdOwogICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7CiAgICAgIGlmIChUWVBFKSB7CiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwCiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHsKICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lCiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZAogICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleAogICAgICAgICAgY2FzZSAyOiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlcgogICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgIC8vIGV2ZXJ5CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2gKICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksCiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXAKICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSwKICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlcgogIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLAogIC8vIGBBcnJheS5wcm90b3R5cGUuc29tZWAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWUKICBzb21lOiBjcmVhdGVNZXRob2QoMyksCiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5CiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSwKICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kCiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLAogIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4CiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNikKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHNsb3BweUFycmF5TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QuanMiKTsKCnZhciBtaW4gPSBNYXRoLm1pbjsKdmFyIG5hdGl2ZUxhc3RJbmRleE9mID0gW10ubGFzdEluZGV4T2Y7CnZhciBORUdBVElWRV9aRVJPID0gISFuYXRpdmVMYXN0SW5kZXhPZiAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7CnZhciBTTE9QUFlfTUVUSE9EID0gc2xvcHB5QXJyYXlNZXRob2QoJ2xhc3RJbmRleE9mJyk7CgovLyBgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmxhc3RpbmRleG9mCm1vZHVsZS5leHBvcnRzID0gKE5FR0FUSVZFX1pFUk8gfHwgU0xPUFBZX01FVEhPRCkgPyBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7CiAgLy8gY29udmVydCAtMCB0byArMAogIGlmIChORUdBVElWRV9aRVJPKSByZXR1cm4gbmF0aXZlTGFzdEluZGV4T2YuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwOwogIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KHRoaXMpOwogIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIGluZGV4ID0gbWluKGluZGV4LCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7CiAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBsZW5ndGggKyBpbmRleDsKICBmb3IgKDtpbmRleCA+PSAwOyBpbmRleC0tKSBpZiAoaW5kZXggaW4gTyAmJiBPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGluZGV4IHx8IDA7CiAgcmV0dXJuIC0xOwp9IDogbmF0aXZlTGFzdEluZGV4T2Y7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgVjhfVkVSU0lPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92OC12ZXJzaW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC12ZXJzaW9uLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHsKICAvLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXMKICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbgogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzcKICByZXR1cm4gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgdmFyIGFycmF5ID0gW107CiAgICB2YXIgY29uc3RydWN0b3IgPSBhcnJheS5jb25zdHJ1Y3RvciA9IHt9OwogICAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7IGZvbzogMSB9OwogICAgfTsKICAgIHJldHVybiBhcnJheVtNRVRIT0RfTkFNRV0oQm9vbGVhbikuZm9vICE9PSAxOwogIH0pOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1yZWR1Y2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUueyByZWR1Y2UsIHJlZHVjZVJpZ2h0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb24KdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19SSUdIVCkgewogIHJldHVybiBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYXJndW1lbnRzTGVuZ3RoLCBtZW1vKSB7CiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7CiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpOwogICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHZhciBpbmRleCA9IElTX1JJR0hUID8gbGVuZ3RoIC0gMSA6IDA7CiAgICB2YXIgaSA9IElTX1JJR0hUID8gLTEgOiAxOwogICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA8IDIpIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChpbmRleCBpbiBzZWxmKSB7CiAgICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdOwogICAgICAgIGluZGV4ICs9IGk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaW5kZXggKz0gaTsKICAgICAgaWYgKElTX1JJR0hUID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7CiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoO0lTX1JJR0hUID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikgewogICAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pOwogICAgfQogICAgcmV0dXJuIG1lbW87CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlCiAgbGVmdDogY3JlYXRlTWV0aG9kKGZhbHNlKSwKICAvLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlcmlnaHQKICByaWdodDogY3JlYXRlTWV0aG9kKHRydWUpCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKCi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGUKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7CiAgdmFyIEM7CiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHsKICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yOwogICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2sKICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7CiAgICBlbHNlIGlmIChpc09iamVjdChDKSkgewogICAgICBDID0gQ1tTUEVDSUVTXTsKICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7CiAgICB9CiAgfSByZXR1cm4gbmV3IChDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEMpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCnZhciBQcm9taXNlID0gZ2V0QnVpbHRJbignUHJvbWlzZScpOwp2YXIgcHVzaCA9IFtdLnB1c2g7Cgp2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHsKICB2YXIgSVNfVE9fQVJSQVkgPSBUWVBFID09IDA7CiAgdmFyIElTX0ZPUl9FQUNIID0gVFlQRSA9PSAxOwogIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gMjsKICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMzsKICByZXR1cm4gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbikgewogICAgYW5PYmplY3QoaXRlcmF0b3IpOwogICAgdmFyIG5leHQgPSBhRnVuY3Rpb24oaXRlcmF0b3IubmV4dCk7CiAgICB2YXIgYXJyYXkgPSBJU19UT19BUlJBWSA/IFtdIDogdW5kZWZpbmVkOwogICAgaWYgKCFJU19UT19BUlJBWSkgYUZ1bmN0aW9uKGZuKTsKCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvcikpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICAgIHJlc29sdmUoSVNfVE9fQVJSQVkgPyBhcnJheSA6IElTX1NPTUUgPyBmYWxzZSA6IElTX0VWRVJZIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0ZXAudmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoSVNfVE9fQVJSQVkpIHsKICAgICAgICAgICAgICAgICAgcHVzaC5jYWxsKGFycmF5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShmbih2YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChJU19GT1JfRUFDSCkgewogICAgICAgICAgICAgICAgICAgICAgbG9vcCgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHsKICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA/IGxvb3AoKSA6IHJlc29sdmUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPyByZXNvbHZlKElTX1NPTUUgfHwgdmFsdWUpIDogbG9vcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyByZWplY3QoZXJyKTsgfQogICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICAgIH07CgogICAgICBsb29wKCk7CiAgICB9KTsKICB9Owp9OwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgdG9BcnJheTogY3JlYXRlTWV0aG9kKDApLAogIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgxKSwKICBldmVyeTogY3JlYXRlTWV0aG9kKDIpLAogIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSwKICBmaW5kOiBjcmVhdGVNZXRob2QoNCkKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1wcm90b3R5cGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItcHJvdG90eXBlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKCnZhciBVU0VfRlVOQ1RJT05fQ09OU1RSVUNUT1IgPSAnVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SJzsKdmFyIEFTWU5DX0lURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdhc3luY0l0ZXJhdG9yJyk7CnZhciBBc3luY0l0ZXJhdG9yID0gZ2xvYmFsLkFzeW5jSXRlcmF0b3I7CnZhciBQYXNzZWRBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gc2hhcmVkLkFzeW5jSXRlcmF0b3JQcm90b3R5cGU7CnZhciBBc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBwcm90b3R5cGU7CgppZiAoIUlTX1BVUkUpIHsKICBpZiAoUGFzc2VkQXN5bmNJdGVyYXRvclByb3RvdHlwZSkgewogICAgQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IFBhc3NlZEFzeW5jSXRlcmF0b3JQcm90b3R5cGU7CiAgfSBlbHNlIGlmICh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PSAnZnVuY3Rpb24nKSB7CiAgICBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gQXN5bmNJdGVyYXRvci5wcm90b3R5cGU7CiAgfSBlbHNlIGlmIChzaGFyZWRbVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SXSB8fCBnbG9iYWxbVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SXSkgewogICAgdHJ5IHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jCiAgICAgIHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKCdyZXR1cm4gYXN5bmMgZnVuY3Rpb24qKCl7fSgpJykoKSkpKTsKICAgICAgaWYgKGdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBwcm90b3R5cGU7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9CiAgfQp9CgppZiAoIUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsKCmlmICghaGFzKEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsIEFTWU5DX0lURVJBVE9SKSkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShBc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBBU1lOQ19JVEVSQVRPUiwgZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7Cn0KCm1vZHVsZS5leHBvcnRzID0gQXN5bmNJdGVyYXRvclByb3RvdHlwZTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmcKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkgewogIGFGdW5jdGlvbihmbik7CiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuOwogIHN3aXRjaCAobGVuZ3RoKSB7CiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpOwogICAgfTsKICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpOwogICAgfTsKICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpOwogICAgfTsKICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpOwogICAgfTsKICB9CiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7CiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTsKICB9Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7CiAgdHJ5IHsKICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7CiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbikKICB9IGNhdGNoIChlcnJvcikgewogICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTsKICAgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKTsKICAgIHRocm93IGVycm9yOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKdmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlOwoKdHJ5IHsKICB2YXIgY2FsbGVkID0gMDsKICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0gewogICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07CiAgICB9LAogICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHsKICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTsKICAgIH0KICB9OwogIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpczsKICB9OwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsCiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7Cn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykgewogIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTsKICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTsKICB0cnkgewogICAgdmFyIG9iamVjdCA9IHt9OwogICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTsKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogICAgZXhlYyhvYmplY3QpOwogIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIpOwp2YXIgY2xhc3NvZlJhdyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwovLyBFUzMgd3JvbmcgaGVyZQp2YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJzsKCi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yCnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkgewogIHRyeSB7CiAgICByZXR1cm4gaXRba2V5XTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9Cn07CgovLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgCm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkgewogIHZhciBPLCB0YWcsIHJlc3VsdDsKICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCcKICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZQogICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnCiAgICAvLyBidWlsdGluVGFnIGNhc2UKICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pCiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrCiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tYWRkLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9jb2xsZWN0aW9uLW1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLyogLi4uZWxlbWVudHMgKi8pIHsKICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7CiAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKHNldC5hZGQpOwogIGZvciAodmFyIGsgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHsKICAgIGFkZGVyLmNhbGwoc2V0LCBhcmd1bWVudHNba10pOwogIH0KICByZXR1cm4gc2V0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWRlbGV0ZS1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9jb2xsZWN0aW9uLW1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLyogLi4uZWxlbWVudHMgKi8pIHsKICB2YXIgY29sbGVjdGlvbiA9IGFuT2JqZWN0KHRoaXMpOwogIHZhciByZW1vdmVyID0gYUZ1bmN0aW9uKGNvbGxlY3Rpb25bJ2RlbGV0ZSddKTsKICB2YXIgYWxsRGVsZXRlZCA9IHRydWU7CiAgdmFyIHdhc0RlbGV0ZWQ7CiAgZm9yICh2YXIgayA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGsgPCBsZW47IGsrKykgewogICAgd2FzRGVsZXRlZCA9IHJlbW92ZXIuY2FsbChjb2xsZWN0aW9uLCBhcmd1bWVudHNba10pOwogICAgYWxsRGVsZXRlZCA9IGFsbERlbGV0ZWQgJiYgd2FzRGVsZXRlZDsKICB9CiAgcmV0dXJuICEhYWxsRGVsZXRlZDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcEZuLCB0aGlzQXJnICovKSB7CiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIG1hcEZuID0gbGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKICB2YXIgbWFwcGluZywgQSwgbiwgYm91bmRGdW5jdGlvbjsKICBhRnVuY3Rpb24odGhpcyk7CiAgbWFwcGluZyA9IG1hcEZuICE9PSB1bmRlZmluZWQ7CiAgaWYgKG1hcHBpbmcpIGFGdW5jdGlvbihtYXBGbik7CiAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHJldHVybiBuZXcgdGhpcygpOwogIEEgPSBbXTsKICBpZiAobWFwcGluZykgewogICAgbiA9IDA7CiAgICBib3VuZEZ1bmN0aW9uID0gYmluZChtYXBGbiwgbGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7CiAgICBpdGVyYXRlKHNvdXJjZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7CiAgICAgIEEucHVzaChib3VuZEZ1bmN0aW9uKG5leHRJdGVtLCBuKyspKTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpdGVyYXRlKHNvdXJjZSwgQS5wdXNoLCBBKTsKICB9CiAgcmV0dXJuIG5ldyB0aGlzKEEpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvZigpIHsKICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpOwogIHdoaWxlIChsZW5ndGgtLSkgQVtsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07CiAgcmV0dXJuIG5ldyB0aGlzKEEpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKdmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiKTsKdmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIGZhc3RLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIikuZmFzdEtleTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yOwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7CiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7CiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgQ09OU1RSVUNUT1JfTkFNRSk7CiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwgewogICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsCiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSwKICAgICAgICBmaXJzdDogdW5kZWZpbmVkLAogICAgICAgIGxhc3Q6IHVuZGVmaW5lZCwKICAgICAgICBzaXplOiAwCiAgICAgIH0pOwogICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwOwogICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKICAgIH0pOwoKICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKCiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHsKICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTsKICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTsKICAgICAgdmFyIHByZXZpb3VzLCBpbmRleDsKICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5CiAgICAgIGlmIChlbnRyeSkgewogICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7CiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnkKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7CiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksCiAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsCiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsCiAgICAgICAgICByZW1vdmVkOiBmYWxzZQogICAgICAgIH07CiAgICAgICAgaWYgKCFzdGF0ZS5maXJzdCkgc3RhdGUuZmlyc3QgPSBlbnRyeTsKICAgICAgICBpZiAocHJldmlvdXMpIHByZXZpb3VzLm5leHQgPSBlbnRyeTsKICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKzsKICAgICAgICBlbHNlIHRoYXQuc2l6ZSsrOwogICAgICAgIC8vIGFkZCB0byBpbmRleAogICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTsKICAgICAgfSByZXR1cm4gdGhhdDsKICAgIH07CgogICAgdmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkgewogICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOwogICAgICAvLyBmYXN0IGNhc2UKICAgICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpOwogICAgICB2YXIgZW50cnk7CiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdOwogICAgICAvLyBmcm96ZW4gb2JqZWN0IGNhc2UKICAgICAgZm9yIChlbnRyeSA9IHN0YXRlLmZpcnN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uZXh0KSB7CiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTsKICAgICAgfQogICAgfTsKCiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgewogICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKCkKICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpCiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTsKICAgICAgICB2YXIgZGF0YSA9IHN0YXRlLmluZGV4OwogICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0OwogICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDsKICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTsKICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgICB9CiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkOwogICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSA9IDA7CiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwOwogICAgICB9LAogICAgICAvLyAyMy4xLjMuMyBNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpCiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKQogICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgewogICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOwogICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7CiAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzOwogICAgICAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTsKICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlOwogICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7CiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wcmV2aW91cyA9IHByZXY7CiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDsKICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjsKICAgICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZS0tOwogICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTsKICAgICAgICB9IHJldHVybiAhIWVudHJ5OwogICAgICB9LAogICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZCkKICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpCiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHsKICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICAgICAgdmFyIGVudHJ5OwogICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7CiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpOwogICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5CiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSkKICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpCiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkgewogICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CiAgICAgIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSkKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTsKICAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudmFsdWU7CiAgICAgIH0sCiAgICAgIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpCiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTsKICAgICAgfQogICAgfSA6IHsKICAgICAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpCiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eShDLnByb3RvdHlwZSwgJ3NpemUnLCB7CiAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIEM7CiAgfSwKICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHsKICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InOwogICAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpOwogICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdCiAgICAvLyAyMy4xLjMuNCwgMjMuMS4zLjgsIDIzLjEuMy4xMSwgMjMuMS4zLjEyLCAyMy4yLjMuNSwgMjMuMi4zLjgsIDIzLjIuMy4xMCwgMjMuMi4zLjExCiAgICBkZWZpbmVJdGVyYXRvcihDLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHsKICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICAgICAgdHlwZTogSVRFUkFUT1JfTkFNRSwKICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLAogICAgICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksCiAgICAgICAga2luZDoga2luZCwKICAgICAgICBsYXN0OiB1bmRlZmluZWQKICAgICAgfSk7CiAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTsKICAgICAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOwogICAgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0OwogICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnkKICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7CiAgICAgIC8vIGdldCBuZXh0IGVudHJ5CiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7CiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb24KICAgICAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogICAgICB9CiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmQKICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9OwogICAgICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LnZhbHVlLCBkb25lOiBmYWxzZSB9OwogICAgICByZXR1cm4geyB2YWx1ZTogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdLCBkb25lOiBmYWxzZSB9OwogICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpOwoKICAgIC8vIGFkZCBbQEBzcGVjaWVzXSwgMjMuMS4yLjIsIDIzLjIuMi4yCiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHJlZGVmaW5lQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIik7CnZhciBnZXRXZWFrRGF0YSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiKS5nZXRXZWFrRGF0YTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgQXJyYXlJdGVyYXRpb25Nb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKTsKdmFyICRoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yOwp2YXIgZmluZCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmQ7CnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7CnZhciBpZCA9IDA7CgovLyBmYWxsYmFjayBmb3IgdW5jYXVnaHQgZnJvemVuIGtleXMKdmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RvcmUpIHsKICByZXR1cm4gc3RvcmUuZnJvemVuIHx8IChzdG9yZS5mcm96ZW4gPSBuZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSgpKTsKfTsKCnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkgewogIHRoaXMuZW50cmllcyA9IFtdOwp9OwoKdmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uIChzdG9yZSwga2V5KSB7CiAgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7CiAgICByZXR1cm4gaXRbMF0gPT09IGtleTsKICB9KTsKfTsKClVuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0gewogIGdldDogZnVuY3Rpb24gKGtleSkgewogICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7CiAgICBpZiAoZW50cnkpIHJldHVybiBlbnRyeVsxXTsKICB9LAogIGhhczogZnVuY3Rpb24gKGtleSkgewogICAgcmV0dXJuICEhZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7CiAgfSwKICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTsKICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTsKICAgIGVsc2UgdGhpcy5lbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTsKICB9LAogICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7CiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHsKICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7CiAgICB9KTsKICAgIGlmICh+aW5kZXgpIHRoaXMuZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgcmV0dXJuICEhfmluZGV4OwogIH0KfTsKCm1vZHVsZS5leHBvcnRzID0gewogIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikgewogICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkgewogICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpOwogICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsKICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLAogICAgICAgIGlkOiBpZCsrLAogICAgICAgIGZyb3plbjogdW5kZWZpbmVkCiAgICAgIH0pOwogICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKICAgIH0pOwoKICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKCiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHsKICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTsKICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShhbk9iamVjdChrZXkpLCB0cnVlKTsKICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTsKICAgICAgZWxzZSBkYXRhW3N0YXRlLmlkXSA9IHZhbHVlOwogICAgICByZXR1cm4gdGhhdDsKICAgIH07CgogICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHsKICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSkKICAgICAgLy8gMjMuNC4zLjMgV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKQogICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgewogICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpOwogICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSlbJ2RlbGV0ZSddKGtleSk7CiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCkgJiYgZGVsZXRlIGRhdGFbc3RhdGUuaWRdOwogICAgICB9LAogICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KQogICAgICAvLyAyMy40LjMuNCBXZWFrU2V0LnByb3RvdHlwZS5oYXModmFsdWUpCiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkgewogICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpOwogICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuaGFzKGtleSk7CiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CiAgICAgIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkgewogICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHsKICAgICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTsKICAgICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuZ2V0KGtleSk7CiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpCiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpOwogICAgICB9CiAgICB9IDogewogICAgICAvLyAyMy40LjMuMSBXZWFrU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpCiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBDOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiKTsKdmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIpOwp2YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7CiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xOwogIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xOwogIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7CiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdOwogIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7CiAgdmFyIGV4cG9ydGVkID0ge307CgogIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbiAoS0VZKSB7CiAgICB2YXIgbmF0aXZlTWV0aG9kID0gTmF0aXZlUHJvdG90eXBlW0tFWV07CiAgICByZWRlZmluZShOYXRpdmVQcm90b3R5cGUsIEtFWSwKICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7CiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywgdmFsdWUgPT09IDAgPyAwIDogdmFsdWUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkgewogICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTsKICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHsKICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IHVuZGVmaW5lZCA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpOwogICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkgewogICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTsKICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICApOwogIH07CgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuCiAgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTsKICB9KSkpKSB7CiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvcgogICAgQ29uc3RydWN0b3IgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUik7CiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTsKICB9IGVsc2UgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHRydWUpKSB7CiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTsKICAgIC8vIGVhcmx5IGltcGxlbWVudGF0aW9ucyBub3Qgc3VwcG9ydHMgY2hhaW5pbmcKICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7CiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZQogICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pOwogICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseQogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldwogICAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihpdGVyYWJsZSk7IH0pOwogICAgLy8gZm9yIGVhcmx5IGltcGxlbWVudGF0aW9ucyAtMCBhbmQgKzAgbm90IHRoZSBzYW1lCiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsKICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzCiAgICAgIHZhciAkaW5zdGFuY2UgPSBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKTsKICAgICAgdmFyIGluZGV4ID0gNTsKICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTsKICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTsKICAgIH0pOwoKICAgIGlmICghQUNDRVBUX0lURVJBQkxFUykgewogICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkgewogICAgICAgIGFuSW5zdGFuY2UoZHVtbXksIENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTsKICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpOwogICAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB0aGF0LCBJU19NQVApOwogICAgICAgIHJldHVybiB0aGF0OwogICAgICB9KTsKICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlOwogICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykgewogICAgICBmaXhNZXRob2QoJ2RlbGV0ZScpOwogICAgICBmaXhNZXRob2QoJ2hhcycpOwogICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTsKICAgIH0KCiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTsKCiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZAogICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyOwogIH0KCiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjsKICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IENvbnN0cnVjdG9yICE9IE5hdGl2ZUNvbnN0cnVjdG9yIH0sIGV4cG9ydGVkKTsKCiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOwoKICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7CgogIHJldHVybiBDb25zdHJ1Y3RvcjsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb21wb3NpdGUta2V5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb21wb3NpdGUta2V5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgCnZhciBNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIpOwp2YXIgV2Vha01hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMud2Vhay1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7Cgp2YXIgTm9kZSA9IGZ1bmN0aW9uICgpIHsKICAvLyBrZXlzCiAgdGhpcy5vYmplY3QgPSBudWxsOwogIHRoaXMuc3ltYm9sID0gbnVsbDsKICAvLyBjaGlsZCBub2RlcwogIHRoaXMucHJpbWl0aXZlcyA9IG51bGw7CiAgdGhpcy5vYmplY3RzQnlJbmRleCA9IGNyZWF0ZShudWxsKTsKfTsKCk5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXksIGluaXRpYWxpemVyKSB7CiAgcmV0dXJuIHRoaXNba2V5XSB8fCAodGhpc1trZXldID0gaW5pdGlhbGl6ZXIoKSk7Cn07CgpOb2RlLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKGksIGl0LCBJU19PQkpFQ1QpIHsKICB2YXIgc3RvcmUgPSBJU19PQkpFQ1QKICAgID8gdGhpcy5vYmplY3RzQnlJbmRleFtpXSB8fCAodGhpcy5vYmplY3RzQnlJbmRleFtpXSA9IG5ldyBXZWFrTWFwKCkpCiAgICA6IHRoaXMucHJpbWl0aXZlcyB8fCAodGhpcy5wcmltaXRpdmVzID0gbmV3IE1hcCgpKTsKICB2YXIgZW50cnkgPSBzdG9yZS5nZXQoaXQpOwogIGlmICghZW50cnkpIHN0b3JlLnNldChpdCwgZW50cnkgPSBuZXcgTm9kZSgpKTsKICByZXR1cm4gZW50cnk7Cn07Cgp2YXIgcm9vdCA9IG5ldyBOb2RlKCk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICB2YXIgYWN0aXZlID0gcm9vdDsKICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICB2YXIgaSwgaXQ7CiAgLy8gZm9yIHByZXZlbnQgbGVha2luZywgc3RhcnQgZnJvbSBvYmplY3RzCiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpZiAoaXNPYmplY3QoaXQgPSBhcmd1bWVudHNbaV0pKSBhY3RpdmUgPSBhY3RpdmUubmV4dChpLCBpdCwgdHJ1ZSk7CiAgfQogIGlmICh0aGlzID09PSBPYmplY3QgJiYgYWN0aXZlID09PSByb290KSB0aHJvdyBUeXBlRXJyb3IoJ0NvbXBvc2l0ZSBrZXlzIG11c3QgY29udGFpbiBhIG5vbi1wcmltaXRpdmUgY29tcG9uZW50Jyk7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpZiAoIWlzT2JqZWN0KGl0ID0gYXJndW1lbnRzW2ldKSkgYWN0aXZlID0gYWN0aXZlLm5leHQoaSwgaXQsIGZhbHNlKTsKICB9IHJldHVybiBhY3RpdmU7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIG93bktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3duLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHsKICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTsKICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOwogIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjsKICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgaWYgKCFoYXModGFyZ2V0LCBrZXkpKSBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgewogIHZhciByZWdleHAgPSAvLi87CiAgdHJ5IHsKICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApOwogIH0gY2F0Y2ggKGUpIHsKICAgIHRyeSB7CiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTsKICAgICAgcmV0dXJuICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApOwogICAgfSBjYXRjaCAoZikgeyAvKiBlbXB0eSAqLyB9CiAgfSByZXR1cm4gZmFsc2U7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9CiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsOwogIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGF0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCnZhciBQcm9taXNlID0gZ2V0QnVpbHRJbignUHJvbWlzZScpOwoKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwoKdmFyICRyZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHsKICB2YXIgaXRlcmF0b3IgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLml0ZXJhdG9yOwogIHZhciAkJHJldHVybiA9IGl0ZXJhdG9yWydyZXR1cm4nXTsKICByZXR1cm4gJCRyZXR1cm4gPT09IHVuZGVmaW5lZAogICAgPyBQcm9taXNlLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSkKICAgIDogYW5PYmplY3QoJCRyZXR1cm4uY2FsbChpdGVyYXRvciwgdmFsdWUpKTsKfTsKCnZhciAkdGhyb3cgPSBmdW5jdGlvbiAodmFsdWUpIHsKICB2YXIgaXRlcmF0b3IgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLml0ZXJhdG9yOwogIHZhciAkJHRocm93ID0gaXRlcmF0b3JbJ3Rocm93J107CiAgcmV0dXJuICQkdGhyb3cgPT09IHVuZGVmaW5lZAogICAgPyBQcm9taXNlLnJlamVjdCh2YWx1ZSkKICAgIDogJCR0aHJvdy5jYWxsKGl0ZXJhdG9yLCB2YWx1ZSk7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuZXh0SGFuZGxlciwgSVNfSVRFUkFUT1IpIHsKICB2YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihzdGF0ZSkgewogICAgc3RhdGUubmV4dCA9IGFGdW5jdGlvbihzdGF0ZS5pdGVyYXRvci5uZXh0KTsKICAgIHN0YXRlLmRvbmUgPSBmYWxzZTsKICAgIHNldEludGVybmFsU3RhdGUodGhpcywgc3RhdGUpOwogIH07CgogIEFzeW5jSXRlcmF0b3JQcm94eS5wcm90b3R5cGUgPSByZWRlZmluZUFsbChjcmVhdGUocGF0aC5Bc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIHsKICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoYXJnKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgIGlmIChzdGF0ZS5kb25lKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KG5leHRIYW5kbGVyLmNhbGwoc3RhdGUsIGFyZywgUHJvbWlzZSkpKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpOwogICAgICB9CiAgICB9LAogICAgJ3JldHVybic6ICRyZXR1cm4sCiAgICAndGhyb3cnOiAkdGhyb3cKICB9KTsKCiAgaWYgKCFJU19JVEVSQVRPUikgewogICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEFzeW5jSXRlcmF0b3JQcm94eS5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcsICdHZW5lcmF0b3InKTsKICB9CgogIHJldHVybiBBc3luY0l0ZXJhdG9yUHJveHk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKCnZhciBxdW90ID0gLyIvZzsKCi8vIEIuMi4zLjIuMSBDcmVhdGVIVE1MKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKQovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVodG1sCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZShzdHJpbmcpKTsKICB2YXIgcDEgPSAnPCcgKyB0YWc7CiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9IicgKyBTdHJpbmcodmFsdWUpLnJlcGxhY2UocXVvdCwgJyZxdW90OycpICsgJyInOwogIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIikuSXRlcmF0b3JQcm90b3R5cGU7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKCnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHsKICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJzsKICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7CiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpOwogIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7CiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmVBbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0OwoKdmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cgp2YXIgJHJldHVybiA9IGZ1bmN0aW9uICh2YWx1ZSkgewogIHZhciBpdGVyYXRvciA9IGdldEludGVybmFsU3RhdGUodGhpcykuaXRlcmF0b3I7CiAgdmFyICQkcmV0dXJuID0gaXRlcmF0b3JbJ3JldHVybiddOwogIHJldHVybiAkJHJldHVybiA9PT0gdW5kZWZpbmVkID8geyBkb25lOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSA6IGFuT2JqZWN0KCQkcmV0dXJuLmNhbGwoaXRlcmF0b3IsIHZhbHVlKSk7Cn07Cgp2YXIgJHRocm93ID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgdmFyIGl0ZXJhdG9yID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5pdGVyYXRvcjsKICB2YXIgJCR0aHJvdyA9IGl0ZXJhdG9yWyd0aHJvdyddOwogIGlmICgkJHRocm93ID09PSB1bmRlZmluZWQpIHRocm93IHZhbHVlOwogIHJldHVybiAkJHRocm93LmNhbGwoaXRlcmF0b3IsIHZhbHVlKTsKfTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5leHRIYW5kbGVyLCBJU19JVEVSQVRPUikgewogIHZhciBJdGVyYXRvclByb3h5ID0gZnVuY3Rpb24gSXRlcmF0b3Ioc3RhdGUpIHsKICAgIHN0YXRlLm5leHQgPSBhRnVuY3Rpb24oc3RhdGUuaXRlcmF0b3IubmV4dCk7CiAgICBzdGF0ZS5kb25lID0gZmFsc2U7CiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHN0YXRlKTsKICB9OwoKICBJdGVyYXRvclByb3h5LnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKGNyZWF0ZShwYXRoLkl0ZXJhdG9yLnByb3RvdHlwZSksIHsKICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgIHZhciByZXN1bHQgPSBzdGF0ZS5kb25lID8gdW5kZWZpbmVkIDogbmV4dEhhbmRsZXIuYXBwbHkoc3RhdGUsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB7IGRvbmU6IHN0YXRlLmRvbmUsIHZhbHVlOiByZXN1bHQgfTsKICAgIH0sCiAgICAncmV0dXJuJzogJHJldHVybiwKICAgICd0aHJvdyc6ICR0aHJvdwogIH0pOwoKICBpZiAoIUlTX0lURVJBVE9SKSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm94eS5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcsICdHZW5lcmF0b3InKTsKICB9CgogIHJldHVybiBJdGVyYXRvclByb3h5Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkgewogIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTsKfSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHsKICBvYmplY3Rba2V5XSA9IHZhbHVlOwogIHJldHVybiBvYmplY3Q7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHsKICByZXR1cm4gewogICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSwKICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSwKICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLAogICAgdmFsdWU6IHZhbHVlCiAgfTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHsKICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpOwogIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7CiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGF0ZS10by1pc28tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHBhZFN0YXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiKS5zdGFydDsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIERhdGVQcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsKdmFyIGdldFRpbWUgPSBEYXRlUHJvdG90eXBlLmdldFRpbWU7CnZhciBuYXRpdmVEYXRlVG9JU09TdHJpbmcgPSBEYXRlUHJvdG90eXBlLnRvSVNPU3RyaW5nOwoKLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9pc29zdHJpbmcKLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBmYWlscyBoZXJlOgptb2R1bGUuZXhwb3J0cyA9IChmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIG5hdGl2ZURhdGVUb0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKC01ZTEzIC0gMSkpICE9ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonOwp9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIG5hdGl2ZURhdGVUb0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKE5hTikpOwp9KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHsKICBpZiAoIWlzRmluaXRlKGdldFRpbWUuY2FsbCh0aGlzKSkpIHRocm93IFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpOwogIHZhciBkYXRlID0gdGhpczsKICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTsKICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTsKICB2YXIgc2lnbiA9IHllYXIgPCAwID8gJy0nIDogeWVhciA+IDk5OTkgPyAnKycgOiAnJzsKICByZXR1cm4gc2lnbiArIHBhZFN0YXJ0KGFicyh5ZWFyKSwgc2lnbiA/IDYgOiA0LCAwKSArCiAgICAnLScgKyBwYWRTdGFydChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyLCAwKSArCiAgICAnLScgKyBwYWRTdGFydChkYXRlLmdldFVUQ0RhdGUoKSwgMiwgMCkgKwogICAgJ1QnICsgcGFkU3RhcnQoZGF0ZS5nZXRVVENIb3VycygpLCAyLCAwKSArCiAgICAnOicgKyBwYWRTdGFydChkYXRlLmdldFVUQ01pbnV0ZXMoKSwgMiwgMCkgKwogICAgJzonICsgcGFkU3RhcnQoZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIsIDApICsKICAgICcuJyArIHBhZFN0YXJ0KG1pbGxpc2Vjb25kcywgMywgMCkgKwogICAgJ1onOwp9IDogbmF0aXZlRGF0ZVRvSVNPU3RyaW5nOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8tcHJpbWl0aXZlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGF0ZS10by1wcmltaXRpdmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhpbnQpIHsKICBpZiAoaGludCAhPT0gJ3N0cmluZycgJiYgaGludCAhPT0gJ251bWJlcicgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7CiAgfSByZXR1cm4gdG9QcmltaXRpdmUoYW5PYmplY3QodGhpcyksIGhpbnQgIT09ICdudW1iZXInKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIEl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIpOwp2YXIgSXRlcmF0b3JzQ29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiKTsKCnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7CnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTOwp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBLRVlTID0gJ2tleXMnOwp2YXIgVkFMVUVTID0gJ3ZhbHVlcyc7CnZhciBFTlRSSUVTID0gJ2VudHJpZXMnOwoKdmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7CiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTsKCiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7CiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7CiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdOwogICAgc3dpdGNoIChLSU5EKSB7CiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTsKICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTsKICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9OwogICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07CiAgfTsKCiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlOwogIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTsKICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0KICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ10KICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07CiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTsKICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7CiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZOwoKICAvLyBmaXggbmF0aXZlCiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7CiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7CiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHsKICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7CiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7CiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9ycwogICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpOwogICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpczsKICAgIH0KICB9CgogIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkYKICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7CiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlOwogICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTsKICB9CgogIC8vIGRlZmluZSBpdGVyYXRvcgogIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikgewogICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTsKICB9CiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yOwoKICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzCiAgaWYgKERFRkFVTFQpIHsKICAgIG1ldGhvZHMgPSB7CiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksCiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSwKICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpCiAgICB9OwogICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykgewogICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7CiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTsKICAgICAgfQogICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpOwogIH0KCiAgcmV0dXJuIG1ldGhvZHM7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHsKICB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pOwogIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwgewogICAgdmFsdWU6IHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZihOQU1FKQogIH0pOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHkKbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKdmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50OwovLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUUKdmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zCi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSB7CiAgQ1NTUnVsZUxpc3Q6IDAsCiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCwKICBDU1NWYWx1ZUxpc3Q6IDAsCiAgQ2xpZW50UmVjdExpc3Q6IDAsCiAgRE9NUmVjdExpc3Q6IDAsCiAgRE9NU3RyaW5nTGlzdDogMCwKICBET01Ub2tlbkxpc3Q6IDEsCiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsCiAgRmlsZUxpc3Q6IDAsCiAgSFRNTEFsbENvbGxlY3Rpb246IDAsCiAgSFRNTENvbGxlY3Rpb246IDAsCiAgSFRNTEZvcm1FbGVtZW50OiAwLAogIEhUTUxTZWxlY3RFbGVtZW50OiAwLAogIE1lZGlhTGlzdDogMCwKICBNaW1lVHlwZUFycmF5OiAwLAogIE5hbWVkTm9kZU1hcDogMCwKICBOb2RlTGlzdDogMSwKICBQYWludFJlcXVlc3RMaXN0OiAwLAogIFBsdWdpbjogMCwKICBQbHVnaW5BcnJheTogMCwKICBTVkdMZW5ndGhMaXN0OiAwLAogIFNWR051bWJlckxpc3Q6IDAsCiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsCiAgU1ZHUG9pbnRMaXN0OiAwLAogIFNWR1N0cmluZ0xpc3Q6IDAsCiAgU1ZHVHJhbnNmb3JtTGlzdDogMCwKICBTb3VyY2VCdWZmZXJMaXN0OiAwLAogIFN0eWxlU2hlZXRMaXN0OiAwLAogIFRleHRUcmFja0N1ZUxpc3Q6IDAsCiAgVGV4dFRyYWNrTGlzdDogMCwKICBUb3VjaExpc3Q6IDAKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgovLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXMKbW9kdWxlLmV4cG9ydHMgPSBbCiAgJ2NvbnN0cnVjdG9yJywKICAnaGFzT3duUHJvcGVydHknLAogICdpc1Byb3RvdHlwZU9mJywKICAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsCiAgJ3RvU3RyaW5nJywKICAndmFsdWVPZicKXTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKS5mOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIHNldEdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIik7CnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIik7CnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIpOwoKLyoKICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdAogIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3QKICBvcHRpb25zLnN0YXQgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldAogIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0CiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy5mb3JjZWQgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGUKICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb24KICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy51bnNhZmUgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eQogIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzCiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5CiAgb3B0aW9ucy5ub1RhcmdldEdldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXQKKi8KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7CiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0OwogIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDsKICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0OwogIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7CiAgaWYgKEdMT0JBTCkgewogICAgdGFyZ2V0ID0gZ2xvYmFsOwogIH0gZWxzZSBpZiAoU1RBVElDKSB7CiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7CiAgfSBlbHNlIHsKICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlOwogIH0KICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07CiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkgewogICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTsKICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7CiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTsKICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7CiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0CiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7CiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTsKICAgIH0KICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHMKICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTsKICAgIH0KICAgIC8vIGV4dGVuZCBnbG9iYWwKICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7CiAgdHJ5IHsKICAgIHJldHVybiAhIWV4ZWMoKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIHRydWU7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKdmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyAjcmVwbGFjZSBuZWVkcyBidWlsdC1pbiBzdXBwb3J0IGZvciBuYW1lZCBncm91cHMuCiAgLy8gI21hdGNoIHdvcmtzIGZpbmUgYmVjYXVzZSBpdCBqdXN0IHJldHVybiB0aGUgZXhlYyByZXN1bHRzLCBldmVuIGlmIGl0IGhhcwogIC8vIGEgImdyb3BzIiBwcm9wZXJ0eS4KICB2YXIgcmUgPSAvLi87CiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9OwogICAgcmV0dXJuIHJlc3VsdDsKICB9OwogIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7Cn0pOwoKLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5ICJzcGxpdCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlYwovLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXIKdmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIHJlID0gLyg/OikvOwogIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjOwogIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTsKICB2YXIgcmVzdWx0ID0gJ2FiJy5zcGxpdChyZSk7CiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggIT09IDIgfHwgcmVzdWx0WzBdICE9PSAnYScgfHwgcmVzdWx0WzFdICE9PSAnYic7Cn0pOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMsIHNoYW0pIHsKICB2YXIgU1lNQk9MID0gd2VsbEtub3duU3ltYm9sKEtFWSk7CgogIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHMKICAgIHZhciBPID0ge307CiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9OwogICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNzsKICB9KTsKCiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWMKICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7CiAgICB2YXIgcmUgPSAvYS87CgogICAgaWYgKEtFWSA9PT0gJ3NwbGl0JykgewogICAgICAvLyBXZSBjYW4ndCB1c2UgcmVhbCByZWdleCBoZXJlIHNpbmNlIGl0IGNhdXNlcyBkZW9wdGltaXphdGlvbgogICAgICAvLyBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpbiBWOAogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzA2CiAgICAgIHJlID0ge307CiAgICAgIC8vIFJlZ0V4cFtAQHNwbGl0XSBkb2Vzbid0IGNhbGwgdGhlIHJlZ2V4J3MgZXhlYyBtZXRob2QsIGJ1dCBmaXJzdCBjcmVhdGVzCiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS4KICAgICAgcmUuY29uc3RydWN0b3IgPSB7fTsKICAgICAgcmUuY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZTsgfTsKICAgICAgcmUuZmxhZ3MgPSAnJzsKICAgICAgcmVbU1lNQk9MXSA9IC8uL1tTWU1CT0xdOwogICAgfQoKICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IGV4ZWNDYWxsZWQgPSB0cnVlOyByZXR1cm4gbnVsbDsgfTsKCiAgICByZVtTWU1CT0xdKCcnKTsKICAgIHJldHVybiAhZXhlY0NhbGxlZDsKICB9KTsKCiAgaWYgKAogICAgIURFTEVHQVRFU19UT19TWU1CT0wgfHwKICAgICFERUxFR0FURVNfVE9fRVhFQyB8fAogICAgKEtFWSA9PT0gJ3JlcGxhY2UnICYmICFSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUykgfHwKICAgIChLRVkgPT09ICdzcGxpdCcgJiYgIVNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQykKICApIHsKICAgIHZhciBuYXRpdmVSZWdFeHBNZXRob2QgPSAvLi9bU1lNQk9MXTsKICAgIHZhciBtZXRob2RzID0gZXhlYyhTWU1CT0wsICcnW0tFWV0sIGZ1bmN0aW9uIChuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkgewogICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHsKICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHsKICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpcwogICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLgogICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC4KICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9OwogICAgICB9CiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07CiAgICB9KTsKICAgIHZhciBzdHJpbmdNZXRob2QgPSBtZXRob2RzWzBdOwogICAgdmFyIHJlZ2V4TWV0aG9kID0gbWV0aG9kc1sxXTsKCiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmluZ01ldGhvZCk7CiAgICByZWRlZmluZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyCiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSkKICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdCkKICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJlZ2V4TWV0aG9kLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9CiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKQogICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpCiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcmVnZXhNZXRob2QuY2FsbChzdHJpbmcsIHRoaXMpOyB9CiAgICApOwogICAgaWYgKHNoYW0pIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShSZWdFeHAucHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZsYXR0ZW4taW50by1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CgovLyBgRmxhdHRlbkludG9BcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXkKdmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcmlnaW5hbCwgc291cmNlLCBzb3VyY2VMZW4sIHN0YXJ0LCBkZXB0aCwgbWFwcGVyLCB0aGlzQXJnKSB7CiAgdmFyIHRhcmdldEluZGV4ID0gc3RhcnQ7CiAgdmFyIHNvdXJjZUluZGV4ID0gMDsKICB2YXIgbWFwRm4gPSBtYXBwZXIgPyBiaW5kKG1hcHBlciwgdGhpc0FyZywgMykgOiBmYWxzZTsKICB2YXIgZWxlbWVudDsKCiAgd2hpbGUgKHNvdXJjZUluZGV4IDwgc291cmNlTGVuKSB7CiAgICBpZiAoc291cmNlSW5kZXggaW4gc291cmNlKSB7CiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdOwoKICAgICAgaWYgKGRlcHRoID4gMCAmJiBpc0FycmF5KGVsZW1lbnQpKSB7CiAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIGVsZW1lbnQsIHRvTGVuZ3RoKGVsZW1lbnQubGVuZ3RoKSwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSAweDFGRkZGRkZGRkZGRkZGKSB0aHJvdyBUeXBlRXJyb3IoJ0V4Y2VlZCB0aGUgYWNjZXB0YWJsZSBhcnJheSBsZW5ndGgnKTsKICAgICAgICB0YXJnZXRbdGFyZ2V0SW5kZXhdID0gZWxlbWVudDsKICAgICAgfQoKICAgICAgdGFyZ2V0SW5kZXgrKzsKICAgIH0KICAgIHNvdXJjZUluZGV4Kys7CiAgfQogIHJldHVybiB0YXJnZXRJbmRleDsKfTsKCm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtbWV0aG9kcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1tZXRob2RzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKLy8gRm9yY2VkIHJlcGxhY2VtZW50IG9iamVjdCBwcm90b3R5cGUgYWNjZXNzb3JzIG1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBJU19QVVJFIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIGtleSA9IE1hdGgucmFuZG9tKCk7CiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHMKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYsIG5vLXVzZWxlc3MtY2FsbAogIF9fZGVmaW5lU2V0dGVyX18uY2FsbChudWxsLCBrZXksIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7CiAgZGVsZXRlIGdsb2JhbFtrZXldOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCi8vIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgYSBtZXRob2QsIGxvd2VyY2FzZQovLyBvZiBhIHRhZyBhbmQgZXNjYXBpbmcgcXVvdGVzIGluIGFyZ3VtZW50cwptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgewogIHJldHVybiBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGVzdCA9ICcnW01FVEhPRF9OQU1FXSgnIicpOwogICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCciJykubGVuZ3RoID4gMzsKICB9KTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcyIpOwoKdmFyIG5vbiA9ICdcdTIwMEJcdTAwODVcdTE4MEUnOwoKLy8gY2hlY2sgdGhhdCBhIG1ldGhvZCB3b3JrcyB3aXRoIHRoZSBjb3JyZWN0IGxpc3QKLy8gb2Ygd2hpdGVzcGFjZXMgYW5kIGhhcyBhIGNvcnJlY3QgbmFtZQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgewogIHJldHVybiBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gISF3aGl0ZXNwYWNlc1tNRVRIT0RfTkFNRV0oKSB8fCBub25bTUVUSE9EX05BTUVdKCkgIT0gbm9uIHx8IHdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXS5uYW1lICE9PSBNRVRIT0RfTkFNRTsKICB9KTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKdmFyIHNsaWNlID0gW10uc2xpY2U7CnZhciBmYWN0b3JpZXMgPSB7fTsKCnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoQywgYXJnc0xlbmd0aCwgYXJncykgewogIGlmICghKGFyZ3NMZW5ndGggaW4gZmFjdG9yaWVzKSkgewogICAgZm9yICh2YXIgbGlzdCA9IFtdLCBpID0gMDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgbGlzdFtpXSA9ICdhWycgKyBpICsgJ10nOwogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jCiAgICBmYWN0b3JpZXNbYXJnc0xlbmd0aF0gPSBGdW5jdGlvbignQyxhJywgJ3JldHVybiBuZXcgQygnICsgbGlzdC5qb2luKCcsJykgKyAnKScpOwogIH0gcmV0dXJuIGZhY3Rvcmllc1thcmdzTGVuZ3RoXShDLCBhcmdzKTsKfTsKCi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kCm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7CiAgdmFyIGZuID0gYUZ1bmN0aW9uKHRoaXMpOwogIHZhciBwYXJ0QXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICB2YXIgYm91bmRGdW5jdGlvbiA9IGZ1bmN0aW9uIGJvdW5kKC8qIGFyZ3MuLi4gKi8pIHsKICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7CiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kRnVuY3Rpb24gPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGZuLmFwcGx5KHRoYXQsIGFyZ3MpOwogIH07CiAgaWYgKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpIGJvdW5kRnVuY3Rpb24ucHJvdG90eXBlID0gZm4ucHJvdG90eXBlOwogIHJldHVybiBib3VuZEZ1bmN0aW9uOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1hc3luYy1pdGVyYXRvci1tZXRob2QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1hc3luYy1pdGVyYXRvci1tZXRob2QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBBU1lOQ19JVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICB2YXIgbWV0aG9kID0gaXRbQVNZTkNfSVRFUkFUT1JdOwogIHJldHVybiBtZXRob2QgPT09IHVuZGVmaW5lZCA/IGdldEl0ZXJhdG9yTWV0aG9kKGl0KSA6IG1ldGhvZDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGF0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7Cgp2YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7CiAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSkKICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXQogICAgfHwgaXRbJ0BAaXRlcmF0b3InXQogICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0KTsKICBpZiAodHlwZW9mIGl0ZXJhdG9yTWV0aG9kICE9ICdmdW5jdGlvbicpIHsKICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgaXRlcmFibGUnKTsKICB9IHJldHVybiBhbk9iamVjdChpdGVyYXRvck1ldGhvZC5jYWxsKGl0KSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBJU19QVVJFID8gZ2V0SXRlcmF0b3IgOiBmdW5jdGlvbiAoaXQpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICByZXR1cm4gTWFwLnByb3RvdHlwZS5lbnRyaWVzLmNhbGwoaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gSVNfUFVSRSA/IGdldEl0ZXJhdG9yIDogZnVuY3Rpb24gKGl0KSB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgcmV0dXJuIFNldC5wcm90b3R5cGUudmFsdWVzLmNhbGwoaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0Owp9OwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjgKbW9kdWxlLmV4cG9ydHMgPQogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8CiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8CiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHwKICBjaGVjayh0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXy5nID09ICdvYmplY3QnICYmIF9fd2VicGFja19yZXF1aXJlX18uZykgfHwKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMKICBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKdmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0ge307CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHsKICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlOwogIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHsKICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTsKICB9Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGNyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIik7CgovLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5Cm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7CiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0KICB9KS5hICE9IDc7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llZWU3NTQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llZWU3NTQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lcwp2YXIgSW5maW5pdHkgPSAxIC8gMDsKdmFyIGFicyA9IE1hdGguYWJzOwp2YXIgcG93ID0gTWF0aC5wb3c7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIExOMiA9IE1hdGguTE4yOwoKdmFyIHBhY2sgPSBmdW5jdGlvbiAobnVtYmVyLCBtYW50aXNzYUxlbmd0aCwgYnl0ZXMpIHsKICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGJ5dGVzKTsKICB2YXIgZXhwb25lbnRMZW5ndGggPSBieXRlcyAqIDggLSBtYW50aXNzYUxlbmd0aCAtIDE7CiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxOwogIHZhciBlQmlhcyA9IGVNYXggPj4gMTsKICB2YXIgcnQgPSBtYW50aXNzYUxlbmd0aCA9PT0gMjMgPyBwb3coMiwgLTI0KSAtIHBvdygyLCAtNzcpIDogMDsKICB2YXIgc2lnbiA9IG51bWJlciA8IDAgfHwgbnVtYmVyID09PSAwICYmIDEgLyBudW1iZXIgPCAwID8gMSA6IDA7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgZXhwb25lbnQsIG1hbnRpc3NhLCBjOwogIG51bWJlciA9IGFicyhudW1iZXIpOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICBpZiAobnVtYmVyICE9IG51bWJlciB8fCBudW1iZXIgPT09IEluZmluaXR5KSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgICBtYW50aXNzYSA9IG51bWJlciAhPSBudW1iZXIgPyAxIDogMDsKICAgIGV4cG9uZW50ID0gZU1heDsKICB9IGVsc2UgewogICAgZXhwb25lbnQgPSBmbG9vcihsb2cobnVtYmVyKSAvIExOMik7CiAgICBpZiAobnVtYmVyICogKGMgPSBwb3coMiwgLWV4cG9uZW50KSkgPCAxKSB7CiAgICAgIGV4cG9uZW50LS07CiAgICAgIGMgKj0gMjsKICAgIH0KICAgIGlmIChleHBvbmVudCArIGVCaWFzID49IDEpIHsKICAgICAgbnVtYmVyICs9IHJ0IC8gYzsKICAgIH0gZWxzZSB7CiAgICAgIG51bWJlciArPSBydCAqIHBvdygyLCAxIC0gZUJpYXMpOwogICAgfQogICAgaWYgKG51bWJlciAqIGMgPj0gMikgewogICAgICBleHBvbmVudCsrOwogICAgICBjIC89IDI7CiAgICB9CiAgICBpZiAoZXhwb25lbnQgKyBlQmlhcyA+PSBlTWF4KSB7CiAgICAgIG1hbnRpc3NhID0gMDsKICAgICAgZXhwb25lbnQgPSBlTWF4OwogICAgfSBlbHNlIGlmIChleHBvbmVudCArIGVCaWFzID49IDEpIHsKICAgICAgbWFudGlzc2EgPSAobnVtYmVyICogYyAtIDEpICogcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTsKICAgICAgZXhwb25lbnQgPSBleHBvbmVudCArIGVCaWFzOwogICAgfSBlbHNlIHsKICAgICAgbWFudGlzc2EgPSBudW1iZXIgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7CiAgICAgIGV4cG9uZW50ID0gMDsKICAgIH0KICB9CiAgZm9yICg7IG1hbnRpc3NhTGVuZ3RoID49IDg7IGJ1ZmZlcltpbmRleCsrXSA9IG1hbnRpc3NhICYgMjU1LCBtYW50aXNzYSAvPSAyNTYsIG1hbnRpc3NhTGVuZ3RoIC09IDgpOwogIGV4cG9uZW50ID0gZXhwb25lbnQgPDwgbWFudGlzc2FMZW5ndGggfCBtYW50aXNzYTsKICBleHBvbmVudExlbmd0aCArPSBtYW50aXNzYUxlbmd0aDsKICBmb3IgKDsgZXhwb25lbnRMZW5ndGggPiAwOyBidWZmZXJbaW5kZXgrK10gPSBleHBvbmVudCAmIDI1NSwgZXhwb25lbnQgLz0gMjU2LCBleHBvbmVudExlbmd0aCAtPSA4KTsKICBidWZmZXJbLS1pbmRleF0gfD0gc2lnbiAqIDEyODsKICByZXR1cm4gYnVmZmVyOwp9OwoKdmFyIHVucGFjayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hbnRpc3NhTGVuZ3RoKSB7CiAgdmFyIGJ5dGVzID0gYnVmZmVyLmxlbmd0aDsKICB2YXIgZXhwb25lbnRMZW5ndGggPSBieXRlcyAqIDggLSBtYW50aXNzYUxlbmd0aCAtIDE7CiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxOwogIHZhciBlQmlhcyA9IGVNYXggPj4gMTsKICB2YXIgbkJpdHMgPSBleHBvbmVudExlbmd0aCAtIDc7CiAgdmFyIGluZGV4ID0gYnl0ZXMgLSAxOwogIHZhciBzaWduID0gYnVmZmVyW2luZGV4LS1dOwogIHZhciBleHBvbmVudCA9IHNpZ24gJiAxMjc7CiAgdmFyIG1hbnRpc3NhOwogIHNpZ24gPj49IDc7CiAgZm9yICg7IG5CaXRzID4gMDsgZXhwb25lbnQgPSBleHBvbmVudCAqIDI1NiArIGJ1ZmZlcltpbmRleF0sIGluZGV4LS0sIG5CaXRzIC09IDgpOwogIG1hbnRpc3NhID0gZXhwb25lbnQgJiAoMSA8PCAtbkJpdHMpIC0gMTsKICBleHBvbmVudCA+Pj0gLW5CaXRzOwogIG5CaXRzICs9IG1hbnRpc3NhTGVuZ3RoOwogIGZvciAoOyBuQml0cyA+IDA7IG1hbnRpc3NhID0gbWFudGlzc2EgKiAyNTYgKyBidWZmZXJbaW5kZXhdLCBpbmRleC0tLCBuQml0cyAtPSA4KTsKICBpZiAoZXhwb25lbnQgPT09IDApIHsKICAgIGV4cG9uZW50ID0gMSAtIGVCaWFzOwogIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IGVNYXgpIHsKICAgIHJldHVybiBtYW50aXNzYSA/IE5hTiA6IHNpZ24gPyAtSW5maW5pdHkgOiBJbmZpbml0eTsKICB9IGVsc2UgewogICAgbWFudGlzc2EgPSBtYW50aXNzYSArIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7CiAgICBleHBvbmVudCA9IGV4cG9uZW50IC0gZUJpYXM7CiAgfSByZXR1cm4gKHNpZ24gPyAtMSA6IDEpICogbWFudGlzc2EgKiBwb3coMiwgZXhwb25lbnQgLSBtYW50aXNzYUxlbmd0aCk7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBwYWNrOiBwYWNrLAogIHVucGFjazogdW5wYWNrCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKCnZhciBzcGxpdCA9ICcnLnNwbGl0OwoKLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3MKbW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApOwp9KSA/IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7Cn0gOiBPYmplY3Q7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIpOwoKLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWlucwptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHsKICB2YXIgTmV3VGFyZ2V0LCBOZXdUYXJnZXRQcm90b3R5cGU7CiAgaWYgKAogICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgCiAgICBzZXRQcm90b3R5cGVPZiAmJgogICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpcwogICAgdHlwZW9mIChOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgPT0gJ2Z1bmN0aW9uJyAmJgogICAgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmCiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJgogICAgTmV3VGFyZ2V0UHJvdG90eXBlICE9PSBXcmFwcGVyLnByb3RvdHlwZQogICkgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7CiAgcmV0dXJuICR0aGlzOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyIpOwoKdmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZzsKCi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyCmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7CiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7CiAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiKTsKdmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIpOwoKdmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7CnZhciBpZCA9IDA7Cgp2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIHRydWU7Cn07Cgp2YXIgc2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoaXQpIHsKICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHsKICAgIG9iamVjdElEOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSUQKICAgIHdlYWtEYXRhOiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEcwogIH0gfSk7Cn07Cgp2YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7CiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4CiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7CiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkgewogICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3QKICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJzsKICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhCiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJzsKICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhCiAgICBzZXRNZXRhZGF0YShpdCk7CiAgLy8gcmV0dXJuIG9iamVjdCBJRAogIH0gcmV0dXJuIGl0W01FVEFEQVRBXS5vYmplY3RJRDsKfTsKCnZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7CiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkgewogICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3QKICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7CiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YQogICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTsKICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhCiAgICBzZXRNZXRhZGF0YShpdCk7CiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEcwogIH0gcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTsKfTsKCi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZwp2YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoRlJFRVpJTkcgJiYgbWV0YS5SRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEFEQVRBKSkgc2V0TWV0YWRhdGEoaXQpOwogIHJldHVybiBpdDsKfTsKCnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7CiAgUkVRVUlSRUQ6IGZhbHNlLAogIGZhc3RLZXk6IGZhc3RLZXksCiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLAogIG9uRnJlZXplOiBvbkZyZWV6ZQp9OwoKaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiKTsKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgb2JqZWN0SGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIpOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKCnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7CnZhciBzZXQsIGdldCwgaGFzOwoKdmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTsKfTsKCnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkgewogIHJldHVybiBmdW5jdGlvbiAoaXQpIHsKICAgIHZhciBzdGF0ZTsKICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpOwogICAgfSByZXR1cm4gc3RhdGU7CiAgfTsKfTsKCmlmIChOQVRJVkVfV0VBS19NQVApIHsKICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpOwogIHZhciB3bWdldCA9IHN0b3JlLmdldDsKICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7CiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0OwogIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7CiAgICByZXR1cm4gbWV0YWRhdGE7CiAgfTsKICBnZXQgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307CiAgfTsKICBoYXMgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7CiAgfTsKfSBlbHNlIHsKICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7CiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlOwogIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9OwogIGdldCA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307CiAgfTsKICBoYXMgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTsKICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBzZXQ6IHNldCwKICBnZXQ6IGdldCwKICBoYXM6IGhhcywKICBlbmZvcmNlOiBlbmZvcmNlLAogIGdldHRlckZvcjogZ2V0dGVyRm9yCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKCnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKdmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlOwoKLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG90eXBlW0lURVJBVE9SXSA9PT0gaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwoKLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5Cm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykgewogIHJldHVybiBjbGFzc29mKGFyZykgPT0gJ0FycmF5JzsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIHJlcGxhY2VtZW50ID0gLyN8XC5wcm90b3R5cGVcLi87Cgp2YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7CiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldOwogIHJldHVybiB2YWx1ZSA9PSBQT0xZRklMTCA/IHRydWUKICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2UKICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKQogICAgOiAhIWRldGVjdGlvbjsKfTsKCnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTsKfTsKCnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9Owp2YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nOwp2YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJzsKCm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKCnZhciBmbG9vciA9IE1hdGguZmxvb3I7CgovLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXIKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHsKICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1pb3MuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW9zLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2VyLWFnZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2VyLWFnZW50LmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IC8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0gZmFsc2U7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTsKCi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcmVnZXhwCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIGlzUmVnRXhwOwogIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PSAnUmVnRXhwJyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiKTsKdmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIik7Cgp2YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkgewogIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7CiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7Cn07Cgp2YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHsKICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEFTX0VOVFJJRVMgPyAyIDogMSk7CiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDsKCiAgaWYgKElTX0lURVJBVE9SKSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlOwogIH0gZWxzZSB7CiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7CiAgICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTsKICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzCiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHsKICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7CiAgICAgICAgcmVzdWx0ID0gQVNfRU5UUklFUwogICAgICAgICAgPyBib3VuZEZ1bmN0aW9uKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKQogICAgICAgICAgOiBib3VuZEZ1bmN0aW9uKGl0ZXJhYmxlW2luZGV4XSk7CiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7CiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOwogICAgfQogICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7CiAgfQoKICBuZXh0ID0gaXRlcmF0b3IubmV4dDsKICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkgewogICAgcmVzdWx0ID0gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgYm91bmRGdW5jdGlvbiwgc3RlcC52YWx1ZSwgQVNfRU5UUklFUyk7CiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0OwogIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOwp9OwoKaXRlcmF0ZS5zdG9wID0gZnVuY3Rpb24gKHJlc3VsdCkgewogIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIHJlc3VsdCk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlOwoKdmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9OwoKLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdAp2YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjsKCmlmIChbXS5rZXlzKSB7CiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTsKICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGAKICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlOwogIGVsc2UgewogICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpOwogICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7CiAgfQp9CgppZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwoKLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKCkKaWYgKCFJU19QVVJFICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsCiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SUwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKbW9kdWxlLmV4cG9ydHMgPSB7fTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXAtdXBzZXJ0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXAtdXBzZXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUudXBzZXJ0YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0Cm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdXBzZXJ0KGtleSwgdXBkYXRlRm4gLyogLCBpbnNlcnRGbiAqLykgewogIHZhciBtYXAgPSBhbk9iamVjdCh0aGlzKTsKICB2YXIgaW5zZXJ0Rm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDsKICB2YXIgdmFsdWU7CiAgaWYgKHR5cGVvZiB1cGRhdGVGbiAhPSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnNlcnRGbiAhPSAnZnVuY3Rpb24nKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoJ0F0IGxlYXN0IG9uZSBjYWxsYmFjayByZXF1aXJlZCcpOwogIH0KICBpZiAobWFwLmhhcyhrZXkpKSB7CiAgICB2YWx1ZSA9IG1hcC5nZXQoa2V5KTsKICAgIGlmICh0eXBlb2YgdXBkYXRlRm4gPT0gJ2Z1bmN0aW9uJykgewogICAgICB2YWx1ZSA9IHVwZGF0ZUZuKHZhbHVlKTsKICAgICAgbWFwLnNldChrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKHR5cGVvZiBpbnNlcnRGbiA9PSAnZnVuY3Rpb24nKSB7CiAgICB2YWx1ZSA9IGluc2VydEZuKCk7CiAgICBtYXAuc2V0KGtleSwgdmFsdWUpOwogIH0gcmV0dXJuIHZhbHVlOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciBuYXRpdmVFeHBtMSA9IE1hdGguZXhwbTE7CnZhciBleHAgPSBNYXRoLmV4cDsKCi8vIGBNYXRoLmV4cG0xYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5leHBtMQptb2R1bGUuZXhwb3J0cyA9ICghbmF0aXZlRXhwbTEKICAvLyBPbGQgRkYgYnVnCiAgfHwgbmF0aXZlRXhwbTEoMTApID4gMjIwMjUuNDY1Nzk0ODA2NzE5IHx8IG5hdGl2ZUV4cG0xKDEwKSA8IDIyMDI1LjQ2NTc5NDgwNjcxNjUxNjgKICAvLyBUb3IgQnJvd3NlciBidWcKICB8fCBuYXRpdmVFeHBtMSgtMmUtMTcpICE9IC0yZS0xNwopID8gZnVuY3Rpb24gZXhwbTEoeCkgewogIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBleHAoeCkgLSAxOwp9IDogbmF0aXZlRXhwbTE7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1mcm91bmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLWZyb3VuZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHNpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1zaWduICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXNpZ24uanMiKTsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIHBvdyA9IE1hdGgucG93Owp2YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpOwp2YXIgRVBTSUxPTjMyID0gcG93KDIsIC0yMyk7CnZhciBNQVgzMiA9IHBvdygyLCAxMjcpICogKDIgLSBFUFNJTE9OMzIpOwp2YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7Cgp2YXIgcm91bmRUaWVzVG9FdmVuID0gZnVuY3Rpb24gKG4pIHsKICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047Cn07CgovLyBgTWF0aC5mcm91bmRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmZyb3VuZAptb2R1bGUuZXhwb3J0cyA9IE1hdGguZnJvdW5kIHx8IGZ1bmN0aW9uIGZyb3VuZCh4KSB7CiAgdmFyICRhYnMgPSBhYnMoeCk7CiAgdmFyICRzaWduID0gc2lnbih4KTsKICB2YXIgYSwgcmVzdWx0OwogIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7CiAgYSA9ICgxICsgRVBTSUxPTjMyIC8gRVBTSUxPTikgKiAkYWJzOwogIHJlc3VsdCA9IGEgLSAoYSAtICRhYnMpOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICBpZiAocmVzdWx0ID4gTUFYMzIgfHwgcmVzdWx0ICE9IHJlc3VsdCkgcmV0dXJuICRzaWduICogSW5maW5pdHk7CiAgcmV0dXJuICRzaWduICogcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtbG9nMXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtbG9nMXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciBsb2cgPSBNYXRoLmxvZzsKCi8vIGBNYXRoLmxvZzFwYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5sb2cxcAptb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCkgewogIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IGxvZygxICsgeCk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1zY2FsZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1zY2FsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLy8gYE1hdGguc2NhbGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCm1vZHVsZS5leHBvcnRzID0gTWF0aC5zY2FsZSB8fCBmdW5jdGlvbiBzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHsKICBpZiAoCiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAwCiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICB8fCB4ICE9IHgKICAgICAgfHwgaW5Mb3cgIT0gaW5Mb3cKICAgICAgfHwgaW5IaWdoICE9IGluSGlnaAogICAgICB8fCBvdXRMb3cgIT0gb3V0TG93CiAgICAgIHx8IG91dEhpZ2ggIT0gb3V0SGlnaAogICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICkgcmV0dXJuIE5hTjsKICBpZiAoeCA9PT0gSW5maW5pdHkgfHwgeCA9PT0gLUluZmluaXR5KSByZXR1cm4geDsKICByZXR1cm4gKHggLSBpbkxvdykgKiAob3V0SGlnaCAtIG91dExvdykgLyAoaW5IaWdoIC0gaW5Mb3cpICsgb3V0TG93Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtc2lnbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXNpZ24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLy8gYE1hdGguc2lnbmAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguc2lnbgptb2R1bGUuZXhwb3J0cyA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbiBzaWduKHgpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgcmV0dXJuICh4ID0gK3gpID09IDAgfHwgeCAhPSB4ID8geCA6IHggPCAwID8gLTEgOiAxOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21pY3JvdGFzay5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwp2YXIgbWFjcm90YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Rhc2sgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiKS5zZXQ7CnZhciBJU19JT1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtaW9zICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1pb3MuanMiKTsKCnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7CnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7CnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7CnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7Ci8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2AKdmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpOwp2YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlOwoKdmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjsKCi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kCmlmICghcXVldWVNaWNyb3Rhc2spIHsKICBmbHVzaCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBwYXJlbnQsIGZuOwogICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTsKICAgIHdoaWxlIChoZWFkKSB7CiAgICAgIGZuID0gaGVhZC5mbjsKICAgICAgaGVhZCA9IGhlYWQubmV4dDsKICAgICAgdHJ5IHsKICAgICAgICBmbigpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTsKICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgIH0gbGFzdCA9IHVuZGVmaW5lZDsKICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpOwogIH07CgogIC8vIE5vZGUuanMKICBpZiAoSVNfTk9ERSkgewogICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgewogICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTsKICAgIH07CiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOQogIH0gZWxzZSBpZiAoTXV0YXRpb25PYnNlcnZlciAmJiAhSVNfSU9TKSB7CiAgICB0b2dnbGUgPSB0cnVlOwogICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsKICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTsKICAgIH07CiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2UKICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7CiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMgogICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOwogICAgdGhlbiA9IHByb21pc2UudGhlbjsKICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgdGhlbi5jYWxsKHByb21pc2UsIGZsdXNoKTsKICAgIH07CiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjoKICAvLyAtIHNldEltbWVkaWF0ZQogIC8vIC0gTWVzc2FnZUNoYW5uZWwKICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnCiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2UKICAvLyAtIHNldFRpbWVvdXQKICB9IGVsc2UgewogICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgewogICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpCiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpOwogICAgfTsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7CiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07CiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7CiAgaWYgKCFoZWFkKSB7CiAgICBoZWFkID0gdGFzazsKICAgIG5vdGlmeSgpOwogIH0gbGFzdCA9IHRhc2s7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3Rvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuUHJvbWlzZTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb24KICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICByZXR1cm4gIVN0cmluZyhTeW1ib2woKSk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS11cmwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS11cmwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7Cgp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7Cgptb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIHVybCA9IG5ldyBVUkwoJ2I/YT0xJmI9MiZjPTMnLCAnaHR0cDovL2EnKTsKICB2YXIgc2VhcmNoUGFyYW1zID0gdXJsLnNlYXJjaFBhcmFtczsKICB2YXIgcmVzdWx0ID0gJyc7CiAgdXJsLnBhdGhuYW1lID0gJ2MlMjBkJzsKICBzZWFyY2hQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkgewogICAgc2VhcmNoUGFyYW1zWydkZWxldGUnXSgnYicpOwogICAgcmVzdWx0ICs9IGtleSArIHZhbHVlOwogIH0pOwogIHJldHVybiAoSVNfUFVSRSAmJiAhdXJsLnRvSlNPTikKICAgIHx8ICFzZWFyY2hQYXJhbXMuc29ydAogICAgfHwgdXJsLmhyZWYgIT09ICdodHRwOi8vYS9jJTIwZD9hPTEmYz0zJwogICAgfHwgc2VhcmNoUGFyYW1zLmdldCgnYycpICE9PSAnMycKICAgIHx8IFN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCc/YT0xJykpICE9PSAnYT0xJwogICAgfHwgIXNlYXJjaFBhcmFtc1tJVEVSQVRPUl0KICAgIC8vIHRocm93cyBpbiBFZGdlCiAgICB8fCBuZXcgVVJMKCdodHRwczovL2FAYicpLnVzZXJuYW1lICE9PSAnYScKICAgIHx8IG5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygnYT1iJykpLmdldCgnYScpICE9PSAnYicKICAgIC8vIG5vdCBwdW55Y29kZWQgaW4gRWRnZQogICAgfHwgbmV3IFVSTCgnaHR0cDovL9GC0LXRgdGCJykuaG9zdCAhPT0gJ3huLS1lMWF5YmMnCiAgICAvLyBub3QgZXNjYXBlZCBpbiBDaHJvbWUgNjItCiAgICB8fCBuZXcgVVJMKCdodHRwOi8vYSPQsScpLmhhc2ggIT09ICcjJUQwJUIxJwogICAgLy8gZmFpbHMgaW4gQ2hyb21lIDY2LQogICAgfHwgcmVzdWx0ICE9PSAnYTFjMycKICAgIC8vIHRocm93cyBpbiBTYWZhcmkKICAgIHx8IG5ldyBVUkwoJ2h0dHA6Ly94JywgdW5kZWZpbmVkKS5ob3N0ICE9PSAneCc7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIpOwoKdmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDsKCm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7Cgp2YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykgewogIHZhciByZXNvbHZlLCByZWplY3Q7CiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHsKICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTsKICAgIHJlc29sdmUgPSAkJHJlc29sdmU7CiAgICByZWplY3QgPSAkJHJlamVjdDsKICB9KTsKICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7CiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTsKfTsKCi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpCm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykgewogIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoaXNSZWdFeHAoaXQpKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpOwogIH0gcmV0dXJuIGl0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwoKdmFyIGdsb2JhbElzRmluaXRlID0gZ2xvYmFsLmlzRmluaXRlOwoKLy8gYE51bWJlci5pc0Zpbml0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2Zpbml0ZQptb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiBpc0Zpbml0ZShpdCkgewogIHJldHVybiB0eXBlb2YgaXQgPT0gJ251bWJlcicgJiYgZ2xvYmFsSXNGaW5pdGUoaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiKTsKdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIik7Cgp2YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjsKdmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwoKLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduCm1vZHVsZS5leHBvcnRzID0gIW5hdGl2ZUFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZykKICBpZiAoREVTQ1JJUFRPUlMgJiYgbmF0aXZlQXNzaWduKHsgYjogMSB9LCBuYXRpdmVBc3NpZ24oZGVmaW5lUHJvcGVydHkoe30sICdhJywgewogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHsKICAgICAgICB2YWx1ZTogMywKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZQogICAgICB9KTsKICAgIH0KICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTsKICAvLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1ZykKICB2YXIgQSA9IHt9OwogIHZhciBCID0ge307CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpOwogIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7CiAgQVtzeW1ib2xdID0gNzsKICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7CiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7Cn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7CiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIGluZGV4ID0gMTsKICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7CiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjsKICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHsKICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pOwogICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTsKICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICAgIHZhciBqID0gMDsKICAgIHZhciBrZXk7CiAgICB3aGlsZSAobGVuZ3RoID4gaikgewogICAgICBrZXkgPSBrZXlzW2orK107CiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07CiAgICB9CiAgfSByZXR1cm4gVDsKfSA6IG5hdGl2ZUFzc2lnbjsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIpOwp2YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIpOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKdmFyIGh0bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyIpOwp2YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIpOwp2YXIgc2hhcmVkS2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiKTsKdmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpOwoKdmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnOwp2YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07CgovLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlCnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkgewogIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnCiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDsKICB2YXIgbHQgPSAnPCc7CiAgdmFyIHNjcmlwdCA9ICdzY3JpcHQnOwogIHZhciBndCA9ICc+JzsKICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7CiAgdmFyIGlmcmFtZURvY3VtZW50OwogIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTsKICBpZnJhbWUuc3JjID0gU3RyaW5nKGpzKTsKICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OwogIGlmcmFtZURvY3VtZW50Lm9wZW4oKTsKICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArIHNjcmlwdCArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy8nICsgc2NyaXB0ICsgZ3QpOwogIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7CiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7CiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dOwogIHJldHVybiBjcmVhdGVEaWN0KCk7Cn07CgovLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGUKbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7CiAgdmFyIHJlc3VsdDsKICBpZiAoTyAhPT0gbnVsbCkgewogICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pOwogICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7CiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDsKICAgIC8vIGFkZCAiX19wcm90b19fIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsCiAgICByZXN1bHRbSUVfUFJPVE9dID0gTzsKICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpOwogIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7Cn07CgpoaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIpOwoKLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXMKbW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7CiAgYW5PYmplY3QoTyk7CiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpOwogIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICB2YXIgaW5kZXggPSAwOwogIHZhciBrZXk7CiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7CiAgcmV0dXJuIE87Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwoKdmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwoKLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eQpleHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgewogIGFuT2JqZWN0KE8pOwogIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKICBhbk9iamVjdChBdHRyaWJ1dGVzKTsKICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7CiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTsKICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTsKICByZXR1cm4gTzsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIik7Cgp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcgpleHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7CiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTsKICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkgewogICAgcmV0dXJuIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9CiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwoKdmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7Cgp2YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcwogID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdOwoKdmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7CiAgdHJ5IHsKICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7CiAgfQp9OwoKLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvdwptb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkgewogIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJwogICAgPyBnZXRXaW5kb3dOYW1lcyhpdCkKICAgIDogbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIpOwp2YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIpOwoKdmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzCmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykgewogIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7CgpleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIpOwp2YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIik7Cgp2YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7CnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlOwoKLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZgptb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7CiAgTyA9IHRvT2JqZWN0KE8pOwogIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107CiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHsKICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWl0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7CnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIG9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwoKdmFyIE9CSkVDVF9JVEVSQVRPUiA9ICdPYmplY3QgSXRlcmF0b3InOwp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKE9CSkVDVF9JVEVSQVRPUik7Cgptb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoZnVuY3Rpb24gT2JqZWN0SXRlcmF0b3Ioc291cmNlLCBtb2RlKSB7CiAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KHNvdXJjZSk7CiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICB0eXBlOiBPQkpFQ1RfSVRFUkFUT1IsCiAgICBtb2RlOiBtb2RlLAogICAgb2JqZWN0OiBvYmplY3QsCiAgICBrZXlzOiBvYmplY3RLZXlzKG9iamVjdCksCiAgICBpbmRleDogMAogIH0pOwp9LCAnT2JqZWN0JywgZnVuY3Rpb24gbmV4dCgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogIHZhciBrZXlzID0gc3RhdGUua2V5czsKICB3aGlsZSAodHJ1ZSkgewogICAgaWYgKGtleXMgPT09IG51bGwgfHwgc3RhdGUuaW5kZXggPj0ga2V5cy5sZW5ndGgpIHsKICAgICAgc3RhdGUub2JqZWN0ID0gc3RhdGUua2V5cyA9IG51bGw7CiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTsKICAgIH0KICAgIHZhciBrZXkgPSBrZXlzW3N0YXRlLmluZGV4KytdOwogICAgdmFyIG9iamVjdCA9IHN0YXRlLm9iamVjdDsKICAgIGlmICghaGFzKG9iamVjdCwga2V5KSkgY29udGludWU7CiAgICBzd2l0Y2ggKHN0YXRlLm1vZGUpIHsKICAgICAgY2FzZSAna2V5cyc6IHJldHVybiB7IHZhbHVlOiBrZXksIGRvbmU6IGZhbHNlIH07CiAgICAgIGNhc2UgJ3ZhbHVlcyc6IHJldHVybiB7IHZhbHVlOiBvYmplY3Rba2V5XSwgZG9uZTogZmFsc2UgfTsKICAgIH0gLyogZW50cmllcyAqLyByZXR1cm4geyB2YWx1ZTogW2tleSwgb2JqZWN0W2tleV1dLCBkb25lOiBmYWxzZSB9OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgaW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiKS5pbmRleE9mOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHsKICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpOwogIHZhciBpID0gMDsKICB2YXIgcmVzdWx0ID0gW107CiAgdmFyIGtleTsKICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTsKICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzCiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHsKICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIik7CnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIik7CgovLyBgT2JqZWN0LmtleXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5cwptb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykgewogIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKCi8vIE5hc2hvcm4gfiBKREs4IGJ1Zwp2YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgIW5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpOwoKLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlCmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgewogIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpOwogIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlOwp9IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhUG9zc2libGVQcm90b3R5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIik7CgovLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mCi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLgovKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqLwptb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7CiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7CiAgdmFyIHRlc3QgPSB7fTsKICB2YXIgc2V0dGVyOwogIHRyeSB7CiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7CiAgICBzZXR0ZXIuY2FsbCh0ZXN0LCBbXSk7CiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9CiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7CiAgICBhbk9iamVjdChPKTsKICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7CiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlci5jYWxsKE8sIHByb3RvKTsKICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bzsKICAgIHJldHVybiBPOwogIH07Cn0oKSA6IHVuZGVmaW5lZCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIG9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIik7CnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiKS5mOwoKLy8gYE9iamVjdC57IGVudHJpZXMsIHZhbHVlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykgewogIHJldHVybiBmdW5jdGlvbiAoaXQpIHsKICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTsKICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTsKICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICAgIHZhciBpID0gMDsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHZhciBrZXk7CiAgICB3aGlsZSAobGVuZ3RoID4gaSkgewogICAgICBrZXkgPSBrZXlzW2krK107CiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChPLCBrZXkpKSB7CiAgICAgICAgcmVzdWx0LnB1c2goVE9fRU5UUklFUyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH07Cn07Cgptb2R1bGUuZXhwb3J0cyA9IHsKICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzCiAgZW50cmllczogY3JlYXRlTWV0aG9kKHRydWUpLAogIC8vIGBPYmplY3QudmFsdWVzYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzCiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiKTsKCi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZwptb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgovLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzCm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkgewogIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7CiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mOwogIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtZmxvYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXJzZS1mbG9hdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgdHJpbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiKS50cmltOwp2YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIik7Cgp2YXIgbmF0aXZlUGFyc2VGbG9hdCA9IGdsb2JhbC5wYXJzZUZsb2F0Owp2YXIgRk9SQ0VEID0gMSAvIG5hdGl2ZVBhcnNlRmxvYXQod2hpdGVzcGFjZXMgKyAnLTAnKSAhPT0gLUluZmluaXR5OwoKLy8gYHBhcnNlRmxvYXRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wYXJzZWZsb2F0LXN0cmluZwptb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyaW5nKSB7CiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKFN0cmluZyhzdHJpbmcpKTsKICB2YXIgcmVzdWx0ID0gbmF0aXZlUGFyc2VGbG9hdCh0cmltbWVkU3RyaW5nKTsKICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHRyaW1tZWRTdHJpbmcuY2hhckF0KDApID09ICctJyA/IC0wIDogcmVzdWx0Owp9IDogbmF0aXZlUGFyc2VGbG9hdDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXJzZS1pbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtaW50LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgdHJpbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiKS50cmltOwp2YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIik7Cgp2YXIgbmF0aXZlUGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7CnZhciBoZXggPSAvXlsrLV0/MFtYeF0vOwp2YXIgRk9SQ0VEID0gbmF0aXZlUGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMDgnKSAhPT0gOCB8fCBuYXRpdmVQYXJzZUludCh3aGl0ZXNwYWNlcyArICcweDE2JykgIT09IDIyOwoKLy8gYHBhcnNlSW50YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4Cm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCkgewogIHZhciBTID0gdHJpbShTdHJpbmcoc3RyaW5nKSk7CiAgcmV0dXJuIG5hdGl2ZVBhcnNlSW50KFMsIChyYWRpeCA+Pj4gMCkgfHwgKGhleC50ZXN0KFMpID8gMTYgOiAxMCkpOwp9IDogbmF0aXZlUGFyc2VJbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7CiAgdHJ5IHsKICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9OwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7CiAgYW5PYmplY3QoQyk7CiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4OwogIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7CiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlOwogIHJlc29sdmUoeCk7CiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHVueWNvZGUtdG8tYXNjaWkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wdW55Y29kZS10by1hc2NpaS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcy9ibG9iL21hc3Rlci9wdW55Y29kZS5qcwp2YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMQp2YXIgYmFzZSA9IDM2Owp2YXIgdE1pbiA9IDE7CnZhciB0TWF4ID0gMjY7CnZhciBza2V3ID0gMzg7CnZhciBkYW1wID0gNzAwOwp2YXIgaW5pdGlhbEJpYXMgPSA3MjsKdmFyIGluaXRpYWxOID0gMTI4OyAvLyAweDgwCnZhciBkZWxpbWl0ZXIgPSAnLSc7IC8vICdceDJEJwp2YXIgcmVnZXhOb25BU0NJSSA9IC9bXlwwLVx1MDA3RV0vOyAvLyBub24tQVNDSUkgY2hhcnMKdmFyIHJlZ2V4U2VwYXJhdG9ycyA9IC9bLlx1MzAwMlx1RkYwRVx1RkY2MV0vZzsgLy8gUkZDIDM0OTAgc2VwYXJhdG9ycwp2YXIgT1ZFUkZMT1dfRVJST1IgPSAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnOwp2YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluOwp2YXIgZmxvb3IgPSBNYXRoLmZsb29yOwp2YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTsKCi8qKgogKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlCiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSwKICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2gKICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsCiAqIG1hdGNoaW5nIFVURi0xNi4KICovCnZhciB1Y3MyZGVjb2RlID0gZnVuY3Rpb24gKHN0cmluZykgewogIHZhciBvdXRwdXQgPSBbXTsKICB2YXIgY291bnRlciA9IDA7CiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHsKICAgIHZhciB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7CiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7CiAgICAgIC8vIEl0J3MgYSBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXIuCiAgICAgIHZhciBleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7CiAgICAgIGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLgogICAgICAgIG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUKICAgICAgICAvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci4KICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7CiAgICAgICAgY291bnRlci0tOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7CiAgICB9CiAgfQogIHJldHVybiBvdXRwdXQ7Cn07CgovKioKICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LgogKi8KdmFyIGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uIChkaWdpdCkgewogIC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aCiAgLy8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45CiAgcmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KTsKfTsKCi8qKgogKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLgogKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNAogKi8KdmFyIGFkYXB0ID0gZnVuY3Rpb24gKGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkgewogIHZhciBrID0gMDsKICBkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxOwogIGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTsKICBmb3IgKDsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHsKICAgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTsKICB9CiAgcmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7Cn07CgovKioKICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGEKICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy4KICovCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgbWF4LXN0YXRlbWVudHMKdmFyIGVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCkgewogIHZhciBvdXRwdXQgPSBbXTsKCiAgLy8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gYW4gYXJyYXkgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4KICBpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpOwoKICAvLyBDYWNoZSB0aGUgbGVuZ3RoLgogIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDsKCiAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUuCiAgdmFyIG4gPSBpbml0aWFsTjsKICB2YXIgZGVsdGEgPSAwOwogIHZhciBiaWFzID0gaW5pdGlhbEJpYXM7CiAgdmFyIGksIGN1cnJlbnRWYWx1ZTsKCiAgLy8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50cy4KICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldOwogICAgaWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHsKICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpOwogICAgfQogIH0KCiAgdmFyIGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDsgLy8gbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLgogIHZhciBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoOyAvLyBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDsKCiAgLy8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS4KICBpZiAoYmFzaWNMZW5ndGgpIHsKICAgIG91dHB1dC5wdXNoKGRlbGltaXRlcik7CiAgfQoKICAvLyBNYWluIGVuY29kaW5nIGxvb3A6CiAgd2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHsKICAgIC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHQgbGFyZ2VyIG9uZToKICAgIHZhciBtID0gbWF4SW50OwogICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldOwogICAgICBpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkgewogICAgICAgIG0gPSBjdXJyZW50VmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LgogICAgdmFyIGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTsKICAgIGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7CiAgICAgIHRocm93IFJhbmdlRXJyb3IoT1ZFUkZMT1dfRVJST1IpOwogICAgfQoKICAgIGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7CiAgICBuID0gbTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKICAgICAgY3VycmVudFZhbHVlID0gaW5wdXRbaV07CiAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHsKICAgICAgICB0aHJvdyBSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTsKICAgICAgfQogICAgICBpZiAoY3VycmVudFZhbHVlID09IG4pIHsKICAgICAgICAvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci4KICAgICAgICB2YXIgcSA9IGRlbHRhOwogICAgICAgIGZvciAodmFyIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkgewogICAgICAgICAgdmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpOwogICAgICAgICAgaWYgKHEgPCB0KSBicmVhazsKICAgICAgICAgIHZhciBxTWludXNUID0gcSAtIHQ7CiAgICAgICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0OwogICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QpKSk7CiAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpOwogICAgICAgIH0KCiAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxKSkpOwogICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7CiAgICAgICAgZGVsdGEgPSAwOwogICAgICAgICsraGFuZGxlZENQQ291bnQ7CiAgICAgIH0KICAgIH0KCiAgICArK2RlbHRhOwogICAgKytuOwogIH0KICByZXR1cm4gb3V0cHV0LmpvaW4oJycpOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQpIHsKICB2YXIgZW5jb2RlZCA9IFtdOwogIHZhciBsYWJlbHMgPSBpbnB1dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXHUwMDJFJykuc3BsaXQoJy4nKTsKICB2YXIgaSwgbGFiZWw7CiAgZm9yIChpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykgewogICAgbGFiZWwgPSBsYWJlbHNbaV07CiAgICBlbmNvZGVkLnB1c2gocmVnZXhOb25BU0NJSS50ZXN0KGxhYmVsKSA/ICd4bi0tJyArIGVuY29kZShsYWJlbCkgOiBsYWJlbCk7CiAgfQogIHJldHVybiBlbmNvZGVkLmpvaW4oJy4nKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHsKICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpOwogIHJldHVybiB0YXJnZXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHNldEdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIik7CnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKCnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7CnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTsKdmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpOwoKKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHsKICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTsKICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7CiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlOwogIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgewogICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7CiAgICBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSkuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpOwogIH0KICBpZiAoTyA9PT0gZ2xvYmFsKSB7CiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTsKICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpOwogICAgcmV0dXJuOwogIH0gZWxzZSBpZiAoIXVuc2FmZSkgewogICAgZGVsZXRlIE9ba2V5XTsKICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHsKICAgIHNpbXBsZSA9IHRydWU7CiAgfQogIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlOwogIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sIGtleSwgdmFsdWUpOwovLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmUKfSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHsKICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgCnZhciBNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIpOwp2YXIgV2Vha01hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMud2Vhay1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7Cgp2YXIgbWV0YWRhdGEgPSBzaGFyZWQoJ21ldGFkYXRhJyk7CnZhciBzdG9yZSA9IG1ldGFkYXRhLnN0b3JlIHx8IChtZXRhZGF0YS5zdG9yZSA9IG5ldyBXZWFrTWFwKCkpOwoKdmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGNyZWF0ZSkgewogIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpOwogIGlmICghdGFyZ2V0TWV0YWRhdGEpIHsKICAgIGlmICghY3JlYXRlKSByZXR1cm47CiAgICBzdG9yZS5zZXQodGFyZ2V0LCB0YXJnZXRNZXRhZGF0YSA9IG5ldyBNYXAoKSk7CiAgfQogIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpOwogIGlmICgha2V5TWV0YWRhdGEpIHsKICAgIGlmICghY3JlYXRlKSByZXR1cm47CiAgICB0YXJnZXRNZXRhZGF0YS5zZXQodGFyZ2V0S2V5LCBrZXlNZXRhZGF0YSA9IG5ldyBNYXAoKSk7CiAgfSByZXR1cm4ga2V5TWV0YWRhdGE7Cn07Cgp2YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkgewogIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpOwogIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpOwp9OwoKdmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHsKICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTsKICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7Cn07Cgp2YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkgewogIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgdHJ1ZSkuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTsKfTsKCnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSkgewogIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGZhbHNlKTsKICB2YXIga2V5cyA9IFtdOwogIGlmIChtZXRhZGF0YU1hcCkgbWV0YWRhdGFNYXAuZm9yRWFjaChmdW5jdGlvbiAoXywga2V5KSB7IGtleXMucHVzaChrZXkpOyB9KTsKICByZXR1cm4ga2V5czsKfTsKCnZhciB0b01ldGFkYXRhS2V5ID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiBTdHJpbmcoaXQpOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgc3RvcmU6IHN0b3JlLAogIGdldE1hcDogZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCwKICBoYXM6IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEsCiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLAogIHNldDogb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSwKICBrZXlzOiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cywKICB0b0tleTogdG9NZXRhZGF0YUtleQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKdmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3JlZ2V4cC1leGVjICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcyIpOwoKLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIsIFMpIHsKICB2YXIgZXhlYyA9IFIuZXhlYzsKICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHsKICAgIHZhciByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7CiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWdFeHAgZXhlYyBtZXRob2QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gT2JqZWN0IG9yIG51bGwnKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpZiAoY2xhc3NvZihSKSAhPT0gJ1JlZ0V4cCcpIHsKICAgIHRocm93IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpOwogIH0KCiAgcmV0dXJuIHJlZ2V4cEV4ZWMuY2FsbChSLCBTKTsKfTsKCgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHJlZ2V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9yZWdleHAtZmxhZ3MgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qcyIpOwoKdmFyIG5hdGl2ZUV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7Ci8vIFRoaXMgYWx3YXlzIHJlZmVycyB0byB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlIHRoZQovLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcywKLy8gd2hpY2ggbG9hZHMgdGhpcyBmaWxlIGJlZm9yZSBwYXRjaGluZyB0aGUgbWV0aG9kLgp2YXIgbmF0aXZlUmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTsKCnZhciBwYXRjaGVkRXhlYyA9IG5hdGl2ZUV4ZWM7Cgp2YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHsKICB2YXIgcmUxID0gL2EvOwogIHZhciByZTIgPSAvYiovZzsKICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpOwogIG5hdGl2ZUV4ZWMuY2FsbChyZTIsICdhJyk7CiAgcmV0dXJuIHJlMS5sYXN0SW5kZXggIT09IDAgfHwgcmUyLmxhc3RJbmRleCAhPT0gMDsKfSkoKTsKCi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC4KdmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDsKCnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEOwoKaWYgKFBBVENIKSB7CiAgcGF0Y2hlZEV4ZWMgPSBmdW5jdGlvbiBleGVjKHN0cikgewogICAgdmFyIHJlID0gdGhpczsKICAgIHZhciBsYXN0SW5kZXgsIHJlQ29weSwgbWF0Y2gsIGk7CgogICAgaWYgKE5QQ0dfSU5DTFVERUQpIHsKICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyByZS5zb3VyY2UgKyAnJCg/IVxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7CiAgICB9CiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7CgogICAgbWF0Y2ggPSBuYXRpdmVFeGVjLmNhbGwocmUsIHN0cik7CgogICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkgewogICAgICByZS5sYXN0SW5kZXggPSByZS5nbG9iYWwgPyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCA6IGxhc3RJbmRleDsKICAgIH0KICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHsKICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAKICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJyB3b3JrIGZvciAvKC4/KT8vCiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gbWF0Y2g7CiAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBwYXRjaGVkRXhlYzsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgovLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7CiAgdmFyIHJlc3VsdCA9ICcnOwogIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJzsKICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knOwogIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJzsKICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7CiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JzsKICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7CiAgcmV0dXJuIHJlc3VsdDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIiArIGl0KTsKICByZXR1cm4gaXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS16ZXJvLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUtemVyby5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgovLyBgU2FtZVZhbHVlWmVyb2AgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNhbWV2YWx1ZXplcm8KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoeCwgeSkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICByZXR1cm4geCA9PT0geSB8fCB4ICE9IHggJiYgeSAhPSB5Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIGBTYW1lVmFsdWVgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zYW1ldmFsdWUKbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogIHRyeSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsLCBrZXksIHZhbHVlKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTsKICB9IHJldHVybiB2YWx1ZTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkgewogIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7CiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjsKCiAgaWYgKERFU0NSSVBUT1JTICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTXSkgewogICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0KICAgIH0pOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7CiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHsKICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTsKICB9Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7CnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiKTsKCnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIHNldEdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIik7Cgp2YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7CnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTsKCm1vZHVsZS5leHBvcnRzID0gc3RvcmU7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIHN0b3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIik7CgoobW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pOwp9KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7CiAgdmVyc2lvbjogJzMuNS4wJywKICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsCiAgY29weXJpZ2h0OiAnwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHsKICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdOwogIHJldHVybiAhbWV0aG9kIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsLG5vLXRocm93LWxpdGVyYWwKICAgIG1ldGhvZC5jYWxsKG51bGwsIGFyZ3VtZW50IHx8IGZ1bmN0aW9uICgpIHsgdGhyb3cgMTsgfSwgMSk7CiAgfSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3Rvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHsKICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yOwogIHZhciBTOwogIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS57IGNvZGVQb2ludEF0LCBhdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHsKICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBwb3MpIHsKICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlcihwb3MpOwogICAgdmFyIHNpemUgPSBTLmxlbmd0aDsKICAgIHZhciBmaXJzdCwgc2Vjb25kOwogICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDsKICAgIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTsKICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemUKICAgICAgfHwgKHNlY29uZCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkYKICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3QKICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmNvZGVwb2ludGF0CiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLAogIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2QKICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0CiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSkKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcGFkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcGFkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kCnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgcmVwZWF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMiKTsKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKCnZhciBjZWlsID0gTWF0aC5jZWlsOwoKLy8gYFN0cmluZy5wcm90b3R5cGUueyBwYWRTdGFydCwgcGFkRW5kIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb24KdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19FTkQpIHsKICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHsKICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKICAgIHZhciBzdHJpbmdMZW5ndGggPSBTLmxlbmd0aDsKICAgIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpOwogICAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7CiAgICB2YXIgZmlsbExlbiwgc3RyaW5nRmlsbGVyOwogICAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7CiAgICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOwogICAgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTsKICAgIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pOwogICAgcmV0dXJuIElTX0VORCA/IFMgKyBzdHJpbmdGaWxsZXIgOiBzdHJpbmdGaWxsZXIgKyBTOwogIH07Cn07Cgptb2R1bGUuZXhwb3J0cyA9IHsKICAvLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRzdGFydAogIHN0YXJ0OiBjcmVhdGVNZXRob2QoZmFsc2UpLAogIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmQKICBlbmQ6IGNyZWF0ZU1ldGhvZCh0cnVlKQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGVhdAptb2R1bGUuZXhwb3J0cyA9ICcnLnJlcGVhdCB8fCBmdW5jdGlvbiByZXBlYXQoY291bnQpIHsKICB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpOwogIHZhciByZXN1bHQgPSAnJzsKICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7CiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpOwogIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXN1bHQgKz0gc3RyOwogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKdmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcyIpOwoKdmFyIHdoaXRlc3BhY2UgPSAnWycgKyB3aGl0ZXNwYWNlcyArICddJzsKdmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTsKdmFyIHJ0cmltID0gUmVnRXhwKHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyokJyk7CgovLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkgewogIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHsKICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpOwogICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShsdHJpbSwgJycpOwogICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpOwogICAgcmV0dXJuIHN0cmluZzsKICB9Owp9OwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHMKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydAogIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksCiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltUmlnaHQsIHRyaW1FbmQgfWAgbWV0aG9kcwogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZAogIGVuZDogY3JlYXRlTWV0aG9kKDIpLAogIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbQogIHRyaW06IGNyZWF0ZU1ldGhvZCgzKQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgaHRtbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIik7CnZhciBjcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIpOwp2YXIgSVNfSU9TID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWlvcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW9zLmpzIik7Cgp2YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247CnZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlOwp2YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7CnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7CnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDsKdmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoOwp2YXIgY291bnRlciA9IDA7CnZhciBxdWV1ZSA9IHt9Owp2YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7CnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDsKCnZhciBydW4gPSBmdW5jdGlvbiAoaWQpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkgewogICAgdmFyIGZuID0gcXVldWVbaWRdOwogICAgZGVsZXRlIHF1ZXVlW2lkXTsKICAgIGZuKCk7CiAgfQp9OwoKdmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkgewogIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICBydW4oaWQpOwogIH07Cn07Cgp2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBydW4oZXZlbnQuZGF0YSk7Cn07Cgp2YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkgewogIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpbgogIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTsKfTsKCi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZToKaWYgKCFzZXQgfHwgIWNsZWFyKSB7CiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7CiAgICB2YXIgYXJncyA9IFtdOwogICAgdmFyIGkgPSAxOwogICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pOwogICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jCiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOwogICAgfTsKICAgIGRlZmVyKGNvdW50ZXIpOwogICAgcmV0dXJuIGNvdW50ZXI7CiAgfTsKICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7CiAgICBkZWxldGUgcXVldWVbaWRdOwogIH07CiAgLy8gTm9kZS5qcyAwLjgtCiAgaWYgKGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7CiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkgewogICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpOwogICAgfTsKICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUEkKICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykgewogICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpOwogICAgfTsKICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzCiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjQKICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHsKICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTsKICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyOwogICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjsKICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTsKICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnMKICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0JwogIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmICFmYWlscyhwb3N0KSkgewogICAgZGVmZXIgPSBwb3N0OwogICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpOwogIC8vIElFOC0KICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkgewogICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICAgIHJ1bihpZCk7CiAgICAgIH07CiAgICB9OwogIC8vIFJlc3Qgb2xkIGJyb3dzZXJzCiAgfSBlbHNlIHsKICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7CiAgICB9OwogIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgc2V0OiBzZXQsCiAgY2xlYXI6IGNsZWFyCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGhpcy1udW1iZXItdmFsdWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIik7CgovLyBgdGhpc051bWJlclZhbHVlYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGhpc251bWJlcnZhbHVlCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnbnVtYmVyJyAmJiBjbGFzc29mKHZhbHVlKSAhPSAnTnVtYmVyJykgewogICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgaW52b2NhdGlvbicpOwogIH0KICByZXR1cm4gK3ZhbHVlOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIpOwoKdmFyIG1heCA9IE1hdGgubWF4Owp2YXIgbWluID0gTWF0aC5taW47CgovLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzoKLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLgovLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7CiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXIoaW5kZXgpOwogIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKCi8vIGBUb0luZGV4YCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbmRleAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmIChpdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDsKICB2YXIgbnVtYmVyID0gdG9JbnRlZ2VyKGl0KTsKICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTsKICBpZiAobnVtYmVyICE9PSBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCBvciBpbmRleCcpOwogIHJldHVybiBsZW5ndGg7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3MKdmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7Cgp2YXIgY2VpbCA9IE1hdGguY2VpbDsKdmFyIGZsb29yID0gTWF0aC5mbG9vcjsKCi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2ludGVnZXIKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7Cgp2YXIgbWluID0gTWF0aC5taW47CgovLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkgewogIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyKGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CgovLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkgewogIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9mZnNldC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vZmZzZXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgdG9Qb3NpdGl2ZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7CiAgdmFyIG9mZnNldCA9IHRvUG9zaXRpdmVJbnRlZ2VyKGl0KTsKICBpZiAob2Zmc2V0ICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpOwogIHJldHVybiBvZmZzZXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIHJlc3VsdCA9IHRvSW50ZWdlcihpdCk7CiAgaWYgKHJlc3VsdCA8IDApIHRocm93IFJhbmdlRXJyb3IoIlRoZSBhcmd1bWVudCBjYW4ndCBiZSBsZXNzIHRoYW4gMCIpOwogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKLy8gYFRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmUKLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2UKLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmcKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIFBSRUZFUlJFRF9TVFJJTkcpIHsKICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0OwogIHZhciBmbiwgdmFsOwogIGlmIChQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsOwogIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsOwogIGlmICghUFJFRkVSUkVEX1NUUklORyAmJiB0eXBlb2YgKGZuID0gaW5wdXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDsKICB0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7CnZhciB0ZXN0ID0ge307Cgp0ZXN0W1RPX1NUUklOR19UQUddID0gJ3onOwoKbW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJzsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycy5qcyIpOwp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHRvSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4LmpzIik7CnZhciB0b09mZnNldCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vZmZzZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9mZnNldC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwp2YXIgdHlwZWRBcnJheUZyb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbS5qcyIpOwp2YXIgZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZvckVhY2g7CnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7CnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIik7Cgp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0Owp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7CnZhciByb3VuZCA9IE1hdGgucm91bmQ7CnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7CnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyOwp2YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldzsKdmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M7CnZhciBUWVBFRF9BUlJBWV9UQUcgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlRZUEVEX0FSUkFZX1RBRzsKdmFyIFR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXk7CnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5UeXBlZEFycmF5UHJvdG90eXBlOwp2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKdmFyIGlzVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuaXNUeXBlZEFycmF5Owp2YXIgQllURVNfUEVSX0VMRU1FTlQgPSAnQllURVNfUEVSX0VMRU1FTlQnOwp2YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCc7Cgp2YXIgZnJvbUxpc3QgPSBmdW5jdGlvbiAoQywgbGlzdCkgewogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoOwogIHZhciByZXN1bHQgPSBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3IoQykpKGxlbmd0aCk7CiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTsKICByZXR1cm4gcmVzdWx0Owp9OwoKdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CiAgbmF0aXZlRGVmaW5lUHJvcGVydHkoaXQsIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpW2tleV07CiAgfSB9KTsKfTsKCnZhciBpc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIGtsYXNzOwogIHJldHVybiBpdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoaXQpKSA9PSAnQXJyYXlCdWZmZXInIHx8IGtsYXNzID09ICdTaGFyZWRBcnJheUJ1ZmZlcic7Cn07Cgp2YXIgaXNUeXBlZEFycmF5SW5kZXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsKICByZXR1cm4gaXNUeXBlZEFycmF5KHRhcmdldCkKICAgICYmIHR5cGVvZiBrZXkgIT0gJ3N5bWJvbCcKICAgICYmIGtleSBpbiB0YXJnZXQKICAgICYmIFN0cmluZygra2V5KSA9PSBTdHJpbmcoa2V5KTsKfTsKCnZhciB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7CiAgcmV0dXJuIGlzVHlwZWRBcnJheUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSkKICAgID8gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDIsIHRhcmdldFtrZXldKQogICAgOiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpOwp9OwoKdmFyIHdyYXBwZWREZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7CiAgaWYgKGlzVHlwZWRBcnJheUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSkKICAgICYmIGlzT2JqZWN0KGRlc2NyaXB0b3IpCiAgICAmJiBoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJykKICAgICYmICFoYXMoZGVzY3JpcHRvciwgJ2dldCcpCiAgICAmJiAhaGFzKGRlc2NyaXB0b3IsICdzZXQnKQogICAgLy8gVE9ETzogYWRkIHZhbGlkYXRpb24gZGVzY3JpcHRvciB3L28gY2FsbGluZyBhY2Nlc3NvcnMKICAgICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZQogICAgJiYgKCFoYXMoZGVzY3JpcHRvciwgJ3dyaXRhYmxlJykgfHwgZGVzY3JpcHRvci53cml0YWJsZSkKICAgICYmICghaGFzKGRlc2NyaXB0b3IsICdlbnVtZXJhYmxlJykgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlKQogICkgewogICAgdGFyZ2V0W2tleV0gPSBkZXNjcmlwdG9yLnZhbHVlOwogICAgcmV0dXJuIHRhcmdldDsKICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7Cn07CgppZiAoREVTQ1JJUFRPUlMpIHsKICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHsKICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mID0gd3JhcHBlZEdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYgPSB3cmFwcGVkRGVmaW5lUHJvcGVydHk7CiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J1ZmZlcicpOwogICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdieXRlT2Zmc2V0Jyk7CiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnKTsKICAgIGFkZEdldHRlcihUeXBlZEFycmF5UHJvdG90eXBlLCAnbGVuZ3RoJyk7CiAgfQoKICAkKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCB7CiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IHdyYXBwZWRHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsCiAgICBkZWZpbmVQcm9wZXJ0eTogd3JhcHBlZERlZmluZVByb3BlcnR5CiAgfSk7CgogIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsIHdyYXBwZXIsIENMQU1QRUQpIHsKICAgIHZhciBCWVRFUyA9IFRZUEUubWF0Y2goL1xkKyQvKVswXSAvIDg7CiAgICB2YXIgQ09OU1RSVUNUT1JfTkFNRSA9IFRZUEUgKyAoQ0xBTVBFRCA/ICdDbGFtcGVkJyA6ICcnKSArICdBcnJheSc7CiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBUWVBFOwogICAgdmFyIFNFVFRFUiA9ICdzZXQnICsgVFlQRTsKICAgIHZhciBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQ09OU1RSVUNUT1JfTkFNRV07CiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yOwogICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSA9IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlOwogICAgdmFyIGV4cG9ydGVkID0ge307CgogICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkgewogICAgICB2YXIgZGF0YSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7CiAgICAgIHJldHVybiBkYXRhLnZpZXdbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB0cnVlKTsKICAgIH07CgogICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHsKICAgICAgdmFyIGRhdGEgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOwogICAgICBpZiAoQ0xBTVBFRCkgdmFsdWUgPSAodmFsdWUgPSByb3VuZCh2YWx1ZSkpIDwgMCA/IDAgOiB2YWx1ZSA+IDB4RkYgPyAweEZGIDogdmFsdWUgJiAweEZGOwogICAgICBkYXRhLnZpZXdbU0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7CiAgICB9OwoKICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7CiAgICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KHRoYXQsIGluZGV4LCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTsKICAgICAgICB9LAogICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfTsKCiAgICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHsKICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgb2Zmc2V0LCAkbGVuZ3RoKSB7CiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5Q29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOwogICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgdmFyIGJ5dGVPZmZzZXQgPSAwOwogICAgICAgIHZhciBidWZmZXIsIGJ5dGVMZW5ndGgsIGxlbmd0aDsKICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7CiAgICAgICAgICBsZW5ndGggPSB0b0luZGV4KGRhdGEpOwogICAgICAgICAgYnl0ZUxlbmd0aCA9IGxlbmd0aCAqIEJZVEVTOwogICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihkYXRhKSkgewogICAgICAgICAgYnVmZmVyID0gZGF0YTsKICAgICAgICAgIGJ5dGVPZmZzZXQgPSB0b09mZnNldChvZmZzZXQsIEJZVEVTKTsKICAgICAgICAgIHZhciAkbGVuID0gZGF0YS5ieXRlTGVuZ3RoOwogICAgICAgICAgaWYgKCRsZW5ndGggPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7CiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSAkbGVuIC0gYnl0ZU9mZnNldDsKICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggPCAwKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUzsKICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggKyBieXRlT2Zmc2V0ID4gJGxlbikgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpOwogICAgICAgICAgfQogICAgICAgICAgbGVuZ3RoID0gYnl0ZUxlbmd0aCAvIEJZVEVTOwogICAgICAgIH0gZWxzZSBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSB7CiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHR5cGVkQXJyYXlGcm9tLmNhbGwoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTsKICAgICAgICB9CiAgICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CiAgICAgICAgICBidWZmZXI6IGJ1ZmZlciwKICAgICAgICAgIGJ5dGVPZmZzZXQ6IGJ5dGVPZmZzZXQsCiAgICAgICAgICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoLAogICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsCiAgICAgICAgICB2aWV3OiBuZXcgRGF0YVZpZXcoYnVmZmVyKQogICAgICAgIH0pOwogICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTsKICAgICAgfSk7CgogICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7CiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSA9IFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoVHlwZWRBcnJheVByb3RvdHlwZSk7CiAgICB9IGVsc2UgaWYgKFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMpIHsKICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGRhdGEsIHR5cGVkQXJyYXlPZmZzZXQsICRsZW5ndGgpIHsKICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBUeXBlZEFycmF5Q29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOwogICAgICAgIHJldHVybiBpbmhlcml0SWZSZXF1aXJlZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0b0luZGV4KGRhdGEpKTsKICAgICAgICAgIGlmIChpc0FycmF5QnVmZmVyKGRhdGEpKSByZXR1cm4gJGxlbmd0aCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgID8gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhLCB0b09mZnNldCh0eXBlZEFycmF5T2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpCiAgICAgICAgICAgIDogdHlwZWRBcnJheU9mZnNldCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgPyBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKGRhdGEsIHRvT2Zmc2V0KHR5cGVkQXJyYXlPZmZzZXQsIEJZVEVTKSkKICAgICAgICAgICAgICA6IG5ldyBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IoZGF0YSk7CiAgICAgICAgICBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTsKICAgICAgICAgIHJldHVybiB0eXBlZEFycmF5RnJvbS5jYWxsKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgZGF0YSk7CiAgICAgICAgfSgpLCBkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yKTsKICAgICAgfSk7CgogICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7CiAgICAgIGZvckVhY2goZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IpLCBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgaWYgKCEoa2V5IGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcikpIHsKICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIGtleSwgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yW2tleV0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGU7CiAgICB9CgogICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcik7CiAgICB9CgogICAgaWYgKFRZUEVEX0FSUkFZX1RBRykgewogICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCBUWVBFRF9BUlJBWV9UQUcsIENPTlNUUlVDVE9SX05BTUUpOwogICAgfQoKICAgIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yOwoKICAgICQoewogICAgICBnbG9iYWw6IHRydWUsIGZvcmNlZDogVHlwZWRBcnJheUNvbnN0cnVjdG9yICE9IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvciwgc2hhbTogIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MKICAgIH0sIGV4cG9ydGVkKTsKCiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3IpKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7CiAgICB9CgogICAgaWYgKCEoQllURVNfUEVSX0VMRU1FTlQgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlKSkgewogICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpOwogICAgfQoKICAgIHNldFNwZWNpZXMoQ09OU1RSVUNUT1JfTkFNRSk7CiAgfTsKfSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwp2YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7CiAgdmFyIE8gPSB0b09iamVjdChzb3VyY2UpOwogIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7CiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkOwogIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pOwogIHZhciBpLCBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQ7CiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkgewogICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKE8pOwogICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7CiAgICBPID0gW107CiAgICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkgewogICAgICBPLnB1c2goc3RlcC52YWx1ZSk7CiAgICB9CiAgfQogIGlmIChtYXBwaW5nICYmIGFyZ3VtZW50c0xlbmd0aCA+IDIpIHsKICAgIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzWzJdLCAyKTsKICB9CiAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0aGlzKSkobGVuZ3RoKTsKICBmb3IgKGkgPSAwOyBsZW5ndGggPiBpOyBpKyspIHsKICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07CiAgfQogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi8KdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiKTsKdmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M7Cgp2YXIgQXJyYXlCdWZmZXIgPSBnbG9iYWwuQXJyYXlCdWZmZXI7CnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5OwoKbW9kdWxlLmV4cG9ydHMgPSAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIEludDhBcnJheSgxKTsKfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBuZXcgSW50OEFycmF5KC0xKTsKfSkgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsKICBuZXcgSW50OEFycmF5KCk7CiAgbmV3IEludDhBcnJheShudWxsKTsKICBuZXcgSW50OEFycmF5KDEuNSk7CiAgbmV3IEludDhBcnJheShpdGVyYWJsZSk7Cn0sIHRydWUpIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBTYWZhcmkgKDExKykgYnVnIC0gYSByZWFzb24gd2h5IGV2ZW4gU2FmYXJpIDEzIHNob3VsZCBsb2FkIGEgdHlwZWQgYXJyYXkgcG9seWZpbGwKICByZXR1cm4gbmV3IEludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoMiksIDEsIHVuZGVmaW5lZCkubGVuZ3RoICE9PSAxOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciBpZCA9IDA7CnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkgewogIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIE5BVElWRV9TWU1CT0wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgJiYgIVN5bWJvbC5zaGFtCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgJiYgdHlwZW9mIFN5bWJvbCgpID09ICdzeW1ib2wnOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXZlcnNpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXZlcnNpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgdXNlckFnZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VzZXItYWdlbnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanMiKTsKCnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7CnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9uczsKdmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7CnZhciBtYXRjaCwgdmVyc2lvbjsKCmlmICh2OCkgewogIG1hdGNoID0gdjguc3BsaXQoJy4nKTsKICB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTsKfSBlbHNlIGlmICh1c2VyQWdlbnQpIHsKICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVwvKFxkKykvKTsKICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7CiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pOwogICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gbWF0Y2hbMV07CiAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IHZlcnNpb24gJiYgK3ZlcnNpb247CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1Zy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8yODAKdmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2VyLWFnZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2VyLWFnZW50LmpzIik7CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11bnNhZmUtcmVnZXgKbW9kdWxlLmV4cG9ydHMgPSAvVmVyc2lvblwvMTBcLlxkKyhcLlxkKyk/KCBNb2JpbGVcL1x3Kyk/IFNhZmFyaVwvLy50ZXN0KHVzZXJBZ2VudCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIpOwp2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIik7CnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiKTsKCnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwp2YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKdmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogdWlkOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkgewogIGlmICghaGFzKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHsKICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07CiAgICBlbHNlIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTsKICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuCm1vZHVsZS5leHBvcnRzID0gJ1x1MDAwOVx1MDAwQVx1MDAwQlx1MDAwQ1x1MDAwRFx1MDAyMFx1MDBBMFx1MTY4MFx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOFx1MjAyOVx1RkVGRic7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcHBlZC13ZWxsLWtub3duLXN5bWJvbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcHBlZC13ZWxsLWtub3duLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKZXhwb3J0cy5mID0gd2VsbEtub3duU3ltYm9sOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBhcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyIpOwp2YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiKTsKCnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInOwp2YXIgQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlck1vZHVsZVtBUlJBWV9CVUZGRVJdOwp2YXIgTmF0aXZlQXJyYXlCdWZmZXIgPSBnbG9iYWxbQVJSQVlfQlVGRkVSXTsKCi8vIGBBcnJheUJ1ZmZlcmAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXItY29uc3RydWN0b3IKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBOYXRpdmVBcnJheUJ1ZmZlciAhPT0gQXJyYXlCdWZmZXIgfSwgewogIEFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcgp9KTsKCnNldFNwZWNpZXMoQVJSQVlfQlVGRkVSKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmlzLXZpZXcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5pcy12aWV3LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7Cgp2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IEFycmF5QnVmZmVyVmlld0NvcmUuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzsKCi8vIGBBcnJheUJ1ZmZlci5pc1ZpZXdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheWJ1ZmZlci5pc3ZpZXcKJCh7IHRhcmdldDogJ0FycmF5QnVmZmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCB7CiAgaXNWaWV3OiBBcnJheUJ1ZmZlclZpZXdDb3JlLmlzVmlldwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgQXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKCnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyOwp2YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldzsKdmFyIG5hdGl2ZUFycmF5QnVmZmVyU2xpY2UgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2U7Cgp2YXIgSU5DT1JSRUNUX1NMSUNFID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiAhbmV3IEFycmF5QnVmZmVyKDIpLnNsaWNlKDEsIHVuZGVmaW5lZCkuYnl0ZUxlbmd0aDsKfSk7CgovLyBgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXIucHJvdG90eXBlLnNsaWNlCiQoeyB0YXJnZXQ6ICdBcnJheUJ1ZmZlcicsIHByb3RvOiB0cnVlLCB1bnNhZmU6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX1NMSUNFIH0sIHsKICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkgewogICAgaWYgKG5hdGl2ZUFycmF5QnVmZmVyU2xpY2UgIT09IHVuZGVmaW5lZCAmJiBlbmQgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gbmF0aXZlQXJyYXlCdWZmZXJTbGljZS5jYWxsKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeAogICAgfQogICAgdmFyIGxlbmd0aCA9IGFuT2JqZWN0KHRoaXMpLmJ5dGVMZW5ndGg7CiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7CiAgICB2YXIgZmluID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kLCBsZW5ndGgpOwogICAgdmFyIHJlc3VsdCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluIC0gZmlyc3QpKTsKICAgIHZhciB2aWV3U291cmNlID0gbmV3IERhdGFWaWV3KHRoaXMpOwogICAgdmFyIHZpZXdUYXJnZXQgPSBuZXcgRGF0YVZpZXcocmVzdWx0KTsKICAgIHZhciBpbmRleCA9IDA7CiAgICB3aGlsZSAoZmlyc3QgPCBmaW4pIHsKICAgICAgdmlld1RhcmdldC5zZXRVaW50OChpbmRleCsrLCB2aWV3U291cmNlLmdldFVpbnQ4KGZpcnN0KyspKTsKICAgIH0gcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKdmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0LmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBWOF9WRVJTSU9OID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Y4LXZlcnNpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXZlcnNpb24uanMiKTsKCnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7CnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsKdmFyIE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnOwoKLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzCi8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzkKdmFyIElTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgPSBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIGFycmF5ID0gW107CiAgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7CiAgcmV0dXJuIGFycmF5LmNvbmNhdCgpWzBdICE9PSBhcnJheTsKfSk7Cgp2YXIgU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnY29uY2F0Jyk7Cgp2YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHsKICBpZiAoIWlzT2JqZWN0KE8pKSByZXR1cm4gZmFsc2U7CiAgdmFyIHNwcmVhZGFibGUgPSBPW0lTX0NPTkNBVF9TUFJFQURBQkxFXTsKICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTsKfTsKCnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUOwoKLy8gYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0Ci8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBpc0NvbmNhdFNwcmVhZGFibGUgYW5kIEBAc3BlY2llcwokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KGFyZykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpOwogICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7CiAgICB2YXIgbiA9IDA7CiAgICB2YXIgaSwgaywgbGVuZ3RoLCBsZW4sIEU7CiAgICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07CiAgICAgIGlmIChpc0NvbmNhdFNwcmVhZGFibGUoRSkpIHsKICAgICAgICBsZW4gPSB0b0xlbmd0aChFLmxlbmd0aCk7CiAgICAgICAgaWYgKG4gKyBsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyssIG4rKykgaWYgKGsgaW4gRSkgY3JlYXRlUHJvcGVydHkoQSwgbiwgRVtrXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG4gPj0gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7CiAgICAgICAgY3JlYXRlUHJvcGVydHkoQSwgbisrLCBFKTsKICAgICAgfQogICAgfQogICAgQS5sZW5ndGggPSBuOwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29weS13aXRoaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvcHktd2l0aGluLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY29weVdpdGhpbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1jb3B5LXdpdGhpbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktY29weS13aXRoaW4uanMiKTsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5jb3B5d2l0aGluCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHsKICBjb3B5V2l0aGluOiBjb3B5V2l0aGluCn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcygnY29weVdpdGhpbicpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZXZlcnkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkZXZlcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5ldmVyeTsKdmFyIHNsb3BweUFycmF5TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnkKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogc2xvcHB5QXJyYXlNZXRob2QoJ2V2ZXJ5JykgfSwgewogIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmaWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWZpbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanMiKTsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWxsCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHsKICBmaWxsOiBmaWxsCn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcygnZmlsbCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGZpbHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbHRlcjsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiKTsKCnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnZmlsdGVyJyk7Ci8vIEVkZ2UgMTQtIGlzc3VlCnZhciBVU0VTX1RPX0xFTkdUSCA9IEhBU19TUEVDSUVTX1NVUFBPUlQgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBbXS5maWx0ZXIuY2FsbCh7IGxlbmd0aDogLTEsIDA6IDEgfSwgZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9KTsKfSk7CgovLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXIKLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHsKICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGZpbmRJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbmRJbmRleDsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCnZhciBGSU5EX0lOREVYID0gJ2ZpbmRJbmRleCc7CnZhciBTS0lQU19IT0xFUyA9IHRydWU7CgovLyBTaG91bGRuJ3Qgc2tpcCBob2xlcwppZiAoRklORF9JTkRFWCBpbiBbXSkgQXJyYXkoMSlbRklORF9JTkRFWF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRpbmRleAokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7CiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHsKICAgIHJldHVybiAkZmluZEluZGV4KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcyhGSU5EX0lOREVYKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkZmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbmQ7CnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7Cgp2YXIgRklORCA9ICdmaW5kJzsKdmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTsKCi8vIFNob3VsZG4ndCBza2lwIGhvbGVzCmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pOwoKLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmQKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwgewogIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHsKICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzCmFkZFRvVW5zY29wYWJsZXMoRklORCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mbGF0LW1hcC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmxhdE1hcGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWZsYXRNYXAKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwgewogIGZsYXRNYXA6IGZ1bmN0aW9uIGZsYXRNYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogICAgdmFyIEE7CiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7CiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApOwogICAgQS5sZW5ndGggPSBmbGF0dGVuSW50b0FycmF5KEEsIE8sIE8sIHNvdXJjZUxlbiwgMCwgMSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmxhdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mbGF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmbGF0dGVuSW50b0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZsYXR0ZW4taW50by1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1mbGF0TWFwCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHsKICBmbGF0OiBmdW5jdGlvbiBmbGF0KC8qIGRlcHRoQXJnID0gMSAqLykgewogICAgdmFyIGRlcHRoQXJnID0gYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZDsKICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7CiAgICBBLmxlbmd0aCA9IGZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgTywgc291cmNlTGVuLCAwLCBkZXB0aEFyZyA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aEFyZykpOwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mb3ItZWFjaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2guanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFtdLmZvckVhY2ggIT0gZm9yRWFjaCB9LCB7CiAgZm9yRWFjaDogZm9yRWFjaAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20uanMiKTsKdmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIpOwoKdmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgewogIEFycmF5LmZyb20oaXRlcmFibGUpOwp9KTsKCi8vIGBBcnJheS5mcm9tYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbQokKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwgewogIGZyb206IGZyb20KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRpbmNsdWRlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiKS5pbmNsdWRlczsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwgewogIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHsKICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcygnaW5jbHVkZXMnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIikuaW5kZXhPZjsKdmFyIHNsb3BweUFycmF5TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QuanMiKTsKCnZhciBuYXRpdmVJbmRleE9mID0gW10uaW5kZXhPZjsKCnZhciBORUdBVElWRV9aRVJPID0gISFuYXRpdmVJbmRleE9mICYmIDEgLyBbMV0uaW5kZXhPZigxLCAtMCkgPCAwOwp2YXIgU0xPUFBZX01FVEhPRCA9IHNsb3BweUFycmF5TWV0aG9kKCdpbmRleE9mJyk7CgovLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZgokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBORUdBVElWRV9aRVJPIHx8IFNMT1BQWV9NRVRIT0QgfSwgewogIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHsKICAgIHJldHVybiBORUdBVElWRV9aRVJPCiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzAKICAgICAgPyBuYXRpdmVJbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMAogICAgICA6ICRpbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwoKLy8gYEFycmF5LmlzQXJyYXlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5pc2FycmF5CiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUgfSwgewogIGlzQXJyYXk6IGlzQXJyYXkKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7CnZhciBkZWZpbmVJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvci5qcyIpOwoKdmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7CgovLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllcwovLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5cwovLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXMKLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yCi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvcgptb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLAogICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXQKICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleAogICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kCiAgfSk7Ci8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0Cn0sIGZ1bmN0aW9uICgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7CiAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOwogIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7CiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkgewogICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkOwogICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogIH0KICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBpbmRleCwgZG9uZTogZmFsc2UgfTsKICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07CiAgcmV0dXJuIHsgdmFsdWU6IFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGRvbmU6IGZhbHNlIH07Cn0sICd2YWx1ZXMnKTsKCi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJQovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3QKSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTsKCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzCmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTsKYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7CmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5qb2luLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgc2xvcHB5QXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyIpOwoKdmFyIG5hdGl2ZUpvaW4gPSBbXS5qb2luOwoKdmFyIEVTM19TVFJJTkdTID0gSW5kZXhlZE9iamVjdCAhPSBPYmplY3Q7CnZhciBTTE9QUFlfTUVUSE9EID0gc2xvcHB5QXJyYXlNZXRob2QoJ2pvaW4nLCAnLCcpOwoKLy8gYEFycmF5LnByb3RvdHlwZS5qb2luYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmpvaW4KJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRVMzX1NUUklOR1MgfHwgU0xPUFBZX01FVEhPRCB9LCB7CiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHsKICAgIHJldHVybiBuYXRpdmVKb2luLmNhbGwodG9JbmRleGVkT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubGFzdC1pbmRleC1vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5sYXN0LWluZGV4LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBsYXN0SW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmxhc3RpbmRleG9mCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGxhc3RJbmRleE9mICE9PSBbXS5sYXN0SW5kZXhPZiB9LCB7CiAgbGFzdEluZGV4T2Y6IGxhc3RJbmRleE9mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJG1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLm1hcDsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiKTsKCnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnbWFwJyk7Ci8vIEZGNDktIGlzc3VlCnZhciBVU0VTX1RPX0xFTkdUSCA9IEhBU19TUEVDSUVTX1NVUFBPUlQgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBbXS5tYXAuY2FsbCh7IGxlbmd0aDogLTEsIDA6IDEgfSwgZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9KTsKfSk7CgovLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXAKLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHsKICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRtYXAodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiKTsKCnZhciBJU05UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfQogIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTsKfSk7CgovLyBgQXJyYXkub2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5vZgovLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpYwokKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTTlRfR0VORVJJQyB9LCB7CiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pIHsKICAgIHZhciBpbmRleCA9IDA7CiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHZhciByZXN1bHQgPSBuZXcgKHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXkpKGFyZ3VtZW50c0xlbmd0aCk7CiAgICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIGFyZ3VtZW50c1tpbmRleCsrXSk7CiAgICByZXN1bHQubGVuZ3RoID0gYXJndW1lbnRzTGVuZ3RoOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UtcmlnaHQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UtcmlnaHQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJHJlZHVjZVJpZ2h0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktcmVkdWNlLmpzIikucmlnaHQ7CnZhciBzbG9wcHlBcnJheU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZXJpZ2h0CiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IHNsb3BweUFycmF5TWV0aG9kKCdyZWR1Y2VSaWdodCcpIH0sIHsKICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgcmV0dXJuICRyZWR1Y2VSaWdodCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRyZWR1Y2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktcmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1yZWR1Y2UuanMiKS5sZWZ0Owp2YXIgc2xvcHB5QXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyIpOwoKLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IHNsb3BweUFycmF5TWV0aG9kKCdyZWR1Y2UnKSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJldmVyc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmV2ZXJzZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiKTsKCnZhciBuYXRpdmVSZXZlcnNlID0gW10ucmV2ZXJzZTsKdmFyIHRlc3QgPSBbMSwgMl07CgovLyBgQXJyYXkucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmV2ZXJzZQovLyBmaXggZm9yIFNhZmFyaSAxMi4wIGJ1ZwovLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg4Nzk0CiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFN0cmluZyh0ZXN0KSA9PT0gU3RyaW5nKHRlc3QucmV2ZXJzZSgpKSB9LCB7CiAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHsKICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnbgogICAgaWYgKGlzQXJyYXkodGhpcykpIHRoaXMubGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICByZXR1cm4gbmF0aXZlUmV2ZXJzZS5jYWxsKHRoaXMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgdG9BYnNvbHV0ZUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIik7CnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKdmFyIG5hdGl2ZVNsaWNlID0gW10uc2xpY2U7CnZhciBtYXggPSBNYXRoLm1heDsKCi8vIGBBcnJheS5wcm90b3R5cGUuc2xpY2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc2xpY2UKLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0cwokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc2xpY2UnKSB9LCB7CiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHsKICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KHRoaXMpOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHZhciBrID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW5ndGgpOwogICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTsKICAgIC8vIGlubGluZSBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBmb3IgdXNhZ2UgbmF0aXZlIGBBcnJheSNzbGljZWAgd2hlcmUgaXQncyBwb3NzaWJsZQogICAgdmFyIENvbnN0cnVjdG9yLCByZXN1bHQsIG47CiAgICBpZiAoaXNBcnJheShPKSkgewogICAgICBDb25zdHJ1Y3RvciA9IE8uY29uc3RydWN0b3I7CiAgICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrCiAgICAgIGlmICh0eXBlb2YgQ29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAoQ29uc3RydWN0b3IgPT09IEFycmF5IHx8IGlzQXJyYXkoQ29uc3RydWN0b3IucHJvdG90eXBlKSkpIHsKICAgICAgICBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDsKICAgICAgfSBlbHNlIGlmIChpc09iamVjdChDb25zdHJ1Y3RvcikpIHsKICAgICAgICBDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yW1NQRUNJRVNdOwogICAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gbnVsbCkgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgaWYgKENvbnN0cnVjdG9yID09PSBBcnJheSB8fCBDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG5hdGl2ZVNsaWNlLmNhbGwoTywgaywgZmluKTsKICAgICAgfQogICAgfQogICAgcmVzdWx0ID0gbmV3IChDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDb25zdHJ1Y3RvcikobWF4KGZpbiAtIGssIDApKTsKICAgIGZvciAobiA9IDA7IGsgPCBmaW47IGsrKywgbisrKSBpZiAoayBpbiBPKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIG4sIE9ba10pOwogICAgcmVzdWx0Lmxlbmd0aCA9IG47CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvbWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29tZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJHNvbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5zb21lOwp2YXIgc2xvcHB5QXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyIpOwoKLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWUKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogc2xvcHB5QXJyYXlNZXRob2QoJ3NvbWUnKSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBzbG9wcHlBcnJheU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kLmpzIik7Cgp2YXIgdGVzdCA9IFtdOwp2YXIgbmF0aXZlU29ydCA9IHRlc3Quc29ydDsKCi8vIElFOC0KdmFyIEZBSUxTX09OX1VOREVGSU5FRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICB0ZXN0LnNvcnQodW5kZWZpbmVkKTsKfSk7Ci8vIFY4IGJ1Zwp2YXIgRkFJTFNfT05fTlVMTCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICB0ZXN0LnNvcnQobnVsbCk7Cn0pOwovLyBPbGQgV2ViS2l0CnZhciBTTE9QUFlfTUVUSE9EID0gc2xvcHB5QXJyYXlNZXRob2QoJ3NvcnQnKTsKCnZhciBGT1JDRUQgPSBGQUlMU19PTl9VTkRFRklORUQgfHwgIUZBSUxTX09OX05VTEwgfHwgU0xPUFBZX01FVEhPRDsKCi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb3J0CiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHsKICAgIHJldHVybiBjb21wYXJlZm4gPT09IHVuZGVmaW5lZAogICAgICA/IG5hdGl2ZVNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSkKICAgICAgOiBuYXRpdmVTb3J0LmNhbGwodG9PYmplY3QodGhpcyksIGFGdW5jdGlvbihjb21wYXJlZm4pKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGVjaWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwZWNpZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIik7CgovLyBgQXJyYXlbQEBzcGVjaWVzXWAgZ2V0dGVyCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1hcnJheS1AQHNwZWNpZXMKc2V0U3BlY2llcygnQXJyYXknKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMiKTsKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIik7CnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIpOwoKdmFyIG1heCA9IE1hdGgubWF4Owp2YXIgbWluID0gTWF0aC5taW47CnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsKdmFyIE1BWElNVU1fQUxMT1dFRF9MRU5HVEhfRVhDRUVERUQgPSAnTWF4aW11bSBhbGxvd2VkIGxlbmd0aCBleGNlZWRlZCc7CgovLyBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zcGxpY2UKLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIWFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ3NwbGljZScpIH0sIHsKICBzcGxpY2U6IGZ1bmN0aW9uIHNwbGljZShzdGFydCwgZGVsZXRlQ291bnQgLyogLCAuLi5pdGVtcyAqLykgewogICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTsKICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgICB2YXIgYWN0dWFsU3RhcnQgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7CiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHZhciBpbnNlcnRDb3VudCwgYWN0dWFsRGVsZXRlQ291bnQsIEEsIGssIGZyb20sIHRvOwogICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA9PT0gMCkgewogICAgICBpbnNlcnRDb3VudCA9IGFjdHVhbERlbGV0ZUNvdW50ID0gMDsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAxKSB7CiAgICAgIGluc2VydENvdW50ID0gMDsKICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBsZW4gLSBhY3R1YWxTdGFydDsKICAgIH0gZWxzZSB7CiAgICAgIGluc2VydENvdW50ID0gYXJndW1lbnRzTGVuZ3RoIC0gMjsKICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBtaW4obWF4KHRvSW50ZWdlcihkZWxldGVDb3VudCksIDApLCBsZW4gLSBhY3R1YWxTdGFydCk7CiAgICB9CiAgICBpZiAobGVuICsgaW5zZXJ0Q291bnQgLSBhY3R1YWxEZWxldGVDb3VudCA+IE1BWF9TQUZFX0lOVEVHRVIpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9MRU5HVEhfRVhDRUVERUQpOwogICAgfQogICAgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCBhY3R1YWxEZWxldGVDb3VudCk7CiAgICBmb3IgKGsgPSAwOyBrIDwgYWN0dWFsRGVsZXRlQ291bnQ7IGsrKykgewogICAgICBmcm9tID0gYWN0dWFsU3RhcnQgKyBrOwogICAgICBpZiAoZnJvbSBpbiBPKSBjcmVhdGVQcm9wZXJ0eShBLCBrLCBPW2Zyb21dKTsKICAgIH0KICAgIEEubGVuZ3RoID0gYWN0dWFsRGVsZXRlQ291bnQ7CiAgICBpZiAoaW5zZXJ0Q291bnQgPCBhY3R1YWxEZWxldGVDb3VudCkgewogICAgICBmb3IgKGsgPSBhY3R1YWxTdGFydDsgayA8IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50OyBrKyspIHsKICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50OwogICAgICAgIHRvID0gayArIGluc2VydENvdW50OwogICAgICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTsKICAgICAgICBlbHNlIGRlbGV0ZSBPW3RvXTsKICAgICAgfQogICAgICBmb3IgKGsgPSBsZW47IGsgPiBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50OyBrLS0pIGRlbGV0ZSBPW2sgLSAxXTsKICAgIH0gZWxzZSBpZiAoaW5zZXJ0Q291bnQgPiBhY3R1YWxEZWxldGVDb3VudCkgewogICAgICBmb3IgKGsgPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudDsgayA+IGFjdHVhbFN0YXJ0OyBrLS0pIHsKICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50IC0gMTsKICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudCAtIDE7CiAgICAgICAgaWYgKGZyb20gaW4gTykgT1t0b10gPSBPW2Zyb21dOwogICAgICAgIGVsc2UgZGVsZXRlIE9bdG9dOwogICAgICB9CiAgICB9CiAgICBmb3IgKGsgPSAwOyBrIDwgaW5zZXJ0Q291bnQ7IGsrKykgewogICAgICBPW2sgKyBhY3R1YWxTdGFydF0gPSBhcmd1bWVudHNbayArIDJdOwogICAgfQogICAgTy5sZW5ndGggPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50OwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC1tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQtbWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyB0aGlzIG1ldGhvZCB3YXMgYWRkZWQgdG8gdW5zY29wYWJsZXMgYWZ0ZXIgaW1wbGVtZW50YXRpb24KLy8gaW4gcG9wdWxhciBlbmdpbmVzLCBzbyBpdCdzIG1vdmVkIHRvIGEgc2VwYXJhdGUgbW9kdWxlCnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CgphZGRUb1Vuc2NvcGFibGVzKCdmbGF0TWFwJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyB0aGlzIG1ldGhvZCB3YXMgYWRkZWQgdG8gdW5zY29wYWJsZXMgYWZ0ZXIgaW1wbGVtZW50YXRpb24KLy8gaW4gcG9wdWxhciBlbmdpbmVzLCBzbyBpdCdzIG1vdmVkIHRvIGEgc2VwYXJhdGUgbW9kdWxlCnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CgphZGRUb1Vuc2NvcGFibGVzKCdmbGF0Jyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGEtdmlldy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGEtdmlldy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyIpOwp2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIikuTkFUSVZFX0FSUkFZX0JVRkZFUjsKCi8vIGBEYXRhVmlld2AgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0YXZpZXctY29uc3RydWN0b3IKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUiB9LCB7CiAgRGF0YVZpZXc6IEFycmF5QnVmZmVyTW9kdWxlLkRhdGFWaWV3Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLm5vdy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS5ub3cuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgRGF0ZS5ub3dgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRlLm5vdwokKHsgdGFyZ2V0OiAnRGF0ZScsIHN0YXQ6IHRydWUgfSwgewogIG5vdzogZnVuY3Rpb24gbm93KCkgewogICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8taXNvLXN0cmluZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8taXNvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciB0b0lTT1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kYXRlLXRvLWlzby1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZy5qcyIpOwoKLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9pc29zdHJpbmcKLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zCiQoeyB0YXJnZXQ6ICdEYXRlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgIT09IHRvSVNPU3RyaW5nIH0sIHsKICB0b0lTT1N0cmluZzogdG9JU09TdHJpbmcKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tanNvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tanNvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwoKdmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbAogICAgfHwgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoeyB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSB9KSAhPT0gMTsKfSk7CgovLyBgRGF0ZS5wcm90b3R5cGUudG9KU09OYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9qc29uCiQoeyB0YXJnZXQ6ICdEYXRlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsKICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICB2YXIgcHYgPSB0b1ByaW1pdGl2ZShPKTsKICAgIHJldHVybiB0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOiBPLnRvSVNPU3RyaW5nKCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS50by1wcmltaXRpdmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tcHJpbWl0aXZlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciBkYXRlVG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGF0ZS10by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8tcHJpbWl0aXZlLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpOwp2YXIgRGF0ZVByb3RvdHlwZSA9IERhdGUucHJvdG90eXBlOwoKLy8gYERhdGUucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZQppZiAoIShUT19QUklNSVRJVkUgaW4gRGF0ZVByb3RvdHlwZSkpIHsKICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoRGF0ZVByb3RvdHlwZSwgVE9fUFJJTUlUSVZFLCBkYXRlVG9QcmltaXRpdmUpOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwoKdmFyIERhdGVQcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsKdmFyIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnOwp2YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJzsKdmFyIG5hdGl2ZURhdGVUb1N0cmluZyA9IERhdGVQcm90b3R5cGVbVE9fU1RSSU5HXTsKdmFyIGdldFRpbWUgPSBEYXRlUHJvdG90eXBlLmdldFRpbWU7CgovLyBgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b3N0cmluZwppZiAobmV3IERhdGUoTmFOKSArICcnICE9IElOVkFMSURfREFURSkgewogIHJlZGVmaW5lKERhdGVQcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gbmF0aXZlRGF0ZVRvU3RyaW5nLmNhbGwodGhpcykgOiBJTlZBTElEX0RBVEU7CiAgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24uYmluZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMiKTsKCi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kCiQoeyB0YXJnZXQ6ICdGdW5jdGlvbicsIHByb3RvOiB0cnVlIH0sIHsKICBiaW5kOiBiaW5kCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIEhBU19JTlNUQU5DRSA9IHdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTsKdmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlOwoKLy8gYEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS1AQGhhc2luc3RhbmNlCmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvdHlwZSkpIHsKICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEZ1bmN0aW9uUHJvdG90eXBlLCBIQVNfSU5TVEFOQ0UsIHsgdmFsdWU6IGZ1bmN0aW9uIChPKSB7CiAgICBpZiAodHlwZW9mIHRoaXMgIT0gJ2Z1bmN0aW9uJyB8fCAhaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTsKICAgIGlmICghaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKSByZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7CiAgICAvLyBmb3IgZW52aXJvbm1lbnQgdy9vIG5hdGl2ZSBgQEBoYXNJbnN0YW5jZWAgbG9naWMgZW5vdWdoIGBpbnN0YW5jZW9mYCwgYnV0IGFkZCB0aGlzOgogICAgd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSkgaWYgKHRoaXMucHJvdG90eXBlID09PSBPKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9IH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKCnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTsKdmFyIEZ1bmN0aW9uUHJvdG90eXBlVG9TdHJpbmcgPSBGdW5jdGlvblByb3RvdHlwZS50b1N0cmluZzsKdmFyIG5hbWVSRSA9IC9eXHMqZnVuY3Rpb24gKFteIChdKikvOwp2YXIgTkFNRSA9ICduYW1lJzsKCi8vIEZ1bmN0aW9uIGluc3RhbmNlcyBgLm5hbWVgIHByb3BlcnR5Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLWluc3RhbmNlcy1uYW1lCmlmIChERVNDUklQVE9SUyAmJiAhKE5BTUUgaW4gRnVuY3Rpb25Qcm90b3R5cGUpKSB7CiAgZGVmaW5lUHJvcGVydHkoRnVuY3Rpb25Qcm90b3R5cGUsIE5BTUUsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBGdW5jdGlvblByb3RvdHlwZVRvU3RyaW5nLmNhbGwodGhpcykubWF0Y2gobmFtZVJFKVsxXTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gJyc7CiAgICAgIH0KICAgIH0KICB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZ2xvYmFsLXRoaXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKCi8vIGBnbG9iYWxUaGlzYCBvYmplY3QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsCiQoeyBnbG9iYWw6IHRydWUgfSwgewogIGdsb2JhbFRoaXM6IGdsb2JhbAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgp2YXIgJHN0cmluZ2lmeSA9IGdldEJ1aWx0SW4oJ0pTT04nLCAnc3RyaW5naWZ5Jyk7CnZhciByZSA9IC9bXHVEODAwLVx1REZGRl0vZzsKdmFyIGxvdyA9IC9eW1x1RDgwMC1cdURCRkZdJC87CnZhciBoaSA9IC9eW1x1REMwMC1cdURGRkZdJC87Cgp2YXIgZml4ID0gZnVuY3Rpb24gKG1hdGNoLCBvZmZzZXQsIHN0cmluZykgewogIHZhciBwcmV2ID0gc3RyaW5nLmNoYXJBdChvZmZzZXQgLSAxKTsKICB2YXIgbmV4dCA9IHN0cmluZy5jaGFyQXQob2Zmc2V0ICsgMSk7CiAgaWYgKChsb3cudGVzdChtYXRjaCkgJiYgIWhpLnRlc3QobmV4dCkpIHx8IChoaS50ZXN0KG1hdGNoKSAmJiAhbG93LnRlc3QocHJldikpKSB7CiAgICByZXR1cm4gJ1xcdScgKyBtYXRjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTsKICB9IHJldHVybiBtYXRjaDsKfTsKCnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuICRzdHJpbmdpZnkoJ1x1REYwNlx1RDgzNCcpICE9PSAnIlxcdWRmMDZcXHVkODM0IicKICAgIHx8ICRzdHJpbmdpZnkoJ1x1REVBRCcpICE9PSAnIlxcdWRlYWQiJzsKfSk7CgppZiAoJHN0cmluZ2lmeSkgewogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXdlbGwtZm9ybWVkLXN0cmluZ2lmeQogICQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCwgcmVwbGFjZXIsIHNwYWNlKSB7CiAgICAgIHZhciByZXN1bHQgPSAkc3RyaW5naWZ5LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB0eXBlb2YgcmVzdWx0ID09ICdzdHJpbmcnID8gcmVzdWx0LnJlcGxhY2UocmUsIGZpeCkgOiByZXN1bHQ7CiAgICB9CiAgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CgovLyBKU09OW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24tQEB0b3N0cmluZ3RhZwpzZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBjb2xsZWN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiKTsKdmFyIGNvbGxlY3Rpb25TdHJvbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIik7CgovLyBgTWFwYCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0cwptb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07Cn0sIGNvbGxlY3Rpb25TdHJvbmcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmFjb3NoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYWNvc2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGxvZzFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtbG9nMXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtbG9nMXAuanMiKTsKCnZhciBuYXRpdmVBY29zaCA9IE1hdGguYWNvc2g7CnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CnZhciBMTjIgPSBNYXRoLkxOMjsKCnZhciBGT1JDRUQgPSAhbmF0aXZlQWNvc2gKICAvLyBWOCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNTA5CiAgfHwgTWF0aC5mbG9vcihuYXRpdmVBY29zaChOdW1iZXIuTUFYX1ZBTFVFKSkgIT0gNzEwCiAgLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFjb3NoKEluZmluaXR5KSAtPiBOYU4KICB8fCBuYXRpdmVBY29zaChJbmZpbml0eSkgIT0gSW5maW5pdHk7CgovLyBgTWF0aC5hY29zaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguYWNvc2gKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHsKICAgIHJldHVybiAoeCA9ICt4KSA8IDEgPyBOYU4gOiB4ID4gOTQ5MDYyNjUuNjI0MjUxNTYKICAgICAgPyBsb2coeCkgKyBMTjIKICAgICAgOiBsb2cxcCh4IC0gMSArIHNxcnQoeCAtIDEpICogc3FydCh4ICsgMSkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYXNpbmguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5hc2luaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIG5hdGl2ZUFzaW5oID0gTWF0aC5hc2luaDsKdmFyIGxvZyA9IE1hdGgubG9nOwp2YXIgc3FydCA9IE1hdGguc3FydDsKCmZ1bmN0aW9uIGFzaW5oKHgpIHsKICByZXR1cm4gIWlzRmluaXRlKHggPSAreCkgfHwgeCA9PSAwID8geCA6IHggPCAwID8gLWFzaW5oKC14KSA6IGxvZyh4ICsgc3FydCh4ICogeCArIDEpKTsKfQoKLy8gYE1hdGguYXNpbmhgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmFzaW5oCi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hc2luaCgwKSAtPiAtMAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIShuYXRpdmVBc2luaCAmJiAxIC8gbmF0aXZlQXNpbmgoMCkgPiAwKSB9LCB7CiAgYXNpbmg6IGFzaW5oCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmF0YW5oLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYXRhbmguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCnZhciBuYXRpdmVBdGFuaCA9IE1hdGguYXRhbmg7CnZhciBsb2cgPSBNYXRoLmxvZzsKCi8vIGBNYXRoLmF0YW5oYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5hdGFuaAovLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXRhbmgoLTApIC0+IDAKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICEobmF0aXZlQXRhbmggJiYgMSAvIG5hdGl2ZUF0YW5oKC0wKSA8IDApIH0sIHsKICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCkgewogICAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogbG9nKCgxICsgeCkgLyAoMSAtIHgpKSAvIDI7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jYnJ0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jYnJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHNpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1zaWduICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXNpZ24uanMiKTsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIHBvdyA9IE1hdGgucG93OwoKLy8gYE1hdGguY2JydGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguY2JydAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkgewogICAgcmV0dXJuIHNpZ24oeCA9ICt4KSAqIHBvdyhhYnMoeCksIDEgLyAzKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmNsejMyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguY2x6MzIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCnZhciBmbG9vciA9IE1hdGguZmxvb3I7CnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIExPRzJFID0gTWF0aC5MT0cyRTsKCi8vIGBNYXRoLmNsejMyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5jbHozMgokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KSB7CiAgICByZXR1cm4gKHggPj4+PSAwKSA/IDMxIC0gZmxvb3IobG9nKHggKyAwLjUpICogTE9HMkUpIDogMzI7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jb3NoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jb3NoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGV4cG0xID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtZXhwbTEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMiKTsKCnZhciBuYXRpdmVDb3NoID0gTWF0aC5jb3NoOwp2YXIgYWJzID0gTWF0aC5hYnM7CnZhciBFID0gTWF0aC5FOwoKLy8gYE1hdGguY29zaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguY29zaAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIW5hdGl2ZUNvc2ggfHwgbmF0aXZlQ29zaCg3MTApID09PSBJbmZpbml0eSB9LCB7CiAgY29zaDogZnVuY3Rpb24gY29zaCh4KSB7CiAgICB2YXIgdCA9IGV4cG0xKGFicyh4KSAtIDEpICsgMTsKICAgIHJldHVybiAodCArIDEgLyAodCAqIEUgKiBFKSkgKiAoRSAvIDIpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguZXhwbTEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5leHBtMS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZXhwbTEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1leHBtMSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1leHBtMS5qcyIpOwoKLy8gYE1hdGguZXhwbTFgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmV4cG0xCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBleHBtMSAhPSBNYXRoLmV4cG0xIH0sIHsgZXhwbTE6IGV4cG0xIH0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmZyb3VuZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5mcm91bmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm91bmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1mcm91bmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZnJvdW5kLmpzIik7CgovLyBgTWF0aC5mcm91bmRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmZyb3VuZAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgeyBmcm91bmQ6IGZyb3VuZCB9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgJGh5cG90ID0gTWF0aC5oeXBvdDsKdmFyIGFicyA9IE1hdGguYWJzOwp2YXIgc3FydCA9IE1hdGguc3FydDsKCi8vIENocm9tZSA3NyBidWcKLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTU0Ngp2YXIgQlVHR1kgPSAhISRoeXBvdCAmJiAkaHlwb3QoSW5maW5pdHksIE5hTikgIT09IEluZmluaXR5OwoKLy8gYE1hdGguaHlwb3RgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90CiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBCVUdHWSB9LCB7CiAgaHlwb3Q6IGZ1bmN0aW9uIGh5cG90KHZhbHVlMSwgdmFsdWUyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHZhciBzdW0gPSAwOwogICAgdmFyIGkgPSAwOwogICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgdmFyIGxhcmcgPSAwOwogICAgdmFyIGFyZywgZGl2OwogICAgd2hpbGUgKGkgPCBhTGVuKSB7CiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7CiAgICAgIGlmIChsYXJnIDwgYXJnKSB7CiAgICAgICAgZGl2ID0gbGFyZyAvIGFyZzsKICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxOwogICAgICAgIGxhcmcgPSBhcmc7CiAgICAgIH0gZWxzZSBpZiAoYXJnID4gMCkgewogICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7CiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjsKICAgICAgfSBlbHNlIHN1bSArPSBhcmc7CiAgICB9CiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBzcXJ0KHN1bSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5pbXVsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5pbXVsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIG5hdGl2ZUltdWwgPSBNYXRoLmltdWw7Cgp2YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiBuYXRpdmVJbXVsKDB4RkZGRkZGRkYsIDUpICE9IC01IHx8IG5hdGl2ZUltdWwubGVuZ3RoICE9IDI7Cn0pOwoKLy8gYE1hdGguaW11bGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguaW11bAovLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eQokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHsKICAgIHZhciBVSU5UMTYgPSAweEZGRkY7CiAgICB2YXIgeG4gPSAreDsKICAgIHZhciB5biA9ICt5OwogICAgdmFyIHhsID0gVUlOVDE2ICYgeG47CiAgICB2YXIgeWwgPSBVSU5UMTYgJiB5bjsKICAgIHJldHVybiAwIHwgeGwgKiB5bCArICgoVUlOVDE2ICYgeG4gPj4+IDE2KSAqIHlsICsgeGwgKiAoVUlOVDE2ICYgeW4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cxMC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmxvZzEwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgbG9nID0gTWF0aC5sb2c7CnZhciBMT0cxMEUgPSBNYXRoLkxPRzEwRTsKCi8vIGBNYXRoLmxvZzEwYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5sb2cxMAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGxvZzEwOiBmdW5jdGlvbiBsb2cxMCh4KSB7CiAgICByZXR1cm4gbG9nKHgpICogTE9HMTBFOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgubG9nMXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cxcC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgbG9nMXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1sb2cxcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1sb2cxcC5qcyIpOwoKLy8gYE1hdGgubG9nMXBgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmxvZzFwCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7IGxvZzFwOiBsb2cxcCB9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIExOMiA9IE1hdGguTE4yOwoKLy8gYE1hdGgubG9nMmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgubG9nMgokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCkgewogICAgcmV0dXJuIGxvZyh4KSAvIExOMjsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpZ24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpZ24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYXRoLXNpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtc2lnbi5qcyIpOwoKLy8gYE1hdGguc2lnbmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguc2lnbgokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIHNpZ246IHNpZ24KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguc2luaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguc2luaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGV4cG0xID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtZXhwbTEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMiKTsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIGV4cCA9IE1hdGguZXhwOwp2YXIgRSA9IE1hdGguRTsKCnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIE1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNzsKfSk7CgovLyBgTWF0aC5zaW5oYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5zaW5oCi8vIFY4IG5lYXIgQ2hyb21pdW0gMzggaGFzIGEgcHJvYmxlbSB3aXRoIHZlcnkgc21hbGwgbnVtYmVycwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICBzaW5oOiBmdW5jdGlvbiBzaW5oKHgpIHsKICAgIHJldHVybiBhYnMoeCA9ICt4KSA8IDEgPyAoZXhwbTEoeCkgLSBleHBtMSgteCkpIC8gMiA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKEUgLyAyKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRhbmguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRhbmguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZXhwbTEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1leHBtMSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1leHBtMS5qcyIpOwoKdmFyIGV4cCA9IE1hdGguZXhwOwoKLy8gYE1hdGgudGFuaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgudGFuaAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIHRhbmg6IGZ1bmN0aW9uIHRhbmgoeCkgewogICAgdmFyIGEgPSBleHBtMSh4ID0gK3gpOwogICAgdmFyIGIgPSBleHBtMSgteCk7CiAgICByZXR1cm4gYSA9PSBJbmZpbml0eSA/IDEgOiBiID09IEluZmluaXR5ID8gLTEgOiAoYSAtIGIpIC8gKGV4cCh4KSArIGV4cCgteCkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKCi8vIE1hdGhbQEB0b1N0cmluZ1RhZ10gcHJvcGVydHkKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC1AQHRvc3RyaW5ndGFnCnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudHJ1bmMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC50cnVuYy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIGNlaWwgPSBNYXRoLmNlaWw7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CgovLyBgTWF0aC50cnVuY2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgudHJ1bmMKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpIHsKICAgIHJldHVybiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIik7CnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKS5mOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciB0cmltID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIpLnRyaW07Cgp2YXIgTlVNQkVSID0gJ051bWJlcic7CnZhciBOYXRpdmVOdW1iZXIgPSBnbG9iYWxbTlVNQkVSXTsKdmFyIE51bWJlclByb3RvdHlwZSA9IE5hdGl2ZU51bWJlci5wcm90b3R5cGU7CgovLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmcKdmFyIEJST0tFTl9DTEFTU09GID0gY2xhc3NvZihjcmVhdGUoTnVtYmVyUHJvdG90eXBlKSkgPT0gTlVNQkVSOwoKLy8gYFRvTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9udW1iZXIKdmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTsKICB2YXIgZmlyc3QsIHRoaXJkLCByYWRpeCwgbWF4Q29kZSwgZGlnaXRzLCBsZW5ndGgsIGluZGV4LCBjb2RlOwogIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikgewogICAgaXQgPSB0cmltKGl0KTsKICAgIGZpcnN0ID0gaXQuY2hhckNvZGVBdCgwKTsKICAgIGlmIChmaXJzdCA9PT0gNDMgfHwgZmlyc3QgPT09IDQ1KSB7CiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTsKICAgICAgaWYgKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKSByZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4CiAgICB9IGVsc2UgaWYgKGZpcnN0ID09PSA0OCkgewogICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHsKICAgICAgICBjYXNlIDY2OiBjYXNlIDk4OiByYWRpeCA9IDI7IG1heENvZGUgPSA0OTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgb2YgL14wYlswMV0rJC9pCiAgICAgICAgY2FzZSA3OTogY2FzZSAxMTE6IHJhZGl4ID0gODsgbWF4Q29kZSA9IDU1OyBicmVhazsgLy8gZmFzdCBlcXVhbCBvZiAvXjBvWzAtN10rJC9pCiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDsKICAgICAgfQogICAgICBkaWdpdHMgPSBpdC5zbGljZSgyKTsKICAgICAgbGVuZ3RoID0gZGlnaXRzLmxlbmd0aDsKICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGluZGV4KTsKICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2wKICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9scwogICAgICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IG1heENvZGUpIHJldHVybiBOYU47CiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpOwogICAgfQogIH0gcmV0dXJuICtpdDsKfTsKCi8vIGBOdW1iZXJgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci1jb25zdHJ1Y3RvcgppZiAoaXNGb3JjZWQoTlVNQkVSLCAhTmF0aXZlTnVtYmVyKCcgMG8xJykgfHwgIU5hdGl2ZU51bWJlcignMGIxJykgfHwgTmF0aXZlTnVtYmVyKCcrMHgxJykpKSB7CiAgdmFyIE51bWJlcldyYXBwZXIgPSBmdW5jdGlvbiBOdW1iZXIodmFsdWUpIHsKICAgIHZhciBpdCA9IGFyZ3VtZW50cy5sZW5ndGggPCAxID8gMCA6IHZhbHVlOwogICAgdmFyIGR1bW15ID0gdGhpczsKICAgIHJldHVybiBkdW1teSBpbnN0YW5jZW9mIE51bWJlcldyYXBwZXIKICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlCiAgICAgICYmIChCUk9LRU5fQ0xBU1NPRiA/IGZhaWxzKGZ1bmN0aW9uICgpIHsgTnVtYmVyUHJvdG90eXBlLnZhbHVlT2YuY2FsbChkdW1teSk7IH0pIDogY2xhc3NvZihkdW1teSkgIT0gTlVNQkVSKQogICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IE5hdGl2ZU51bWJlcih0b051bWJlcihpdCkpLCBkdW1teSwgTnVtYmVyV3JhcHBlcikgOiB0b051bWJlcihpdCk7CiAgfTsKICBmb3IgKHZhciBrZXlzID0gREVTQ1JJUFRPUlMgPyBnZXRPd25Qcm9wZXJ0eU5hbWVzKE5hdGl2ZU51bWJlcikgOiAoCiAgICAvLyBFUzM6CiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArCiAgICAvLyBFUzIwMTUgKGluIGNhc2UsIGlmIG1vZHVsZXMgd2l0aCBFUzIwMTUgTnVtYmVyIHN0YXRpY3MgcmVxdWlyZWQgYmVmb3JlKToKICAgICdFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsJyArCiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcicKICApLnNwbGl0KCcsJyksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajsgaisrKSB7CiAgICBpZiAoaGFzKE5hdGl2ZU51bWJlciwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcyhOdW1iZXJXcmFwcGVyLCBrZXkpKSB7CiAgICAgIGRlZmluZVByb3BlcnR5KE51bWJlcldyYXBwZXIsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5hdGl2ZU51bWJlciwga2V5KSk7CiAgICB9CiAgfQogIE51bWJlcldyYXBwZXIucHJvdG90eXBlID0gTnVtYmVyUHJvdG90eXBlOwogIE51bWJlclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE51bWJlcldyYXBwZXI7CiAgcmVkZWZpbmUoZ2xvYmFsLCBOVU1CRVIsIE51bWJlcldyYXBwZXIpOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5lcHNpbG9uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuZXBzaWxvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBOdW1iZXIuRVBTSUxPTmAgY29uc3RhbnQKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmVwc2lsb24KJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwgewogIEVQU0lMT046IE1hdGgucG93KDIsIC01MikKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1maW5pdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWZpbml0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgbnVtYmVySXNGaW5pdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbnVtYmVyLWlzLWZpbml0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLWlzLWZpbml0ZS5qcyIpOwoKLy8gYE51bWJlci5pc0Zpbml0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2Zpbml0ZQokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7IGlzRmluaXRlOiBudW1iZXJJc0Zpbml0ZSB9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVnZXIuanMiKTsKCi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlcgokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7CiAgaXNJbnRlZ2VyOiBpc0ludGVnZXIKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKLy8gYE51bWJlci5pc05hTmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc25hbgokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7CiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZQogICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpc0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyIpOwoKdmFyIGFicyA9IE1hdGguYWJzOwoKLy8gYE51bWJlci5pc1NhZmVJbnRlZ2VyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIKJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwgewogIGlzU2FmZUludGVnZXI6IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIobnVtYmVyKSB7CiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxRkZGRkZGRkZGRkZGRjsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgIGNvbnN0YW50Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5tYXhfc2FmZV9pbnRlZ2VyCiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHsKICBNQVhfU0FGRV9JTlRFR0VSOiAweDFGRkZGRkZGRkZGRkZGCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIubWluLXNhZmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJgIGNvbnN0YW50Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5taW5fc2FmZV9pbnRlZ2VyCiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHsKICBNSU5fU0FGRV9JTlRFR0VSOiAtMHgxRkZGRkZGRkZGRkZGRgp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWZsb2F0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWZsb2F0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHBhcnNlRmxvYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGFyc2UtZmxvYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhcnNlLWZsb2F0LmpzIik7CgovLyBgTnVtYmVyLnBhcnNlRmxvYXRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIucGFyc2VGbG9hdAokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBOdW1iZXIucGFyc2VGbG9hdCAhPSBwYXJzZUZsb2F0IH0sIHsKICBwYXJzZUZsb2F0OiBwYXJzZUZsb2F0Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHBhcnNlSW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhcnNlLWludCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtaW50LmpzIik7CgovLyBgTnVtYmVyLnBhcnNlSW50YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLnBhcnNlaW50CiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUludCAhPSBwYXJzZUludCB9LCB7CiAgcGFyc2VJbnQ6IHBhcnNlSW50Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKdmFyIHRoaXNOdW1iZXJWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGhpcy1udW1iZXItdmFsdWUuanMiKTsKdmFyIHJlcGVhdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcmVwZWF0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBuYXRpdmVUb0ZpeGVkID0gMS4wLnRvRml4ZWQ7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7Cgp2YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykgewogIHJldHVybiBuID09PSAwID8gYWNjIDogbiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKTsKfTsKCnZhciBsb2cgPSBmdW5jdGlvbiAoeCkgewogIHZhciBuID0gMDsKICB2YXIgeDIgPSB4OwogIHdoaWxlICh4MiA+PSA0MDk2KSB7CiAgICBuICs9IDEyOwogICAgeDIgLz0gNDA5NjsKICB9CiAgd2hpbGUgKHgyID49IDIpIHsKICAgIG4gKz0gMTsKICAgIHgyIC89IDI7CiAgfSByZXR1cm4gbjsKfTsKCnZhciBGT1JDRUQgPSBuYXRpdmVUb0ZpeGVkICYmICgKICAwLjAwMDA4LnRvRml4ZWQoMykgIT09ICcwLjAwMCcgfHwKICAwLjkudG9GaXhlZCgwKSAhPT0gJzEnIHx8CiAgMS4yNTUudG9GaXhlZCgyKSAhPT0gJzEuMjUnIHx8CiAgMTAwMDAwMDAwMDAwMDAwMDEyOC4wLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4JwopIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gVjggfiBBbmRyb2lkIDQuMy0KICBuYXRpdmVUb0ZpeGVkLmNhbGwoe30pOwp9KTsKCi8vIGBOdW1iZXIucHJvdG90eXBlLnRvRml4ZWRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIucHJvdG90eXBlLnRvZml4ZWQKJCh7IHRhcmdldDogJ051bWJlcicsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzCiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykgewogICAgdmFyIG51bWJlciA9IHRoaXNOdW1iZXJWYWx1ZSh0aGlzKTsKICAgIHZhciBmcmFjdERpZ2l0cyA9IHRvSW50ZWdlcihmcmFjdGlvbkRpZ2l0cyk7CiAgICB2YXIgZGF0YSA9IFswLCAwLCAwLCAwLCAwLCAwXTsKICAgIHZhciBzaWduID0gJyc7CiAgICB2YXIgcmVzdWx0ID0gJzAnOwogICAgdmFyIGUsIHosIGosIGs7CgogICAgdmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKG4sIGMpIHsKICAgICAgdmFyIGluZGV4ID0gLTE7CiAgICAgIHZhciBjMiA9IGM7CiAgICAgIHdoaWxlICgrK2luZGV4IDwgNikgewogICAgICAgIGMyICs9IG4gKiBkYXRhW2luZGV4XTsKICAgICAgICBkYXRhW2luZGV4XSA9IGMyICUgMWU3OwogICAgICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBkaXZpZGUgPSBmdW5jdGlvbiAobikgewogICAgICB2YXIgaW5kZXggPSA2OwogICAgICB2YXIgYyA9IDA7CiAgICAgIHdoaWxlICgtLWluZGV4ID49IDApIHsKICAgICAgICBjICs9IGRhdGFbaW5kZXhdOwogICAgICAgIGRhdGFbaW5kZXhdID0gZmxvb3IoYyAvIG4pOwogICAgICAgIGMgPSAoYyAlIG4pICogMWU3OwogICAgICB9CiAgICB9OwoKICAgIHZhciBkYXRhVG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBpbmRleCA9IDY7CiAgICAgIHZhciBzID0gJyc7CiAgICAgIHdoaWxlICgtLWluZGV4ID49IDApIHsKICAgICAgICBpZiAocyAhPT0gJycgfHwgaW5kZXggPT09IDAgfHwgZGF0YVtpbmRleF0gIT09IDApIHsKICAgICAgICAgIHZhciB0ID0gU3RyaW5nKGRhdGFbaW5kZXhdKTsKICAgICAgICAgIHMgPSBzID09PSAnJyA/IHQgOiBzICsgcmVwZWF0LmNhbGwoJzAnLCA3IC0gdC5sZW5ndGgpICsgdDsKICAgICAgICB9CiAgICAgIH0gcmV0dXJuIHM7CiAgICB9OwoKICAgIGlmIChmcmFjdERpZ2l0cyA8IDAgfHwgZnJhY3REaWdpdHMgPiAyMCkgdGhyb3cgUmFuZ2VFcnJvcignSW5jb3JyZWN0IGZyYWN0aW9uIGRpZ2l0cycpOwogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZQogICAgaWYgKG51bWJlciAhPSBudW1iZXIpIHJldHVybiAnTmFOJzsKICAgIGlmIChudW1iZXIgPD0gLTFlMjEgfHwgbnVtYmVyID49IDFlMjEpIHJldHVybiBTdHJpbmcobnVtYmVyKTsKICAgIGlmIChudW1iZXIgPCAwKSB7CiAgICAgIHNpZ24gPSAnLSc7CiAgICAgIG51bWJlciA9IC1udW1iZXI7CiAgICB9CiAgICBpZiAobnVtYmVyID4gMWUtMjEpIHsKICAgICAgZSA9IGxvZyhudW1iZXIgKiBwb3coMiwgNjksIDEpKSAtIDY5OwogICAgICB6ID0gZSA8IDAgPyBudW1iZXIgKiBwb3coMiwgLWUsIDEpIDogbnVtYmVyIC8gcG93KDIsIGUsIDEpOwogICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7CiAgICAgIGUgPSA1MiAtIGU7CiAgICAgIGlmIChlID4gMCkgewogICAgICAgIG11bHRpcGx5KDAsIHopOwogICAgICAgIGogPSBmcmFjdERpZ2l0czsKICAgICAgICB3aGlsZSAoaiA+PSA3KSB7CiAgICAgICAgICBtdWx0aXBseSgxZTcsIDApOwogICAgICAgICAgaiAtPSA3OwogICAgICAgIH0KICAgICAgICBtdWx0aXBseShwb3coMTAsIGosIDEpLCAwKTsKICAgICAgICBqID0gZSAtIDE7CiAgICAgICAgd2hpbGUgKGogPj0gMjMpIHsKICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTsKICAgICAgICAgIGogLT0gMjM7CiAgICAgICAgfQogICAgICAgIGRpdmlkZSgxIDw8IGopOwogICAgICAgIG11bHRpcGx5KDEsIDEpOwogICAgICAgIGRpdmlkZSgyKTsKICAgICAgICByZXN1bHQgPSBkYXRhVG9TdHJpbmcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtdWx0aXBseSgwLCB6KTsKICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTsKICAgICAgICByZXN1bHQgPSBkYXRhVG9TdHJpbmcoKSArIHJlcGVhdC5jYWxsKCcwJywgZnJhY3REaWdpdHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoZnJhY3REaWdpdHMgPiAwKSB7CiAgICAgIGsgPSByZXN1bHQubGVuZ3RoOwogICAgICByZXN1bHQgPSBzaWduICsgKGsgPD0gZnJhY3REaWdpdHMKICAgICAgICA/ICcwLicgKyByZXBlYXQuY2FsbCgnMCcsIGZyYWN0RGlnaXRzIC0gaykgKyByZXN1bHQKICAgICAgICA6IHJlc3VsdC5zbGljZSgwLCBrIC0gZnJhY3REaWdpdHMpICsgJy4nICsgcmVzdWx0LnNsaWNlKGsgLSBmcmFjdERpZ2l0cykpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gc2lnbiArIHJlc3VsdDsKICAgIH0gcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tcHJlY2lzaW9uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1wcmVjaXNpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgdGhpc051bWJlclZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RoaXMtbnVtYmVyLXZhbHVlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyIpOwoKdmFyIG5hdGl2ZVRvUHJlY2lzaW9uID0gMS4wLnRvUHJlY2lzaW9uOwoKdmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBJRTctCiAgcmV0dXJuIG5hdGl2ZVRvUHJlY2lzaW9uLmNhbGwoMSwgdW5kZWZpbmVkKSAhPT0gJzEnOwp9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIFY4IH4gQW5kcm9pZCA0LjMtCiAgbmF0aXZlVG9QcmVjaXNpb24uY2FsbCh7fSk7Cn0pOwoKLy8gYE51bWJlci5wcm90b3R5cGUudG9QcmVjaXNpb25gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIucHJvdG90eXBlLnRvcHJlY2lzaW9uCiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pIHsKICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZAogICAgICA/IG5hdGl2ZVRvUHJlY2lzaW9uLmNhbGwodGhpc051bWJlclZhbHVlKHRoaXMpKQogICAgICA6IG5hdGl2ZVRvUHJlY2lzaW9uLmNhbGwodGhpc051bWJlclZhbHVlKHRoaXMpLCBwcmVjaXNpb24pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiKTsKCi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnbgokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwgewogIGFzc2lnbjogYXNzaWduCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5jcmVhdGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKCi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZQokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHsKICBjcmVhdGU6IGNyZWF0ZQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1nZXR0ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBGT1JDRUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1tZXRob2RzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKCi8vIGBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX19gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18KaWYgKERFU0NSSVBUT1JTKSB7CiAgJCh7IHRhcmdldDogJ09iamVjdCcsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgICBfX2RlZmluZUdldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZUdldHRlcl9fKFAsIGdldHRlcikgewogICAgICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKHRvT2JqZWN0KHRoaXMpLCBQLCB7IGdldDogYUZ1bmN0aW9uKGdldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgIH0KICB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIik7CgovLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllcwokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhREVTQ1JJUFRPUlMsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVydGllcwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIG9iamVjdERlZmluZVByb3BlcnR5TW9kaWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKCi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHkKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIURFU0NSSVBUT1JTLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwgewogIGRlZmluZVByb3BlcnR5OiBvYmplY3REZWZpbmVQcm9wZXJ0eU1vZGlsZS5mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXNldHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIEZPUkNFRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtbWV0aG9kcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwoKLy8gYE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfX2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXwppZiAoREVTQ1JJUFRPUlMpIHsKICAkKHsgdGFyZ2V0OiAnT2JqZWN0JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAgIF9fZGVmaW5lU2V0dGVyX186IGZ1bmN0aW9uIF9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKSB7CiAgICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYodG9PYmplY3QodGhpcyksIFAsIHsgc2V0OiBhRnVuY3Rpb24oc2V0dGVyKSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgfQogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRlbnRyaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIikuZW50cmllczsKCi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHsKICAgIHJldHVybiAkZW50cmllcyhPKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgb25GcmVlemUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIikub25GcmVlemU7Cgp2YXIgbmF0aXZlRnJlZXplID0gT2JqZWN0LmZyZWV6ZTsKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUZyZWV6ZSgxKTsgfSk7CgovLyBgT2JqZWN0LmZyZWV6ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5mcmVlemUKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUZSRUVaSU5HIH0sIHsKICBmcmVlemU6IGZ1bmN0aW9uIGZyZWV6ZShpdCkgewogICAgcmV0dXJuIG5hdGl2ZUZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyBuYXRpdmVGcmVlemUob25GcmVlemUoaXQpKSA6IGl0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcm9tLWVudHJpZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmZyb20tZW50cmllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIpOwoKLy8gYE9iamVjdC5mcm9tRW50cmllc2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1mcm9tLWVudHJpZXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGZyb21FbnRyaWVzOiBmdW5jdGlvbiBmcm9tRW50cmllcyhpdGVyYWJsZSkgewogICAgdmFyIG9iaiA9IHt9OwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKGssIHYpIHsKICAgICAgY3JlYXRlUHJvcGVydHkob2JqLCBrLCB2KTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICByZXR1cm4gb2JqOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKCnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoMSk7IH0pOwp2YXIgRk9SQ0VEID0gIURFU0NSSVBUT1JTIHx8IEZBSUxTX09OX1BSSU1JVElWRVM7CgovLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwgewogIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHsKICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JbmRleGVkT2JqZWN0KGl0KSwga2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIG93bktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3duLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIik7CnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiKTsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwgewogIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7CiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpOwogICAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mOwogICAgdmFyIGtleXMgPSBvd25LZXlzKE8pOwogICAgdmFyIHJlc3VsdCA9IHt9OwogICAgdmFyIGluZGV4ID0gMDsKICAgIHZhciBrZXksIGRlc2NyaXB0b3I7CiAgICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpbmRleCkgewogICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIGtleSA9IGtleXNbaW5kZXgrK10pOwogICAgICBpZiAoZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzY3JpcHRvcik7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiKS5mOwoKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiAhT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoMSk7IH0pOwoKLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7CiAgZ2V0T3duUHJvcGVydHlOYW1lczogbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgbmF0aXZlR2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiKTsKCnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVHZXRQcm90b3R5cGVPZigxKTsgfSk7CgovLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgfSwgewogIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkgewogICAgcmV0dXJuIG5hdGl2ZUdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7CiAgfQp9KTsKCgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy1leHRlbnNpYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtZXh0ZW5zaWJsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKCnZhciBuYXRpdmVJc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlOwp2YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlSXNFeHRlbnNpYmxlKDEpOyB9KTsKCi8vIGBPYmplY3QuaXNFeHRlbnNpYmxlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmlzZXh0ZW5zaWJsZQokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTIH0sIHsKICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkgewogICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/IG5hdGl2ZUlzRXh0ZW5zaWJsZSA/IG5hdGl2ZUlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLWZyb3plbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtZnJvemVuLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7Cgp2YXIgbmF0aXZlSXNGcm96ZW4gPSBPYmplY3QuaXNGcm96ZW47CnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVJc0Zyb3plbigxKTsgfSk7CgovLyBgT2JqZWN0LmlzRnJvemVuYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmlzZnJvemVuCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMgfSwgewogIGlzRnJvemVuOiBmdW5jdGlvbiBpc0Zyb3plbihpdCkgewogICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/IG5hdGl2ZUlzRnJvemVuID8gbmF0aXZlSXNGcm96ZW4oaXQpIDogZmFsc2UgOiB0cnVlOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy1zZWFsZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLXNlYWxlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKdmFyIG5hdGl2ZUlzU2VhbGVkID0gT2JqZWN0LmlzU2VhbGVkOwp2YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlSXNTZWFsZWQoMSk7IH0pOwoKLy8gYE9iamVjdC5pc1NlYWxlZGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5pc3NlYWxlZAokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTIH0sIHsKICBpc1NlYWxlZDogZnVuY3Rpb24gaXNTZWFsZWQoaXQpIHsKICAgIHJldHVybiBpc09iamVjdChpdCkgPyBuYXRpdmVJc1NlYWxlZCA/IG5hdGl2ZUlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2FtZS12YWx1ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS5qcyIpOwoKLy8gYE9iamVjdC5pc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5pcwokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgaXM6IGlzCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgbmF0aXZlS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUtleXMoMSk7IH0pOwoKLy8gYE9iamVjdC5rZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7CiAga2V5czogZnVuY3Rpb24ga2V5cyhpdCkgewogICAgcmV0dXJuIG5hdGl2ZUtleXModG9PYmplY3QoaXQpKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QubG9va3VwLWdldHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIEZPUkNFRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtbWV0aG9kcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CgovLyBgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fCmlmIChERVNDUklQVE9SUykgewogICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogICAgX19sb29rdXBHZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBHZXR0ZXJfXyhQKSB7CiAgICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICAgIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKICAgICAgdmFyIGRlc2M7CiAgICAgIGRvIHsKICAgICAgICBpZiAoZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBrZXkpKSByZXR1cm4gZGVzYy5nZXQ7CiAgICAgIH0gd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7CiAgICB9CiAgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1zZXR0ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5sb29rdXAtc2V0dGVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBGT1JDRUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1tZXRob2RzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKS5mOwoKLy8gYE9iamVjdC5wcm90b3R5cGUuX19sb29rdXBTZXR0ZXJfX2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUuX19sb29rdXBTZXR0ZXJfXwppZiAoREVTQ1JJUFRPUlMpIHsKICAkKHsgdGFyZ2V0OiAnT2JqZWN0JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAgIF9fbG9va3VwU2V0dGVyX186IGZ1bmN0aW9uIF9fbG9va3VwU2V0dGVyX18oUCkgewogICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpOwogICAgICB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CiAgICAgIHZhciBkZXNjOwogICAgICBkbyB7CiAgICAgICAgaWYgKGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywga2V5KSkgcmV0dXJuIGRlc2Muc2V0OwogICAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpOwogICAgfQogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIG9uRnJlZXplID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIpLm9uRnJlZXplOwp2YXIgRlJFRVpJTkcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnJlZXppbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBuYXRpdmVQcmV2ZW50RXh0ZW5zaW9ucyA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uczsKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZVByZXZlbnRFeHRlbnNpb25zKDEpOyB9KTsKCi8vIGBPYmplY3QucHJldmVudEV4dGVuc2lvbnNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJldmVudGV4dGVuc2lvbnMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUZSRUVaSU5HIH0sIHsKICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnMoaXQpIHsKICAgIHJldHVybiBuYXRpdmVQcmV2ZW50RXh0ZW5zaW9ucyAmJiBpc09iamVjdChpdCkgPyBuYXRpdmVQcmV2ZW50RXh0ZW5zaW9ucyhvbkZyZWV6ZShpdCkpIDogaXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNlYWwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZWFsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIG9uRnJlZXplID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIpLm9uRnJlZXplOwp2YXIgRlJFRVpJTkcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnJlZXppbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBuYXRpdmVTZWFsID0gT2JqZWN0LnNlYWw7CnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVTZWFsKDEpOyB9KTsKCi8vIGBPYmplY3Quc2VhbGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5zZWFsCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFGUkVFWklORyB9LCB7CiAgc2VhbDogZnVuY3Rpb24gc2VhbChpdCkgewogICAgcmV0dXJuIG5hdGl2ZVNlYWwgJiYgaXNPYmplY3QoaXQpID8gbmF0aXZlU2VhbChvbkZyZWV6ZShpdCkpIDogaXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIik7CgovLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBzZXRQcm90b3R5cGVPZjogc2V0UHJvdG90eXBlT2YKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanMiKTsKCi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZwppZiAoIVRPX1NUUklOR19UQUdfU1VQUE9SVCkgewogIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC52YWx1ZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICR2YWx1ZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiKS52YWx1ZXM7CgovLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKE8pIHsKICAgIHJldHVybiAkdmFsdWVzKE8pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWZsb2F0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHBhcnNlRmxvYXRJbXBsZW1lbnRhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXJzZS1mbG9hdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtZmxvYXQuanMiKTsKCi8vIGBwYXJzZUZsb2F0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmcKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBwYXJzZUZsb2F0ICE9IHBhcnNlRmxvYXRJbXBsZW1lbnRhdGlvbiB9LCB7CiAgcGFyc2VGbG9hdDogcGFyc2VGbG9hdEltcGxlbWVudGF0aW9uCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgcGFyc2VJbnRJbXBsZW1lbnRhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXJzZS1pbnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhcnNlLWludC5qcyIpOwoKLy8gYHBhcnNlSW50YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4CiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogcGFyc2VJbnQgIT0gcGFyc2VJbnRJbXBsZW1lbnRhdGlvbiB9LCB7CiAgcGFyc2VJbnQ6IHBhcnNlSW50SW1wbGVtZW50YXRpb24KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiKTsKdmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1hbGxTZXR0bGVkCiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7CiAgYWxsU2V0dGxlZDogZnVuY3Rpb24gYWxsU2V0dGxlZChpdGVyYWJsZSkgewogICAgdmFyIEMgPSB0aGlzOwogICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpOwogICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7CiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOwogICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgIHZhciBjb3VudGVyID0gMDsKICAgICAgdmFyIHJlbWFpbmluZyA9IDE7CiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrOwogICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7CiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTsKICAgICAgICByZW1haW5pbmcrKzsKICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuOwogICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTsKICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjsKICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlOwogICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGUgfTsKICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKICAgIH0pOwogICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIE5hdGl2ZVByb21pc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBwcm9taXNlUmVzb2x2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CgovLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjkKdmFyIE5PTl9HRU5FUklDID0gISFOYXRpdmVQcm9taXNlICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsKICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTsKfSk7CgovLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHkKJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7CiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7CiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpOwogICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7CiAgICByZXR1cm4gdGhpcy50aGVuKAogICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHsKICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7CiAgICAgIH0gOiBvbkZpbmFsbHksCiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pOwogICAgICB9IDogb25GaW5hbGx5CiAgICApOwogIH0KfSk7CgovLyBwYXRjaCBuYXRpdmUgUHJvbWlzZS5wcm90b3R5cGUgZm9yIG5hdGl2ZSBhc3luYyBmdW5jdGlvbnMKaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHsKICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J10pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIE5hdGl2ZVByb21pc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yLmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIHJlZGVmaW5lQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIik7CnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKdmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwp2YXIgaW5zcGVjdFNvdXJjZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgdGFzayA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90YXNrICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIikuc2V0Owp2YXIgbWljcm90YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21pY3JvdGFzayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIik7CnZhciBwcm9taXNlUmVzb2x2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIpOwp2YXIgaG9zdFJlcG9ydEVycm9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIpOwp2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIpOwp2YXIgcGVyZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wZXJmb3JtICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwp2YXIgaXNGb3JjZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtZm9yY2VkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIFY4X1ZFUlNJT04gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdjgtdmVyc2lvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdjgtdmVyc2lvbi5qcyIpOwoKdmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKdmFyIFBST01JU0UgPSAnUHJvbWlzZSc7CnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7CnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7CnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpOwp2YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gTmF0aXZlUHJvbWlzZTsKdmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7CnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDsKdmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKdmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7CnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7CnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTsKdmFyIElTX05PREUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJzsKdmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpOwp2YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nOwp2YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7CnZhciBQRU5ESU5HID0gMDsKdmFyIEZVTEZJTExFRCA9IDE7CnZhciBSRUpFQ1RFRCA9IDI7CnZhciBIQU5ETEVEID0gMTsKdmFyIFVOSEFORExFRCA9IDI7CnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuOwoKdmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHsKICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IGluc3BlY3RTb3VyY2UoUHJvbWlzZUNvbnN0cnVjdG9yKSAhPT0gU3RyaW5nKFByb21pc2VDb25zdHJ1Y3Rvcik7CiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFKSB7CiAgICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzCiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjUKICAgIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zCiAgICBpZiAoVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlOwogICAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdAogICAgaWYgKCFJU19OT0RFICYmIHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgIT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRydWU7CiAgfQogIC8vIFdlIG5lZWQgUHJvbWlzZSNmaW5hbGx5IGluIHRoZSBwdXJlIHZlcnNpb24gZm9yIHByZXZlbnRpbmcgcHJvdG90eXBlIHBvbGx1dGlvbgogIGlmIChJU19QVVJFICYmICFQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlOwogIC8vIFdlIGNhbid0IHVzZSBAQHNwZWNpZXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzCiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uCiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OQogIGlmIChWOF9WRVJTSU9OID49IDUxICYmIC9uYXRpdmUgY29kZS8udGVzdChQcm9taXNlQ29uc3RydWN0b3IpKSByZXR1cm4gZmFsc2U7CiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnQKICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpOwogIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7CiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTsKICB9OwogIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTsKICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlOwogIHJldHVybiAhKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2UpOwp9KTsKCnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7CiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTsKfSk7CgovLyBoZWxwZXJzCnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIHRoZW47CiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlOwp9OwoKdmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgaXNSZWplY3QpIHsKICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjsKICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7CiAgdmFyIGNoYWluID0gc3RhdGUucmVhY3Rpb25zOwogIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7CiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTsKICAgIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDsKICAgIHZhciBpbmRleCA9IDA7CiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaAogICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGluZGV4KSB7CiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdOwogICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsOwogICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7CiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7CiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47CiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgaWYgKCFvaykgewogICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UsIHN0YXRlKTsKICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTsKICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvdwogICAgICAgICAgICBpZiAoZG9tYWluKSB7CiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTsKICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7CiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHsKICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpOwogICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIHN0YXRlLnJlYWN0aW9ucyA9IFtdOwogICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTsKICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7CiAgfSk7Cn07Cgp2YXIgZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBwcm9taXNlLCByZWFzb24pIHsKICB2YXIgZXZlbnQsIGhhbmRsZXI7CiAgaWYgKERJU1BBVENIX0VWRU5UKSB7CiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpOwogICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7CiAgICBldmVudC5yZWFzb24gPSByZWFzb247CiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpOwogICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTsKICBpZiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pIGhhbmRsZXIoZXZlbnQpOwogIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7Cn07Cgp2YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHsKICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTsKICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7CiAgICB2YXIgcmVzdWx0OwogICAgaWYgKElTX1VOSEFORExFRCkgewogICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoSVNfTk9ERSkgewogICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7CiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpOwogICAgICB9KTsKICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGQKICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEOwogICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7CiAgICB9CiAgfSk7Cn07Cgp2YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHsKICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7Cn07Cgp2YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHsKICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoSVNfTk9ERSkgewogICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTsKICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7CiAgfSk7Cn07Cgp2YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgcHJvbWlzZSwgc3RhdGUsIHVud3JhcCkgewogIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHsKICAgIGZuKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKTsKICB9Owp9OwoKdmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7CiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjsKICBzdGF0ZS5kb25lID0gdHJ1ZTsKICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDsKICBzdGF0ZS52YWx1ZSA9IHZhbHVlOwogIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7CiAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCB0cnVlKTsKfTsKCnZhciBpbnRlcm5hbFJlc29sdmUgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHsKICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuOwogIHN0YXRlLmRvbmUgPSB0cnVlOwogIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwOwogIHRyeSB7CiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcigiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTsKICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7CiAgICBpZiAodGhlbikgewogICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9OwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsCiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBwcm9taXNlLCB3cmFwcGVyLCBzdGF0ZSksCiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKQogICAgICAgICAgKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgaW50ZXJuYWxSZWplY3QocHJvbWlzZSwgd3JhcHBlciwgZXJyb3IsIHN0YXRlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTsKICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7CiAgICAgIG5vdGlmeShwcm9taXNlLCBzdGF0ZSwgZmFsc2UpOwogICAgfQogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7CiAgfQp9OwoKLy8gY29uc3RydWN0b3IgcG9seWZpbGwKaWYgKEZPUkNFRCkgewogIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpCiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikgewogICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UpOwogICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTsKICAgIEludGVybmFsLmNhbGwodGhpcyk7CiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogICAgdHJ5IHsKICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHRoaXMsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgdGhpcywgc3RhdGUpKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGludGVybmFsUmVqZWN0KHRoaXMsIHN0YXRlLCBlcnJvcik7CiAgICB9CiAgfTsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHsKICAgIHNldEludGVybmFsU3RhdGUodGhpcywgewogICAgICB0eXBlOiBQUk9NSVNFLAogICAgICBkb25lOiBmYWxzZSwKICAgICAgbm90aWZpZWQ6IGZhbHNlLAogICAgICBwYXJlbnQ6IGZhbHNlLAogICAgICByZWFjdGlvbnM6IFtdLAogICAgICByZWplY3Rpb246IGZhbHNlLAogICAgICBzdGF0ZTogUEVORElORywKICAgICAgdmFsdWU6IHVuZGVmaW5lZAogICAgfSk7CiAgfTsKICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7CiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuCiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpOwogICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7CiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7CiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7CiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDsKICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTsKICAgICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pOwogICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHRoaXMsIHN0YXRlLCBmYWxzZSk7CiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlOwogICAgfSwKICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaAogICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHsKICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpOwogICAgfQogIH0pOwogIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTsKICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7CiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlOwogICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHN0YXRlKTsKICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgc3RhdGUpOwogIH07CiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHsKICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXIKICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQykKICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7CiAgfTsKCiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicpIHsKICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlLnByb3RvdHlwZS50aGVuOwoKICAgIC8vIHdyYXAgbmF0aXZlIFByb21pc2UjdGhlbiBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9ucwogICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgewogICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBuYXRpdmVUaGVuLmNhbGwodGhhdCwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwCiAgICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTsKCiAgICAvLyB3cmFwIGZldGNoIHJlc3VsdAogICAgaWYgKHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJykgJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHsKICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoUHJvbWlzZUNvbnN0cnVjdG9yLCAkZmV0Y2guYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpKTsKICAgICAgfQogICAgfSk7CiAgfQp9CgokKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yCn0pOwoKc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7CnNldFNwZWNpZXMoUFJPTUlTRSk7CgpQcm9taXNlV3JhcHBlciA9IGdldEJ1aWx0SW4oUFJPTUlTRSk7CgovLyBzdGF0aWNzCiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0CiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3QocikgewogICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTsKICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTsKICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CiAgfQp9KTsKCiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwgewogIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZQogIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkgewogICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTsKICB9Cn0pOwoKJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHsKICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsCiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHsKICAgIHZhciBDID0gdGhpczsKICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTsKICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDsKICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOwogICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgIHZhciBjb3VudGVyID0gMDsKICAgICAgdmFyIHJlbWFpbmluZyA9IDE7CiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrOwogICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7CiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTsKICAgICAgICByZW1haW5pbmcrKzsKICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjsKICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlOwogICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlOwogICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpOwogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH0pOwogICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7CiAgICB9KTsKICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpOwogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKICB9LAogIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZQogIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHsKICAgIHZhciBDID0gdGhpczsKICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTsKICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpOwogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmFwcGx5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgp2YXIgbmF0aXZlQXBwbHkgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ2FwcGx5Jyk7CnZhciBmdW5jdGlvbkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7CgovLyBNUyBFZGdlIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWwKdmFyIE9QVElPTkFMX0FSR1VNRU5UU19MSVNUID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBuYXRpdmVBcHBseShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pOwp9KTsKCi8vIGBSZWZsZWN0LmFwcGx5YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5hcHBseQokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT1BUSU9OQUxfQVJHVU1FTlRTX0xJU1QgfSwgewogIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCkgewogICAgYUZ1bmN0aW9uKHRhcmdldCk7CiAgICBhbk9iamVjdChhcmd1bWVudHNMaXN0KTsKICAgIHJldHVybiBuYXRpdmVBcHBseQogICAgICA/IG5hdGl2ZUFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KQogICAgICA6IGZ1bmN0aW9uQXBwbHkuY2FsbCh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5jb25zdHJ1Y3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuY29uc3RydWN0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgp2YXIgbmF0aXZlQ29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTsKCi8vIGBSZWZsZWN0LmNvbnN0cnVjdGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuY29uc3RydWN0Ci8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50cyBhbmQgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbAovLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0CnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9CiAgcmV0dXJuICEobmF0aXZlQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7Cn0pOwp2YXIgQVJHU19CVUcgPSAhZmFpbHMoZnVuY3Rpb24gKCkgewogIG5hdGl2ZUNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pOwp9KTsKdmFyIEZPUkNFRCA9IE5FV19UQVJHRVRfQlVHIHx8IEFSR1NfQlVHOwoKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCwgc2hhbTogRk9SQ0VEIH0sIHsKICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHsKICAgIGFGdW5jdGlvbihUYXJnZXQpOwogICAgYW5PYmplY3QoYXJncyk7CiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTsKICAgIGlmIChBUkdTX0JVRyAmJiAhTkVXX1RBUkdFVF9CVUcpIHJldHVybiBuYXRpdmVDb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpOwogICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHsKICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHMKICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkgewogICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTsKICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pOwogICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOwogICAgICB9CiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlCiAgICAgIHZhciAkYXJncyA9IFtudWxsXTsKICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7CiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7CiAgICB9CiAgICAvLyB3aXRoIGFsdGVyZWQgbmV3VGFyZ2V0LCBub3Qgc3VwcG9ydCBidWlsdC1pbiBjb25zdHJ1Y3RvcnMKICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7CiAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKTsKICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpOwogICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CgovLyBNUyBFZGdlIGhhcyBicm9rZW4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSAtIHRocm93aW5nIGluc3RlYWQgb2YgcmV0dXJuaW5nIGZhbHNlCnZhciBFUlJPUl9JTlNURUFEX09GX0ZBTFNFID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZGVmaW5lUHJvcGVydHlNb2R1bGUuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTsKfSk7CgovLyBgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZGVmaW5lcHJvcGVydHkKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEVSUk9SX0lOU1RFQURfT0ZfRkFMU0UsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHsKICAgIGFuT2JqZWN0KHRhcmdldCk7CiAgICB2YXIga2V5ID0gdG9QcmltaXRpdmUocHJvcGVydHlLZXksIHRydWUpOwogICAgYW5PYmplY3QoYXR0cmlidXRlcyk7CiAgICB0cnkgewogICAgICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKHRhcmdldCwga2V5LCBhdHRyaWJ1dGVzKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIikuZjsKCi8vIGBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5kZWxldGVwcm9wZXJ0eQokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KSB7CiAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7CiAgICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUgPyBmYWxzZSA6IGRlbGV0ZSB0YXJnZXRbcHJvcGVydHlLZXldOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CgovLyBgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcgokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkgewogICAgcmV0dXJuIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIG9iamVjdEdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIik7CgovLyBgUmVmbGVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZ2V0cHJvdG90eXBlb2YKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBzaGFtOiAhQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSIH0sIHsKICBnZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7CiAgICByZXR1cm4gb2JqZWN0R2V0UHJvdG90eXBlT2YoYW5PYmplY3QodGFyZ2V0KSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZ2V0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKCi8vIGBSZWZsZWN0LmdldGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZ2V0CmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5IC8qICwgcmVjZWl2ZXIgKi8pIHsKICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTsKICB2YXIgZGVzY3JpcHRvciwgcHJvdG90eXBlOwogIGlmIChhbk9iamVjdCh0YXJnZXQpID09PSByZWNlaXZlcikgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eUtleV07CiAgaWYgKGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjcmlwdG9yLCAndmFsdWUnKQogICAgPyBkZXNjcmlwdG9yLnZhbHVlCiAgICA6IGRlc2NyaXB0b3IuZ2V0ID09PSB1bmRlZmluZWQKICAgICAgPyB1bmRlZmluZWQKICAgICAgOiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTsKICBpZiAoaXNPYmplY3QocHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpIHJldHVybiBnZXQocHJvdG90eXBlLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpOwp9CgokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGdldDogZ2V0Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0Lmhhcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5oYXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgUmVmbGVjdC5oYXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmhhcwokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpIHsKICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgb2JqZWN0SXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTsKCi8vIGBSZWZsZWN0LmlzRXh0ZW5zaWJsZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuaXNleHRlbnNpYmxlCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KSB7CiAgICBhbk9iamVjdCh0YXJnZXQpOwogICAgcmV0dXJuIG9iamVjdElzRXh0ZW5zaWJsZSA/IG9iamVjdElzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0Lm93bi1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Qub3duLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIG93bktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3duLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIik7CgovLyBgUmVmbGVjdC5vd25LZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5vd25rZXlzCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgb3duS2V5czogb3duS2V5cwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIpOwoKLy8gYFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LnByZXZlbnRleHRlbnNpb25zCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIUZSRUVaSU5HIH0sIHsKICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KSB7CiAgICBhbk9iamVjdCh0YXJnZXQpOwogICAgdHJ5IHsKICAgICAgdmFyIG9iamVjdFByZXZlbnRFeHRlbnNpb25zID0gZ2V0QnVpbHRJbignT2JqZWN0JywgJ3ByZXZlbnRFeHRlbnNpb25zJyk7CiAgICAgIGlmIChvYmplY3RQcmV2ZW50RXh0ZW5zaW9ucykgb2JqZWN0UHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhUG9zc2libGVQcm90b3R5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIik7CnZhciBvYmplY3RTZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiKTsKCi8vIGBSZWZsZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5zZXRwcm90b3R5cGVvZgppZiAob2JqZWN0U2V0UHJvdG90eXBlT2YpICQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pIHsKICAgIGFuT2JqZWN0KHRhcmdldCk7CiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pOwogICAgdHJ5IHsKICAgICAgb2JqZWN0U2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90byk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnNldC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKCi8vIGBSZWZsZWN0LnNldGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3Quc2V0CmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIC8qICwgcmVjZWl2ZXIgKi8pIHsKICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgNCA/IHRhcmdldCA6IGFyZ3VtZW50c1szXTsKICB2YXIgb3duRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTsKICB2YXIgZXhpc3RpbmdEZXNjcmlwdG9yLCBwcm90b3R5cGU7CiAgaWYgKCFvd25EZXNjcmlwdG9yKSB7CiAgICBpZiAoaXNPYmplY3QocHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpIHsKICAgICAgcmV0dXJuIHNldChwcm90b3R5cGUsIHByb3BlcnR5S2V5LCBWLCByZWNlaXZlcik7CiAgICB9CiAgICBvd25EZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDApOwogIH0KICBpZiAoaGFzKG93bkRlc2NyaXB0b3IsICd2YWx1ZScpKSB7CiAgICBpZiAob3duRGVzY3JpcHRvci53cml0YWJsZSA9PT0gZmFsc2UgfHwgIWlzT2JqZWN0KHJlY2VpdmVyKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkpIHsKICAgICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvci5nZXQgfHwgZXhpc3RpbmdEZXNjcmlwdG9yLnNldCB8fCBleGlzdGluZ0Rlc2NyaXB0b3Iud3JpdGFibGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7CiAgICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpOwogICAgfSBlbHNlIGRlZmluZVByb3BlcnR5TW9kdWxlLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgVikpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBvd25EZXNjcmlwdG9yLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpOwp9CgovLyBNUyBFZGdlIDE3LTE4IFJlZmxlY3Quc2V0IGFsbG93cyBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB0byBvYmplY3QKLy8gd2l0aCBub24td3JpdGFibGUgcHJvcGVydHkgb24gdGhlIHByb3RvdHlwZQp2YXIgTVNfRURHRV9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIG9iamVjdCA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmYoe30sICdhJywgeyBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgcmV0dXJuIFJlZmxlY3Quc2V0KGdldFByb3RvdHlwZU9mKG9iamVjdCksICdhJywgMSwgb2JqZWN0KSAhPT0gZmFsc2U7Cn0pOwoKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE1TX0VER0VfQlVHIH0sIHsKICBzZXQ6IHNldAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIpOwp2YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIpLmY7CnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwp2YXIgZ2V0RmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpOwp2YXIgTmF0aXZlUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDsKdmFyIFJlZ0V4cFByb3RvdHlwZSA9IE5hdGl2ZVJlZ0V4cC5wcm90b3R5cGU7CnZhciByZTEgPSAvYS9nOwp2YXIgcmUyID0gL2EvZzsKCi8vICJuZXciIHNob3VsZCBjcmVhdGUgYSBuZXcgb2JqZWN0LCBvbGQgd2Via2l0IGJ1Zwp2YXIgQ09SUkVDVF9ORVcgPSBuZXcgTmF0aXZlUmVnRXhwKHJlMSkgIT09IHJlMTsKCnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBpc0ZvcmNlZCgnUmVnRXhwJywgKCFDT1JSRUNUX05FVyB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmUyW01BVENIXSA9IGZhbHNlOwogIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoCiAgcmV0dXJuIE5hdGl2ZVJlZ0V4cChyZTEpICE9IHJlMSB8fCBOYXRpdmVSZWdFeHAocmUyKSA9PSByZTIgfHwgTmF0aXZlUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7Cn0pKSk7CgovLyBgUmVnRXhwYCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAtY29uc3RydWN0b3IKaWYgKEZPUkNFRCkgewogIHZhciBSZWdFeHBXcmFwcGVyID0gZnVuY3Rpb24gUmVnRXhwKHBhdHRlcm4sIGZsYWdzKSB7CiAgICB2YXIgdGhpc0lzUmVnRXhwID0gdGhpcyBpbnN0YW5jZW9mIFJlZ0V4cFdyYXBwZXI7CiAgICB2YXIgcGF0dGVybklzUmVnRXhwID0gaXNSZWdFeHAocGF0dGVybik7CiAgICB2YXIgZmxhZ3NBcmVVbmRlZmluZWQgPSBmbGFncyA9PT0gdW5kZWZpbmVkOwogICAgcmV0dXJuICF0aGlzSXNSZWdFeHAgJiYgcGF0dGVybklzUmVnRXhwICYmIHBhdHRlcm4uY29uc3RydWN0b3IgPT09IFJlZ0V4cFdyYXBwZXIgJiYgZmxhZ3NBcmVVbmRlZmluZWQgPyBwYXR0ZXJuCiAgICAgIDogaW5oZXJpdElmUmVxdWlyZWQoQ09SUkVDVF9ORVcKICAgICAgICA/IG5ldyBOYXRpdmVSZWdFeHAocGF0dGVybklzUmVnRXhwICYmICFmbGFnc0FyZVVuZGVmaW5lZCA/IHBhdHRlcm4uc291cmNlIDogcGF0dGVybiwgZmxhZ3MpCiAgICAgICAgOiBOYXRpdmVSZWdFeHAoKHBhdHRlcm5Jc1JlZ0V4cCA9IHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHBXcmFwcGVyKQogICAgICAgICAgPyBwYXR0ZXJuLnNvdXJjZQogICAgICAgICAgOiBwYXR0ZXJuLCBwYXR0ZXJuSXNSZWdFeHAgJiYgZmxhZ3NBcmVVbmRlZmluZWQgPyBnZXRGbGFncy5jYWxsKHBhdHRlcm4pIDogZmxhZ3MpCiAgICAgICwgdGhpc0lzUmVnRXhwID8gdGhpcyA6IFJlZ0V4cFByb3RvdHlwZSwgUmVnRXhwV3JhcHBlcik7CiAgfTsKICB2YXIgcHJveHkgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICBrZXkgaW4gUmVnRXhwV3JhcHBlciB8fCBkZWZpbmVQcm9wZXJ0eShSZWdFeHBXcmFwcGVyLCBrZXksIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5hdGl2ZVJlZ0V4cFtrZXldOyB9LAogICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBOYXRpdmVSZWdFeHBba2V5XSA9IGl0OyB9CiAgICB9KTsKICB9OwogIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVSZWdFeHApOwogIHZhciBpbmRleCA9IDA7CiAgd2hpbGUgKGtleXMubGVuZ3RoID4gaW5kZXgpIHByb3h5KGtleXNbaW5kZXgrK10pOwogIFJlZ0V4cFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlZ0V4cFdyYXBwZXI7CiAgUmVnRXhwV3JhcHBlci5wcm90b3R5cGUgPSBSZWdFeHBQcm90b3R5cGU7CiAgcmVkZWZpbmUoZ2xvYmFsLCAnUmVnRXhwJywgUmVnRXhwV3JhcHBlcik7Cn0KCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAtQEBzcGVjaWVzCnNldFNwZWNpZXMoJ1JlZ0V4cCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBleGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcyIpOwoKJCh7IHRhcmdldDogJ1JlZ0V4cCcsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IC8uLy5leGVjICE9PSBleGVjIH0sIHsKICBleGVjOiBleGVjCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZmxhZ3MuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZmxhZ3MuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBvYmplY3REZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciByZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qcyIpOwoKLy8gYFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NgIGdldHRlcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXQtcmVnZXhwLnByb3RvdHlwZS5mbGFncwppZiAoREVTQ1JJUFRPUlMgJiYgLy4vZy5mbGFncyAhPSAnZycpIHsKICBvYmplY3REZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogcmVnRXhwRmxhZ3MKICB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgZmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKCnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnOwp2YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTsKdmFyIG5hdGl2ZVRvU3RyaW5nID0gUmVnRXhwUHJvdG90eXBlW1RPX1NUUklOR107Cgp2YXIgTk9UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVUb1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT0gJy9hL2InOyB9KTsKLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWUKdmFyIElOQ09SUkVDVF9OQU1FID0gbmF0aXZlVG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkc7CgovLyBgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmcKaWYgKE5PVF9HRU5FUklDIHx8IElOQ09SUkVDVF9OQU1FKSB7CiAgcmVkZWZpbmUoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHsKICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgcCA9IFN0cmluZyhSLnNvdXJjZSk7CiAgICB2YXIgcmYgPSBSLmZsYWdzOwogICAgdmFyIGYgPSBTdHJpbmcocmYgPT09IHVuZGVmaW5lZCAmJiBSIGluc3RhbmNlb2YgUmVnRXhwICYmICEoJ2ZsYWdzJyBpbiBSZWdFeHBQcm90b3R5cGUpID8gZmxhZ3MuY2FsbChSKSA6IHJmKTsKICAgIHJldHVybiAnLycgKyBwICsgJy8nICsgZjsKICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIpOwp2YXIgY29sbGVjdGlvblN0cm9uZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcuanMiKTsKCi8vIGBTZXRgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNldC1vYmplY3RzCm1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignU2V0JywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTsKfSwgY29sbGVjdGlvblN0cm9uZyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hbmNob3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmFuY2hvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuYW5jaG9yYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5hbmNob3IKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2FuY2hvcicpIH0sIHsKICBhbmNob3I6IGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICduYW1lJywgbmFtZSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJpZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYmlnLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5iaWdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmJpZwokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYmlnJykgfSwgewogIGJpZzogZnVuY3Rpb24gYmlnKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JpZycsICcnLCAnJyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJsaW5rLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJsaW5rLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmJsaW5rYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5ibGluawokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYmxpbmsnKSB9LCB7CiAgYmxpbms6IGZ1bmN0aW9uIGJsaW5rKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYm9sZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJvbGQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5ib2xkYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5ib2xkCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdib2xkJykgfSwgewogIGJvbGQ6IGZ1bmN0aW9uIGJvbGQoKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYicsICcnLCAnJyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY29kZUF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiKS5jb2RlQXQ7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXQKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHsKICBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKSB7CiAgICByZXR1cm4gY29kZUF0KHRoaXMsIHBvcyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgbm90QVJlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3QtYS1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcyIpOwp2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIpOwp2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKCnZhciBuYXRpdmVFbmRzV2l0aCA9ICcnLmVuZHNXaXRoOwp2YXIgbWluID0gTWF0aC5taW47Cgp2YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnZW5kc1dpdGgnKTsKLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDIKdmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7CiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ2VuZHNXaXRoJyk7CiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7Cn0oKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5lbmRzd2l0aAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUcgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDIH0sIHsKICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7CiAgICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTsKICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOwogICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTsKICAgIHZhciBlbmQgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogbWluKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTsKICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aAogICAgICA/IG5hdGl2ZUVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpCiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZpeGVkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZpeGVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmZpeGVkYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5maXhlZAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnZml4ZWQnKSB9LCB7CiAgZml4ZWQ6IGZ1bmN0aW9uIGZpeGVkKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3R0JywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZm9udGNvbG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250Y29sb3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmZvbnRjb2xvcmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmb250Y29sb3InKSB9LCB7CiAgZm9udGNvbG9yOiBmdW5jdGlvbiBmb250Y29sb3IoY29sb3IpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ2NvbG9yJywgY29sb3IpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5mb250c2l6ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udHNpemUKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2ZvbnRzaXplJykgfSwgewogIGZvbnRzaXplOiBmdW5jdGlvbiBmb250c2l6ZShzaXplKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7Cgp2YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTsKdmFyIG5hdGl2ZUZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDsKCi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW0KdmFyIElOQ09SUkVDVF9MRU5HVEggPSAhIW5hdGl2ZUZyb21Db2RlUG9pbnQgJiYgbmF0aXZlRnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMTsKCi8vIGBTdHJpbmcuZnJvbUNvZGVQb2ludGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5mcm9tY29kZXBvaW50CiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9MRU5HVEggfSwgewogIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgdmFyIGkgPSAwOwogICAgdmFyIGNvZGU7CiAgICB3aGlsZSAobGVuZ3RoID4gaSkgewogICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdOwogICAgICBpZiAodG9BYnNvbHV0ZUluZGV4KGNvZGUsIDB4MTBGRkZGKSAhPT0gY29kZSkgdGhyb3cgUmFuZ2VFcnJvcihjb2RlICsgJyBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Jyk7CiAgICAgIGVsZW1lbnRzLnB1c2goY29kZSA8IDB4MTAwMDAKICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKQogICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsIGNvZGUgJSAweDQwMCArIDB4REMwMCkKICAgICAgKTsKICAgIH0gcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBub3RBUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcwokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHsKICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7CiAgICByZXR1cm4gISF+U3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpCiAgICAgIC5pbmRleE9mKG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRhbGljcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLml0YWxpY3NgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLml0YWxpY3MKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2l0YWxpY3MnKSB9LCB7CiAgaXRhbGljczogZnVuY3Rpb24gaXRhbGljcygpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdpJywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgY2hhckF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiKS5jaGFyQXQ7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwp2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiKTsKCnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpOwoKLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3IKZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7CiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsCiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksCiAgICBpbmRleDogMAogIH0pOwovLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0Cn0sIGZ1bmN0aW9uIG5leHQoKSB7CiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nOwogIHZhciBpbmRleCA9IHN0YXRlLmluZGV4OwogIHZhciBwb2ludDsKICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpOwogIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDsKICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubGluay5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmxpbmsuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5saW5rYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5saW5rCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdsaW5rJykgfSwgewogIGxpbms6IGZ1bmN0aW9uIGxpbmsodXJsKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICdocmVmJywgdXJsKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2gtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiKTsKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIik7CnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwp2YXIgZ2V0UmVnRXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIE1BVENIX0FMTCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2hBbGwnKTsKdmFyIFJFR0VYUF9TVFJJTkcgPSAnUmVnRXhwIFN0cmluZyc7CnZhciBSRUdFWFBfU1RSSU5HX0lURVJBVE9SID0gUkVHRVhQX1NUUklORyArICcgSXRlcmF0b3InOwp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFJFR0VYUF9TVFJJTkdfSVRFUkFUT1IpOwp2YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTsKdmFyIHJlZ0V4cEJ1aWx0aW5FeGVjID0gUmVnRXhwUHJvdG90eXBlLmV4ZWM7CnZhciBuYXRpdmVNYXRjaEFsbCA9ICcnLm1hdGNoQWxsOwoKdmFyIFdPUktTX1dJVEhfTk9OX0dMT0JBTF9SRUdFWCA9ICEhbmF0aXZlTWF0Y2hBbGwgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICAnYScubWF0Y2hBbGwoLy4vKTsKfSk7Cgp2YXIgcmVnRXhwRXhlYyA9IGZ1bmN0aW9uIChSLCBTKSB7CiAgdmFyIGV4ZWMgPSBSLmV4ZWM7CiAgdmFyIHJlc3VsdDsKICBpZiAodHlwZW9mIGV4ZWMgPT0gJ2Z1bmN0aW9uJykgewogICAgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpOwogICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ29iamVjdCcpIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGV4ZWMgcmVzdWx0Jyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0gcmV0dXJuIHJlZ0V4cEJ1aWx0aW5FeGVjLmNhbGwoUiwgUyk7Cn07CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlbgp2YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBSZWdFeHBTdHJpbmdJdGVyYXRvcihyZWdleHAsIHN0cmluZywgZ2xvYmFsLCBmdWxsVW5pY29kZSkgewogIHNldEludGVybmFsU3RhdGUodGhpcywgewogICAgdHlwZTogUkVHRVhQX1NUUklOR19JVEVSQVRPUiwKICAgIHJlZ2V4cDogcmVnZXhwLAogICAgc3RyaW5nOiBzdHJpbmcsCiAgICBnbG9iYWw6IGdsb2JhbCwKICAgIHVuaWNvZGU6IGZ1bGxVbmljb2RlLAogICAgZG9uZTogZmFsc2UKICB9KTsKfSwgUkVHRVhQX1NUUklORywgZnVuY3Rpb24gbmV4dCgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogIGlmIChzdGF0ZS5kb25lKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07CiAgdmFyIFIgPSBzdGF0ZS5yZWdleHA7CiAgdmFyIFMgPSBzdGF0ZS5zdHJpbmc7CiAgdmFyIG1hdGNoID0gcmVnRXhwRXhlYyhSLCBTKTsKICBpZiAobWF0Y2ggPT09IG51bGwpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHN0YXRlLmRvbmUgPSB0cnVlIH07CiAgaWYgKHN0YXRlLmdsb2JhbCkgewogICAgaWYgKFN0cmluZyhtYXRjaFswXSkgPT0gJycpIFIubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKFIubGFzdEluZGV4KSwgc3RhdGUudW5pY29kZSk7CiAgICByZXR1cm4geyB2YWx1ZTogbWF0Y2gsIGRvbmU6IGZhbHNlIH07CiAgfQogIHN0YXRlLmRvbmUgPSB0cnVlOwogIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogZmFsc2UgfTsKfSk7Cgp2YXIgJG1hdGNoQWxsID0gZnVuY3Rpb24gKHN0cmluZykgewogIHZhciBSID0gYW5PYmplY3QodGhpcyk7CiAgdmFyIFMgPSBTdHJpbmcoc3RyaW5nKTsKICB2YXIgQywgZmxhZ3NWYWx1ZSwgZmxhZ3MsIG1hdGNoZXIsIGdsb2JhbCwgZnVsbFVuaWNvZGU7CiAgQyA9IHNwZWNpZXNDb25zdHJ1Y3RvcihSLCBSZWdFeHApOwogIGZsYWdzVmFsdWUgPSBSLmZsYWdzOwogIGlmIChmbGFnc1ZhbHVlID09PSB1bmRlZmluZWQgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlKSkgewogICAgZmxhZ3NWYWx1ZSA9IGdldFJlZ0V4cEZsYWdzLmNhbGwoUik7CiAgfQogIGZsYWdzID0gZmxhZ3NWYWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZmxhZ3NWYWx1ZSk7CiAgbWF0Y2hlciA9IG5ldyBDKEMgPT09IFJlZ0V4cCA/IFIuc291cmNlIDogUiwgZmxhZ3MpOwogIGdsb2JhbCA9ICEhfmZsYWdzLmluZGV4T2YoJ2cnKTsKICBmdWxsVW5pY29kZSA9ICEhfmZsYWdzLmluZGV4T2YoJ3UnKTsKICBtYXRjaGVyLmxhc3RJbmRleCA9IHRvTGVuZ3RoKFIubGFzdEluZGV4KTsKICByZXR1cm4gbmV3ICRSZWdFeHBTdHJpbmdJdGVyYXRvcihtYXRjaGVyLCBTLCBnbG9iYWwsIGZ1bGxVbmljb2RlKTsKfTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLW1hdGNoYWxsCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXT1JLU19XSVRIX05PTl9HTE9CQUxfUkVHRVggfSwgewogIG1hdGNoQWxsOiBmdW5jdGlvbiBtYXRjaEFsbChyZWdleHApIHsKICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTsKICAgIHZhciBmbGFncywgUywgbWF0Y2hlciwgcng7CiAgICBpZiAocmVnZXhwICE9IG51bGwpIHsKICAgICAgaWYgKGlzUmVnRXhwKHJlZ2V4cCkpIHsKICAgICAgICBmbGFncyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlCiAgICAgICAgICA/IHJlZ2V4cC5mbGFncwogICAgICAgICAgOiBnZXRSZWdFeHBGbGFncy5jYWxsKHJlZ2V4cCkKICAgICAgICApKTsKICAgICAgICBpZiAoIX5mbGFncy5pbmRleE9mKCdnJykpIHRocm93IFR5cGVFcnJvcignYC5tYXRjaEFsbGAgZG9lcyBub3QgYWxsb3cgbm9uLWdsb2JhbCByZWdleGVzJyk7CiAgICAgIH0KICAgICAgaWYgKFdPUktTX1dJVEhfTk9OX0dMT0JBTF9SRUdFWCkgcmV0dXJuIG5hdGl2ZU1hdGNoQWxsLmFwcGx5KE8sIGFyZ3VtZW50cyk7CiAgICAgIG1hdGNoZXIgPSByZWdleHBbTUFUQ0hfQUxMXTsKICAgICAgaWYgKG1hdGNoZXIgPT09IHVuZGVmaW5lZCAmJiBJU19QVVJFICYmIGNsYXNzb2YocmVnZXhwKSA9PSAnUmVnRXhwJykgbWF0Y2hlciA9ICRtYXRjaEFsbDsKICAgICAgaWYgKG1hdGNoZXIgIT0gbnVsbCkgcmV0dXJuIGFGdW5jdGlvbihtYXRjaGVyKS5jYWxsKHJlZ2V4cCwgTyk7CiAgICB9IGVsc2UgaWYgKFdPUktTX1dJVEhfTk9OX0dMT0JBTF9SRUdFWCkgcmV0dXJuIG5hdGl2ZU1hdGNoQWxsLmFwcGx5KE8sIGFyZ3VtZW50cyk7CiAgICBTID0gU3RyaW5nKE8pOwogICAgcnggPSBuZXcgUmVnRXhwKHJlZ2V4cCwgJ2cnKTsKICAgIHJldHVybiBJU19QVVJFID8gJG1hdGNoQWxsLmNhbGwocngsIFMpIDogcnhbTUFUQ0hfQUxMXShTKTsKICB9Cn0pOwoKSVNfUFVSRSB8fCBNQVRDSF9BTEwgaW4gUmVnRXhwUHJvdG90eXBlIHx8IGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShSZWdFeHBQcm90b3R5cGUsIE1BVENIX0FMTCwgJG1hdGNoQWxsKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIpOwp2YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcyIpOwp2YXIgcmVnRXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiKTsKCi8vIEBAbWF0Y2ggbG9naWMKZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ21hdGNoJywgMSwgZnVuY3Rpb24gKE1BVENILCBuYXRpdmVNYXRjaCwgbWF5YmVDYWxsTmF0aXZlKSB7CiAgcmV0dXJuIFsKICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2QKICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2gKICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkgewogICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7CiAgICAgIHZhciBtYXRjaGVyID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07CiAgICAgIHJldHVybiBtYXRjaGVyICE9PSB1bmRlZmluZWQgPyBtYXRjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTsKICAgIH0sCiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2gKICAgIGZ1bmN0aW9uIChyZWdleHApIHsKICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNYXRjaCwgcmVnZXhwLCB0aGlzKTsKICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlOwoKICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTsKICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7CgogICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpOwoKICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTsKICAgICAgcngubGFzdEluZGV4ID0gMDsKICAgICAgdmFyIEEgPSBbXTsKICAgICAgdmFyIG4gPSAwOwogICAgICB2YXIgcmVzdWx0OwogICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkgewogICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pOwogICAgICAgIEFbbl0gPSBtYXRjaFN0cjsKICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpOwogICAgICAgIG4rKzsKICAgICAgfQogICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBOwogICAgfQogIF07Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLWVuZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1lbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkcGFkRW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiKS5lbmQ7CnZhciBXRUJLSVRfQlVHID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1ZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZGVuZAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogV0VCS0lUX0JVRyB9LCB7CiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykgewogICAgcmV0dXJuICRwYWRFbmQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLXN0YXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkcGFkU3RhcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXBhZC5qcyIpLnN0YXJ0Owp2YXIgV0VCS0lUX0JVRyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWJraXQtc3RyaW5nLXBhZC1idWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1Zy5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0CiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXRUJLSVRfQlVHIH0sIHsKICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykgewogICAgcmV0dXJuICRwYWRTdGFydCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmF3LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yYXcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CgovLyBgU3RyaW5nLnJhd2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5yYXcKJCh7IHRhcmdldDogJ1N0cmluZycsIHN0YXQ6IHRydWUgfSwgewogIHJhdzogZnVuY3Rpb24gcmF3KHRlbXBsYXRlKSB7CiAgICB2YXIgcmF3VGVtcGxhdGUgPSB0b0luZGV4ZWRPYmplY3QodGVtcGxhdGUucmF3KTsKICAgIHZhciBsaXRlcmFsU2VnbWVudHMgPSB0b0xlbmd0aChyYXdUZW1wbGF0ZS5sZW5ndGgpOwogICAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHZhciBpID0gMDsKICAgIHdoaWxlIChsaXRlcmFsU2VnbWVudHMgPiBpKSB7CiAgICAgIGVsZW1lbnRzLnB1c2goU3RyaW5nKHJhd1RlbXBsYXRlW2krK10pKTsKICAgICAgaWYgKGkgPCBhcmd1bWVudHNMZW5ndGgpIGVsZW1lbnRzLnB1c2goU3RyaW5nKGFyZ3VtZW50c1tpXSkpOwogICAgfSByZXR1cm4gZWxlbWVudHMuam9pbignJyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwZWF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciByZXBlYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUucmVwZWF0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXQKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHsKICByZXBlYXQ6IHJlcGVhdAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKdmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanMiKTsKdmFyIHJlZ0V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzIik7Cgp2YXIgbWF4ID0gTWF0aC5tYXg7CnZhciBtaW4gPSBNYXRoLm1pbjsKdmFyIGZsb29yID0gTWF0aC5mbG9vcjsKdmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTID0gL1wkKFskJidgXXxcZFxkP3w8W14+XSo+KS9nOwp2YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQgPSAvXCQoWyQmJ2BdfFxkXGQ/KS9nOwoKdmFyIG1heWJlVG9TdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTsKfTsKCi8vIEBAcmVwbGFjZSBsb2dpYwpmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygncmVwbGFjZScsIDIsIGZ1bmN0aW9uIChSRVBMQUNFLCBuYXRpdmVSZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUpIHsKICByZXR1cm4gWwogICAgLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2UKICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkgewogICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7CiAgICAgIHZhciByZXBsYWNlciA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdOwogICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZAogICAgICAgID8gcmVwbGFjZXIuY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKQogICAgICAgIDogbmF0aXZlUmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7CiAgICB9LAogICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAcmVwbGFjZQogICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7CiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlUmVwbGFjZSwgcmVnZXhwLCB0aGlzLCByZXBsYWNlVmFsdWUpOwogICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7CgogICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApOwogICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTsKCiAgICAgIHZhciBmdW5jdGlvbmFsUmVwbGFjZSA9IHR5cGVvZiByZXBsYWNlVmFsdWUgPT09ICdmdW5jdGlvbic7CiAgICAgIGlmICghZnVuY3Rpb25hbFJlcGxhY2UpIHJlcGxhY2VWYWx1ZSA9IFN0cmluZyhyZXBsYWNlVmFsdWUpOwoKICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDsKICAgICAgaWYgKGdsb2JhbCkgewogICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7CiAgICAgICAgcngubGFzdEluZGV4ID0gMDsKICAgICAgfQogICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTsKICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhazsKCiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrOwoKICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTsKICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpOwogICAgICB9CgogICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJzsKICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07CgogICAgICAgIHZhciBtYXRjaGVkID0gU3RyaW5nKHJlc3VsdFswXSk7CiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTsKICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTsKICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKQogICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpbgogICAgICAgIC8vIHRoZSBzbGljZSBwb2x5ZmlsbCB3aGVuIHNsaWNpbmcgbmF0aXZlIGFycmF5cykgImRvZXNuJ3Qgd29yayIgaW4gc2FmYXJpIDkgYW5kCiAgICAgICAgLy8gY2F1c2VzIGEgY3Jhc2ggKGh0dHBzOi8vcGFzdGViaW4uY29tL04yMVF6ZVFBKSB3aGVuIHRyeWluZyB0byBkZWJ1ZyBpdC4KICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpOwogICAgICAgIHZhciBuYW1lZENhcHR1cmVzID0gcmVzdWx0Lmdyb3VwczsKICAgICAgICBpZiAoZnVuY3Rpb25hbFJlcGxhY2UpIHsKICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7CiAgICAgICAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSByZXBsYWNlckFyZ3MucHVzaChuYW1lZENhcHR1cmVzKTsKICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IFN0cmluZyhyZXBsYWNlVmFsdWUuYXBwbHkodW5kZWZpbmVkLCByZXBsYWNlckFyZ3MpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpOwogICAgICAgIH0KICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7CiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7CiAgICAgICAgICBuZXh0U291cmNlUG9zaXRpb24gPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYWNjdW11bGF0ZWRSZXN1bHQgKyBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbik7CiAgICB9CiAgXTsKCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0c3Vic3RpdHV0aW9uCiAgZnVuY3Rpb24gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkgewogICAgdmFyIHRhaWxQb3MgPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoOwogICAgdmFyIG0gPSBjYXB0dXJlcy5sZW5ndGg7CiAgICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEOwogICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgewogICAgICBuYW1lZENhcHR1cmVzID0gdG9PYmplY3QobmFtZWRDYXB0dXJlcyk7CiAgICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUzsKICAgIH0KICAgIHJldHVybiBuYXRpdmVSZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHsKICAgICAgdmFyIGNhcHR1cmU7CiAgICAgIHN3aXRjaCAoY2guY2hhckF0KDApKSB7CiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7CiAgICAgICAgY2FzZSAnJic6IHJldHVybiBtYXRjaGVkOwogICAgICAgIGNhc2UgJ2AnOiByZXR1cm4gc3RyLnNsaWNlKDAsIHBvc2l0aW9uKTsKICAgICAgICBjYXNlICInIjogcmV0dXJuIHN0ci5zbGljZSh0YWlsUG9zKTsKICAgICAgICBjYXNlICc8JzoKICAgICAgICAgIGNhcHR1cmUgPSBuYW1lZENhcHR1cmVzW2NoLnNsaWNlKDEsIC0xKV07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OiAvLyBcZFxkPwogICAgICAgICAgdmFyIG4gPSArY2g7CiAgICAgICAgICBpZiAobiA9PT0gMCkgcmV0dXJuIG1hdGNoOwogICAgICAgICAgaWYgKG4gPiBtKSB7CiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTsKICAgICAgICAgICAgaWYgKGYgPT09IDApIHJldHVybiBtYXRjaDsKICAgICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2guY2hhckF0KDEpIDogY2FwdHVyZXNbZiAtIDFdICsgY2guY2hhckF0KDEpOwogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICB9CiAgICAgICAgICBjYXB0dXJlID0gY2FwdHVyZXNbbiAtIDFdOwogICAgICB9CiAgICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7CiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zZWFyY2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBzYW1lVmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2FtZS12YWx1ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS5qcyIpOwp2YXIgcmVnRXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiKTsKCi8vIEBAc2VhcmNoIGxvZ2ljCmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoU0VBUkNILCBuYXRpdmVTZWFyY2gsIG1heWJlQ2FsbE5hdGl2ZSkgewogIHJldHVybiBbCiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zZWFyY2hgIG1ldGhvZAogICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zZWFyY2gKICAgIGZ1bmN0aW9uIHNlYXJjaChyZWdleHApIHsKICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpOwogICAgICB2YXIgc2VhcmNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07CiAgICAgIHJldHVybiBzZWFyY2hlciAhPT0gdW5kZWZpbmVkID8gc2VhcmNoZXIuY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW1NFQVJDSF0oU3RyaW5nKE8pKTsKICAgIH0sCiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF1gIG1ldGhvZAogICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNlYXJjaAogICAgZnVuY3Rpb24gKHJlZ2V4cCkgewogICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVNlYXJjaCwgcmVnZXhwLCB0aGlzKTsKICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlOwoKICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTsKICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7CgogICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7CiAgICAgIGlmICghc2FtZVZhbHVlKHByZXZpb3VzTGFzdEluZGV4LCAwKSkgcngubGFzdEluZGV4ID0gMDsKICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpOwogICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7CiAgICAgIHJldHVybiByZXN1bHQgPT09IG51bGwgPyAtMSA6IHJlc3VsdC5pbmRleDsKICAgIH0KICBdOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLnNtYWxsYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zbWFsbAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc21hbGwnKSB9LCB7CiAgc21hbGw6IGZ1bmN0aW9uIHNtYWxsKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3NtYWxsJywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyIpOwp2YXIgaXNSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcmVnZXhwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGNhbGxSZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdC5qcyIpOwp2YXIgcmVnZXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIGFycmF5UHVzaCA9IFtdLnB1c2g7CnZhciBtaW4gPSBNYXRoLm1pbjsKdmFyIE1BWF9VSU5UMzIgPSAweEZGRkZGRkZGOwoKLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3IKdmFyIFNVUFBPUlRTX1kgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeyByZXR1cm4gIVJlZ0V4cChNQVhfVUlOVDMyLCAneScpOyB9KTsKCi8vIEBAc3BsaXQgbG9naWMKZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ3NwbGl0JywgMiwgZnVuY3Rpb24gKFNQTElULCBuYXRpdmVTcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7CiAgdmFyIGludGVybmFsU3BsaXQ7CiAgaWYgKAogICAgJ2FiYmMnLnNwbGl0KC8oYikqLylbMV0gPT0gJ2MnIHx8CiAgICAndGVzdCcuc3BsaXQoLyg/OikvLCAtMSkubGVuZ3RoICE9IDQgfHwKICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT0gMiB8fAogICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPSA0IHx8CiAgICAnLicuc3BsaXQoLygpKCkvKS5sZW5ndGggPiAxIHx8CiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGgKICApIHsKICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdAogICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7CiAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7CiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwOwogICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107CiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtzdHJpbmddOwogICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdAogICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHsKICAgICAgICByZXR1cm4gbmF0aXZlU3BsaXQuY2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltKTsKICAgICAgfQogICAgICB2YXIgb3V0cHV0ID0gW107CiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArCiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICsKICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICsKICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7CiAgICAgIHZhciBsYXN0TGFzdEluZGV4ID0gMDsKICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHkKICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTsKICAgICAgdmFyIG1hdGNoLCBsYXN0SW5kZXgsIGxhc3RMZW5ndGg7CiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7CiAgICAgICAgbGFzdEluZGV4ID0gc2VwYXJhdG9yQ29weS5sYXN0SW5kZXg7CiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHsKICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpOwogICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmcubGVuZ3RoKSBhcnJheVB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDsKICAgICAgICAgIGlmIChvdXRwdXQubGVuZ3RoID49IGxpbSkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AKICAgICAgfQogICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nLmxlbmd0aCkgewogICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7CiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpOwogICAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbSA/IG91dHB1dC5zbGljZSgwLCBsaW0pIDogb3V0cHV0OwogICAgfTsKICAvLyBDaGFrcmEsIFY4CiAgfSBlbHNlIGlmICgnMCcuc3BsaXQodW5kZWZpbmVkLCAwKS5sZW5ndGgpIHsKICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkgewogICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6IG5hdGl2ZVNwbGl0LmNhbGwodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7CiAgICB9OwogIH0gZWxzZSBpbnRlcm5hbFNwbGl0ID0gbmF0aXZlU3BsaXQ7CgogIHJldHVybiBbCiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0CiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7CiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTsKICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07CiAgICAgIHJldHVybiBzcGxpdHRlciAhPT0gdW5kZWZpbmVkCiAgICAgICAgPyBzcGxpdHRlci5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpCiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTsKICAgIH0sCiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXQKICAgIC8vCiAgICAvLyBOT1RFOiBUaGlzIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIGVuZ2luZXMgdGhhdCBkb24ndCBzdXBwb3J0CiAgICAvLyB0aGUgJ3knIGZsYWcuCiAgICBmdW5jdGlvbiAocmVnZXhwLCBsaW1pdCkgewogICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJlZ2V4cCwgdGhpcywgbGltaXQsIGludGVybmFsU3BsaXQgIT09IG5hdGl2ZVNwbGl0KTsKICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlOwoKICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTsKICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7CiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApOwoKICAgICAgdmFyIHVuaWNvZGVNYXRjaGluZyA9IHJ4LnVuaWNvZGU7CiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICsKICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArCiAgICAgICAgICAgICAgICAgIChyeC51bmljb2RlID8gJ3UnIDogJycpICsKICAgICAgICAgICAgICAgICAgKFNVUFBPUlRTX1kgPyAneScgOiAnZycpOwoKICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIFMgc2xpY2luZywgdG8KICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLgogICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTsKICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7CiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTsKICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107CiAgICAgIHZhciBwID0gMDsKICAgICAgdmFyIHEgPSAwOwogICAgICB2YXIgQSA9IFtdOwogICAgICB3aGlsZSAocSA8IFMubGVuZ3RoKSB7CiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gU1VQUE9SVFNfWSA/IHEgOiAwOwogICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7CiAgICAgICAgdmFyIGU7CiAgICAgICAgaWYgKAogICAgICAgICAgeiA9PT0gbnVsbCB8fAogICAgICAgICAgKGUgPSBtaW4odG9MZW5ndGgoc3BsaXR0ZXIubGFzdEluZGV4ICsgKFNVUFBPUlRTX1kgPyAwIDogcSkpLCBTLmxlbmd0aCkpID09PSBwCiAgICAgICAgKSB7CiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTsKICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTsKICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHoubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIEEucHVzaCh6W2ldKTsKICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBOwogICAgICAgICAgfQogICAgICAgICAgcSA9IHAgPSBlOwogICAgICAgIH0KICAgICAgfQogICAgICBBLnB1c2goUy5zbGljZShwKSk7CiAgICAgIHJldHVybiBBOwogICAgfQogIF07Cn0sICFTVVBQT1JUU19ZKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIikuZjsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBub3RBUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIG5hdGl2ZVN0YXJ0c1dpdGggPSAnJy5zdGFydHNXaXRoOwp2YXIgbWluID0gTWF0aC5taW47Cgp2YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpOwovLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMgp2YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHsKICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpOwogIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlOwp9KCk7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdGFydHN3aXRoCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwgewogIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7CiAgICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTsKICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKG1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKTsKICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoCiAgICAgID8gbmF0aXZlU3RhcnRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgaW5kZXgpCiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdHJpa2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuc3RyaWtlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdHJpa2UKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N0cmlrZScpIH0sIHsKICBzdHJpa2U6IGZ1bmN0aW9uIHN0cmlrZSgpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdHJpa2UnLCAnJywgJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdWIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1Yi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuc3ViYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdWIKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N1YicpIH0sIHsKICBzdWI6IGZ1bmN0aW9uIHN1YigpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdWInLCAnJywgJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1cC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuc3VwYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdXAKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N1cCcpIH0sIHsKICBzdXA6IGZ1bmN0aW9uIHN1cCgpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkdHJpbUVuZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiKS5lbmQ7CnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QuanMiKTsKCnZhciBGT1JDRUQgPSBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltRW5kJyk7Cgp2YXIgdHJpbUVuZCA9IEZPUkNFRCA/IGZ1bmN0aW9uIHRyaW1FbmQoKSB7CiAgcmV0dXJuICR0cmltRW5kKHRoaXMpOwp9IDogJycudHJpbUVuZDsKCi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUVuZCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHMKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIHRyaW1FbmQ6IHRyaW1FbmQsCiAgdHJpbVJpZ2h0OiB0cmltRW5kCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1zdGFydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tc3RhcnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkdHJpbVN0YXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIpLnN0YXJ0Owp2YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kLmpzIik7Cgp2YXIgRk9SQ0VEID0gZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbVN0YXJ0Jyk7Cgp2YXIgdHJpbVN0YXJ0ID0gRk9SQ0VEID8gZnVuY3Rpb24gdHJpbVN0YXJ0KCkgewogIHJldHVybiAkdHJpbVN0YXJ0KHRoaXMpOwp9IDogJycudHJpbVN0YXJ0OwoKLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltU3RhcnQsIHRyaW1MZWZ0IH1gIG1ldGhvZHMKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIHRyaW1TdGFydDogdHJpbVN0YXJ0LAogIHRyaW1MZWZ0OiB0cmltU3RhcnQKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICR0cmltID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIpLnRyaW07CnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW0KJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW0nKSB9LCB7CiAgdHJpbTogZnVuY3Rpb24gdHJpbSgpIHsKICAgIHJldHVybiAkdHJpbSh0aGlzKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmFzeW5jSXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5hc3luY2l0ZXJhdG9yCmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Ci8vIGBTeW1ib2wucHJvdG90eXBlLmRlc2NyaXB0aW9uYCBnZXR0ZXIKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKdmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiKTsKCnZhciBOYXRpdmVTeW1ib2wgPSBnbG9iYWwuU3ltYm9sOwoKaWYgKERFU0NSSVBUT1JTICYmIHR5cGVvZiBOYXRpdmVTeW1ib2wgPT0gJ2Z1bmN0aW9uJyAmJiAoISgnZGVzY3JpcHRpb24nIGluIE5hdGl2ZVN5bWJvbC5wcm90b3R5cGUpIHx8CiAgLy8gU2FmYXJpIDEyIGJ1ZwogIE5hdGl2ZVN5bWJvbCgpLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQKKSkgewogIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTsKICAvLyB3cmFwIFN5bWJvbCBjb25zdHJ1Y3RvciBmb3IgY29ycmVjdCB3b3JrIHdpdGggdW5kZWZpbmVkIGRlc2NyaXB0aW9uCiAgdmFyIFN5bWJvbFdyYXBwZXIgPSBmdW5jdGlvbiBTeW1ib2woKSB7CiAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0cmluZyhhcmd1bWVudHNbMF0pOwogICAgdmFyIHJlc3VsdCA9IHRoaXMgaW5zdGFuY2VvZiBTeW1ib2xXcmFwcGVyCiAgICAgID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbikKICAgICAgLy8gaW4gRWRnZSAxMywgU3RyaW5nKFN5bWJvbCh1bmRlZmluZWQpKSA9PT0gJ1N5bWJvbCh1bmRlZmluZWQpJwogICAgICA6IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyBOYXRpdmVTeW1ib2woKSA6IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbik7CiAgICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKSBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmVbcmVzdWx0XSA9IHRydWU7CiAgICByZXR1cm4gcmVzdWx0OwogIH07CiAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpOwogIHZhciBzeW1ib2xQcm90b3R5cGUgPSBTeW1ib2xXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZVN5bWJvbC5wcm90b3R5cGU7CiAgc3ltYm9sUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ltYm9sV3JhcHBlcjsKCiAgdmFyIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG90eXBlLnRvU3RyaW5nOwogIHZhciBuYXRpdmUgPSBTdHJpbmcoTmF0aXZlU3ltYm9sKCd0ZXN0JykpID09ICdTeW1ib2wodGVzdCknOwogIHZhciByZWdleHAgPSAvXlN5bWJvbFwoKC4qKVwpW14pXSskLzsKICBkZWZpbmVQcm9wZXJ0eShzeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CiAgICAgIHZhciBzeW1ib2wgPSBpc09iamVjdCh0aGlzKSA/IHRoaXMudmFsdWVPZigpIDogdGhpczsKICAgICAgdmFyIHN0cmluZyA9IHN5bWJvbFRvU3RyaW5nLmNhbGwoc3ltYm9sKTsKICAgICAgaWYgKGhhcyhFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUsIHN5bWJvbCkpIHJldHVybiAnJzsKICAgICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTsKICAgICAgcmV0dXJuIGRlc2MgPT09ICcnID8gdW5kZWZpbmVkIDogZGVzYzsKICAgIH0KICB9KTsKCiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHsKICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlcgogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmhhc0luc3RhbmNlYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaGFzaW5zdGFuY2UKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdoYXNJbnN0YW5jZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmlzY29uY2F0c3ByZWFkYWJsZQpkZWZpbmVXZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLml0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXRlcmF0b3IKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIik7CnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKdmFyIG5hdGl2ZU9iamVjdENyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKTsKdmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiKTsKdmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7CnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIpOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKdmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyICRmb3JFYWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLmpzIikuZm9yRWFjaDsKCnZhciBISURERU4gPSBzaGFyZWRLZXkoJ2hpZGRlbicpOwp2YXIgU1lNQk9MID0gJ1N5bWJvbCc7CnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKdmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpOwp2YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0W1BST1RPVFlQRV07CnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKdmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7CnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7CnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7CnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7CnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7CnZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7CnZhciBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5Jyk7CnZhciBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5Jyk7CnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwp2YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0OwovLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzMKdmFyIFVTRV9TRVRURVIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkOwoKLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3CnZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywgewogICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfQogIH0pKS5hICE9IDc7Cn0pID8gZnVuY3Rpb24gKE8sIFAsIEF0dHJpYnV0ZXMpIHsKICB2YXIgT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3RQcm90b3R5cGUsIFApOwogIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKSBkZWxldGUgT2JqZWN0UHJvdG90eXBlW1BdOwogIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpOwogIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yICYmIE8gIT09IE9iamVjdFByb3RvdHlwZSkgewogICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTsKICB9Cn0gOiBuYXRpdmVEZWZpbmVQcm9wZXJ0eTsKCnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZywgZGVzY3JpcHRpb24pIHsKICB2YXIgc3ltYm9sID0gQWxsU3ltYm9sc1t0YWddID0gbmF0aXZlT2JqZWN0Q3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7CiAgc2V0SW50ZXJuYWxTdGF0ZShzeW1ib2wsIHsKICAgIHR5cGU6IFNZTUJPTCwKICAgIHRhZzogdGFnLAogICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uCiAgfSk7CiAgaWYgKCFERVNDUklQVE9SUykgc3ltYm9sLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CiAgcmV0dXJuIHN5bWJvbDsKfTsKCnZhciBpc1N5bWJvbCA9IE5BVElWRV9TWU1CT0wgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnOwp9IDogZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIE9iamVjdChpdCkgaW5zdGFuY2VvZiAkU3ltYm9sOwp9OwoKdmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHsKICBpZiAoTyA9PT0gT2JqZWN0UHJvdG90eXBlKSAkZGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCwgQXR0cmlidXRlcyk7CiAgYW5PYmplY3QoTyk7CiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKFAsIHRydWUpOwogIGFuT2JqZWN0KEF0dHJpYnV0ZXMpOwogIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkgewogICAgaWYgKCFBdHRyaWJ1dGVzLmVudW1lcmFibGUpIHsKICAgICAgaWYgKCFoYXMoTywgSElEREVOKSkgbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgSElEREVOLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwge30pKTsKICAgICAgT1tISURERU5dW2tleV0gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGhhcyhPLCBISURERU4pICYmIE9bSElEREVOXVtrZXldKSBPW0hJRERFTl1ba2V5XSA9IGZhbHNlOwogICAgICBBdHRyaWJ1dGVzID0gbmF0aXZlT2JqZWN0Q3JlYXRlKEF0dHJpYnV0ZXMsIHsgZW51bWVyYWJsZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGZhbHNlKSB9KTsKICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2NyaXB0b3IoTywga2V5LCBBdHRyaWJ1dGVzKTsKICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpOwp9OwoKdmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7CiAgYW5PYmplY3QoTyk7CiAgdmFyIHByb3BlcnRpZXMgPSB0b0luZGV4ZWRPYmplY3QoUHJvcGVydGllcyk7CiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKHByb3BlcnRpZXMpLmNvbmNhdCgkZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BlcnRpZXMpKTsKICAkZm9yRWFjaChrZXlzLCBmdW5jdGlvbiAoa2V5KSB7CiAgICBpZiAoIURFU0NSSVBUT1JTIHx8ICRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHByb3BlcnRpZXMsIGtleSkpICRkZWZpbmVQcm9wZXJ0eShPLCBrZXksIHByb3BlcnRpZXNba2V5XSk7CiAgfSk7CiAgcmV0dXJuIE87Cn07Cgp2YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7CiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IG5hdGl2ZU9iamVjdENyZWF0ZShPKSA6ICRkZWZpbmVQcm9wZXJ0aWVzKG5hdGl2ZU9iamVjdENyZWF0ZShPKSwgUHJvcGVydGllcyk7Cn07Cgp2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgewogIHZhciBQID0gdG9QcmltaXRpdmUoViwgdHJ1ZSk7CiAgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApOwogIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIFApICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gZW51bWVyYWJsZSB8fCAhaGFzKHRoaXMsIFApIHx8ICFoYXMoQWxsU3ltYm9scywgUCkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW1BdID8gZW51bWVyYWJsZSA6IHRydWU7Cn07Cgp2YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7CiAgdmFyIGl0ID0gdG9JbmRleGVkT2JqZWN0KE8pOwogIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKICBpZiAoaXQgPT09IE9iamVjdFByb3RvdHlwZSAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIGtleSkpIHJldHVybjsKICB2YXIgZGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTsKICBpZiAoZGVzY3JpcHRvciAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSB7CiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlOwogIH0KICByZXR1cm4gZGVzY3JpcHRvcjsKfTsKCnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykgewogIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KE8pKTsKICB2YXIgcmVzdWx0ID0gW107CiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHsKICAgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhoaWRkZW5LZXlzLCBrZXkpKSByZXN1bHQucHVzaChrZXkpOwogIH0pOwogIHJldHVybiByZXN1bHQ7Cn07Cgp2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhPKSB7CiAgdmFyIElTX09CSkVDVF9QUk9UT1RZUEUgPSBPID09PSBPYmplY3RQcm90b3R5cGU7CiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhJU19PQkpFQ1RfUFJPVE9UWVBFID8gT2JqZWN0UHJvdG90eXBlU3ltYm9scyA6IHRvSW5kZXhlZE9iamVjdChPKSk7CiAgdmFyIHJlc3VsdCA9IFtdOwogICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7CiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgKCFJU19PQkpFQ1RfUFJPVE9UWVBFIHx8IGhhcyhPYmplY3RQcm90b3R5cGUsIGtleSkpKSB7CiAgICAgIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJlc3VsdDsKfTsKCi8vIGBTeW1ib2xgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC1jb25zdHJ1Y3RvcgppZiAoIU5BVElWRV9TWU1CT0wpIHsKICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkgewogICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKICAgIHZhciB0YWcgPSB1aWQoZGVzY3JpcHRpb24pOwogICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlKSBzZXR0ZXIuY2FsbChPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7CiAgICAgIGlmIChoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKSB0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlOwogICAgICBzZXRTeW1ib2xEZXNjcmlwdG9yKHRoaXMsIHRhZywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7CiAgICB9OwogICAgaWYgKERFU0NSSVBUT1JTICYmIFVTRV9TRVRURVIpIHNldFN5bWJvbERlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6IHNldHRlciB9KTsKICAgIHJldHVybiB3cmFwKHRhZywgZGVzY3JpcHRpb24pOwogIH07CgogIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7CiAgfSk7CgogIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7CiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTsKICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lczsKICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7CgogIGlmIChERVNDUklQVE9SUykgewogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtU3ltYm9sLWRlc2NyaXB0aW9uCiAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sICdkZXNjcmlwdGlvbicsIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkgewogICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLmRlc2NyaXB0aW9uOwogICAgICB9CiAgICB9KTsKICAgIGlmICghSVNfUFVSRSkgewogICAgICByZWRlZmluZShPYmplY3RQcm90b3R5cGUsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgeyB1bnNhZmU6IHRydWUgfSk7CiAgICB9CiAgfQp9CgppZiAoIVVTRV9TWU1CT0xfQVNfVUlEKSB7CiAgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgIHJldHVybiB3cmFwKHdlbGxLbm93blN5bWJvbChuYW1lKSwgbmFtZSk7CiAgfTsKfQoKJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIU5BVElWRV9TWU1CT0wgfSwgewogIFN5bWJvbDogJFN5bWJvbAp9KTsKCiRmb3JFYWNoKG9iamVjdEtleXMoV2VsbEtub3duU3ltYm9sc1N0b3JlKSwgZnVuY3Rpb24gKG5hbWUpIHsKICBkZWZpbmVXZWxsS25vd25TeW1ib2wobmFtZSk7Cn0pOwoKJCh7IHRhcmdldDogU1lNQk9MLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHsKICAvLyBgU3ltYm9sLmZvcmAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmZvcgogICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7CiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKGtleSk7CiAgICBpZiAoaGFzKFN0cmluZ1RvU3ltYm9sUmVnaXN0cnksIHN0cmluZykpIHJldHVybiBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5W3N0cmluZ107CiAgICB2YXIgc3ltYm9sID0gJFN5bWJvbChzdHJpbmcpOwogICAgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddID0gc3ltYm9sOwogICAgU3ltYm9sVG9TdHJpbmdSZWdpc3RyeVtzeW1ib2xdID0gc3RyaW5nOwogICAgcmV0dXJuIHN5bWJvbDsKICB9LAogIC8vIGBTeW1ib2wua2V5Rm9yYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wua2V5Zm9yCiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7CiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCcpOwogICAgaWYgKGhhcyhTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5LCBzeW0pKSByZXR1cm4gU3ltYm9sVG9TdHJpbmdSZWdpc3RyeVtzeW1dOwogIH0sCiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSB0cnVlOyB9LAogIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gZmFsc2U7IH0KfSk7CgokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHsKICAvLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZQogIGNyZWF0ZTogJGNyZWF0ZSwKICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHkKICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LAogIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXMKICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcywKICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnMKICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKfSk7CgokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7CiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lcwogIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLAogIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlzeW1ib2xzCiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzCn0pOwoKLy8gQ2hyb21lIDM4IGFuZCAzOSBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc2AgZmFpbHMgb24gcHJpbWl0aXZlcwovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IGZhaWxzKGZ1bmN0aW9uICgpIHsgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmYoMSk7IH0pIH0sIHsKICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkgewogICAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKHRvT2JqZWN0KGl0KSk7CiAgfQp9KTsKCi8vIGBKU09OLnN0cmluZ2lmeWAgbWV0aG9kIGJlaGF2aW9yIHdpdGggc3ltYm9scwovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeQppZiAoJHN0cmluZ2lmeSkgewogIHZhciBGT1JDRURfSlNPTl9TVFJJTkdJRlkgPSAhTkFUSVZFX1NZTUJPTCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICB2YXIgc3ltYm9sID0gJFN5bWJvbCgpOwogICAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge30KICAgIHJldHVybiAkc3RyaW5naWZ5KFtzeW1ib2xdKSAhPSAnW251bGxdJwogICAgICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGwKICAgICAgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nCiAgICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzCiAgICAgIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9ICd7fSc7CiAgfSk7CgogICQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfSlNPTl9TVFJJTkdJRlkgfSwgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCwgcmVwbGFjZXIsIHNwYWNlKSB7CiAgICAgIHZhciBhcmdzID0gW2l0XTsKICAgICAgdmFyIGluZGV4ID0gMTsKICAgICAgdmFyICRyZXBsYWNlcjsKICAgICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpbmRleCkgYXJncy5wdXNoKGFyZ3VtZW50c1tpbmRleCsrXSk7CiAgICAgICRyZXBsYWNlciA9IHJlcGxhY2VyOwogICAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkCiAgICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpOwogICAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7CiAgICAgIH07CiAgICAgIGFyZ3NbMV0gPSByZXBsYWNlcjsKICAgICAgcmV0dXJuICRzdHJpbmdpZnkuYXBwbHkobnVsbCwgYXJncyk7CiAgICB9CiAgfSk7Cn0KCi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvcHJpbWl0aXZlCmlmICghJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0pIHsKICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTsKfQovLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHkKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnCnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsIFNZTUJPTCk7CgpoaWRkZW5LZXlzW0hJRERFTl0gPSB0cnVlOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKLy8gYFN5bWJvbC5tYXRjaEFsbGAgd2VsbC1rbm93biBzeW1ib2wKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaEFsbCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLm1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2gKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnJlcGxhY2UKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLnNlYXJjaGAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNlYXJjaApkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NlYXJjaCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wuc3BlY2llc2Agd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNwZWNpZXMKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGxpdApkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwbGl0Jyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLnRvUHJpbWl0aXZlYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmUKZGVmaW5lV2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wudG9TdHJpbmdUYWdgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC50b3N0cmluZ3RhZwpkZWZpbmVXZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wudW5zY29wYWJsZXNgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC51bnNjb3BhYmxlcwpkZWZpbmVXZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmNvcHktd2l0aGluLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5jb3B5LXdpdGhpbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGNvcHlXaXRoaW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktY29weS13aXRoaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWNvcHktd2l0aGluLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmNvcHlXaXRoaW5gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmNvcHl3aXRoaW4KZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnY29weVdpdGhpbicsIGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCAvKiAsIGVuZCAqLykgewogIHJldHVybiAkY29weVdpdGhpbi5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZXZlcnkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRldmVyeSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmV2ZXJ5OwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZXZlcnkKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZXZlcnknLCBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogIHJldHVybiAkZXZlcnkoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciAkZmlsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1maWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1maWxsLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmZpbGxgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbGwKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2ZpbGwnLCBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQsIGVuZCAqLykgewogIHJldHVybiAkZmlsbC5hcHBseShhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbHRlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRmaWx0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5maWx0ZXI7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Q29uc3RydWN0b3I7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maWx0ZXIKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmlsdGVyJywgZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgdmFyIGxpc3QgPSAkZmlsdGVyKGFUeXBlZEFycmF5KHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7CiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTsKICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdOwogIHJldHVybiByZXN1bHQ7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQtaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGZpbmRJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbmRJbmRleDsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maW5kaW5kZXgKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZEluZGV4JywgZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHsKICByZXR1cm4gJGZpbmRJbmRleChhVHlwZWRBcnJheSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGZpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5maW5kOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5maW5kYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maW5kCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2ZpbmQnLCBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHsKICByZXR1cm4gJGZpbmQoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQzMi1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mbG9hdDMyLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgRmxvYXQzMkFycmF5YCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHMKY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdGbG9hdDMyJywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gRmxvYXQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQ2NC1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mbG9hdDY0LWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgRmxvYXQ2NEFycmF5YCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHMKY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdGbG9hdDY0JywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gRmxvYXQ2NEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZm9yLWVhY2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZvci1lYWNoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciAkZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZvckVhY2g7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZvcmVhY2gKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZm9yRWFjaCcsIGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAkZm9yRWFjaChhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMuanMiKTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpLmV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q7CnZhciB0eXBlZEFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzIik7CgovLyBgJVR5cGVkQXJyYXklLmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUuZnJvbQpleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kKCdmcm9tJywgdHlwZWRBcnJheUZyb20sIFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmNsdWRlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW5jbHVkZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRpbmNsdWRlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiKS5pbmNsdWRlczsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmluY2x1ZGVzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2luY2x1ZGVzJywgZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykgewogIHJldHVybiAkaW5jbHVkZXMoYVR5cGVkQXJyYXkodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmluZGV4LW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmRleC1vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIikuaW5kZXhPZjsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuaW5kZXhvZgpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdpbmRleE9mJywgZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7CiAgcmV0dXJuICRpbmRleE9mKGFUeXBlZEFycmF5KHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQxNi1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MTYtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgSW50MTZBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignSW50MTYnLCBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyIpOwoKLy8gYEludDMyQXJyYXlgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0cwpjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ0ludDMyJywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gSW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHsKICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgfTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50OC1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyIpOwoKLy8gYEludDhBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignSW50OCcsIGZ1bmN0aW9uIChpbml0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uIEludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHsKICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgfTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lml0ZXJhdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pdGVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciBBcnJheUl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5Owp2YXIgYXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9ycy52YWx1ZXM7CnZhciBhcnJheUtleXMgPSBBcnJheUl0ZXJhdG9ycy5rZXlzOwp2YXIgYXJyYXlFbnRyaWVzID0gQXJyYXlJdGVyYXRvcnMuZW50cmllczsKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CnZhciBuYXRpdmVUeXBlZEFycmF5SXRlcmF0b3IgPSBVaW50OEFycmF5ICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlW0lURVJBVE9SXTsKCnZhciBDT1JSRUNUX0lURVJfTkFNRSA9ICEhbmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yCiAgJiYgKG5hdGl2ZVR5cGVkQXJyYXlJdGVyYXRvci5uYW1lID09ICd2YWx1ZXMnIHx8IG5hdGl2ZVR5cGVkQXJyYXlJdGVyYXRvci5uYW1lID09IHVuZGVmaW5lZCk7Cgp2YXIgdHlwZWRBcnJheVZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcygpIHsKICByZXR1cm4gYXJyYXlWYWx1ZXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7Cn07CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5lbnRyaWVzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2VudHJpZXMnLCBmdW5jdGlvbiBlbnRyaWVzKCkgewogIHJldHVybiBhcnJheUVudHJpZXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7Cn0pOwovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5rZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5rZXlzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2tleXMnLCBmdW5jdGlvbiBrZXlzKCkgewogIHJldHVybiBhcnJheUtleXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7Cn0pOwovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnZhbHVlcwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCd2YWx1ZXMnLCB0eXBlZEFycmF5VmFsdWVzLCAhQ09SUkVDVF9JVEVSX05BTUUpOwovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUtQEBpdGVyYXRvcgpleHBvcnRUeXBlZEFycmF5TWV0aG9kKElURVJBVE9SLCB0eXBlZEFycmF5VmFsdWVzLCAhQ09SUkVDVF9JVEVSX05BTUUpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5qb2luLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmpvaW4uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CnZhciAkam9pbiA9IFtdLmpvaW47CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5qb2luYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5qb2luCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdqb2luJywgZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHsKICByZXR1cm4gJGpvaW4uYXBwbHkoYVR5cGVkQXJyYXkodGhpcyksIGFyZ3VtZW50cyk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5sYXN0LWluZGV4LW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lmxhc3QtaW5kZXgtb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGxhc3RJbmRleE9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWxhc3QtaW5kZXgtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWxhc3QtaW5kZXgtb2YuanMiKTsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUubGFzdEluZGV4T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmxhc3RpbmRleG9mCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdsYXN0SW5kZXhPZicsIGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHsKICByZXR1cm4gJGxhc3RJbmRleE9mLmFwcGx5KGFUeXBlZEFycmF5KHRoaXMpLCBhcmd1bWVudHMpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJG1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLm1hcDsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5tYXBgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLm1hcApleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdtYXAnLCBmdW5jdGlvbiBtYXAobWFwZm4gLyogLCB0aGlzQXJnICovKSB7CiAgcmV0dXJuICRtYXAoYVR5cGVkQXJyYXkodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgZnVuY3Rpb24gKE8sIGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihzcGVjaWVzQ29uc3RydWN0b3IoTywgTy5jb25zdHJ1Y3RvcikpKShsZW5ndGgpOwogIH0pOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkub2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lm9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciBUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMuanMiKTsKCnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yOwp2YXIgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUub2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUub2YKZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCgnb2YnLCBmdW5jdGlvbiBvZigvKiAuLi5pdGVtcyAqLykgewogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0aGlzKSkobGVuZ3RoKTsKICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107CiAgcmV0dXJuIHJlc3VsdDsKfSwgVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJlZHVjZS1yaWdodC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJlZHVjZS1yaWdodC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRyZWR1Y2VSaWdodCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1yZWR1Y2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIpLnJpZ2h0OwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5yZWR1Y2VSaWNodGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUucmVkdWNlcmlnaHQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgncmVkdWNlUmlnaHQnLCBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7CiAgcmV0dXJuICRyZWR1Y2VSaWdodChhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJHJlZHVjZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1yZWR1Y2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIpLmxlZnQ7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUucmVkdWNlCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3JlZHVjZScsIGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7CiAgcmV0dXJuICRyZWR1Y2UoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJldmVyc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmV2ZXJzZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKdmFyIGZsb29yID0gTWF0aC5mbG9vcjsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnJldmVyc2UKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgncmV2ZXJzZScsIGZ1bmN0aW9uIHJldmVyc2UoKSB7CiAgdmFyIHRoYXQgPSB0aGlzOwogIHZhciBsZW5ndGggPSBhVHlwZWRBcnJheSh0aGF0KS5sZW5ndGg7CiAgdmFyIG1pZGRsZSA9IGZsb29yKGxlbmd0aCAvIDIpOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIHZhbHVlOwogIHdoaWxlIChpbmRleCA8IG1pZGRsZSkgewogICAgdmFsdWUgPSB0aGF0W2luZGV4XTsKICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTsKICAgIHRoYXRbbGVuZ3RoXSA9IHZhbHVlOwogIH0gcmV0dXJuIHRoYXQ7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9PZmZzZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2Zmc2V0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vZmZzZXQuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKdmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICBuZXcgSW50OEFycmF5KDEpLnNldCh7fSk7Cn0pOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc2V0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5zZXQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc2V0JywgZnVuY3Rpb24gc2V0KGFycmF5TGlrZSAvKiAsIG9mZnNldCAqLykgewogIGFUeXBlZEFycmF5KHRoaXMpOwogIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMSk7CiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogIHZhciBzcmMgPSB0b09iamVjdChhcnJheUxpa2UpOwogIHZhciBsZW4gPSB0b0xlbmd0aChzcmMubGVuZ3RoKTsKICB2YXIgaW5kZXggPSAwOwogIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCcpOwogIHdoaWxlIChpbmRleCA8IGxlbikgdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107Cn0sIEZPUkNFRCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zbGljZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Q29uc3RydWN0b3I7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwp2YXIgJHNsaWNlID0gW10uc2xpY2U7Cgp2YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogIG5ldyBJbnQ4QXJyYXkoMSkuc2xpY2UoKTsKfSk7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zbGljZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2xpY2UKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc2xpY2UnLCBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7CiAgdmFyIGxpc3QgPSAkc2xpY2UuY2FsbChhVHlwZWRBcnJheSh0aGlzKSwgc3RhcnQsIGVuZCk7CiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7CiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTsKICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdOwogIHJldHVybiByZXN1bHQ7Cn0sIEZPUkNFRCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvbWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29tZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciAkc29tZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLnNvbWU7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNvbWVgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnNvbWUKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29tZScsIGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICByZXR1cm4gJHNvbWUoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKdmFyICRzb3J0ID0gW10uc29ydDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNvcnRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnNvcnQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29ydCcsIGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7CiAgcmV0dXJuICRzb3J0LmNhbGwoYVR5cGVkQXJyYXkodGhpcyksIGNvbXBhcmVmbik7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zdWJhcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc3ViYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zdWJhcnJheWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc3ViYXJyYXkKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc3ViYXJyYXknLCBmdW5jdGlvbiBzdWJhcnJheShiZWdpbiwgZW5kKSB7CiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTsKICB2YXIgbGVuZ3RoID0gTy5sZW5ndGg7CiAgdmFyIGJlZ2luSW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbmd0aCk7CiAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE8uY29uc3RydWN0b3IpKSgKICAgIE8uYnVmZmVyLAogICAgTy5ieXRlT2Zmc2V0ICsgYmVnaW5JbmRleCAqIE8uQllURVNfUEVSX0VMRU1FTlQsCiAgICB0b0xlbmd0aCgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpKSAtIGJlZ2luSW5kZXgpCiAgKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tbG9jYWxlLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7CnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwp2YXIgJHRvTG9jYWxlU3RyaW5nID0gW10udG9Mb2NhbGVTdHJpbmc7CnZhciAkc2xpY2UgPSBbXS5zbGljZTsKCi8vIGlPUyBTYWZhcmkgNi54IGZhaWxzIGhlcmUKdmFyIFRPX0xPQ0FMRV9TVFJJTkdfQlVHID0gISFJbnQ4QXJyYXkgJiYgZmFpbHMoZnVuY3Rpb24gKCkgewogICR0b0xvY2FsZVN0cmluZy5jYWxsKG5ldyBJbnQ4QXJyYXkoMSkpOwp9KTsKCnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBJbnQ4QXJyYXkoWzEsIDJdKS50b0xvY2FsZVN0cmluZygpOwp9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIEludDhBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pOwp9KTsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b2xvY2FsZXN0cmluZwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCd0b0xvY2FsZVN0cmluZycsIGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCkgewogIHJldHVybiAkdG9Mb2NhbGVTdHJpbmcuYXBwbHkoVE9fTE9DQUxFX1NUUklOR19CVUcgPyAkc2xpY2UuY2FsbChhVHlwZWRBcnJheSh0aGlzKSkgOiBhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTsKfSwgRk9SQ0VEKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tc3RyaW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwoKdmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTsKdmFyIFVpbnQ4QXJyYXlQcm90b3R5cGUgPSBVaW50OEFycmF5ICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlIHx8IHt9Owp2YXIgYXJyYXlUb1N0cmluZyA9IFtdLnRvU3RyaW5nOwp2YXIgYXJyYXlKb2luID0gW10uam9pbjsKCmlmIChmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9TdHJpbmcuY2FsbCh7fSk7IH0pKSB7CiAgYXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpOwogIH07Cn0KCnZhciBJU19OT1RfQVJSQVlfTUVUSE9EID0gVWludDhBcnJheVByb3RvdHlwZS50b1N0cmluZyAhPSBhcnJheVRvU3RyaW5nOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnRvc3RyaW5nCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvU3RyaW5nJywgYXJyYXlUb1N0cmluZywgSVNfTk9UX0FSUkFZX01FVEhPRCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQxNi1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQxNi1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgVWludDE2QXJyYXlgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0cwpjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQxNicsIGZ1bmN0aW9uIChpbml0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanMiKTsKCi8vIGBVaW50MzJBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignVWludDMyJywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7CiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogIH07Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgVWludDhBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignVWludDgnLCBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1jbGFtcGVkLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgVWludDhDbGFtcGVkQXJyYXlgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0cwpjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQ4JywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gVWludDhDbGFtcGVkQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7CiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogIH07Cn0sIHRydWUpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiKTsKdmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIpOwp2YXIgY29sbGVjdGlvbldlYWsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBlbmZvcmNlSXRlcm5hbFN0YXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpLmVuZm9yY2U7CnZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiKTsKCnZhciBJU19JRTExID0gIWdsb2JhbC5BY3RpdmVYT2JqZWN0ICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnbG9iYWw7CnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlOwp2YXIgSW50ZXJuYWxXZWFrTWFwOwoKdmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkgewogICAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7CiAgfTsKfTsKCi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13ZWFrbWFwLWNvbnN0cnVjdG9yCnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignV2Vha01hcCcsIHdyYXBwZXIsIGNvbGxlY3Rpb25XZWFrKTsKCi8vIElFMTEgV2Vha01hcCBmcm96ZW4ga2V5cyBmaXgKLy8gV2UgY2FuJ3QgdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGJlY2F1c2UgaXQgY3Jhc2ggc29tZSBvbGQgSUUgYnVpbGRzCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODUKaWYgKE5BVElWRV9XRUFLX01BUCAmJiBJU19JRTExKSB7CiAgSW50ZXJuYWxXZWFrTWFwID0gY29sbGVjdGlvbldlYWsuZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgJ1dlYWtNYXAnLCB0cnVlKTsKICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTsKICB2YXIgV2Vha01hcFByb3RvdHlwZSA9ICRXZWFrTWFwLnByb3RvdHlwZTsKICB2YXIgbmF0aXZlRGVsZXRlID0gV2Vha01hcFByb3RvdHlwZVsnZGVsZXRlJ107CiAgdmFyIG5hdGl2ZUhhcyA9IFdlYWtNYXBQcm90b3R5cGUuaGFzOwogIHZhciBuYXRpdmVHZXQgPSBXZWFrTWFwUHJvdG90eXBlLmdldDsKICB2YXIgbmF0aXZlU2V0ID0gV2Vha01hcFByb3RvdHlwZS5zZXQ7CiAgcmVkZWZpbmVBbGwoV2Vha01hcFByb3RvdHlwZSwgewogICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOwogICAgICAgIHJldHVybiBuYXRpdmVEZWxldGUuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plblsnZGVsZXRlJ10oa2V5KTsKICAgICAgfSByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KTsKICAgIH0sCiAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHsKICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOwogICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTsKICAgICAgfSByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KTsKICAgIH0sCiAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOwogICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTsKICAgICAgfSByZXR1cm4gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KTsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkgewogICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTsKICAgICAgICBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSkgOiBzdGF0ZS5mcm96ZW4uc2V0KGtleSwgdmFsdWUpOwogICAgICB9IGVsc2UgbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstc2V0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLXNldC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIpOwp2YXIgY29sbGVjdGlvbldlYWsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiKTsKCi8vIGBXZWFrU2V0YCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13ZWFrc2V0LWNvbnN0cnVjdG9yCmNvbGxlY3Rpb24oJ1dlYWtTZXQnLCBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTsKfSwgY29sbGVjdGlvbldlYWspOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hZ2dyZWdhdGUtZXJyb3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiKTsKdmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKCnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7CnZhciBnZXRJbnRlcm5hbEFnZ3JlZ2F0ZUVycm9yU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignQWdncmVnYXRlRXJyb3InKTsKCnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UpIHsKICB2YXIgdGhhdCA9IHRoaXM7CiAgaWYgKCEodGhhdCBpbnN0YW5jZW9mICRBZ2dyZWdhdGVFcnJvcikpIHJldHVybiBuZXcgJEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSk7CiAgaWYgKHNldFByb3RvdHlwZU9mKSB7CiAgICB0aGF0ID0gc2V0UHJvdG90eXBlT2YobmV3IEVycm9yKG1lc3NhZ2UpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7CiAgfQogIHZhciBlcnJvcnNBcnJheSA9IFtdOwogIGl0ZXJhdGUoZXJyb3JzLCBlcnJvcnNBcnJheS5wdXNoLCBlcnJvcnNBcnJheSk7CiAgaWYgKERFU0NSSVBUT1JTKSBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsgZXJyb3JzOiBlcnJvcnNBcnJheSwgdHlwZTogJ0FnZ3JlZ2F0ZUVycm9yJyB9KTsKICBlbHNlIHRoYXQuZXJyb3JzID0gZXJyb3JzQXJyYXk7CiAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgU3RyaW5nKG1lc3NhZ2UpKTsKICByZXR1cm4gdGhhdDsKfTsKCiRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7CiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAkQWdncmVnYXRlRXJyb3IpLAogIG1lc3NhZ2U6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAnJyksCiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICdBZ2dyZWdhdGVFcnJvcicpCn0pOwoKaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eS5mKCRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUsICdlcnJvcnMnLCB7CiAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gZ2V0SW50ZXJuYWxBZ2dyZWdhdGVFcnJvclN0YXRlKHRoaXMpLmVycm9yczsKICB9LAogIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKCiQoeyBnbG9iYWw6IHRydWUgfSwgewogIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3IKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hcnJheS5pcy10ZW1wbGF0ZS1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFycmF5LmlzLXRlbXBsYXRlLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiKTsKCnZhciBpc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbjsKCnZhciBpc0Zyb3plblN0cmluZ0FycmF5ID0gZnVuY3Rpb24gKGFycmF5LCBhbGxvd1VuZGVmaW5lZCkgewogIGlmICghaXNGcm96ZW4gfHwgIWlzQXJyYXkoYXJyYXkpIHx8ICFpc0Zyb3plbihhcnJheSkpIHJldHVybiBmYWxzZTsKICB2YXIgaW5kZXggPSAwOwogIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgdmFyIGVsZW1lbnQ7CiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CiAgICBlbGVtZW50ID0gYXJyYXlbaW5kZXgrK107CiAgICBpZiAoISh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgKGFsbG93VW5kZWZpbmVkICYmIHR5cGVvZiBlbGVtZW50ID09PSAndW5kZWZpbmVkJykpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9IHJldHVybiBsZW5ndGggIT09IDA7Cn07CgovLyBgQXJyYXkuaXNUZW1wbGF0ZU9iamVjdGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWlzLXRlbXBsYXRlLW9iamVjdAokKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlIH0sIHsKICBpc1RlbXBsYXRlT2JqZWN0OiBmdW5jdGlvbiBpc1RlbXBsYXRlT2JqZWN0KHZhbHVlKSB7CiAgICBpZiAoIWlzRnJvemVuU3RyaW5nQXJyYXkodmFsdWUsIHRydWUpKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgcmF3ID0gdmFsdWUucmF3OwogICAgaWYgKHJhdy5sZW5ndGggIT09IHZhbHVlLmxlbmd0aCB8fCAhaXNGcm96ZW5TdHJpbmdBcnJheShyYXcsIGZhbHNlKSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFycmF5Lmxhc3QtaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hcnJheS5sYXN0LWluZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKS5mOwoKLy8gYEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhgIGdldHRlcgovLyBodHRwczovL2dpdGh1Yi5jb20va2VpdGhhbXVzL3Byb3Bvc2FsLWFycmF5LWxhc3QKaWYgKERFU0NSSVBUT1JTICYmICEoJ2xhc3RJbmRleCcgaW4gW10pKSB7CiAgZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnbGFzdEluZGV4JywgewogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgZ2V0OiBmdW5jdGlvbiBsYXN0SW5kZXgoKSB7CiAgICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgICAgIHJldHVybiBsZW4gPT0gMCA/IDAgOiBsZW4gLSAxOwogICAgfQogIH0pOwoKICBhZGRUb1Vuc2NvcGFibGVzKCdsYXN0SW5kZXgnKTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkubGFzdC1pdGVtLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hcnJheS5sYXN0LWl0ZW0uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKCi8vIGBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4YCBhY2Nlc3NvcgovLyBodHRwczovL2dpdGh1Yi5jb20va2VpdGhhbXVzL3Byb3Bvc2FsLWFycmF5LWxhc3QKaWYgKERFU0NSSVBUT1JTICYmICEoJ2xhc3RJdGVtJyBpbiBbXSkpIHsKICBkZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdsYXN0SXRlbScsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gbGFzdEl0ZW0oKSB7CiAgICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgICAgIHJldHVybiBsZW4gPT0gMCA/IHVuZGVmaW5lZCA6IE9bbGVuIC0gMV07CiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiBsYXN0SXRlbSh2YWx1ZSkgewogICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpOwogICAgICB2YXIgbGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogICAgICByZXR1cm4gT1tsZW4gPT0gMCA/IDAgOiBsZW4gLSAxXSA9IHZhbHVlOwogICAgfQogIH0pOwoKICBhZGRUb1Vuc2NvcGFibGVzKCdsYXN0SXRlbScpOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5hcy1pbmRleGVkLXBhaXJzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eS5qcyIpOwoKdmFyIEFzeW5jSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnLCBQcm9taXNlKSB7CiAgdmFyIHN0YXRlID0gdGhpczsKICB2YXIgaXRlcmF0b3IgPSBzdGF0ZS5pdGVyYXRvcjsKCiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhbk9iamVjdChzdGF0ZS5uZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkgewogICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9OwogICAgfQogICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBbc3RhdGUuaW5kZXgrKywgc3RlcC52YWx1ZV0gfTsKICB9KTsKfSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBhc0luZGV4ZWRQYWlyczogZnVuY3Rpb24gYXNJbmRleGVkUGFpcnMoKSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgaW5kZXg6IDAKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1wcm90b3R5cGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLXByb3RvdHlwZS5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7Cgp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKCnZhciBBc3luY0l0ZXJhdG9yQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKCkgewogIGFuSW5zdGFuY2UodGhpcywgQXN5bmNJdGVyYXRvckNvbnN0cnVjdG9yKTsKfTsKCkFzeW5jSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBBc3luY0l0ZXJhdG9yUHJvdG90eXBlOwoKaWYgKCFoYXMoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHsKICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0FzeW5jSXRlcmF0b3InKTsKfQoKaWYgKCFoYXMoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJykgfHwgQXN5bmNJdGVyYXRvclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIEFzeW5jSXRlcmF0b3JDb25zdHJ1Y3Rvcik7Cn0KCiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgQXN5bmNJdGVyYXRvcjogQXN5bmNJdGVyYXRvckNvbnN0cnVjdG9yCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZHJvcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmRyb3AuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b1Bvc2l0aXZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyLmpzIik7CnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkgewogIHZhciBzdGF0ZSA9IHRoaXM7CgogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgdHJ5IHsKICAgICAgICBQcm9taXNlLnJlc29sdmUoCiAgICAgICAgICBhbk9iamVjdChzdGF0ZS5uZXh0LmNhbGwoc3RhdGUuaXRlcmF0b3IsIHN0YXRlLnJlbWFpbmluZyA/IHVuZGVmaW5lZCA6IGFyZykpCiAgICAgICAgKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkgewogICAgICAgICAgICAgIHN0YXRlLmRvbmUgPSB0cnVlOwogICAgICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnJlbWFpbmluZykgewogICAgICAgICAgICAgIHN0YXRlLnJlbWFpbmluZy0tOwogICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgfSBlbHNlIHJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHN0ZXAudmFsdWUgfSk7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgcmVqZWN0KGVycik7IH0KICAgICAgICB9LCByZWplY3QpOwogICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICB9OwoKICAgIGxvb3AoKTsKICB9KTsKfSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBkcm9wOiBmdW5jdGlvbiBkcm9wKGxpbWl0KSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgcmVtYWluaW5nOiB0b1Bvc2l0aXZlSW50ZWdlcihsaW1pdCkKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5ldmVyeS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRldmVyeSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbi5qcyIpLmV2ZXJ5OwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGZuKSB7CiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGZuKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmlsdGVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkgewogIHZhciBzdGF0ZSA9IHRoaXM7CiAgdmFyIGZpbHRlcmVyID0gc3RhdGUuZmlsdGVyZXI7CgogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgdHJ5IHsKICAgICAgICBQcm9taXNlLnJlc29sdmUoYW5PYmplY3Qoc3RhdGUubmV4dC5jYWxsKHN0YXRlLml0ZXJhdG9yLCBhcmcpKSkudGhlbihmdW5jdGlvbiAoc3RlcCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzdGVwLnZhbHVlOwogICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShmaWx0ZXJlcih2YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICBzZWxlY3RlZCA/IHJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHZhbHVlIH0pIDogbG9vcCgpOwogICAgICAgICAgICAgIH0sIHJlamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyByZWplY3QoZXJyKTsgfQogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IH0KICAgIH07CgogICAgbG9vcCgpOwogIH0pOwp9KTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGZpbHRlcmVyKSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgZmlsdGVyZXI6IGFGdW5jdGlvbihmaWx0ZXJlcikKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5maW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmluZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGZpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24uanMiKS5maW5kOwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZmluZDogZnVuY3Rpb24gZmluZChmbikgewogICAgcmV0dXJuICRmaW5kKHRoaXMsIGZuKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eS5qcyIpOwp2YXIgZ2V0QXN5bmNJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kLmpzIik7Cgp2YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcsIFByb21pc2UpIHsKICB2YXIgc3RhdGUgPSB0aGlzOwogIHZhciBtYXBwZXIgPSBzdGF0ZS5tYXBwZXI7CiAgdmFyIGlubmVySXRlcmF0b3IsIGl0ZXJhdG9yTWV0aG9kOwoKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgdmFyIG91dGVyTG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgdHJ5IHsKICAgICAgICBQcm9taXNlLnJlc29sdmUoYW5PYmplY3Qoc3RhdGUubmV4dC5jYWxsKHN0YXRlLml0ZXJhdG9yLCBhcmcpKSkudGhlbihmdW5jdGlvbiAoc3RlcCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUobWFwcGVyKHN0ZXAudmFsdWUpKS50aGVuKGZ1bmN0aW9uIChtYXBwZWQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yTWV0aG9kID0gZ2V0QXN5bmNJdGVyYXRvck1ldGhvZChtYXBwZWQpOwogICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3JNZXRob2QgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmlubmVySXRlcmF0b3IgPSBpbm5lckl0ZXJhdG9yID0gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChtYXBwZWQpKTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbm5lck5leHQgPSBhRnVuY3Rpb24oaW5uZXJJdGVyYXRvci5uZXh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJMb29wKCk7CiAgICAgICAgICAgICAgICAgIH0gcmVqZWN0KFR5cGVFcnJvcignLmZsYXRNYXAgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjIpIHsgcmVqZWN0KGVycm9yMik7IH0KICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHsgcmVqZWN0KGVycm9yMSk7IH0KICAgICAgICB9LCByZWplY3QpOwogICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICB9OwoKICAgIHZhciBpbm5lckxvb3AgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChpbm5lckl0ZXJhdG9yID0gc3RhdGUuaW5uZXJJdGVyYXRvcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoYW5PYmplY3Qoc3RhdGUuaW5uZXJOZXh0LmNhbGwoaW5uZXJJdGVyYXRvcikpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAoYW5PYmplY3QocmVzdWx0KS5kb25lKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5pbm5lckl0ZXJhdG9yID0gc3RhdGUuaW5uZXJOZXh0ID0gbnVsbDsKICAgICAgICAgICAgICAgIG91dGVyTG9vcCgpOwogICAgICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXN1bHQudmFsdWUgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkgeyByZWplY3QoZXJyb3IxKTsgfQogICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICAgIH0gZWxzZSBvdXRlckxvb3AoKTsKICAgIH07CgogICAgaW5uZXJMb29wKCk7CiAgfSk7Cn0pOwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChtYXBwZXIpIHsKICAgIHJldHVybiBuZXcgQXN5bmNJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLAogICAgICBtYXBwZXI6IGFGdW5jdGlvbihtYXBwZXIpLAogICAgICBpbm5lckl0ZXJhdG9yOiBudWxsLAogICAgICBpbm5lck5leHQ6IG51bGwKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mb3ItZWFjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mb3ItZWFjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRmb3JFYWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uLmpzIikuZm9yRWFjaDsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goZm4pIHsKICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBmbik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eS5qcyIpOwp2YXIgZ2V0QXN5bmNJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kLmpzIik7Cgp2YXIgQXN5bmNJdGVyYXRvciA9IHBhdGguQXN5bmNJdGVyYXRvcjsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZykgewogIHJldHVybiBhbk9iamVjdCh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLCBhcmcpKTsKfSwgdHJ1ZSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHN0YXQ6IHRydWUgfSwgewogIGZyb206IGZ1bmN0aW9uIGZyb20oTykgewogICAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pOwogICAgdmFyIHVzaW5nSXRlcmF0b3IgPSBnZXRBc3luY0l0ZXJhdG9yTWV0aG9kKG9iamVjdCk7CiAgICB2YXIgaXRlcmF0b3I7CiAgICBpZiAodXNpbmdJdGVyYXRvciAhPSBudWxsKSB7CiAgICAgIGl0ZXJhdG9yID0gYUZ1bmN0aW9uKHVzaW5nSXRlcmF0b3IpLmNhbGwob2JqZWN0KTsKICAgICAgaWYgKGl0ZXJhdG9yIGluc3RhbmNlb2YgQXN5bmNJdGVyYXRvcikgcmV0dXJuIGl0ZXJhdG9yOwogICAgfSBlbHNlIHsKICAgICAgaXRlcmF0b3IgPSBvYmplY3Q7CiAgICB9IHJldHVybiBuZXcgQXN5bmNJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGl0ZXJhdG9yCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkgewogIHZhciBzdGF0ZSA9IHRoaXM7CiAgdmFyIG1hcHBlciA9IHN0YXRlLm1hcHBlcjsKCiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhbk9iamVjdChzdGF0ZS5uZXh0LmNhbGwoc3RhdGUuaXRlcmF0b3IsIGFyZykpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkgewogICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9OwogICAgfQogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXBwZXIoc3RlcC52YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfTsKICAgIH0pOwogIH0pOwp9KTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIG1hcDogZnVuY3Rpb24gbWFwKG1hcHBlcikgewogICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yUHJveHkoewogICAgICBpdGVyYXRvcjogYW5PYmplY3QodGhpcyksCiAgICAgIG1hcHBlcjogYUZ1bmN0aW9uKG1hcHBlcikKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5yZWR1Y2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnJlZHVjZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCnZhciBQcm9taXNlID0gZ2V0QnVpbHRJbignUHJvbWlzZScpOwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UocmVkdWNlciAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgdmFyIGl0ZXJhdG9yID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgbmV4dCA9IGFGdW5jdGlvbihpdGVyYXRvci5uZXh0KTsKICAgIHZhciBub0luaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoIDwgMjsKICAgIHZhciBhY2N1bXVsYXRvciA9IG5vSW5pdGlhbCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTsKICAgIGFGdW5jdGlvbihyZWR1Y2VyKTsKCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvcikpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICAgIG5vSW5pdGlhbCA/IHJlamVjdChUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBpdGVyYXRvciB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKSkgOiByZXNvbHZlKGFjY3VtdWxhdG9yKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChub0luaXRpYWwpIHsKICAgICAgICAgICAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZWR1Y2VyKGFjY3VtdWxhdG9yLCB2YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyByZWplY3QoZXJyKTsgfQogICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICAgIH07CgogICAgICBsb29wKCk7CiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3Iuc29tZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnNvbWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRzb21lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uLmpzIikuc29tZTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIHNvbWU6IGZ1bmN0aW9uIHNvbWUoZm4pIHsKICAgIHJldHVybiAkc29tZSh0aGlzLCBmbik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnRha2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50YWtlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9Qb3NpdGl2ZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyIpOwp2YXIgY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5LmpzIik7Cgp2YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICBpZiAoIXRoaXMucmVtYWluaW5nLS0pIHsKICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07CiAgfSByZXR1cm4gdGhpcy5uZXh0LmNhbGwodGhpcy5pdGVyYXRvciwgYXJnKTsKfSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICB0YWtlOiBmdW5jdGlvbiB0YWtlKGxpbWl0KSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgcmVtYWluaW5nOiB0b1Bvc2l0aXZlSW50ZWdlcihsaW1pdCkKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50by1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50by1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICR0b0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uLmpzIikudG9BcnJheTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7CiAgICByZXR1cm4gJHRvQXJyYXkodGhpcyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmNvbXBvc2l0ZS1rZXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5jb21wb3NpdGUta2V5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0Q29tcG9zaXRlS2V5Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb21wb3NpdGUta2V5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb21wb3NpdGUta2V5LmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwoKdmFyIGluaXRpYWxpemVyID0gZnVuY3Rpb24gKCkgewogIHZhciBmcmVlemUgPSBnZXRCdWlsdEluKCdPYmplY3QnLCAnZnJlZXplJyk7CiAgcmV0dXJuIGZyZWV6ZSA/IGZyZWV6ZShjcmVhdGUobnVsbCkpIDogY3JlYXRlKG51bGwpOwp9OwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcmljaGVyLWtleXMvdHJlZS9tYXN0ZXIvY29tcG9zaXRlS2V5CiQoeyBnbG9iYWw6IHRydWUgfSwgewogIGNvbXBvc2l0ZUtleTogZnVuY3Rpb24gY29tcG9zaXRlS2V5KCkgewogICAgcmV0dXJuIGdldENvbXBvc2l0ZUtleU5vZGUuYXBwbHkoT2JqZWN0LCBhcmd1bWVudHMpLmdldCgnb2JqZWN0JywgaW5pdGlhbGl6ZXIpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5jb21wb3NpdGUtc3ltYm9sLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuY29tcG9zaXRlLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdldENvbXBvc2l0ZUtleU5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29tcG9zaXRlLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29tcG9zaXRlLWtleS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcmljaGVyLWtleXMvdHJlZS9tYXN0ZXIvY29tcG9zaXRlS2V5CiQoeyBnbG9iYWw6IHRydWUgfSwgewogIGNvbXBvc2l0ZVN5bWJvbDogZnVuY3Rpb24gY29tcG9zaXRlU3ltYm9sKCkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ3N0cmluZycpIHJldHVybiBnZXRCdWlsdEluKCdTeW1ib2wnKVsnZm9yJ10oYXJndW1lbnRzWzBdKTsKICAgIHJldHVybiBnZXRDb21wb3NpdGVLZXlOb2RlLmFwcGx5KG51bGwsIGFyZ3VtZW50cykuZ2V0KCdzeW1ib2wnLCBnZXRCdWlsdEluKCdTeW1ib2wnKSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lmdsb2JhbC10aGlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lmdsb2JhbC10aGlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lcy5nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5hcy1pbmRleGVkLXBhaXJzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIHJlc3VsdCA9IGFuT2JqZWN0KHRoaXMubmV4dC5jYWxsKHRoaXMuaXRlcmF0b3IsIGFyZykpOwogIHZhciBkb25lID0gdGhpcy5kb25lID0gISFyZXN1bHQuZG9uZTsKICBpZiAoIWRvbmUpIHJldHVybiBbdGhpcy5pbmRleCsrLCByZXN1bHQudmFsdWVdOwp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBhc0luZGV4ZWRQYWlyczogZnVuY3Rpb24gYXNJbmRleGVkUGFpcnMoKSB7CiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoewogICAgICBpdGVyYXRvcjogYW5PYmplY3QodGhpcyksCiAgICAgIGluZGV4OiAwCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJdGVyYXRvclByb3RvdHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiKS5JdGVyYXRvclByb3RvdHlwZTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKCnZhciBOYXRpdmVJdGVyYXRvciA9IGdsb2JhbC5JdGVyYXRvcjsKCi8vIEZGNTYtIGhhdmUgbm9uLXN0YW5kYXJkIGdsb2JhbCBoZWxwZXIgYEl0ZXJhdG9yYAp2YXIgRk9SQ0VEID0gSVNfUFVSRQogIHx8IHR5cGVvZiBOYXRpdmVJdGVyYXRvciAhPSAnZnVuY3Rpb24nCiAgfHwgTmF0aXZlSXRlcmF0b3IucHJvdG90eXBlICE9PSBJdGVyYXRvclByb3RvdHlwZQogIC8vIEZGNDQtIG5vbi1zdGFuZGFyZCBgSXRlcmF0b3JgIHBhc3NlcyBwcmV2aW91cyB0ZXN0cwogIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7IE5hdGl2ZUl0ZXJhdG9yKHt9KTsgfSk7Cgp2YXIgSXRlcmF0b3JDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIEl0ZXJhdG9yKCkgewogIGFuSW5zdGFuY2UodGhpcywgSXRlcmF0b3JDb25zdHJ1Y3Rvcik7Cn07CgppZiAoSVNfUFVSRSkgewogIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7Cn0KCmlmICghaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0l0ZXJhdG9yJyk7Cn0KCmlmIChGT1JDRUQgfHwgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJykgfHwgSXRlcmF0b3JQcm90b3R5cGUuY29uc3RydWN0b3IgPT09IE9iamVjdCkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgSXRlcmF0b3JDb25zdHJ1Y3Rvcik7Cn0KCkl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gSXRlcmF0b3JQcm90b3R5cGU7CgokKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgSXRlcmF0b3I6IEl0ZXJhdG9yQ29uc3RydWN0b3IKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5kcm9wLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZHJvcC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIHRvUG9zaXRpdmVJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjsKICB2YXIgbmV4dCA9IHRoaXMubmV4dDsKICB2YXIgcmVzdWx0LCBkb25lOwogIHdoaWxlICh0aGlzLnJlbWFpbmluZykgewogICAgdGhpcy5yZW1haW5pbmctLTsKICAgIHJlc3VsdCA9IGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvcikpOwogICAgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgICBpZiAoZG9uZSkgcmV0dXJuOwogIH0KICByZXN1bHQgPSBhbk9iamVjdChuZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpOwogIGRvbmUgPSB0aGlzLmRvbmUgPSAhIXJlc3VsdC5kb25lOwogIGlmICghZG9uZSkgcmV0dXJuIHJlc3VsdC52YWx1ZTsKfSk7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZHJvcDogZnVuY3Rpb24gZHJvcChsaW1pdCkgewogICAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLAogICAgICByZW1haW5pbmc6IHRvUG9zaXRpdmVJbnRlZ2VyKGxpbWl0KQogICAgfSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmV2ZXJ5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmV2ZXJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBldmVyeTogZnVuY3Rpb24gZXZlcnkoZm4pIHsKICAgIGFuT2JqZWN0KHRoaXMpOwogICAgYUZ1bmN0aW9uKGZuKTsKICAgIHJldHVybiAhaXRlcmF0ZSh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eS5qcyIpOwp2YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiKTsKCnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjsKICB2YXIgZmlsdGVyZXIgPSB0aGlzLmZpbHRlcmVyOwogIHZhciBuZXh0ID0gdGhpcy5uZXh0OwogIHZhciByZXN1bHQsIGRvbmUsIHZhbHVlOwogIHdoaWxlICh0cnVlKSB7CiAgICByZXN1bHQgPSBhbk9iamVjdChuZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpOwogICAgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgICBpZiAoZG9uZSkgcmV0dXJuOwogICAgdmFsdWUgPSByZXN1bHQudmFsdWU7CiAgICBpZiAoY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgZmlsdGVyZXIsIHZhbHVlKSkgcmV0dXJuIHZhbHVlOwogIH0KfSk7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoZmlsdGVyZXIpIHsKICAgIHJldHVybiBuZXcgSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgZmlsdGVyZXI6IGFGdW5jdGlvbihmaWx0ZXJlcikKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmluZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBmaW5kOiBmdW5jdGlvbiBmaW5kKGZuKSB7CiAgICBhbk9iamVjdCh0aGlzKTsKICAgIGFGdW5jdGlvbihmbik7CiAgICByZXR1cm4gaXRlcmF0ZSh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGZuKHZhbHVlKSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCh2YWx1ZSk7CiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKS5yZXN1bHQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZsYXQtbWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZsYXQtbWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIik7CnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5LmpzIik7CnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIpOwoKdmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogIHZhciByZXN1bHQsIG1hcHBlZCwgaXRlcmF0b3JNZXRob2QsIGlubmVySXRlcmF0b3I7CgogIHdoaWxlICh0cnVlKSB7CiAgICBpZiAoaW5uZXJJdGVyYXRvciA9IHRoaXMuaW5uZXJJdGVyYXRvcikgewogICAgICByZXN1bHQgPSBhbk9iamVjdCh0aGlzLmlubmVyTmV4dC5jYWxsKGlubmVySXRlcmF0b3IpKTsKICAgICAgaWYgKCFyZXN1bHQuZG9uZSkgcmV0dXJuIHJlc3VsdC52YWx1ZTsKICAgICAgdGhpcy5pbm5lckl0ZXJhdG9yID0gdGhpcy5pbm5lck5leHQgPSBudWxsOwogICAgfQoKICAgIHJlc3VsdCA9IGFuT2JqZWN0KHRoaXMubmV4dC5jYWxsKGl0ZXJhdG9yLCBhcmcpKTsKCiAgICBpZiAodGhpcy5kb25lID0gISFyZXN1bHQuZG9uZSkgcmV0dXJuOwoKICAgIG1hcHBlZCA9IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIHRoaXMubWFwcGVyLCByZXN1bHQudmFsdWUpOwogICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChtYXBwZWQpOwoKICAgIGlmIChpdGVyYXRvck1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRocm93IFR5cGVFcnJvcignLmZsYXRNYXAgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QnKTsKICAgIH0KCiAgICB0aGlzLmlubmVySXRlcmF0b3IgPSBpbm5lckl0ZXJhdG9yID0gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChtYXBwZWQpKTsKICAgIHRoaXMuaW5uZXJOZXh0ID0gYUZ1bmN0aW9uKGlubmVySXRlcmF0b3IubmV4dCk7CiAgfQp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBmbGF0TWFwOiBmdW5jdGlvbiBmbGF0TWFwKG1hcHBlcikgewogICAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLAogICAgICBtYXBwZXI6IGFGdW5jdGlvbihtYXBwZXIpLAogICAgICBpbm5lckl0ZXJhdG9yOiBudWxsLAogICAgICBpbm5lck5leHQ6IG51bGwKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7CiAgICBpdGVyYXRlKGFuT2JqZWN0KHRoaXMpLCBmbiwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkuanMiKTsKdmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiKTsKCnZhciBJdGVyYXRvciA9IHBhdGguSXRlcmF0b3I7Cgp2YXIgSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUl0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZykgewogIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLCBhcmcpKTsKICB2YXIgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgaWYgKCFkb25lKSByZXR1cm4gcmVzdWx0LnZhbHVlOwp9LCB0cnVlKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHN0YXQ6IHRydWUgfSwgewogIGZyb206IGZ1bmN0aW9uIGZyb20oTykgewogICAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pOwogICAgdmFyIHVzaW5nSXRlcmF0b3IgPSBnZXRJdGVyYXRvck1ldGhvZChvYmplY3QpOwogICAgdmFyIGl0ZXJhdG9yOwogICAgaWYgKHVzaW5nSXRlcmF0b3IgIT0gbnVsbCkgewogICAgICBpdGVyYXRvciA9IGFGdW5jdGlvbih1c2luZ0l0ZXJhdG9yKS5jYWxsKG9iamVjdCk7CiAgICAgIGlmIChpdGVyYXRvciBpbnN0YW5jZW9mIEl0ZXJhdG9yKSByZXR1cm4gaXRlcmF0b3I7CiAgICB9IGVsc2UgewogICAgICBpdGVyYXRvciA9IG9iamVjdDsKICAgIH0gcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGl0ZXJhdG9yCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5LmpzIik7CnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIpOwoKdmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbChpdGVyYXRvciwgYXJnKSk7CiAgdmFyIGRvbmUgPSB0aGlzLmRvbmUgPSAhIXJlc3VsdC5kb25lOwogIGlmICghZG9uZSkgcmV0dXJuIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIHRoaXMubWFwcGVyLCByZXN1bHQudmFsdWUpOwp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBwZXIpIHsKICAgIHJldHVybiBuZXcgSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgbWFwcGVyOiBhRnVuY3Rpb24obWFwcGVyKQogICAgfSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnJlZHVjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UocmVkdWNlciAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgYW5PYmplY3QodGhpcyk7CiAgICBhRnVuY3Rpb24ocmVkdWNlcik7CiAgICB2YXIgbm9Jbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7CiAgICB2YXIgYWNjdW11bGF0b3IgPSBub0luaXRpYWwgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07CiAgICBpdGVyYXRlKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAobm9Jbml0aWFsKSB7CiAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgYWNjdW11bGF0b3IgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY2N1bXVsYXRvciA9IHJlZHVjZXIoYWNjdW11bGF0b3IsIHZhbHVlKTsKICAgICAgfQogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBpdGVyYXRvciB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTsKICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3Iuc29tZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnNvbWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShmbikgewogICAgYW5PYmplY3QodGhpcyk7CiAgICBhRnVuY3Rpb24oZm4pOwogICAgcmV0dXJuIGl0ZXJhdGUodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChmbih2YWx1ZSkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnRha2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci50YWtlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9Qb3NpdGl2ZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyIpOwp2YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eS5qcyIpOwoKdmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICBpZiAoIXRoaXMucmVtYWluaW5nLS0pIHsKICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICByZXR1cm47CiAgfQogIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLCBhcmcpKTsKICB2YXIgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgaWYgKCFkb25lKSByZXR1cm4gcmVzdWx0LnZhbHVlOwp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICB0YWtlOiBmdW5jdGlvbiB0YWtlKGxpbWl0KSB7CiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoewogICAgICBpdGVyYXRvcjogYW5PYmplY3QodGhpcyksCiAgICAgIHJlbWFpbmluZzogdG9Qb3NpdGl2ZUludGVnZXIobGltaXQpCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IudG8tYXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IudG8tYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgcHVzaCA9IFtdLnB1c2g7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIGl0ZXJhdGUoYW5PYmplY3QodGhpcyksIHB1c2gsIHJlc3VsdCwgZmFsc2UsIHRydWUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5kZWxldGVBbGxgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGRlbGV0ZUFsbDogZnVuY3Rpb24gZGVsZXRlQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkRlbGV0ZUFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZXZlcnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ldmVyeS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHJldHVybiAhaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKCFib3VuZEZ1bmN0aW9uKHZhbHVlLCBrZXksIG1hcCkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGdldE1hcEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0TWFwSXRlcmF0b3IobWFwKTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICB2YXIgbmV3TWFwID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IobWFwLCBnZXRCdWlsdEluKCdNYXAnKSkpKCk7CiAgICB2YXIgc2V0dGVyID0gYUZ1bmN0aW9uKG5ld01hcC5zZXQpOwogICAgaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSkgc2V0dGVyLmNhbGwobmV3TWFwLCBrZXksIHZhbHVlKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7CiAgICByZXR1cm4gbmV3TWFwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZmluZC1rZXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maW5kLWtleS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5maW5kS2V5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaW5kS2V5OiBmdW5jdGlvbiBmaW5kS2V5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHJldHVybiBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKSByZXR1cm4gaXRlcmF0ZS5zdG9wKGtleSk7CiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpLnJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5maW5kYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHJldHVybiBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKSByZXR1cm4gaXRlcmF0ZS5zdG9wKHZhbHVlKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkucmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tLmpzIik7CgovLyBgTWFwLmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAuZnJvbQokKHsgdGFyZ2V0OiAnTWFwJywgc3RhdDogdHJ1ZSB9LCB7CiAgZnJvbTogZnJvbQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ncm91cC1ieS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmdyb3VwLWJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBgTWFwLmdyb3VwQnlgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHN0YXQ6IHRydWUgfSwgewogIGdyb3VwQnk6IGZ1bmN0aW9uIGdyb3VwQnkoaXRlcmFibGUsIGtleURlcml2YXRpdmUpIHsKICAgIHZhciBuZXdNYXAgPSBuZXcgdGhpcygpOwogICAgYUZ1bmN0aW9uKGtleURlcml2YXRpdmUpOwogICAgdmFyIGhhcyA9IGFGdW5jdGlvbihuZXdNYXAuaGFzKTsKICAgIHZhciBnZXQgPSBhRnVuY3Rpb24obmV3TWFwLmdldCk7CiAgICB2YXIgc2V0ID0gYUZ1bmN0aW9uKG5ld01hcC5zZXQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAgdmFyIGRlcml2ZWRLZXkgPSBrZXlEZXJpdmF0aXZlKGVsZW1lbnQpOwogICAgICBpZiAoIWhhcy5jYWxsKG5ld01hcCwgZGVyaXZlZEtleSkpIHNldC5jYWxsKG5ld01hcCwgZGVyaXZlZEtleSwgW2VsZW1lbnRdKTsKICAgICAgZWxzZSBnZXQuY2FsbChuZXdNYXAsIGRlcml2ZWRLZXkpLnB1c2goZWxlbWVudCk7CiAgICB9KTsKICAgIHJldHVybiBuZXdNYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5pbmNsdWRlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmluY2x1ZGVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRNYXBJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yLmpzIik7CnZhciBzYW1lVmFsdWVaZXJvID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NhbWUtdmFsdWUtemVybyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS16ZXJvLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBNYXAucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCkgewogICAgcmV0dXJuIGl0ZXJhdGUoZ2V0TWFwSXRlcmF0b3IoYW5PYmplY3QodGhpcykpLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoc2FtZVZhbHVlWmVybyh2YWx1ZSwgc2VhcmNoRWxlbWVudCkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmtleS1ieS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktYnkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBgTWFwLmtleUJ5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBzdGF0OiB0cnVlIH0sIHsKICBrZXlCeTogZnVuY3Rpb24ga2V5QnkoaXRlcmFibGUsIGtleURlcml2YXRpdmUpIHsKICAgIHZhciBuZXdNYXAgPSBuZXcgdGhpcygpOwogICAgYUZ1bmN0aW9uKGtleURlcml2YXRpdmUpOwogICAgdmFyIHNldHRlciA9IGFGdW5jdGlvbihuZXdNYXAuc2V0KTsKICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgIHNldHRlci5jYWxsKG5ld01hcCwga2V5RGVyaXZhdGl2ZShlbGVtZW50KSwgZWxlbWVudCk7CiAgICB9KTsKICAgIHJldHVybiBuZXdNYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAua2V5LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAga2V5T2Y6IGZ1bmN0aW9uIGtleU9mKHNlYXJjaEVsZW1lbnQpIHsKICAgIHJldHVybiBpdGVyYXRlKGdldE1hcEl0ZXJhdG9yKGFuT2JqZWN0KHRoaXMpKSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09PSBzZWFyY2hFbGVtZW50KSByZXR1cm4gaXRlcmF0ZS5zdG9wKGtleSk7CiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpLnJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLm1hcC1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAubWFwLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5tYXBLZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBtYXBLZXlzOiBmdW5jdGlvbiBtYXBLZXlzKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHZhciBuZXdNYXAgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihtYXAsIGdldEJ1aWx0SW4oJ01hcCcpKSkoKTsKICAgIHZhciBzZXR0ZXIgPSBhRnVuY3Rpb24obmV3TWFwLnNldCk7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBzZXR0ZXIuY2FsbChuZXdNYXAsIGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSwgdmFsdWUpOwogICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB0cnVlKTsKICAgIHJldHVybiBuZXdNYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5tYXBWYWx1ZXNgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIG1hcFZhbHVlczogZnVuY3Rpb24gbWFwVmFsdWVzKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHZhciBuZXdNYXAgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihtYXAsIGdldEJ1aWx0SW4oJ01hcCcpKSkoKTsKICAgIHZhciBzZXR0ZXIgPSBhRnVuY3Rpb24obmV3TWFwLnNldCk7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBzZXR0ZXIuY2FsbChuZXdNYXAsIGtleSwgYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7CiAgICByZXR1cm4gbmV3TWFwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAubWVyZ2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tZXJnZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUubWVyZ2VgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwogIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShpdGVyYWJsZSAvKiAuLi5pdGVyYmxlcyAqLykgewogICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIHNldHRlciA9IGFGdW5jdGlvbihtYXAuc2V0KTsKICAgIHZhciBpID0gMDsKICAgIHdoaWxlIChpIDwgYXJndW1lbnRzLmxlbmd0aCkgewogICAgICBpdGVyYXRlKGFyZ3VtZW50c1tpKytdLCBzZXR0ZXIsIG1hcCwgdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAub2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZi5qcyIpOwoKLy8gYE1hcC5vZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5vZgokKHsgdGFyZ2V0OiAnTWFwJywgc3RhdDogdHJ1ZSB9LCB7CiAgb2Y6IG9mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnJlZHVjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5yZWR1Y2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsKICAgIHZhciBtYXAgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldE1hcEl0ZXJhdG9yKG1hcCk7CiAgICB2YXIgbm9Jbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7CiAgICB2YXIgYWNjdW11bGF0b3IgPSBub0luaXRpYWwgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07CiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAobm9Jbml0aWFsKSB7CiAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgYWNjdW11bGF0b3IgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrZm4oYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG1hcCk7CiAgICAgIH0KICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7CiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBtYXAgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7CiAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGdldE1hcEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuc29tZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0TWFwSXRlcmF0b3IobWFwKTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICByZXR1cm4gaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB0cnVlKS5zdG9wcGVkOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBkYXRlLW9yLWluc2VydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBkYXRlLW9yLWluc2VydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyICR1cHNlcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFwLXVwc2VydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFwLXVwc2VydC5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUudXBkYXRlT3JJbnNlcnRgIG1ldGhvZCAocmVwbGFjZWQgYnkgYE1hcC5wcm90b3R5cGUudXBzZXJ0YCkKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0CiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICB1cGRhdGVPckluc2VydDogJHVwc2VydAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBkYXRlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLnVwZGF0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoa2V5LCBjYWxsYmFjayAvKiAsIHRodW5rICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIGFGdW5jdGlvbihjYWxsYmFjayk7CiAgICB2YXIgaXNQcmVzZW50SW5NYXAgPSBtYXAuaGFzKGtleSk7CiAgICBpZiAoIWlzUHJlc2VudEluTWFwICYmIGxlbmd0aCA8IDMpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKCdVcGRhdGluZyBhYnNlbnQgdmFsdWUnKTsKICAgIH0KICAgIHZhciB2YWx1ZSA9IGlzUHJlc2VudEluTWFwID8gbWFwLmdldChrZXkpIDogYUZ1bmN0aW9uKGxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpKGtleSwgbWFwKTsKICAgIG1hcC5zZXQoa2V5LCBjYWxsYmFjayh2YWx1ZSwga2V5LCBtYXApKTsKICAgIHJldHVybiBtYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC51cHNlcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBzZXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciAkdXBzZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hcC11cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC11cHNlcnQuanMiKTsKCi8vIGBNYXAucHJvdG90eXBlLnVwc2VydGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aHVtYnN1cGVwL3Byb3Bvc2FsLXVwc2VydAokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgdXBzZXJ0OiAkdXBzZXJ0Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5jbGFtcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguY2xhbXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgbWluID0gTWF0aC5taW47CnZhciBtYXggPSBNYXRoLm1heDsKCi8vIGBNYXRoLmNsYW1wYCBtZXRob2QKLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zLwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGNsYW1wOiBmdW5jdGlvbiBjbGFtcCh4LCBsb3dlciwgdXBwZXIpIHsKICAgIHJldHVybiBtaW4odXBwZXIsIG1heChsb3dlciwgeCkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmRlZy1wZXItcmFkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5kZWctcGVyLXJhZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLkRFR19QRVJfUkFEYCBjb25zdGFudAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgREVHX1BFUl9SQUQ6IE1hdGguUEkgLyAxODAKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmRlZ3JlZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguZGVncmVlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIFJBRF9QRVJfREVHID0gMTgwIC8gTWF0aC5QSTsKCi8vIGBNYXRoLmRlZ3JlZXNgIG1ldGhvZAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgZGVncmVlczogZnVuY3Rpb24gZGVncmVlcyhyYWRpYW5zKSB7CiAgICByZXR1cm4gcmFkaWFucyAqIFJBRF9QRVJfREVHOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmZzY2FsZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmZzY2FsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgc2NhbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1zY2FsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1zY2FsZS5qcyIpOwp2YXIgZnJvdW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtZnJvdW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLWZyb3VuZC5qcyIpOwoKLy8gYE1hdGguZnNjYWxlYCBtZXRob2QKLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zLwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGZzY2FsZTogZnVuY3Rpb24gZnNjYWxlKHgsIGluTG93LCBpbkhpZ2gsIG91dExvdywgb3V0SGlnaCkgewogICAgcmV0dXJuIGZyb3VuZChzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5pYWRkaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguaWFkZGguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgTWF0aC5pYWRkaGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzCi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgaWFkZGg6IGZ1bmN0aW9uIGlhZGRoKHgwLCB4MSwgeTAsIHkxKSB7CiAgICB2YXIgJHgwID0geDAgPj4+IDA7CiAgICB2YXIgJHgxID0geDEgPj4+IDA7CiAgICB2YXIgJHkwID0geTAgPj4+IDA7CiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmltdWxoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5pbXVsaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLmltdWxoYCBtZXRob2QKLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDMKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICBpbXVsaDogZnVuY3Rpb24gaW11bGgodSwgdikgewogICAgdmFyIFVJTlQxNiA9IDB4RkZGRjsKICAgIHZhciAkdSA9ICt1OwogICAgdmFyICR2ID0gK3Y7CiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjsKICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2OwogICAgdmFyIHUxID0gJHUgPj4gMTY7CiAgICB2YXIgdjEgPSAkdiA+PiAxNjsKICAgIHZhciB0ID0gKHUxICogdjAgPj4+IDApICsgKHUwICogdjAgPj4+IDE2KTsKICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+PiAxNik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguaXN1YmguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmlzdWJoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKLy8gYE1hdGguaXN1YmhgIG1ldGhvZAovLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwMwovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGlzdWJoOiBmdW5jdGlvbiBpc3ViaCh4MCwgeDEsIHkwLCB5MSkgewogICAgdmFyICR4MCA9IHgwID4+PiAwOwogICAgdmFyICR4MSA9IHgxID4+PiAwOwogICAgdmFyICR5MCA9IHkwID4+PiAwOwogICAgcmV0dXJuICR4MSAtICh5MSA+Pj4gMCkgLSAoKH4keDAgJiAkeTAgfCB+KCR4MCBeICR5MCkgJiAkeDAgLSAkeTAgPj4+IDApID4+PiAzMSkgfCAwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnJhZC1wZXItZGVnLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5yYWQtcGVyLWRlZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLlJBRF9QRVJfREVHYCBjb25zdGFudAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgUkFEX1BFUl9ERUc6IDE4MCAvIE1hdGguUEkKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnJhZGlhbnMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGgucmFkaWFucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIERFR19QRVJfUkFEID0gTWF0aC5QSSAvIDE4MDsKCi8vIGBNYXRoLnJhZGlhbnNgIG1ldGhvZAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgcmFkaWFuczogZnVuY3Rpb24gcmFkaWFucyhkZWdyZWVzKSB7CiAgICByZXR1cm4gZGVncmVlcyAqIERFR19QRVJfUkFEOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNjYWxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5zY2FsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHNjYWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtc2NhbGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtc2NhbGUuanMiKTsKCi8vIGBNYXRoLnNjYWxlYCBtZXRob2QKLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zLwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIHNjYWxlOiBzY2FsZQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguc2VlZGVkLXBybmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNlZWRlZC1wcm5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIG51bWJlcklzRmluaXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgU0VFREVEX1JBTkRPTSA9ICdTZWVkZWQgUmFuZG9tJzsKdmFyIFNFRURFRF9SQU5ET01fR0VORVJBVE9SID0gU0VFREVEX1JBTkRPTSArICcgR2VuZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTRUVERURfUkFORE9NX0dFTkVSQVRPUik7CnZhciBTRUVEX1RZUEVfRVJST1IgPSAnTWF0aC5zZWVkZWRQUk5HKCkgYXJndW1lbnQgc2hvdWxkIGhhdmUgYSAic2VlZCIgZmllbGQgd2l0aCBhIGZpbml0ZSB2YWx1ZS4nOwoKdmFyICRTZWVkZWRSYW5kb21HZW5lcmF0b3IgPSBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKGZ1bmN0aW9uIFNlZWRlZFJhbmRvbUdlbmVyYXRvcihzZWVkKSB7CiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICB0eXBlOiBTRUVERURfUkFORE9NX0dFTkVSQVRPUiwKICAgIHNlZWQ6IHNlZWQgJSAyMTQ3NDgzNjQ3CiAgfSk7Cn0sIFNFRURFRF9SQU5ET00sIGZ1bmN0aW9uIG5leHQoKSB7CiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICB2YXIgc2VlZCA9IHN0YXRlLnNlZWQgPSAoc3RhdGUuc2VlZCAqIDExMDM1MTUyNDUgKyAxMjM0NSkgJSAyMTQ3NDgzNjQ3OwogIHJldHVybiB7IHZhbHVlOiAoc2VlZCAmIDEwNzM3NDE4MjMpIC8gMTA3Mzc0MTgyMywgZG9uZTogZmFsc2UgfTsKfSk7CgovLyBgTWF0aC5zZWVkZWRQUk5HYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2VlZGVkLXJhbmRvbQovLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZWVkZWQtcmFuZG9tL2Jsb2IvNzhiODI1ODgzNWI1N2ZjMjEwMGQwNzYxNTFhYjUwNmJjMzIwMmFlNi9kZW1vLmh0bWwKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwgewogIHNlZWRlZFBSTkc6IGZ1bmN0aW9uIHNlZWRlZFBSTkcoaXQpIHsKICAgIHZhciBzZWVkID0gYW5PYmplY3QoaXQpLnNlZWQ7CiAgICBpZiAoIW51bWJlcklzRmluaXRlKHNlZWQpKSB0aHJvdyBUeXBlRXJyb3IoU0VFRF9UWVBFX0VSUk9SKTsKICAgIHJldHVybiBuZXcgJFNlZWRlZFJhbmRvbUdlbmVyYXRvcihzZWVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5zaWduYml0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNpZ25iaXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLnNpZ25iaXRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1NYXRoLnNpZ25iaXQKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICBzaWduYml0OiBmdW5jdGlvbiBzaWduYml0KHgpIHsKICAgIHJldHVybiAoeCA9ICt4KSA9PSB4ICYmIHggPT0gMCA/IDEgLyB4ID09IC1JbmZpbml0eSA6IHggPCAwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnVtdWxoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC51bXVsaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLnVtdWxoYCBtZXRob2QKLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDMKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICB1bXVsaDogZnVuY3Rpb24gdW11bGgodSwgdikgewogICAgdmFyIFVJTlQxNiA9IDB4RkZGRjsKICAgIHZhciAkdSA9ICt1OwogICAgdmFyICR2ID0gK3Y7CiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjsKICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2OwogICAgdmFyIHUxID0gJHUgPj4+IDE2OwogICAgdmFyIHYxID0gJHYgPj4+IDE2OwogICAgdmFyIHQgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpOwogICAgcmV0dXJuIHUxICogdjEgKyAodCA+Pj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+Pj4gMTYpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5udW1iZXIuZnJvbS1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm51bWJlci5mcm9tLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKdmFyIHBhcnNlSW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhcnNlLWludCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtaW50LmpzIik7Cgp2YXIgSU5WQUxJRF9OVU1CRVJfUkVQUkVTRU5UQVRJT04gPSAnSW52YWxpZCBudW1iZXIgcmVwcmVzZW50YXRpb24nOwp2YXIgSU5WQUxJRF9SQURJWCA9ICdJbnZhbGlkIHJhZGl4JzsKdmFyIHZhbGlkID0gL15bXGRhLXpdKyQvOwoKLy8gYE51bWJlci5mcm9tU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtbnVtYmVyLWZyb21zdHJpbmcKJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwgewogIGZyb21TdHJpbmc6IGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyaW5nLCByYWRpeCkgewogICAgdmFyIHNpZ24gPSAxOwogICAgdmFyIFIsIG1hdGhOdW07CiAgICBpZiAodHlwZW9mIHN0cmluZyAhPSAnc3RyaW5nJykgdGhyb3cgVHlwZUVycm9yKElOVkFMSURfTlVNQkVSX1JFUFJFU0VOVEFUSU9OKTsKICAgIGlmICghc3RyaW5nLmxlbmd0aCkgdGhyb3cgU3ludGF4RXJyb3IoSU5WQUxJRF9OVU1CRVJfUkVQUkVTRU5UQVRJT04pOwogICAgaWYgKHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nKSB7CiAgICAgIHNpZ24gPSAtMTsKICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKDEpOwogICAgICBpZiAoIXN0cmluZy5sZW5ndGgpIHRocm93IFN5bnRheEVycm9yKElOVkFMSURfTlVNQkVSX1JFUFJFU0VOVEFUSU9OKTsKICAgIH0KICAgIFIgPSByYWRpeCA9PT0gdW5kZWZpbmVkID8gMTAgOiB0b0ludGVnZXIocmFkaXgpOwogICAgaWYgKFIgPCAyIHx8IFIgPiAzNikgdGhyb3cgUmFuZ2VFcnJvcihJTlZBTElEX1JBRElYKTsKICAgIGlmICghdmFsaWQudGVzdChzdHJpbmcpIHx8IChtYXRoTnVtID0gcGFyc2VJbnQoc3RyaW5nLCBSKSkudG9TdHJpbmcoUikgIT09IHN0cmluZykgewogICAgICB0aHJvdyBTeW50YXhFcnJvcihJTlZBTElEX05VTUJFUl9SRVBSRVNFTlRBVElPTik7CiAgICB9CiAgICByZXR1cm4gc2lnbiAqIG1hdGhOdW07CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWVudHJpZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYmplY3QuaXRlcmF0ZS1lbnRyaWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgT2JqZWN0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IuanMiKTsKCi8vIGBPYmplY3QuaXRlcmF0ZUVudHJpZXNgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtaXRlcmF0aW9uCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBpdGVyYXRlRW50cmllczogZnVuY3Rpb24gaXRlcmF0ZUVudHJpZXMob2JqZWN0KSB7CiAgICByZXR1cm4gbmV3IE9iamVjdEl0ZXJhdG9yKG9iamVjdCwgJ2VudHJpZXMnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUta2V5cy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBPYmplY3RJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pdGVyYXRvci5qcyIpOwoKLy8gYE9iamVjdC5pdGVyYXRlS2V5c2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1pdGVyYXRpb24KJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGl0ZXJhdGVLZXlzOiBmdW5jdGlvbiBpdGVyYXRlS2V5cyhvYmplY3QpIHsKICAgIHJldHVybiBuZXcgT2JqZWN0SXRlcmF0b3Iob2JqZWN0LCAna2V5cycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYmplY3QuaXRlcmF0ZS12YWx1ZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLXZhbHVlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgT2JqZWN0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IuanMiKTsKCi8vIGBPYmplY3QuaXRlcmF0ZVZhbHVlc2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1pdGVyYXRpb24KJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGl0ZXJhdGVWYWx1ZXM6IGZ1bmN0aW9uIGl0ZXJhdGVWYWx1ZXMob2JqZWN0KSB7CiAgICByZXR1cm4gbmV3IE9iamVjdEl0ZXJhdG9yKG9iamVjdCwgJ3ZhbHVlcycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYnNlcnZhYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQub2JzZXJ2YWJsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZQp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKS5mOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgaG9zdFJlcG9ydEVycm9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKCnZhciBPQlNFUlZBQkxFID0gd2VsbEtub3duU3ltYm9sKCdvYnNlcnZhYmxlJyk7CnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7CnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cgp2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGZuKSB7CiAgcmV0dXJuIGZuID09IG51bGwgPyB1bmRlZmluZWQgOiBhRnVuY3Rpb24oZm4pOwp9OwoKdmFyIGNsZWFudXBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uU3RhdGUpIHsKICB2YXIgY2xlYW51cCA9IHN1YnNjcmlwdGlvblN0YXRlLmNsZWFudXA7CiAgaWYgKGNsZWFudXApIHsKICAgIHN1YnNjcmlwdGlvblN0YXRlLmNsZWFudXAgPSB1bmRlZmluZWQ7CiAgICB0cnkgewogICAgICBjbGVhbnVwKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBob3N0UmVwb3J0RXJyb3JzKGVycm9yKTsKICAgIH0KICB9Cn07Cgp2YXIgc3Vic2NyaXB0aW9uQ2xvc2VkID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvblN0YXRlKSB7CiAgcmV0dXJuIHN1YnNjcmlwdGlvblN0YXRlLm9ic2VydmVyID09PSB1bmRlZmluZWQ7Cn07Cgp2YXIgY2xvc2UgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uLCBzdWJzY3JpcHRpb25TdGF0ZSkgewogIGlmICghREVTQ1JJUFRPUlMpIHsKICAgIHN1YnNjcmlwdGlvbi5jbG9zZWQgPSB0cnVlOwogICAgdmFyIHN1YnNjcmlwdGlvbk9ic2VydmVyID0gc3Vic2NyaXB0aW9uU3RhdGUuc3Vic2NyaXB0aW9uT2JzZXJ2ZXI7CiAgICBpZiAoc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpIHN1YnNjcmlwdGlvbk9ic2VydmVyLmNsb3NlZCA9IHRydWU7CiAgfSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlciA9IHVuZGVmaW5lZDsKfTsKCnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHsKICB2YXIgc3Vic2NyaXB0aW9uU3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIGNsZWFudXA6IHVuZGVmaW5lZCwKICAgIG9ic2VydmVyOiBhbk9iamVjdChvYnNlcnZlciksCiAgICBzdWJzY3JpcHRpb25PYnNlcnZlcjogdW5kZWZpbmVkCiAgfSk7CiAgdmFyIHN0YXJ0OwogIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgdHJ5IHsKICAgIGlmIChzdGFydCA9IGdldE1ldGhvZChvYnNlcnZlci5zdGFydCkpIHN0YXJ0LmNhbGwob2JzZXJ2ZXIsIHRoaXMpOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBob3N0UmVwb3J0RXJyb3JzKGVycm9yKTsKICB9CiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb25TdGF0ZSkpIHJldHVybjsKICB2YXIgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb25TdGF0ZS5zdWJzY3JpcHRpb25PYnNlcnZlciA9IG5ldyBTdWJzY3JpcHRpb25PYnNlcnZlcih0aGlzKTsKICB0cnkgewogICAgdmFyIGNsZWFudXAgPSBzdWJzY3JpYmVyKHN1YnNjcmlwdGlvbk9ic2VydmVyKTsKICAgIHZhciBzdWJzY3JpcHRpb24gPSBjbGVhbnVwOwogICAgaWYgKGNsZWFudXAgIT0gbnVsbCkgc3Vic2NyaXB0aW9uU3RhdGUuY2xlYW51cCA9IHR5cGVvZiBjbGVhbnVwLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nCiAgICAgID8gZnVuY3Rpb24gKCkgeyBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgfQogICAgICA6IGFGdW5jdGlvbihjbGVhbnVwKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIuZXJyb3IoZXJyb3IpOwogICAgcmV0dXJuOwogIH0gaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb25TdGF0ZSkpIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpOwp9OwoKU3Vic2NyaXB0aW9uLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7CiAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkgewogICAgdmFyIHN1YnNjcmlwdGlvblN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvblN0YXRlKSkgewogICAgICBjbG9zZSh0aGlzLCBzdWJzY3JpcHRpb25TdGF0ZSk7CiAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpOwogICAgfQogIH0KfSk7CgppZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KFN1YnNjcmlwdGlvbi5wcm90b3R5cGUsICdjbG9zZWQnLCB7CiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHN1YnNjcmlwdGlvbkNsb3NlZChnZXRJbnRlcm5hbFN0YXRlKHRoaXMpKTsKICB9Cn0pOwoKdmFyIFN1YnNjcmlwdGlvbk9ic2VydmVyID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikgewogIHNldEludGVybmFsU3RhdGUodGhpcywgeyBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbiB9KTsKICBpZiAoIURFU0NSSVBUT1JTKSB0aGlzLmNsb3NlZCA9IGZhbHNlOwp9OwoKU3Vic2NyaXB0aW9uT2JzZXJ2ZXIucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoe30sIHsKICBuZXh0OiBmdW5jdGlvbiBuZXh0KHZhbHVlKSB7CiAgICB2YXIgc3Vic2NyaXB0aW9uU3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKGdldEludGVybmFsU3RhdGUodGhpcykuc3Vic2NyaXB0aW9uKTsKICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvblN0YXRlKSkgewogICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlcjsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgbmV4dE1ldGhvZCA9IGdldE1ldGhvZChvYnNlcnZlci5uZXh0KTsKICAgICAgICBpZiAobmV4dE1ldGhvZCkgbmV4dE1ldGhvZC5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaG9zdFJlcG9ydEVycm9ycyhlcnJvcik7CiAgICAgIH0KICAgIH0KICB9LAogIGVycm9yOiBmdW5jdGlvbiBlcnJvcih2YWx1ZSkgewogICAgdmFyIHN1YnNjcmlwdGlvbiA9IGdldEludGVybmFsU3RhdGUodGhpcykuc3Vic2NyaXB0aW9uOwogICAgdmFyIHN1YnNjcmlwdGlvblN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShzdWJzY3JpcHRpb24pOwogICAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uU3RhdGUpKSB7CiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvblN0YXRlLm9ic2VydmVyOwogICAgICBjbG9zZShzdWJzY3JpcHRpb24sIHN1YnNjcmlwdGlvblN0YXRlKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgZXJyb3JNZXRob2QgPSBnZXRNZXRob2Qob2JzZXJ2ZXIuZXJyb3IpOwogICAgICAgIGlmIChlcnJvck1ldGhvZCkgZXJyb3JNZXRob2QuY2FsbChvYnNlcnZlciwgdmFsdWUpOwogICAgICAgIGVsc2UgaG9zdFJlcG9ydEVycm9ycyh2YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGhvc3RSZXBvcnRFcnJvcnMoZXJyKTsKICAgICAgfSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvblN0YXRlKTsKICAgIH0KICB9LAogIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSgpIHsKICAgIHZhciBzdWJzY3JpcHRpb24gPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnN1YnNjcmlwdGlvbjsKICAgIHZhciBzdWJzY3JpcHRpb25TdGF0ZSA9IGdldEludGVybmFsU3RhdGUoc3Vic2NyaXB0aW9uKTsKICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvblN0YXRlKSkgewogICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlcjsKICAgICAgY2xvc2Uoc3Vic2NyaXB0aW9uLCBzdWJzY3JpcHRpb25TdGF0ZSk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGNvbXBsZXRlTWV0aG9kID0gZ2V0TWV0aG9kKG9ic2VydmVyLmNvbXBsZXRlKTsKICAgICAgICBpZiAoY29tcGxldGVNZXRob2QpIGNvbXBsZXRlTWV0aG9kLmNhbGwob2JzZXJ2ZXIpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGhvc3RSZXBvcnRFcnJvcnMoZXJyb3IpOwogICAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpOwogICAgfQogIH0KfSk7CgppZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KFN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSwgJ2Nsb3NlZCcsIHsKICBjb25maWd1cmFibGU6IHRydWUsCiAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uQ2xvc2VkKGdldEludGVybmFsU3RhdGUoZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zdWJzY3JpcHRpb24pKTsKICB9Cn0pOwoKdmFyICRPYnNlcnZhYmxlID0gZnVuY3Rpb24gT2JzZXJ2YWJsZShzdWJzY3JpYmVyKSB7CiAgYW5JbnN0YW5jZSh0aGlzLCAkT2JzZXJ2YWJsZSwgJ09ic2VydmFibGUnKTsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsgc3Vic2NyaWJlcjogYUZ1bmN0aW9uKHN1YnNjcmliZXIpIH0pOwp9OwoKcmVkZWZpbmVBbGwoJE9ic2VydmFibGUucHJvdG90eXBlLCB7CiAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHsKICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24odHlwZW9mIG9ic2VydmVyID09PSAnZnVuY3Rpb24nID8gewogICAgICBuZXh0OiBvYnNlcnZlciwKICAgICAgZXJyb3I6IGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsCiAgICAgIGNvbXBsZXRlOiBsZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkCiAgICB9IDogaXNPYmplY3Qob2JzZXJ2ZXIpID8gb2JzZXJ2ZXIgOiB7fSwgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zdWJzY3JpYmVyKTsKICB9Cn0pOwoKcmVkZWZpbmVBbGwoJE9ic2VydmFibGUsIHsKICBmcm9tOiBmdW5jdGlvbiBmcm9tKHgpIHsKICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7CiAgICB2YXIgb2JzZXJ2YWJsZU1ldGhvZCA9IGdldE1ldGhvZChhbk9iamVjdCh4KVtPQlNFUlZBQkxFXSk7CiAgICBpZiAob2JzZXJ2YWJsZU1ldGhvZCkgewogICAgICB2YXIgb2JzZXJ2YWJsZSA9IGFuT2JqZWN0KG9ic2VydmFibGVNZXRob2QuY2FsbCh4KSk7CiAgICAgIHJldHVybiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDID8gb2JzZXJ2YWJsZSA6IG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikgewogICAgICAgIHJldHVybiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcik7CiAgICAgIH0pOwogICAgfQogICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoeCk7CiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24gKG9ic2VydmVyKSB7CiAgICAgIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChpdCkgewogICAgICAgIG9ic2VydmVyLm5leHQoaXQpOwogICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICB9KTsKICB9LAogIG9mOiBmdW5jdGlvbiBvZigpIHsKICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7CiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHZhciBpdGVtcyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgdmFyIGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgaXRlbXNbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4KytdOwogICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7CiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuOwogICAgICB9IG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICB9KTsKICB9Cn0pOwoKY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRPYnNlcnZhYmxlLnByb3RvdHlwZSwgT0JTRVJWQUJMRSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7CgokKHsgZ2xvYmFsOiB0cnVlIH0sIHsKICBPYnNlcnZhYmxlOiAkT2JzZXJ2YWJsZQp9KTsKCnNldFNwZWNpZXMoJ09ic2VydmFibGUnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYWxsLXNldHRsZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFsbC1zZXR0bGVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YApfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIpOwp2YXIgcGVyZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wZXJmb3JtICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCnZhciBQUk9NSVNFX0FOWV9FUlJPUiA9ICdObyBvbmUgcHJvbWlzZSByZXNvbHZlZCc7CgovLyBgUHJvbWlzZS5hbnlgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWFueQokKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwgewogIGFueTogZnVuY3Rpb24gYW55KGl0ZXJhYmxlKSB7CiAgICB2YXIgQyA9IHRoaXM7CiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7CiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTsKICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDsKICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIGNvdW50ZXIgPSAwOwogICAgICB2YXIgcmVtYWluaW5nID0gMTsKICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlOwogICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKzsKICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7CiAgICAgICAgZXJyb3JzLnB1c2godW5kZWZpbmVkKTsKICAgICAgICByZW1haW5pbmcrKzsKICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuOwogICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTsKICAgICAgICAgIHJlc29sdmUodmFsdWUpOwogICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuOwogICAgICAgICAgYWxyZWFkeVJlamVjdGVkID0gdHJ1ZTsKICAgICAgICAgIGVycm9yc1tpbmRleF0gPSBlOwogICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpOwogICAgfSk7CiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTsKICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UudHJ5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UudHJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiKTsKdmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIpOwoKLy8gYFByb21pc2UudHJ5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnkKJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHsKICAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHsKICAgIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYodGhpcyk7CiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTsKICAgIChyZXN1bHQuZXJyb3IgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudmFsdWUpOwogICAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7CnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnNldDsKCi8vIGBSZWZsZWN0LmRlZmluZU1ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBkZWZpbmVNZXRhZGF0YTogZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykgewogICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbM10pOwogICAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTsKdmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuZ2V0TWFwOwp2YXIgc3RvcmUgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuc3RvcmU7CgovLyBgUmVmbGVjdC5kZWxldGVNZXRhZGF0YWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgZGVsZXRlTWV0YWRhdGE6IGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTsKICAgIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5LCBmYWxzZSk7CiAgICBpZiAobWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCB8fCAhbWV0YWRhdGFNYXBbJ2RlbGV0ZSddKG1ldGFkYXRhS2V5KSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG1ldGFkYXRhTWFwLnNpemUpIHJldHVybiB0cnVlOwogICAgdmFyIHRhcmdldE1ldGFkYXRhID0gc3RvcmUuZ2V0KHRhcmdldCk7CiAgICB0YXJnZXRNZXRhZGF0YVsnZGVsZXRlJ10odGFyZ2V0S2V5KTsKICAgIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwovLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YAp2YXIgU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5rZXlzOwp2YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTsKCnZhciBmcm9tID0gZnVuY3Rpb24gKGl0ZXIpIHsKICB2YXIgcmVzdWx0ID0gW107CiAgaXRlcmF0ZShpdGVyLCByZXN1bHQucHVzaCwgcmVzdWx0KTsKICByZXR1cm4gcmVzdWx0Owp9OwoKdmFyIG9yZGluYXJ5TWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKE8sIFApIHsKICB2YXIgb0tleXMgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTsKICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7CiAgaWYgKHBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIG9LZXlzOwogIHZhciBwS2V5cyA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7CiAgcmV0dXJuIHBLZXlzLmxlbmd0aCA/IG9LZXlzLmxlbmd0aCA/IGZyb20obmV3IFNldChvS2V5cy5jb25jYXQocEtleXMpKSkgOiBwS2V5cyA6IG9LZXlzOwp9OwoKLy8gYFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBnZXRNZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzFdKTsKICAgIHJldHVybiBvcmRpbmFyeU1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwoKdmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuaGFzOwp2YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5nZXQ7CnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5OwoKdmFyIG9yZGluYXJ5R2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHsKICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7CiAgaWYgKGhhc093bikgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApOwogIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTsKICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IHVuZGVmaW5lZDsKfTsKCi8vIGBSZWZsZWN0LmdldE1ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBnZXRNZXRhZGF0YTogZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykgewogICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbMl0pOwogICAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKdmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmtleXM7CnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5OwoKLy8gYFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzFdKTsKICAgIHJldHVybiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5nZXQ7CnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5OwoKLy8gYFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vcmJ1Y2t0b24vcmVmbGVjdC1tZXRhZGF0YQokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGdldE93bk1ldGFkYXRhOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7CiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1syXSk7CiAgICByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKCnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmhhczsKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7Cgp2YXIgb3JkaW5hcnlIYXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkgewogIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTsKICBpZiAoaGFzT3duKSByZXR1cm4gdHJ1ZTsKICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7CiAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCA/IG9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCkgOiBmYWxzZTsKfTsKCi8vIGBSZWZsZWN0Lmhhc01ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBoYXNNZXRhZGF0YTogZnVuY3Rpb24gaGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykgewogICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbMl0pOwogICAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmhhczsKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7CgovLyBgUmVmbGVjdC5oYXNPd25NZXRhZGF0YWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgaGFzT3duTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTsKICAgIHJldHVybiBvcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lm1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5tZXRhZGF0YS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7CnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnNldDsKCi8vIGBSZWZsZWN0Lm1ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBtZXRhZGF0YTogZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBrZXkpIHsKICAgICAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgYW5PYmplY3QodGFyZ2V0KSwgdG9NZXRhZGF0YUtleShrZXkpKTsKICAgIH07CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5hZGQtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5hZGQtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgY29sbGVjdGlvbkFkZEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tYWRkLWFsbC5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuYWRkQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBhZGRBbGw6IGZ1bmN0aW9uIGFkZEFsbCgvKiAuLi5lbGVtZW50cyAqLykgewogICAgcmV0dXJuIGNvbGxlY3Rpb25BZGRBbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmRlbGV0ZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmRlbGV0ZS1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5kZWxldGVBbGxgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGRlbGV0ZUFsbDogZnVuY3Rpb24gZGVsZXRlQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkRlbGV0ZUFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZGlmZmVyZW5jZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZGlmZmVyZW5jZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuZGlmZmVyZW5jZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBkaWZmZXJlbmNlOiBmdW5jdGlvbiBkaWZmZXJlbmNlKGl0ZXJhYmxlKSB7CiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgbmV3U2V0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Ioc2V0LCBnZXRCdWlsdEluKCdTZXQnKSkpKHNldCk7CiAgICB2YXIgcmVtb3ZlciA9IGFGdW5jdGlvbihuZXdTZXRbJ2RlbGV0ZSddKTsKICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICByZW1vdmVyLmNhbGwobmV3U2V0LCB2YWx1ZSk7CiAgICB9KTsKICAgIHJldHVybiBuZXdTZXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmV2ZXJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7CiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgcmV0dXJuICFpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKCFib3VuZEZ1bmN0aW9uKHZhbHVlLCB2YWx1ZSwgc2V0KSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGdldFNldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICB2YXIgbmV3U2V0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Ioc2V0LCBnZXRCdWlsdEluKCdTZXQnKSkpKCk7CiAgICB2YXIgYWRkZXIgPSBhRnVuY3Rpb24obmV3U2V0LmFkZCk7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIHZhbHVlLCBzZXQpKSBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICByZXR1cm4gbmV3U2V0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmZpbmRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7CiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgcmV0dXJuIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwgdmFsdWUsIHNldCkpIHJldHVybiBpdGVyYXRlLnN0b3AodmFsdWUpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkucmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tLmpzIik7CgovLyBgU2V0LmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQuZnJvbQokKHsgdGFyZ2V0OiAnU2V0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgZnJvbTogZnJvbQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pbnRlcnNlY3Rpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaW50ZXJzZWN0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmludGVyc2VjdGlvbmAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uIGludGVyc2VjdGlvbihpdGVyYWJsZSkgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIG5ld1NldCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHNldCwgZ2V0QnVpbHRJbignU2V0JykpKSgpOwogICAgdmFyIGhhc0NoZWNrID0gYUZ1bmN0aW9uKHNldC5oYXMpOwogICAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKG5ld1NldC5hZGQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChoYXNDaGVjay5jYWxsKHNldCwgdmFsdWUpKSBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gbmV3U2V0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0LW1ldGhvZHMvI1NldC5wcm90b3R5cGUuaXNEaXNqb2ludEZyb20KJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGlzRGlzam9pbnRGcm9tOiBmdW5jdGlvbiBpc0Rpc2pvaW50RnJvbShpdGVyYWJsZSkgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGhhc0NoZWNrID0gYUZ1bmN0aW9uKHNldC5oYXMpOwogICAgcmV0dXJuICFpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGhhc0NoZWNrLmNhbGwoc2V0LCB2YWx1ZSkgPT09IHRydWUpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0pLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdWJzZXQtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3Vic2V0LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmlzU3Vic2V0T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzU3Vic2V0T2YKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGlzU3Vic2V0T2Y6IGZ1bmN0aW9uIGlzU3Vic2V0T2YoaXRlcmFibGUpIHsKICAgIHZhciBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKHRoaXMpOwogICAgdmFyIG90aGVyU2V0ID0gYW5PYmplY3QoaXRlcmFibGUpOwogICAgdmFyIGhhc0NoZWNrID0gb3RoZXJTZXQuaGFzOwogICAgaWYgKHR5cGVvZiBoYXNDaGVjayAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIG90aGVyU2V0ID0gbmV3IChnZXRCdWlsdEluKCdTZXQnKSkoaXRlcmFibGUpOwogICAgICBoYXNDaGVjayA9IGFGdW5jdGlvbihvdGhlclNldC5oYXMpOwogICAgfQogICAgcmV0dXJuICFpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGhhc0NoZWNrLmNhbGwob3RoZXJTZXQsIHZhbHVlKSA9PT0gZmFsc2UpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdXBlcnNldC1vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmlzLXN1cGVyc2V0LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzU3VwZXJzZXRPZgokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgaXNTdXBlcnNldE9mOiBmdW5jdGlvbiBpc1N1cGVyc2V0T2YoaXRlcmFibGUpIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBoYXNDaGVjayA9IGFGdW5jdGlvbihzZXQuaGFzKTsKICAgIHJldHVybiAhaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChoYXNDaGVjay5jYWxsKHNldCwgdmFsdWUpID09PSBmYWxzZSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmpvaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmpvaW4uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZ2V0U2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5qb2luYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBzZXAgPSBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IFN0cmluZyhzZXBhcmF0b3IpOwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgaXRlcmF0ZShpdGVyYXRvciwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgZmFsc2UsIHRydWUpOwogICAgcmV0dXJuIHJlc3VsdC5qb2luKHNlcCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQubWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLm1hcGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7CiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgdmFyIG5ld1NldCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHNldCwgZ2V0QnVpbHRJbignU2V0JykpKSgpOwogICAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKG5ld1NldC5hZGQpOwogICAgaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGFkZGVyLmNhbGwobmV3U2V0LCBib3VuZEZ1bmN0aW9uKHZhbHVlLCB2YWx1ZSwgc2V0KSk7CiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKTsKICAgIHJldHVybiBuZXdTZXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0Lm9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLW9mLmpzIik7CgovLyBgU2V0Lm9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0Lm9mCiQoeyB0YXJnZXQ6ICdTZXQnLCBzdGF0OiB0cnVlIH0sIHsKICBvZjogb2YKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQucmVkdWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnJlZHVjZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBub0luaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoIDwgMjsKICAgIHZhciBhY2N1bXVsYXRvciA9IG5vSW5pdGlhbCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTsKICAgIGFGdW5jdGlvbihjYWxsYmFja2ZuKTsKICAgIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAobm9Jbml0aWFsKSB7CiAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgYWNjdW11bGF0b3IgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrZm4oYWNjdW11bGF0b3IsIHZhbHVlLCB2YWx1ZSwgc2V0KTsKICAgICAgfQogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBzZXQgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7CiAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5zb21lLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5zb21lLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGdldFNldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuc29tZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICByZXR1cm4gaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChib3VuZEZ1bmN0aW9uKHZhbHVlLCB2YWx1ZSwgc2V0KSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5zeW1tZXRyaWNEaWZmZXJlbmNlYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIHN5bW1ldHJpY0RpZmZlcmVuY2U6IGZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2UoaXRlcmFibGUpIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBuZXdTZXQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihzZXQsIGdldEJ1aWx0SW4oJ1NldCcpKSkoc2V0KTsKICAgIHZhciByZW1vdmVyID0gYUZ1bmN0aW9uKG5ld1NldFsnZGVsZXRlJ10pOwogICAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKG5ld1NldC5hZGQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIHJlbW92ZXIuY2FsbChuZXdTZXQsIHZhbHVlKSB8fCBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gbmV3U2V0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQudW5pb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC51bmlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLnVuaW9uYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIHVuaW9uOiBmdW5jdGlvbiB1bmlvbihpdGVyYWJsZSkgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIG5ld1NldCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHNldCwgZ2V0QnVpbHRJbignU2V0JykpKShzZXQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgYUZ1bmN0aW9uKG5ld1NldC5hZGQpLCBuZXdTZXQpOwogICAgcmV0dXJuIG5ld1NldDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLmF0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuYXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNoYXJBdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIikuY2hhckF0OwoKLy8gYFN0cmluZy5wcm90b3R5cGUuYXRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0CiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7CiAgYXQ6IGZ1bmN0aW9uIGF0KHBvcykgewogICAgcmV0dXJuIGNoYXJBdCh0aGlzLCBwb3MpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuY29kZS1wb2ludHMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5jb2RlLXBvaW50cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyIFN0cmluZ011bHRpYnl0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIik7Cgp2YXIgY29kZUF0ID0gU3RyaW5nTXVsdGlieXRlTW9kdWxlLmNvZGVBdDsKdmFyIGNoYXJBdCA9IFN0cmluZ011bHRpYnl0ZU1vZHVsZS5jaGFyQXQ7CnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpOwoKLy8gVE9ETzogdW5pZnkgd2l0aCBTdHJpbmcjQEBpdGVyYXRvcgp2YXIgJFN0cmluZ0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBTdHJpbmdJdGVyYXRvcihzdHJpbmcpIHsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUiwKICAgIHN0cmluZzogc3RyaW5nLAogICAgaW5kZXg6IDAKICB9KTsKfSwgJ1N0cmluZycsIGZ1bmN0aW9uIG5leHQoKSB7CiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nOwogIHZhciBpbmRleCA9IHN0YXRlLmluZGV4OwogIHZhciBwb2ludDsKICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpOwogIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDsKICByZXR1cm4geyB2YWx1ZTogeyBjb2RlUG9pbnQ6IGNvZGVBdChwb2ludCwgMCksIHBvc2l0aW9uOiBpbmRleCB9LCBkb25lOiBmYWxzZSB9Owp9KTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludHNgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcHJvdG90eXBlLWNvZGVwb2ludHMKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHsKICBjb2RlUG9pbnRzOiBmdW5jdGlvbiBjb2RlUG9pbnRzKCkgewogICAgcmV0dXJuIG5ldyAkU3RyaW5nSXRlcmF0b3IoU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLm1hdGNoLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZXMuc3RyaW5nLm1hdGNoLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5yZXBsYWNlLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLnJlcGxhY2UtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwp2YXIgZ2V0UmVnRXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIFJFUExBQ0UgPSB3ZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTsKdmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXJlcGxhY2UtYWxsCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7CiAgcmVwbGFjZUFsbDogZnVuY3Rpb24gcmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7CiAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7CiAgICB2YXIgSVNfUkVHX0VYUCwgZmxhZ3MsIHJlcGxhY2VyLCBzdHJpbmcsIHNlYXJjaFN0cmluZywgdGVtcGxhdGUsIHJlc3VsdCwgcG9zaXRpb24sIGluZGV4OwogICAgaWYgKHNlYXJjaFZhbHVlICE9IG51bGwpIHsKICAgICAgSVNfUkVHX0VYUCA9IGlzUmVnRXhwKHNlYXJjaFZhbHVlKTsKICAgICAgaWYgKElTX1JFR19FWFApIHsKICAgICAgICBmbGFncyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlCiAgICAgICAgICA/IHNlYXJjaFZhbHVlLmZsYWdzCiAgICAgICAgICA6IGdldFJlZ0V4cEZsYWdzLmNhbGwoc2VhcmNoVmFsdWUpCiAgICAgICAgKSk7CiAgICAgICAgaWYgKCF+ZmxhZ3MuaW5kZXhPZignZycpKSB0aHJvdyBUeXBlRXJyb3IoJ2AucmVwbGFjZUFsbGAgZG9lcyBub3QgYWxsb3cgbm9uLWdsb2JhbCByZWdleGVzJyk7CiAgICAgIH0KICAgICAgcmVwbGFjZXIgPSBzZWFyY2hWYWx1ZVtSRVBMQUNFXTsKICAgICAgaWYgKHJlcGxhY2VyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gcmVwbGFjZXIuY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKTsKICAgICAgfSBlbHNlIGlmIChJU19QVVJFICYmIElTX1JFR19FWFApIHsKICAgICAgICByZXR1cm4gU3RyaW5nKE8pLnJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHN0cmluZyA9IFN0cmluZyhPKTsKICAgIHNlYXJjaFN0cmluZyA9IFN0cmluZyhzZWFyY2hWYWx1ZSk7CiAgICBpZiAoc2VhcmNoU3RyaW5nID09PSAnJykgcmV0dXJuIHJlcGxhY2VBbGwuY2FsbChzdHJpbmcsIC8oPzopL2csIHJlcGxhY2VWYWx1ZSk7CiAgICB0ZW1wbGF0ZSA9IHN0cmluZy5zcGxpdChzZWFyY2hTdHJpbmcpOwogICAgaWYgKHR5cGVvZiByZXBsYWNlVmFsdWUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlLmpvaW4oU3RyaW5nKHJlcGxhY2VWYWx1ZSkpOwogICAgfQogICAgcmVzdWx0ID0gdGVtcGxhdGVbMF07CiAgICBwb3NpdGlvbiA9IHJlc3VsdC5sZW5ndGg7CiAgICBmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgcmVzdWx0ICs9IFN0cmluZyhyZXBsYWNlVmFsdWUoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiwgc3RyaW5nKSk7CiAgICAgIHBvc2l0aW9uICs9IHNlYXJjaFN0cmluZy5sZW5ndGggKyB0ZW1wbGF0ZVtpbmRleF0ubGVuZ3RoOwogICAgICByZXN1bHQgKz0gdGVtcGxhdGVbaW5kZXhdOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmFzeW5jRGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtdXNpbmctc3RhdGVtZW50CmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNEaXNwb3NlJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wuZGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtdXNpbmctc3RhdGVtZW50CmRlZmluZVdlbGxLbm93blN5bWJvbCgnZGlzcG9zZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLm9ic2VydmFibGVgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9ic2VydmFibGUKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdvYnNlcnZhYmxlJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wucGF0dGVybk1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wYXR0ZXJuLW1hdGNoaW5nCmRlZmluZVdlbGxLbm93blN5bWJvbCgncGF0dGVybk1hdGNoJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5yZXBsYWNlLWFsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBUT0RPOiByZW1vdmUgZnJvbSBgY29yZS1qc0A0YAp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgpkZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2VBbGwnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmRlbGV0ZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5kZWxldGUtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsLmpzIik7CgovLyBgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdXZWFrTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgZGVsZXRlQWxsOiBmdW5jdGlvbiBkZWxldGVBbGwoLyogLi4uZWxlbWVudHMgKi8pIHsKICAgIHJldHVybiBjb2xsZWN0aW9uRGVsZXRlQWxsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tZnJvbS5qcyIpOwoKLy8gYFdlYWtNYXAuZnJvbWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWttYXAuZnJvbQokKHsgdGFyZ2V0OiAnV2Vha01hcCcsIHN0YXQ6IHRydWUgfSwgewogIGZyb206IGZyb20KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLW9mLmpzIik7CgovLyBgV2Vha01hcC5vZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWttYXAub2YKJCh7IHRhcmdldDogJ1dlYWtNYXAnLCBzdGF0OiB0cnVlIH0sIHsKICBvZjogb2YKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC51cHNlcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLnVwc2VydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciAkdXBzZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hcC11cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC11cHNlcnQuanMiKTsKCi8vIGBXZWFrTWFwLnByb3RvdHlwZS51cHNlcnRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGh1bWJzdXBlcC9wcm9wb3NhbC11cHNlcnQKJCh7IHRhcmdldDogJ1dlYWtNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICB1cHNlcnQ6ICR1cHNlcnQKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5hZGQtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQuYWRkLWFsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgY29sbGVjdGlvbkFkZEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tYWRkLWFsbC5qcyIpOwoKLy8gYFdlYWtTZXQucHJvdG90eXBlLmFkZEFsbGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnV2Vha1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGFkZEFsbDogZnVuY3Rpb24gYWRkQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkFkZEFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5kZWxldGUtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQuZGVsZXRlLWFsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgY29sbGVjdGlvbkRlbGV0ZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWRlbGV0ZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbC5qcyIpOwoKLy8gYFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZUFsbGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnV2Vha1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGRlbGV0ZUFsbDogZnVuY3Rpb24gZGVsZXRlQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkRlbGV0ZUFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5mcm9tLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQuZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZyb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20uanMiKTsKCi8vIGBXZWFrU2V0LmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrc2V0LmZyb20KJCh7IHRhcmdldDogJ1dlYWtTZXQnLCBzdGF0OiB0cnVlIH0sIHsKICBmcm9tOiBmcm9tCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZi5qcyIpOwoKLy8gYFdlYWtTZXQub2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrc2V0Lm9mCiQoeyB0YXJnZXQ6ICdXZWFrU2V0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgb2Y6IG9mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgRE9NSXRlcmFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiKTsKdmFyIGZvckVhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKCmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHsKICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdOwogIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTsKICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3QKICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSAmJiBDb2xsZWN0aW9uUHJvdG90eXBlLmZvckVhY2ggIT09IGZvckVhY2gpIHRyeSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgJ2ZvckVhY2gnLCBmb3JFYWNoKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgQ29sbGVjdGlvblByb3RvdHlwZS5mb3JFYWNoID0gZm9yRWFjaDsKICB9Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIERPTUl0ZXJhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb20taXRlcmFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIik7CnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwp2YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7Cgpmb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7CiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTsKICB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7CiAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHsKICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdAogICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHsKICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSA9IEFycmF5VmFsdWVzOwogICAgfQogICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpOwogICAgfQogICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykgewogICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3QKICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7CiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIE1FVEhPRF9OQU1FLCBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdOwogICAgICB9CiAgICB9CiAgfQp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciB0YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Rhc2sgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiKTsKCnZhciBGT1JDRUQgPSAhZ2xvYmFsLnNldEltbWVkaWF0ZSB8fCAhZ2xvYmFsLmNsZWFySW1tZWRpYXRlOwoKLy8gaHR0cDovL3czYy5naXRodWIuaW8vc2V0SW1tZWRpYXRlLwokKHsgZ2xvYmFsOiB0cnVlLCBiaW5kOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgLy8gYHNldEltbWVkaWF0ZWAgbWV0aG9kCiAgLy8gaHR0cDovL3czYy5naXRodWIuaW8vc2V0SW1tZWRpYXRlLyNzaS1zZXRJbW1lZGlhdGUKICBzZXRJbW1lZGlhdGU6IHRhc2suc2V0LAogIC8vIGBjbGVhckltbWVkaWF0ZWAgbWV0aG9kCiAgLy8gaHR0cDovL3czYy5naXRodWIuaW8vc2V0SW1tZWRpYXRlLyNzaS1jbGVhckltbWVkaWF0ZQogIGNsZWFySW1tZWRpYXRlOiB0YXNrLmNsZWFyCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIucXVldWUtbWljcm90YXNrLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5xdWV1ZS1taWNyb3Rhc2suanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgbWljcm90YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21pY3JvdGFzayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwoKdmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKdmFyIGlzTm9kZSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnOwoKLy8gYHF1ZXVlTWljcm90YXNrYCBtZXRob2QKLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCNkb20tcXVldWVtaWNyb3Rhc2sKJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgbm9UYXJnZXRHZXQ6IHRydWUgfSwgewogIHF1ZXVlTWljcm90YXNrOiBmdW5jdGlvbiBxdWV1ZU1pY3JvdGFzayhmbikgewogICAgdmFyIGRvbWFpbiA9IGlzTm9kZSAmJiBwcm9jZXNzLmRvbWFpbjsKICAgIG1pY3JvdGFzayhkb21haW4gPyBkb21haW4uYmluZChmbikgOiBmbik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2VyLWFnZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2VyLWFnZW50LmpzIik7Cgp2YXIgc2xpY2UgPSBbXS5zbGljZTsKdmFyIE1TSUUgPSAvTVNJRSAuXC4vLnRlc3QodXNlckFnZW50KTsgLy8gPC0gZGlydHkgaWU5LSBjaGVjawoKdmFyIHdyYXAgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7CiAgcmV0dXJuIGZ1bmN0aW9uIChoYW5kbGVyLCB0aW1lb3V0IC8qICwgLi4uYXJndW1lbnRzICovKSB7CiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgICB2YXIgYXJncyA9IGJvdW5kQXJncyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IHVuZGVmaW5lZDsKICAgIHJldHVybiBzY2hlZHVsZXIoYm91bmRBcmdzID8gZnVuY3Rpb24gKCkgewogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMKICAgICAgKHR5cGVvZiBoYW5kbGVyID09ICdmdW5jdGlvbicgPyBoYW5kbGVyIDogRnVuY3Rpb24oaGFuZGxlcikpLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgfSA6IGhhbmRsZXIsIHRpbWVvdXQpOwogIH07Cn07CgovLyBpZTktIHNldFRpbWVvdXQgJiBzZXRJbnRlcnZhbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4Ci8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjdGltZXJzCiQoeyBnbG9iYWw6IHRydWUsIGJpbmQ6IHRydWUsIGZvcmNlZDogTVNJRSB9LCB7CiAgLy8gYHNldFRpbWVvdXRgIG1ldGhvZAogIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjZG9tLXNldHRpbWVvdXQKICBzZXRUaW1lb3V0OiB3cmFwKGdsb2JhbC5zZXRUaW1lb3V0KSwKICAvLyBgc2V0SW50ZXJ2YWxgIG1ldGhvZAogIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjZG9tLXNldGludGVydmFsCiAgc2V0SW50ZXJ2YWw6IHdyYXAoZ2xvYmFsLnNldEludGVydmFsKQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIpOwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgVVNFX05BVElWRV9VUkwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXVybCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXVybC5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBnZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcyIpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7CnZhciBIZWFkZXJzID0gZ2V0QnVpbHRJbignSGVhZGVycycpOwp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBVUkxfU0VBUkNIX1BBUkFNUyA9ICdVUkxTZWFyY2hQYXJhbXMnOwp2YXIgVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IgPSBVUkxfU0VBUkNIX1BBUkFNUyArICdJdGVyYXRvcic7CnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7CnZhciBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVMpOwp2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IpOwoKdmFyIHBsdXMgPSAvXCsvZzsKdmFyIHNlcXVlbmNlcyA9IEFycmF5KDQpOwoKdmFyIHBlcmNlbnRTZXF1ZW5jZSA9IGZ1bmN0aW9uIChieXRlcykgewogIHJldHVybiBzZXF1ZW5jZXNbYnl0ZXMgLSAxXSB8fCAoc2VxdWVuY2VzW2J5dGVzIC0gMV0gPSBSZWdFeHAoJygoPzolW1xcZGEtZl17Mn0peycgKyBieXRlcyArICd9KScsICdnaScpKTsKfTsKCnZhciBwZXJjZW50RGVjb2RlID0gZnVuY3Rpb24gKHNlcXVlbmNlKSB7CiAgdHJ5IHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc2VxdWVuY2UpOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4gc2VxdWVuY2U7CiAgfQp9OwoKdmFyIGRlc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIHJlc3VsdCA9IGl0LnJlcGxhY2UocGx1cywgJyAnKTsKICB2YXIgYnl0ZXMgPSA0OwogIHRyeSB7CiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHdoaWxlIChieXRlcykgewogICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn07Cgp2YXIgZmluZCA9IC9bIScoKX5dfCUyMC9nOwoKdmFyIHJlcGxhY2UgPSB7CiAgJyEnOiAnJTIxJywKICAiJyI6ICclMjcnLAogICcoJzogJyUyOCcsCiAgJyknOiAnJTI5JywKICAnfic6ICclN0UnLAogICclMjAnOiAnKycKfTsKCnZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkgewogIHJldHVybiByZXBsYWNlW21hdGNoXTsKfTsKCnZhciBzZXJpYWxpemUgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGl0KS5yZXBsYWNlKGZpbmQsIHJlcGxhY2VyKTsKfTsKCnZhciBwYXJzZVNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uIChyZXN1bHQsIHF1ZXJ5KSB7CiAgaWYgKHF1ZXJ5KSB7CiAgICB2YXIgYXR0cmlidXRlcyA9IHF1ZXJ5LnNwbGl0KCcmJyk7CiAgICB2YXIgaW5kZXggPSAwOwogICAgdmFyIGF0dHJpYnV0ZSwgZW50cnk7CiAgICB3aGlsZSAoaW5kZXggPCBhdHRyaWJ1dGVzLmxlbmd0aCkgewogICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2luZGV4KytdOwogICAgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkgewogICAgICAgIGVudHJ5ID0gYXR0cmlidXRlLnNwbGl0KCc9Jyk7CiAgICAgICAgcmVzdWx0LnB1c2goewogICAgICAgICAga2V5OiBkZXNlcmlhbGl6ZShlbnRyeS5zaGlmdCgpKSwKICAgICAgICAgIHZhbHVlOiBkZXNlcmlhbGl6ZShlbnRyeS5qb2luKCc9JykpCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgdXBkYXRlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHF1ZXJ5KSB7CiAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7CiAgcGFyc2VTZWFyY2hQYXJhbXModGhpcy5lbnRyaWVzLCBxdWVyeSk7Cn07Cgp2YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSBmdW5jdGlvbiAocGFzc2VkLCByZXF1aXJlZCkgewogIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpOwp9OwoKdmFyIFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBJdGVyYXRvcihwYXJhbXMsIGtpbmQpIHsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SLAogICAgaXRlcmF0b3I6IGdldEl0ZXJhdG9yKGdldEludGVybmFsUGFyYW1zU3RhdGUocGFyYW1zKS5lbnRyaWVzKSwKICAgIGtpbmQ6IGtpbmQKICB9KTsKfSwgJ0l0ZXJhdG9yJywgZnVuY3Rpb24gbmV4dCgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7CiAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOwogIHZhciBzdGVwID0gc3RhdGUuaXRlcmF0b3IubmV4dCgpOwogIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7CiAgaWYgKCFzdGVwLmRvbmUpIHsKICAgIHN0ZXAudmFsdWUgPSBraW5kID09PSAna2V5cycgPyBlbnRyeS5rZXkgOiBraW5kID09PSAndmFsdWVzJyA/IGVudHJ5LnZhbHVlIDogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdOwogIH0gcmV0dXJuIHN0ZXA7Cn0pOwoKLy8gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtdXJsc2VhcmNocGFyYW1zCnZhciBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTFNlYXJjaFBhcmFtcygvKiBpbml0ICovKSB7CiAgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpOwogIHZhciBpbml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQ7CiAgdmFyIHRoYXQgPSB0aGlzOwogIHZhciBlbnRyaWVzID0gW107CiAgdmFyIGl0ZXJhdG9yTWV0aG9kLCBpdGVyYXRvciwgbmV4dCwgc3RlcCwgZW50cnlJdGVyYXRvciwgZW50cnlOZXh0LCBmaXJzdCwgc2Vjb25kLCBrZXk7CgogIHNldEludGVybmFsU3RhdGUodGhhdCwgewogICAgdHlwZTogVVJMX1NFQVJDSF9QQVJBTVMsCiAgICBlbnRyaWVzOiBlbnRyaWVzLAogICAgdXBkYXRlVVJMOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sCiAgICB1cGRhdGVTZWFyY2hQYXJhbXM6IHVwZGF0ZVNlYXJjaFBhcmFtcwogIH0pOwoKICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoaXNPYmplY3QoaW5pdCkpIHsKICAgICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpbml0KTsKICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvck1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChpbml0KTsKICAgICAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDsKICAgICAgICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkgewogICAgICAgICAgZW50cnlJdGVyYXRvciA9IGdldEl0ZXJhdG9yKGFuT2JqZWN0KHN0ZXAudmFsdWUpKTsKICAgICAgICAgIGVudHJ5TmV4dCA9IGVudHJ5SXRlcmF0b3IubmV4dDsKICAgICAgICAgIGlmICgKICAgICAgICAgICAgKGZpcnN0ID0gZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikpLmRvbmUgfHwKICAgICAgICAgICAgKHNlY29uZCA9IGVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpKS5kb25lIHx8CiAgICAgICAgICAgICFlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKS5kb25lCiAgICAgICAgICApIHRocm93IFR5cGVFcnJvcignRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMicpOwogICAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiBmaXJzdC52YWx1ZSArICcnLCB2YWx1ZTogc2Vjb25kLnZhbHVlICsgJycgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgZm9yIChrZXkgaW4gaW5pdCkgaWYgKGhhc093bihpbml0LCBrZXkpKSBlbnRyaWVzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGluaXRba2V5XSArICcnIH0pOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VTZWFyY2hQYXJhbXMoZW50cmllcywgdHlwZW9mIGluaXQgPT09ICdzdHJpbmcnID8gaW5pdC5jaGFyQXQoMCkgPT09ICc/JyA/IGluaXQuc2xpY2UoMSkgOiBpbml0IDogaW5pdCArICcnKTsKICAgIH0KICB9Cn07Cgp2YXIgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlID0gVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IucHJvdG90eXBlOwoKcmVkZWZpbmVBbGwoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7CiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuYXBwZW50YCBtZXRob2QKICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtYXBwZW5kCiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHsKICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDIpOwogICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTsKICAgIHN0YXRlLmVudHJpZXMucHVzaCh7IGtleTogbmFtZSArICcnLCB2YWx1ZTogdmFsdWUgKyAnJyB9KTsKICAgIHN0YXRlLnVwZGF0ZVVSTCgpOwogIH0sCiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZGVsZXRlYCBtZXRob2QKICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZGVsZXRlCiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7CiAgICB2YXIga2V5ID0gbmFtZSArICcnOwogICAgdmFyIGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7CiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICBlbHNlIGluZGV4Kys7CiAgICB9CiAgICBzdGF0ZS51cGRhdGVVUkwoKTsKICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldAogIGdldDogZnVuY3Rpb24gZ2V0KG5hbWUpIHsKICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpOwogICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7CiAgICB2YXIga2V5ID0gbmFtZSArICcnOwogICAgdmFyIGluZGV4ID0gMDsKICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgcmV0dXJuIGVudHJpZXNbaW5kZXhdLnZhbHVlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5nZXRBbGxgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1nZXRhbGwKICBnZXRBbGw6IGZ1bmN0aW9uIGdldEFsbChuYW1lKSB7CiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOwogICAgdmFyIGtleSA9IG5hbWUgKyAnJzsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHZhciBpbmRleCA9IDA7CiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpIHJlc3VsdC5wdXNoKGVudHJpZXNbaW5kZXhdLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5oYXNgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXMKICBoYXM6IGZ1bmN0aW9uIGhhcyhuYW1lKSB7CiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOwogICAgdmFyIGtleSA9IG5hbWUgKyAnJzsKICAgIHZhciBpbmRleCA9IDA7CiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgewogICAgICBpZiAoZW50cmllc1tpbmRleCsrXS5rZXkgPT09IGtleSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zZXRgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zZXQKICBzZXQ6IGZ1bmN0aW9uIHNldChuYW1lLCB2YWx1ZSkgewogICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7CiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpOwogICAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzOwogICAgdmFyIGZvdW5kID0gZmFsc2U7CiAgICB2YXIga2V5ID0gbmFtZSArICcnOwogICAgdmFyIHZhbCA9IHZhbHVlICsgJyc7CiAgICB2YXIgaW5kZXggPSAwOwogICAgdmFyIGVudHJ5OwogICAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7CiAgICAgICAgaWYgKGZvdW5kKSBlbnRyaWVzLnNwbGljZShpbmRleC0tLCAxKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFmb3VuZCkgZW50cmllcy5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWwgfSk7CiAgICBzdGF0ZS51cGRhdGVVUkwoKTsKICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNvcnRgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zb3J0CiAgc29ydDogZnVuY3Rpb24gc29ydCgpIHsKICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7CiAgICAvLyBBcnJheSNzb3J0IGlzIG5vdCBzdGFibGUgaW4gc29tZSBlbmdpbmVzCiAgICB2YXIgc2xpY2UgPSBlbnRyaWVzLnNsaWNlKCk7CiAgICB2YXIgZW50cnksIGVudHJpZXNJbmRleCwgc2xpY2VJbmRleDsKICAgIGVudHJpZXMubGVuZ3RoID0gMDsKICAgIGZvciAoc2xpY2VJbmRleCA9IDA7IHNsaWNlSW5kZXggPCBzbGljZS5sZW5ndGg7IHNsaWNlSW5kZXgrKykgewogICAgICBlbnRyeSA9IHNsaWNlW3NsaWNlSW5kZXhdOwogICAgICBmb3IgKGVudHJpZXNJbmRleCA9IDA7IGVudHJpZXNJbmRleCA8IHNsaWNlSW5kZXg7IGVudHJpZXNJbmRleCsrKSB7CiAgICAgICAgaWYgKGVudHJpZXNbZW50cmllc0luZGV4XS5rZXkgPiBlbnRyeS5rZXkpIHsKICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGVudHJpZXNJbmRleCwgMCwgZW50cnkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlbnRyaWVzSW5kZXggPT09IHNsaWNlSW5kZXgpIGVudHJpZXMucHVzaChlbnRyeSk7CiAgICB9CiAgICBzdGF0ZS51cGRhdGVVUkwoKTsKICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZAogIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2sgLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllczsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFjaywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgdmFyIGluZGV4ID0gMDsKICAgIHZhciBlbnRyeTsKICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7CiAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTsKICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTsKICAgIH0KICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmtleXNgIG1ldGhvZAogIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7CiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICdrZXlzJyk7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZAogIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkgewogICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAndmFsdWVzJyk7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2QKICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCkgewogICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAnZW50cmllcycpOwogIH0KfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOwoKLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZApyZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsIElURVJBVE9SLCBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZW50cmllcyk7CgovLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsc2VhcmNocGFyYW1zLXN0cmluZ2lmaWNhdGlvbi1iZWhhdmlvcgpyZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgewogIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOwogIHZhciByZXN1bHQgPSBbXTsKICB2YXIgaW5kZXggPSAwOwogIHZhciBlbnRyeTsKICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgewogICAgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdOwogICAgcmVzdWx0LnB1c2goc2VyaWFsaXplKGVudHJ5LmtleSkgKyAnPScgKyBzZXJpYWxpemUoZW50cnkudmFsdWUpKTsKICB9IHJldHVybiByZXN1bHQuam9pbignJicpOwp9LCB7IGVudW1lcmFibGU6IHRydWUgfSk7CgpzZXRUb1N0cmluZ1RhZyhVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpOwoKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwgfSwgewogIFVSTFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IKfSk7CgovLyBXcmFwIGBmZXRjaGAgZm9yIGNvcnJlY3Qgd29yayB3aXRoIHBvbHlmaWxsZWQgYFVSTFNlYXJjaFBhcmFtc2AKLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3NAppZiAoIVVTRV9OQVRJVkVfVVJMICYmIHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSGVhZGVycyA9PSAnZnVuY3Rpb24nKSB7CiAgJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHsKICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHsKICAgICAgdmFyIGFyZ3MgPSBbaW5wdXRdOwogICAgICB2YXIgaW5pdCwgYm9keSwgaGVhZGVyczsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICAgICAgaW5pdCA9IGFyZ3VtZW50c1sxXTsKICAgICAgICBpZiAoaXNPYmplY3QoaW5pdCkpIHsKICAgICAgICAgIGJvZHkgPSBpbml0LmJvZHk7CiAgICAgICAgICBpZiAoY2xhc3NvZihib2R5KSA9PT0gVVJMX1NFQVJDSF9QQVJBTVMpIHsKICAgICAgICAgICAgaGVhZGVycyA9IGluaXQuaGVhZGVycyA/IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycykgOiBuZXcgSGVhZGVycygpOwogICAgICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkgewogICAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0ID0gY3JlYXRlKGluaXQsIHsKICAgICAgICAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgU3RyaW5nKGJvZHkpKSwKICAgICAgICAgICAgICBoZWFkZXJzOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgaGVhZGVycykKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFyZ3MucHVzaChpbml0KTsKICAgICAgfSByZXR1cm4gJGZldGNoLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgfQogIH0pOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLAogIGdldFN0YXRlOiBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YApfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyIpOwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uYXRpdmUtdXJsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtdXJsLmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGRlZmluZVByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiKTsKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiKTsKdmFyIGFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIik7CnZhciBjb2RlQXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIpLmNvZGVBdDsKdmFyIHRvQVNDSUkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHVueWNvZGUtdG8tYXNjaWkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3B1bnljb2RlLXRvLWFzY2lpLmpzIik7CnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKdmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwoKdmFyIE5hdGl2ZVVSTCA9IGdsb2JhbC5VUkw7CnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zOwp2YXIgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSA9IFVSTFNlYXJjaFBhcmFtc01vZHVsZS5nZXRTdGF0ZTsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsVVJMU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignVVJMJyk7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CnZhciBwb3cgPSBNYXRoLnBvdzsKCnZhciBJTlZBTElEX0FVVEhPUklUWSA9ICdJbnZhbGlkIGF1dGhvcml0eSc7CnZhciBJTlZBTElEX1NDSEVNRSA9ICdJbnZhbGlkIHNjaGVtZSc7CnZhciBJTlZBTElEX0hPU1QgPSAnSW52YWxpZCBob3N0JzsKdmFyIElOVkFMSURfUE9SVCA9ICdJbnZhbGlkIHBvcnQnOwoKdmFyIEFMUEhBID0gL1tBLVphLXpdLzsKdmFyIEFMUEhBTlVNRVJJQyA9IC9bXGQrXC0uQS1aYS16XS87CnZhciBESUdJVCA9IC9cZC87CnZhciBIRVhfU1RBUlQgPSAvXigweHwwWCkvOwp2YXIgT0NUID0gL15bMC03XSskLzsKdmFyIERFQyA9IC9eXGQrJC87CnZhciBIRVggPSAvXltcZEEtRmEtZl0rJC87Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4CnZhciBGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UID0gL1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIyUvOj9AW1xcXV0vOwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleAp2YXIgRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVF9FWENMVURJTkdfUEVSQ0VOVCA9IC9bXHUwMDAwXHUwMDA5XHUwMDBBXHUwMDBEICMvOj9AW1xcXV0vOwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleAp2YXIgTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1x1MDAwMC1cdTAwMUYgXSt8W1x1MDAwMC1cdTAwMUYgXSskL2c7Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4CnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcdTAwMDlcdTAwMEFcdTAwMERdL2c7CnZhciBFT0Y7Cgp2YXIgcGFyc2VIb3N0ID0gZnVuY3Rpb24gKHVybCwgaW5wdXQpIHsKICB2YXIgcmVzdWx0LCBjb2RlUG9pbnRzLCBpbmRleDsKICBpZiAoaW5wdXQuY2hhckF0KDApID09ICdbJykgewogICAgaWYgKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSAhPSAnXScpIHJldHVybiBJTlZBTElEX0hPU1Q7CiAgICByZXN1bHQgPSBwYXJzZUlQdjYoaW5wdXQuc2xpY2UoMSwgLTEpKTsKICAgIGlmICghcmVzdWx0KSByZXR1cm4gSU5WQUxJRF9IT1NUOwogICAgdXJsLmhvc3QgPSByZXN1bHQ7CiAgLy8gb3BhcXVlIGhvc3QKICB9IGVsc2UgaWYgKCFpc1NwZWNpYWwodXJsKSkgewogICAgaWYgKEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQudGVzdChpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7CiAgICByZXN1bHQgPSAnJzsKICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpOwogICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgcmVzdWx0ICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpbmRleF0sIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpOwogICAgfQogICAgdXJsLmhvc3QgPSByZXN1bHQ7CiAgfSBlbHNlIHsKICAgIGlucHV0ID0gdG9BU0NJSShpbnB1dCk7CiAgICBpZiAoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVC50ZXN0KGlucHV0KSkgcmV0dXJuIElOVkFMSURfSE9TVDsKICAgIHJlc3VsdCA9IHBhcnNlSVB2NChpbnB1dCk7CiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gSU5WQUxJRF9IT1NUOwogICAgdXJsLmhvc3QgPSByZXN1bHQ7CiAgfQp9OwoKdmFyIHBhcnNlSVB2NCA9IGZ1bmN0aW9uIChpbnB1dCkgewogIHZhciBwYXJ0cyA9IGlucHV0LnNwbGl0KCcuJyk7CiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDsKICBpZiAocGFydHMubGVuZ3RoICYmIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09ICcnKSB7CiAgICBwYXJ0cy5wb3AoKTsKICB9CiAgcGFydHNMZW5ndGggPSBwYXJ0cy5sZW5ndGg7CiAgaWYgKHBhcnRzTGVuZ3RoID4gNCkgcmV0dXJuIGlucHV0OwogIG51bWJlcnMgPSBbXTsKICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0c0xlbmd0aDsgaW5kZXgrKykgewogICAgcGFydCA9IHBhcnRzW2luZGV4XTsKICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7CiAgICByYWRpeCA9IDEwOwogICAgaWYgKHBhcnQubGVuZ3RoID4gMSAmJiBwYXJ0LmNoYXJBdCgwKSA9PSAnMCcpIHsKICAgICAgcmFkaXggPSBIRVhfU1RBUlQudGVzdChwYXJ0KSA/IDE2IDogODsKICAgICAgcGFydCA9IHBhcnQuc2xpY2UocmFkaXggPT0gOCA/IDEgOiAyKTsKICAgIH0KICAgIGlmIChwYXJ0ID09PSAnJykgewogICAgICBudW1iZXIgPSAwOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCEocmFkaXggPT0gMTAgPyBERUMgOiByYWRpeCA9PSA4ID8gT0NUIDogSEVYKS50ZXN0KHBhcnQpKSByZXR1cm4gaW5wdXQ7CiAgICAgIG51bWJlciA9IHBhcnNlSW50KHBhcnQsIHJhZGl4KTsKICAgIH0KICAgIG51bWJlcnMucHVzaChudW1iZXIpOwogIH0KICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0c0xlbmd0aDsgaW5kZXgrKykgewogICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07CiAgICBpZiAoaW5kZXggPT0gcGFydHNMZW5ndGggLSAxKSB7CiAgICAgIGlmIChudW1iZXIgPj0gcG93KDI1NiwgNSAtIHBhcnRzTGVuZ3RoKSkgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7CiAgfQogIGlwdjQgPSBudW1iZXJzLnBvcCgpOwogIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICBpcHY0ICs9IG51bWJlcnNbaW5kZXhdICogcG93KDI1NiwgMyAtIGluZGV4KTsKICB9CiAgcmV0dXJuIGlwdjQ7Cn07CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMKdmFyIHBhcnNlSVB2NiA9IGZ1bmN0aW9uIChpbnB1dCkgewogIHZhciBhZGRyZXNzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdOwogIHZhciBwaWVjZUluZGV4ID0gMDsKICB2YXIgY29tcHJlc3MgPSBudWxsOwogIHZhciBwb2ludGVyID0gMDsKICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDsKCiAgdmFyIGNoYXIgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gaW5wdXQuY2hhckF0KHBvaW50ZXIpOwogIH07CgogIGlmIChjaGFyKCkgPT0gJzonKSB7CiAgICBpZiAoaW5wdXQuY2hhckF0KDEpICE9ICc6JykgcmV0dXJuOwogICAgcG9pbnRlciArPSAyOwogICAgcGllY2VJbmRleCsrOwogICAgY29tcHJlc3MgPSBwaWVjZUluZGV4OwogIH0KICB3aGlsZSAoY2hhcigpKSB7CiAgICBpZiAocGllY2VJbmRleCA9PSA4KSByZXR1cm47CiAgICBpZiAoY2hhcigpID09ICc6JykgewogICAgICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHJldHVybjsKICAgICAgcG9pbnRlcisrOwogICAgICBwaWVjZUluZGV4Kys7CiAgICAgIGNvbXByZXNzID0gcGllY2VJbmRleDsKICAgICAgY29udGludWU7CiAgICB9CiAgICB2YWx1ZSA9IGxlbmd0aCA9IDA7CiAgICB3aGlsZSAobGVuZ3RoIDwgNCAmJiBIRVgudGVzdChjaGFyKCkpKSB7CiAgICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIHBhcnNlSW50KGNoYXIoKSwgMTYpOwogICAgICBwb2ludGVyKys7CiAgICAgIGxlbmd0aCsrOwogICAgfQogICAgaWYgKGNoYXIoKSA9PSAnLicpIHsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm47CiAgICAgIHBvaW50ZXIgLT0gbGVuZ3RoOwogICAgICBpZiAocGllY2VJbmRleCA+IDYpIHJldHVybjsKICAgICAgbnVtYmVyc1NlZW4gPSAwOwogICAgICB3aGlsZSAoY2hhcigpKSB7CiAgICAgICAgaXB2NFBpZWNlID0gbnVsbDsKICAgICAgICBpZiAobnVtYmVyc1NlZW4gPiAwKSB7CiAgICAgICAgICBpZiAoY2hhcigpID09ICcuJyAmJiBudW1iZXJzU2VlbiA8IDQpIHBvaW50ZXIrKzsKICAgICAgICAgIGVsc2UgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIURJR0lULnRlc3QoY2hhcigpKSkgcmV0dXJuOwogICAgICAgIHdoaWxlIChESUdJVC50ZXN0KGNoYXIoKSkpIHsKICAgICAgICAgIG51bWJlciA9IHBhcnNlSW50KGNoYXIoKSwgMTApOwogICAgICAgICAgaWYgKGlwdjRQaWVjZSA9PT0gbnVsbCkgaXB2NFBpZWNlID0gbnVtYmVyOwogICAgICAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApIHJldHVybjsKICAgICAgICAgIGVsc2UgaXB2NFBpZWNlID0gaXB2NFBpZWNlICogMTAgKyBudW1iZXI7CiAgICAgICAgICBpZiAoaXB2NFBpZWNlID4gMjU1KSByZXR1cm47CiAgICAgICAgICBwb2ludGVyKys7CiAgICAgICAgfQogICAgICAgIGFkZHJlc3NbcGllY2VJbmRleF0gPSBhZGRyZXNzW3BpZWNlSW5kZXhdICogMjU2ICsgaXB2NFBpZWNlOwogICAgICAgIG51bWJlcnNTZWVuKys7CiAgICAgICAgaWYgKG51bWJlcnNTZWVuID09IDIgfHwgbnVtYmVyc1NlZW4gPT0gNCkgcGllY2VJbmRleCsrOwogICAgICB9CiAgICAgIGlmIChudW1iZXJzU2VlbiAhPSA0KSByZXR1cm47CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIGlmIChjaGFyKCkgPT0gJzonKSB7CiAgICAgIHBvaW50ZXIrKzsKICAgICAgaWYgKCFjaGFyKCkpIHJldHVybjsKICAgIH0gZWxzZSBpZiAoY2hhcigpKSByZXR1cm47CiAgICBhZGRyZXNzW3BpZWNlSW5kZXgrK10gPSB2YWx1ZTsKICB9CiAgaWYgKGNvbXByZXNzICE9PSBudWxsKSB7CiAgICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzczsKICAgIHBpZWNlSW5kZXggPSA3OwogICAgd2hpbGUgKHBpZWNlSW5kZXggIT0gMCAmJiBzd2FwcyA+IDApIHsKICAgICAgc3dhcCA9IGFkZHJlc3NbcGllY2VJbmRleF07CiAgICAgIGFkZHJlc3NbcGllY2VJbmRleC0tXSA9IGFkZHJlc3NbY29tcHJlc3MgKyBzd2FwcyAtIDFdOwogICAgICBhZGRyZXNzW2NvbXByZXNzICsgLS1zd2Fwc10gPSBzd2FwOwogICAgfQogIH0gZWxzZSBpZiAocGllY2VJbmRleCAhPSA4KSByZXR1cm47CiAgcmV0dXJuIGFkZHJlc3M7Cn07Cgp2YXIgZmluZExvbmdlc3RaZXJvU2VxdWVuY2UgPSBmdW5jdGlvbiAoaXB2NikgewogIHZhciBtYXhJbmRleCA9IG51bGw7CiAgdmFyIG1heExlbmd0aCA9IDE7CiAgdmFyIGN1cnJTdGFydCA9IG51bGw7CiAgdmFyIGN1cnJMZW5ndGggPSAwOwogIHZhciBpbmRleCA9IDA7CiAgZm9yICg7IGluZGV4IDwgODsgaW5kZXgrKykgewogICAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7CiAgICAgIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7CiAgICAgICAgbWF4SW5kZXggPSBjdXJyU3RhcnQ7CiAgICAgICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDsKICAgICAgfQogICAgICBjdXJyU3RhcnQgPSBudWxsOwogICAgICBjdXJyTGVuZ3RoID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjdXJyU3RhcnQgPT09IG51bGwpIGN1cnJTdGFydCA9IGluZGV4OwogICAgICArK2N1cnJMZW5ndGg7CiAgICB9CiAgfQogIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7CiAgICBtYXhJbmRleCA9IGN1cnJTdGFydDsKICAgIG1heExlbmd0aCA9IGN1cnJMZW5ndGg7CiAgfQogIHJldHVybiBtYXhJbmRleDsKfTsKCnZhciBzZXJpYWxpemVIb3N0ID0gZnVuY3Rpb24gKGhvc3QpIHsKICB2YXIgcmVzdWx0LCBpbmRleCwgY29tcHJlc3MsIGlnbm9yZTA7CiAgLy8gaXB2NAogIGlmICh0eXBlb2YgaG9zdCA9PSAnbnVtYmVyJykgewogICAgcmVzdWx0ID0gW107CiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7CiAgICAgIHJlc3VsdC51bnNoaWZ0KGhvc3QgJSAyNTYpOwogICAgICBob3N0ID0gZmxvb3IoaG9zdCAvIDI1Nik7CiAgICB9IHJldHVybiByZXN1bHQuam9pbignLicpOwogIC8vIGlwdjYKICB9IGVsc2UgaWYgKHR5cGVvZiBob3N0ID09ICdvYmplY3QnKSB7CiAgICByZXN1bHQgPSAnJzsKICAgIGNvbXByZXNzID0gZmluZExvbmdlc3RaZXJvU2VxdWVuY2UoaG9zdCk7CiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7CiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTsKICAgICAgaWYgKGlnbm9yZTApIGlnbm9yZTAgPSBmYWxzZTsKICAgICAgaWYgKGNvbXByZXNzID09PSBpbmRleCkgewogICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7CiAgICAgICAgaWdub3JlMCA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ICs9IGhvc3RbaW5kZXhdLnRvU3RyaW5nKDE2KTsKICAgICAgICBpZiAoaW5kZXggPCA3KSByZXN1bHQgKz0gJzonOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gJ1snICsgcmVzdWx0ICsgJ10nOwogIH0gcmV0dXJuIGhvc3Q7Cn07Cgp2YXIgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCA9IHt9Owp2YXIgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0LCB7CiAgJyAnOiAxLCAnIic6IDEsICc8JzogMSwgJz4nOiAxLCAnYCc6IDEKfSk7CnZhciBwYXRoUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0LCB7CiAgJyMnOiAxLCAnPyc6IDEsICd7JzogMSwgJ30nOiAxCn0pOwp2YXIgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBwYXRoUGVyY2VudEVuY29kZVNldCwgewogICcvJzogMSwgJzonOiAxLCAnOyc6IDEsICc9JzogMSwgJ0AnOiAxLCAnWyc6IDEsICdcXCc6IDEsICddJzogMSwgJ14nOiAxLCAnfCc6IDEKfSk7Cgp2YXIgcGVyY2VudEVuY29kZSA9IGZ1bmN0aW9uIChjaGFyLCBzZXQpIHsKICB2YXIgY29kZSA9IGNvZGVBdChjaGFyLCAwKTsKICByZXR1cm4gY29kZSA+IDB4MjAgJiYgY29kZSA8IDB4N0YgJiYgIWhhcyhzZXQsIGNoYXIpID8gY2hhciA6IGVuY29kZVVSSUNvbXBvbmVudChjaGFyKTsKfTsKCnZhciBzcGVjaWFsU2NoZW1lcyA9IHsKICBmdHA6IDIxLAogIGZpbGU6IG51bGwsCiAgaHR0cDogODAsCiAgaHR0cHM6IDQ0MywKICB3czogODAsCiAgd3NzOiA0NDMKfTsKCnZhciBpc1NwZWNpYWwgPSBmdW5jdGlvbiAodXJsKSB7CiAgcmV0dXJuIGhhcyhzcGVjaWFsU2NoZW1lcywgdXJsLnNjaGVtZSk7Cn07Cgp2YXIgaW5jbHVkZXNDcmVkZW50aWFscyA9IGZ1bmN0aW9uICh1cmwpIHsKICByZXR1cm4gdXJsLnVzZXJuYW1lICE9ICcnIHx8IHVybC5wYXNzd29yZCAhPSAnJzsKfTsKCnZhciBjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQgPSBmdW5jdGlvbiAodXJsKSB7CiAgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJzsKfTsKCnZhciBpc1dpbmRvd3NEcml2ZUxldHRlciA9IGZ1bmN0aW9uIChzdHJpbmcsIG5vcm1hbGl6ZWQpIHsKICB2YXIgc2Vjb25kOwogIHJldHVybiBzdHJpbmcubGVuZ3RoID09IDIgJiYgQUxQSEEudGVzdChzdHJpbmcuY2hhckF0KDApKQogICAgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgKCFub3JtYWxpemVkICYmIHNlY29uZCA9PSAnfCcpKTsKfTsKCnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykgewogIHZhciB0aGlyZDsKICByZXR1cm4gc3RyaW5nLmxlbmd0aCA+IDEgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoc3RyaW5nLnNsaWNlKDAsIDIpKSAmJiAoCiAgICBzdHJpbmcubGVuZ3RoID09IDIgfHwKICAgICgodGhpcmQgPSBzdHJpbmcuY2hhckF0KDIpKSA9PT0gJy8nIHx8IHRoaXJkID09PSAnXFwnIHx8IHRoaXJkID09PSAnPycgfHwgdGhpcmQgPT09ICcjJykKICApOwp9OwoKdmFyIHNob3J0ZW5VUkxzUGF0aCA9IGZ1bmN0aW9uICh1cmwpIHsKICB2YXIgcGF0aCA9IHVybC5wYXRoOwogIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoOwogIGlmIChwYXRoU2l6ZSAmJiAodXJsLnNjaGVtZSAhPSAnZmlsZScgfHwgcGF0aFNpemUgIT0gMSB8fCAhaXNXaW5kb3dzRHJpdmVMZXR0ZXIocGF0aFswXSwgdHJ1ZSkpKSB7CiAgICBwYXRoLnBvcCgpOwogIH0KfTsKCnZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7CiAgcmV0dXJuIHNlZ21lbnQgPT09ICcuJyB8fCBzZWdtZW50LnRvTG93ZXJDYXNlKCkgPT09ICclMmUnOwp9OwoKdmFyIGlzRG91YmxlRG90ID0gZnVuY3Rpb24gKHNlZ21lbnQpIHsKICBzZWdtZW50ID0gc2VnbWVudC50b0xvd2VyQ2FzZSgpOwogIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7Cn07CgovLyBTdGF0ZXM6CnZhciBTQ0hFTUVfU1RBUlQgPSB7fTsKdmFyIFNDSEVNRSA9IHt9Owp2YXIgTk9fU0NIRU1FID0ge307CnZhciBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWSA9IHt9Owp2YXIgUEFUSF9PUl9BVVRIT1JJVFkgPSB7fTsKdmFyIFJFTEFUSVZFID0ge307CnZhciBSRUxBVElWRV9TTEFTSCA9IHt9Owp2YXIgU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUyA9IHt9Owp2YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTsKdmFyIEFVVEhPUklUWSA9IHt9Owp2YXIgSE9TVCA9IHt9Owp2YXIgSE9TVE5BTUUgPSB7fTsKdmFyIFBPUlQgPSB7fTsKdmFyIEZJTEUgPSB7fTsKdmFyIEZJTEVfU0xBU0ggPSB7fTsKdmFyIEZJTEVfSE9TVCA9IHt9Owp2YXIgUEFUSF9TVEFSVCA9IHt9Owp2YXIgUEFUSCA9IHt9Owp2YXIgQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSCA9IHt9Owp2YXIgUVVFUlkgPSB7fTsKdmFyIEZSQUdNRU5UID0ge307CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMKdmFyIHBhcnNlVVJMID0gZnVuY3Rpb24gKHVybCwgaW5wdXQsIHN0YXRlT3ZlcnJpZGUsIGJhc2UpIHsKICB2YXIgc3RhdGUgPSBzdGF0ZU92ZXJyaWRlIHx8IFNDSEVNRV9TVEFSVDsKICB2YXIgcG9pbnRlciA9IDA7CiAgdmFyIGJ1ZmZlciA9ICcnOwogIHZhciBzZWVuQXQgPSBmYWxzZTsKICB2YXIgc2VlbkJyYWNrZXQgPSBmYWxzZTsKICB2YXIgc2VlblBhc3N3b3JkVG9rZW4gPSBmYWxzZTsKICB2YXIgY29kZVBvaW50cywgY2hhciwgYnVmZmVyQ29kZVBvaW50cywgZmFpbHVyZTsKCiAgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7CiAgICB1cmwuc2NoZW1lID0gJyc7CiAgICB1cmwudXNlcm5hbWUgPSAnJzsKICAgIHVybC5wYXNzd29yZCA9ICcnOwogICAgdXJsLmhvc3QgPSBudWxsOwogICAgdXJsLnBvcnQgPSBudWxsOwogICAgdXJsLnBhdGggPSBbXTsKICAgIHVybC5xdWVyeSA9IG51bGw7CiAgICB1cmwuZnJhZ21lbnQgPSBudWxsOwogICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSBmYWxzZTsKICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShMRUFESU5HX0FORF9UUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFLCAnJyk7CiAgfQoKICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoVEFCX0FORF9ORVdfTElORSwgJycpOwoKICBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKGlucHV0KTsKCiAgd2hpbGUgKHBvaW50ZXIgPD0gY29kZVBvaW50cy5sZW5ndGgpIHsKICAgIGNoYXIgPSBjb2RlUG9pbnRzW3BvaW50ZXJdOwogICAgc3dpdGNoIChzdGF0ZSkgewogICAgICBjYXNlIFNDSEVNRV9TVEFSVDoKICAgICAgICBpZiAoY2hhciAmJiBBTFBIQS50ZXN0KGNoYXIpKSB7CiAgICAgICAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgc3RhdGUgPSBTQ0hFTUU7CiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkgewogICAgICAgICAgc3RhdGUgPSBOT19TQ0hFTUU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBTQ0hFTUU6CiAgICAgICAgaWYgKGNoYXIgJiYgKEFMUEhBTlVNRVJJQy50ZXN0KGNoYXIpIHx8IGNoYXIgPT0gJysnIHx8IGNoYXIgPT0gJy0nIHx8IGNoYXIgPT0gJy4nKSkgewogICAgICAgICAgYnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonKSB7CiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSAmJiAoCiAgICAgICAgICAgIChpc1NwZWNpYWwodXJsKSAhPSBoYXMoc3BlY2lhbFNjaGVtZXMsIGJ1ZmZlcikpIHx8CiAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSB8fAogICAgICAgICAgICAodXJsLnNjaGVtZSA9PSAnZmlsZScgJiYgIXVybC5ob3N0KQogICAgICAgICAgKSkgcmV0dXJuOwogICAgICAgICAgdXJsLnNjaGVtZSA9IGJ1ZmZlcjsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSB7CiAgICAgICAgICAgIGlmIChpc1NwZWNpYWwodXJsKSAmJiBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSA9PSB1cmwucG9ydCkgdXJsLnBvcnQgPSBudWxsOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJykgewogICAgICAgICAgICBzdGF0ZSA9IEZJTEU7CiAgICAgICAgICB9IGVsc2UgaWYgKGlzU3BlY2lhbCh1cmwpICYmIGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gdXJsLnNjaGVtZSkgewogICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZOwogICAgICAgICAgfSBlbHNlIGlmIChpc1NwZWNpYWwodXJsKSkgewogICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVM7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykgewogICAgICAgICAgICBzdGF0ZSA9IFBBVEhfT1JfQVVUSE9SSVRZOwogICAgICAgICAgICBwb2ludGVyKys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1cmwuY2Fubm90QmVBQmFzZVVSTCA9IHRydWU7CiAgICAgICAgICAgIHVybC5wYXRoLnB1c2goJycpOwogICAgICAgICAgICBzdGF0ZSA9IENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkgewogICAgICAgICAgYnVmZmVyID0gJyc7CiAgICAgICAgICBzdGF0ZSA9IE5PX1NDSEVNRTsKICAgICAgICAgIHBvaW50ZXIgPSAwOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIHJldHVybiBJTlZBTElEX1NDSEVNRTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgTk9fU0NIRU1FOgogICAgICAgIGlmICghYmFzZSB8fCAoYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGNoYXIgIT0gJyMnKSkgcmV0dXJuIElOVkFMSURfU0NIRU1FOwogICAgICAgIGlmIChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciA9PSAnIycpIHsKICAgICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTsKICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7CiAgICAgICAgICB1cmwuY2Fubm90QmVBQmFzZVVSTCA9IHRydWU7CiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0YXRlID0gYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnID8gRklMRSA6IFJFTEFUSVZFOwogICAgICAgIGNvbnRpbnVlOwoKICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWToKICAgICAgICBpZiAoY2hhciA9PSAnLycgJiYgY29kZVBvaW50c1twb2ludGVyICsgMV0gPT0gJy8nKSB7CiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOwogICAgICAgICAgcG9pbnRlcisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZSA9IFJFTEFUSVZFOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6CiAgICAgICAgaWYgKGNoYXIgPT0gJy8nKSB7CiAgICAgICAgICBzdGF0ZSA9IEFVVEhPUklUWTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICBjYXNlIFJFTEFUSVZFOgogICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTsKICAgICAgICBpZiAoY2hhciA9PSBFT0YpIHsKICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7CiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkOwogICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDsKICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycgfHwgKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHsKICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkVfU0xBU0g7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICc/JykgewogICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7CiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OwogICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKICAgICAgICAgIHVybC5xdWVyeSA9ICcnOwogICAgICAgICAgc3RhdGUgPSBRVUVSWTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lOwogICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7CiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOwogICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTsKICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnOwogICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7CiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OwogICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKICAgICAgICAgIHVybC5wYXRoLnBvcCgpOwogICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgUkVMQVRJVkVfU0xBU0g6CiAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXCcpKSB7CiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOwogICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycpIHsKICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lOwogICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7CiAgICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGJyZWFrOwoKICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTOgogICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7CiAgICAgICAgaWYgKGNoYXIgIT0gJy8nIHx8IGJ1ZmZlci5jaGFyQXQocG9pbnRlciArIDEpICE9ICcvJykgY29udGludWU7CiAgICAgICAgcG9pbnRlcisrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUzoKICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgY2hhciAhPSAnXFwnKSB7CiAgICAgICAgICBzdGF0ZSA9IEFVVEhPUklUWTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gYnJlYWs7CgogICAgICBjYXNlIEFVVEhPUklUWToKICAgICAgICBpZiAoY2hhciA9PSAnQCcpIHsKICAgICAgICAgIGlmIChzZWVuQXQpIGJ1ZmZlciA9ICclNDAnICsgYnVmZmVyOwogICAgICAgICAgc2VlbkF0ID0gdHJ1ZTsKICAgICAgICAgIGJ1ZmZlckNvZGVQb2ludHMgPSBhcnJheUZyb20oYnVmZmVyKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyQ29kZVBvaW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gYnVmZmVyQ29kZVBvaW50c1tpXTsKICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSAnOicgJiYgIXNlZW5QYXNzd29yZFRva2VuKSB7CiAgICAgICAgICAgICAgc2VlblBhc3N3b3JkVG9rZW4gPSB0cnVlOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlbmNvZGVkQ29kZVBvaW50cyA9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50LCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOwogICAgICAgICAgICBpZiAoc2VlblBhc3N3b3JkVG9rZW4pIHVybC5wYXNzd29yZCArPSBlbmNvZGVkQ29kZVBvaW50czsKICAgICAgICAgICAgZWxzZSB1cmwudXNlcm5hbWUgKz0gZW5jb2RlZENvZGVQb2ludHM7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHwKICAgICAgICAgIChjaGFyID09ICdcXCcgJiYgaXNTcGVjaWFsKHVybCkpCiAgICAgICAgKSB7CiAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZOwogICAgICAgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxOwogICAgICAgICAgYnVmZmVyID0gJyc7CiAgICAgICAgICBzdGF0ZSA9IEhPU1Q7CiAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaGFyOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIT1NUOgogICAgICBjYXNlIEhPU1ROQU1FOgogICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnOicgJiYgIXNlZW5CcmFja2V0KSB7CiAgICAgICAgICBpZiAoYnVmZmVyID09ICcnKSByZXR1cm4gSU5WQUxJRF9IT1NUOwogICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIHN0YXRlID0gUE9SVDsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlID09IEhPU1ROQU1FKSByZXR1cm47CiAgICAgICAgfSBlbHNlIGlmICgKICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnIHx8CiAgICAgICAgICAoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKQogICAgICAgICkgewogICAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIGJ1ZmZlciA9PSAnJyAmJiAoaW5jbHVkZXNDcmVkZW50aWFscyh1cmwpIHx8IHVybC5wb3J0ICE9PSBudWxsKSkgcmV0dXJuOwogICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGNoYXIgPT0gJ1snKSBzZWVuQnJhY2tldCA9IHRydWU7CiAgICAgICAgICBlbHNlIGlmIChjaGFyID09ICddJykgc2VlbkJyYWNrZXQgPSBmYWxzZTsKICAgICAgICAgIGJ1ZmZlciArPSBjaGFyOwogICAgICAgIH0gYnJlYWs7CgogICAgICBjYXNlIFBPUlQ6CiAgICAgICAgaWYgKERJR0lULnRlc3QoY2hhcikpIHsKICAgICAgICAgIGJ1ZmZlciArPSBjaGFyOwogICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBjaGFyID09IEVPRiB8fCBjaGFyID09ICcvJyB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJyB8fAogICAgICAgICAgKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkgfHwKICAgICAgICAgIHN0YXRlT3ZlcnJpZGUKICAgICAgICApIHsKICAgICAgICAgIGlmIChidWZmZXIgIT0gJycpIHsKICAgICAgICAgICAgdmFyIHBvcnQgPSBwYXJzZUludChidWZmZXIsIDEwKTsKICAgICAgICAgICAgaWYgKHBvcnQgPiAweEZGRkYpIHJldHVybiBJTlZBTElEX1BPUlQ7CiAgICAgICAgICAgIHVybC5wb3J0ID0gKGlzU3BlY2lhbCh1cmwpICYmIHBvcnQgPT09IHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdKSA/IG51bGwgOiBwb3J0OwogICAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47CiAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfUE9SVDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgRklMRToKICAgICAgICB1cmwuc2NoZW1lID0gJ2ZpbGUnOwogICAgICAgIGlmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXCcpIHN0YXRlID0gRklMRV9TTEFTSDsKICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykgewogICAgICAgICAgaWYgKGNoYXIgPT0gRU9GKSB7CiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOwogICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICc/JykgewogICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKICAgICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7CiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7CiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOwogICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihjb2RlUG9pbnRzLnNsaWNlKHBvaW50ZXIpLmpvaW4oJycpKSkgewogICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CiAgICAgICAgICAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgRklMRV9TTEFTSDoKICAgICAgICBpZiAoY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnKSB7CiAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoY29kZVBvaW50cy5zbGljZShwb2ludGVyKS5qb2luKCcnKSkpIHsKICAgICAgICAgIGlmIChpc1dpbmRvd3NEcml2ZUxldHRlcihiYXNlLnBhdGhbMF0sIHRydWUpKSB1cmwucGF0aC5wdXNoKGJhc2UucGF0aFswXSk7CiAgICAgICAgICBlbHNlIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgIH0KICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgY29udGludWU7CgogICAgICBjYXNlIEZJTEVfSE9TVDoKICAgICAgICBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkgewogICAgICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlciA9PSAnJykgewogICAgICAgICAgICB1cmwuaG9zdCA9ICcnOwogICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuOwogICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWlsdXJlID0gcGFyc2VIb3N0KHVybCwgYnVmZmVyKTsKICAgICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlOwogICAgICAgICAgICBpZiAodXJsLmhvc3QgPT0gJ2xvY2FsaG9zdCcpIHVybC5ob3N0ID0gJyc7CiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47CiAgICAgICAgICAgIGJ1ZmZlciA9ICcnOwogICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CiAgICAgICAgICB9IGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBidWZmZXIgKz0gY2hhcjsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgUEFUSF9TVEFSVDoKICAgICAgICBpZiAoaXNTcGVjaWFsKHVybCkpIHsKICAgICAgICAgIHN0YXRlID0gUEFUSDsKICAgICAgICAgIGlmIChjaGFyICE9ICcvJyAmJiBjaGFyICE9ICdcXCcpIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnPycpIHsKICAgICAgICAgIHVybC5xdWVyeSA9ICcnOwogICAgICAgICAgc3RhdGUgPSBRVUVSWTsKICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikgewogICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgaWYgKGNoYXIgIT0gJy8nKSBjb250aW51ZTsKICAgICAgICB9IGJyZWFrOwoKICAgICAgY2FzZSBQQVRIOgogICAgICAgIGlmICgKICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8CiAgICAgICAgICAoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKSB8fAogICAgICAgICAgKCFzdGF0ZU92ZXJyaWRlICYmIChjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpCiAgICAgICAgKSB7CiAgICAgICAgICBpZiAoaXNEb3VibGVEb3QoYnVmZmVyKSkgewogICAgICAgICAgICBzaG9ydGVuVVJMc1BhdGgodXJsKTsKICAgICAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmICEoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkgewogICAgICAgICAgICAgIHVybC5wYXRoLnB1c2goJycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGlzU2luZ2xlRG90KGJ1ZmZlcikpIHsKICAgICAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmICEoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkgewogICAgICAgICAgICAgIHVybC5wYXRoLnB1c2goJycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodXJsLnNjaGVtZSA9PSAnZmlsZScgJiYgIXVybC5wYXRoLmxlbmd0aCAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihidWZmZXIpKSB7CiAgICAgICAgICAgICAgaWYgKHVybC5ob3N0KSB1cmwuaG9zdCA9ICcnOwogICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5jaGFyQXQoMCkgKyAnOic7IC8vIG5vcm1hbGl6ZSB3aW5kb3dzIGRyaXZlIGxldHRlcgogICAgICAgICAgICB9CiAgICAgICAgICAgIHVybC5wYXRoLnB1c2goYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJ1ZmZlciA9ICcnOwogICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpIHsKICAgICAgICAgICAgd2hpbGUgKHVybC5wYXRoLmxlbmd0aCA+IDEgJiYgdXJsLnBhdGhbMF0gPT09ICcnKSB7CiAgICAgICAgICAgICAgdXJsLnBhdGguc2hpZnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNoYXIgPT0gJz8nKSB7CiAgICAgICAgICAgIHVybC5xdWVyeSA9ICcnOwogICAgICAgICAgICBzdGF0ZSA9IFFVRVJZOwogICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcjJykgewogICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnVmZmVyICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpOwogICAgICAgIH0gYnJlYWs7CgogICAgICBjYXNlIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg6CiAgICAgICAgaWYgKGNoYXIgPT0gJz8nKSB7CiAgICAgICAgICB1cmwucXVlcnkgPSAnJzsKICAgICAgICAgIHN0YXRlID0gUVVFUlk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcjJykgewogICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7CiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UOwogICAgICAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHsKICAgICAgICAgIHVybC5wYXRoWzBdICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgUVVFUlk6CiAgICAgICAgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikgewogICAgICAgICAgaWYgKGNoYXIgPT0gIiciICYmIGlzU3BlY2lhbCh1cmwpKSB1cmwucXVlcnkgKz0gJyUyNyc7CiAgICAgICAgICBlbHNlIGlmIChjaGFyID09ICcjJykgdXJsLnF1ZXJ5ICs9ICclMjMnOwogICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTsKICAgICAgICB9IGJyZWFrOwoKICAgICAgY2FzZSBGUkFHTUVOVDoKICAgICAgICBpZiAoY2hhciAhPSBFT0YpIHVybC5mcmFnbWVudCArPSBwZXJjZW50RW5jb2RlKGNoYXIsIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcG9pbnRlcisrOwogIH0KfTsKCi8vIGBVUkxgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLWNsYXNzCnZhciBVUkxDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTCh1cmwgLyogLCBiYXNlICovKSB7CiAgdmFyIHRoYXQgPSBhbkluc3RhbmNlKHRoaXMsIFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7CiAgdmFyIGJhc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKICB2YXIgdXJsU3RyaW5nID0gU3RyaW5nKHVybCk7CiAgdmFyIHN0YXRlID0gc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7IHR5cGU6ICdVUkwnIH0pOwogIHZhciBiYXNlU3RhdGUsIGZhaWx1cmU7CiAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkgewogICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBVUkxDb25zdHJ1Y3RvcikgYmFzZVN0YXRlID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZShiYXNlKTsKICAgIGVsc2UgewogICAgICBmYWlsdXJlID0gcGFyc2VVUkwoYmFzZVN0YXRlID0ge30sIFN0cmluZyhiYXNlKSk7CiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7CiAgICB9CiAgfQogIGZhaWx1cmUgPSBwYXJzZVVSTChzdGF0ZSwgdXJsU3RyaW5nLCBudWxsLCBiYXNlU3RhdGUpOwogIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7CiAgdmFyIHNlYXJjaFBhcmFtcyA9IHN0YXRlLnNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICB2YXIgc2VhcmNoUGFyYW1zU3RhdGUgPSBnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlKHNlYXJjaFBhcmFtcyk7CiAgc2VhcmNoUGFyYW1zU3RhdGUudXBkYXRlU2VhcmNoUGFyYW1zKHN0YXRlLnF1ZXJ5KTsKICBzZWFyY2hQYXJhbXNTdGF0ZS51cGRhdGVVUkwgPSBmdW5jdGlvbiAoKSB7CiAgICBzdGF0ZS5xdWVyeSA9IFN0cmluZyhzZWFyY2hQYXJhbXMpIHx8IG51bGw7CiAgfTsKICBpZiAoIURFU0NSSVBUT1JTKSB7CiAgICB0aGF0LmhyZWYgPSBzZXJpYWxpemVVUkwuY2FsbCh0aGF0KTsKICAgIHRoYXQub3JpZ2luID0gZ2V0T3JpZ2luLmNhbGwodGhhdCk7CiAgICB0aGF0LnByb3RvY29sID0gZ2V0UHJvdG9jb2wuY2FsbCh0aGF0KTsKICAgIHRoYXQudXNlcm5hbWUgPSBnZXRVc2VybmFtZS5jYWxsKHRoYXQpOwogICAgdGhhdC5wYXNzd29yZCA9IGdldFBhc3N3b3JkLmNhbGwodGhhdCk7CiAgICB0aGF0Lmhvc3QgPSBnZXRIb3N0LmNhbGwodGhhdCk7CiAgICB0aGF0Lmhvc3RuYW1lID0gZ2V0SG9zdG5hbWUuY2FsbCh0aGF0KTsKICAgIHRoYXQucG9ydCA9IGdldFBvcnQuY2FsbCh0aGF0KTsKICAgIHRoYXQucGF0aG5hbWUgPSBnZXRQYXRobmFtZS5jYWxsKHRoYXQpOwogICAgdGhhdC5zZWFyY2ggPSBnZXRTZWFyY2guY2FsbCh0aGF0KTsKICAgIHRoYXQuc2VhcmNoUGFyYW1zID0gZ2V0U2VhcmNoUGFyYW1zLmNhbGwodGhhdCk7CiAgICB0aGF0Lmhhc2ggPSBnZXRIYXNoLmNhbGwodGhhdCk7CiAgfQp9OwoKdmFyIFVSTFByb3RvdHlwZSA9IFVSTENvbnN0cnVjdG9yLnByb3RvdHlwZTsKCnZhciBzZXJpYWxpemVVUkwgPSBmdW5jdGlvbiAoKSB7CiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgdmFyIHNjaGVtZSA9IHVybC5zY2hlbWU7CiAgdmFyIHVzZXJuYW1lID0gdXJsLnVzZXJuYW1lOwogIHZhciBwYXNzd29yZCA9IHVybC5wYXNzd29yZDsKICB2YXIgaG9zdCA9IHVybC5ob3N0OwogIHZhciBwb3J0ID0gdXJsLnBvcnQ7CiAgdmFyIHBhdGggPSB1cmwucGF0aDsKICB2YXIgcXVlcnkgPSB1cmwucXVlcnk7CiAgdmFyIGZyYWdtZW50ID0gdXJsLmZyYWdtZW50OwogIHZhciBvdXRwdXQgPSBzY2hlbWUgKyAnOic7CiAgaWYgKGhvc3QgIT09IG51bGwpIHsKICAgIG91dHB1dCArPSAnLy8nOwogICAgaWYgKGluY2x1ZGVzQ3JlZGVudGlhbHModXJsKSkgewogICAgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJzsKICAgIH0KICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpOwogICAgaWYgKHBvcnQgIT09IG51bGwpIG91dHB1dCArPSAnOicgKyBwb3J0OwogIH0gZWxzZSBpZiAoc2NoZW1lID09ICdmaWxlJykgb3V0cHV0ICs9ICcvLyc7CiAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJzsKICBpZiAocXVlcnkgIT09IG51bGwpIG91dHB1dCArPSAnPycgKyBxdWVyeTsKICBpZiAoZnJhZ21lbnQgIT09IG51bGwpIG91dHB1dCArPSAnIycgKyBmcmFnbWVudDsKICByZXR1cm4gb3V0cHV0Owp9OwoKdmFyIGdldE9yaWdpbiA9IGZ1bmN0aW9uICgpIHsKICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICB2YXIgc2NoZW1lID0gdXJsLnNjaGVtZTsKICB2YXIgcG9ydCA9IHVybC5wb3J0OwogIGlmIChzY2hlbWUgPT0gJ2Jsb2InKSB0cnkgewogICAgcmV0dXJuIG5ldyBVUkwoc2NoZW1lLnBhdGhbMF0pLm9yaWdpbjsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuICdudWxsJzsKICB9CiAgaWYgKHNjaGVtZSA9PSAnZmlsZScgfHwgIWlzU3BlY2lhbCh1cmwpKSByZXR1cm4gJ251bGwnOwogIHJldHVybiBzY2hlbWUgKyAnOi8vJyArIHNlcmlhbGl6ZUhvc3QodXJsLmhvc3QpICsgKHBvcnQgIT09IG51bGwgPyAnOicgKyBwb3J0IDogJycpOwp9OwoKdmFyIGdldFByb3RvY29sID0gZnVuY3Rpb24gKCkgewogIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNjaGVtZSArICc6JzsKfTsKCnZhciBnZXRVc2VybmFtZSA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZTsKfTsKCnZhciBnZXRQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5wYXNzd29yZDsKfTsKCnZhciBnZXRIb3N0ID0gZnVuY3Rpb24gKCkgewogIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOwogIHZhciBob3N0ID0gdXJsLmhvc3Q7CiAgdmFyIHBvcnQgPSB1cmwucG9ydDsKICByZXR1cm4gaG9zdCA9PT0gbnVsbCA/ICcnCiAgICA6IHBvcnQgPT09IG51bGwgPyBzZXJpYWxpemVIb3N0KGhvc3QpCiAgICA6IHNlcmlhbGl6ZUhvc3QoaG9zdCkgKyAnOicgKyBwb3J0Owp9OwoKdmFyIGdldEhvc3RuYW1lID0gZnVuY3Rpb24gKCkgewogIHZhciBob3N0ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5ob3N0OwogIHJldHVybiBob3N0ID09PSBudWxsID8gJycgOiBzZXJpYWxpemVIb3N0KGhvc3QpOwp9OwoKdmFyIGdldFBvcnQgPSBmdW5jdGlvbiAoKSB7CiAgdmFyIHBvcnQgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnBvcnQ7CiAgcmV0dXJuIHBvcnQgPT09IG51bGwgPyAnJyA6IFN0cmluZyhwb3J0KTsKfTsKCnZhciBnZXRQYXRobmFtZSA9IGZ1bmN0aW9uICgpIHsKICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICB2YXIgcGF0aCA9IHVybC5wYXRoOwogIHJldHVybiB1cmwuY2Fubm90QmVBQmFzZVVSTCA/IHBhdGhbMF0gOiBwYXRoLmxlbmd0aCA/ICcvJyArIHBhdGguam9pbignLycpIDogJyc7Cn07Cgp2YXIgZ2V0U2VhcmNoID0gZnVuY3Rpb24gKCkgewogIHZhciBxdWVyeSA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykucXVlcnk7CiAgcmV0dXJuIHF1ZXJ5ID8gJz8nICsgcXVlcnkgOiAnJzsKfTsKCnZhciBnZXRTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2VhcmNoUGFyYW1zOwp9OwoKdmFyIGdldEhhc2ggPSBmdW5jdGlvbiAoKSB7CiAgdmFyIGZyYWdtZW50ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5mcmFnbWVudDsKICByZXR1cm4gZnJhZ21lbnQgPyAnIycgKyBmcmFnbWVudCA6ICcnOwp9OwoKdmFyIGFjY2Vzc29yRGVzY3JpcHRvciA9IGZ1bmN0aW9uIChnZXR0ZXIsIHNldHRlcikgewogIHJldHVybiB7IGdldDogZ2V0dGVyLCBzZXQ6IHNldHRlciwgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH07Cn07CgppZiAoREVTQ1JJUFRPUlMpIHsKICBkZWZpbmVQcm9wZXJ0aWVzKFVSTFByb3RvdHlwZSwgewogICAgLy8gYFVSTC5wcm90b3R5cGUuaHJlZmAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ocmVmCiAgICBocmVmOiBhY2Nlc3NvckRlc2NyaXB0b3Ioc2VyaWFsaXplVVJMLCBmdW5jdGlvbiAoaHJlZikgewogICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICAgICAgdmFyIHVybFN0cmluZyA9IFN0cmluZyhocmVmKTsKICAgICAgdmFyIGZhaWx1cmUgPSBwYXJzZVVSTCh1cmwsIHVybFN0cmluZyk7CiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7CiAgICAgIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUodXJsLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHVybC5xdWVyeSk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLm9yaWdpbmAgZ2V0dGVyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtb3JpZ2luCiAgICBvcmlnaW46IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRPcmlnaW4pLAogICAgLy8gYFVSTC5wcm90b3R5cGUucHJvdG9jb2xgIGFjY2Vzc29ycyBwYWlyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcHJvdG9jb2wKICAgIHByb3RvY29sOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UHJvdG9jb2wsIGZ1bmN0aW9uIChwcm90b2NvbCkgewogICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICAgICAgcGFyc2VVUkwodXJsLCBTdHJpbmcocHJvdG9jb2wpICsgJzonLCBTQ0hFTUVfU1RBUlQpOwogICAgfSksCiAgICAvLyBgVVJMLnByb3RvdHlwZS51c2VybmFtZWAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC11c2VybmFtZQogICAgdXNlcm5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRVc2VybmFtZSwgZnVuY3Rpb24gKHVzZXJuYW1lKSB7CiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOwogICAgICB2YXIgY29kZVBvaW50cyA9IGFycmF5RnJvbShTdHJpbmcodXNlcm5hbWUpKTsKICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47CiAgICAgIHVybC51c2VybmFtZSA9ICcnOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB1cmwudXNlcm5hbWUgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOwogICAgICB9CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLnBhc3N3b3JkYCBhY2Nlc3NvcnMgcGFpcgogICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBhc3N3b3JkCiAgICBwYXNzd29yZDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFBhc3N3b3JkLCBmdW5jdGlvbiAocGFzc3dvcmQpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyhwYXNzd29yZCkpOwogICAgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpIHJldHVybjsKICAgICAgdXJsLnBhc3N3b3JkID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHVybC5wYXNzd29yZCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7CiAgICAgIH0KICAgIH0pLAogICAgLy8gYFVSTC5wcm90b3R5cGUuaG9zdGAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0CiAgICBob3N0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdCwgZnVuY3Rpb24gKGhvc3QpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuOwogICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhob3N0KSwgSE9TVCk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLmhvc3RuYW1lYCBhY2Nlc3NvcnMgcGFpcgogICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lCiAgICBob3N0bmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhvc3RuYW1lLCBmdW5jdGlvbiAoaG9zdG5hbWUpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuOwogICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhob3N0bmFtZSksIEhPU1ROQU1FKTsKICAgIH0pLAogICAgLy8gYFVSTC5wcm90b3R5cGUucG9ydGAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wb3J0CiAgICBwb3J0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UG9ydCwgZnVuY3Rpb24gKHBvcnQpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmIChjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQodXJsKSkgcmV0dXJuOwogICAgICBwb3J0ID0gU3RyaW5nKHBvcnQpOwogICAgICBpZiAocG9ydCA9PSAnJykgdXJsLnBvcnQgPSBudWxsOwogICAgICBlbHNlIHBhcnNlVVJMKHVybCwgcG9ydCwgUE9SVCk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLnBhdGhuYW1lYCBhY2Nlc3NvcnMgcGFpcgogICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBhdGhuYW1lCiAgICBwYXRobmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFBhdGhuYW1lLCBmdW5jdGlvbiAocGF0aG5hbWUpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuOwogICAgICB1cmwucGF0aCA9IFtdOwogICAgICBwYXJzZVVSTCh1cmwsIHBhdGhuYW1lICsgJycsIFBBVEhfU1RBUlQpOwogICAgfSksCiAgICAvLyBgVVJMLnByb3RvdHlwZS5zZWFyY2hgIGFjY2Vzc29ycyBwYWlyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNoCiAgICBzZWFyY2g6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2gsIGZ1bmN0aW9uIChzZWFyY2gpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpOwogICAgICBpZiAoc2VhcmNoID09ICcnKSB7CiAgICAgICAgdXJsLnF1ZXJ5ID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoJz8nID09IHNlYXJjaC5jaGFyQXQoMCkpIHNlYXJjaCA9IHNlYXJjaC5zbGljZSgxKTsKICAgICAgICB1cmwucXVlcnkgPSAnJzsKICAgICAgICBwYXJzZVVSTCh1cmwsIHNlYXJjaCwgUVVFUlkpOwogICAgICB9CiAgICAgIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUodXJsLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHVybC5xdWVyeSk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLnNlYXJjaFBhcmFtc2AgZ2V0dGVyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zCiAgICBzZWFyY2hQYXJhbXM6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2hQYXJhbXMpLAogICAgLy8gYFVSTC5wcm90b3R5cGUuaGFzaGAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoCiAgICBoYXNoOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SGFzaCwgZnVuY3Rpb24gKGhhc2gpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGhhc2ggPSBTdHJpbmcoaGFzaCk7CiAgICAgIGlmIChoYXNoID09ICcnKSB7CiAgICAgICAgdXJsLmZyYWdtZW50ID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCcjJyA9PSBoYXNoLmNoYXJBdCgwKSkgaGFzaCA9IGhhc2guc2xpY2UoMSk7CiAgICAgIHVybC5mcmFnbWVudCA9ICcnOwogICAgICBwYXJzZVVSTCh1cmwsIGhhc2gsIEZSQUdNRU5UKTsKICAgIH0pCiAgfSk7Cn0KCi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC10b2pzb24KcmVkZWZpbmUoVVJMUHJvdG90eXBlLCAndG9KU09OJywgZnVuY3Rpb24gdG9KU09OKCkgewogIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTsKfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOwoKLy8gYFVSTC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZAovLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI1VSTC1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3IKcmVkZWZpbmUoVVJMUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHsKICByZXR1cm4gc2VyaWFsaXplVVJMLmNhbGwodGhpcyk7Cn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTsKCmlmIChOYXRpdmVVUkwpIHsKICB2YXIgbmF0aXZlQ3JlYXRlT2JqZWN0VVJMID0gTmF0aXZlVVJMLmNyZWF0ZU9iamVjdFVSTDsKICB2YXIgbmF0aXZlUmV2b2tlT2JqZWN0VVJMID0gTmF0aXZlVVJMLnJldm9rZU9iamVjdFVSTDsKICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9jcmVhdGVPYmplY3RVUkwKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICBpZiAobmF0aXZlQ3JlYXRlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ2NyZWF0ZU9iamVjdFVSTCcsIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChibG9iKSB7CiAgICByZXR1cm4gbmF0aXZlQ3JlYXRlT2JqZWN0VVJMLmFwcGx5KE5hdGl2ZVVSTCwgYXJndW1lbnRzKTsKICB9KTsKICAvLyBgVVJMLnJldm9rZU9iamVjdFVSTGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9yZXZva2VPYmplY3RVUkwKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHsKICAgIHJldHVybiBuYXRpdmVSZXZva2VPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLCBhcmd1bWVudHMpOwogIH0pOwp9CgpzZXRUb1N0cmluZ1RhZyhVUkxDb25zdHJ1Y3RvciwgJ1VSTCcpOwoKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgVVJMOiBVUkxDb25zdHJ1Y3Rvcgp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC10b2pzb24KJCh7IHRhcmdldDogJ1VSTCcsIHByb3RvOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0sIHsKICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHsKICAgIHJldHVybiBVUkwucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9hcnJheS1pcy10ZW1wbGF0ZS1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktaXMtdGVtcGxhdGUtb2JqZWN0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hcnJheS5pcy10ZW1wbGF0ZS1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkuaXMtdGVtcGxhdGUtb2JqZWN0LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktbGFzdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktbGFzdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFycmF5Lmxhc3QtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkubGFzdC1pbmRleC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hcnJheS5sYXN0LWl0ZW0gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkubGFzdC1pdGVtLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvY29sbGVjdGlvbi1tZXRob2RzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2NvbGxlY3Rpb24tbWV0aG9kcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmdyb3VwLWJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ncm91cC1ieS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAua2V5LWJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktYnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmV2ZXJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ldmVyeS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maWx0ZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmZpbmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmZpbmQta2V5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maW5kLWtleS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAuaW5jbHVkZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmluY2x1ZGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmtleS1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAubWFwLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLm1hcC1rZXlzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5tZXJnZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAubWVyZ2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLnJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAucmVkdWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnVwZGF0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuYWRkLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuYWRkLWFsbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZGVsZXRlLWFsbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmV2ZXJ5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5maWx0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmZpbHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuam9pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuam9pbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQubWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc2V0LnJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQucmVkdWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5zb21lLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmRlbGV0ZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAuZGVsZXRlLWFsbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5hZGQtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstc2V0LmFkZC1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQud2Vhay1zZXQuZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5kZWxldGUtYWxsLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvY29sbGVjdGlvbi1vZi1mcm9tLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2NvbGxlY3Rpb24tb2YtZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLm9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQub2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0Lm9mLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAuZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstc2V0LmZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9lZmZpY2llbnQtNjQtYml0LWFyaXRobWV0aWMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvZWZmaWNpZW50LTY0LWJpdC1hcml0aG1ldGljLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLmlhZGRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguaWFkZGguanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWF0aC5pc3ViaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmlzdWJoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguaW11bGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5pbXVsaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnVtdWxoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGgudW11bGguanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9nbG9iYWwtdGhpcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2dsb2JhbC10aGlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5nbG9iYWwtdGhpcy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3N0YWdlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlL2luZGV4LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvaXRlcmF0b3ItaGVscGVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvaXRlcmF0b3ItaGVscGVycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmFzLWluZGV4ZWQtcGFpcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5kcm9wICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmRyb3AuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZXZlcnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZpbHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5maW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZm9yLWVhY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mcm9tLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IucmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnJlZHVjZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnNvbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IudGFrZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50YWtlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnRvLWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmFzLWluZGV4ZWQtcGFpcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5kcm9wICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmRyb3AuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZXZlcnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmxhdC1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmxhdC1tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mcm9tLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnJlZHVjZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnNvbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IudGFrZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci50YWtlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnRvLWFycmF5LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMva2V5cy1jb21wb3NpdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMva2V5cy1jb21wb3NpdGlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmNvbXBvc2l0ZS1rZXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuY29tcG9zaXRlLWtleS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5jb21wb3NpdGUtc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmNvbXBvc2l0ZS1zeW1ib2wuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0Ci8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUtb3ItaW5zZXJ0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUtb3ItaW5zZXJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnVwc2VydC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC51cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAudXBzZXJ0LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvbWF0aC1leHRlbnNpb25zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL21hdGgtZXh0ZW5zaW9ucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWF0aC5jbGFtcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmNsYW1wLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguZGVnLXBlci1yYWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5kZWctcGVyLXJhZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLmRlZ3JlZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5kZWdyZWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguZnNjYWxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguZnNjYWxlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGgucmFkLXBlci1kZWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5yYWQtcGVyLWRlZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnJhZGlhbnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5yYWRpYW5zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguc2NhbGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5zY2FsZS5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL21hdGgtc2lnbmJpdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXRoLXNpZ25iaXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguc2lnbmJpdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNpZ25iaXQuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9udW1iZXItZnJvbS1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvbnVtYmVyLWZyb20tc3RyaW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5udW1iZXIuZnJvbS1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubnVtYmVyLmZyb20tc3RyaW5nLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvb2JqZWN0LWl0ZXJhdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvb2JqZWN0LWl0ZXJhdGlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWVudHJpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUtZW50cmllcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5vYmplY3QuaXRlcmF0ZS1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWtleXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUtdmFsdWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLXZhbHVlcy5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29ic2VydmFibGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29ic2VydmFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5vYnNlcnZhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9ic2VydmFibGUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wYXR0ZXJuLW1hdGNoaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wYXR0ZXJuLW1hdGNoaW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2guanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLWFsbC1zZXR0bGVkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLWFsbC1zZXR0bGVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQucHJvbWlzZS5hbGwtc2V0dGxlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS1hbnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLWFueS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hZ2dyZWdhdGUtZXJyb3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYW55ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYW55LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS10cnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLXRyeS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLnRyeSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLnRyeS5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QubWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5tZXRhZGF0YS5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3NlZWRlZC1yYW5kb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3NlZWRlZC1yYW5kb20uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnNlZWRlZC1wcm5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguc2VlZGVkLXBybmcuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zZXQtbWV0aG9kcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3NldC1tZXRob2RzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5kaWZmZXJlbmNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5kaWZmZXJlbmNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5pbnRlcnNlY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmludGVyc2VjdGlvbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3Vic2V0LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdWJzZXQtb2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc2V0LmlzLXN1cGVyc2V0LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdXBlcnNldC1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQudW5pb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnVuaW9uLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5zeW1tZXRyaWMtZGlmZmVyZW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLWF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLmF0LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLWNvZGUtcG9pbnRzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1jb2RlLXBvaW50cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc3RyaW5nLmNvZGUtcG9pbnRzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5jb2RlLXBvaW50cy5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YApfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zdHJpbmcubWF0Y2gtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5tYXRjaC1hbGwuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctcmVwbGFjZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLXJlcGxhY2UtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zdHJpbmcucmVwbGFjZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLnJlcGxhY2UtYWxsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5yZXBsYWNlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy91cmwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXJsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC50by1qc29uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXNpbmctc3RhdGVtZW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3VzaW5nLXN0YXRlbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtdXNpbmctc3RhdGVtZW50Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5hc3luYy1kaXNwb3NlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5hc3luYy1kaXNwb3NlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8wLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9lZmZpY2llbnQtNjQtYml0LWFyaXRobWV0aWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2VmZmljaWVudC02NC1iaXQtYXJpdGhtZXRpYy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvc3RyaW5nLWF0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctYXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3VybCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXJsLmpzIik7CnZhciBwYXJlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLzEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8xLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9hcnJheS1sYXN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9hcnJheS1sYXN0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9jb2xsZWN0aW9uLW1ldGhvZHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2NvbGxlY3Rpb24tbWV0aG9kcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvY29sbGVjdGlvbi1vZi1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9jb2xsZWN0aW9uLW9mLWZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL2tleXMtY29tcG9zaXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2tleXMtY29tcG9zaXRpb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL21hdGgtZXh0ZW5zaW9ucyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvbWF0aC1leHRlbnNpb25zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9tYXRoLXNpZ25iaXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL21hdGgtc2lnbmJpdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvbnVtYmVyLWZyb20tc3RyaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9udW1iZXItZnJvbS1zdHJpbmcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL29iamVjdC1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29iamVjdC1pdGVyYXRpb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL29ic2VydmFibGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29ic2VydmFibGUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3BhdHRlcm4tbWF0Y2hpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3BhdHRlcm4tbWF0Y2hpbmcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3Byb21pc2UtdHJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLXRyeS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvc2VlZGVkLXJhbmRvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc2VlZGVkLXJhbmRvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvc3RyaW5nLWNvZGUtcG9pbnRzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctY29kZS1wb2ludHMuanMiKTsKdmFyIHBhcmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vMiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8yLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhcmVudDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlLzIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL2FycmF5LWlzLXRlbXBsYXRlLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktaXMtdGVtcGxhdGUtb2JqZWN0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9pdGVyYXRvci1oZWxwZXJzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9pdGVyYXRvci1oZWxwZXJzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9zZXQtbWV0aG9kcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc2V0LW1ldGhvZHMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3VzaW5nLXN0YXRlbWVudCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXNpbmctc3RhdGVtZW50LmpzIik7CnZhciBwYXJlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLzMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMy5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9wcm9taXNlLWFueSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS1hbnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3N0cmluZy1yZXBsYWNlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLXJlcGxhY2UtYWxsLmpzIik7CnZhciBwYXJlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLzQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvNC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS80LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvNC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvZ2xvYmFsLXRoaXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3Byb21pc2UtYWxsLXNldHRsZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3Byb21pc2UtYWxsLXNldHRsZWQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwuanMiKTsKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGF0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXRoOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHByb3Bvc2FscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlL3ByZS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwcm9wb3NhbHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS9wcmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlL3ByZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIHBhcmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vMCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8wLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhcmVudDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3dlYi9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvd2ViL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi5xdWV1ZS1taWNyb3Rhc2sgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIucXVldWUtbWljcm90YXNrLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnRpbWVycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy93ZWIudXJsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwudG8tanNvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwudG8tanNvbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcyIpOwp2YXIgcGF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhdGg7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgoidXNlIHN0cmljdCI7CgoKLyoKICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmEKKi8KLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXIKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXNlU291cmNlTWFwKSB7CiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZwoKICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgdmFyIGNvbnRlbnQgPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCk7CgogICAgICBpZiAoaXRlbVsyXSkgewogICAgICAgIHJldHVybiAiQG1lZGlhICIuY29uY2F0KGl0ZW1bMl0sICIgeyIpLmNvbmNhdChjb250ZW50LCAifSIpOwogICAgICB9CgogICAgICByZXR1cm4gY29udGVudDsKICAgIH0pLmpvaW4oJycpOwogIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXMKCgogIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7CiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09ICdzdHJpbmcnKSB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnbgogICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCAnJ11dOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW2ldKTsKCiAgICAgIGlmIChtZWRpYVF1ZXJ5KSB7CiAgICAgICAgaWYgKCFpdGVtWzJdKSB7CiAgICAgICAgICBpdGVtWzJdID0gbWVkaWFRdWVyeTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXRlbVsyXSA9ICIiLmNvbmNhdChtZWRpYVF1ZXJ5LCAiIGFuZCAiKS5jb25jYXQoaXRlbVsyXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBsaXN0LnB1c2goaXRlbSk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIGxpc3Q7Cn07CgpmdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCkgewogIHZhciBjb250ZW50ID0gaXRlbVsxXSB8fCAnJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nCgogIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTsKCiAgaWYgKCFjc3NNYXBwaW5nKSB7CiAgICByZXR1cm4gY29udGVudDsKICB9CgogIGlmICh1c2VTb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHsKICAgIHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpOwogICAgdmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHsKICAgICAgcmV0dXJuICIvKiMgc291cmNlVVJMPSIuY29uY2F0KGNzc01hcHBpbmcuc291cmNlUm9vdCkuY29uY2F0KHNvdXJjZSwgIiAqLyIpOwogICAgfSk7CiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKCdcbicpOwogIH0KCiAgcmV0dXJuIFtjb250ZW50XS5qb2luKCdcbicpOwp9IC8vIEFkYXB0ZWQgZnJvbSBjb252ZXJ0LXNvdXJjZS1tYXAgKE1JVCkKCgpmdW5jdGlvbiB0b0NvbW1lbnQoc291cmNlTWFwKSB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSk7CiAgdmFyIGRhdGEgPSAic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsIi5jb25jYXQoYmFzZTY0KTsKICByZXR1cm4gIi8qIyAiLmNvbmNhdChkYXRhLCAiICovIik7Cn0KCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAiaCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBoOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJhcHAiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gYXBwOyB9Ci8qIGhhcm1vbnkgZXhwb3J0ICovIH0pOwpmdW5jdGlvbiBoKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICB2YXIgcmVzdCA9IFtdCiAgdmFyIGNoaWxkcmVuID0gW10KICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aAoKICB3aGlsZSAobGVuZ3RoLS0gPiAyKSByZXN0LnB1c2goYXJndW1lbnRzW2xlbmd0aF0pCgogIHdoaWxlIChyZXN0Lmxlbmd0aCkgewogICAgdmFyIG5vZGUgPSByZXN0LnBvcCgpCiAgICBpZiAobm9kZSAmJiBub2RlLnBvcCkgewogICAgICBmb3IgKGxlbmd0aCA9IG5vZGUubGVuZ3RoOyBsZW5ndGgtLTsgKSB7CiAgICAgICAgcmVzdC5wdXNoKG5vZGVbbGVuZ3RoXSkKICAgICAgfQogICAgfSBlbHNlIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSAhPT0gdHJ1ZSAmJiBub2RlICE9PSBmYWxzZSkgewogICAgICBjaGlsZHJlbi5wdXNoKG5vZGUpCiAgICB9CiAgfQoKICByZXR1cm4gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIKICAgID8gbmFtZShhdHRyaWJ1dGVzIHx8IHt9LCBjaGlsZHJlbikKICAgIDogewogICAgICAgIG5vZGVOYW1lOiBuYW1lLAogICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMgfHwge30sCiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLAogICAgICAgIGtleTogYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmtleQogICAgICB9Cn0KCmZ1bmN0aW9uIGFwcChzdGF0ZSwgYWN0aW9ucywgdmlldywgY29udGFpbmVyKSB7CiAgdmFyIG1hcCA9IFtdLm1hcAogIHZhciByb290RWxlbWVudCA9IChjb250YWluZXIgJiYgY29udGFpbmVyLmNoaWxkcmVuWzBdKSB8fCBudWxsCiAgdmFyIG9sZE5vZGUgPSByb290RWxlbWVudCAmJiByZWN5Y2xlRWxlbWVudChyb290RWxlbWVudCkKICB2YXIgbGlmZWN5Y2xlID0gW10KICB2YXIgc2tpcFJlbmRlcgogIHZhciBpc1JlY3ljbGluZyA9IHRydWUKICB2YXIgZ2xvYmFsU3RhdGUgPSBjbG9uZShzdGF0ZSkKICB2YXIgd2lyZWRBY3Rpb25zID0gd2lyZVN0YXRlVG9BY3Rpb25zKFtdLCBnbG9iYWxTdGF0ZSwgY2xvbmUoYWN0aW9ucykpCgogIHNjaGVkdWxlUmVuZGVyKCkKCiAgcmV0dXJuIHdpcmVkQWN0aW9ucwoKICBmdW5jdGlvbiByZWN5Y2xlRWxlbWVudChlbGVtZW50KSB7CiAgICByZXR1cm4gewogICAgICBub2RlTmFtZTogZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAogICAgICBhdHRyaWJ1dGVzOiB7fSwKICAgICAgY2hpbGRyZW46IG1hcC5jYWxsKGVsZW1lbnQuY2hpbGROb2RlcywgZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgIHJldHVybiBlbGVtZW50Lm5vZGVUeXBlID09PSAzIC8vIE5vZGUuVEVYVF9OT0RFCiAgICAgICAgICA/IGVsZW1lbnQubm9kZVZhbHVlCiAgICAgICAgICA6IHJlY3ljbGVFbGVtZW50KGVsZW1lbnQpCiAgICAgIH0pCiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNvbHZlTm9kZShub2RlKSB7CiAgICByZXR1cm4gdHlwZW9mIG5vZGUgPT09ICJmdW5jdGlvbiIKICAgICAgPyByZXNvbHZlTm9kZShub2RlKGdsb2JhbFN0YXRlLCB3aXJlZEFjdGlvbnMpKQogICAgICA6IG5vZGUgIT0gbnVsbAogICAgICAgID8gbm9kZQogICAgICAgIDogIiIKICB9CgogIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgIHNraXBSZW5kZXIgPSAhc2tpcFJlbmRlcgoKICAgIHZhciBub2RlID0gcmVzb2x2ZU5vZGUodmlldykKCiAgICBpZiAoY29udGFpbmVyICYmICFza2lwUmVuZGVyKSB7CiAgICAgIHJvb3RFbGVtZW50ID0gcGF0Y2goY29udGFpbmVyLCByb290RWxlbWVudCwgb2xkTm9kZSwgKG9sZE5vZGUgPSBub2RlKSkKICAgIH0KCiAgICBpc1JlY3ljbGluZyA9IGZhbHNlCgogICAgd2hpbGUgKGxpZmVjeWNsZS5sZW5ndGgpIGxpZmVjeWNsZS5wb3AoKSgpCiAgfQoKICBmdW5jdGlvbiBzY2hlZHVsZVJlbmRlcigpIHsKICAgIGlmICghc2tpcFJlbmRlcikgewogICAgICBza2lwUmVuZGVyID0gdHJ1ZQogICAgICBzZXRUaW1lb3V0KHJlbmRlcikKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsb25lKHRhcmdldCwgc291cmNlKSB7CiAgICB2YXIgb3V0ID0ge30KCiAgICBmb3IgKHZhciBpIGluIHRhcmdldCkgb3V0W2ldID0gdGFyZ2V0W2ldCiAgICBmb3IgKHZhciBpIGluIHNvdXJjZSkgb3V0W2ldID0gc291cmNlW2ldCgogICAgcmV0dXJuIG91dAogIH0KCiAgZnVuY3Rpb24gc2V0UGFydGlhbFN0YXRlKHBhdGgsIHZhbHVlLCBzb3VyY2UpIHsKICAgIHZhciB0YXJnZXQgPSB7fQogICAgaWYgKHBhdGgubGVuZ3RoKSB7CiAgICAgIHRhcmdldFtwYXRoWzBdXSA9CiAgICAgICAgcGF0aC5sZW5ndGggPiAxCiAgICAgICAgICA/IHNldFBhcnRpYWxTdGF0ZShwYXRoLnNsaWNlKDEpLCB2YWx1ZSwgc291cmNlW3BhdGhbMF1dKQogICAgICAgICAgOiB2YWx1ZQogICAgICByZXR1cm4gY2xvbmUoc291cmNlLCB0YXJnZXQpCiAgICB9CiAgICByZXR1cm4gdmFsdWUKICB9CgogIGZ1bmN0aW9uIGdldFBhcnRpYWxTdGF0ZShwYXRoLCBzb3VyY2UpIHsKICAgIHZhciBpID0gMAogICAgd2hpbGUgKGkgPCBwYXRoLmxlbmd0aCkgewogICAgICBzb3VyY2UgPSBzb3VyY2VbcGF0aFtpKytdXQogICAgfQogICAgcmV0dXJuIHNvdXJjZQogIH0KCiAgZnVuY3Rpb24gd2lyZVN0YXRlVG9BY3Rpb25zKHBhdGgsIHN0YXRlLCBhY3Rpb25zKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gYWN0aW9ucykgewogICAgICB0eXBlb2YgYWN0aW9uc1trZXldID09PSAiZnVuY3Rpb24iCiAgICAgICAgPyAoZnVuY3Rpb24oa2V5LCBhY3Rpb24pIHsKICAgICAgICAgICAgYWN0aW9uc1trZXldID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhY3Rpb24oZGF0YSkKCiAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdChnZXRQYXJ0aWFsU3RhdGUocGF0aCwgZ2xvYmFsU3RhdGUpLCBhY3Rpb25zKQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgcmVzdWx0ICYmCiAgICAgICAgICAgICAgICByZXN1bHQgIT09IChzdGF0ZSA9IGdldFBhcnRpYWxTdGF0ZShwYXRoLCBnbG9iYWxTdGF0ZSkpICYmCiAgICAgICAgICAgICAgICAhcmVzdWx0LnRoZW4gLy8gIWlzUHJvbWlzZQogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIoCiAgICAgICAgICAgICAgICAgIChnbG9iYWxTdGF0ZSA9IHNldFBhcnRpYWxTdGF0ZSgKICAgICAgICAgICAgICAgICAgICBwYXRoLAogICAgICAgICAgICAgICAgICAgIGNsb25lKHN0YXRlLCByZXN1bHQpLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFN0YXRlCiAgICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKGtleSwgYWN0aW9uc1trZXldKQogICAgICAgIDogd2lyZVN0YXRlVG9BY3Rpb25zKAogICAgICAgICAgICBwYXRoLmNvbmNhdChrZXkpLAogICAgICAgICAgICAoc3RhdGVba2V5XSA9IGNsb25lKHN0YXRlW2tleV0pKSwKICAgICAgICAgICAgKGFjdGlvbnNba2V5XSA9IGNsb25lKGFjdGlvbnNba2V5XSkpCiAgICAgICAgICApCiAgICB9CgogICAgcmV0dXJuIGFjdGlvbnMKICB9CgogIGZ1bmN0aW9uIGdldEtleShub2RlKSB7CiAgICByZXR1cm4gbm9kZSA/IG5vZGUua2V5IDogbnVsbAogIH0KCiAgZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihldmVudCkgewogICAgcmV0dXJuIGV2ZW50LmN1cnJlbnRUYXJnZXQuZXZlbnRzW2V2ZW50LnR5cGVdKGV2ZW50KQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlLCBvbGRWYWx1ZSwgaXNTdmcpIHsKICAgIGlmIChuYW1lID09PSAia2V5IikgewogICAgfSBlbHNlIGlmIChuYW1lID09PSAic3R5bGUiKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gdmFsdWUKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodHlwZW9mIG9sZFZhbHVlID09PSAic3RyaW5nIikgb2xkVmFsdWUgPSBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSAiIgogICAgICAgIGZvciAodmFyIGkgaW4gY2xvbmUob2xkVmFsdWUsIHZhbHVlKSkgewogICAgICAgICAgdmFyIHN0eWxlID0gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZVtpXSA9PSBudWxsID8gIiIgOiB2YWx1ZVtpXQogICAgICAgICAgaWYgKGlbMF0gPT09ICItIikgewogICAgICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGksIHN0eWxlKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtpXSA9IHN0eWxlCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobmFtZVswXSA9PT0gIm8iICYmIG5hbWVbMV0gPT09ICJuIikgewogICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDIpCgogICAgICAgIGlmIChlbGVtZW50LmV2ZW50cykgewogICAgICAgICAgaWYgKCFvbGRWYWx1ZSkgb2xkVmFsdWUgPSBlbGVtZW50LmV2ZW50c1tuYW1lXQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbGVtZW50LmV2ZW50cyA9IHt9CiAgICAgICAgfQoKICAgICAgICBlbGVtZW50LmV2ZW50c1tuYW1lXSA9IHZhbHVlCgogICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgaWYgKCFvbGRWYWx1ZSkgewogICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRMaXN0ZW5lcikKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50TGlzdGVuZXIpCiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKAogICAgICAgIG5hbWUgaW4gZWxlbWVudCAmJgogICAgICAgIG5hbWUgIT09ICJsaXN0IiAmJgogICAgICAgIG5hbWUgIT09ICJ0eXBlIiAmJgogICAgICAgIG5hbWUgIT09ICJkcmFnZ2FibGUiICYmCiAgICAgICAgbmFtZSAhPT0gInNwZWxsY2hlY2siICYmCiAgICAgICAgbmFtZSAhPT0gInRyYW5zbGF0ZSIgJiYKICAgICAgICAhaXNTdmcKICAgICAgKSB7CiAgICAgICAgZWxlbWVudFtuYW1lXSA9IHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlCiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UpIHsKICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkKICAgICAgfQoKICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlKSB7CiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSkKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChub2RlLCBpc1N2ZykgewogICAgdmFyIGVsZW1lbnQgPQogICAgICB0eXBlb2Ygbm9kZSA9PT0gInN0cmluZyIgfHwgdHlwZW9mIG5vZGUgPT09ICJudW1iZXIiCiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlKQogICAgICAgIDogKGlzU3ZnID0gaXNTdmcgfHwgbm9kZS5ub2RlTmFtZSA9PT0gInN2ZyIpCiAgICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygKICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUKICAgICAgICAgICAgKQogICAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGUubm9kZU5hbWUpCgogICAgdmFyIGF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXMKICAgIGlmIChhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChhdHRyaWJ1dGVzLm9uY3JlYXRlKSB7CiAgICAgICAgbGlmZWN5Y2xlLnB1c2goZnVuY3Rpb24oKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLm9uY3JlYXRlKGVsZW1lbnQpCiAgICAgICAgfSkKICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCgKICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgIChub2RlLmNoaWxkcmVuW2ldID0gcmVzb2x2ZU5vZGUobm9kZS5jaGlsZHJlbltpXSkpLAogICAgICAgICAgICBpc1N2ZwogICAgICAgICAgKQogICAgICAgICkKICAgICAgfQoKICAgICAgZm9yICh2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgdXBkYXRlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIGF0dHJpYnV0ZXNbbmFtZV0sIG51bGwsIGlzU3ZnKQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGVsZW1lbnQKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQoZWxlbWVudCwgb2xkQXR0cmlidXRlcywgYXR0cmlidXRlcywgaXNTdmcpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gY2xvbmUob2xkQXR0cmlidXRlcywgYXR0cmlidXRlcykpIHsKICAgICAgaWYgKAogICAgICAgIGF0dHJpYnV0ZXNbbmFtZV0gIT09CiAgICAgICAgKG5hbWUgPT09ICJ2YWx1ZSIgfHwgbmFtZSA9PT0gImNoZWNrZWQiCiAgICAgICAgICA/IGVsZW1lbnRbbmFtZV0KICAgICAgICAgIDogb2xkQXR0cmlidXRlc1tuYW1lXSkKICAgICAgKSB7CiAgICAgICAgdXBkYXRlQXR0cmlidXRlKAogICAgICAgICAgZWxlbWVudCwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBhdHRyaWJ1dGVzW25hbWVdLAogICAgICAgICAgb2xkQXR0cmlidXRlc1tuYW1lXSwKICAgICAgICAgIGlzU3ZnCiAgICAgICAgKQogICAgICB9CiAgICB9CgogICAgdmFyIGNiID0gaXNSZWN5Y2xpbmcgPyBhdHRyaWJ1dGVzLm9uY3JlYXRlIDogYXR0cmlidXRlcy5vbnVwZGF0ZQogICAgaWYgKGNiKSB7CiAgICAgIGxpZmVjeWNsZS5wdXNoKGZ1bmN0aW9uKCkgewogICAgICAgIGNiKGVsZW1lbnQsIG9sZEF0dHJpYnV0ZXMpCiAgICAgIH0pCiAgICB9CiAgfQoKICBmdW5jdGlvbiByZW1vdmVDaGlsZHJlbihlbGVtZW50LCBub2RlKSB7CiAgICB2YXIgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcwogICAgaWYgKGF0dHJpYnV0ZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVtb3ZlQ2hpbGRyZW4oZWxlbWVudC5jaGlsZE5vZGVzW2ldLCBub2RlLmNoaWxkcmVuW2ldKQogICAgICB9CgogICAgICBpZiAoYXR0cmlidXRlcy5vbmRlc3Ryb3kpIHsKICAgICAgICBhdHRyaWJ1dGVzLm9uZGVzdHJveShlbGVtZW50KQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWxlbWVudAogIH0KCiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChwYXJlbnQsIGVsZW1lbnQsIG5vZGUpIHsKICAgIGZ1bmN0aW9uIGRvbmUoKSB7CiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChyZW1vdmVDaGlsZHJlbihlbGVtZW50LCBub2RlKSkKICAgIH0KCiAgICB2YXIgY2IgPSBub2RlLmF0dHJpYnV0ZXMgJiYgbm9kZS5hdHRyaWJ1dGVzLm9ucmVtb3ZlCiAgICBpZiAoY2IpIHsKICAgICAgY2IoZWxlbWVudCwgZG9uZSkKICAgIH0gZWxzZSB7CiAgICAgIGRvbmUoKQogICAgfQogIH0KCiAgZnVuY3Rpb24gcGF0Y2gocGFyZW50LCBlbGVtZW50LCBvbGROb2RlLCBub2RlLCBpc1N2ZykgewogICAgaWYgKG5vZGUgPT09IG9sZE5vZGUpIHsKICAgIH0gZWxzZSBpZiAob2xkTm9kZSA9PSBudWxsIHx8IG9sZE5vZGUubm9kZU5hbWUgIT09IG5vZGUubm9kZU5hbWUpIHsKICAgICAgdmFyIG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KG5vZGUsIGlzU3ZnKQogICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIGVsZW1lbnQpCgogICAgICBpZiAob2xkTm9kZSAhPSBudWxsKSB7CiAgICAgICAgcmVtb3ZlRWxlbWVudChwYXJlbnQsIGVsZW1lbnQsIG9sZE5vZGUpCiAgICAgIH0KCiAgICAgIGVsZW1lbnQgPSBuZXdFbGVtZW50CiAgICB9IGVsc2UgaWYgKG9sZE5vZGUubm9kZU5hbWUgPT0gbnVsbCkgewogICAgICBlbGVtZW50Lm5vZGVWYWx1ZSA9IG5vZGUKICAgIH0gZWxzZSB7CiAgICAgIHVwZGF0ZUVsZW1lbnQoCiAgICAgICAgZWxlbWVudCwKICAgICAgICBvbGROb2RlLmF0dHJpYnV0ZXMsCiAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLAogICAgICAgIChpc1N2ZyA9IGlzU3ZnIHx8IG5vZGUubm9kZU5hbWUgPT09ICJzdmciKQogICAgICApCgogICAgICB2YXIgb2xkS2V5ZWQgPSB7fQogICAgICB2YXIgbmV3S2V5ZWQgPSB7fQogICAgICB2YXIgb2xkRWxlbWVudHMgPSBbXQogICAgICB2YXIgb2xkQ2hpbGRyZW4gPSBvbGROb2RlLmNoaWxkcmVuCiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4KCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2xkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBvbGRFbGVtZW50c1tpXSA9IGVsZW1lbnQuY2hpbGROb2Rlc1tpXQoKICAgICAgICB2YXIgb2xkS2V5ID0gZ2V0S2V5KG9sZENoaWxkcmVuW2ldKQogICAgICAgIGlmIChvbGRLZXkgIT0gbnVsbCkgewogICAgICAgICAgb2xkS2V5ZWRbb2xkS2V5XSA9IFtvbGRFbGVtZW50c1tpXSwgb2xkQ2hpbGRyZW5baV1dCiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgaSA9IDAKICAgICAgdmFyIGsgPSAwCgogICAgICB3aGlsZSAoayA8IGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHZhciBvbGRLZXkgPSBnZXRLZXkob2xkQ2hpbGRyZW5baV0pCiAgICAgICAgdmFyIG5ld0tleSA9IGdldEtleSgoY2hpbGRyZW5ba10gPSByZXNvbHZlTm9kZShjaGlsZHJlbltrXSkpKQoKICAgICAgICBpZiAobmV3S2V5ZWRbb2xkS2V5XSkgewogICAgICAgICAgaSsrCiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKG5ld0tleSAhPSBudWxsICYmIG5ld0tleSA9PT0gZ2V0S2V5KG9sZENoaWxkcmVuW2kgKyAxXSkpIHsKICAgICAgICAgIGlmIChvbGRLZXkgPT0gbnVsbCkgewogICAgICAgICAgICByZW1vdmVFbGVtZW50KGVsZW1lbnQsIG9sZEVsZW1lbnRzW2ldLCBvbGRDaGlsZHJlbltpXSkKICAgICAgICAgIH0KICAgICAgICAgIGkrKwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIGlmIChuZXdLZXkgPT0gbnVsbCB8fCBpc1JlY3ljbGluZykgewogICAgICAgICAgaWYgKG9sZEtleSA9PSBudWxsKSB7CiAgICAgICAgICAgIHBhdGNoKGVsZW1lbnQsIG9sZEVsZW1lbnRzW2ldLCBvbGRDaGlsZHJlbltpXSwgY2hpbGRyZW5ba10sIGlzU3ZnKQogICAgICAgICAgICBrKysKICAgICAgICAgIH0KICAgICAgICAgIGkrKwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIga2V5ZWROb2RlID0gb2xkS2V5ZWRbbmV3S2V5XSB8fCBbXQoKICAgICAgICAgIGlmIChvbGRLZXkgPT09IG5ld0tleSkgewogICAgICAgICAgICBwYXRjaChlbGVtZW50LCBrZXllZE5vZGVbMF0sIGtleWVkTm9kZVsxXSwgY2hpbGRyZW5ba10sIGlzU3ZnKQogICAgICAgICAgICBpKysKICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ZWROb2RlWzBdKSB7CiAgICAgICAgICAgIHBhdGNoKAogICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUoa2V5ZWROb2RlWzBdLCBvbGRFbGVtZW50c1tpXSksCiAgICAgICAgICAgICAga2V5ZWROb2RlWzFdLAogICAgICAgICAgICAgIGNoaWxkcmVuW2tdLAogICAgICAgICAgICAgIGlzU3ZnCiAgICAgICAgICAgICkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhdGNoKGVsZW1lbnQsIG9sZEVsZW1lbnRzW2ldLCBudWxsLCBjaGlsZHJlbltrXSwgaXNTdmcpCiAgICAgICAgICB9CgogICAgICAgICAgbmV3S2V5ZWRbbmV3S2V5XSA9IGNoaWxkcmVuW2tdCiAgICAgICAgICBrKysKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHdoaWxlIChpIDwgb2xkQ2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgaWYgKGdldEtleShvbGRDaGlsZHJlbltpXSkgPT0gbnVsbCkgewogICAgICAgICAgcmVtb3ZlRWxlbWVudChlbGVtZW50LCBvbGRFbGVtZW50c1tpXSwgb2xkQ2hpbGRyZW5baV0pCiAgICAgICAgfQogICAgICAgIGkrKwogICAgICB9CgogICAgICBmb3IgKHZhciBpIGluIG9sZEtleWVkKSB7CiAgICAgICAgaWYgKCFuZXdLZXllZFtpXSkgewogICAgICAgICAgcmVtb3ZlRWxlbWVudChlbGVtZW50LCBvbGRLZXllZFtpXVswXSwgb2xkS2V5ZWRbaV1bMV0pCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWxlbWVudAogIH0KfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLyoqCiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8KCnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC4KICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgPyBTeW1ib2wgOiB7fTsKICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIjsKICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCAiQEBhc3luY0l0ZXJhdG9yIjsKICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8ICJAQHRvU3RyaW5nVGFnIjsKCiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gb2JqW2tleV07CiAgfQogIHRyeSB7CiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLgogICAgZGVmaW5lKHt9LCAiIik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkgewogICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuCiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjsKICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7CiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsKCiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsCiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuCiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CgogICAgcmV0dXJuIGdlbmVyYXRvcjsKICB9CiAgZXhwb3J0cy53cmFwID0gd3JhcDsKCiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uCiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkCiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlCiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZQogIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWQKICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nCiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWUKICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGUKICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoCiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLgogIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHsgdHlwZTogIm5vcm1hbCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICByZXR1cm4geyB0eXBlOiAidGhyb3ciLCBhcmc6IGVyciB9OwogICAgfQogIH0KCiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSAic3VzcGVuZGVkU3RhcnQiOwogIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gInN1c3BlbmRlZFlpZWxkIjsKICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSAiZXhlY3V0aW5nIjsKICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSAiY29tcGxldGVkIjsKCiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwogIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC4KICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9OwoKICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmQKICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3IKICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91cgogIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuCiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9CiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fQoKICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0CiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC4KICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsKICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpczsKICB9KTsKCiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mOwogIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTsKICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYKICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmCiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHsKICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkCiAgICAvLyBvZiB0aGUgcG9seWZpbGwuCiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlOwogIH0KCiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0KICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsKICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTsKICBkZWZpbmUoR3AsICJjb25zdHJ1Y3RvciIsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTsKICBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIEdlbmVyYXRvckZ1bmN0aW9uKTsKICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZSgKICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLAogICAgdG9TdHJpbmdUYWdTeW1ib2wsCiAgICAiR2VuZXJhdG9yRnVuY3Rpb24iCiAgKTsKCiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGUKICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLgogIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsKICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkgewogICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykgewogICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7CiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09ICJmdW5jdGlvbiIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOwogICAgcmV0dXJuIGN0b3IKICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fAogICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW4KICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuCiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gIkdlbmVyYXRvckZ1bmN0aW9uIgogICAgICA6IGZhbHNlOwogIH07CgogIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikgewogICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgewogICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7CiAgICB9IGVsc2UgewogICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7CiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKTsKICAgIH0KICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTsKICAgIHJldHVybiBnZW5GdW47CiAgfTsKCiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvCiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3QKICAvLyBgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpcwogIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuCiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykgewogICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07CiAgfTsKCiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsKICAgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnOwogICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAgICAgICBpZiAodmFsdWUgJiYKICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgIl9fYXdhaXQiKSkgewogICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHsKICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzCiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGUKICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLgogICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkOwogICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFjawogICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLgogICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQoKICAgIHZhciBwcmV2aW91c1Byb21pc2U7CgogICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykgewogICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0KICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsCiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsCiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZgogICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvCiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsCiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG8KICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5CiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHMKICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseQogICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlCiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHkKICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuCiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oCiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywKICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyCiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuCiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZwogICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogICAgfQoKICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsCiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS4KICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7CiAgfQoKICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpOwogIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7CiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjsKCiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZgogIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZgogIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLgogIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7CgogICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcigKICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksCiAgICAgIFByb21pc2VJbXBsCiAgICApOwoKICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikKICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci4KICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7CiAgICAgICAgfSk7CiAgfTsKCiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0OwoKICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHsKICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogICAgICB9CgogICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7CiAgICAgICAgaWYgKG1ldGhvZCA9PT0gInRocm93IikgewogICAgICAgICAgdGhyb3cgYXJnOwogICAgICAgIH0KCiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzoKICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lCiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTsKICAgICAgfQoKICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7CiAgICAgIGNvbnRleHQuYXJnID0gYXJnOwoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogICAgICAgIGlmIChkZWxlZ2F0ZSkgewogICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAibmV4dCIpIHsKICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwncwogICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZzsKCiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gInRocm93IikgewogICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7CiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7CiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnOwogICAgICAgICAgfQoKICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpOwoKICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSAicmV0dXJuIikgewogICAgICAgICAgY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNvbnRleHQuYXJnKTsKICAgICAgICB9CgogICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7CgogICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTsKICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJub3JtYWwiKSB7CiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09CiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uCiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZQogICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkCiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDsKCiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZywKICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgICAgICAgICB9OwoKICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkOwogICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZQogICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS4KICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gInRocm93IjsKICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZzsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQoKICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGUKICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlCiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsCiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuCiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkgewogICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTsKICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkgewogICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3cKICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC4KICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7CgogICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKICAgICAgICAvLyBOb3RlOiBbInJldHVybiJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS4KICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbInJldHVybiJdKSB7CiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhCiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuCiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iOwogICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7CiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTsKCiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb20KICAgICAgICAgICAgLy8gInJldHVybiIgdG8gInRocm93IiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy4KICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKAogICAgICAgICAgIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2QiKTsKICAgICAgfQoKICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICB9CgogICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTsKCiAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgY29udGV4dC5tZXRob2QgPSAidGhyb3ciOwogICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7CiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsOwogICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKICAgIH0KCiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CgogICAgaWYgKCEgaW5mbykgewogICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKTsKICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7CiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgfQoKICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnkKICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS4KICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7CgogICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuCiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7CgogICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgInRocm93IiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlCiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWYKICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzICJuZXh0IiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuCiAgICAgIC8vICJjb25zdW1lZCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXMKICAgICAgLy8gInJldHVybiIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlCiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci4KICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSAicmV0dXJuIikgewogICAgICAgIGNvbnRleHQubWV0aG9kID0gIm5leHQiOwogICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOwogICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLgogICAgICByZXR1cm4gaW5mbzsKICAgIH0KCiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aAogICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci4KICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsOwogICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgfQoKICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZQogIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC4KICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApOwoKICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yIik7CgogIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlCiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvcgogIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLgogIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLgogIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7CgogIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgfSk7CgogIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9OwoKICAgIGlmICgxIGluIGxvY3MpIHsKICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdOwogICAgfQoKICAgIGlmICgyIGluIGxvY3MpIHsKICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07CiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTsKICAgIH0KCiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CiAgfQoKICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCI7CiAgICBkZWxldGUgcmVjb3JkLmFyZzsKICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7CiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2gKICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb20KICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC4KICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogInJvb3QiIH1dOwogICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpOwogICAgdGhpcy5yZXNldCh0cnVlKTsKICB9CgogIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgdmFyIGtleXMgPSBbXTsKICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKICAgICAga2V5cy5wdXNoKGtleSk7CiAgICB9CiAgICBrZXlzLnJldmVyc2UoKTsKCiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcAogICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi4KICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkgewogICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHsKICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgewogICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTsKICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWUKICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXMKICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uCiAgICAgIG5leHQuZG9uZSA9IHRydWU7CiAgICAgIHJldHVybiBuZXh0OwogICAgfTsKICB9OwoKICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHsKICAgIGlmIChpdGVyYWJsZSkgewogICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07CiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgewogICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlOwogICAgICB9CgogICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHsKICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgewogICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTsKICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTsKICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlOwoKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH07CgogICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogICAgICB9CiAgICB9CgogICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLgogICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9OwogIH0KICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlczsKCiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsKICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTsKICB9CgogIENvbnRleHQucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IENvbnRleHQsCgogICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHsKICAgICAgdGhpcy5wcmV2ID0gMDsKICAgICAgdGhpcy5uZXh0ID0gMDsKICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3MKICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi4KICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDsKICAgICAgdGhpcy5kb25lID0gZmFsc2U7CiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsOwoKICAgICAgdGhpcy5tZXRob2QgPSAibmV4dCI7CiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkOwoKICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7CgogICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHsKICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6CiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICJ0IiAmJgogICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmCiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkgewogICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBzdG9wOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKCiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07CiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247CiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZzsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMucnZhbDsKICAgIH0sCgogICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikgewogICAgICBpZiAodGhpcy5kb25lKSB7CiAgICAgICAgdGhyb3cgZXhjZXB0aW9uOwogICAgICB9CgogICAgICB2YXIgY29udGV4dCA9IHRoaXM7CiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgewogICAgICAgIHJlY29yZC50eXBlID0gInRocm93IjsKICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uOwogICAgICAgIGNvbnRleHQubmV4dCA9IGxvYzsKCiAgICAgICAgaWYgKGNhdWdodCkgewogICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jaywKICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuCiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IjsKICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICEhIGNhdWdodDsKICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKCiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gInJvb3QiKSB7CiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZQogICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLgogICAgICAgICAgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikgewogICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpOwogICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKTsKCiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkgewogICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHsKICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHsKICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogICAgICAgICAgICB9CgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykgewogICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmCiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpICYmCiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJgogICAgICAgICAgKHR5cGUgPT09ICJicmVhayIgfHwKICAgICAgICAgICB0eXBlID09PSAiY29udGludWUiKSAmJgogICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYKICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykgewogICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGEKICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suCiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307CiAgICAgIHJlY29yZC50eXBlID0gdHlwZTsKICAgICAgcmVjb3JkLmFyZyA9IGFyZzsKCiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHsKICAgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYzsKICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTsKICAgIH0sCgogICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHsKICAgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZzsKICAgICAgfQoKICAgICAgaWYgKHJlY29yZC50eXBlID09PSAiYnJlYWsiIHx8CiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gImNvbnRpbnVlIikgewogICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7CiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09ICJyZXR1cm4iKSB7CiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnOwogICAgICAgIHRoaXMubWV0aG9kID0gInJldHVybiI7CiAgICAgICAgdGhpcy5uZXh0ID0gImVuZCI7CiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09ICJub3JtYWwiICYmIGFmdGVyTG9jKSB7CiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7CiAgICAgIH0KCiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgfSwKCiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHsKICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgewogICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7CiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAiY2F0Y2giOiBmdW5jdGlvbih0cnlMb2MpIHsKICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnOwogICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aHJvd247CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb24KICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLgogICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogICAgfSwKCiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgewogICAgICB0aGlzLmRlbGVnYXRlID0gewogICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLAogICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsCiAgICAgICAgbmV4dExvYzogbmV4dExvYwogICAgICB9OwoKICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAibmV4dCIpIHsKICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndAogICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS4KICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDsKICAgICAgfQoKICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICB9CiAgfTsKCiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZQogIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZQogIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZQogIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuCiAgcmV0dXJuIGV4cG9ydHM7Cgp9KAogIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzCiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHkKICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplCiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgdHJ1ZSA/IG1vZHVsZS5leHBvcnRzIDogMAopKTsKCnRyeSB7CiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTsKfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZQogIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdAogIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgaW4gbW9kZXJuIGVuZ2luZXMKICAvLyB3ZSBjYW4gZXhwbGljaXRseSBhY2Nlc3MgZ2xvYmFsVGhpcy4gSW4gb2xkZXIgZW5naW5lcyB3ZSBjYW4gZXNjYXBlCiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsCiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlCiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWYKICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYQogIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZQogIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLgogIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTsKICB9IGVsc2UgewogICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogIH0KfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy93aGF0d2ctZmV0Y2gvZmV0Y2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAiSGVhZGVycyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBIZWFkZXJzOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJSZXF1ZXN0IjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFJlcXVlc3Q7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIlJlc3BvbnNlIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFJlc3BvbnNlOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJET01FeGNlcHRpb24iOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gRE9NRXhjZXB0aW9uOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJmZXRjaCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBmZXRjaDsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKdmFyIHN1cHBvcnQgPSB7CiAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBzZWxmLAogIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBzZWxmICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLAogIGJsb2I6CiAgICAnRmlsZVJlYWRlcicgaW4gc2VsZiAmJgogICAgJ0Jsb2InIGluIHNlbGYgJiYKICAgIChmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICBuZXcgQmxvYigpCiAgICAgICAgcmV0dXJuIHRydWUKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICB9KSgpLAogIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIHNlbGYsCiAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gc2VsZgp9CgpmdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikgewogIHJldHVybiBvYmogJiYgRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKQp9CgppZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikgewogIHZhciB2aWV3Q2xhc3NlcyA9IFsKICAgICdbb2JqZWN0IEludDhBcnJheV0nLAogICAgJ1tvYmplY3QgVWludDhBcnJheV0nLAogICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJywKICAgICdbb2JqZWN0IEludDE2QXJyYXldJywKICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsCiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsCiAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLAogICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsCiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJwogIF0KCiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID0KICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fAogICAgZnVuY3Rpb24ob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMQogICAgfQp9CgpmdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHsKICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICBuYW1lID0gU3RyaW5nKG5hbWUpCiAgfQogIGlmICgvW15hLXowLTlcLSMkJSYnKisuXl9gfH5dL2kudGVzdChuYW1lKSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUnKQogIH0KICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpCn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKQogIH0KICByZXR1cm4gdmFsdWUKfQoKLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3QKZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHsKICB2YXIgaXRlcmF0b3IgPSB7CiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKQogICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX0KICAgIH0KICB9CgogIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7CiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBpdGVyYXRvcgogICAgfQogIH0KCiAgcmV0dXJuIGl0ZXJhdG9yCn0KCmZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykgewogIHRoaXMubWFwID0ge30KCiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7CiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsKICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpCiAgICB9LCB0aGlzKQogIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgewogICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikgewogICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSkKICAgIH0sIHRoaXMpCiAgfSBlbHNlIGlmIChoZWFkZXJzKSB7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSkKICAgIH0sIHRoaXMpCiAgfQp9CgpIZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpCiAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSkKICB2YXIgb2xkVmFsdWUgPSB0aGlzLm1hcFtuYW1lXQogIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlCn0KCkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0KfQoKSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkgewogIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpCiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsCn0KCkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSkKfQoKSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKQp9CgpIZWFkZXJzLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHsKICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7CiAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcykKICAgIH0KICB9Cn0KCkhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHsKICB2YXIgaXRlbXMgPSBbXQogIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkgewogICAgaXRlbXMucHVzaChuYW1lKQogIH0pCiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKQp9CgpIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHsKICB2YXIgaXRlbXMgPSBbXQogIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgewogICAgaXRlbXMucHVzaCh2YWx1ZSkKICB9KQogIHJldHVybiBpdGVyYXRvckZvcihpdGVtcykKfQoKSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkgewogIHZhciBpdGVtcyA9IFtdCiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7CiAgICBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pCiAgfSkKICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpCn0KCmlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7CiAgSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMKfQoKZnVuY3Rpb24gY29uc3VtZWQoYm9keSkgewogIGlmIChib2R5LmJvZHlVc2VkKSB7CiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpCiAgfQogIGJvZHkuYm9keVVzZWQgPSB0cnVlCn0KCmZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCkKICAgIH0KICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpCiAgICB9CiAgfSkKfQoKZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHsKICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKQogIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikKICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYikKICByZXR1cm4gcHJvbWlzZQp9CgpmdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7CiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCkKICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpCiAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYikKICByZXR1cm4gcHJvbWlzZQp9CgpmdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7CiAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpCiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKQoKICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHsKICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKQogIH0KICByZXR1cm4gY2hhcnMuam9pbignJykKfQoKZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7CiAgaWYgKGJ1Zi5zbGljZSkgewogICAgcmV0dXJuIGJ1Zi5zbGljZSgwKQogIH0gZWxzZSB7CiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKQogICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSkKICAgIHJldHVybiB2aWV3LmJ1ZmZlcgogIH0KfQoKZnVuY3Rpb24gQm9keSgpIHsKICB0aGlzLmJvZHlVc2VkID0gZmFsc2UKCiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7CiAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHkKICAgIGlmICghYm9keSkgewogICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnCiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykgewogICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkKICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5CiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keQogICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKCkKICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkgewogICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcikKICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS4KICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkKICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7CiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpCiAgICB9IGVsc2UgewogICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSkKICAgIH0KCiAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7CiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHsKICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JykKICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7CiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSkKICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoc3VwcG9ydC5ibG9iKSB7CiAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcykKICAgICAgaWYgKHJlamVjdGVkKSB7CiAgICAgICAgcmV0dXJuIHJlamVjdGVkCiAgICAgIH0KCiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpCiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpCiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKQogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpCiAgICAgIH0KICAgIH0KCiAgICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHsKICAgICAgICByZXR1cm4gY29uc3VtZWQodGhpcykgfHwgUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpCiAgICAgIH0KICAgIH0KICB9CgogIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcykKICAgIGlmIChyZWplY3RlZCkgewogICAgICByZXR1cm4gcmVqZWN0ZWQKICAgIH0KCiAgICBpZiAodGhpcy5fYm9keUJsb2IpIHsKICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKQogICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSkKICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JykKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpCiAgICB9CiAgfQoKICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkgewogICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpCiAgICB9CiAgfQoKICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpCiAgfQoKICByZXR1cm4gdGhpcwp9CgovLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWQKdmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ10KCmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHsKICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpCiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZAp9CgpmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30KICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keQoKICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7CiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykKICAgIH0KICAgIHRoaXMudXJsID0gaW5wdXQudXJsCiAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHMKICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7CiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpCiAgICB9CiAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZAogICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZQogICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWwKICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkgewogICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0CiAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZQogICAgfQogIH0gZWxzZSB7CiAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dCkKICB9CgogIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJwogIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykgewogICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKQogIH0KICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJykKICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGwKICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsCiAgdGhpcy5yZWZlcnJlciA9IG51bGwKCiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKQogIH0KICB0aGlzLl9pbml0Qm9keShib2R5KQp9CgpSZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KQp9CgpmdW5jdGlvbiBkZWNvZGUoYm9keSkgewogIHZhciBmb3JtID0gbmV3IEZvcm1EYXRhKCkKICBib2R5CiAgICAudHJpbSgpCiAgICAuc3BsaXQoJyYnKQogICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHsKICAgICAgaWYgKGJ5dGVzKSB7CiAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKQogICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCAnICcpCiAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1wrL2csICcgJykKICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpCiAgICAgIH0KICAgIH0pCiAgcmV0dXJuIGZvcm0KfQoKZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHsKICB2YXIgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCkKICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcclxuIGFuZCBcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlCiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjIKICB2YXIgcHJlUHJvY2Vzc2VkSGVhZGVycyA9IHJhd0hlYWRlcnMucmVwbGFjZSgvXHI/XG5bXHQgXSsvZywgJyAnKQogIHByZVByb2Nlc3NlZEhlYWRlcnMuc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7CiAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JykKICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKQogICAgaWYgKGtleSkgewogICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpCiAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpCiAgICB9CiAgfSkKICByZXR1cm4gaGVhZGVycwp9CgpCb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpCgpmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykgewogIGlmICghb3B0aW9ucykgewogICAgb3B0aW9ucyA9IHt9CiAgfQoKICB0aGlzLnR5cGUgPSAnZGVmYXVsdCcKICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1cwogIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDAKICB0aGlzLnN0YXR1c1RleHQgPSAnc3RhdHVzVGV4dCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzVGV4dCA6ICdPSycKICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpCiAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJwogIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KQp9CgpCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKQoKUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLl9ib2R5SW5pdCwgewogICAgc3RhdHVzOiB0aGlzLnN0YXR1cywKICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCwKICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksCiAgICB1cmw6IHRoaXMudXJsCiAgfSkKfQoKUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHsKICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMCwgc3RhdHVzVGV4dDogJyd9KQogIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InCiAgcmV0dXJuIHJlc3BvbnNlCn0KCnZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XQoKUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykgewogIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJykKICB9CgogIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KQp9Cgp2YXIgRE9NRXhjZXB0aW9uID0gc2VsZi5ET01FeGNlcHRpb24KdHJ5IHsKICBuZXcgRE9NRXhjZXB0aW9uKCkKfSBjYXRjaCAoZXJyKSB7CiAgRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgbmFtZSkgewogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZQogICAgdGhpcy5uYW1lID0gbmFtZQogICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSkKICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFjawogIH0KICBET01FeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpCiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERPTUV4Y2VwdGlvbgp9CgpmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkgewogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpCgogICAgaWYgKHJlcXVlc3Quc2lnbmFsICYmIHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHsKICAgICAgcmV0dXJuIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSkKICAgIH0KCiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCkKCiAgICBmdW5jdGlvbiBhYm9ydFhocigpIHsKICAgICAgeGhyLmFib3J0KCkKICAgIH0KCiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBvcHRpb25zID0gewogICAgICAgIHN0YXR1czogeGhyLnN0YXR1cywKICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCwKICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKQogICAgICB9CiAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJykKICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHQKICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpCiAgICB9CgogICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSkKICAgIH0KCiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpCiAgICB9CgogICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHsKICAgICAgcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKQogICAgfQoKICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCByZXF1ZXN0LnVybCwgdHJ1ZSkKCiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7CiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlCiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdvbWl0JykgewogICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gZmFsc2UKICAgIH0KCiAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyICYmIHN1cHBvcnQuYmxvYikgewogICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InCiAgICB9CgogICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsKICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpCiAgICB9KQoKICAgIGlmIChyZXF1ZXN0LnNpZ25hbCkgewogICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKQoKICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkKICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHsKICAgICAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpCiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgeGhyLnNlbmQodHlwZW9mIHJlcXVlc3QuX2JvZHlJbml0ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiByZXF1ZXN0Ll9ib2R5SW5pdCkKICB9KQp9CgpmZXRjaC5wb2x5ZmlsbCA9IHRydWUKCmlmICghc2VsZi5mZXRjaCkgewogIHNlbGYuZmV0Y2ggPSBmZXRjaAogIHNlbGYuSGVhZGVycyA9IEhlYWRlcnMKICBzZWxmLlJlcXVlc3QgPSBSZXF1ZXN0CiAgc2VsZi5SZXNwb25zZSA9IFJlc3BvbnNlCn0KCgovKioqLyB9KQoKLyoqKioqKi8gCX0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLy8gVGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJdmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9OwovKioqKioqLyAJCi8qKioqKiovIAkvLyBUaGUgcmVxdWlyZSBmdW5jdGlvbgovKioqKioqLyAJZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgewovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQovKioqKioqLyAJCXZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdOwovKioqKioqLyAJCWlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkgewovKioqKioqLyAJCQlyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAkJfQovKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCi8qKioqKiovIAkJdmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7Ci8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJLy8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWQKLyoqKioqKi8gCQkJZXhwb3J0czoge30KLyoqKioqKi8gCQl9OwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCi8qKioqKiovIAkJX193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7Ci8qKioqKiovIAkKLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQovKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKLyoqKioqKi8gCX0KLyoqKioqKi8gCQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi8KLyoqKioqKi8gCSFmdW5jdGlvbigpIHsKLyoqKioqKi8gCQkvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlcwovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkgewovKioqKioqLyAJCQl2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KLyoqKioqKi8gCQkJCWZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOgovKioqKioqLyAJCQkJZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07Ci8qKioqKiovIAkJCV9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pOwovKioqKioqLyAJCQlyZXR1cm4gZ2V0dGVyOwovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KCk7Ci8qKioqKiovIAkKLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqLwovKioqKioqLyAJIWZ1bmN0aW9uKCkgewovKioqKioqLyAJCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi8gCQlfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7Ci8qKioqKiovIAkJCWZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHsKLyoqKioqKi8gCQkJCWlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkgewovKioqKioqLyAJCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCQl9Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9OwovKioqKioqLyAJfSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsICovCi8qKioqKiovIAkhZnVuY3Rpb24oKSB7Ci8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkgewovKioqKioqLyAJCQlpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpczsKLyoqKioqKi8gCQkJdHJ5IHsKLyoqKioqKi8gCQkJCXJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwovKioqKioqLyAJCQl9IGNhdGNoIChlKSB7Ci8qKioqKiovIAkJCQlpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9KSgpOwovKioqKioqLyAJfSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovCi8qKioqKiovIAkhZnVuY3Rpb24oKSB7Ci8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfQovKioqKioqLyAJfSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0ICovCi8qKioqKiovIAkhZnVuY3Rpb24oKSB7Ci8qKioqKiovIAkJLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0cwovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHsKLyoqKioqKi8gCQkJaWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7Ci8qKioqKiovIAkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTsKLyoqKioqKi8gCQkJfQovKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KCk7Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSB7fTsKLy8gVGhpcyBlbnRyeSBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gYW4gSUlGRSBiZWNhdXNlIGl0IG5lZWQgdG8gYmUgaW4gc3RyaWN0IG1vZGUuCiFmdW5jdGlvbigpIHsKInVzZSBzdHJpY3QiOwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKiovCl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciByZWdlbmVyYXRvcl9ydW50aW1lX3J1bnRpbWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSAqLyAiLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciByZWdlbmVyYXRvcl9ydW50aW1lX3J1bnRpbWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihyZWdlbmVyYXRvcl9ydW50aW1lX3J1bnRpbWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciB3aGF0d2dfZmV0Y2hfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHdoYXR3Zy1mZXRjaCAqLyAiLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfQXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvQXBwICovICIuL3NyYy92aWV3L0FwcC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfc3R5bGVzX2luZGV4X2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L3N0eWxlcy9pbmRleC5jc3MgKi8gIi4vc3JjL3ZpZXcvc3R5bGVzL2luZGV4LmNzcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfc3R5bGVzX2luZGV4X2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF92aWV3X3N0eWxlc19pbmRleF9jc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19zdG9yZV9hY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvc3RvcmUvYWN0aW9ucyAqLyAiLi9zcmMvdmlldy9zdG9yZS9hY3Rpb25zLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19zdG9yZV9zdGF0ZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L3N0b3JlL3N0YXRlICovICIuL3NyYy92aWV3L3N0b3JlL3N0YXRlLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld191dGlsX2dldFVzZXJNZXRhX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvdXRpbC9nZXRVc2VyTWV0YSAqLyAiLi9zcmMvdmlldy91dGlsL2dldFVzZXJNZXRhLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX3Rvb2xfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvdG9vbCAqLyAiLi9zcmMvc2hhcmVkL3Rvb2wuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvc2hvdWxkRGlyZWN0RW1iZWQgKi8gIi4vc3JjL3NoYXJlZC9zaG91bGREaXJlY3RFbWJlZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvc2hhcmVkL3VsRXZlbnRzICovICIuL3NyYy9zaGFyZWQvdWxFdmVudHMuanMiKTsKCgovKiBnbG9iYWxzIGRvY3VtZW50IHdpbmRvdyovCi8vIFBvbHlmaWxscwoKCgoKCgoKCgoKCiAvLyBDb25zdW1lIGJvb3RzdHJhcHBlZCBjb25maWcKCnZhciBfd2luZG93JF9fY2ZnID0gd2luZG93Ll9fY2ZnLAogICAgZnJhbWUgPSBfd2luZG93JF9fY2ZnLmZyYW1lLAogICAgZW52SWQgPSBfd2luZG93JF9fY2ZnLmVudklkLAogICAgc3VydmV5SWQgPSBfd2luZG93JF9fY2ZnLnN1cnZleUlkLAogICAgdXNlcklkID0gX3dpbmRvdyRfX2NmZy51c2VySWQsCiAgICBjYXJkcyA9IF93aW5kb3ckX19jZmcuY2FyZHMsCiAgICBtb2RlID0gX3dpbmRvdyRfX2NmZy5tb2RlLAogICAgX3dpbmRvdyRfX2NmZyRib3JkZXIgPSBfd2luZG93JF9fY2ZnLmJvcmRlciwKICAgIGJvcmRlciA9IF93aW5kb3ckX19jZmckYm9yZGVyID09PSB2b2lkIDAgPyAnIzY2NjRmNycgOiBfd2luZG93JF9fY2ZnJGJvcmRlciwKICAgIGNvbnRleHQgPSBfd2luZG93JF9fY2ZnLmNvbnRleHQsCiAgICBsb2NhbGUgPSBfd2luZG93JF9fY2ZnLmxvY2FsZSwKICAgIGZvbnRGYW1pbHkgPSBfd2luZG93JF9fY2ZnLmZvbnRGYW1pbHksCiAgICBmb250RmFtaWx5VVJMID0gX3dpbmRvdyRfX2NmZy5mb250RmFtaWx5VVJMLAogICAgYXBpVVJMID0gX3dpbmRvdyRfX2NmZy5hcGlVUkwsCiAgICBzaG93U3VydmV5QnJhbmQgPSBfd2luZG93JF9fY2ZnLnNob3dTdXJ2ZXlCcmFuZCwKICAgIG1hcmtldGluZ1VybCA9IF93aW5kb3ckX19jZmcubWFya2V0aW5nVXJsLAogICAgc2x1Z05hbWUgPSBfd2luZG93JF9fY2ZnLnNsdWdOYW1lLAogICAgcmVzcG9uc2VHcm91cFVpZCA9IF93aW5kb3ckX19jZmcucmVzcG9uc2VHcm91cFVpZCwKICAgIGhlYWRlcnMgPSBfd2luZG93JF9fY2ZnLmhlYWRlcnMsCiAgICBlbmRDYXJkID0gX3dpbmRvdyRfX2NmZy5lbmRDYXJkLAogICAgY3VzdG9tU3R5bGVzID0gX3dpbmRvdyRfX2NmZy5jdXN0b21TdHlsZXMsCiAgICBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2sgPSBfd2luZG93JF9fY2ZnLmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljaywKICAgIGlzUHJldmlldyA9IF93aW5kb3ckX19jZmcuaXNQcmV2aWV3LAogICAgYW5zd2VycyA9IF93aW5kb3ckX19jZmcuYW5zd2VycywKICAgIGN1c3RvbU1ldGFkYXRhID0gX3dpbmRvdyRfX2NmZy5jdXN0b21NZXRhZGF0YSwKICAgIGV4cGVyaW1lbnRGbGFncyA9IF93aW5kb3ckX19jZmcuZXhwZXJpbWVudEZsYWdzLAogICAgdXNlTW9iaWxlU3R5bGluZyA9IF93aW5kb3ckX19jZmcudXNlTW9iaWxlU3R5bGluZywKICAgIG1vYmlsZVBsYXRmb3JtID0gX3dpbmRvdyRfX2NmZy5tb2JpbGVQbGF0Zm9ybSwKICAgIGV2ZW50RW1pdHRlciA9IF93aW5kb3ckX19jZmcuZXZlbnRFbWl0dGVyOwp2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsCiAgICBoZWFkID0gX2RvY3VtZW50LmhlYWQ7CnZhciB2aWV3U2RrVmVyc2lvbiA9ICcyLjE0LjQnOyAvLyBidWlsZC5qcyBsbjc0IHdpbGwgc3RyaW5nIHJlcGxhY2UuIERvIG5vdCBtb2RpZnksIGluc3RlYWQgY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciBpbiBwYWNrYWdlLmpzb24KCnZhciBiYWNrd2FyZENvbXBhdGlibGVFdmVudEVtaXR0ZXIgPSBldmVudEVtaXR0ZXIgfHwgZnJhbWUuZXZlbnRFbWl0dGVyOwpiYWNrd2FyZENvbXBhdGlibGVFdmVudEVtaXR0ZXIgJiYgYmFja3dhcmRDb21wYXRpYmxlRXZlbnRFbWl0dGVyLmVtaXQoX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXy5pbnRlcm5hbEV2ZW50cy5uYW1lLlZFUklGWV9WSUVXX1ZFUlNJT04sIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoe30sIF9zaGFyZWRfdWxFdmVudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18uaW50ZXJuYWxFdmVudHMuZGF0YS5WSUVXX1ZFUlNJT04sIHZpZXdTZGtWZXJzaW9uKSk7IC8vIEluamVjdCBzdHlsZXNoZWV0Cgp2YXIgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnOwpzdHlsZXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoKF92aWV3X3N0eWxlc19pbmRleF9jc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX19kZWZhdWx0KCkpKSk7CmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVzKTsKY3VzdG9tU3R5bGVzICYmICgwLF9zaGFyZWRfdG9vbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy5vdmVycmlkZVN0eWxlcykoZG9jdW1lbnQsIGN1c3RvbVN0eWxlcyk7IC8vIEluamVjdCBicmFuZCBmb250cwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKCmlmIChmb250RmFtaWx5ICYmIGZvbnRGYW1pbHlVUkwgJiYgcGFyZW50KSB7CiAgLy8gcGFyZW50IGNvbWVzIGZyb20gdGhlIERPTQogIHZhciBsaW5rcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICBsaW5rcy5yZWwgPSAnc3R5bGVzaGVldCc7CiAgbGlua3MuaHJlZiA9IGZvbnRGYW1pbHlVUkw7CiAgaGVhZC5hcHBlbmRDaGlsZChsaW5rcyk7Cn0KCnZhciBjb250YWluZXIgPSAoMCxfc2hhcmVkX3Nob3VsZERpcmVjdEVtYmVkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fWyJkZWZhdWx0Il0pKGhlYWRlcnMpID8gd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZyYW1lKSA6IGRvY3VtZW50LmJvZHk7CnZhciBtYWluID0gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5hcHApKF92aWV3X3N0b3JlX3N0YXRlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImRlZmF1bHQiXSwgX3ZpZXdfc3RvcmVfYWN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fWyJkZWZhdWx0Il0sIF92aWV3X0FwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fWyJkZWZhdWx0Il0sIGNvbnRhaW5lcik7Cm1haW4uaW5pdCh7CiAgc3VydmV5SWQ6IHN1cnZleUlkLAogIGZyYW1lOiBmcmFtZSwKICBlbnZJZDogZW52SWQsCiAgdXNlcklkOiB1c2VySWQsCiAgY2FyZHM6IGNhcmRzLAogIG1vZGU6IG1vZGUsCiAgbWV0YTogKDAsX3ZpZXdfdXRpbF9nZXRVc2VyTWV0YV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fWyJkZWZhdWx0Il0pKHsKICAgIG1vZGU6IG1vZGUsCiAgICBkaXJlY3RFbWJlZDogKDAsX3NoYXJlZF9zaG91bGREaXJlY3RFbWJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfX1siZGVmYXVsdCJdKShoZWFkZXJzKQogIH0pLAogIGJvcmRlcjogYm9yZGVyLAogIGZvbnRGYW1pbHk6IGZvbnRGYW1pbHksCiAgY29udGV4dDogY29udGV4dCwKICBsb2NhbGU6IGxvY2FsZSwKICBhcGlVUkw6IGFwaVVSTCwKICBzaG93U3VydmV5QnJhbmQ6IHNob3dTdXJ2ZXlCcmFuZCwKICBtYXJrZXRpbmdVcmw6IG1hcmtldGluZ1VybCwKICBzbHVnTmFtZTogc2x1Z05hbWUsCiAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICBoZWFkZXJzOiBoZWFkZXJzLAogIGVuZENhcmQ6IGVuZENhcmQsCiAgY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrOiBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2ssCiAgaXNQcmV2aWV3OiBpc1ByZXZpZXcsCiAgYW5zd2VyczogYW5zd2VycywKICBjdXN0b21NZXRhZGF0YTogY3VzdG9tTWV0YWRhdGEsCiAgZXhwZXJpbWVudEZsYWdzOiBleHBlcmltZW50RmxhZ3MsCiAgdXNlTW9iaWxlU3R5bGluZzogdXNlTW9iaWxlU3R5bGluZywKICBtb2JpbGVQbGF0Zm9ybTogbW9iaWxlUGxhdGZvcm0sCiAgZXZlbnRFbWl0dGVyOiBldmVudEVtaXR0ZXIKfSk7Cn0oKTsKLyoqKioqKi8gfSkoKQo7";
|
|
2
2
|
export default _default;
|
|
3
3
|
//# sourceMappingURL=encodedViewJs.d.ts.map
|