Le Mechanical Structure Overall Safety Factor Calculator is a practical engineering tool designed to evaluate the overall safety margin of mechanical structures under axial, shear, bending, torsional, and combined loads. By analyzing applied loads, material strength, geometry, equivalent stress, and correction factors, users can quickly assess structural reliability and strength utilization. The Mechanical Structure Overall Safety Factor Calculator helps engineers optimize machine frames, beams, brackets, shafts, supports, and other structural components while reducing the risk of overload and structural failure.
KGZ1bmN0aW9uICgpIHsNCiAgICAndXNlIHN0cmljdCc7DQoNCiAgICB2YXIgUk9PVF9JRCA9ICdtZWNoYW5pY2FsLXN0cnVjdHVyZS1zYWZldHktZmFjdG9yLWNhbGN1bGF0b3InOw0KDQogICAgdmFyIE1BVEVSSUFMUyA9IHsNCiAgICAgICAgJ3N0cnVjdHVyYWwtc3RlZWwnOiB7IHN5OiAzNTUsIHN1OiA1MTAsIGxhYmVsOiAnU3RydWN0dXJhbCBTdGVlbCcgfSwNCiAgICAgICAgJ2NhcmJvbi1zdGVlbCc6IHsgc3k6IDI1MCwgc3U6IDQwMCwgbGFiZWw6ICdDYXJib24gU3RlZWwnIH0sDQogICAgICAgICdhbGxveS1zdGVlbCc6IHsgc3k6IDY5MCwgc3U6IDg2MCwgbGFiZWw6ICdBbGxveSBTdGVlbCcgfSwNCiAgICAgICAgJ3N0YWlubGVzcy1zdGVlbCc6IHsgc3k6IDIwNSwgc3U6IDUxNSwgbGFiZWw6ICdTdGFpbmxlc3MgU3RlZWwnIH0sDQogICAgICAgICdhbHVtaW51bS1hbGxveSc6IHsgc3k6IDI3Niwgc3U6IDMxMCwgbGFiZWw6ICdBbHVtaW51bSBBbGxveScgfSwNCiAgICAgICAgJ2Nhc3QtaXJvbic6IHsgc3k6IDIwMCwgc3U6IDMwMCwgbGFiZWw6ICdDYXN0IElyb24nIH0sDQogICAgICAgIGN1c3RvbTogeyBzeTogbnVsbCwgc3U6IG51bGwsIGxhYmVsOiAnQ3VzdG9tIE1hdGVyaWFsJyB9DQogICAgfTsNCg0KICAgIHZhciBERUZBVUxUUyA9IHsNCiAgICAgICAgY2FsY01vZGU6ICdjb21iaW5lZCcsDQogICAgICAgIHN0cnVjdHVyZVR5cGU6ICdtYWNoaW5lLWZyYW1lJywNCiAgICAgICAgbWF0ZXJpYWw6ICdzdHJ1Y3R1cmFsLXN0ZWVsJywNCiAgICAgICAgeWllbGRTdHJlbmd0aDogMzU1LA0KICAgICAgICB1bHRpbWF0ZVN0cmVuZ3RoOiA1MTAsDQogICAgICAgIGFyZWE6IDI1MDAsDQogICAgICAgIHNlY3Rpb25Nb2R1bHVzOiAxNTAwMDAsDQogICAgICAgIG1vbWVudE9mSW5lcnRpYTogJycsDQogICAgICAgIHBvbGFyTW9tZW50OiAnJywNCiAgICAgICAgb3V0ZXJSYWRpdXM6IDI1LA0KICAgICAgICBheGlhbExvYWQ6IDUwLA0KICAgICAgICBheGlhbExvYWRVbml0OiAna04nLA0KICAgICAgICBzaGVhckxvYWQ6IDIwLA0KICAgICAgICBzaGVhckxvYWRVbml0OiAna04nLA0KICAgICAgICBiZW5kaW5nTW9tZW50OiA4LA0KICAgICAgICBiZW5kaW5nTW9tZW50VW5pdDogJ2tOwrdtJywNCiAgICAgICAgdG9ycXVlOiAwLA0KICAgICAgICB0b3JxdWVVbml0OiAnTsK3bScsDQogICAgICAgIGRpcmVjdE5vcm1hbFN0cmVzczogJycsDQogICAgICAgIGRpcmVjdFNoZWFyU3RyZXNzOiAnJywNCiAgICAgICAgc3RyZXNzQ3JpdGVyaW9uOiAndm9uLW1pc2VzJywNCiAgICAgICAgc3RyZW5ndGhSZWY6ICd5aWVsZCcsDQogICAgICAgIGN1c3RvbUxpbWl0OiAnJywNCiAgICAgICAga0R5bmFtaWM6IDEuMiwNCiAgICAgICAga0ltcGFjdDogMS4xLA0KICAgICAgICBrRmF0aWd1ZTogMS4wLA0KICAgICAgICBrVGVtcDogMS4wLA0KICAgICAgICBrVW5jZXJ0YWludHk6IDEuMSwNCiAgICAgICAga1N0cmVzc0NvbmM6IDEuMCwNCiAgICAgICAgdGFyZ2V0U2Y6IDIuMCwNCiAgICAgICAgY29sdW1uTGVuZ3RoOiAnJywNCiAgICAgICAgc2xlbmRlcm5lc3M6ICcnLA0KICAgICAgICBjeWNsaWNMb2FkaW5nOiBmYWxzZSwNCiAgICAgICAgdW5pdFN5c3RlbTogJ21ldHJpYycNCiAgICB9Ow0KDQogICAgdmFyIE5fVE9fS04gPSAwLjAwMTsNCiAgICB2YXIgS05fVE9fTiA9IDEwMDA7DQogICAgdmFyIE5fVE9fTEJGID0gMSAvIDQuNDQ4MjIxNjE1MzsNCiAgICB2YXIgTEJGX1RPX04gPSA0LjQ0ODIyMTYxNTM7DQogICAgdmFyIE1QQV9UT19QU0kgPSAxNDUuMDM3NzM4MDA3Ow0KICAgIHZhciBQU0lfVE9fTVBBID0gMSAvIE1QQV9UT19QU0k7DQogICAgdmFyIE1NMl9UT19JTjIgPSAxIC8gNjQ1LjE2Ow0KICAgIHZhciBJTjJfVE9fTU0yID0gNjQ1LjE2Ow0KICAgIHZhciBNTTNfVE9fSU4zID0gMSAvIDE2Mzg3LjA2NDsNCiAgICB2YXIgSU4zX1RPX01NMyA9IDE2Mzg3LjA2NDsNCiAgICB2YXIgTU00X1RPX0lONCA9IDEgLyA0MTYyMzEuNDI2Ow0KICAgIHZhciBJTjRfVE9fTU00ID0gNDE2MjMxLjQyNjsNCiAgICB2YXIgTk1fVE9fS05NID0gMC4wMDE7DQogICAgdmFyIEtOTV9UT19OTSA9IDEwMDA7DQogICAgdmFyIE5NX1RPX0xCRkZUID0gMC43Mzc1NjIxNDkzOw0KICAgIHZhciBMQkZGVF9UT19OTSA9IDEgLyBOTV9UT19MQkZGVDsNCg0KICAgIHZhciByb290LCBlbHMsIG1hbnVhbE1hdGVyaWFsRWRpdCwgbWFudWFsU3RyZW5ndGhFZGl0Ow0KDQogICAgZnVuY3Rpb24gJChpZCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwYXJzZU51bSh2KSB7DQogICAgICAgIGlmICh2ID09PSAnJyB8fCB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7DQogICAgICAgIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodikucmVwbGFjZSgnLCcsICcuJykpOw0KICAgICAgICByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmbXQodiwgZCkgew0KICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgIWlzRmluaXRlKHYpKSByZXR1cm4gJ+KAlCc7DQogICAgICAgIHJldHVybiB2LnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsNCiAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCwNCiAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZCAhPT0gdW5kZWZpbmVkID8gZCA6IDINCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaXNNZXRyaWMoKSB7DQogICAgICAgIHJldHVybiBlbHMudW5pdFN5c3RlbS52YWx1ZSA9PT0gJ21ldHJpYyc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3RyZXNzVW5pdCgpIHsNCiAgICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyAnTVBhJyA6ICdwc2knOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljU3RyZXNzKHYsIHVuaXQpIHsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdNUGEnKSByZXR1cm4gdjsNCiAgICAgICAgcmV0dXJuIHYgKiBQU0lfVE9fTVBBOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NZXRyaWNTdHJlc3ModiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ01QYScpIHJldHVybiB2Ow0KICAgICAgICByZXR1cm4gdiAqIE1QQV9UT19QU0k7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNGb3JjZSh2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnTicpIHJldHVybiB2Ow0KICAgICAgICBpZiAodW5pdCA9PT0gJ2tOJykgcmV0dXJuIHYgKiBLTl9UT19OOw0KICAgICAgICByZXR1cm4gdiAqIExCRl9UT19OOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljQXJlYSh2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnbW3CsicpIHJldHVybiB2Ow0KICAgICAgICByZXR1cm4gdiAqIElOMl9UT19NTTI7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNTZWN0aW9uTW9kKHYsIHVuaXQpIHsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdtbcKzJykgcmV0dXJuIHY7DQogICAgICAgIHJldHVybiB2ICogSU4zX1RPX01NMzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB0b01ldHJpY0luZXJ0aWEodiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ21t4oG0JykgcmV0dXJuIHY7DQogICAgICAgIHJldHVybiB2ICogSU40X1RPX01NNDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB0b01ldHJpY01vbWVudCh2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnTsK3bScpIHJldHVybiB2Ow0KICAgICAgICBpZiAodW5pdCA9PT0gJ2tOwrdtJykgcmV0dXJuIHYgKiBLTk1fVE9fTk07DQogICAgICAgIHJldHVybiB2ICogTEJGRlRfVE9fTk07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNMZW5ndGgodiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ21tJykgcmV0dXJuIHY7DQogICAgICAgIHJldHVybiB2ICogMjUuNDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjb252ZXJ0RGlzcGxheVN0cmVzcyhtcGEpIHsNCiAgICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyBtcGEgOiBtcGEgKiBNUEFfVE9fUFNJOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNldFZpc2libGUoc2VsZWN0b3IsIHNob3cpIHsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbXNvc2ZjLWhpZGRlbicsICFzaG93KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xlYXJFcnJvcnMoKSB7DQogICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLm1zb3NmYy1lcnJvcicpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdtc29zZmMtZXJyb3InKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFs bCgnLm1zb3NmYy1maWVsZC1lcnJvcicpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9ICcnOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzZXRGaWVsZEVycm9yKGlucHV0SWQsIGVycklkLCBtc2cpIHsNCiAgICAgICAgdmFyIGlucHV0ID0gJChpbnB1dElkKTsNCiAgICAgICAgdmFyIGVyciA9ICQoZXJySWQpOw0KICAgICAgICBpZiAoaW5wdXQpIGlucHV0LmNsYXNzTGlzdC5hZGQoJ21zb3NmYy1lcnJvcicpOw0KICAgICAgICBpZiAoZXJyKSBlcnIudGV4dENvbnRlbnQgPSBtc2cgfHwgJyc7DQogICAgICAgIHJldHVybiAhIW1zZzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwcmluY2lwYWxTdHJlc3NlczJEKHN4LCBzeSwgdHh5KSB7DQogICAgICAgIHZhciBhdmcgPSAoc3ggKyBzeSkgLyAyOw0KICAgICAgICB2YXIgcmFkID0gTWF0aC5zcXJ0KE1hdGgucG93KChzeCAtIHN5KSAvIDIsIDIpICsgdHh5ICogdHh5KTsNCiAgICAgICAgcmV0dXJuIHsgczE6IGF2ZyArIHJhZCwgczI6IGF2ZyAtIHJhZCwgczM6IDAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2b25NaXNlczJEKHN4LCBzeSwgdHh5KSB7DQogICAgICAgIHJldHVybiBNYXRoLnNxcnQoc3ggKiBzeCAtIHN4ICogc3kgKyBzeSAqIHN5ICsgMyAqIHR4eSAqIHR4eSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdm9uTWlzZXNDb21iaW5lZChzaWdtYSwgdGF1KSB7DQogICAgICAgIHJldHVybiBNYXRoLnNxcnQoc2lnbWEgKiBzaWdtYSArIDMgKiB0YXUgKiB0YXUpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRyZXNjYTJEKHN4LCBzeSwgdHh5KSB7DQogICAgICAgIHZhciBwID0gcHJpbmNpcGFsU3RyZXNzZXMyRChzeCwgc3ksIHR4eSk7DQogICAgICAgIHZhciBhcnIgPSBbcC5zMSwgcC5zMiwgcC5zM10uc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYiAtIGE7IH0pOw0KICAgICAgICByZXR1cm4gYXJyWzBdIC0gYXJyWzJdOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGNCZW5kaW5nU3RyZXNzKE0sIFosIEksIGMpIHsNCiAgICAgICAgaWYgKFogPiAwKSByZXR1cm4gTSAvIFo7DQogICAgICAgIGlmIChJID4gMCAmJiBjID4gMCkgcmV0dXJuIE0gKiBjIC8gSTsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlRmllbGRWaXNpYmlsaXR5KCkgew0KICAgICAgICB2YXIgbW9kZSA9IGVscy5jYWxjTW9kZS52YWx1ZTsNCiAgICAgICAgdmFyIGlzQXhpYWwgPSBtb2RlID09PSAnYXhpYWwnOw0KICAgICAgICB2YXIgaXNTaGVhciA9IG1vZGUgPT09ICdzaGVhcic7DQogICAgICAgIHZhciBpc0JlbmRpbmcgPSBtb2RlID09PSAnYmVuZGluZyc7DQogICAgICAgIHZhciBpc1RvcnNpb24gPSBtb2RlID09PSAndG9yc2lvbic7DQogICAgICAgIHZhciBpc0NvbWJpbmVkID0gbW9kZSA9PT0gJ2NvbWJpbmVkJzsNCiAgICAgICAgdmFyIGlzQ3VzdG9tID0gbW9kZSA9PT0gJ2N1c3RvbSc7DQoNCiAgICAgICAgc2V0VmlzaWJsZSgnLm1zb3NmYy1maWVsZC1heGlhbCcsIGlzQXhpYWwgfHwgaXNDb21iaW5lZCk7DQogICAgICAgIHNldFZpc2libGUoJy5tc29zZmMtZmllbGQtc2hlYXInLCBpc1NoZWFyIHx8IGlzQ29tYmluZWQpOw0KICAgICAgICBzZXRWaXNpYmxlKCcubXNvc2ZjLWZpZWxkLWJlbmRpbmcnLCBpc0JlbmRpbmcgfHwgaXNDb21iaW5lZCk7DQogICAgICAgIHNldFZpc2libGUoJy5tc29zZmMtZmllbGQtdG9yc2lvbicsIGlzVG9yc2lvbiB8fCBpc0NvbWJpbmVkKTsNCiAgICAgICAgc2V0VmlzaWJsZSgnLm1zb3NmYy1maWVsZC1jdXN0b20tc3RyZXNzJywgaXNDdXN0b20pOw0KICAgICAgICBzZXRWaXNpYmxlKCcubXNvc2ZjLWZpZWxkLWFyZWEnLCAhaXNDdXN0b20gJiYgKGlzQXhpYWwgfHwgaXNTaGVhciB8fCBpc0NvbWJpbmVkKSk7DQogICAgICAgIHNldFZpc2libGUoJy5tc29zZmMtZmllbGQtc2VjdGlvbi1tb2QnLCBpc0JlbmRpbmcgfHwgaXNDb21iaW5lZCk7DQogICAgICAgIHNldFZpc2libGUoJy5tc29zZmMtZmllbGQtaW5lcnRpYScsIGlzQmVuZGluZyB8fCBpc0NvbWJpbmVkKTsNCiAgICAgICAgc2V0VmlzaWJsZSgnLm1zb3NmYy1maWVsZC1wb2xhcicsIGlzVG9yc2lvbiB8fCBpc0NvbWJpbmVkKTsNCiAgICAgICAgc2V0VmlzaWJsZSgnLm1zb3NmYy1maWVsZC1yYWRpdXMnLCBpc1RvcnNpb24gfHwgaXNDb21iaW5lZCk7DQogICAgICAgIHNldFZpc2libGUoJy5tc29zZmMtZmllbGQtY3JpdGVyaW9uJywgaXNDb21iaW5lZCB8fCBpc0N1c3RvbSk7DQogICAgICAgIHNldFZpc2libGUoJy5tc29zZmMtZmllbGQtYnVja2xpbmcnLCBpc0F4aWFsIHx8IGlzQ29tYmluZWQpOw0KICAgICAgICBzZXRWaXNpYmxlKCcubXNvc2ZjLWZpZWxkLWN5Y2xpYycsIHRydWUpOw0KDQogICAgICAgIHZhciBjdXN0b21TdHJlbmd0aCA9IGVscy5zdHJlbmd0aFJlZi52YWx1ZSA9PT0gJ2N1c3RvbSc7DQogICAgICAgIGVscy5jdXN0b21MaW1pdEdyb3VwLmNsYXNzTGlzdC50b2dnbGUoJ21zb3NmYy1oaWRkZW4nLCAhY3VzdG9tU3RyZW5ndGgpOw0KDQogICAgICAgIHZhciB3ZWxkZWQgPSBlbHMuc3RydWN0dXJlVHlwZS52YWx1ZSA9PT0gJ3dlbGRlZCc7DQogICAgICAgIGVscy53ZWxkTm90ZS5jbGFzc0xpc3QudG9nZ2xlKCdtc29zZmMtaGlkZGVuJywgIXdlbGRlZCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYXBwbHlNYXRlcmlhbFByZXNldCgpIHsNCiAgICAgICAgaWYgKG1hbnVhbE1hdGVyaWFsRWRpdCkgcmV0dXJuOw0KICAgICAgICB2YXIgbWF0ID0gTUFURVJJQUxTW2Vscy5tYXRlcmlhbC52YWx1ZV07DQogICAgICAgIGlmICghbWF0IHx8IG1hdC5zeSA9PT0gbnVsbCkgcmV0dXJuOw0KICAgICAgICBlbHMueWllbGRTdHJlbmd0aC52YWx1ZSA9IGZtdChjb252ZXJ0RGlzcGxheVN0cmVzcyhtYXQuc3kpLCAxKTsNCiAgICAgICAgaWYgKG1hdC5zdSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgZWxzLnVsdGltYXRlU3RyZW5ndGgudmFsdWUgPSBmbXQoY29udmVydERpc3BsYXlTdHJlc3MobWF0LnN1KSwgMSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVVbml0TGFiZWxzKCkgew0KICAgICAgICB2YXIgbWV0cmljID0gaXNNZXRyaWMoKTsNCiAgICAgICAgdmFyIHN1ID0gbWV0cmljID8gJ01QYScgOiAncHNpJzsNCiAgICAgICAgdmFyIGF1ID0gbWV0cmljID8gJ21twrInIDogJ2luwrInOw0KICAgICAgICB2YXIgenUgPSBtZXRyaWMgPyAnbW3CsycgOiAnaW7Csyc7DQogICAgICAgIHZhciBpdSA9IG1ldHJpYyA/ICdtbeKBtCcgOiAnaW7igbQnOw0KICAgICAgICB2YXIgbHUgPSBtZXRyaWMgPyAnbW0nIDogJ2luJzsNCg0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1zb3NmYy11bml0PSJzdHJlc3MiXScpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IHN1Ow0KICAgICAgICB9KTsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tc29zZmMtdW5pdD0iYXJlYSJdJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gYXU7DQogICAgICAgIH0pOw0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1zb3NmYy11bml0PSJzZWN0aW9uIl0nKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSB6dTsNCiAgICAgICAgfSk7DQogICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbXNvc2ZjLXVuaXQ9ImluZXJ0aWEiXScpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IGl1Ow0KICAgICAgICB9KTsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tc29zZmMtdW5pdD0ibGVuZ3RoIl0nKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBsdTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29udmVydElucHV0c09uVW5pdFN3aXRjaCh0b01ldHJpY0ZsYWcpIHsNCiAgICAgICAgdmFyIGZpZWxkcyA9IFsNCiAgICAgICAgICAgIHsgZWw6IGVscy55aWVsZFN0cmVuZ3RoLCBtcGE6IHRydWUgfSwNCiAgICAgICAgICAgIHsgZWw6IGVscy51bHRpbWF0ZVN0cmVuZ3RoLCBtcGE6IHRydWUgfSwNCiAgICAgICAgICAgIHsgZWw6IGVscy5hcmVhLCBtbTI6IHRydWUgfSwNCiAgICAgICAgICAgIHsgZWw6IGVscy5zZWN0aW9uTW9kdWx1cywgbW0zOiB0cnVlIH0sDQogICAgICAgICAgICB7IGVsOiBlbHMubW9tZW50T2ZJbmVydGlhLCBtbTQ6IHRydWUgfSwNCiAgICAgICAgICAgIHsgZWw6IGVscy5wb2xhck1vbWVudCwgbW00OiB0cnVlIH0sDQogICAgICAgICAgICB7IGVsOiBlbHMub3V0ZXJSYWRpdXMsIG1tOiB0cnVlIH0sDQogICAgICAgICAgICB7IGVs OiBlbHMuZGlyZWN0Tm9ybWFsU3RyZXNzLCBtcGE6IHRydWUgfSwNCiAgICAgICAgICAgIHsgZWw6IGVscy5kaXJlY3RTaGVhclN0cmVzcywgbXBhOiB0cnVlIH0sDQogICAgICAgICAgICB7IGVsOiBlbHMuY3VzdG9tTGltaXQsIG1wYTogdHJ1ZSB9LA0KICAgICAgICAgICAgeyBlbDogZWxzLmNvbHVtbkxlbmd0aCwgbW06IHRydWUgfQ0KICAgICAgICBdOw0KDQogICAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7DQogICAgICAgICAgICB2YXIgdiA9IHBhcnNlTnVtKGYuZWwudmFsdWUpOw0KICAgICAgICAgICAgaWYgKHYgPT09IG51bGwpIHJldHVybjsNCiAgICAgICAgICAgIGlmIChmLm1wYSkgew0KICAgICAgICAgICAgICAgIGYuZWwudmFsdWUgPSBmbXQodG9NZXRyaWNGbGFnID8gdiAqIFBTSV9UT19NUEEgOiB2ICogTVBBX1RPX1BTSSwgMik7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGYubW0yKSB7DQogICAgICAgICAgICAgICAgZi5lbC52YWx1ZSA9IGZtdCh0b01ldHJpY0ZsYWcgPyB2ICogSU4yX1RPX01NMiA6IHYgKiBNTTJfVE9fSU4yLCAyKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5tbTMpIHsNCiAgICAgICAgICAgICAgICBmLmVsLnZhbHVlID0gZm10KHRvTWV0cmljRmxhZyA/IHYgKiBJTjNfVE9fTU0zIDogdiAqIE1NM19UT19JTjMsIDIpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChmLm1tNCkgew0KICAgICAgICAgICAgICAgIGYuZWwudmFsdWUgPSBmbXQodG9NZXRyaWNGbGFnID8gdiAqIElONF9UT19NTTQgOiB2ICogTU00X1RPX0lONCwgMik7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGYubW0pIHsNCiAgICAgICAgICAgICAgICBmLmVsLnZhbHVlID0gZm10KHRvTWV0cmljRmxhZyA/IHYgKiAyNS40IDogdiAvIDI1LjQsIDIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAodG9NZXRyaWNGbGFnKSB7DQogICAgICAgICAgICBjb252ZXJ0Rm9yY2VGaWVsZChlbHMuYXhpYWxMb2FkLCBlbHMuYXhpYWxMb2FkVW5pdCwgdHJ1ZSk7DQogICAgICAgICAgICBjb252ZXJ0Rm9yY2VGaWVsZChlbHMuc2hlYXJMb2FkLCBlbHMuc2hlYXJMb2FkVW5pdCwgdHJ1ZSk7DQogICAgICAgICAgICBjb252ZXJ0TW9tZW50RmllbGQoZWxzLmJlbmRpbmdNb21lbnQsIGVscy5iZW5kaW5nTW9tZW50VW5pdCwgdHJ1ZSk7DQogICAgICAgICAgICBjb252ZXJ0TW9tZW50RmllbGQoZWxzLnRvcnF1ZSwgZWxzLnRvcnF1ZVVuaXQsIHRydWUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY29udmVydEZvcmNlRmllbGQoZWxzLmF4aWFsTG9hZCwgZWxzLmF4aWFsTG9hZFVuaXQsIGZhbHNlKTsNCiAgICAgICAgICAgIGNvbnZlcnRGb3JjZUZpZWxkKGVscy5zaGVhckxvYWQsIGVscy5zaGVhckxvYWRVbml0LCBmYWxzZSk7DQogICAgICAgICAgICBjb252ZXJ0TW9tZW50RmllbGQoZWxzLmJlbmRpbmdNb21lbnQsIGVscy5iZW5kaW5nTW9tZW50VW5pdCwgZmFsc2UpOw0KICAgICAgICAgICAgY29udmVydE1vbWVudEZpZWxkKGVscy50b3JxdWUsIGVscy50b3JxdWVVbml0LCBmYWxzZSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjb252ZXJ0Rm9yY2VGaWVsZChpbnB1dCwgdW5pdFNlbGVjdCwgdG9NZXRyaWNGbGFnKSB7DQogICAgICAgIHZhciB2ID0gcGFyc2VOdW0oaW5wdXQudmFsdWUpOw0KICAgICAgICBpZiAodiA9PT0gbnVsbCkgcmV0dXJuOw0KICAgICAgICB2YXIgdW5pdCA9IHVuaXRTZWxlY3QudmFsdWU7DQogICAgICAgIHZhciBuID0gdG9NZXRyaWNGb3JjZSh2LCB1bml0KTsNCiAgICAgICAgaWYgKHRvTWV0cmljRmxhZykgew0KICAgICAgICAgICAgdW5pdFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iTiI+Tjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImtOIj5rTjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImxiZiI+bGJmPC9vcHRpb24+JzsNCiAgICAgICAgICAgIGlmIChuID49IDEwMDApIHsNCiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGZtdChuICogTl9UT19LTiwgNCk7DQogICAgICAgICAgICAgICAgdW5pdFNlbGVjdC52YWx1ZSA9ICdrTic7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gZm10KG4sIDIpOw0KICAgICAgICAgICAgICAgIHVuaXRTZWxlY3QudmFsdWUgPSAnTic7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB1bml0U2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJsYmYiPmxiZjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Ik4iPk48L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrTiI+a048L29wdGlvbj4nOw0KICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBmbXQobiAqIE5fVE9fTEJGLCAyKTsNCiAgICAgICAgICAgIHVuaXRTZWxlY3QudmFsdWUgPSAnbGJmJzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNvbnZlcnRNb21lbnRGaWVsZChpbnB1dCwgdW5pdFNlbGVjdCwgdG9NZXRyaWNGbGFnKSB7DQogICAgICAgIHZhciB2ID0gcGFyc2VOdW0oaW5wdXQudmFsdWUpOw0KICAgICAgICBpZiAodiA9PT0gbnVsbCkgcmV0dXJuOw0KICAgICAgICB2YXIgdW5pdCA9IHVuaXRTZWxlY3QudmFsdWU7DQogICAgICAgIHZhciBubSA9IHRvTWV0cmljTW9tZW50KHYsIHVuaXQpOw0KICAgICAgICBpZiAodG9NZXRyaWNGbGFnKSB7DQogICAgICAgICAgICB1bml0U2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJOwrdtIj5OwrdtPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ia07Ct20iPmtOwrdtPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibGJmwrdmdCI+bGJmwrdmdDwvb3B0aW9uPic7DQogICAgICAgICAgICBpZiAobm0gPj0gMTAwMCkgew0KICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gZm10KG5tICogTk1fVE9fS05NLCA0KTsNCiAgICAgICAgICAgICAgICB1bml0U2VsZWN0LnZhbHVlID0gJ2tOwrdtJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBmbXQobm0sIDIpOw0KICAgICAgICAgICAgICAgIHVuaXRTZWxlY3QudmFsdWUgPSAnTsK3bSc7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB1bml0U2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJsYmbCt2Z0Ij5sYmbCt2Z0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iTsK3bSI+TsK3bTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImtOwrdtIj5rTsK3bTwvb3B0aW9uPic7DQogICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGZtdChubSAqIE5NX1RPX0xCRkZULCAyKTsNCiAgICAgICAgICAgIHVuaXRTZWxlY3QudmFsdWUgPSAnbGJmwrdmdCc7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0cyhkYXRhKSB7DQogICAgICAgIGNsZWFyRXJyb3JzKCk7DQogICAgICAgIHZhciBoYXNFcnJvciA9IGZhbHNlOw0KDQogICAgICAgIGlmIChkYXRhLnN5IDw9IDApIGhhc0Vycm9yID0gc2V0RmllbGRFcnJvcignbXNvc2ZjWWllbGRTdHJlbmd0aCcsICdtc29zZmNZaWVsZEVycicsICdZaWVsZCBzdHJlbmd0aCBtdXN0IGJlIHBvc2l0aXZlLicpIHx8IGhhc0Vycm9yOw0KICAgICAgICBpZiAoZGF0YS5hcmVhICE9PSBudWxsICYmIGRhdGEuYXJlYSA8PSAwKSBoYXNFcnJvciA9IHNldEZpZWxkRXJyb3IoJ21zb3NmY0FyZWEnLCAnbXNvc2ZjQXJlYUVycicsICdBcmVhIG11c3QgYmUgcG9zaXRpdmUuJykgfHwgaGFzRXJyb3I7DQogICAgICAgIGlmIChkYXRhLlogIT09IG51bGwgJiYgZGF0YS5aIDw9IDApIGhhc0Vycm9yID0gc2V0RmllbGRFcnJvcignbXNvc2ZjU2VjdGlvbk1vZHVsdXMnLCAnbXNvc2ZjWkVycicsICdTZWN0aW9uIG1vZHVsdXMgbXVzdCBiZSBwb3NpdGl2ZS4nKSB8fCBoYXNFcnJvcjsNCiAgICAgICAgaWYgKGRhdGEuSSAhPT0gbnVsbCAmJiBkYXRhLkkgPD0gMCkgaGFzRXJyb3IgPSBzZXRGaWVsZEVycm9yKCdtc29zZmNNb21lbnRPZkluZXJ0aWEnLCAnbXNvc2ZjSUVycicsICdNb21lbnQgb2YgaW5lcnRpYSBtdXN0IGJlIHBvc2l0aXZlLicpIHx8IGhhc0Vycm9yOw0KICAgICAgICBpZiAoZGF0YS5KICE9PSBudWxsICYmIGRhdGEuSiA8PSAwKSBoYXNFcnJvciA9IHNldEZpZWxkRXJyb3IoJ21zb3NmY1BvbGFyTW9tZW50JywgJ21zb3NmY0pFcnInLCAnUG9sYXIgbW9tZW50IG11c3QgYmUgcG9zaXRpdmUuJykgfHwgaGFzRXJyb3I7DQogICAgICAgIGlmIChkYXRhLnIgIT09IG51bGwgJiYgZGF0YS5yIDw9IDApIGhhc0Vycm9yID0gc2V0RmllbGRFcnJvcignbXNvc2ZjT3V0ZXJSYWRpdXMnLCAnbXNvc2ZjUkVycicsICdPdXRlciByYWRpdXMgbXVzdCBiZSBwb3NpdGl2ZS4nKSB8fCBoYXNFcnJvcjsNCg0KICAgICAgICB2YXIgZmFjdG9yRmllbGRzID0gWw0KICAgICAgICAgICAgeyBrZXk6ICdrRHluYW1pYycsIGlkOiAnbXNvc2ZjS0R5bmFtaWMnIH0sDQogICAg ICAgICAgICB7IGtleTogJ2tJbXBhY3QnLCBpZDogJ21zb3NmY0tJbXBhY3QnIH0sDQogICAgICAgICAgICB7IGtleTogJ2tGYXRpZ3VlJywgaWQ6ICdtc29zZmNLRmF0aWd1ZScgfSwNCiAgICAgICAgICAgIHsga2V5OiAna1RlbXAnLCBpZDogJ21zb3NmY0tUZW1wJyB9LA0KICAgICAgICAgICAgeyBrZXk6ICdrVW5jZXJ0YWludHknLCBpZDogJ21zb3NmY0tVbmNlcnRhaW50eScgfSwNCiAgICAgICAgICAgIHsga2V5OiAna1N0cmVzc0NvbmMnLCBpZDogJ21zb3NmY0tTdHJlc3NDb25jJyB9DQogICAgICAgIF07DQogICAgICAgIGZhY3RvckZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7DQogICAgICAgICAgICBpZiAoZGF0YVtmLmtleV0gPD0gMCkgew0KICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gc2V0RmllbGRFcnJvcihmLmlkLCAnJywgJ0ZhY3RvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpIHx8IGhhc0Vycm9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAoZGF0YS50YXJnZXRTZiA8PSAwKSBoYXNFcnJvciA9IHNldEZpZWxkRXJyb3IoJ21zb3NmY1RhcmdldFNmJywgJ21zb3NmY1RhcmdldFNmRXJyJywgJ1RhcmdldCBzYWZldHkgZmFjdG9yIG11c3QgYmUgcG9zaXRpdmUuJykgfHwgaGFzRXJyb3I7DQogICAgICAgIGlmIChkYXRhLnN0cmVuZ3RoUmVmID09PSAnY3VzdG9tJyAmJiAoZGF0YS5jdXN0b21MaW1pdCA9PT0gbnVsbCB8fCBkYXRhLmN1c3RvbUxpbWl0IDw9IDApKSB7DQogICAgICAgICAgICBoYXNFcnJvciA9IHNldEZpZWxkRXJyb3IoJ21zb3NmY0N1c3RvbUxpbWl0JywgJ21zb3NmY0N1c3RvbUxpbWl0RXJyJywgJ0N1c3RvbSBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLicpIHx8IGhhc0Vycm9yOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICFoYXNFcnJvcjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZWFkSW5wdXRzKCkgew0KICAgICAgICB2YXIgc3kgPSB0b01ldHJpY1N0cmVzcyhwYXJzZU51bShlbHMueWllbGRTdHJlbmd0aC52YWx1ZSkgfHwgMCwgaXNNZXRyaWMoKSA/ICdNUGEnIDogJ3BzaScpOw0KICAgICAgICB2YXIgc3VWYWwgPSBwYXJzZU51bShlbHMudWx0aW1hdGVTdHJlbmd0aC52YWx1ZSk7DQogICAgICAgIHZhciBzdSA9IHN1VmFsICE9PSBudWxsID8gdG9NZXRyaWNTdHJlc3Moc3VWYWwsIGlzTWV0cmljKCkgPyAnTVBhJyA6ICdwc2knKSA6IG51bGw7DQogICAgICAgIHZhciBhcmVhVmFsID0gcGFyc2VOdW0oZWxzLmFyZWEudmFsdWUpOw0KICAgICAgICB2YXIgYXJlYSA9IGFyZWFWYWwgIT09IG51bGwgPyB0b01ldHJpY0FyZWEoYXJlYVZhbCwgaXNNZXRyaWMoKSA/ICdtbcKyJyA6ICdpbsKyJykgOiBudWxsOw0KICAgICAgICB2YXIgelZhbCA9IHBhcnNlTnVtKGVscy5zZWN0aW9uTW9kdWx1cy52YWx1ZSk7DQogICAgICAgIHZhciBaID0gelZhbCAhPT0gbnVsbCA/IHRvTWV0cmljU2VjdGlvbk1vZCh6VmFsLCBpc01ldHJpYygpID8gJ21twrMnIDogJ2luwrMnKSA6IG51bGw7DQogICAgICAgIHZhciBpVmFsID0gcGFyc2VOdW0oZWxzLm1vbWVudE9mSW5lcnRpYS52YWx1ZSk7DQogICAgICAgIHZhciBJID0gaVZhbCAhPT0gbnVsbCA/IHRvTWV0cmljSW5lcnRpYShpVmFsLCBpc01ldHJpYygpID8gJ21t4oG0JyA6ICdpbuKBtCcpIDogbnVsbDsNCiAgICAgICAgdmFyIGpWYWwgPSBwYXJzZU51bShlbHMucG9sYXJNb21lbnQudmFsdWUpOw0KICAgICAgICB2YXIgSiA9IGpWYWwgIT09IG51bGwgPyB0b01ldHJpY0luZXJ0aWEoalZhbCwgaXNNZXRyaWMoKSA/ICdtbeKBtCcgOiAnaW7igbQnKSA6IG51bGw7DQogICAgICAgIHZhciByVmFsID0gcGFyc2VOdW0oZWxzLm91dGVyUmFkaXVzLnZhbHVlKTsNCiAgICAgICAgdmFyIHIgPSByVmFsICE9PSBudWxsID8gdG9NZXRyaWNMZW5ndGgoclZhbCwgaXNNZXRyaWMoKSA/ICdtbScgOiAnaW4nKSA6IG51bGw7DQogICAgICAgIHZhciBjVmFsID0gcGFyc2VOdW0oZWxzLmRpc3RUb0ZpYmVyLnZhbHVlKTsNCiAgICAgICAgdmFyIGMgPSBjVmFsICE9PSBudWxsID8gdG9NZXRyaWNMZW5ndGgoY1ZhbCwgaXNNZXRyaWMoKSA/ICdtbScgOiAnaW4nKSA6IG51bGw7DQoNCiAgICAgICAgdmFyIGN1c3RvbUxpbWl0VmFsID0gcGFyc2VOdW0oZWxzLmN1c3RvbUxpbWl0LnZhbHVlKTsNCiAgICAgICAgdmFyIGN1c3RvbUxpbWl0ID0gY3VzdG9tTGltaXRWYWwgIT09IG51bGwgPyB0b01ldHJpY1N0cmVzcyhjdXN0b21MaW1pdFZhbCwgaXNNZXRyaWMoKSA/ICdNUGEnIDogJ3BzaScpIDogbnVsbDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbW9kZTogZWxzLmNhbGNNb2RlLnZhbHVlLA0KICAgICAgICAgICAgc3RydWN0dXJlVHlwZTogZWxzLnN0cnVjdHVyZVR5cGUudmFsdWUsDQogICAgICAgICAgICBzeTogc3ksDQogICAgICAgICAgICBzdTogc3UsDQogICAgICAgICAgICBhcmVhOiBhcmVhLA0KICAgICAgICAgICAgWjogWiwNCiAgICAgICAgICAgIEk6IEksDQogICAgICAgICAgICBKOiBKLA0KICAgICAgICAgICAgcjogciwNCiAgICAgICAgICAgIGM6IGMsDQogICAgICAgICAgICBGOiB0b01ldHJpY0ZvcmNlKHBhcnNlTnVtKGVscy5heGlhbExvYWQudmFsdWUpIHx8IDAsIGVscy5heGlhbExvYWRVbml0LnZhbHVlKSwNCiAgICAgICAgICAgIFY6IHRvTWV0cmljRm9yY2UocGFyc2VOdW0oZWxzLnNoZWFyTG9hZC52YWx1ZSkgfHwgMCwgZWxzLnNoZWFyTG9hZFVuaXQudmFsdWUpLA0KICAgICAgICAgICAgTTogdG9NZXRyaWNNb21lbnQocGFyc2VOdW0oZWxzLmJlbmRpbmdNb21lbnQudmFsdWUpIHx8IDAsIGVscy5iZW5kaW5nTW9tZW50VW5pdC52YWx1ZSksDQogICAgICAgICAgICBUOiB0b01ldHJpY01vbWVudChwYXJzZU51bShlbHMudG9ycXVlLnZhbHVlKSB8fCAwLCBlbHMudG9ycXVlVW5pdC52YWx1ZSksDQogICAgICAgICAgICBkaXJlY3RTaWdtYTogcGFyc2VOdW0oZWxzLmRpcmVjdE5vcm1hbFN0cmVzcy52YWx1ZSkgIT09IG51bGwNCiAgICAgICAgICAgICAgICA/IHRvTWV0cmljU3RyZXNzKHBhcnNlTnVtKGVscy5kaXJlY3ROb3JtYWxTdHJlc3MudmFsdWUpLCBpc01ldHJpYygpID8gJ01QYScgOiAncHNpJykgOiBudWxsLA0KICAgICAgICAgICAgZGlyZWN0VGF1OiBwYXJzZU51bShlbHMuZGlyZWN0U2hlYXJTdHJlc3MudmFsdWUpICE9PSBudWxsDQogICAgICAgICAgICAgICAgPyB0b01ldHJpY1N0cmVzcyhwYXJzZU51bShlbHMuZGlyZWN0U2hlYXJTdHJlc3MudmFsdWUpLCBpc01ldHJpYygpID8gJ01QYScgOiAncHNpJykgOiBudWxsLA0KICAgICAgICAgICAgY3JpdGVyaW9uOiBlbHMuc3RyZXNzQ3JpdGVyaW9uLnZhbHVlLA0KICAgICAgICAgICAgc3RyZW5ndGhSZWY6IGVscy5zdHJlbmd0aFJlZi52YWx1ZSwNCiAgICAgICAgICAgIGN1c3RvbUxpbWl0OiBjdXN0b21MaW1pdCwNCiAgICAgICAgICAgIGtEeW5hbWljOiBwYXJzZU51bShlbHMua0R5bmFtaWMudmFsdWUpIHx8IDEsDQogICAgICAgICAgICBrSW1wYWN0OiBwYXJzZU51bShlbHMua0ltcGFjdC52YWx1ZSkgfHwgMSwNCiAgICAgICAgICAgIGtGYXRpZ3VlOiBwYXJzZU51bShlbHMua0ZhdGlndWUudmFsdWUpIHx8IDEsDQogICAgICAgICAgICBrVGVtcDogcGFyc2VOdW0oZWxzLmtUZW1wLnZhbHVlKSB8fCAxLA0KICAgICAgICAgICAga1VuY2VydGFpbnR5OiBwYXJzZU51bShlbHMua1VuY2VydGFpbnR5LnZhbHVlKSB8fCAxLA0KICAgICAgICAgICAga1N0cmVzc0NvbmM6IHBhcnNlTnVtKGVscy5rU3RyZXNzQ29uYy52YWx1ZSkgfHwgMSwNCiAgICAgICAgICAgIHRhcmdldFNmOiBwYXJzZU51bShlbHMudGFyZ2V0U2YudmFsdWUpIHx8IDIsDQogICAgICAgICAgICBjb2x1bW5MZW5ndGg6IHBhcnNlTnVtKGVscy5jb2x1bW5MZW5ndGgudmFsdWUpLA0KICAgICAgICAgICAgc2xlbmRlcm5lc3M6IHBhcnNlTnVtKGVscy5zbGVuZGVybmVzcy52YWx1ZSksDQogICAgICAgICAgICBjeWNsaWNMb2FkaW5nOiBlbHMuY3ljbGljTG9hZGluZy5jaGVja2VkDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29tcHV0ZVN0cmVzc2VzKGRhdGEpIHsNCiAgICAgICAgdmFyIHNpZ21hQXhpYWwgPSAwOw0KICAgICAgICB2YXIgdGF1U2hlYXIgPSAwOw0KICAgICAgICB2YXIgc2lnbWFCZW5kaW5nID0gMDsNCiAgICAgICAgdmFyIHRhdVRvcnNpb24gPSAwOw0KICAgICAgICB2YXIgZ292ZXJuaW5nID0gJ0NvbWJpbmVkJzsNCiAgICAgICAgdmFyIG1vZGUgPSBkYXRhLm1vZGU7DQoNCiAgICAgICAgaWYgKG1vZGUgPT09ICdheGlhbCcgfHwgbW9kZSA9PT0gJ2NvbWJpbmVkJykgew0KICAgICAgICAgICAgaWYgKGRhdGEuYXJlYSA+IDApIHNpZ21hQXhpYWwgPSBkYXRhLkYgLyBkYXRhLmFyZWE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1vZGUgPT09ICdzaGVhcicgfHwgbW9kZSA9PT0gJ2NvbWJpbmVkJykgew0KICAgICAgICAgICAgaWYgKGRhdGEuYXJlYSA+IDApIHRhdVNoZWFyID0g ZGF0YS5WIC8gZGF0YS5hcmVhOw0KICAgICAgICB9DQogICAgICAgIGlmIChtb2RlID09PSAnYmVuZGluZycgfHwgbW9kZSA9PT0gJ2NvbWJpbmVkJykgew0KICAgICAgICAgICAgdmFyIHNiID0gY2FsY0JlbmRpbmdTdHJlc3MoZGF0YS5NLCBkYXRhLlosIGRhdGEuSSwgZGF0YS5jKTsNCiAgICAgICAgICAgIGlmIChzYiAhPT0gbnVsbCkgc2lnbWFCZW5kaW5nID0gc2I7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1vZGUgPT09ICd0b3JzaW9uJyB8fCBtb2RlID09PSAnY29tYmluZWQnKSB7DQogICAgICAgICAgICBpZiAoZGF0YS5KID4gMCAmJiBkYXRhLnIgPiAwKSB0YXVUb3JzaW9uID0gZGF0YS5UICogZGF0YS5yIC8gZGF0YS5KOw0KICAgICAgICB9DQogICAgICAgIGlmIChtb2RlID09PSAnY3VzdG9tJykgew0KICAgICAgICAgICAgc2lnbWFBeGlhbCA9IGRhdGEuZGlyZWN0U2lnbWEgfHwgMDsNCiAgICAgICAgICAgIHRhdVNoZWFyID0gZGF0YS5kaXJlY3RUYXUgfHwgMDsNCiAgICAgICAgICAgIGdvdmVybmluZyA9ICdDdXN0b20nOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNpZ21hQ29tYmluZWQgPSBzaWdtYUF4aWFsICsgc2lnbWFCZW5kaW5nOw0KICAgICAgICB2YXIgdGF1Q29tYmluZWQgPSB0YXVTaGVhciArIHRhdVRvcnNpb247DQoNCiAgICAgICAgdmFyIHNpZ21hRXE7DQogICAgICAgIGlmIChtb2RlID09PSAnY3VzdG9tJykgew0KICAgICAgICAgICAgc2lnbWFFcSA9IGRhdGEuY3JpdGVyaW9uID09PSAndHJlc2NhJw0KICAgICAgICAgICAgICAgID8gdHJlc2NhMkQoc2lnbWFBeGlhbCwgMCwgdGF1U2hlYXIpDQogICAgICAgICAgICAgICAgOiAoZGF0YS5jcml0ZXJpb24gPT09ICdjdXN0b20tZXEnDQogICAgICAgICAgICAgICAgICAgID8gdm9uTWlzZXNDb21iaW5lZChzaWdtYUF4aWFsLCB0YXVTaGVhcikNCiAgICAgICAgICAgICAgICAgICAgOiB2b25NaXNlc0NvbWJpbmVkKHNpZ21hQXhpYWwsIHRhdVNoZWFyKSk7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2F4aWFsJykgew0KICAgICAgICAgICAgc2lnbWFFcSA9IE1hdGguYWJzKHNpZ21hQXhpYWwpOw0KICAgICAgICAgICAgZ292ZXJuaW5nID0gJ0F4aWFsJzsNCiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnc2hlYXInKSB7DQogICAgICAgICAgICBzaWdtYUVxID0gTWF0aC5hYnModGF1U2hlYXIpOw0KICAgICAgICAgICAgZ292ZXJuaW5nID0gJ1NoZWFyJzsNCiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnYmVuZGluZycpIHsNCiAgICAgICAgICAgIHNpZ21hRXEgPSBNYXRoLmFicyhzaWdtYUJlbmRpbmcpOw0KICAgICAgICAgICAgZ292ZXJuaW5nID0gJ0JlbmRpbmcnOw0KICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICd0b3JzaW9uJykgew0KICAgICAgICAgICAgc2lnbWFFcSA9IE1hdGguYWJzKHRhdVRvcnNpb24pOw0KICAgICAgICAgICAgZ292ZXJuaW5nID0gJ1RvcnNpb24nOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKGRhdGEuY3JpdGVyaW9uID09PSAndHJlc2NhJykgew0KICAgICAgICAgICAgICAgIHNpZ21hRXEgPSB0cmVzY2EyRChzaWdtYUNvbWJpbmVkLCAwLCB0YXVDb21iaW5lZCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHNpZ21hRXEgPSB2b25NaXNlc0NvbWJpbmVkKHNpZ21hQ29tYmluZWQsIHRhdUNvbWJpbmVkKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGNvbnRyaWJ1dGlvbnMgPSBbDQogICAgICAgICAgICAgICAgeyBuYW1lOiAnQXhpYWwnLCB2YWw6IE1hdGguYWJzKHNpZ21hQXhpYWwpIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiAnU2hlYXInLCB2YWw6IE1hdGguYWJzKHRhdVNoZWFyKSB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogJ0JlbmRpbmcnLCB2YWw6IE1hdGguYWJzKHNpZ21hQmVuZGluZykgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6ICdUb3JzaW9uJywgdmFsOiBNYXRoLmFicyh0YXVUb3JzaW9uKSB9DQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgY29udHJpYnV0aW9ucy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBiLnZhbCAtIGEudmFsOyB9KTsNCiAgICAgICAgICAgIGlmIChjb250cmlidXRpb25zWzBdLnZhbCA+IDApIHsNCiAgICAgICAgICAgICAgICBnb3Zlcm5pbmcgPSBjb250cmlidXRpb25zWzBdLm5hbWU7DQogICAgICAgICAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbnNbMV0gJiYgY29udHJpYnV0aW9uc1sxXS52YWwgPiBjb250cmlidXRpb25zWzBdLnZhbCAqIDAuNSkgew0KICAgICAgICAgICAgICAgICAgICBnb3Zlcm5pbmcgPSAnQ29tYmluZWQnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBrVG90YWwgPSBkYXRhLmtEeW5hbWljICogZGF0YS5rSW1wYWN0ICogZGF0YS5rRmF0aWd1ZSAqIGRhdGEua1RlbXAgKiBkYXRhLmtVbmNlcnRhaW50eSAqIGRhdGEua1N0cmVzc0NvbmM7DQogICAgICAgIHZhciBzaWdtYU5vbWluYWwgPSBzaWdtYUVxOw0KICAgICAgICB2YXIgc2lnbWFMb2NhbCA9IHNpZ21hTm9taW5hbCAqIGRhdGEua1N0cmVzc0NvbmM7DQogICAgICAgIHZhciBzaWdtYURlc2lnbiA9IHNpZ21hTG9jYWwgKiBkYXRhLmtEeW5hbWljICogZGF0YS5rSW1wYWN0ICogZGF0YS5rRmF0aWd1ZSAqIGRhdGEua1RlbXAgKiBkYXRhLmtVbmNlcnRhaW50eTsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgc2lnbWFBeGlhbDogc2lnbWFBeGlhbCwNCiAgICAgICAgICAgIHRhdVNoZWFyOiB0YXVTaGVhciwNCiAgICAgICAgICAgIHNpZ21hQmVuZGluZzogc2lnbWFCZW5kaW5nLA0KICAgICAgICAgICAgdGF1VG9yc2lvbjogdGF1VG9yc2lvbiwNCiAgICAgICAgICAgIHNpZ21hQ29tYmluZWQ6IHNpZ21hQ29tYmluZWQsDQogICAgICAgICAgICB0YXVDb21iaW5lZDogdGF1Q29tYmluZWQsDQogICAgICAgICAgICBzaWdtYUVxOiBzaWdtYUVxLA0KICAgICAgICAgICAgc2lnbWFEZXNpZ246IHNpZ21hRGVzaWduLA0KICAgICAgICAgICAga1RvdGFsOiBrVG90YWwsDQogICAgICAgICAgICBnb3Zlcm5pbmc6IGdvdmVybmluZw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFN0cmVuZ3RoTGltaXQoZGF0YSkgew0KICAgICAgICB2YXIgbGltaXQ7DQogICAgICAgIHN3aXRjaCAoZGF0YS5zdHJlbmd0aFJlZikgew0KICAgICAgICAgICAgY2FzZSAndWx0aW1hdGUnOg0KICAgICAgICAgICAgICAgIGxpbWl0ID0gZGF0YS5zdSAhPT0gbnVsbCAmJiBkYXRhLnN1ID4gMCA/IGRhdGEuc3UgOiBkYXRhLnN5ICogMS40Ow0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnYWxsb3dhYmxlJzoNCiAgICAgICAgICAgICAgICBsaW1pdCA9IGRhdGEuc3kgLyBkYXRhLnRhcmdldFNmOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnY3VzdG9tJzoNCiAgICAgICAgICAgICAgICBsaW1pdCA9IGRhdGEuY3VzdG9tTGltaXQ7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGxpbWl0ID0gZGF0YS5zeTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbGltaXQ7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xhc3NpZnlTYWZldHkob3ZlcmFsbFNmLCB0YXJnZXRTZiwgd2FybmluZ3MpIHsNCiAgICAgICAgaWYgKG92ZXJhbGxTZiA9PT0gbnVsbCB8fCAhaXNGaW5pdGUob3ZlcmFsbFNmKSkgcmV0dXJuICdjYXV0aW9uJzsNCiAgICAgICAgaWYgKG92ZXJhbGxTZiA8IHRhcmdldFNmKSByZXR1cm4gJ3Vuc2FmZSc7DQogICAgICAgIGlmIChvdmVyYWxsU2YgPCB0YXJnZXRTZiAqIDEuMTUgfHwgd2FybmluZ3MubGVuZ3RoID4gMCkgcmV0dXJuICdjYXV0aW9uJzsNCiAgICAgICAgcmV0dXJuICdzYWZlJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBidWlsZFdhcm5pbmdzKGRhdGEsIHN0cmVzc2VzLCBvdmVyYWxsU2YsIHN0cmVuZ3RoTGltaXQpIHsNCiAgICAgICAgdmFyIHdhcm5pbmdzID0gW107DQoNCiAgICAgICAgaWYgKGRhdGEuc3RydWN0dXJlVHlwZSA9PT0gJ3dlbGRlZCcpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywNCiAgICAgICAgICAgICAgICB0ZXh0OiAnV2VsZGVkIHN0cnVjdHVyZTogd2VsZCBnZW9tZXRyeSwgcmVzaWR1YWwgc3RyZXNzLCBoZWF0LWFmZmVjdGVkIHpvbmVzLCBmYXRpZ3VlIGNsYXNzLCBhbmQgd2VsZCBxdWFsaXR5IG1heSBnb3Zlcm4gdGhlIGRlc2lnbi4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZGF0YS5jeWNsaWNMb2FkaW5nIHx8IGRhdGEua0ZhdGlndWUgPiAxLjAxKSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAnY2F1dGlvbicsDQogICAgICAgICAgICAgICAgdGV4dDog J0N5Y2xpYyBvciBmYXRpZ3VlLXJlbGF0ZWQgbG9hZGluZyBzZWxlY3RlZDogc3RhdGljIHlpZWxkLWJhc2VkIHNhZmV0eSBmYWN0b3IgYWxvbmUgZG9lcyBub3QgY29uZmlybSBmYXRpZ3VlIGxpZmUuIFBlcmZvcm0gZmF0aWd1ZSBhbmFseXNpcy4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoKGRhdGEubW9kZSA9PT0gJ2F4aWFsJyB8fCBkYXRhLm1vZGUgPT09ICdjb21iaW5lZCcpICYmIGRhdGEuRiA8IDApIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgIHR5cGU6ICdjYXV0aW9uJywNCiAgICAgICAgICAgICAgICB0ZXh0OiAnQ29tcHJlc3Npb24gYXhpYWwgbG9hZCBkZXRlY3RlZDogYnVja2xpbmcgbWF5IGdvdmVybiBiZWZvcmUgbWF0ZXJpYWwgeWllbGRpbmcuIERvIG5vdCB0cmVhdCBzdHJlc3Mgc2FmZXR5IGZhY3RvciBhbG9uZSBhcyBzdWZmaWNpZW50IGZvciBzbGVuZGVyIGNvbHVtbnMuJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRhdGEuY29sdW1uTGVuZ3RoICE9PSBudWxsICYmIGRhdGEuY29sdW1uTGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ2NhdXRpb24nLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdDb2x1bW4gbGVuZ3RoIHByb3ZpZGVkOiByZXZpZXcgRXVsZXIvYnVja2xpbmcgY2FwYWNpdHkgZm9yIHNsZW5kZXIgY29tcHJlc3Npb24gbWVtYmVycy4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZGF0YS5zbGVuZGVybmVzcyAhPT0gbnVsbCAmJiBkYXRhLnNsZW5kZXJuZXNzID4gMTAwKSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAnY2F1dGlvbicsDQogICAgICAgICAgICAgICAgdGV4dDogJ0hpZ2ggc2xlbmRlcm5lc3MgcmF0aW8gKCcgKyBmbXQoZGF0YS5zbGVuZGVybmVzcywgMCkgKyAnKTogYnVja2xpbmcgbWF5IGdvdmVybiBkZXNpZ24uJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHN0cmVzc2VzLnNpZ21hRXEgPiBkYXRhLnN5KSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAnZGFuZ2VyJywNCiAgICAgICAgICAgICAgICB0ZXh0OiAnRXF1aXZhbGVudCBzdHJlc3MgZXhjZWVkcyBtYXRlcmlhbCB5aWVsZCBzdHJlbmd0aCDigJQgcGxhc3RpYyBkZWZvcm1hdGlvbiBvciBmYWlsdXJlIG1heSBvY2N1ci4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAob3ZlcmFsbFNmICE9PSBudWxsICYmIG92ZXJhbGxTZiA8IGRhdGEudGFyZ2V0U2YpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgIHR5cGU6ICdkYW5nZXInLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdPdmVyYWxsIHNhZmV0eSBmYWN0b3IgaXMgYmVsb3cgdGhlIHRhcmdldCBkZXNpZ24gcmVxdWlyZW1lbnQgKCcgKyBmbXQoZGF0YS50YXJnZXRTZiwgMikgKyAnKS4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZGF0YS5rU3RyZXNzQ29uYyA+IDEuNSkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdFbGV2YXRlZCBzdHJlc3MgY29uY2VudHJhdGlvbiBmYWN0b3IgYXBwbGllZCDigJQgdmVyaWZ5IEt0IHdpdGggZGV0YWlsZWQgZ2VvbWV0cnkgb3IgRkVBLicNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHdhcm5pbmdzOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJ1aWxkUmVjb21tZW5kYXRpb25zKGRhdGEsIHN0cmVzc2VzLCBvdmVyYWxsU2YsIHV0aWxpemF0aW9uKSB7DQogICAgICAgIHZhciByZWNzID0gW107DQoNCiAgICAgICAgaWYgKG92ZXJhbGxTZiAhPT0gbnVsbCAmJiBvdmVyYWxsU2YgPCBkYXRhLnRhcmdldFNmKSB7DQogICAgICAgICAgICBpZiAoc3RyZXNzZXMuc2lnbWFBeGlhbCA+PSBzdHJlc3Nlcy5zaWdtYUJlbmRpbmcgJiYgc3RyZXNzZXMuc2lnbWFBeGlhbCA+PSBzdHJlc3Nlcy50YXVTaGVhcikgew0KICAgICAgICAgICAgICAgIHJlY3MucHVzaCgnSW5jcmVhc2UgY3Jvc3Mtc2VjdGlvbmFsIGFyZWEgdG8gcmVkdWNlIGF4aWFsIHN0cmVzcy4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzdHJlc3Nlcy5zaWdtYUJlbmRpbmcgPj0gc3RyZXNzZXMuc2lnbWFBeGlhbCAmJiBzdHJlc3Nlcy5zaWdtYUJlbmRpbmcgPj0gc3RyZXNzZXMudGF1U2hlYXIpIHsNCiAgICAgICAgICAgICAgICByZWNzLnB1c2goJ0luY3JlYXNlIHNlY3Rpb24gbW9kdWx1cyBvciBhZGQgc3RpZmZlbmVycyBmb3IgYmVuZGluZy1kb21pbmF0ZWQgZGVzaWduLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHN0cmVzc2VzLnRhdVRvcnNpb24gPj0gc3RyZXNzZXMudGF1U2hlYXIgJiYgc3RyZXNzZXMudGF1VG9yc2lvbiA+IDApIHsNCiAgICAgICAgICAgICAgICByZWNzLnB1c2goJ0luY3JlYXNlIHBvbGFyIHNlY3Rpb24gcHJvcGVydGllcyBmb3IgdG9yc2lvbi1kb21pbmF0ZWQgZGVzaWducy4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzdHJlc3Nlcy50YXVTaGVhciA+IHN0cmVzc2VzLnRhdVRvcnNpb24gJiYgc3RyZXNzZXMudGF1U2hlYXIgPiAwKSB7DQogICAgICAgICAgICAgICAgcmVjcy5wdXNoKCdJbmNyZWFzZSBzaGVhciBhcmVhIG9yIHJlZHVjZSBzaGVhciBsb2FkLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmVjcy5wdXNoKCdDb25zaWRlciBhIGhpZ2hlci1zdHJlbmd0aCBtYXRlcmlhbCBvciByZWR1Y2UgYXBwbGllZCBsb2Fkcy9tb21lbnRzLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHV0aWxpemF0aW9uID4gODUpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnU3RyZW5ndGggdXRpbGl6YXRpb24gaXMgaGlnaCDigJQgcmV2aWV3IGRlc2lnbiBtYXJnaW5zIGFuZCBsb2FkIGFzc3VtcHRpb25zLicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChkYXRhLmtTdHJlc3NDb25jID4gMS4yKSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ1JlZHVjZSBzdHJlc3MgY29uY2VudHJhdGlvbiB0aHJvdWdoIGxhcmdlciBmaWxsZXQgcmFkaWkgb3IgaW1wcm92ZWQgZ2VvbWV0cnkuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRhdGEuY29sdW1uTGVuZ3RoIHx8IChkYXRhLnNsZW5kZXJuZXNzICYmIGRhdGEuc2xlbmRlcm5lc3MgPiA4MCkpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnUmV2aWV3IGJ1Y2tsaW5nIGZvciBzbGVuZGVyIGNvbXByZXNzaW9uIG1lbWJlcnMuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRhdGEuY3ljbGljTG9hZGluZykgew0KICAgICAgICAgICAgcmVjcy5wdXNoKCdQZXJmb3JtIGZhdGlndWUgYW5hbHlzaXMgZm9yIGN5Y2xpYyBsb2FkaW5nIGNvbmRpdGlvbnMuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRhdGEuc3RydWN0dXJlVHlwZSA9PT0gJ3dlbGRlZCcpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnUGVyZm9ybSB3ZWxkLXNwZWNpZmljIGFuYWx5c2lzIGluY2x1ZGluZyBmYXRpZ3VlIGNsYXNzIGFuZCBpbnNwZWN0aW9uIHJlcXVpcmVtZW50cy4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoc3RyZXNzZXMuc2lnbWFEZXNpZ24gPiBkYXRhLnN5ICogMC45KSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ0NvbnNpZGVyIGZpbml0ZSBlbGVtZW50IGFuYWx5c2lzIHdoZW4gbG9jYWwgZ2VvbWV0cnkgb3IgbG9hZCBkaXN0cmlidXRpb24gaXMgY29tcGxleC4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyZWNzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgcmVjcy5wdXNoKCdEZXNpZ24gbWVldHMgdGFyZ2V0IHNhZmV0eSBmYWN0b3IgdW5kZXIgY3VycmVudCBhc3N1bXB0aW9ucy4gRG9jdW1lbnQgaW5wdXRzIGFuZCB2ZXJpZnkgY3JpdGljYWwgZGV0YWlscy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiByZWNzOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdMb2FkRGlhZ3JhbShtb2RlLCBhY3RpdmUpIHsNCiAgICAgICAgdmFyIHN2ZyA9IGVscy5sb2FkRGlhZ3JhbTsNCiAgICAgICAgaWYgKCFzdmcpIHJldHVybjsNCiAgICAgICAgdmFyIHcgPSAyMjAsIGggPSAxNDA7DQogICAgICAgIHZhciBodG1sID0gJzxyZWN0IHg9IjYwIiB5PSI1MCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0MCIgZmlsbD0iI2U4ZjBmYSIgc3Ryb2tlPSIjMWU0ZDhjIiBzdHJva2Utd2lkdGg9IjIiIHJ4PSI0Ii8+JzsNCg0KICAgICAgICBpZiAobW9kZSA9PT0gJ2F4aWFsJyB8fCBtb2RlID09PSAnY29tYmluZWQnKSB7DQogICAgICAgICAgICB2YXIgY29sID0gYWN0aXZlLmF4aWFsID8gJyNkYzI2MjYnIDogJyM5NGEzYjgn Ow0KICAgICAgICAgICAgaHRtbCArPSAnPGxpbmUgeDE9IjExMCIgeTE9IjIwIiB4Mj0iMTEwIiB5Mj0iNDgiIHN0cm9rZT0iJyArIGNvbCArICciIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNtc29zZmMtYXJyKSIvPic7DQogICAgICAgICAgICBodG1sICs9ICc8bGluZSB4MT0iMTEwIiB5MT0iOTIiIHgyPSIxMTAiIHkyPSIxMjAiIHN0cm9rZT0iJyArIGNvbCArICciIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNtc29zZmMtYXJyKSIvPic7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1vZGUgPT09ICdzaGVhcicgfHwgbW9kZSA9PT0gJ2NvbWJpbmVkJykgew0KICAgICAgICAgICAgdmFyIGNvbFMgPSBhY3RpdmUuc2hlYXIgPyAnI2Q5NzcwNicgOiAnIzk0YTNiOCc7DQogICAgICAgICAgICBodG1sICs9ICc8bGluZSB4MT0iMzAiIHkxPSI3MCIgeDI9IjU4IiB5Mj0iNzAiIHN0cm9rZT0iJyArIGNvbFMgKyAnIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjbXNvc2ZjLWFycikiLz4nOw0KICAgICAgICB9DQogICAgICAgIGlmIChtb2RlID09PSAnYmVuZGluZycgfHwgbW9kZSA9PT0gJ2NvbWJpbmVkJykgew0KICAgICAgICAgICAgdmFyIGNvbEIgPSBhY3RpdmUuYmVuZGluZyA/ICcjMDU5NjY5JyA6ICcjOTRhM2I4JzsNCiAgICAgICAgICAgIGh0bWwgKz0gJzxwYXRoIGQ9Ik0xNzAgNzAgQTIwIDIwIDAgMCAxIDE3MCAzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSInICsgY29sQiArICciIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNtc29zZmMtYXJyKSIvPic7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1vZGUgPT09ICd0b3JzaW9uJyB8fCBtb2RlID09PSAnY29tYmluZWQnKSB7DQogICAgICAgICAgICB2YXIgY29sVCA9IGFjdGl2ZS50b3JzaW9uID8gJyM3YzNhZWQnIDogJyM5NGEzYjgnOw0KICAgICAgICAgICAgaHRtbCArPSAnPHBhdGggZD0iTTk1IDcwIEExNSAxNSAwIDEgMSAxMjUgNzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iJyArIGNvbFQgKyAnIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjbXNvc2ZjLWFycikiLz4nOw0KICAgICAgICB9DQoNCiAgICAgICAgc3ZnLmlubmVySFRNTCA9ICc8ZGVmcz48bWFya2VyIGlkPSJtc29zZmMtYXJyIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI2IiByZWZZPSIzIiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDYsMyBMMCw2IFoiIGZpbGw9ImN1cnJlbnRDb2xvciIvPjwvbWFya2VyPjwvZGVmcz4nICsgaHRtbDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3R2F1Z2Uoc3ZnRWwsIHZhbHVlLCBtYXhWYWwsIGxhYmVsLCBjb2xvcikgew0KICAgICAgICBpZiAoIXN2Z0VsKSByZXR1cm47DQogICAgICAgIHZhciBwY3QgPSBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSAvIG1heFZhbCwgMCksIDEpOw0KICAgICAgICB2YXIgYW5nbGUgPSAtOTAgKyBwY3QgKiAxODA7DQogICAgICAgIHZhciByYWQgPSBhbmdsZSAqIE1hdGguUEkgLyAxODA7DQogICAgICAgIHZhciBjeCA9IDEwMCwgY3kgPSAxMDAsIHIgPSA3MDsNCiAgICAgICAgdmFyIG54ID0gY3ggKyByICogTWF0aC5jb3MocmFkKTsNCiAgICAgICAgdmFyIG55ID0gY3kgKyByICogTWF0aC5zaW4ocmFkKTsNCiAgICAgICAgdmFyIGxhcmdlID0gcGN0ID4gMC41ID8gMSA6IDA7DQoNCiAgICAgICAgc3ZnRWwuaW5uZXJIVE1MID0NCiAgICAgICAgICAgICc8Y2lyY2xlIGN4PSIxMDAiIGN5PSIxMDAiIHI9IjcwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMTIiLz4nICsNCiAgICAgICAgICAgICc8cGF0aCBkPSJNMzAgMTAwIEE3MCA3MCAwICcgKyBsYXJnZSArICcgMSAnICsgbnggKyAnICcgKyBueSArICciIGZpbGw9Im5vbmUiIHN0cm9rZT0iJyArIGNvbG9yICsgJyIgc3Ryb2tlLXdpZHRoPSIxMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+JyArDQogICAgICAgICAgICAnPHRleHQgeD0iMTAwIiB5PSI5NSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIyMiIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFhMjMzMiI+JyArIGZtdCh2YWx1ZSwgMikgKyAnPC90ZXh0PicgKw0KICAgICAgICAgICAgJzx0ZXh0IHg9IjEwMCIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNWE2Nzc4Ij4nICsgbGFiZWwgKyAnPC90ZXh0Pic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVuZGVyUmVzdWx0cyhkYXRhLCBzdHJlc3Nlcywgb3ZlcmFsbFNmLCBzdHJlbmd0aExpbWl0LCB1dGlsaXphdGlvbikgew0KICAgICAgICB2YXIgc3UgPSBzdHJlc3NVbml0KCk7DQogICAgICAgIHZhciBzdGF0dXMgPSBjbGFzc2lmeVNhZmV0eShvdmVyYWxsU2YsIGRhdGEudGFyZ2V0U2YsIFtdKTsNCiAgICAgICAgdmFyIHdhcm5pbmdzID0gYnVpbGRXYXJuaW5ncyhkYXRhLCBzdHJlc3Nlcywgb3ZlcmFsbFNmLCBzdHJlbmd0aExpbWl0KTsNCiAgICAgICAgc3RhdHVzID0gY2xhc3NpZnlTYWZldHkob3ZlcmFsbFNmLCBkYXRhLnRhcmdldFNmLCB3YXJuaW5ncyk7DQogICAgICAgIHZhciByZWNzID0gYnVpbGRSZWNvbW1lbmRhdGlvbnMoZGF0YSwgc3RyZXNzZXMsIG92ZXJhbGxTZiwgdXRpbGl6YXRpb24pOw0KDQogICAgICAgIGVscy5yZXN1bHRzSGVyby5jbGFzc05hbWUgPSAnbXNvc2ZjLXJlc3VsdHMtaGVybyBtc29zZmMtJyArIHN0YXR1czsNCiAgICAgICAgZWxzLm92ZXJhbGxTZi50ZXh0Q29udGVudCA9IGZtdChvdmVyYWxsU2YsIDIpOw0KICAgICAgICBlbHMuc3RhdHVzQmFkZ2UudGV4dENvbnRlbnQgPSBzdGF0dXMgPT09ICdzYWZlJyA/ICdTYWZlJyA6IChzdGF0dXMgPT09ICdjYXV0aW9uJyA/ICdDYXV0aW9uJyA6ICdVbnNhZmUnKTsNCiAgICAgICAgZWxzLnN0YXR1c0JhZGdlLmNsYXNzTmFtZSA9ICdtc29zZmMtc3RhdHVzLWJhZGdlJzsNCg0KICAgICAgICBlbHMucmVzQXhpYWwudGV4dENvbnRlbnQgPSBmbXQoY29udmVydERpc3BsYXlTdHJlc3Moc3RyZXNzZXMuc2lnbWFBeGlhbCksIDIpICsgJyAnICsgc3U7DQogICAgICAgIGVscy5yZXNTaGVhci50ZXh0Q29udGVudCA9IGZtdChjb252ZXJ0RGlzcGxheVN0cmVzcyhzdHJlc3Nlcy50YXVTaGVhciksIDIpICsgJyAnICsgc3U7DQogICAgICAgIGVscy5yZXNCZW5kaW5nLnRleHRDb250ZW50ID0gZm10KGNvbnZlcnREaXNwbGF5U3RyZXNzKHN0cmVzc2VzLnNpZ21hQmVuZGluZyksIDIpICsgJyAnICsgc3U7DQogICAgICAgIGVscy5yZXNUb3JzaW9uLnRleHRDb250ZW50ID0gZm10KGNvbnZlcnREaXNwbGF5U3RyZXNzKHN0cmVzc2VzLnRhdVRvcnNpb24pLCAyKSArICcgJyArIHN1Ow0KICAgICAgICBlbHMucmVzRXF1aXYudGV4dENvbnRlbnQgPSBmbXQoY29udmVydERpc3BsYXlTdHJlc3Moc3RyZXNzZXMuc2lnbWFFcSksIDIpICsgJyAnICsgc3U7DQogICAgICAgIGVscy5yZXNEZXNpZ24udGV4dENvbnRlbnQgPSBmbXQoY29udmVydERpc3BsYXlTdHJlc3Moc3RyZXNzZXMuc2lnbWFEZXNpZ24pLCAyKSArICcgJyArIHN1Ow0KICAgICAgICBlbHMucmVzU3RyZW5ndGgudGV4dENvbnRlbnQgPSBmbXQoY29udmVydERpc3BsYXlTdHJlc3Moc3RyZW5ndGhMaW1pdCksIDIpICsgJyAnICsgc3U7DQogICAgICAgIGVscy5yZXNUYXJnZXQudGV4dENvbnRlbnQgPSBmbXQoZGF0YS50YXJnZXRTZiwgMik7DQogICAgICAgIGVscy5yZXNVdGlsLnRleHRDb250ZW50ID0gZm10KHV0aWxpemF0aW9uLCAxKSArICclJzsNCiAgICAgICAgZWxzLnJlc0dvdmVybmluZy50ZXh0Q29udGVudCA9IHN0cmVzc2VzLmdvdmVybmluZzsNCg0KICAgICAgICB2YXIgYmFyQ29sb3IgPSB1dGlsaXphdGlvbiA+IDEwMCA/ICcjZGMyNjI2JyA6ICh1dGlsaXphdGlvbiA+IDg1ID8gJyNkOTc3MDYnIDogJyMwNTk2NjknKTsNCiAgICAgICAgZWxzLnV0aWxCYXJGaWxsLnN0eWxlLndpZHRoID0gTWF0aC5taW4odXRpbGl6YXRpb24sIDEwMCkgKyAnJSc7DQogICAgICAgIGVscy51dGlsQmFyRmlsbC5zdHlsZS5iYWNrZ3JvdW5kID0gYmFyQ29sb3I7DQogICAgICAgIGVscy51dGlsUGN0LnRleHRDb250ZW50ID0gZm10KHV0aWxpemF0aW9uLCAxKSArICclJzsNCg0KICAgICAgICBkcmF3TG9hZERpYWdyYW0oZGF0YS5tb2RlLCB7DQogICAgICAgICAgICBheGlhbDogTWF0aC5hYnMoc3RyZXNzZXMuc2lnbWFBeGlhbCkgPiAwLA0KICAgICAgICAgICAgc2hlYXI6IE1hdGguYWJzKHN0cmVzc2VzLnRhdVNoZWFyKSA+IDAsDQogICAgICAgICAgICBiZW5kaW5nOiBNYXRoLmFicyhzdHJlc3Nlcy5zaWdtYUJlbmRpbmcpID4gMCwNCiAgICAgICAgICAgIHRvcnNpb246IE1hdGguYWJzKHN0cmVzc2VzLnRhdVRvcnNpb24pID4gMA0KICAgICAgICB9KTsNCg0KICAgICAgICBkcmF3R2F1Z2UoZWxzLmVxdWl2R2F1Z2UsIGNvbnZlcnREaXNwbGF5U3RyZXNzKHN0cmVzc2VzLnNpZ21hRXEpLCBjb252ZXJ0RGlzcGxh eVN0cmVzcyhzdHJlbmd0aExpbWl0KSwgc3UsICcjMWU0ZDhjJyk7DQogICAgICAgIGRyYXdHYXVnZShlbHMuc2ZHYXVnZSwgb3ZlcmFsbFNmIHx8IDAsIE1hdGgubWF4KGRhdGEudGFyZ2V0U2YgKiAyLCBvdmVyYWxsU2YgfHwgMSksICdTRicsIHN0YXR1cyA9PT0gJ3Vuc2FmZScgPyAnI2RjMjYyNicgOiAnIzA1OTY2OScpOw0KDQogICAgICAgIGVscy53YXJuaW5ncy5pbm5lckhUTUwgPSB3YXJuaW5ncy5tYXAoZnVuY3Rpb24gKHcpIHsNCiAgICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0ibXNvc2ZjLXdhcm5pbmctaXRlbSBtc29zZmMtd2Fybi0nICsgdy50eXBlICsgJyI+JyArIHcudGV4dCArICc8L2Rpdj4nOw0KICAgICAgICB9KS5qb2luKCcnKTsNCg0KICAgICAgICBlbHMucmVjb21tZW5kYXRpb25zLmlubmVySFRNTCA9ICc8dWw+JyArIHJlY3MubWFwKGZ1bmN0aW9uIChyKSB7DQogICAgICAgICAgICByZXR1cm4gJzxsaT4nICsgciArICc8L2xpPic7DQogICAgICAgIH0pLmpvaW4oJycpICsgJzwvdWw+JzsNCg0KICAgICAgICBlbHMucmVzdWx0c1BhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ21zb3NmYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlUmVzdWx0cygpIHsNCiAgICAgICAgZWxzLnJlc3VsdHNQYW5lbC5jbGFzc0xpc3QuYWRkKCdtc29zZmMtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgew0KICAgICAgICB2YXIgZGF0YSA9IHJlYWRJbnB1dHMoKTsNCiAgICAgICAgaWYgKCF2YWxpZGF0ZUlucHV0cyhkYXRhKSkgew0KICAgICAgICAgICAgaGlkZVJlc3VsdHMoKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBuZWVkQXJlYSA9IGRhdGEubW9kZSA9PT0gJ2F4aWFsJyB8fCBkYXRhLm1vZGUgPT09ICdzaGVhcicgfHwgZGF0YS5tb2RlID09PSAnY29tYmluZWQnOw0KICAgICAgICBpZiAobmVlZEFyZWEgJiYgKCFkYXRhLmFyZWEgfHwgZGF0YS5hcmVhIDw9IDApKSB7DQogICAgICAgICAgICBzZXRGaWVsZEVycm9yKCdtc29zZmNBcmVhJywgJ21zb3NmY0FyZWFFcnInLCAnRWZmZWN0aXZlIGFyZWEgaXMgcmVxdWlyZWQuJyk7DQogICAgICAgICAgICBoaWRlUmVzdWx0cygpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHN0cmVzc2VzID0gY29tcHV0ZVN0cmVzc2VzKGRhdGEpOw0KICAgICAgICBpZiAoIWlzRmluaXRlKHN0cmVzc2VzLnNpZ21hRXEpIHx8IHN0cmVzc2VzLnNpZ21hRXEgPD0gMCkgew0KICAgICAgICAgICAgc2V0RmllbGRFcnJvcignbXNvc2ZjQXhpYWxMb2FkJywgJycsICdDYW5ub3QgY29tcHV0ZSBzdHJlc3Mg4oCUIGNoZWNrIGdlb21ldHJ5IGFuZCBsb2Fkcy4nKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzKCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgc3RyZW5ndGhMaW1pdCA9IGdldFN0cmVuZ3RoTGltaXQoZGF0YSk7DQogICAgICAgIHZhciBvdmVyYWxsU2YgPSBzdHJlbmd0aExpbWl0IC8gc3RyZXNzZXMuc2lnbWFEZXNpZ247DQogICAgICAgIHZhciB1dGlsaXphdGlvbiA9IChzdHJlc3Nlcy5zaWdtYURlc2lnbiAvIHN0cmVuZ3RoTGltaXQpICogMTAwOw0KDQogICAgICAgIHJlbmRlclJlc3VsdHMoZGF0YSwgc3RyZXNzZXMsIG92ZXJhbGxTZiwgc3RyZW5ndGhMaW1pdCwgdXRpbGl6YXRpb24pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7DQogICAgICAgIFsNCiAgICAgICAgICAgIGVscy5jYWxjTW9kZSwgZWxzLnN0cnVjdHVyZVR5cGUsIGVscy5tYXRlcmlhbCwgZWxzLnVuaXRTeXN0ZW0sDQogICAgICAgICAgICBlbHMueWllbGRTdHJlbmd0aCwgZWxzLnVsdGltYXRlU3RyZW5ndGgsIGVscy5hcmVhLCBlbHMuc2VjdGlvbk1vZHVsdXMsDQogICAgICAgICAgICBlbHMubW9tZW50T2ZJbmVydGlhLCBlbHMucG9sYXJNb21lbnQsIGVscy5vdXRlclJhZGl1cywgZWxzLmRpc3RUb0ZpYmVyLA0KICAgICAgICAgICAgZWxzLmF4aWFsTG9hZCwgZWxzLnNoZWFyTG9hZCwgZWxzLmJlbmRpbmdNb21lbnQsIGVscy50b3JxdWUsDQogICAgICAgICAgICBlbHMuZGlyZWN0Tm9ybWFsU3RyZXNzLCBlbHMuZGlyZWN0U2hlYXJTdHJlc3MsIGVscy5zdHJlc3NDcml0ZXJpb24sDQogICAgICAgICAgICBlbHMuc3RyZW5ndGhSZWYsIGVscy5jdXN0b21MaW1pdCwgZWxzLmtEeW5hbWljLCBlbHMua0ltcGFjdCwNCiAgICAgICAgICAgIGVscy5rRmF0aWd1ZSwgZWxzLmtUZW1wLCBlbHMua1VuY2VydGFpbnR5LCBlbHMua1N0cmVzc0NvbmMsDQogICAgICAgICAgICBlbHMudGFyZ2V0U2YsIGVscy5jb2x1bW5MZW5ndGgsIGVscy5zbGVuZGVybmVzcywgZWxzLmN5Y2xpY0xvYWRpbmcsDQogICAgICAgICAgICBlbHMuYXhpYWxMb2FkVW5pdCwgZWxzLnNoZWFyTG9hZFVuaXQsIGVscy5iZW5kaW5nTW9tZW50VW5pdCwgZWxzLnRvcnF1ZVVuaXQNCiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgICAgICAgaWYgKCFlbCkgcmV0dXJuOw0KICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gZWxzLm1hdGVyaWFsKSBtYW51YWxNYXRlcmlhbEVkaXQgPSBlbHMubWF0ZXJpYWwudmFsdWUgPT09ICdjdXN0b20nOw0KICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gZWxzLnlpZWxkU3RyZW5ndGggfHwgZWwgPT09IGVscy51bHRpbWF0ZVN0cmVuZ3RoKSBtYW51YWxTdHJlbmd0aEVkaXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gZWxzLnVuaXRTeXN0ZW0pIHsNCiAgICAgICAgICAgICAgICAgICAgY29udmVydElucHV0c09uVW5pdFN3aXRjaChlbC52YWx1ZSA9PT0gJ21ldHJpYycpOw0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVVbml0TGFiZWxzKCk7DQogICAgICAgICAgICAgICAgICAgIGlmICghbWFudWFsTWF0ZXJpYWxFZGl0KSBhcHBseU1hdGVyaWFsUHJlc2V0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gZWxzLm1hdGVyaWFsKSBhcHBseU1hdGVyaWFsUHJlc2V0KCk7DQogICAgICAgICAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGlmIChlbC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsLnR5cGUgPT09ICdudW1iZXInKSB7DQogICAgICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBlbHMuYnRuQ2FsY3VsYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbml0KCkgew0KICAgICAgICByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUk9PVF9JRCk7DQogICAgICAgIGlmICghcm9vdCkgcmV0dXJuOw0KDQogICAgICAgIGVscyA9IHsNCiAgICAgICAgICAgIHVuaXRTeXN0ZW06ICQoJ21zb3NmY1VuaXRTeXN0ZW0nKSwNCiAgICAgICAgICAgIGNhbGNNb2RlOiAkKCdtc29zZmNDYWxjTW9kZScpLA0KICAgICAgICAgICAgc3RydWN0dXJlVHlwZTogJCgnbXNvc2ZjU3RydWN0dXJlVHlwZScpLA0KICAgICAgICAgICAgbWF0ZXJpYWw6ICQoJ21zb3NmY01hdGVyaWFsJyksDQogICAgICAgICAgICB5aWVsZFN0cmVuZ3RoOiAkKCdtc29zZmNZaWVsZFN0cmVuZ3RoJyksDQogICAgICAgICAgICB1bHRpbWF0ZVN0cmVuZ3RoOiAkKCdtc29zZmNVbHRpbWF0ZVN0cmVuZ3RoJyksDQogICAgICAgICAgICBhcmVhOiAkKCdtc29zZmNBcmVhJyksDQogICAgICAgICAgICBzZWN0aW9uTW9kdWx1czogJCgnbXNvc2ZjU2VjdGlvbk1vZHVsdXMnKSwNCiAgICAgICAgICAgIG1vbWVudE9mSW5lcnRpYTogJCgnbXNvc2ZjTW9tZW50T2ZJbmVydGlhJyksDQogICAgICAgICAgICBwb2xhck1vbWVudDogJCgnbXNvc2ZjUG9sYXJNb21lbnQnKSwNCiAgICAgICAgICAgIG91dGVyUmFkaXVzOiAkKCdtc29zZmNPdXRlclJhZGl1cycpLA0KICAgICAgICAgICAgZGlzdFRvRmliZXI6ICQoJ21zb3NmY0Rpc3RUb0ZpYmVyJyksDQogICAgICAgICAgICBheGlhbExvYWQ6ICQoJ21zb3NmY0F4aWFsTG9hZCcpLA0KICAgICAgICAgICAgYXhpYWxMb2FkVW5pdDogJCgnbXNvc2ZjQXhpYWxMb2FkVW5pdCcpLA0KICAgICAgICAgICAgc2hlYXJMb2FkOiAkKCdtc29zZmNTaGVhckxvYWQnKSwNCiAgICAgICAgICAgIHNoZWFyTG9hZFVuaXQ6ICQoJ21zb3NmY1NoZWFyTG9hZFVuaXQnKSwNCiAgICAgICAgICAgIGJlbmRpbmdNb21lbnQ6ICQoJ21zb3NmY0JlbmRpbmdNb21lbnQnKSwNCiAgICAgICAgICAgIGJlbmRpbmdNb21lbnRVbml0OiAkKCdtc29zZmNCZW5k aW5nTW9tZW50VW5pdCcpLA0KICAgICAgICAgICAgdG9ycXVlOiAkKCdtc29zZmNUb3JxdWUnKSwNCiAgICAgICAgICAgIHRvcnF1ZVVuaXQ6ICQoJ21zb3NmY1RvcnF1ZVVuaXQnKSwNCiAgICAgICAgICAgIGRpcmVjdE5vcm1hbFN0cmVzczogJCgnbXNvc2ZjRGlyZWN0Tm9ybWFsU3RyZXNzJyksDQogICAgICAgICAgICBkaXJlY3RTaGVhclN0cmVzczogJCgnbXNvc2ZjRGlyZWN0U2hlYXJTdHJlc3MnKSwNCiAgICAgICAgICAgIHN0cmVzc0NyaXRlcmlvbjogJCgnbXNvc2ZjU3RyZXNzQ3JpdGVyaW9uJyksDQogICAgICAgICAgICBzdHJlbmd0aFJlZjogJCgnbXNvc2ZjU3RyZW5ndGhSZWYnKSwNCiAgICAgICAgICAgIGN1c3RvbUxpbWl0OiAkKCdtc29zZmNDdXN0b21MaW1pdCcpLA0KICAgICAgICAgICAgY3VzdG9tTGltaXRHcm91cDogJCgnbXNvc2ZjQ3VzdG9tTGltaXRHcm91cCcpLA0KICAgICAgICAgICAga0R5bmFtaWM6ICQoJ21zb3NmY0tEeW5hbWljJyksDQogICAgICAgICAgICBrSW1wYWN0OiAkKCdtc29zZmNLSW1wYWN0JyksDQogICAgICAgICAgICBrRmF0aWd1ZTogJCgnbXNvc2ZjS0ZhdGlndWUnKSwNCiAgICAgICAgICAgIGtUZW1wOiAkKCdtc29zZmNLVGVtcCcpLA0KICAgICAgICAgICAga1VuY2VydGFpbnR5OiAkKCdtc29zZmNLVW5jZXJ0YWludHknKSwNCiAgICAgICAgICAgIGtTdHJlc3NDb25jOiAkKCdtc29zZmNLU3RyZXNzQ29uYycpLA0KICAgICAgICAgICAgdGFyZ2V0U2Y6ICQoJ21zb3NmY1RhcmdldFNmJyksDQogICAgICAgICAgICBjb2x1bW5MZW5ndGg6ICQoJ21zb3NmY0NvbHVtbkxlbmd0aCcpLA0KICAgICAgICAgICAgc2xlbmRlcm5lc3M6ICQoJ21zb3NmY1NsZW5kZXJuZXNzJyksDQogICAgICAgICAgICBjeWNsaWNMb2FkaW5nOiAkKCdtc29zZmNDeWNsaWNMb2FkaW5nJyksDQogICAgICAgICAgICB3ZWxkTm90ZTogJCgnbXNvc2ZjV2VsZE5vdGUnKSwNCiAgICAgICAgICAgIGJ0bkNhbGN1bGF0ZTogJCgnbXNvc2ZjQnRuQ2FsY3VsYXRlJyksDQogICAgICAgICAgICByZXN1bHRzUGFuZWw6ICQoJ21zb3NmY1Jlc3VsdHNQYW5lbCcpLA0KICAgICAgICAgICAgcmVzdWx0c0hlcm86ICQoJ21zb3NmY1Jlc3VsdHNIZXJvJyksDQogICAgICAgICAgICBvdmVyYWxsU2Y6ICQoJ21zb3NmY092ZXJhbGxTZicpLA0KICAgICAgICAgICAgc3RhdHVzQmFkZ2U6ICQoJ21zb3NmY1N0YXR1c0JhZGdlJyksDQogICAgICAgICAgICByZXNBeGlhbDogJCgnbXNvc2ZjUmVzQXhpYWwnKSwNCiAgICAgICAgICAgIHJlc1NoZWFyOiAkKCdtc29zZmNSZXNTaGVhcicpLA0KICAgICAgICAgICAgcmVzQmVuZGluZzogJCgnbXNvc2ZjUmVzQmVuZGluZycpLA0KICAgICAgICAgICAgcmVzVG9yc2lvbjogJCgnbXNvc2ZjUmVzVG9yc2lvbicpLA0KICAgICAgICAgICAgcmVzRXF1aXY6ICQoJ21zb3NmY1Jlc0VxdWl2JyksDQogICAgICAgICAgICByZXNEZXNpZ246ICQoJ21zb3NmY1Jlc0Rlc2lnbicpLA0KICAgICAgICAgICAgcmVzU3RyZW5ndGg6ICQoJ21zb3NmY1Jlc1N0cmVuZ3RoJyksDQogICAgICAgICAgICByZXNUYXJnZXQ6ICQoJ21zb3NmY1Jlc1RhcmdldCcpLA0KICAgICAgICAgICAgcmVzVXRpbDogJCgnbXNvc2ZjUmVzVXRpbCcpLA0KICAgICAgICAgICAgcmVzR292ZXJuaW5nOiAkKCdtc29zZmNSZXNHb3Zlcm5pbmcnKSwNCiAgICAgICAgICAgIHV0aWxCYXJGaWxsOiAkKCdtc29zZmNVdGlsQmFyRmlsbCcpLA0KICAgICAgICAgICAgdXRpbFBjdDogJCgnbXNvc2ZjVXRpbFBjdCcpLA0KICAgICAgICAgICAgbG9hZERpYWdyYW06ICQoJ21zb3NmY0xvYWREaWFncmFtJyksDQogICAgICAgICAgICBlcXVpdkdhdWdlOiAkKCdtc29zZmNFcXVpdkdhdWdlJyksDQogICAgICAgICAgICBzZkdhdWdlOiAkKCdtc29zZmNTZkdhdWdlJyksDQogICAgICAgICAgICB3YXJuaW5nczogJCgnbXNvc2ZjV2FybmluZ3MnKSwNCiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uczogJCgnbXNvc2ZjUmVjb21tZW5kYXRpb25zJykNCiAgICAgICAgfTsNCg0KICAgICAgICBpZiAoIWVscy5idG5DYWxjdWxhdGUpIHJldHVybjsNCg0KICAgICAgICBtYW51YWxNYXRlcmlhbEVkaXQgPSBmYWxzZTsNCiAgICAgICAgYmluZEV2ZW50cygpOw0KICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBoaWRlUmVzdWx0cygpOw0KICAgIH0NCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGluaXQoKTsNCiAgICB9DQp9KSgpOw0K
Résultats
—
Overall Safety Factor
Safe
Material Strength Limit
—
Load Diagram
Stress Distribution
Tension (top) / Compression (bottom)
Equivalent Stress Gauge
Safety Factor Gauge
Engineering Recommendations