Калькулятор массовой доли по молярности
Пересчёт между молярной концентрацией раствора и массовой долей растворённого вещества с учётом плотности раствора.
—
Масса вещества в 1 л раствора
г
—
Молярная концентрация (C)
моль/л
Введите данные и нажмите «Рассчитать»
Как пользоваться
1
Выберите режим: «Найти массовую долю» (если известна молярность) или «Найти молярность» (если известна массовая доля). Переключатель находится в верхней части формы.
2
Введите известные значения. Для режима поиска массовой доли укажите молярную концентрацию (например, 2 моль/л), молярную массу вещества (например, 58.44 г/моль для NaCl) и плотность раствора (например, 1.08 г/мл).
3
Нажмите кнопку «Рассчитать». Результат появится в правой панели: основная искомая величина, а также дополнительные параметры — масса вещества в 1 литре раствора, масса 1 литра раствора и обратная величина для проверки.
4
При необходимости нажмите «Сбросить», чтобы очистить все поля и начать новый расчёт. Для уточнения плотности при нестандартной температуре обратитесь к справочным таблицам.
Примеры использования
Пример 1. Раствор поваренной соли (NaCl)
Дано: молярная концентрация C = 2 моль/л, молярная масса NaCl M = 58.44 г/моль, плотность раствора ρ = 1.08 г/мл.
Расчёт: w = (2 × 58.44) / (10 × 1.08) = 116.88 / 10.8 ≈ 10.82%.
Масса NaCl в 1 л раствора: 2 × 58.44 = 116.88 г. Масса 1 л раствора: 1000 × 1.08 = 1080 г.
Пример 2. Концентрированная серная кислота (H₂SO₄)
Дано: C = 18 моль/л, M = 98.08 г/моль, ρ = 1.84 г/мл (типичная плотность конц. H₂SO₄ при 20°C).
Расчёт: w = (18 × 98.08) / (10 × 1.84) = 1765.44 / 18.4 ≈ 95.95%.
Полученное значение соответствует справочным данным для концентрированной серной кислоты (~96%).
Пример 3. Обратный пересчёт — раствор гидроксида натрия (NaOH)
Дано: массовая доля w = 10%, M = 40.00 г/моль, ρ = 1.11 г/мл (10% NaOH при 20°C).
Расчёт: C = (10 × 1.11 × 10) / 40.00 = 111 / 40.00 = 2.775 моль/л.
Масса NaOH в 1 л: 2.775 × 40.00 = 111 г, что соответствует 10% от 1110 г (масса 1 л раствора).
Важные нюансы
- Плотность раствора зависит от температуры. Всегда проверяйте, при какой температуре измерена плотность. Стандартные справочные значения обычно приводятся для 20°C. При отклонении температуры плотность может заметно измениться, что повлияет на точность расчёта.
- Формула справедлива для бинарных растворов (одно растворённое вещество + растворитель). Для многокомпонентных смесей расчёт усложняется — необходимо учитывать парциальные вклады каждого компонента.
- При массовой доле выше 100% не бывает — если калькулятор показывает значение больше 100%, проверьте введённые данные: скорее всего, плотность занижена или молярная концентрация завышена относительно реальных физических пределов растворимости.
- Для концентрированных кислот и щелочей плотность раствора значительно отличается от плотности воды и достигает 1.8–1.9 г/мл. Используйте проверенные справочные значения плотности, а не приблизительные оценки.
- Молярная масса вещества рассчитывается как сумма атомных масс элементов с учётом индексов. Используйте стандартные атомные массы из таблицы Менделеева с точностью до двух знаков после запятой для большинства учебных и лабораторных расчётов.
⚠️ Техника безопасности
- При приготовлении растворов кислот и щелочей всегда используйте защитные очки, перчатки и лабораторный халат.
- Никогда не лейте воду в концентрированную кислоту! Добавляйте кислоту в воду тонкой струёй при постоянном перемешивании — это предотвращает разбрызгивание и перегрев.
- Работайте в хорошо проветриваемом помещении или под вытяжным шкафом, особенно с летучими и агрессивными веществами.
- Данный калькулятор — инструмент для теоретических расчётов. Перед лабораторной работой сверяйтесь со справочными таблицами плотности и концентраций.
Источники данных
- IUPAC Gold Book — официальная терминология химических величин: определения молярности (amount concentration), массовой доли (mass fraction), плотности. doi.org/10.1351/goldbook
- NIST Chemistry WebBook — справочные данные по плотности растворов, молярным массам и термодинамическим свойствам веществ. webbook.nist.gov/chemistry
- CRC Handbook of Chemistry and Physics — авторитетный справочник с таблицами плотности водных растворов неорганических веществ при различных температурах и концентрациях. hbcponline.com
- Расчёт основан на стандартных химических формулах и школьно-вузовских справочных значениях, соответствующих образовательным стандартам РФ.
Калькулятор массовой доли по молярности — удобный онлайн-инструмент для химиков, студентов, лаборантов и преподавателей. Он позволяет быстро пересчитать молярную концентрацию раствора в массовую долю и наоборот, используя известную плотность раствора и молярную массу вещества. Расчёт основан на фундаментальной формуле связи концентраций, принятой в аналитической и физической химии. Инструмент учитывает размерности величин и автоматически выводит дополнительные параметры: массу растворённого вещества в 1 литре раствора и массу 1 литра раствора. Калькулятор полезен при приготовлении растворов заданной концентрации, проверке лабораторных расчётов и учебных задачах по химии.
CihmdW5jdGlvbigpewogIHZhciBtb2RlUmFkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtbW9kZS1yYWRpbycpOwogIHZhciBtb2RlTGFiZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtbW9kZS1sYWJlbCcpOwogIHZhciBsYWJlbFByaW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiZWwtcHJpbWFyeScpOwogIHZhciBpbnB1dFByaW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtcHJpbWFyeScpOwogIHZhciBpbnB1dE1vbGFyTWFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC1tb2xhci1tYXNzJyk7CiAgdmFyIGlucHV0RGVuc2l0eSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC1kZW5zaXR5Jyk7CiAgdmFyIGlucHV0VGVtcGVyYXR1cmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtdGVtcGVyYXR1cmUnKTsKICB2YXIgZXJyb3JQcmltYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXByaW1hcnknKTsKICB2YXIgZXJyb3JNb2xhck1hc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbW9sYXItbWFzcycpOwogIHZhciBlcnJvckRlbnNpdHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItZGVuc2l0eScpOwogIHZhciBlcnJvclRlbXBlcmF0dXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXRlbXBlcmF0dXJlJyk7CiAgdmFyIHJlc3VsdE1haW5WYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtbWFpbi12YWx1ZScpOwogIHZhciByZXN1bHRNYWluTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LW1haW4tbGFiZWwnKTsKICB2YXIgcmVzdWx0TWFzc1NvbHV0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtbWFzcy1zb2x1dGUnKTsKICB2YXIgcmVzdWx0TWFzc1NvbHV0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1tYXNzLXNvbHV0aW9uJyk7CiAgdmFyIHJlc3VsdFNlY29uZGFyeVZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1zZWNvbmRhcnktdmFsdWUnKTsKICB2YXIgcmVzdWx0U2Vjb25kYXJ5TGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LXNlY29uZGFyeS1sYWJlbCcpOwogIHZhciByZXN1bHRFbXB0eSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtZW1wdHknKTsKICB2YXIgcmVzdWx0R3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ubi1nZW4tY2FsLXJlc3VsdC1ncmlkJyk7CiAgdmFyIGJ0bkNhbGN1bGF0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tY2FsY3VsYXRlJyk7CiAgdmFyIGJ0blJlc2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bi1yZXNldCcpOwogIHZhciBmaWVsZEdyb3VwVGVtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWVsZC1ncm91cC10ZW1wZXJhdHVyZScpOwoKICB2YXIgY3VycmVudE1vZGUgPSAndyc7CgogIGZ1bmN0aW9uIHVwZGF0ZU1vZGVVSSgpIHsKICAgIHZhciBzZWxlY3RlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ubi1nZW4tY2FsLW1vZGUtcmFkaW86Y2hlY2tlZCcpOwogICAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuOwogICAgY3VycmVudE1vZGUgPSBzZWxlY3RlZC52YWx1ZTsKICAgIG1vZGVMYWJlbHMuZm9yRWFjaChmdW5jdGlvbihsYmwpIHsKICAgICAgbGJsLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtbW9kZS1hY3RpdmUnKTsKICAgIH0pOwogICAgdmFyIGFjdGl2ZUxhYmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPSInICsgc2VsZWN0ZWQuaWQgKyAnIl0nKTsKICAgIGlmIChhY3RpdmVMYWJlbCkgewogICAgICBhY3RpdmVMYWJlbC5jbGFzc0xpc3QuYWRkKCdubi1nZW4tY2FsLW1vZGUtYWN0aXZlJyk7CiAgICB9CgogICAgaWYgKGN1cnJlbnRNb2RlID09PSAndycpIHsKICAgICAgbGFiZWxQcmltYXJ5LnRleHRDb250ZW50ID0gJ9Cc0L7Qu9GP0YDQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPIChDKSwg0LzQvtC70Ywv0LsnOwogICAgICBpbnB1dFByaW1hcnkucGxhY2Vob2xkZXIgPSAn0J3QsNC/0YDQuNC80LXRgDogMi4wJzsKICAgICAgcmVzdWx0TWFpbkxhYmVsLnRleHRDb250ZW50ID0gJ9Cc0LDRgdGB0L7QstCw0Y8g0LTQvtC70Y8gKHcpJzsKICAgICAgcmVzdWx0U2Vjb25kYXJ5TGFiZWwudGV4dENvbnRlbnQgPSAn0JzQvtC70Y/RgNC90LDRjyDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y8gKEMpJzsKICAgIH0gZWxzZSB7CiAgICAgIGxhYmVsUHJpbWFyeS50ZXh0Q29udGVudCA9ICfQnNCw0YHRgdC+0LLQsNGPINC00L7Qu9GPICh3KSwgJSc7CiAgICAgIGlucHV0UHJpbWFyeS5wbGFjZWhvbGRlciA9ICfQndCw0L/RgNC40LzQtdGAOiAxMCc7CiAgICAgIHJlc3VsdE1haW5MYWJlbC50ZXh0Q29udGVudCA9ICfQnNC+0LvRj9GA0L3QsNGPINC60L7QvdGG0LXQvdGC0YDQsNGG0LjRjyAoQyknOwogICAgICByZXN1bHRTZWNvbmRhcnlMYWJlbC50ZXh0Q29udGVudCA9ICfQnNCw0YHRgdC+0LLQsNGPINC00L7Qu9GPICh3KSc7CiAgICB9CiAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICByZXNldFJlc3VsdHMoKTsKICB9CgogIGZ1bmN0aW9uIGhpZGVBbGxFcnJvcnMoKSB7CiAgICBbZXJyb3JQcmltYXJ5LCBlcnJvck1vbGFyTWFzcywgZXJyb3JEZW5zaXR5LCBlcnJvclRlbXBlcmF0dXJlXS5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgIGVsLnRleHRDb250ZW50ID0gJyc7CiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogICAgfSk7CiAgICBbaW5wdXRQcmltYXJ5LCBpbnB1dE1vbGFyTWFzcywgaW5wdXREZW5zaXR5LCBpbnB1dFRlbXBlcmF0dXJlXS5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtZmllbGQtZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2hvd0Vycm9yKGVsLCBtc2csIGVycm9yRWwpIHsKICAgIGVsLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtZmllbGQtZXJyb3InKTsKICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBtc2c7CiAgICBlcnJvckVsLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogIH0KCiAgZnVuY3Rpb24gcmVzZXRSZXN1bHRzKCkgewogICAgcmVzdWx0TWFpblZhbHVlLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICByZXN1bHRNYXNzU29sdXRlLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICByZXN1bHRNYXNzU29sdXRpb24udGV4dENvbnRlbnQgPSAn4oCUJzsKICAgIHJlc3VsdFNlY29uZGFyeVZhbHVlLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICBpZiAocmVzdWx0R3JpZCkgcmVzdWx0R3JpZC5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICBpZiAocmVzdWx0RW1wdHkpIHJlc3VsdEVtcHR5LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogIH0KCiAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMobWFpblZhbCwgbWFpblVuaXQsIG1hc3NTb2x1dGUsIG1hc3NTb2x1dGlvbiwgc2Vjb25kYXJ5VmFsLCBzZWNvbmRhcnlVbml0KSB7CiAgICBpZiAocmVzdWx0RW1wdHkpIHJlc3VsdEVtcHR5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBpZiAocmVzdWx0R3JpZCkgcmVzdWx0R3JpZC5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICByZXN1bHRNYWluVmFsdWUudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIobWFpblZhbCk7CiAgICByZXN1bHRNYWluTGFiZWwudGV4dENvbnRlbnQgPSBtYWluVW5pdDsKICAgIHJlc3VsdE1hc3NTb2x1dGUudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIobWFzc1NvbHV0ZSk7CiAgICByZXN1bHRNYXNzU29sdXRpb24udGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIobWFzc1NvbHV0aW9uKTsKICAgIHJlc3VsdFNlY29uZGFyeVZhbHVlLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKHNlY29uZGFyeVZhbCk7CiAgICByZXN1bHRTZWNvbmRhcnlMYWJlbC50ZXh0Q29udGVudCA9IHNlY29uZGFyeVVuaXQ7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXROdW1iZXIodmFsKSB7CiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbCkgfHwgIWlzRmluaXRlKHZhbCkpIHJldHVybiAn4oCUJzsKICAgIGlmIChNYXRoLmFicyh2YWwpIDwgMC4wMDAxICYmIHZhbCAhPT0gMCkgcmV0dXJuIHZhbC50b0V4cG9uZW50aWFsKDQpOwogICAgaWYgKE1hdGguYWJzKHZhbCkgPj0gMTAwMDApIHJldHVybiB2YWwudG9GaXhlZCgyKTsKICAgIGlmIChNYXRoLmFicyh2YWwpID49IDEwMCkgcmV0dXJuIHZhbC50b0ZpeGVkKDMpOwogICAgaWYgKE1hdGguYWJzKHZhbCkgPj0gMSkgcmV0dXJuIHZhbC50b0ZpeGVkKDQpOwogICAgcmV0dXJuIHZhbC50b0ZpeGVkKDYpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVQb3NpdGl2ZShlbCwgZXJyb3JFbCwgbmFtZSkgewogICAgdmFyIHZhbCA9IHBhcnNlRmxvYXQoZWwudmFsdWUpOwogICAgaWYgKGVsLnZhbHVlLnRyaW0oKSA9PT0gJycpIHsKICAgICAgc2hvd0Vycm9yKGVsLCAn0J/QvtC70LUgwqsnICsgbmFtZSArICfCuyDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+INC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRjy4nLCBlcnJvckVsKTsKICAgICAgcmV0dXJuIE5hTjsKICAgIH0KICAgIGlmIChpc05hTih2YWwpKSB7CiAgICAgIHNob3dFcnJvcihlbCwgJ9CS0LLQtdC00LjRgtC1INGH0LjRgdC70L7QstC+0LUg0LfQvdCw0YfQtdC90LjQtSDQsiDQv9C+0LvQtSDCqycgKyBuYW1lICsgJ8K7LicsIGVycm9yRWwpOwogICAgICByZXR1cm4gTmFOOwogICAgfQogICAgaWYgKHZhbCA8PSAwKSB7CiAgICAgIHNob3dFcnJvcihlbCwgJ9CX0L3QsNGH0LXQvdC40LUg0LIg0L/QvtC70LUgwqsnICsgbmFtZSArICfCuyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdGL0Lwg0YfQuNGB0LvQvtC8LicsIGVycm9yRWwpOwogICAgICByZXR1cm4gTmFOOwogICAgfQogICAgcmV0dXJuIHZhbDsKICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlTm9uTmVnYXRpdmUoZWwsIGVycm9yRWwsIG5hbWUpIHsKICAgIHZhciB2YWwgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsKICAgIGlmIChlbC52YWx1ZS50cmltKCkgPT09ICcnKSB7CiAgICAgIHNob3dFcnJvcihlbCwgJ9Cf0L7Qu9C1IMKrJyArIG5hbWUgKyAnwrsg0L7QsdGP0LfQsNGC0LXQu9GM0L3QviDQtNC70Y8g0LfQsNC/0L7Qu9C90LXQvdC40Y8uJywgZXJyb3JFbCk7CiAgICAgIHJldHVybiBOYU47CiAgICB9CiAgICBpZiAoaXNOYU4odmFsKSkgewogICAgICBzaG93RXJyb3IoZWwsICfQktCy0LXQtNC40YLQtSDRh9C40YHQu9C+0LLQvtC1INC30L3QsNGH0LXQvdC40LUg0LIg0L/QvtC70LUgwqsnICsgbmFtZSArICfCuy4nLCBlcnJvckVsKTsKICAgICAgcmV0dXJuIE5hTjsKICAgIH0KICAgIGlmICh2YWwgPCAwKSB7CiAgICAgIHNob3dFcnJvcihlbCwgJ9CX0L3QsNGH0LXQvdC40LUg0LIg0L/QvtC70LUgwqsnICsgbmFtZSArICfCuyDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0LwuJywgZXJyb3JFbCk7CiAgICAgIHJldHVybiBOYU47CiAgICB9CiAgICByZXR1cm4gdmFsOwogIH0KCiAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgewogICAgaGlkZUFsbEVycm9ycygpOwogICAgcmVzZXRSZXN1bHRzKCk7CgogICAgdmFyIG1vbGFyTWFzcyA9IHZhbGlkYXRlUG9zaXRpdmUoaW5wdXRNb2xhck1hc3MsIGVycm9yTW9sYXJNYXNzLCAn0JzQvtC70Y/RgNC90LDRjyDQvNCw0YHRgdCwIChNKScpOwogICAgdmFyIGRlbnNpdHkgPSB2YWxpZGF0ZVBvc2l0aXZlKGlucHV0RGVuc2l0eSwgZXJyb3JEZW5zaXR5LCAn0J/Qu9C+0YLQvdC+0YHRgtGMINGA0LDRgdGC0LLQvtGA0LAgKM+BKScpOwoKICAgIGlmIChpc05hTihtb2xhck1hc3MpIHx8IGlzTmFOKGRlbnNpdHkpKSByZXR1cm47CgogICAgaWYgKGN1cnJlbnRNb2RlID09PSAndycpIHsKICAgICAgdmFyIGNvbmMgPSB2YWxpZGF0ZU5vbk5lZ2F0aXZlKGlucHV0UHJpbWFyeSwgZXJyb3JQcmltYXJ5LCAn0JzQvtC70Y/RgNC90LDRjyDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y8gKEMpJyk7CiAgICAgIGlmIChpc05hTihjb25jKSkgcmV0dXJuOwogICAgICBpZiAoY29uYyA9PT0gMCkgewogICAgICAgIHNob3dSZXN1bHRzKDAsICfQnNCw0YHRgdC+0LLQsNGPINC00L7Qu9GPICh3KScsIDAsIGRlbnNpdHkgKiAxMDAwLCAwLCAn0JzQvtC70Y/RgNC90LDRjyDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y8gKEMpJyk7CiAgICAgICAgcmVzdWx0TWFpblZhbHVlLnRleHRDb250ZW50ID0gJzAnOwogICAgICAgIHJlc3VsdE1hc3NTb2x1dGUudGV4dENvbnRlbnQgPSAnMCc7CiAgICAgICAgcmVzdWx0TWFzc1NvbHV0aW9uLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKGRlbnNpdHkgKiAxMDAwKTsKICAgICAgICByZXN1bHRTZWNvbmRhcnlWYWx1ZS50ZXh0Q29udGVudCA9ICcwJzsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHcgPSAoY29uYyAqIG1vbGFyTWFzcykgLyAoZGVuc2l0eSAqIDEwKTsKICAgICAgaWYgKHcgPiAxMDAuMDAwMSkgewogICAgICAgIHNob3dFcnJvcihpbnB1dFByaW1hcnksICfQn9C+0LvRg9GH0LXQvdC90LDRjyDQvNCw0YHRgdC+0LLQsNGPINC00L7Qu9GPINC/0YDQtdCy0YvRiNCw0LXRgiAxMDAlLiDQn9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC30L3QsNGH0LXQvdC40Y8g4oCUINCy0L7Qt9C80L7QttC90L4sINC/0LvQvtGC0L3QvtGB0YLRjCDQt9Cw0L3QuNC20LXQvdCwINC40LvQuCDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y8g0LfQsNCy0YvRiNC10L3QsC4nLCBlcnJvclByaW1hcnkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWlzRmluaXRlKHcpIHx8IHcgPCAwKSB7CiAgICAgICAgc2hvd0Vycm9yKGlucHV0UHJpbWFyeSwgJ9Cd0LXQutC+0YDRgNC10LrRgtC90YvQuSDRgNC10LfRg9C70YzRgtCw0YIuINCf0YDQvtCy0LXRgNGM0YLQtSDQstCy0LXQtNGR0L3QvdGL0LUg0LTQsNC90L3Ri9C1LicsIGVycm9yUHJpbWFyeSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBtYXNzU29sdXRlID0gY29uYyAqIG1vbGFyTWFzczsKICAgICAgdmFyIG1hc3NTb2x1dGlvbiA9IGRlbnNpdHkgKiAxMDAwOwogICAgICBzaG93UmVzdWx0cyh3LCAn0JzQsNGB0YHQvtCy0LDRjyDQtNC+0LvRjyAodyknLCBtYXNzU29sdXRlLCBtYXNzU29sdXRpb24sIGNvbmMsICfQnNC+0LvRj9GA0L3QsNGPINC60L7QvdGG0LXQvdGC0YDQsNGG0LjRjyAoQyknKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciB3SW5wdXQgPSB2YWxpZGF0ZVBvc2l0aXZlKGlucHV0UHJpbWFyeSwgZXJyb3JQcmltYXJ5LCAn0JzQsNGB0YHQvtCy0LDRjyDQtNC+0LvRjyAodyknKTsKICAgICAgaWYgKGlzTmFOKHdJbnB1dCkpIHJldHVybjsKICAgICAgaWYgKHdJbnB1dCA+IDEwMCkgewogICAgICAgIHNob3dFcnJvcihpbnB1dFByaW1hcnksICfQnNCw0YHRgdC+0LLQsNGPINC00L7Qu9GPINC90LUg0LzQvtC20LXRgiDQv9GA0LXQstGL0YjQsNGC0YwgMTAwJS4g0J/RgNC+0LLQtdGA0YzRgtC1INCy0LLQtdC00ZHQvdC90L7QtSDQt9C90LDRh9C10L3QuNC1LicsIGVycm9yUHJpbWFyeSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb25jUmVzdWx0ID0gKHdJbnB1dCAqIGRlbnNpdHkgKiAxMCkgLyBtb2xhck1hc3M7CiAgICAgIGlmICghaXNGaW5pdGUoY29uY1Jlc3VsdCkgfHwgY29uY1Jlc3VsdCA8IDApIHsKICAgICAgICBzaG93RXJyb3IoaW5wdXRQcmltYXJ5LCAn0J3QtdC60L7RgNGA0LXQutGC0L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRgi4g0J/RgNC+0LLQtdGA0YzRgtC1INCy0LLQtdC00ZHQvdC90YvQtSDQtNCw0L3QvdGL0LUuJywgZXJyb3JQcmltYXJ5KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIG1hc3NTb2x1dGVDID0gY29uY1Jlc3VsdCAqIG1vbGFyTWFzczsKICAgICAgdmFyIG1hc3NTb2x1dGlvbkMgPSBkZW5zaXR5ICogMTAwMDsKICAgICAgc2hvd1Jlc3VsdHMoY29uY1Jlc3VsdCwgJ9Cc0L7Qu9GP0YDQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPIChDKScsIG1hc3NTb2x1dGVDLCBtYXNzU29sdXRpb25DLCB3SW5wdXQsICfQnNCw0YHRgdC+0LLQsNGPINC00L7Qu9GPICh3KScpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzZXRGb3JtKCkgewogICAgaW5wdXRQcmltYXJ5LnZhbHVlID0gJyc7CiAgICBpbnB1dE1vbGFyTWFzcy52YWx1ZSA9ICcnOwogICAgaW5wdXREZW5zaXR5LnZhbHVlID0gJyc7CiAgICBpbnB1dFRlbXBlcmF0dXJlLnZhbHVlID0gJyc7CiAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICByZXNldFJlc3VsdHMoKTsKICAgIGlucHV0UHJpbWFyeS5mb2N1cygpOwogIH0KCiAgbW9kZVJhZGlvcy5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7CiAgICByYWRpby5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgdXBkYXRlTW9kZVVJKCk7CiAgICAgIHJlc2V0UmVzdWx0cygpOwogICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICB9KTsKICB9KTsKCiAgYnRuQ2FsY3VsYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsKICBidG5SZXNldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0Rm9ybSk7CgogIGlucHV0UHJpbWFyeS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlKCk7CiAgICB9CiAgfSk7CiAgaW5wdXRNb2xhck1hc3MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsKICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNhbGN1bGF0ZSgpOwogICAgfQogIH0pOwogIGlucHV0RGVuc2l0eS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlKCk7CiAgICB9CiAgfSk7CiAgaW5wdXRUZW1wZXJhdHVyZS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlKCk7CiAgICB9CiAgfSk7CgogIGlucHV0UHJpbWFyeS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewogICAgaWYgKGVycm9yUHJpbWFyeS5jbGFzc0xpc3QuY29udGFpbnMoJ25uLWdlbi1jYWwtdmlzaWJsZScpKSB7CiAgICAgIGVycm9yUHJpbWFyeS5jbGFzc0xpc3QucmVtb3ZlKCdubi1nZW4tY2FsLXZpc2libGUnKTsKICAgICAgaW5wdXRQcmltYXJ5LmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtZmllbGQtZXJyb3InKTsKICAgIH0KICB9KTsKICBpbnB1dE1vbGFyTWFzcy5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewogICAgaWYgKGVycm9yTW9sYXJNYXNzLmNsYXNzTGlzdC5jb250YWlucygnbm4tZ2VuLWNhbC12aXNpYmxlJykpIHsKICAgICAgZXJyb3JNb2xhck1hc3MuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC12aXNpYmxlJyk7CiAgICAgIGlucHV0TW9sYXJNYXNzLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtZmllbGQtZXJyb3InKTsKICAgIH0KICB9KTsKICBpbnB1dERlbnNpdHkuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHsKICAgIGlmIChlcnJvckRlbnNpdHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdubi1nZW4tY2FsLXZpc2libGUnKSkgewogICAgICBlcnJvckRlbnNpdHkuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC12aXNpYmxlJyk7CiAgICAgIGlucHV0RGVuc2l0eS5jbGFzc0xpc3QucmVtb3ZlKCdubi1nZW4tY2FsLWZpZWxkLWVycm9yJyk7CiAgICB9CiAgfSk7CgogIHVwZGF0ZU1vZGVVSSgpOwogIGlmIChyZXN1bHRFbXB0eSkgcmVzdWx0RW1wdHkuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7Cn0pKCk7Cg==