Калькулятор равновесных концентраций
Расчёт равновесных концентраций веществ в обратимой химической реакции по заданным исходным концентрациям и константе равновесия Kc — с аналитическим решением квадратного уравнения.
Результаты расчёта
—
Глубина реакции x
моль/л
Как пользоваться
1
Выберите тип обратимой реакции из выпадающего списка. Поддерживаются пять распространённых стехиометрических схем: A + B ⇌ C + D, 2A ⇌ B, A ⇌ 2B, A + B ⇌ C, A ⇌ B + C.
2
Введите исходные концентрации всех участников реакции в моль/л. Для продуктов, отсутствующих в начальный момент, оставьте нули. Укажите значение константы равновесия Kc (строго больше нуля).
3
Нажмите кнопку «Рассчитать». Калькулятор решит квадратное уравнение относительно глубины реакции x и вычислит равновесные концентрации всех веществ.
4
Проанализируйте результаты. Проверьте, что рассчитанное значение Kc (обратная подстановка) совпадает с исходным — это отображается в блоке результатов для верификации.
Примеры использования
Пример 1: Синтез сложного эфира (A + B ⇌ C + D)
[A]₀ = 0,10 моль/л, [B]₀ = 0,10 моль/л, [C]₀ = 0, [D]₀ = 0, Kc = 4,0. Результат: x ≈ 0,0667 моль/л; равновесные концентрации: [A] = [B] ≈ 0,0333 моль/л, [C] = [D] ≈ 0,0667 моль/л.
Пример 2: Димеризация (2A ⇌ B)
[A]₀ = 0,20 моль/л, [B]₀ = 0, Kc = 10,0. Глубина реакции x ≈ 0,0610 моль/л; [A] = 0,20 − 2·0,0610 ≈ 0,0780 моль/л, [B] = 0,0610 моль/л. Проверка: 0,0610 / 0,0780² ≈ 10,0.
Пример 3: Диссоциация (A ⇌ B + C)
[A]₀ = 0,15 моль/л, [B]₀ = 0, [C]₀ = 0,02 моль/л, Kc = 0,01. Глубина x ≈ 0,0265 моль/л; [A] ≈ 0,1235 моль/л, [B] ≈ 0,0265 моль/л, [C] ≈ 0,0465 моль/л.
Важные нюансы
- Константа равновесия Kc зависит от температуры. Данный калькулятор выполняет расчёт при фиксированной температуре; для другого теплового режима используйте соответствующее значение Kc.
- Для газофазных реакций следует применять константу Kp, связанную с Kc через уравнение Kp = Kc(RT)Δn. Калькулятор ориентирован на Kc для растворов.
- Исходные концентрации продуктов могут быть отличны от нуля — это важно при моделировании обратного направления реакции или добавления продукта в систему.
- При очень больших (Kc > 10⁶) или очень малых (Kc < 10⁻⁶) значениях константы возможна потеря точности из-за операций с плавающей запятой. Калькулятор выполняет обратную проверку подстановкой.
- Все равновесные концентрации должны быть положительными. Если решение даёт отрицательные значения, это указывает на некорректные исходные данные или выход за пределы применимости модели.
- Техника безопасности: расчёт равновесных концентраций является теоретическим инструментом. При постановке реального химического эксперимента строго соблюдайте правила лабораторной безопасности, работайте под тягой при необходимости и используйте средства индивидуальной защиты. Калькулятор не заменяет экспериментальную проверку.
Формулы расчёта
Для обратимой реакции общего вида aA + bB ⇌ cC + dD константа равновесия выражается через равновесные концентрации:
Kc = ([C]c[D]d) / ([A]a[B]b)
Вводится глубина реакции x (моль/л) — количество вещества, прореагировавшее по стехиометрии. Тогда равновесные концентрации:
[A] = [A]₀ − a·x
[B] = [B]₀ − b·x
[C] = [C]₀ + c·x
[D] = [D]₀ + d·x
Подстановка в выражение для Kc приводит к квадратному уравнению вида αx² + βx + γ = 0. Корни находятся по формуле:
x = (−β ± √(β² − 4αγ)) / (2α)
Из двух корней выбирается физически осмысленный: x должно быть положительным и не превышать предельной глубины, определяемой полным расходованием лимитирующего реагента (x ≤ min([A]₀/a, [B]₀/b)). После нахождения x рассчитываются все равновесные концентрации и выполняется обратная проверка подстановкой в Kc.
Источники данных
- IUPAC Gold Book — определение константы равновесия и стандартные обозначения в химической термодинамике (DOI: 10.1351/goldbook.E02177).
- NIST Chemistry WebBook — справочная база данных Национального института стандартов и технологий США по термодинамическим и кинетическим параметрам химических реакций.
- CRC Handbook of Chemistry and Physics — фундаментальный справочник физико-химических констант, включающий таблицы констант равновесия типовых реакций.
- Учебные пособия по общей и физической химии — расчёт основан на стандартных формулах химического равновесия, изучаемых в курсе физической химии (закон действующих масс, стехиометрические соотношения).
Калькулятор равновесных концентраций помогает быстро определить состав равновесной смеси для обратимой химической реакции по известным исходным концентрациям реагентов и продуктов, а также значению константы равновесия Kc. Инструмент поддерживает пять распространённых стехиометрических схем и выполняет аналитическое решение квадратного уравнения относительно глубины реакции x. Расчёт сопровождается обратной верификацией — подстановкой найденных концентраций в выражение для Kc, что подтверждает корректность результата. Калькулятор будет полезен студентам химических специальностей, преподавателям, инженерам-химикам и всем, кто изучает химическое равновесие.
CihmdW5jdGlvbigpewogIHZhciByZWFjdGlvblR5cGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFjdGlvblR5cGUnKTsKICB2YXIgZmllbGRHcm91cEEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmllbGRHcm91cEEnKTsKICB2YXIgZmllbGRHcm91cEIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmllbGRHcm91cEInKTsKICB2YXIgZmllbGRHcm91cEMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmllbGRHcm91cEMnKTsKICB2YXIgZmllbGRHcm91cEQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmllbGRHcm91cEQnKTsKICB2YXIgY29uY0FFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25jQScpOwogIHZhciBjb25jQkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmNCJyk7CiAgdmFyIGNvbmNDRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uY0MnKTsKICB2YXIgY29uY0RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25jRCcpOwogIHZhciBLY0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0tjJyk7CiAgdmFyIGVycm9yTXNnRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JNc2cnKTsKICB2YXIgcmVzdWx0R3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRHcmlkJyk7CiAgdmFyIHJlc3VsdEl0ZW1DID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdEl0ZW1DJyk7CiAgdmFyIHJlc3VsdEl0ZW1EID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdEl0ZW1EJyk7CiAgdmFyIGNhbGNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsY0J0bicpOwogIHZhciByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldEJ0bicpOwoKICB2YXIgcmVhY3Rpb25Db25maWcgPSB7CiAgICAnQUJfQ0QnOiB7CiAgICAgIG5hbWU6ICdBICsgQiDih4wgQyArIEQnLAogICAgICB2aXNpYmxlRmllbGRzOiBbJ0EnLCdCJywnQycsJ0QnXSwKICAgICAgcmVhY3RhbnRMYWJlbHM6IFsnQScsJ0InXSwKICAgICAgcHJvZHVjdExhYmVsczogWydDJywnRCddLAogICAgICBzdG9pY2hSOiBbMSwgMV0sCiAgICAgIHN0b2ljaFA6IFsxLCAxXSwKICAgICAgbWF4WDogZnVuY3Rpb24oYyl7IHJldHVybiBNYXRoLm1pbihjLkEsIGMuQik7IH0sCiAgICAgIGNvZWZmczogZnVuY3Rpb24oYywgS2MpewogICAgICAgIHZhciBhID0gS2MgLSAxOwogICAgICAgIHZhciBiID0gLShLYyooYy5BICsgYy5CKSArIGMuQyArIGMuRCk7CiAgICAgICAgdmFyIGNjID0gS2MqYy5BKmMuQiAtIGMuQypjLkQ7CiAgICAgICAgcmV0dXJuIHthOiBhLCBiOiBiLCBjOiBjY307CiAgICAgIH0KICAgIH0sCiAgICAnQTJfQic6IHsKICAgICAgbmFtZTogJzJBIOKHjCBCJywKICAgICAgdmlzaWJsZUZpZWxkczogWydBJywnQiddLAogICAgICByZWFjdGFudExhYmVsczogWydBJ10sCiAgICAgIHByb2R1Y3RMYWJlbHM6IFsnQiddLAogICAgICBzdG9pY2hSOiBbMl0sCiAgICAgIHN0b2ljaFA6IFsxXSwKICAgICAgbWF4WDogZnVuY3Rpb24oYyl7IHJldHVybiBjLkEvMjsgfSwKICAgICAgY29lZmZzOiBmdW5jdGlvbihjLCBLYyl7CiAgICAgICAgdmFyIGEgPSA0KktjOwogICAgICAgIHZhciBiID0gLSg0KktjKmMuQSArIDEpOwogICAgICAgIHZhciBjYyA9IEtjKmMuQSpjLkEgLSBjLkI7CiAgICAgICAgcmV0dXJuIHthOiBhLCBiOiBiLCBjOiBjY307CiAgICAgIH0KICAgIH0sCiAgICAnQV8yQic6IHsKICAgICAgbmFtZTogJ0Eg4oeMIDJCJywKICAgICAgdmlzaWJsZUZpZWxkczogWydBJywnQiddLAogICAgICByZWFjdGFudExhYmVsczogWydBJ10sCiAgICAgIHByb2R1Y3RMYWJlbHM6IFsnQiddLAogICAgICBzdG9pY2hSOiBbMV0sCiAgICAgIHN0b2ljaFA6IFsyXSwKICAgICAgbWF4WDogZnVuY3Rpb24oYyl7IHJldHVybiBjLkE7IH0sCiAgICAgIGNvZWZmczogZnVuY3Rpb24oYywgS2MpewogICAgICAgIHZhciBhID0gNDsKICAgICAgICB2YXIgYiA9IDQqYy5CICsgS2M7CiAgICAgICAgdmFyIGNjID0gYy5CKmMuQiAtIEtjKmMuQTsKICAgICAgICByZXR1cm4ge2E6IGEsIGI6IGIsIGM6IGNjfTsKICAgICAgfQogICAgfSwKICAgICdBQl9DJzogewogICAgICBuYW1lOiAnQSArIEIg4oeMIEMnLAogICAgICB2aXNpYmxlRmllbGRzOiBbJ0EnLCdCJywnQyddLAogICAgICByZWFjdGFudExhYmVsczogWydBJywnQiddLAogICAgICBwcm9kdWN0TGFiZWxzOiBbJ0MnXSwKICAgICAgc3RvaWNoUjogWzEsMV0sCiAgICAgIHN0b2ljaFA6IFsxXSwKICAgICAgbWF4WDogZnVuY3Rpb24oYyl7IHJldHVybiBNYXRoLm1pbihjLkEsIGMuQik7IH0sCiAgICAgIGNvZWZmczogZnVuY3Rpb24oYywgS2MpewogICAgICAgIHZhciBhID0gS2M7CiAgICAgICAgdmFyIGIgPSAtKEtjKihjLkEgKyBjLkIpICsgMSk7CiAgICAgICAgdmFyIGNjID0gS2MqYy5BKmMuQiAtIGMuQzsKICAgICAgICByZXR1cm4ge2E6IGEsIGI6IGIsIGM6IGNjfTsKICAgICAgfQogICAgfSwKICAgICdBX0JDJzogewogICAgICBuYW1lOiAnQSDih4wgQiArIEMnLAogICAgICB2aXNpYmxlRmllbGRzOiBbJ0EnLCdCJywnQyddLAogICAgICByZWFjdGFudExhYmVsczogWydBJ10sCiAgICAgIHByb2R1Y3RMYWJlbHM6IFsnQicsJ0MnXSwKICAgICAgc3RvaWNoUjogWzFdLAogICAgICBzdG9pY2hQOiBbMSwxXSwKICAgICAgbWF4WDogZnVuY3Rpb24oYyl7IHJldHVybiBjLkE7IH0sCiAgICAgIGNvZWZmczogZnVuY3Rpb24oYywgS2MpewogICAgICAgIHZhciBhID0gMTsKICAgICAgICB2YXIgYiA9IGMuQiArIGMuQyArIEtjOwogICAgICAgIHZhciBjYyA9IGMuQipjLkMgLSBLYypjLkE7CiAgICAgICAgcmV0dXJuIHthOiBhLCBiOiBiLCBjOiBjY307CiAgICAgIH0KICAgIH0KICB9OwoKICB2YXIgYWxsRmllbGRHcm91cHMgPSB7CiAgICAnQSc6IGZpZWxkR3JvdXBBLAogICAgJ0InOiBmaWVsZEdyb3VwQiwKICAgICdDJzogZmllbGRHcm91cEMsCiAgICAnRCc6IGZpZWxkR3JvdXBECiAgfTsKCiAgZnVuY3Rpb24gdXBkYXRlRmllbGRWaXNpYmlsaXR5KCl7CiAgICB2YXIgdHlwZSA9IHJlYWN0aW9uVHlwZUVsLnZhbHVlOwogICAgdmFyIGNvbmZpZyA9IHJlYWN0aW9uQ29uZmlnW3R5cGVdOwogICAgaWYgKCFjb25maWcpIHJldHVybjsKICAgIHZhciB2aXMgPSBjb25maWcudmlzaWJsZUZpZWxkczsKICAgIFsnQScsJ0InLCdDJywnRCddLmZvckVhY2goZnVuY3Rpb24oZil7CiAgICAgIHZhciBncnAgPSBhbGxGaWVsZEdyb3Vwc1tmXTsKICAgICAgaWYgKCFncnApIHJldHVybjsKICAgICAgaWYgKHZpcy5pbmRleE9mKGYpICE9PSAtMSl7CiAgICAgICAgZ3JwLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtZmllbGQtZ3JvdXAtaGlkZGVuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ3JwLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtZmllbGQtZ3JvdXAtaGlkZGVuJyk7CiAgICAgIH0KICAgIH0pOwogICAgdXBkYXRlUmVzdWx0TGFiZWxzKHR5cGUpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUmVzdWx0TGFiZWxzKHR5cGUpewogICAgdmFyIGNvbmZpZyA9IHJlYWN0aW9uQ29uZmlnW3R5cGVdOwogICAgaWYgKCFjb25maWcpIHJldHVybjsKICAgIHZhciBpdGVtcyA9IHJlc3VsdEdyaWQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtcmVzdWx0LWl0ZW0nKTsKICAgIHZhciBsYWJlbHMgPSBbJ9CT0LvRg9Cx0LjQvdCwINGA0LXQsNC60YbQuNC4IHgnXTsKICAgIHZhciB1bml0cyA9IFsn0LzQvtC70Ywv0LsnXTsKICAgIGNvbmZpZy5yZWFjdGFudExhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKGwpeyBsYWJlbHMucHVzaCgnWycgKyBsICsgJ10g0YDQsNCy0L3QvtCy0LXRgdC90LDRjycpOyB1bml0cy5wdXNoKCfQvNC+0LvRjC/QuycpOyB9KTsKICAgIGNvbmZpZy5wcm9kdWN0TGFiZWxzLmZvckVhY2goZnVuY3Rpb24obCl7IGxhYmVscy5wdXNoKCdbJyArIGwgKyAnXSDRgNCw0LLQvdC+0LLQtdGB0L3QsNGPJyk7IHVuaXRzLnB1c2goJ9C80L7Qu9GML9C7Jyk7IH0pOwogICAgdmFyIHZlcmlmeUlkeCA9IGxhYmVscy5sZW5ndGg7CiAgICBsYWJlbHMucHVzaCgnS2Mg0L/RgNC+0LLQtdGA0LrQsCcpOwogICAgdW5pdHMucHVzaCgnJyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE1hdGgubWluKGxhYmVscy5sZW5ndGgsIGl0ZW1zLmxlbmd0aCk7IGkrKyl7CiAgICAgIHZhciBsYWJlbEVsID0gaXRlbXNbaV0ucXVlcnlTZWxlY3RvcignLm5uLWdlbi1jYWwtcmVzdWx0LWxhYmVsJyk7CiAgICAgIHZhciB1bml0RWwgPSBpdGVtc1tpXS5xdWVyeVNlbGVjdG9yKCcubm4tZ2VuLWNhbC1yZXN1bHQtdW5pdCcpOwogICAgICBpZiAobGFiZWxFbCkgbGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsc1tpXTsKICAgICAgaWYgKHVuaXRFbCkgdW5pdEVsLnRleHRDb250ZW50ID0gdW5pdHNbaV07CiAgICB9CiAgICBpZiAoaXRlbXMubGVuZ3RoID4gbGFiZWxzLmxlbmd0aCl7CiAgICAgIGZvciAodmFyIGogPSBsYWJlbHMubGVuZ3RoOyBqIDwgaXRlbXMubGVuZ3RoOyBqKyspewogICAgICAgIGl0ZW1zW2pdLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtcmVzdWx0LWl0ZW0taGlkZGVuJyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaXRlbXMubGVuZ3RoOyBrKyspewogICAgICAgIGl0ZW1zW2tdLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtcmVzdWx0LWl0ZW0taGlkZGVuJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZWwpewogICAgdmFyIHJhdyA9IGVsLnZhbHVlLnRyaW0oKTsKICAgIGlmIChyYXcgPT09ICcnKSByZXR1cm4gTmFOOwogICAgdmFyIG51bSA9IHBhcnNlRmxvYXQocmF3LnJlcGxhY2UoJywnLCAnLicpKTsKICAgIHJldHVybiBudW07CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0cyhjb25maWcpewogICAgdmFyIGVycm9ycyA9IFtdOwogICAgdmFyIHZpcyA9IGNvbmZpZy52aXNpYmxlRmllbGRzOwogICAgdmFyIHZhbE1hcCA9IHsgJ0EnOiBjb25jQUVsLCAnQic6IGNvbmNCRWwsICdDJzogY29uY0NFbCwgJ0QnOiBjb25jREVsIH07CiAgICB2YXIgY29uYyA9IHt9OwogICAgdmlzLmZvckVhY2goZnVuY3Rpb24oZil7CiAgICAgIHZhciB2ID0gZ2V0RmllbGRWYWx1ZSh2YWxNYXBbZl0pOwogICAgICBpZiAoaXNOYU4odikpewogICAgICAgIGVycm9ycy5wdXNoKCfQn9C+0LvQtSDCq9CY0YHRhdC+0LTQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPICcgKyBmICsgJ8K7INC00L7Qu9C20L3QviDQsdGL0YLRjCDQt9Cw0L/QvtC70L3QtdC90L4g0YfQuNGB0LvQvtC8LicpOwogICAgICB9IGVsc2UgaWYgKHYgPCAwKXsKICAgICAgICBlcnJvcnMucHVzaCgn0JrQvtC90YbQtdC90YLRgNCw0YbQuNGPICcgKyBmICsgJyDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdC+0LkuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uY1tmXSA9IHY7CiAgICAgIH0KICAgIH0pOwogICAgdmFyIEtjVmFsID0gZ2V0RmllbGRWYWx1ZShLY0VsKTsKICAgIGlmIChpc05hTihLY1ZhbCkpewogICAgICBlcnJvcnMucHVzaCgn0J/QvtC70LUgwqvQmtC+0L3RgdGC0LDQvdGC0LAg0YDQsNCy0L3QvtCy0LXRgdC40Y8gS2PCuyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0LfQsNC/0L7Qu9C90LXQvdC+INGH0LjRgdC70L7QvC4nKTsKICAgIH0gZWxzZSBpZiAoS2NWYWwgPD0gMCl7CiAgICAgIGVycm9ycy5wdXNoKCfQmtC+0L3RgdGC0LDQvdGC0LAg0YDQsNCy0L3QvtCy0LXRgdC40Y8gS2Mg0LTQvtC70LbQvdCwINCx0YvRgtGMINGB0YLRgNC+0LPQviDQsdC+0LvRjNGI0LUg0L3Rg9C70Y8uJyk7CiAgICB9CiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApewogICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yczogZXJyb3JzLCBjb25jOiBudWxsLCBLYzogbnVsbCB9OwogICAgfQogICAgdmFyIGZ1bGxDb25jID0geyBBOiAwLCBCOiAwLCBDOiAwLCBEOiAwIH07CiAgICBmb3IgKHZhciBrZXkgaW4gY29uYyl7CiAgICAgIGlmIChjb25jLmhhc093blByb3BlcnR5KGtleSkpIGZ1bGxDb25jW2tleV0gPSBjb25jW2tleV07CiAgICB9CiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgY29uYzogZnVsbENvbmMsIEtjOiBLY1ZhbCB9OwogIH0KCiAgZnVuY3Rpb24gc29sdmVRdWFkcmF0aWMoYSwgYiwgYywgbWF4WCl7CiAgICBpZiAoTWF0aC5hYnMoYSkgPCAxZS0xNSl7CiAgICAgIGlmIChNYXRoLmFicyhiKSA8IDFlLTE1KSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHhMaW4gPSAtYyAvIGI7CiAgICAgIGlmICh4TGluID4gMWUtMTIgJiYgeExpbiA8PSBtYXhYICsgMWUtMTIpIHJldHVybiBNYXRoLm1pbih4TGluLCBtYXhYKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgRCA9IGIqYiAtIDQqYSpjOwogICAgaWYgKEQgPCAtMWUtMTIpIHJldHVybiBudWxsOwogICAgaWYgKEQgPCAwKSBEID0gMDsKICAgIHZhciBzcXJ0RCA9IE1hdGguc3FydChEKTsKICAgIHZhciB4MSA9ICgtYiArIHNxcnREKSAvICgyKmEpOwogICAgdmFyIHgyID0gKC1iIC0gc3FydEQpIC8gKDIqYSk7CiAgICB2YXIgY2FuZGlkYXRlcyA9IFt4MSwgeDJdOwogICAgdmFyIGJlc3QgPSBudWxsOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSsrKXsKICAgICAgdmFyIHggPSBjYW5kaWRhdGVzW2ldOwogICAgICBpZiAoeCA+IDFlLTEyICYmIHggPD0gbWF4WCArIDFlLTEyKXsKICAgICAgICB4ID0gTWF0aC5taW4oeCwgbWF4WCk7CiAgICAgICAgaWYgKGJlc3QgPT09IG51bGwgfHwgeCA8IGJlc3QpIGJlc3QgPSB4OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CgogIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpewogICAgdmFyIHR5cGUgPSByZWFjdGlvblR5cGVFbC52YWx1ZTsKICAgIHZhciBjb25maWcgPSByZWFjdGlvbkNvbmZpZ1t0eXBlXTsKICAgIGlmICghY29uZmlnKSByZXR1cm47CiAgICB2YXIgdmFsaWRhdGlvbiA9IHZhbGlkYXRlSW5wdXRzKGNvbmZpZyk7CiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpewogICAgICBlcnJvck1zZ0VsLnRleHRDb250ZW50ID0gdmFsaWRhdGlvbi5lcnJvcnMuam9pbignICcpOwogICAgICByZXR1cm47CiAgICB9CiAgICBlcnJvck1zZ0VsLnRleHRDb250ZW50ID0gJyc7CiAgICB2YXIgY29uYyA9IHZhbGlkYXRpb24uY29uYzsKICAgIHZhciBLYyA9IHZhbGlkYXRpb24uS2M7CiAgICB2YXIgbWF4WCA9IGNvbmZpZy5tYXhYKGNvbmMpOwogICAgaWYgKG1heFggPD0gMWUtMTUpewogICAgICBlcnJvck1zZ0VsLnRleHRDb250ZW50ID0gJ9CY0YHRhdC+0LTQvdGL0LUg0LrQvtC90YbQtdC90YLRgNCw0YbQuNC4INGA0LXQsNCz0LXQvdGC0L7QsiDRgdC70LjRiNC60L7QvCDQvNCw0LvRiyAo0L3Rg9C70LXQstGL0LUpIOKAlCDRgNC10LDQutGG0LjRjyDQvdC1INC80L7QttC10YIg0L/RgNC+0YLQtdC60LDRgtGMINCyINC/0YDRj9C80L7QvCDQvdCw0L/RgNCw0LLQu9C10L3QuNC4Lic7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBjb2VmZnMgPSBjb25maWcuY29lZmZzKGNvbmMsIEtjKTsKICAgIHZhciB4ID0gc29sdmVRdWFkcmF0aWMoY29lZmZzLmEsIGNvZWZmcy5iLCBjb2VmZnMuYywgbWF4WCk7CiAgICBpZiAoeCA9PT0gbnVsbCl7CiAgICAgIGVycm9yTXNnRWwudGV4dENvbnRlbnQgPSAn0J3QtSDRg9C00LDQu9C+0YHRjCDQvdCw0LnRgtC4INGE0LjQt9C40YfQtdGB0LrQuCDQvtGB0LzRi9GB0LvQtdC90L3QvtC1INGA0LXRiNC10L3QuNC1LiDQn9GA0L7QstC10YDRjNGC0LUg0LjRgdGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUg4oCUINCy0L7Qt9C80L7QttC90L4sINGA0LDQstC90L7QstC10YHQuNC1INC90LXQtNC+0YHRgtC40LbQuNC80L4g0L/RgNC4INC00LDQvdC90YvRhSDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y/RhSDQuCBLYy4nOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgZXFDb25jID0ge307CiAgICB2YXIgYWxsTGFiZWxzID0gY29uZmlnLnJlYWN0YW50TGFiZWxzLmNvbmNhdChjb25maWcucHJvZHVjdExhYmVscyk7CiAgICB2YXIgYWxsU3RvaWNoID0gY29uZmlnLnN0b2ljaFIuY29uY2F0KGNvbmZpZy5zdG9pY2hQKTsKICAgIHZhciBpbml0TWFwID0geyBBOiBjb25jLkEsIEI6IGNvbmMuQiwgQzogY29uYy5DLCBEOiBjb25jLkQgfTsKICAgIHZhciBpc1Byb2R1Y3QgPSB7fTsKICAgIGNvbmZpZy5wcm9kdWN0TGFiZWxzLmZvckVhY2goZnVuY3Rpb24obCl7IGlzUHJvZHVjdFtsXSA9IHRydWU7IH0pOwogICAgYWxsTGFiZWxzLmZvckVhY2goZnVuY3Rpb24obGFiZWwsIGlkeCl7CiAgICAgIHZhciBzdG9pY2ggPSBhbGxTdG9pY2hbaWR4XTsKICAgICAgdmFyIGluaXRWYWwgPSBpbml0TWFwW2xhYmVsXSB8fCAwOwogICAgICBpZiAoaXNQcm9kdWN0W2xhYmVsXSl7CiAgICAgICAgZXFDb25jW2xhYmVsXSA9IGluaXRWYWwgKyBzdG9pY2ggKiB4OwogICAgICB9IGVsc2UgewogICAgICAgIGVxQ29uY1tsYWJlbF0gPSBpbml0VmFsIC0gc3RvaWNoICogeDsKICAgICAgfQogICAgICBpZiAoZXFDb25jW2xhYmVsXSA8IC0xZS0xMikgZXFDb25jW2xhYmVsXSA9IDA7CiAgICB9KTsKICAgIHZhciBudW1LYyA9IDE7CiAgICB2YXIgZGVuS2MgPSAxOwogICAgY29uZmlnLnJlYWN0YW50TGFiZWxzLmZvckVhY2goZnVuY3Rpb24obCwgaSl7IGRlbktjICo9IE1hdGgucG93KGVxQ29uY1tsXSwgY29uZmlnLnN0b2ljaFJbaV0pOyB9KTsKICAgIGNvbmZpZy5wcm9kdWN0TGFiZWxzLmZvckVhY2goZnVuY3Rpb24obCwgaSl7IG51bUtjICo9IE1hdGgucG93KGVxQ29uY1tsXSwgY29uZmlnLnN0b2ljaFBbaV0pOyB9KTsKICAgIHZhciBLY0NoZWNrID0gKGRlbktjID4gMWUtMTUpID8gbnVtS2MgLyBkZW5LYyA6IEluZmluaXR5OwoKICAgIGRpc3BsYXlSZXN1bHRzKGNvbmZpZywgeCwgZXFDb25jLCBLY0NoZWNrKTsKICB9CgogIGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHRzKGNvbmZpZywgeCwgZXFDb25jLCBLY0NoZWNrKXsKICAgIHZhciBpdGVtcyA9IHJlc3VsdEdyaWQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtcmVzdWx0LWl0ZW0nKTsKICAgIHZhciB2YWx1ZXMgPSBbeF07CiAgICBjb25maWcucmVhY3RhbnRMYWJlbHMuZm9yRWFjaChmdW5jdGlvbihsKXsgdmFsdWVzLnB1c2goZXFDb25jW2xdKTsgfSk7CiAgICBjb25maWcucHJvZHVjdExhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKGwpeyB2YWx1ZXMucHVzaChlcUNvbmNbbF0pOyB9KTsKICAgIHZhbHVlcy5wdXNoKEtjQ2hlY2spOwogICAgdmFyIHVuaXRzID0gWyfQvNC+0LvRjC/QuyddOwogICAgY29uZmlnLnJlYWN0YW50TGFiZWxzLmZvckVhY2goZnVuY3Rpb24oKXsgdW5pdHMucHVzaCgn0LzQvtC70Ywv0LsnKTsgfSk7CiAgICBjb25maWcucHJvZHVjdExhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKCl7IHVuaXRzLnB1c2goJ9C80L7Qu9GML9C7Jyk7IH0pOwogICAgdW5pdHMucHVzaCgnJyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKXsKICAgICAgaXRlbXNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC1yZXN1bHQtaXRlbS1oaWRkZW4nKTsKICAgICAgdmFyIHZhbEVsID0gaXRlbXNbaV0ucXVlcnlTZWxlY3RvcignLm5uLWdlbi1jYWwtcmVzdWx0LXZhbHVlJyk7CiAgICAgIHZhciB1bml0RWwgPSBpdGVtc1tpXS5xdWVyeVNlbGVjdG9yKCcubm4tZ2VuLWNhbC1yZXN1bHQtdW5pdCcpOwogICAgICBpZiAoaSA8IHZhbHVlcy5sZW5ndGgpewogICAgICAgIHZhciB2ID0gdmFsdWVzW2ldOwogICAgICAgIHZhciBkaXNwbGF5VmFsOwogICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodikpewogICAgICAgICAgZGlzcGxheVZhbCA9IChNYXRoLmFicyh2KSA8IDFlLTQgJiYgdiAhPT0gMCkgPyB2LnRvRXhwb25lbnRpYWwoNCkgOiB2LnRvRml4ZWQoNCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRpc3BsYXlWYWwgPSAn4oCUJzsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbEVsKSB2YWxFbC50ZXh0Q29udGVudCA9IGRpc3BsYXlWYWw7CiAgICAgICAgaWYgKHVuaXRFbCAmJiBpIDwgdW5pdHMubGVuZ3RoKSB1bml0RWwudGV4dENvbnRlbnQgPSB1bml0c1tpXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpdGVtc1tpXS5jbGFzc0xpc3QuYWRkKCdubi1nZW4tY2FsLXJlc3VsdC1pdGVtLWhpZGRlbicpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNldEZvcm0oKXsKICAgIGNvbmNBRWwudmFsdWUgPSAnJzsKICAgIGNvbmNCRWwudmFsdWUgPSAnJzsKICAgIGNvbmNDRWwudmFsdWUgPSAnJzsKICAgIGNvbmNERWwudmFsdWUgPSAnJzsKICAgIEtjRWwudmFsdWUgPSAnJzsKICAgIGVycm9yTXNnRWwudGV4dENvbnRlbnQgPSAnJzsKICAgIHJlYWN0aW9uVHlwZUVsLnZhbHVlID0gJ0FCX0NEJzsKICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOwogICAgdmFyIGl0ZW1zID0gcmVzdWx0R3JpZC5xdWVyeVNlbGVjdG9yQWxsKCcubm4tZ2VuLWNhbC1yZXN1bHQtaXRlbScpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyl7CiAgICAgIHZhciB2YWxFbCA9IGl0ZW1zW2ldLnF1ZXJ5U2VsZWN0b3IoJy5ubi1nZW4tY2FsLXJlc3VsdC12YWx1ZScpOwogICAgICBpZiAodmFsRWwpIHZhbEVsLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICB9CiAgfQoKICByZWFjdGlvblR5cGVFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpewogICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7CiAgICBlcnJvck1zZ0VsLnRleHRDb250ZW50ID0gJyc7CiAgICB2YXIgaXRlbXMgPSByZXN1bHRHcmlkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ubi1nZW4tY2FsLXJlc3VsdC1pdGVtJyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKXsKICAgICAgdmFyIHZhbEVsID0gaXRlbXNbaV0ucXVlcnlTZWxlY3RvcignLm5uLWdlbi1jYWwtcmVzdWx0LXZhbHVlJyk7CiAgICAgIGlmICh2YWxFbCkgdmFsRWwudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgIH0KICB9KTsKCiAgY2FsY0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNhbGN1bGF0ZSk7CiAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEZvcm0pOwoKICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsKfSkoKTsK