Калькулятор буфера по уравнению Хендерсона-Хассельбаха
Рассчитайте pH буферного раствора, зная pKa кислоты и соотношение концентраций сопряжённого основания и кислоты, или подберите компоненты для получения нужного pH.
—
[HA] — концентрация кислоты
моль/л
—
[A⁻] — концентрация основания
моль/л
Как пользоваться калькулятором
1
Выберите способ задания pKa: введите значение вручную (например, 4.76 для ацетатного буфера) или выберите кислоту из выпадающего списка — pKa подставится автоматически. Для биологических буферов (MES, HEPES, Tris) значения даны для 25°C.
2
Укажите соотношение концентраций основания и кислоты [A⁻] / [HA]. Для равных концентраций введите 1. Если основание в избытке — число больше 1 (например, 10), если кислота преобладает — меньше 1 (например, 0.1).
3
Опционально укажите абсолютные концентрации кислоты [HA] и основания [A⁻] в моль/л. Если они заданы, калькулятор вычислит соотношение автоматически и покажет обе концентрации в результатах.
4
Нажмите «Рассчитать». Результат покажет pH, pOH, десятичный логарифм соотношения и, при наличии данных, абсолютные концентрации компонентов. Кнопка «Сбросить» очищает все поля.
Примеры использования
Ацетатный буфер с равными концентрациями
pKa уксусной кислоты = 4.76. Соотношение [CH₃COO⁻] / [CH₃COOH] = 1 (по 0.1 моль/л каждого). Результат: pH = 4.76 + log₁₀(1) = 4.76. Такой буфер используют для калибровки pH-метров.
Фосфатный буфер для физиологического pH
Система H₂PO₄⁻ / HPO₄²⁻, pKa = 7.21. Нужен pH ≈ 7.4 (кровь). Требуемое соотношение: [HPO₄²⁻] / [H₂PO₄⁻] = 10^(7.4 − 7.21) = 10^0.19 ≈ 1.55. Введите 1.55 в поле соотношения — получите pH ≈ 7.4.
Трис-буфер для биохимии
Tris (pKa = 8.07 при 25°C). Для получения pH = 8.0 соотношение [Tris] / [Tris-H⁺] = 10^(8.0 − 8.07) = 10^(−0.07) ≈ 0.85. Введите 0.85 — калькулятор покажет pH ≈ 8.0.
Важные нюансы
- Уравнение Хендерсона-Хассельбаха справедливо для разбавленных водных растворов (концентрации до ≈ 0.1–0.5 моль/л). При высоких концентрациях нужно учитывать коэффициенты активности ионов — формула даёт приблизительный результат.
- Значение pKa зависит от температуры. Например, pKa Tris меняется примерно на −0.028 ед./°C. Всегда проверяйте, при какой температуре указано табличное значение pKa, и при необходимости корректируйте его вручную.
- Буферная ёмкость максимальна, когда соотношение [A⁻]/[HA] близко к 1 (pH ≈ pKa). Эффективный диапазон буферирования: pH = pKa ± 1. Выход за пределы pKa ± 1.5 делает буфер малоэффективным.
- Если вы задаёте и соотношение, и абсолютные концентрации — калькулятор проверит их согласованность. При расхождении приоритет отдаётся явно введённому соотношению, а концентрации используются для справки.
- Для летучих компонентов (например, CO₂/HCO₃⁻ в открытых системах) равновесие зависит от парциального давления газа. Данный калькулятор предполагает закрытую систему без газообмена.
Формулы расчёта
Основное уравнение и вспомогательные соотношения, используемые в калькуляторе:
pH = pKa + log₁₀([A⁻] / [HA])
pOH = 14 − pH
logRatio = log₁₀([A⁻] / [HA])
Если заданы [HA] и [A⁻] в моль/л: соотношение = [A⁻] / [HA]
pKa = −log₁₀(Ka), где Ka — константа кислотной диссоциации. При 25°C ионное произведение воды Kw = 1.0 × 10⁻¹⁴, откуда pH + pOH = 14.
⚠ Предупреждение по технике безопасности: При приготовлении буферных растворов используйте средства индивидуальной защиты (перчатки, очки, халат). Некоторые буферные компоненты (например, фтороводородная кислота HF, концентрированные фосфаты, азид натрия в коммерческих буферах) токсичны или едки. Работайте под вытяжкой при использовании летучих кислот и оснований. Всегда сверяйтесь с паспортами безопасности (SDS) конкретных реактивов.
Источники данных
- CRC Handbook of Chemistry and Physics (104th Edition, 2023–2024) — справочные значения pKa неорганических и органических кислот, включая температурные зависимости. CRC Press / Taylor & Francis.
- NIST Chemistry WebBook (National Institute of Standards and Technology, USA) — термодинамические данные, константы диссоциации для широкого круга соединений. Доступ: webbook.nist.gov.
- IUPAC Gold Book (International Union of Pure and Applied Chemistry) — определения pKa, Ka, буферной ёмкости и уравнения Хендерсона-Хассельбаха. Доступ: goldbook.iupac.org.
- PubChem (National Library of Medicine, NIH, USA) — физико-химические свойства веществ, включая экспериментальные и предсказанные значения pKa. Доступ: pubchem.ncbi.nlm.nih.gov.
Для биологических буферов (MES, HEPES, MOPS, PIPES, Tris) значения pKa взяты из стандартных спецификаций производителей и согласованы с данными NIST. Расчёт pH по уравнению Хендерсона-Хассельбаха основан на классических положениях физической химии, изложенных в вузовских учебниках (например, Atkins P.W. "Physical Chemistry").
Калькулятор буфера по уравнению Хендерсона-Хассельбаха — это онлайн-инструмент для быстрого расчёта pH буферных растворов. Он использует классическое соотношение pH = pKa + log₁₀([A⁻]/[HA]), связывающее константу диссоциации кислоты с концентрациями сопряжённого основания и кислоты. Вы можете ввести pKa вручную или выбрать кислоту из встроенного справочника, включающего неорганические, органические и биологические буферные системы. Инструмент будет полезен студентам химических и биологических специальностей, лаборантам, научным сотрудникам и фармацевтам при приготовлении растворов с заданным уровнем кислотности.
Помимо pH, калькулятор определяет pOH, логарифм соотношения концентраций и, опционально, абсолютные концентрации компонентов в моль/л. Встроенные примеры помогут разобраться с типовыми задачами — от ацетатного буфера до фосфатных и трис-буферных систем, широко применяемых в биохимии. Все справочные данные основаны на авторитетных источниках: CRC Handbook, NIST Chemistry WebBook и стандартах IUPAC.
CiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCBwa2FNb2RlUmFkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0icGthTW9kZSJdJyk7CiAgICAgICAgICAgIGNvbnN0IG1hbnVhbFBrYVdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFudWFsUGthV3JhcHBlcicpOwogICAgICAgICAgICBjb25zdCBzZWxlY3RQa2FXcmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdFBrYVdyYXBwZXInKTsKICAgICAgICAgICAgY29uc3QgYWNpZFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2lkU2VsZWN0Jyk7CiAgICAgICAgICAgIGNvbnN0IHBrYVZhbHVlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGthVmFsdWUnKTsKICAgICAgICAgICAgY29uc3QgcmF0aW9JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYXRpb0FCJyk7CiAgICAgICAgICAgIGNvbnN0IGNvbmNIQUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmNIQScpOwogICAgICAgICAgICBjb25zdCBjb25jQUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmNBJyk7CiAgICAgICAgICAgIGNvbnN0IGNhbGNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsY0J0bicpOwogICAgICAgICAgICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldEJ0bicpOwoKICAgICAgICAgICAgY29uc3QgcGthRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGthRXJyb3InKTsKICAgICAgICAgICAgY29uc3Qgc2VsZWN0RXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0RXJyb3InKTsKICAgICAgICAgICAgY29uc3QgcmF0aW9FcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYXRpb0Vycm9yJyk7CiAgICAgICAgICAgIGNvbnN0IGNvbmNIQUVycm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmNIQUVycm9yJyk7CiAgICAgICAgICAgIGNvbnN0IGNvbmNBRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uY0FFcnJvcicpOwogICAgICAgICAgICBjb25zdCBnZW5lcmFsRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhbEVycm9yJyk7CgogICAgICAgICAgICBjb25zdCByZXNQaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNQaCcpOwogICAgICAgICAgICBjb25zdCByZXNQb2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzUG9oJyk7CiAgICAgICAgICAgIGNvbnN0IHJlc0xvZ1JhdGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc0xvZ1JhdGlvJyk7CiAgICAgICAgICAgIGNvbnN0IHJlc0NvbmNIQSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNDb25jSEEnKTsKICAgICAgICAgICAgY29uc3QgcmVzQ29uY0EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzQ29uY0EnKTsKICAgICAgICAgICAgY29uc3QgY29uY1Jvd0hhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmNSb3dIYScpOwogICAgICAgICAgICBjb25zdCBjb25jUm93QSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25jUm93QScpOwogICAgICAgICAgICBjb25zdCByZXNTdW1tYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc1N1bW1hcnknKTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGhpZGVBbGxFcnJvcnMoKSB7CiAgICAgICAgICAgICAgICBbcGthRXJyb3IsIHNlbGVjdEVycm9yLCByYXRpb0Vycm9yLCBjb25jSEFFcnJvciwgY29uY0FFcnJvciwgZ2VuZXJhbEVycm9yXS5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSBlbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc2hvd0Vycm9yKGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwpIGVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gdG9nZ2xlUGthTW9kZSgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJwa2FNb2RlIl06Y2hlY2tlZCcpOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlKSByZXR1cm47CiAgICAgICAgICAgICAgICBpZiAobW9kZS52YWx1ZSA9PT0gJ21hbnVhbCcpIHsKICAgICAgICAgICAgICAgICAgICBtYW51YWxQa2FXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtaGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0UGthV3JhcHBlci5jbGFzc0xpc3QuYWRkKCdubi1nZW4tY2FsLWhpZGRlbicpOwogICAgICAgICAgICAgICAgICAgIGFjaWRTZWxlY3QudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RFcnJvci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1hbnVhbFBrYVdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RQa2FXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtaGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgcGthVmFsdWVJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgICAgIHBrYUVycm9yLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhpZGVBbGxFcnJvcnMoKTsKICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwa2FNb2RlUmFkaW9zLmZvckVhY2goZnVuY3Rpb24ocmFkaW8pIHsKICAgICAgICAgICAgICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRvZ2dsZVBrYU1vZGUpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGFjaWRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoYWNpZFNlbGVjdC52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdEVycm9yLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBmdW5jdGlvbiBnZXRQa2EoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT0icGthTW9kZSJdOmNoZWNrZWQnKTsKICAgICAgICAgICAgICAgIGlmICghbW9kZSkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICBpZiAobW9kZS52YWx1ZSA9PT0gJ21hbnVhbCcpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXcgPSBwa2FWYWx1ZUlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmF3ID09PSAnJykgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChyYXcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWwpIHx8IHZhbCA8IC0yIHx8IHZhbCA+IDE2KSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUZsb2F0KGFjaWRTZWxlY3QudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWwpKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBnZXRSYXRpbygpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHJhdGlvSW5wdXQudmFsdWUudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gJycpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChyYXcpOwogICAgICAgICAgICAgICAgaWYgKGlzTmFOKHZhbCkgfHwgdmFsIDw9IDApIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Q29uY0hBKCkgewogICAgICAgICAgICAgICAgY29uc3QgcmF3ID0gY29uY0hBSW5wdXQudmFsdWUudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gJycpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChyYXcpOwogICAgICAgICAgICAgICAgaWYgKGlzTmFOKHZhbCkgfHwgdmFsIDwgMCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBnZXRDb25jQSgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IGNvbmNBSW5wdXQudmFsdWUudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gJycpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChyYXcpOwogICAgICAgICAgICAgICAgaWYgKGlzTmFOKHZhbCkgfHwgdmFsIDwgMCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBjbGVhclJlc3VsdHMoKSB7CiAgICAgICAgICAgICAgICByZXNQaC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICAgICAgcmVzUG9oLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICByZXNMb2dSYXRpby50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICAgICAgcmVzQ29uY0hBLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICByZXNDb25jQS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICAgICAgY29uY1Jvd0hhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICBjb25jUm93QS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgcmVzU3VtbWFyeS50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgICAgZ2VuZXJhbEVycm9yLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG51bSwgZGVjaW1hbHMpIHsKICAgICAgICAgICAgICAgIGlmIChudW0gPT09IG51bGwgfHwgbnVtID09PSB1bmRlZmluZWQgfHwgaXNOYU4obnVtKSB8fCAhaXNGaW5pdGUobnVtKSkgcmV0dXJuICfigJQnOwogICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihudW0pLnRvRml4ZWQoZGVjaW1hbHMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxjQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIGNvbnN0IHBrYSA9IGdldFBrYSgpOwogICAgICAgICAgICAgICAgaWYgKHBrYSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJwa2FNb2RlIl06Y2hlY2tlZCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlICYmIG1vZGUudmFsdWUgPT09ICdtYW51YWwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcihwa2FFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yKHNlbGVjdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNIQSA9IGdldENvbmNIQSgpOwogICAgICAgICAgICAgICAgY29uc3QgY29uY0EgPSBnZXRDb25jQSgpOwogICAgICAgICAgICAgICAgbGV0IHJhdGlvID0gZ2V0UmF0aW8oKTsKCiAgICAgICAgICAgICAgICBpZiAoY29uY0hBICE9PSBudWxsICYmIGNvbmNIQSA8IDApIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoY29uY0hBRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb25jQSAhPT0gbnVsbCAmJiBjb25jQSA8IDApIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoY29uY0FFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjb25jSEEgIT09IG51bGwgJiYgY29uY0EgIT09IG51bGwgJiYgY29uY0hBID09PSAwICYmIGNvbmNBID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yKGNvbmNIQUVycm9yKTsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoY29uY0FFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChyYXRpbyA9PT0gbnVsbCAmJiAoY29uY0hBID09PSBudWxsIHx8IGNvbmNBID09PSBudWxsKSkgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcihyYXRpb0Vycm9yKTsKICAgICAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSByZXR1cm47CgogICAgICAgICAgICAgICAgbGV0IGVmZmVjdGl2ZVJhdGlvID0gcmF0aW87CiAgICAgICAgICAgICAgICBpZiAoY29uY0hBICE9PSBudWxsICYmIGNvbmNBICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNIQSA9PT0gMCAmJiBjb25jQSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUmF0aW8gPSBJbmZpbml0eTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNIQSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsY1JhdGlvID0gY29uY0EgLyBjb25jSEE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbyAhPT0gbnVsbCAmJiBNYXRoLmFicyhjYWxjUmF0aW8gLSByYXRpbykgPiAwLjAwMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUmF0aW8gPSByYXRpbzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJhdGlvID0gY2FsY1JhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25jSEEgPT09IDAgJiYgY29uY0EgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUmF0aW8gPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlUmF0aW8gPT09IG51bGwgfHwgZWZmZWN0aXZlUmF0aW8gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcihyYXRpb0Vycm9yKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlUmF0aW8gPD0gMCB8fCAhaXNGaW5pdGUoZWZmZWN0aXZlUmF0aW8pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZVJhdGlvID09PSBJbmZpbml0eSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNQaC50ZXh0Q29udGVudCA9ICc+IDE0JzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzUG9oLnRleHRDb250ZW50ID0gJzwgMCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xvZ1JhdGlvLnRleHRDb250ZW50ID0gJ+KInic7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jSEEgIT09IG51bGwpIHsgY29uY1Jvd0hhLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNDb25jSEEudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIoY29uY0hBLCA0KTsgfSBlbHNlIHsgY29uY1Jvd0hhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNBICE9PSBudWxsKSB7IGNvbmNSb3dBLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNDb25jQS50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihjb25jQSwgNCk7IH0gZWxzZSB7IGNvbmNSb3dBLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzU3VtbWFyeS50ZXh0Q29udGVudCA9ICfQodC+0L7RgtC90L7RiNC10L3QuNC1INGB0YLRgNC10LzQuNGC0YHRjyDQuiDQsdC10YHQutC+0L3QtdGH0L3QvtGB0YLQuCDigJQg0LrQuNGB0LvQvtGC0LAg0L/RgNCw0LrRgtC40YfQtdGB0LrQuCDQvtGC0YHRg9GC0YHRgtCy0YPQtdGCLiBwSCDQvdC1INC+0L/RgNC10LTQtdC70ZHQvSDQsiDRgNCw0LzQutCw0YUg0YHRgtCw0L3QtNCw0YDRgtC90L7QuSDRiNC60LDQu9GLLic7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yKHJhdGlvRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjb25zdCBsb2dSYXRpbyA9IE1hdGgubG9nMTAoZWZmZWN0aXZlUmF0aW8pOwogICAgICAgICAgICAgICAgY29uc3QgcEggPSBwa2EgKyBsb2dSYXRpbzsKICAgICAgICAgICAgICAgIGNvbnN0IHBPSCA9IDE0IC0gcEg7CgogICAgICAgICAgICAgICAgcmVzUGgudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIocEgsIDMpOwogICAgICAgICAgICAgICAgcmVzUG9oLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKHBPSCwgMyk7CiAgICAgICAgICAgICAgICByZXNMb2dSYXRpby50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihsb2dSYXRpbywgNCk7CgogICAgICAgICAgICAgICAgaWYgKGNvbmNIQSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbmNSb3dIYS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgICAgICAgICAgICAgIHJlc0NvbmNIQS50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihjb25jSEEsIDQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25jUm93SGEuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb25jQSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbmNSb3dBLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgICAgICAgICAgICAgcmVzQ29uY0EudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIoY29uY0EsIDQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25jUm93QS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBzdW1tYXJ5ID0gJ3BIID0gcEthICsgbG9n4oKB4oKAKCcgKyBmb3JtYXROdW1iZXIoZWZmZWN0aXZlUmF0aW8sIDQpICsgJykgPSAnICsgZm9ybWF0TnVtYmVyKHBrYSwgMikgKyAnICsgJyArIGZvcm1hdE51bWJlcihsb2dSYXRpbywgNCkgKyAnID0gJyArIGZvcm1hdE51bWJlcihwSCwgMyk7CiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMocEggLSBwa2EpIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5ICs9ICcuINCR0YPRhNC10YAg0YDQsNCx0L7RgtCw0LXRgiDQsiDQvtC/0YLQuNC80LDQu9GM0L3QvtC8INC00LjQsNC/0LDQt9C+0L3QtSAocEgg4omIIHBLYSDCsSAxKS4nOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhwSCAtIHBrYSkgPD0gMS41KSB7CiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSArPSAnLiDQkdGD0YTQtdGAINC90LDRhdC+0LTQuNGC0YHRjyDQvdCwINCz0YDQsNC90LjRhtC1INGN0YTRhNC10LrRgtC40LLQvdC+0LPQviDQtNC40LDQv9Cw0LfQvtC90LAuJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSArPSAnLiDQktC90LjQvNCw0L3QuNC1OiBwSCDQtNCw0LvRkdC6INC+0YIgcEthIOKAlCDQsdGD0YTQtdGA0L3QsNGPINGR0LzQutC+0YHRgtGMINC90LjQt9C60LDRjy4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzU3VtbWFyeS50ZXh0Q29udGVudCA9IHN1bW1hcnk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHBrYVZhbHVlSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIGFjaWRTZWxlY3QudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIHJhdGlvSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIGNvbmNIQUlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBjb25jQUlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hbnVhbFJhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT0icGthTW9kZSJdW3ZhbHVlPSJtYW51YWwiXScpOwogICAgICAgICAgICAgICAgaWYgKG1hbnVhbFJhZGlvKSB7CiAgICAgICAgICAgICAgICAgICAgbWFudWFsUmFkaW8uY2hlY2tlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUGthTW9kZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRvZ2dsZVBrYU1vZGUoKTsKICAgICAgICB9KSgpOwogICAg