Калькулятор смешивания растворов
Рассчитайте конечную концентрацию и объём при смешивании двух растворов одного вещества — для лабораторных, учебных и производственных задач.
—
Конечная концентрация
%
—
Масса вещества в р-ре №1
г
—
Масса вещества в р-ре №2
г
Как пользоваться
1
Введите объём и концентрацию первого раствора. Например: V₁ = 200 мл, C₁ = 10% (раствор соли). Плотность можно оставить пустой — будет принято значение 1,00 г/мл (плотность воды).
2
Введите параметры второго раствора. Например: V₂ = 150 мл, C₂ = 25%. Если плотности растворов различаются, укажите точные значения для более корректного расчёта массовой доли.
3
Нажмите «Рассчитать». Калькулятор вычислит общий объём смеси, итоговую концентрацию и массы растворённого вещества в каждом растворе и в смеси.
4
При необходимости нажмите «Сбросить», чтобы очистить все поля и начать новый расчёт. Результаты обнулятся автоматически.
Примеры использования
Приготовление раствора нужной концентрации
У вас есть 300 мл 5% раствора NaCl и 200 мл 20% раствора NaCl. При смешивании получается 500 мл смеси с концентрацией 11%. Масса соли в смеси — 55 г (15 г из первого раствора + 40 г из второго).
Разбавление концентрированного раствора
Требуется разбавить 100 мл 30% раствора кислоты, добавив 400 мл воды (C₂ = 0%, ρ₂ = 1,00 г/мл). Итоговый объём — 500 мл, конечная концентрация — 6%. Масса кислоты остаётся неизменной — 30 г.
Объединение двух партий реактива
В лаборатории осталось 75 мл 12% раствора щёлочи (ρ₁ = 1,13 г/мл) и 120 мл 8% раствора (ρ₂ = 1,09 г/мл). При смешивании итоговая массовая доля составит 9,52%, общая масса раствора — 215,55 г, масса щёлочи — 20,52 г.
Формулы расчёта
Калькулятор использует следующие формулы при смешивании двух растворов одного и того же вещества:
Если плотности не указаны, по умолчанию принимается ρ₁ = ρ₂ = 1,00 г/мл, что справедливо для разбавленных водных растворов. В этом случае конечная концентрация приближённо равна средневзвешенной по объёму: ω ≈ (C₁·V₁ + C₂·V₂) / (V₁ + V₂).
Важные нюансы
- ⚠️ Техника безопасности: при смешивании кислот с водой всегда добавляйте кислоту в воду тонкой струёй при перемешивании, а не наоборот. Используйте защитные очки, перчатки и работайте в хорошо проветриваемом помещении или под вытяжкой.
- Формула расчёта конечной концентрации по массе корректна при условии, что плотность смеси близка к средневзвешенной плотности компонентов. Для точных лабораторных расчётов используйте таблицы плотностей растворов конкретных веществ при заданной температуре.
- Если растворы содержат разные вещества, которые могут вступать в химическую реакцию, данный калькулятор неприменим — необходимо учитывать стехиометрию реакции и образующиеся продукты.
- Концентрация в процентах может быть массовой долей (г/100 г раствора) или объёмной долей (мл/100 мл). Калькулятор рассчитывает массовую долю; для пересчёта в молярную концентрацию нужна молярная масса вещества.
- При расчётах с плотностями, отличными от 1,00 г/мл, убедитесь, что значения плотностей соответствуют температуре раствора (обычно 20 °C).
Источники данных
IUPAC. Compendium of Chemical Terminology (Gold Book). Version 2.3.3, 2024. — Раздел «Solution», «Concentration», «Mass fraction».
NIST Chemistry WebBook. Standard Reference Database Number 69. National Institute of Standards and Technology, Gaithersburg MD, 2024. — Термодинамические и физико-химические справочные данные растворов.
CRC Handbook of Chemistry and Physics, 104th Edition. John Rumble (Ed.). CRC Press, 2023. — Таблицы плотностей и концентраций водных растворов неорганических веществ.
ГОСТ 8.417-2002. Государственная система обеспечения единства измерений. Единицы величин. — Стандартные единицы измерения массы, объёма, плотности и концентрации.
Расчёт основан на фундаментальных химических формулах смешивания растворов и школьно-вузовских справочных данных о свойствах растворов.
Калькулятор смешивания растворов — удобный онлайн-инструмент для быстрого расчёта концентрации и объёма при объединении двух жидких растворов одного вещества. Он незаменим в лабораторной практике при приготовлении растворов заданной концентрации, в учебном процессе при изучении темы «Растворы» в курсе химии, а также на производстве для контроля качества и составления рецептур. Расчёт выполняется по классическим формулам химии растворов с учётом плотности и массовой доли, что обеспечивает высокую точность результата. Используйте калькулятор для экономии времени и минимизации ошибок при ручных вычислениях.
CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgJ3VzZSBzdHJpY3QnOwoKICAgICAgICAvLyDQrdC70LXQvNC10L3RgtGLINGE0L7RgNC80YsKICAgICAgICB2YXIgdjFJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2MScpOwogICAgICAgIHZhciBjMUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2MxJyk7CiAgICAgICAgdmFyIHJobzFJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaG8xJyk7CiAgICAgICAgdmFyIHYySW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndjInKTsKICAgICAgICB2YXIgYzJJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjMicpOwogICAgICAgIHZhciByaG8ySW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmhvMicpOwoKICAgICAgICAvLyDQrdC70LXQvNC10L3RgtGLINC+0YjQuNCx0L7QugogICAgICAgIHZhciBlcnJWMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnItdjEnKTsKICAgICAgICB2YXIgZXJyQzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyLWMxJyk7CiAgICAgICAgdmFyIGVyclJobzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyLXJobzEnKTsKICAgICAgICB2YXIgZXJyVjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyLXYyJyk7CiAgICAgICAgdmFyIGVyckMyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vyci1jMicpOwogICAgICAgIHZhciBlcnJSaG8yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vyci1yaG8yJyk7CgogICAgICAgIC8vINCt0LvQtdC80LXQvdGC0Ysg0YDQtdC30YPQu9GM0YLQsNGC0L7QsgogICAgICAgIHZhciByZXNUb3RhbFZvbHVtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXMtdG90YWwtdm9sdW1lJyk7CiAgICAgICAgdmFyIHJlc0ZpbmFsQ29uYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXMtZmluYWwtY29uYycpOwogICAgICAgIHZhciByZXNNYXNzMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXMtbWFzczEnKTsKICAgICAgICB2YXIgcmVzTWFzczIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzLW1hc3MyJyk7CiAgICAgICAgdmFyIHJlc1RvdGFsU29sdXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlcy10b3RhbC1zb2x1dGUnKTsKICAgICAgICB2YXIgcmVzVG90YWxNYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlcy10b3RhbC1tYXNzJyk7CgogICAgICAgIC8vINCa0L3QvtC/0LrQuAogICAgICAgIHZhciBjYWxjQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGNCdG4nKTsKICAgICAgICB2YXIgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXRCdG4nKTsKCiAgICAgICAgLy8g0KHQutGA0YvRgtGMINCy0YHQtSDQvtGI0LjQsdC60LgKICAgICAgICBmdW5jdGlvbiBoaWRlQWxsRXJyb3JzKCkgewogICAgICAgICAgICB2YXIgZXJyb3JzID0gW2VyclYxLCBlcnJDMSwgZXJyUmhvMSwgZXJyVjIsIGVyckMyLCBlcnJSaG8yXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChlcnJvcnNbaV0pIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcnNbaV0uY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgICAgICAgICAgICAgIGVycm9yc1tpXS50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDQn9C+0LrQsNC30LDRgtGMINC+0YjQuNCx0LrRgwogICAgICAgIGZ1bmN0aW9uIHNob3dFcnJvcihlbCwgbWVzc2FnZSkgewogICAgICAgICAgICBpZiAoIWVsKSByZXR1cm47CiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOwogICAgICAgIH0KCiAgICAgICAgLy8g0KHQsdGA0L7RgSDRgNC10LfRg9C70YzRgtCw0YLQvtCyCiAgICAgICAgZnVuY3Rpb24gcmVzZXRSZXN1bHRzKCkgewogICAgICAgICAgICBpZiAocmVzVG90YWxWb2x1bWUpIHJlc1RvdGFsVm9sdW1lLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIGlmIChyZXNGaW5hbENvbmMpIHJlc0ZpbmFsQ29uYy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICBpZiAocmVzTWFzczEpIHJlc01hc3MxLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIGlmIChyZXNNYXNzMikgcmVzTWFzczIudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgaWYgKHJlc1RvdGFsU29sdXRlKSByZXNUb3RhbFNvbHV0ZS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICBpZiAocmVzVG90YWxNYXNzKSByZXNUb3RhbE1hc3MudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICB9CgogICAgICAgIC8vINCf0YDQvtCy0LXRgNC60LA6INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4KICAgICAgICBmdW5jdGlvbiBpc1ZhbGlkUG9zaXRpdmVOdW1iZXIodmFsKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpICYmIHZhbCA+PSAwOwogICAgICAgIH0KCiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsDog0YHRgtGA0L7Qs9C+INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4g0LTQu9GPINC+0LHRitGR0LzQvtCyICjQvNC+0LbQvdC+IDAsINC90L4g0L3QtSDQvtGC0YDQuNGG0LDRgtC10LvRjNC90L7QtSkKICAgICAgICBmdW5jdGlvbiBpc1ZhbGlkVm9sdW1lKHZhbCkgewogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSAmJiB2YWwgPj0gMDsKICAgICAgICB9CgogICAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAg0LrQvtC90YbQtdC90YLRgNCw0YbQuNC4OiAwLTEwMAogICAgICAgIGZ1bmN0aW9uIGlzVmFsaWRDb25jZW50cmF0aW9uKHZhbCkgewogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSAmJiB2YWwgPj0gMCAmJiB2YWwgPD0gMTAwOwogICAgICAgIH0KCiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQv9C70L7RgtC90L7RgdGC0LgKICAgICAgICBmdW5jdGlvbiBpc1ZhbGlkRGVuc2l0eSh2YWwpIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkgJiYgdmFsID49IDAuMyAmJiB2YWwgPD0gNTsKICAgICAgICB9CgogICAgICAgIC8vINCk0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40LUg0YfQuNGB0LvQsAogICAgICAgIGZ1bmN0aW9uIGZvcm1hdE51bWJlcih2YWwpIHsKICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZSh2YWwpKSByZXR1cm4gJ+KAlCc7CiAgICAgICAgICAgIGlmIChNYXRoLmFicyh2YWwpIDwgMC4wMDUgJiYgdmFsICE9PSAwKSByZXR1cm4gdmFsLnRvRXhwb25lbnRpYWwoMyk7CiAgICAgICAgICAgIHZhciByb3VuZGVkID0gTWF0aC5yb3VuZCh2YWwgKiAxMDApIC8gMTAwOwogICAgICAgICAgICByZXR1cm4gcm91bmRlZC50b0ZpeGVkKDIpOwogICAgICAgIH0KCiAgICAgICAgLy8g0KDQsNGB0YfRkdGCCiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgewogICAgICAgICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgICAgICAgIHZhciBoYXNFcnJvciA9IGZhbHNlOwoKICAgICAgICAgICAgLy8g0J/QvtC70YPRh9C10L3QuNC1INC30L3QsNGH0LXQvdC40LkKICAgICAgICAgICAgdmFyIHYxUmF3ID0gdjFJbnB1dCA/IHYxSW5wdXQudmFsdWUudHJpbSgpIDogJyc7CiAgICAgICAgICAgIHZhciBjMVJhdyA9IGMxSW5wdXQgPyBjMUlucHV0LnZhbHVlLnRyaW0oKSA6ICcnOwogICAgICAgICAgICB2YXIgcmhvMVJhdyA9IHJobzFJbnB1dCA/IHJobzFJbnB1dC52YWx1ZS50cmltKCkgOiAnJzsKICAgICAgICAgICAgdmFyIHYyUmF3ID0gdjJJbnB1dCA/IHYySW5wdXQudmFsdWUudHJpbSgpIDogJyc7CiAgICAgICAgICAgIHZhciBjMlJhdyA9IGMySW5wdXQgPyBjMklucHV0LnZhbHVlLnRyaW0oKSA6ICcnOwogICAgICAgICAgICB2YXIgcmhvMlJhdyA9IHJobzJJbnB1dCA/IHJobzJJbnB1dC52YWx1ZS50cmltKCkgOiAnJzsKCiAgICAgICAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAg0L7QsdGP0LfQsNGC0LXQu9GM0L3Ri9GFINC/0L7Qu9C10LkKICAgICAgICAgICAgaWYgKHYxUmF3ID09PSAnJykgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKGVyclYxLCAn0KPQutCw0LbQuNGC0LUg0L7QsdGK0ZHQvCDQv9C10YDQstC+0LPQviDRgNCw0YHRgtCy0L7RgNCwLicpOwogICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjMVJhdyA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcihlcnJDMSwgJ9Cj0LrQsNC20LjRgtC1INC60L7QvdGG0LXQvdGC0YDQsNGG0LjRjiDQv9C10YDQstC+0LPQviDRgNCw0YHRgtCy0L7RgNCwLicpOwogICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2MlJhdyA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcihlcnJWMiwgJ9Cj0LrQsNC20LjRgtC1INC+0LHRitGR0Lwg0LLRgtC+0YDQvtCz0L4g0YDQsNGB0YLQstC+0YDQsC4nKTsKICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYzJSYXcgPT09ICcnKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoZXJyQzIsICfQo9C60LDQttC40YLQtSDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y4g0LLRgtC+0YDQvtCz0L4g0YDQsNGB0YLQstC+0YDQsC4nKTsKICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHYxID0gcGFyc2VGbG9hdCh2MVJhdyk7CiAgICAgICAgICAgIHZhciBjMSA9IHBhcnNlRmxvYXQoYzFSYXcpOwogICAgICAgICAgICB2YXIgdjIgPSBwYXJzZUZsb2F0KHYyUmF3KTsKICAgICAgICAgICAgdmFyIGMyID0gcGFyc2VGbG9hdChjMlJhdyk7CiAgICAgICAgICAgIHZhciByaG8xID0gcmhvMVJhdyAhPT0gJycgPyBwYXJzZUZsb2F0KHJobzFSYXcpIDogMS4wOwogICAgICAgICAgICB2YXIgcmhvMiA9IHJobzJSYXcgIT09ICcnID8gcGFyc2VGbG9hdChyaG8yUmF3KSA6IDEuMDsKCiAgICAgICAgICAgIC8vINCS0LDQu9C40LTQsNGG0LjRjwogICAgICAgICAgICBpZiAoIWlzVmFsaWRWb2x1bWUodjEpKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoZXJyVjEsICfQntCx0YrRkdC8INC00L7Qu9C20LXQvSDQsdGL0YLRjCDQvdC10L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0Lwg0YfQuNGB0LvQvtC8LicpOwogICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNWYWxpZENvbmNlbnRyYXRpb24oYzEpKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoZXJyQzEsICfQmtC+0L3RhtC10L3RgtGA0LDRhtC40Y8g0LTQvtC70LbQvdCwINCx0YvRgtGMINC+0YIgMCDQtNC+IDEwMCUuJyk7CiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJobzFSYXcgIT09ICcnICYmICFpc1ZhbGlkRGVuc2l0eShyaG8xKSkgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKGVyclJobzEsICfQn9C70L7RgtC90L7RgdGC0Ywg0LTQvtC70LbQvdCwINCx0YvRgtGMINC+0YIgMCwzINC00L4gNSDQsy/QvNC7LicpOwogICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNWYWxpZFZvbHVtZSh2MikpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcihlcnJWMiwgJ9Ce0LHRitGR0Lwg0LTQvtC70LbQtdC9INCx0YvRgtGMINC90LXQvtGC0YDQuNGG0LDRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc1ZhbGlkQ29uY2VudHJhdGlvbihjMikpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcihlcnJDMiwgJ9Ca0L7QvdGG0LXQvdGC0YDQsNGG0LjRjyDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0L7RgiAwINC00L4gMTAwJS4nKTsKICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmhvMlJhdyAhPT0gJycgJiYgIWlzVmFsaWREZW5zaXR5KHJobzIpKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoZXJyUmhvMiwgJ9Cf0LvQvtGC0L3QvtGB0YLRjCDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0L7RgiAwLDMg0LTQviA1INCzL9C80LsuJyk7CiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAsINGH0YLQviDQvtCx0LAg0L7QsdGK0ZHQvNCwINC90LUg0YDQsNCy0L3RiyDQvdGD0LvRjiDQvtC00L3QvtCy0YDQtdC80LXQvdC90L4KICAgICAgICAgICAgaWYgKCFoYXNFcnJvciAmJiB2MSA9PT0gMCAmJiB2MiA9PT0gMCkgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKGVyclYxLCAn0KXQvtGC0Y8g0LHRiyDQvtC00LjQvSDQvtCx0YrRkdC8INC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsdC+0LvRjNGI0LUg0L3Rg9C70Y8uJyk7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoZXJyVjIsICfQpdC+0YLRjyDQsdGLINC+0LTQuNC9INC+0LHRitGR0Lwg0LTQvtC70LbQtdC9INCx0YvRgtGMINCx0L7Qu9GM0YjQtSDQvdGD0LvRjy4nKTsKICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g0KDQsNGB0YfRkdGCCiAgICAgICAgICAgIHZhciB0b3RhbFZvbHVtZSA9IHYxICsgdjI7CiAgICAgICAgICAgIHZhciBtYXNzU29sdXRlMSA9IHYxICogcmhvMSAqIChjMSAvIDEwMCk7CiAgICAgICAgICAgIHZhciBtYXNzU29sdXRlMiA9IHYyICogcmhvMiAqIChjMiAvIDEwMCk7CiAgICAgICAgICAgIHZhciB0b3RhbFNvbHV0ZSA9IG1hc3NTb2x1dGUxICsgbWFzc1NvbHV0ZTI7CiAgICAgICAgICAgIHZhciB0b3RhbE1hc3MgPSB2MSAqIHJobzEgKyB2MiAqIHJobzI7CiAgICAgICAgICAgIHZhciBmaW5hbENvbmNlbnRyYXRpb24gPSB0b3RhbE1hc3MgPiAwID8gKHRvdGFsU29sdXRlIC8gdG90YWxNYXNzKSAqIDEwMCA6IDA7CgogICAgICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINC90LAg0Y3QutGB0YLRgNC10LzQsNC70YzQvdGL0LUg0LfQvdCw0YfQtdC90LjRjwogICAgICAgICAgICBpZiAoIWlzRmluaXRlKHRvdGFsVm9sdW1lKSB8fCAhaXNGaW5pdGUodG90YWxTb2x1dGUpIHx8ICFpc0Zpbml0ZSh0b3RhbE1hc3MpIHx8ICFpc0Zpbml0ZShmaW5hbENvbmNlbnRyYXRpb24pKSB7CiAgICAgICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g0J7RgtC+0LHRgNCw0LbQtdC90LjQtSDRgNC10LfRg9C70YzRgtCw0YLQvtCyCiAgICAgICAgICAgIGlmIChyZXNUb3RhbFZvbHVtZSkgcmVzVG90YWxWb2x1bWUudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIodG90YWxWb2x1bWUpOwogICAgICAgICAgICBpZiAocmVzRmluYWxDb25jKSByZXNGaW5hbENvbmMudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIoZmluYWxDb25jZW50cmF0aW9uKTsKICAgICAgICAgICAgaWYgKHJlc01hc3MxKSByZXNNYXNzMS50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihtYXNzU29sdXRlMSk7CiAgICAgICAgICAgIGlmIChyZXNNYXNzMikgcmVzTWFzczIudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIobWFzc1NvbHV0ZTIpOwogICAgICAgICAgICBpZiAocmVzVG90YWxTb2x1dGUpIHJlc1RvdGFsU29sdXRlLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKHRvdGFsU29sdXRlKTsKICAgICAgICAgICAgaWYgKHJlc1RvdGFsTWFzcykgcmVzVG90YWxNYXNzLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKHRvdGFsTWFzcyk7CiAgICAgICAgfQoKICAgICAgICAvLyDQodCx0YDQvtGBINGE0L7RgNC80YsKICAgICAgICBmdW5jdGlvbiByZXNldEZvcm0oKSB7CiAgICAgICAgICAgIGhpZGVBbGxFcnJvcnMoKTsKICAgICAgICAgICAgaWYgKHYxSW5wdXQpIHYxSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgaWYgKGMxSW5wdXQpIGMxSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgaWYgKHJobzFJbnB1dCkgcmhvMUlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgICAgIGlmICh2MklucHV0KSB2MklucHV0LnZhbHVlID0gJyc7CiAgICAgICAgICAgIGlmIChjMklucHV0KSBjMklucHV0LnZhbHVlID0gJyc7CiAgICAgICAgICAgIGlmIChyaG8ySW5wdXQpIHJobzJJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICB9CgogICAgICAgIC8vINCd0LDQstC10YjQuNCy0LDQvdC40LUg0YHQvtCx0YvRgtC40LkKICAgICAgICBpZiAoY2FsY0J0bikgewogICAgICAgICAgICBjYWxjQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsKICAgICAgICB9CgogICAgICAgIGlmIChyZXNldEJ0bikgewogICAgICAgICAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0Rm9ybSk7CiAgICAgICAgfQoKICAgICAgICAvLyDQntCx0YDQsNCx0L7RgtC60LAgRW50ZXIg0LIg0L/QvtC70Y/RhSDQstCy0L7QtNCwCiAgICAgICAgdmFyIGFsbElucHV0cyA9IFt2MUlucHV0LCBjMUlucHV0LCByaG8xSW5wdXQsIHYySW5wdXQsIGMySW5wdXQsIHJobzJJbnB1dF07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxJbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFsbElucHV0c1tpXSkgewogICAgICAgICAgICAgICAgYWxsSW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vINCe0YfQuNGB0YLQutCwINC+0YjQuNCx0L7QuiDQv9GA0Lgg0LjQt9C80LXQvdC10L3QuNC4INC30L3QsNGH0LXQvdC40LkKICAgICAgICBpZiAodjFJbnB1dCkgdjFJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgeyBpZiAoZXJyVjEpIGVyclYxLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsgfSk7CiAgICAgICAgaWYgKGMxSW5wdXQpIGMxSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHsgaWYgKGVyckMxKSBlcnJDMS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7IH0pOwogICAgICAgIGlmIChyaG8xSW5wdXQpIHJobzFJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgeyBpZiAoZXJyUmhvMSkgZXJyUmhvMS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7IH0pOwogICAgICAgIGlmICh2MklucHV0KSB2MklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7IGlmIChlcnJWMikgZXJyVjIuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9KTsKICAgICAgICBpZiAoYzJJbnB1dCkgYzJJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgeyBpZiAoZXJyQzIpIGVyckMyLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsgfSk7CiAgICAgICAgaWYgKHJobzJJbnB1dCkgcmhvMklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7IGlmIChlcnJSaG8yKSBlcnJSaG8yLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsgfSk7CiAgICB9KSgpOwo=