Калькулятор элементного анализа вещества
Вычислите молекулярную массу, массовые доли элементов и брутто-формулу по введённой химической формуле — быстро, точно и с опорой на табличные атомные массы IUPAC.
0.000
Молярная масса (Mr)
г/моль
Введите формулу и нажмите «Рассчитать», чтобы увидеть результат элементного анализа.
Как пользоваться калькулятором
1
Введите химическую формулу вещества в поле ввода. Используйте стандартную нотацию: элементы с заглавной буквы, индексы — целые числа. Пример: Na2CO3, C2H5OH, Fe2(SO4)3.
2
Нажмите кнопку «Рассчитать». Калькулятор автоматически распознает все элементы, просуммирует их атомные массы с учётом индексов и скобок.
3
Ознакомьтесь с результатом: в карточке справа отобразится молярная масса вещества (в г/моль) и массовая доля каждого элемента в процентах с точностью до трёх десятичных знаков.
4
Для нового расчёта измените формулу и снова нажмите «Рассчитать» либо воспользуйтесь кнопкой «Сбросить», чтобы очистить поле и результаты.
Примеры использования
Глюкоза — C₆H₁₂O₆
Введите C6H12O6. Результат: молярная масса ≈ 180.156 г/моль. Углерод — 40.001%, водород — 6.714%, кислород — 53.285%.
Сульфат железа(III) — Fe₂(SO₄)₃
Введите Fe2(SO4)3. Результат: молярная масса ≈ 399.858 г/моль. Железо — 27.931%, сера — 24.057%, кислород — 48.012%.
Питьевая сода — NaHCO₃
Введите NaHCO3. Результат: молярная масса ≈ 84.007 г/моль. Натрий — 27.367%, водород — 1.200%, углерод — 14.297%, кислород — 57.136%.
Важные нюансы
- Калькулятор поддерживает круглые и квадратные скобки для группировки атомов:
Ca3(PO4)2, K4[Fe(CN)6]. Вложенность скобок не ограничена.
- Индексы должны быть целыми положительными числами. Дробные индексы (например, в нестехиометрических соединениях) не поддерживаются — формула должна отражать брутто-состав.
- Гидраты и аддукты можно вводить через знак
. (точка) или отдельно: например, CuSO4.5H2O — калькулятор корректно учтёт воду в общей массе.
- Все атомные массы взяты из базы данных IUPAC / NIST и соответствуют стандартным атомным весам элементов для земной коры. Для искусственных элементов используются массовые числа наиболее стабильного изотопа.
- Результат нотит теоретический элементный состав чистого вещества. Реальные образцы могут содержать примеси, изотопные отклонения или кристаллизационную воду — учитывайте это при интерпретации лабораторных данных.
Источники данных
- IUPAC Gold Book — Международный союз теоретической и прикладной химии. Стандартные атомные веса элементов (Standard Atomic Weights).
- NIST Chemistry WebBook — Национальный институт стандартов и технологий США. Таблицы атомных масс и термодинамических констант.
- PubChem — Открытая химическая база данных Национальной медицинской библиотеки США. Молярные массы и свойства соединений.
- CRC Handbook of Chemistry and Physics — Фундаментальный справочник химических и физических констант (104-е издание).
- Для радиоактивных и искусственных элементов использованы массовые числа наиболее долгоживущего изотопа согласно IAEA Nuclear Data Services.
Калькулятор элементного анализа — незаменимый инструмент для студентов, преподавателей, химиков-аналитиков и специалистов лабораторной диагностики. Он позволяет за секунды определить молярную массу вещества по его брутто-формуле и вычислить процентный состав каждого элемента с точностью до трёх десятичных знаков. Алгоритм опирается на официальные атомные массы, рекомендованные IUPAC и NIST, что обеспечивает высокую достоверность результатов. Встроенный парсер корректно обрабатывает скобки любой вложенности, гидраты и комплексные соединения, делая расчёты максимально удобными и наглядными.
CiAgKGZ1bmN0aW9uKCkgewogICAgY29uc3QgQVRPTUlDX01BU1NFUyA9IHsKICAgICAgIkgiOiAxLjAwOCwgIkhlIjogNC4wMDI2LCAiTGkiOiA2Ljk0LCAiQmUiOiA5LjAxMjIsICJCIjogMTAuODEsCiAgICAgICJDIjogMTIuMDExLCAiTiI6IDE0LjAwNywgIk8iOiAxNS45OTksICJGIjogMTguOTk4LCAiTmUiOiAyMC4xODAsCiAgICAgICJOYSI6IDIyLjk5MCwgIk1nIjogMjQuMzA1LCAiQWwiOiAyNi45ODIsICJTaSI6IDI4LjA4NSwgIlAiOiAzMC45NzQsCiAgICAgICJTIjogMzIuMDYsICJDbCI6IDM1LjQ1LCAiQXIiOiAzOS45NDgsICJLIjogMzkuMDk4LCAiQ2EiOiA0MC4wNzgsCiAgICAgICJTYyI6IDQ0Ljk1NiwgIlRpIjogNDcuODY3LCAiViI6IDUwLjk0MiwgIkNyIjogNTEuOTk2LCAiTW4iOiA1NC45MzgsCiAgICAgICJGZSI6IDU1Ljg0NSwgIkNvIjogNTguOTMzLCAiTmkiOiA1OC42OTMsICJDdSI6IDYzLjU0NiwgIlpuIjogNjUuMzgsCiAgICAgICJHYSI6IDY5LjcyMywgIkdlIjogNzIuNjMwLCAiQXMiOiA3NC45MjIsICJTZSI6IDc4Ljk3MSwgIkJyIjogNzkuOTA0LAogICAgICAiS3IiOiA4My43OTgsICJSYiI6IDg1LjQ2OCwgIlNyIjogODcuNjIsICJZIjogODguOTA2LCAiWnIiOiA5MS4yMjQsCiAgICAgICJOYiI6IDkyLjkwNiwgIk1vIjogOTUuOTUsICJUYyI6IDk3LjkwNywgIlJ1IjogMTAxLjA3LCAiUmgiOiAxMDIuOTEsCiAgICAgICJQZCI6IDEwNi40MiwgIkFnIjogMTA3Ljg3LCAiQ2QiOiAxMTIuNDEsICJJbiI6IDExNC44MiwgIlNuIjogMTE4LjcxLAogICAgICAiU2IiOiAxMjEuNzYsICJUZSI6IDEyNy42MCwgIkkiOiAxMjYuOTAsICJYZSI6IDEzMS4yOSwgIkNzIjogMTMyLjkxLAogICAgICAiQmEiOiAxMzcuMzMsICJMYSI6IDEzOC45MSwgIkNlIjogMTQwLjEyLCAiUHIiOiAxNDAuOTEsICJOZCI6IDE0NC4yNCwKICAgICAgIlBtIjogMTQ0LjkxLCAiU20iOiAxNTAuMzYsICJFdSI6IDE1MS45NiwgIkdkIjogMTU3LjI1LCAiVGIiOiAxNTguOTMsCiAgICAgICJEeSI6IDE2Mi41MCwgIkhvIjogMTY0LjkzLCAiRXIiOiAxNjcuMjYsICJUbSI6IDE2OC45MywgIlliIjogMTczLjA1LAogICAgICAiTHUiOiAxNzQuOTcsICJIZiI6IDE3OC40OSwgIlRhIjogMTgwLjk1LCAiVyI6IDE4My44NCwgIlJlIjogMTg2LjIxLAogICAgICAiT3MiOiAxOTAuMjMsICJJciI6IDE5Mi4yMiwgIlB0IjogMTk1LjA4LCAiQXUiOiAxOTYuOTcsICJIZyI6IDIwMC41OSwKICAgICAgIlRsIjogMjA0LjM4LCAiUGIiOiAyMDcuMiwgIkJpIjogMjA4Ljk4LCAiUG8iOiAyMDguOTgsICJBdCI6IDIwOS45OSwKICAgICAgIlJuIjogMjIyLjAyLCAiRnIiOiAyMjMuMDIsICJSYSI6IDIyNi4wMywgIkFjIjogMjI3LjAzLCAiVGgiOiAyMzIuMDQsCiAgICAgICJQYSI6IDIzMS4wNCwgIlUiOiAyMzguMDMsICJOcCI6IDIzNy4wNSwgIlB1IjogMjQ0LjA2LCAiQW0iOiAyNDMuMDYsCiAgICAgICJDbSI6IDI0Ny4wNywgIkJrIjogMjQ3LjA3LCAiQ2YiOiAyNTEuMDgsICJFcyI6IDI1Mi4wOCwgIkZtIjogMjU3LjEwLAogICAgICAiTWQiOiAyNTguMTAsICJObyI6IDI1OS4xMCwgIkxyIjogMjYyLjExLCAiUmYiOiAyNjcuMTIsICJEYiI6IDI2OC4xMywKICAgICAgIlNnIjogMjcxLjEzLCAiQmgiOiAyNzQuMTQsICJIcyI6IDI3Ny4xNSwgIk10IjogMjc4LjE2LCAiRHMiOiAyODEuMTcsCiAgICAgICJSZyI6IDI4Mi4xNywgIkNuIjogMjg1LjE4LCAiTmgiOiAyODYuMTksICJGbCI6IDI4OS4xOSwgIk1jIjogMjkwLjIwLAogICAgICAiTHYiOiAyOTMuMjAsICJUcyI6IDI5NC4yMSwgIk9nIjogMjk1LjIxCiAgICB9OwoKICAgIGNvbnN0IGZvcm11bGFJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtdWxhLWlucHV0Jyk7CiAgICBjb25zdCBjYWxjQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGMtYnRuJyk7CiAgICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1idG4nKTsKICAgIGNvbnN0IGVycm9yU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtdWxhLWVycm9yJyk7CiAgICBjb25zdCByZXN1bHRDYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1jYXJkJyk7CiAgICBjb25zdCByZXN1bHRQbGFjZWhvbGRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtcGxhY2Vob2xkZXInKTsKICAgIGNvbnN0IG1vbGFyTWFzc1ZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vbGFyLW1hc3MtdmFsdWUnKTsKICAgIGNvbnN0IHJlc3VsdEdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWdyaWQnKTsKCiAgICBmdW5jdGlvbiBub3JtYWxpemVGb3JtdWxhKHN0cikgewogICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xzKy9nLCAnJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9be10vZywgJygnKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL1t9XS9nLCAnKScpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1tdL2csICcoJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXF1dL2csICcpJyk7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VGb3JtdWxhU2VnbWVudChmb3JtdWxhLCBzdGFydEluZGV4LCBwYXJzZU11bHRpcGxpZXIpIHsKICAgICAgY29uc3QgY291bnRzID0ge307CiAgICAgIGxldCBpID0gc3RhcnRJbmRleDsKICAgICAgY29uc3QgbGVuID0gZm9ybXVsYS5sZW5ndGg7CgogICAgICB3aGlsZSAoaSA8IGxlbiAmJiBmb3JtdWxhW2ldICE9PSAnKScpIHsKICAgICAgICBpZiAoZm9ybXVsYVtpXSA9PT0gJygnKSB7CiAgICAgICAgICBpKys7CiAgICAgICAgICBjb25zdCBzdWJDb3VudHMgPSBwYXJzZUZvcm11bGFTZWdtZW50KGZvcm11bGEsIGksIHBhcnNlTXVsdGlwbGllcik7CiAgICAgICAgICBpID0gc3ViQ291bnRzLmVuZEluZGV4ICsgMTsKICAgICAgICAgIGNvbnN0IG11bHQgPSByZWFkTnVtYmVyKGZvcm11bGEsIGksIHBhcnNlTXVsdGlwbGllcik7CiAgICAgICAgICBpID0gbXVsdC5lbmRJbmRleDsKICAgICAgICAgIG11bHRpcGx5Q291bnRzKHN1YkNvdW50cy5jb3VudHMsIG11bHQudmFsdWUpOwogICAgICAgICAgbWVyZ2VDb3VudHMoY291bnRzLCBzdWJDb3VudHMuY291bnRzKTsKICAgICAgICB9IGVsc2UgaWYgKC9bQS1aXS8udGVzdChmb3JtdWxhW2ldKSkgewogICAgICAgICAgbGV0IGVsZW0gPSBmb3JtdWxhW2ldOwogICAgICAgICAgaSsrOwogICAgICAgICAgaWYgKGkgPCBsZW4gJiYgL1thLXpdLy50ZXN0KGZvcm11bGFbaV0pKSB7CiAgICAgICAgICAgIGVsZW0gKz0gZm9ybXVsYVtpXTsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgbXVsdCA9IHJlYWROdW1iZXIoZm9ybXVsYSwgaSwgcGFyc2VNdWx0aXBsaWVyKTsKICAgICAgICAgIGkgPSBtdWx0LmVuZEluZGV4OwogICAgICAgICAgY29uc3QgdG90YWxNdWx0ID0gbXVsdC52YWx1ZSAqIHBhcnNlTXVsdGlwbGllcjsKICAgICAgICAgIGNvdW50c1tlbGVtXSA9IChjb3VudHNbZWxlbV0gfHwgMCkgKyB0b3RhbE11bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB7IGNvdW50cywgZW5kSW5kZXg6IGkgfTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkTnVtYmVyKGZvcm11bGEsIHN0YXJ0SW5kZXgsIGRlZmF1bHRWYWwpIHsKICAgICAgbGV0IG51bVN0ciA9ICcnOwogICAgICBsZXQgaSA9IHN0YXJ0SW5kZXg7CiAgICAgIHdoaWxlIChpIDwgZm9ybXVsYS5sZW5ndGggJiYgL1xkLy50ZXN0KGZvcm11bGFbaV0pKSB7CiAgICAgICAgbnVtU3RyICs9IGZvcm11bGFbaV07CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gbnVtU3RyLmxlbmd0aCA+IDAgPyBwYXJzZUludChudW1TdHIsIDEwKSA6IGRlZmF1bHRWYWw7CiAgICAgIHJldHVybiB7IHZhbHVlLCBlbmRJbmRleDogaSB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG11bHRpcGx5Q291bnRzKGNvdW50cywgZmFjdG9yKSB7CiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvdW50cykgewogICAgICAgIGlmIChjb3VudHMuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgY291bnRzW2tleV0gKj0gZmFjdG9yOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG1lcmdlQ291bnRzKHRhcmdldCwgc291cmNlKSB7CiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkgewogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSAodGFyZ2V0W2tleV0gfHwgMCkgKyBzb3VyY2Vba2V5XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZUZ1bGxGb3JtdWxhKGZvcm11bGEpIHsKICAgICAgY29uc3QgY291bnRzID0ge307CiAgICAgIGxldCBpID0gMDsKICAgICAgY29uc3QgbGVuID0gZm9ybXVsYS5sZW5ndGg7CgogICAgICB3aGlsZSAoaSA8IGxlbikgewogICAgICAgIGlmIChmb3JtdWxhW2ldID09PSAnKCcpIHsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGNvbnN0IHN1YiA9IHBhcnNlRm9ybXVsYVNlZ21lbnQoZm9ybXVsYSwgaSwgMSk7CiAgICAgICAgICBpID0gc3ViLmVuZEluZGV4ICsgMTsKICAgICAgICAgIGNvbnN0IG11bHQgPSByZWFkTnVtYmVyKGZvcm11bGEsIGksIDEpOwogICAgICAgICAgaSA9IG11bHQuZW5kSW5kZXg7CiAgICAgICAgICBtdWx0aXBseUNvdW50cyhzdWIuY291bnRzLCBtdWx0LnZhbHVlKTsKICAgICAgICAgIG1lcmdlQ291bnRzKGNvdW50cywgc3ViLmNvdW50cyk7CiAgICAgICAgfSBlbHNlIGlmICgvW0EtWl0vLnRlc3QoZm9ybXVsYVtpXSkpIHsKICAgICAgICAgIGxldCBlbGVtID0gZm9ybXVsYVtpXTsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGlmIChpIDwgbGVuICYmIC9bYS16XS8udGVzdChmb3JtdWxhW2ldKSkgewogICAgICAgICAgICBlbGVtICs9IGZvcm11bGFbaV07CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG11bHQgPSByZWFkTnVtYmVyKGZvcm11bGEsIGksIDEpOwogICAgICAgICAgaSA9IG11bHQuZW5kSW5kZXg7CiAgICAgICAgICBjb3VudHNbZWxlbV0gPSAoY291bnRzW2VsZW1dIHx8IDApICsgbXVsdC52YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKGZvcm11bGFbaV0gPT09ICcuJykgewogICAgICAgICAgaSsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gY291bnRzOwogICAgfQoKICAgIGZ1bmN0aW9uIHZhbGlkYXRlQW5kQ2FsY3VsYXRlKCkgewogICAgICBlcnJvclNwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZXJyb3JTcGFuLnRleHRDb250ZW50ID0gJyc7CgogICAgICBjb25zdCByYXdGb3JtdWxhID0gZm9ybXVsYUlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgaWYgKCFyYXdGb3JtdWxhKSB7CiAgICAgICAgZXJyb3JTcGFuLnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INGF0LjQvNC40YfQtdGB0LrRg9GOINGE0L7RgNC80YPQu9GDLic7CiAgICAgICAgZXJyb3JTcGFuLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgIGhpZGVSZXN1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVGb3JtdWxhKHJhd0Zvcm11bGEpOwoKICAgICAgaWYgKCEvXltBLVphLXowLTkoKS5dKyQvLnRlc3Qobm9ybWFsaXplZCkpIHsKICAgICAgICBlcnJvclNwYW4udGV4dENvbnRlbnQgPSAn0KTQvtGA0LzRg9C70LAg0YHQvtC00LXRgNC20LjRgiDQvdC10LTQvtC/0YPRgdGC0LjQvNGL0LUg0YHQuNC80LLQvtC70YsuINCg0LDQt9GA0LXRiNC10L3RiyDRgtC+0LvRjNC60L4g0LvQsNGC0LjQvdGB0LrQuNC1INCx0YPQutCy0YssINGG0LjRhNGA0YssINC60YDRg9Cz0LvRi9C1INC4INC60LLQsNC00YDQsNGC0L3Ri9C1INGB0LrQvtCx0LrQuCwg0YLQvtGH0LrQsC4nOwogICAgICAgIGVycm9yU3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICBoaWRlUmVzdWx0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoIS9bQS1aXS8udGVzdChub3JtYWxpemVkKSkgewogICAgICAgIGVycm9yU3Bhbi50ZXh0Q29udGVudCA9ICfQkiDRhNC+0YDQvNGD0LvQtSDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0YXQvtGC0Y8g0LHRiyDQvtC00LjQvSDRhdC40LzQuNGH0LXRgdC60LjQuSDRjdC70LXQvNC10L3RgiAo0LfQsNCz0LvQsNCy0L3QsNGPINC70LDRgtC40L3RgdC60LDRjyDQsdGD0LrQstCwKS4nOwogICAgICAgIGVycm9yU3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICBoaWRlUmVzdWx0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBsZXQgY291bnRzOwogICAgICB0cnkgewogICAgICAgIGNvdW50cyA9IHBhcnNlRnVsbEZvcm11bGEobm9ybWFsaXplZCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBlcnJvclNwYW4udGV4dENvbnRlbnQgPSAn0J7RiNC40LHQutCwINC/0YDQuCDRgNCw0LfQsdC+0YDQtSDRhNC+0YDQvNGD0LvRiy4g0J/RgNC+0LLQtdGA0YzRgtC1INC/0YDQsNCy0LjQu9GM0L3QvtGB0YLRjCDRgdC60L7QsdC+0Log0Lgg0LjQvdC00LXQutGB0L7Qsi4nOwogICAgICAgIGVycm9yU3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICBoaWRlUmVzdWx0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBlbGVtZW50RW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cyk7CiAgICAgIGlmIChlbGVtZW50RW50cmllcy5sZW5ndGggPT09IDApIHsKICAgICAgICBlcnJvclNwYW4udGV4dENvbnRlbnQgPSAn0J3QtSDRg9C00LDQu9C+0YHRjCDQuNC30LLQu9C10YfRjCDQvdC4INC+0LTQvdC+0LPQviDRjdC70LXQvNC10L3RgtCwINC40Lcg0YTQvtGA0LzRg9C70YsuINCf0YDQvtCy0LXRgNGM0YLQtSDQstCy0L7QtC4nOwogICAgICAgIGVycm9yU3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICBoaWRlUmVzdWx0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBsZXQgdW5rbm93bkVsZW1lbnRzID0gW107CiAgICAgIGxldCB0b3RhbE1hc3MgPSAwOwogICAgICBjb25zdCBlbGVtZW50RGF0YSA9IFtdOwoKICAgICAgZm9yIChjb25zdCBbZWxlbSwgY291bnRdIG9mIGVsZW1lbnRFbnRyaWVzKSB7CiAgICAgICAgY29uc3QgYXRvbWljTWFzcyA9IEFUT01JQ19NQVNTRVNbZWxlbV07CiAgICAgICAgaWYgKGF0b21pY01hc3MgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdW5rbm93bkVsZW1lbnRzLnB1c2goZWxlbSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWFzc0NvbnRyaWJ1dGlvbiA9IGNvdW50ICogYXRvbWljTWFzczsKICAgICAgICB0b3RhbE1hc3MgKz0gbWFzc0NvbnRyaWJ1dGlvbjsKICAgICAgICBlbGVtZW50RGF0YS5wdXNoKHsgZWxlbSwgY291bnQsIGF0b21pY01hc3MsIG1hc3NDb250cmlidXRpb24gfSk7CiAgICAgIH0KCiAgICAgIGlmICh1bmtub3duRWxlbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgIGVycm9yU3Bhbi50ZXh0Q29udGVudCA9ICfQndC10LjQt9Cy0LXRgdGC0L3Ri9C5INGN0LvQtdC80LXQvdGCKNGLKTogJyArIHVua25vd25FbGVtZW50cy5qb2luKCcsICcpICsgJy4g0J/RgNC+0LLQtdGA0YzRgtC1INC/0YDQsNCy0LjQu9GM0L3QvtGB0YLRjCDQvtCx0L7Qt9C90LDRh9C10L3QuNC5Lic7CiAgICAgICAgZXJyb3JTcGFuLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgIGhpZGVSZXN1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICh0b3RhbE1hc3MgPD0gMCkgewogICAgICAgIGVycm9yU3Bhbi50ZXh0Q29udGVudCA9ICfQnNC+0LvRj9GA0L3QsNGPINC80LDRgdGB0LAg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC90YPQu9C10LLQvtC5LiDQn9GA0L7QstC10YDRjNGC0LUg0YTQvtGA0LzRg9C70YMuJzsKICAgICAgICBlcnJvclNwYW4uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgaGlkZVJlc3VsdCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZGlzcGxheVJlc3VsdCh0b3RhbE1hc3MsIGVsZW1lbnREYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwbGF5UmVzdWx0KHRvdGFsTWFzcywgZWxlbWVudERhdGEpIHsKICAgICAgbW9sYXJNYXNzVmFsdWUudGV4dENvbnRlbnQgPSB0b3RhbE1hc3MudG9GaXhlZCgzKTsKCiAgICAgIHJlc3VsdEdyaWQuaW5uZXJIVE1MID0gJyc7CgogICAgICBjb25zdCBzb3J0ZWREYXRhID0gWy4uLmVsZW1lbnREYXRhXS5zb3J0KChhLCBiKSA9PiBiLm1hc3NDb250cmlidXRpb24gLSBhLm1hc3NDb250cmlidXRpb24pOwoKICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHNvcnRlZERhdGEpIHsKICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKGl0ZW0ubWFzc0NvbnRyaWJ1dGlvbiAvIHRvdGFsTWFzcyAqIDEwMCkudG9GaXhlZCgzKTsKCiAgICAgICAgY29uc3QgaXRlbURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGl0ZW1EaXYuY2xhc3NOYW1lID0gJ25uLWdlbi1jYWwtcmVzdWx0LWl0ZW0nOwoKICAgICAgICBjb25zdCB2YWx1ZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHZhbHVlRGl2LmNsYXNzTmFtZSA9ICdubi1nZW4tY2FsLXJlc3VsdC12YWx1ZSc7CiAgICAgICAgdmFsdWVEaXYudGV4dENvbnRlbnQgPSBwZXJjZW50YWdlICsgJyUnOwoKICAgICAgICBjb25zdCBsYWJlbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGxhYmVsRGl2LmNsYXNzTmFtZSA9ICdubi1nZW4tY2FsLXJlc3VsdC1sYWJlbCc7CiAgICAgICAgbGFiZWxEaXYudGV4dENvbnRlbnQgPSBpdGVtLmVsZW07CgogICAgICAgIGNvbnN0IHVuaXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICB1bml0RGl2LmNsYXNzTmFtZSA9ICdubi1nZW4tY2FsLXJlc3VsdC11bml0JzsKICAgICAgICB1bml0RGl2LnRleHRDb250ZW50ID0gaXRlbS5jb3VudCArICcg0LDRgi4gw5cgJyArIGl0ZW0uYXRvbWljTWFzcy50b0ZpeGVkKDMpOwoKICAgICAgICBpdGVtRGl2LmFwcGVuZENoaWxkKHZhbHVlRGl2KTsKICAgICAgICBpdGVtRGl2LmFwcGVuZENoaWxkKGxhYmVsRGl2KTsKICAgICAgICBpdGVtRGl2LmFwcGVuZENoaWxkKHVuaXREaXYpOwoKICAgICAgICByZXN1bHRHcmlkLmFwcGVuZENoaWxkKGl0ZW1EaXYpOwogICAgICB9CgogICAgICByZXN1bHRQbGFjZWhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICByZXN1bHRDYXJkLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlUmVzdWx0KCkgewogICAgICByZXN1bHRDYXJkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIHJlc3VsdFBsYWNlaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgbW9sYXJNYXNzVmFsdWUudGV4dENvbnRlbnQgPSAnMC4wMDAnOwogICAgICByZXN1bHRHcmlkLmlubmVySFRNTCA9ICcnOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc2V0QWxsKCkgewogICAgICBmb3JtdWxhSW5wdXQudmFsdWUgPSAnJzsKICAgICAgZXJyb3JTcGFuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIGVycm9yU3Bhbi50ZXh0Q29udGVudCA9ICcnOwogICAgICBoaWRlUmVzdWx0KCk7CiAgICB9CgogICAgY2FsY0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHZhbGlkYXRlQW5kQ2FsY3VsYXRlKTsKCiAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0QWxsKTsKCiAgICBmb3JtdWxhSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHZhbGlkYXRlQW5kQ2FsY3VsYXRlKCk7CiAgICAgIH0KICAgIH0pOwoKICAgIGhpZGVSZXN1bHQoKTsKICB9KSgpOwo=