Калькулятор кубического уравнения
Решите кубическое уравнение вида ax³ + bx² + cx + d = 0 — получите все корни с пошаговым объяснением.
—
Корень x₁
действительный или комплексный
—
Корень x₂
действительный или комплексный
—
Корень x₃
действительный или комплексный
Как пользоваться калькулятором
1
Введите коэффициент a (при x³). Он не должен быть равен нулю, иначе уравнение станет квадратным или линейным. Пример: a = 1.
2
Введите коэффициенты b (при x²), c (при x) и свободный член d. Допускаются любые действительные числа, включая отрицательные и дробные. Пример: b = -6, c = 11, d = -6.
3
Нажмите «Рассчитать». Калькулятор покажет три корня (действительные или комплексные) и значение дискриминанта. Для комплексных корней используется формат a ± bi.
4
Для нового расчёта нажмите «Сбросить» — все поля очистятся, а результаты вернутся к исходному состоянию.
Примеры расчёта
Пример 1: Три действительных корня
Уравнение: x³ − 6x² + 11x − 6 = 0 (a=1, b=-6, c=11, d=-6).
Результат: x₁ = 3, x₂ = 2, x₃ = 1. Дискриминант отрицательный — три различных действительных корня.
Пример 2: Один действительный и два комплексных корня
Уравнение: x³ + x² + x + 1 = 0 (a=1, b=1, c=1, d=1).
Результат: x₁ = -1, x₂ ≈ 0 + i, x₃ ≈ 0 − i (или x₂ = i, x₃ = -i). Дискриминант положительный.
Пример 3: Кратные корни
Уравнение: x³ − 3x² + 3x − 1 = 0 (a=1, b=-3, c=3, d=-1).
Результат: x₁ = x₂ = x₃ = 1 (тройной корень). Дискриминант равен нулю.
Формулы расчёта
Кубическое уравнение ax³ + bx² + cx + d = 0 решается методом Кардано. Сначала приводим к неполному виду:
p = (3ac − b²) / (3a²)
q = (2b³ − 9abc + 27a²d) / (27a³)
Уравнение: y³ + py + q = 0, где x = y − b/(3a)
Дискриминант:
D = (q/2)² + (p/3)³
Если D > 0: один действительный корень, два комплексно-сопряжённых.
u = ∛(−q/2 + √D), v = ∛(−q/2 − √D)
y₁ = u + v
y₂,₃ = −(u+v)/2 ± i·√3·(u−v)/2
Если D = 0: три действительных корня, из них два равны.
u = ∛(−q/2)
y₁ = 2u, y₂ = y₃ = −u
Если D < 0: три различных действительных корня (тригонометрический случай).
φ = arccos( −q/2 / √(|p|/3)³ )
y₁ = 2√(|p|/3) · cos(φ/3)
y₂ = −2√(|p|/3) · cos((φ+π)/3)
y₃ = −2√(|p|/3) · cos((φ−π)/3)
Во всех случаях: x = y − b/(3a).
Пошаговое объяснение
Рассмотрим уравнение x³ − 6x² + 11x − 6 = 0.
Шаг 1. Вычисляем p и q: a=1, b=-6, c=11, d=-6.
p = (3·1·11 − 36)/(3·1) = (33−36)/3 = −1.
q = (2·(−216) − 9·1·(−6)·11 + 27·1·(−6)) / 27 = (−432 + 594 − 162)/27 = 0/27 = 0.
Шаг 2. Дискриминант D = (0/2)² + (−1/3)³ = 0 − 1/27 = −0.037… (D < 0) — тригонометрический случай.
Шаг 3. φ = arccos(0 / √(1/27)) = arccos(0) = π/2 ≈ 1.5708.
√(|p|/3) = √(1/3) ≈ 0.57735.
Шаг 4. Вычисляем y:
y₁ = 2·0.57735·cos(π/6) = 1.1547·0.8660 = 1.
y₂ = −2·0.57735·cos(π/2) = 0.
y₃ = −2·0.57735·cos(π/6) = −1.
Шаг 5. Возвращаем x = y − b/(3a) = y − (−6)/3 = y + 2.
x₁ = 1+2=3, x₂ = 0+2=2, x₃ = −1+2=1. Готово!
Где применяется
- Школьная алгебра и ЕГЭ: решение уравнений высших степеней, поиск корней многочленов.
- Инженерные расчёты: анализ устойчивости конструкций, расчёт резонансных частот в механике.
- Экономика и финансы: модели окупаемости инвестиций с нелинейной зависимостью от времени.
- Физика: законы движения тел с учётом кубических поправок, термодинамические уравнения состояния.
- Компьютерная графика: расчёт кривых Безье третьего порядка, траектории в 3D-пространстве.
- Программирование: численные методы, реализация солверов уравнений в математических пакетах.
Важные нюансы
- Коэффициент a обязан быть ненулевым — иначе уравнение не кубическое, а квадратное или линейное.
- При D > 0 комплексные корни всегда идут парой сопряжённых чисел: a + bi и a − bi.
- Кубическое уравнение всегда имеет хотя бы один действительный корень — это следует из основной теоремы алгебры и нечётности степени.
- Результаты округляются до 4 знаков после запятой. При очень малых значениях (менее 10⁻¹⁰) они обнуляются для избежания артефактов.
- Метод Кардано неустойчив при p близком к нулю и q близком к нулю — в таких случаях решение может содержать погрешности округления.
- Для учебных и справочных целей; при ответственных инженерных расчётах проверяйте результат вручную или в специализированном ПО.
Частые ошибки
- Деление на ноль: забывают проверить, что a ≠ 0. Если a = 0, калькулятор сообщит об ошибке и не будет считать.
- Забыли знак минус: при подстановке отрицательных коэффициентов в формулы p и q легко ошибиться. Калькулятор делает это за вас.
- Путаница с корнями: кубическое уравнение имеет ровно три корня с учётом кратности, даже если два из них комплексные.
- Округление на каждом шаге: при ручном счёте не рекомендуется округлять промежуточные значения — накапливается ошибка. Калькулятор хранит полную точность до финала.
- Игнорирование комплексных корней: в физических задачах иногда нужны только действительные корни, но математически полное решение включает и комплексные.
- Неверный ввод: ввод текста или запятых вместо точек в дробях приводит к ошибке. Используйте точку как десятичный разделитель.
Ответы на частые вопросы
В: Может ли калькулятор решить уравнение с дробными коэффициентами?
О: Да, вводите любые действительные числа, включая десятичные дроби (через точку) и отрицательные значения.
В: Что делать, если дискриминант положительный, а мне нужны только действительные корни?
О: Калькулятор показывает все три корня. Действительный корень всегда присутствует — это x₁. Остальные два будут комплексными.
В: Почему результат показывает «0 + i» вместо просто «i»?
О: Для единообразия формат всегда a ± bi. Если действительная часть близка к нулю, она отображается как 0.
В: Работает ли калькулятор на мобильных устройствах?
О: Да, интерфейс адаптивный — на узких экранах форма и результат располагаются в одну колонку.
В: Какая точность у вычислений?
О: Результаты округляются до 4 знаков после запятой. Внутренние вычисления ведутся с точностью JavaScript (около 15 значащих цифр).
В: Можно ли скопировать результат?
О: Да, просто выделите текст в карточке результата и скопируйте его.
Источники и справочные данные
Расчёт основан на формуле Кардано (XVI век) — классическом алгебраическом методе решения кубических уравнений. Дополнительно используется тригонометрический подход для случая трёх действительных корней (при D < 0). Все формулы соответствуют стандартному курсу высшей алгебры и школьной программе углублённого уровня. Для учебных и справочных целей; при ответственных инженерных расчётах проверяйте результат вручную или в специализированном ПО.
Кубическое уравнение: полное руководство
Что такое кубическое уравнение?
Кубическое уравнение — это алгебраическое уравнение третьей степени. Его общий вид: ax³ + bx² + cx + d = 0, где a, b, c, d — действительные числа, причём a ≠ 0. Если a = 0, уравнение перестаёт быть кубическим и становится квадратным (или линейным).
В отличие от квадратных уравнений, которые изучают в 8 классе, кубические уравнения обладают более богатым поведением: они могут иметь от одного до трёх действительных корней, а также комплексные корни. Это делает их важным инструментом в физике, инженерии и экономике.
Краткая история решения
Формула для решения кубического уравнения была найдена в XVI веке итальянскими математиками Сципионом дель Ферро и Никколо Тартальей, а позже опубликована Джероламо Кардано в книге «Великое искусство» (1545 год). Именно поэтому метод называют формулой Кардано. Это стало прорывом — до того момента решение уравнений третьей степени казалось невозможным.
Интересный факт: открытие формулы Кардано подтолкнуло математиков к поиску решений уравнений четвёртой степени, что в итоге привело к развитию теории групп и современной алгебры.
Три случая дискриминанта
После приведения уравнения к виду y³ + py + q = 0 (через замену x = y − b/(3a)) вычисляют дискриминант D = (q/2)² + (p/3)³. Знак D определяет характер корней:
- D > 0: один действительный корень и два комплексно-сопряжённых. Это самый простой случай — формула Кардано работает напрямую.
- D = 0: три действительных корня, причём хотя бы два совпадают (кратный корень). Возможен и тройной корень, если p = q = 0.
- D < 0: три различных действительных корня. Формула Кардано сталкивается с необходимостью извлекать кубический корень из комплексного числа, поэтому удобнее использовать тригонометрическое представление.
Почему калькулятор полезен?
Ручное решение кубического уравнения — процесс трудоёмкий и чреватый ошибками. Нужно аккуратно вычислить p и q, определить дискриминант, затем в зависимости от его знака применить разные формулы. Одна опечатка в знаке или потеря скобки — и результат неверен. Калькулятор автоматизирует все шаги и выдаёт три корня за доли секунды.
Практические приложения
Кубические уравнения встречаются в реальной жизни гораздо чаще, чем может показаться. Вот несколько примеров:
- Объём параллелепипеда: если известен объём и соотношения сторон, задача сводится к кубическому уравнению.
- Траектория снаряда: с учётом сопротивления воздуха уравнение движения часто содержит кубический член.
- Финансовые модели: сложные проценты с реинвестированием могут приводить к кубическим зависимостям.
- Графики и анимация: кривые Безье третьего порядка описываются кубическими параметрическими уравнениями.
Связь с теоремой Виета
Для кубического уравнения также работает обобщённая теорема Виета. Если x₁, x₂, x₃ — корни уравнения x³ + bx² + cx + d = 0, то:
x₁ + x₂ + x₃ = −b
x₁x₂ + x₁x₃ + x₂x₃ = c
x₁x₂x₃ = −d
Это полезно для проверки результатов: подставьте найденные корни в эти соотношения и убедитесь, что они выполняются (с учётом округления). Калькулятор вычисляет корни независимо от теоремы Виета, но вы можете использовать её для самопроверки.
Советы по использованию калькулятора
Для получения точных результатов следуйте простым правилам. Вводите коэффициенты внимательно, особенно знаки. Если уравнение выглядит как x³ − 6x² + 11x − 6 = 0, то a=1, b=-6, c=11, d=-6. Не забывайте, что отсутствующий член означает коэффициент 0: например, в уравнении x³ − 8 = 0 коэффициент b=0 и c=0.
Если вы решаете уравнение из учебника и ответ дан в виде целых чисел, а калькулятор показывает 2.9999 — не пугайтесь: это результат округления, на самом деле корень равен 3. Такое случается из-за накопления погрешностей в числах с плавающей точкой.
Заключение
Калькулятор кубического уравнения — это быстрый и надёжный способ найти все корни без рутинных вычислений. Он подходит для учёбы, проверки домашних заданий, инженерных прикидок и любых ситуаций, где нужно оперативно решить уравнение третьей степени. Помните: математика — это не только формулы, но и понимание. Используйте калькулятор как помощника, а не замену мышлению.
CiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCBmaWVsZEEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tY29lZi1hJyk7CiAgICAgICAgICAgIGNvbnN0IGZpZWxkQiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1jb2VmLWInKTsKICAgICAgICAgICAgY29uc3QgZmllbGRDID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWNvZWYtYycpOwogICAgICAgICAgICBjb25zdCBmaWVsZEQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tY29lZi1kJyk7CiAgICAgICAgICAgIGNvbnN0IGVyckEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZXJyLWEnKTsKICAgICAgICAgICAgY29uc3QgZXJyQiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1lcnItYicpOwogICAgICAgICAgICBjb25zdCBlcnJDID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWVyci1jJyk7CiAgICAgICAgICAgIGNvbnN0IGVyckQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZXJyLWQnKTsKICAgICAgICAgICAgY29uc3QgY2FsY0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1jYWxjLWJ0bicpOwogICAgICAgICAgICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1yZXNldC1idG4nKTsKICAgICAgICAgICAgY29uc3Qgcm9vdDFFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1yb290MScpOwogICAgICAgICAgICBjb25zdCByb290MkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLXJvb3QyJyk7CiAgICAgICAgICAgIGNvbnN0IHJvb3QzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tcm9vdDMnKTsKICAgICAgICAgICAgY29uc3QgZGlzY0luZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZGlzY3JpbWluYW50LWluZm8nKTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGhpZGVBbGxFcnJvcnMoKSB7CiAgICAgICAgICAgICAgICBlcnJBLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICAgICAgICAgIGVyckIuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgICAgICAgICAgZXJyQy5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICBlcnJELmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc2hvd0Vycm9yKGVsKSB7CiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbChmaWVsZCkgewogICAgICAgICAgICAgICAgY29uc3QgcmF3ID0gZmllbGQudmFsdWUudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gJycpIHJldHVybiBOYU47CiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHJhdyk7CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtKSkgcmV0dXJuIE5hTjsKICAgICAgICAgICAgICAgIHJldHVybiBudW07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHJvdW5kTnVtKG51bSkgewogICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShudW0pKSByZXR1cm4gbnVtOwogICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKG51bSkgPCAxZS0xMCkgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBjb25zdCByb3VuZGVkID0gTWF0aC5yb3VuZChudW0gKiAxMDAwMCkgLyAxMDAwMDsKICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhyb3VuZGVkKSA8IDFlLTEwKSByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHJldHVybiByb3VuZGVkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRDb21wbGV4KHJlYWwsIGltYWcpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSByb3VuZE51bShyZWFsKTsKICAgICAgICAgICAgICAgIGNvbnN0IGkgPSByb3VuZE51bShpbWFnKTsKICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhpKSA8IDFlLTEwKSByZXR1cm4gU3RyaW5nKHIpOwogICAgICAgICAgICAgICAgY29uc3QgYWJzSSA9IE1hdGguYWJzKGkpOwogICAgICAgICAgICAgICAgY29uc3Qgc2lnbiA9IGkgPj0gMCA/ICcrJyA6ICfiiJInOwogICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHIpIDwgMWUtMTApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPj0gMCA/ICcnIDogJ+KIkicpICsgKGFic0kgPT09IDEgPyAnaScgOiBhYnNJICsgJ2knKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByICsgJyAnICsgc2lnbiArICcgJyArIChhYnNJID09PSAxID8gJ2knIDogYWJzSSArICdpJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFJvb3QocmVhbCwgaW1hZykgewogICAgICAgICAgICAgICAgY29uc3QgciA9IHJvdW5kTnVtKHJlYWwpOwogICAgICAgICAgICAgICAgY29uc3QgaSA9IHJvdW5kTnVtKGltYWcpOwogICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGkpIDwgMWUtMTApIHJldHVybiBTdHJpbmcocik7CiAgICAgICAgICAgICAgICBjb25zdCBhYnNJID0gTWF0aC5hYnMoaSk7CiAgICAgICAgICAgICAgICBjb25zdCBzaWduID0gaSA+PSAwID8gJysnIDogJ+KIkic7CiAgICAgICAgICAgICAgICByZXR1cm4gciArICcgJyArIHNpZ24gKyAnICcgKyAoYWJzSSA9PT0gMSA/ICdpJyA6IGFic0kgKyAnaScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBzb2x2ZUN1YmljKGEsIGIsIGMsIGQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gLWIgLyAoMyAqIGEpOwogICAgICAgICAgICAgICAgY29uc3QgcCA9ICgzICogYSAqIGMgLSBiICogYikgLyAoMyAqIGEgKiBhKTsKICAgICAgICAgICAgICAgIGNvbnN0IHEgPSAoMiAqIGIgKiBiICogYiAtIDkgKiBhICogYiAqIGMgKyAyNyAqIGEgKiBhICogZCkgLyAoMjcgKiBhICogYSAqIGEpOwogICAgICAgICAgICAgICAgY29uc3QgRCA9IChxIC8gMikgKiAocSAvIDIpICsgKHAgLyAzKSAqIChwIC8gMykgKiAocCAvIDMpOwoKICAgICAgICAgICAgICAgIGxldCByb290cyA9IFtdOwoKICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhwKSA8IDFlLTEyICYmIE1hdGguYWJzKHEpIDwgMWUtMTIpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSByb3VuZE51bShzaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgcm9vdHMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVhbDogdmFsLCBpbWFnOiAwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVhbDogdmFsLCBpbWFnOiAwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVhbDogdmFsLCBpbWFnOiAwIH0KICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJvb3RzLCBEOiAwLCBwLCBxLCBzaGlmdCB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChEID4gMWUtMTIpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzcXJ0RCA9IE1hdGguc3FydChEKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtMSA9IC1xIC8gMiArIHNxcnREOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm0yID0gLXEgLyAyIC0gc3FydEQ7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdSA9IE1hdGguY2JydCh0ZXJtMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IE1hdGguY2JydCh0ZXJtMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeTEgPSB1ICsgdjsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsUGFydCA9IC0odSArIHYpIC8gMjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnUGFydCA9IChNYXRoLnNxcnQoMykgLyAyKSAqICh1IC0gdik7CiAgICAgICAgICAgICAgICAgICAgcm9vdHMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVhbDogeTEsIGltYWc6IDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgeyByZWFsOiByZWFsUGFydCwgaW1hZzogaW1hZ1BhcnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgeyByZWFsOiByZWFsUGFydCwgaW1hZzogLWltYWdQYXJ0IH0KICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhEKSA8PSAxZS0xMikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBNYXRoLmNicnQoLXEgLyAyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB5MSA9IDIgKiB1OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHkyID0gLXU7CiAgICAgICAgICAgICAgICAgICAgcm9vdHMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVhbDogeTEsIGltYWc6IDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgeyByZWFsOiB5MiwgaW1hZzogMCB9LAogICAgICAgICAgICAgICAgICAgICAgICB7IHJlYWw6IHkyLCBpbWFnOiAwIH0KICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwaGkgPSBNYXRoLmFjb3MoKC1xIC8gMikgLyBNYXRoLnNxcnQoTWF0aC5wb3coTWF0aC5hYnMocCkgLyAzLCAzKSkpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSAyICogTWF0aC5zcXJ0KE1hdGguYWJzKHApIC8gMyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeTEgPSByICogTWF0aC5jb3MocGhpIC8gMyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeTIgPSAtciAqIE1hdGguY29zKChwaGkgKyBNYXRoLlBJKSAvIDMpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHkzID0gLXIgKiBNYXRoLmNvcygocGhpIC0gTWF0aC5QSSkgLyAzKTsKICAgICAgICAgICAgICAgICAgICByb290cyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgeyByZWFsOiB5MSwgaW1hZzogMCB9LAogICAgICAgICAgICAgICAgICAgICAgICB7IHJlYWw6IHkyLCBpbWFnOiAwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVhbDogeTMsIGltYWc6IDAgfQogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcm9vdHMgPSByb290cy5tYXAociA9PiAoewogICAgICAgICAgICAgICAgICAgIHJlYWw6IHIucmVhbCArIHNoaWZ0LAogICAgICAgICAgICAgICAgICAgIGltYWc6IHIuaW1hZwogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7IHJvb3RzLCBELCBwLCBxLCBzaGlmdCB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICAgICAgICAgICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgICAgICAgICAgICBjb25zdCBhID0gZ2V0VmFsKGZpZWxkQSk7CiAgICAgICAgICAgICAgICBjb25zdCBiID0gZ2V0VmFsKGZpZWxkQik7CiAgICAgICAgICAgICAgICBjb25zdCBjID0gZ2V0VmFsKGZpZWxkQyk7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gZ2V0VmFsKGZpZWxkRCk7CgogICAgICAgICAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKGEpKSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yKGVyckEpOwogICAgICAgICAgICAgICAgICAgIGVyckEudGV4dENvbnRlbnQgPSAn0JLQstC10LTQuNGC0LUg0YfQuNGB0LvQvi4nOwogICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoYSkgPCAxZS0xMikgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcihlcnJBKTsKICAgICAgICAgICAgICAgICAgICBlcnJBLnRleHRDb250ZW50ID0gJ9Ca0L7RjdGE0YTQuNGG0LjQtdC90YIgYSDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0YDQsNCy0LXQvSDQvdGD0LvRjiAo0YPRgNCw0LLQvdC10L3QuNC1INC90LUg0LrRg9Cx0LjRh9C10YHQutC+0LUpLic7CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzTmFOKGIpKSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yKGVyckIpOwogICAgICAgICAgICAgICAgICAgIGVyckIudGV4dENvbnRlbnQgPSAn0JLQstC10LTQuNGC0LUg0YfQuNGB0LvQvi4nOwogICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc05hTihjKSkgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcihlcnJDKTsKICAgICAgICAgICAgICAgICAgICBlcnJDLnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INGH0LjRgdC70L4uJzsKICAgICAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZCkpIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoZXJyRCk7CiAgICAgICAgICAgICAgICAgICAgZXJyRC50ZXh0Q29udGVudCA9ICfQktCy0LXQtNC40YLQtSDRh9C40YHQu9C+Lic7CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChoYXNFcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJvb3QxRWwudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgICAgICAgICByb290MkVsLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICAgICAgcm9vdDNFbC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICAgICAgICAgIGRpc2NJbmZvLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNvbHZlQ3ViaWMoYSwgYiwgYywgZCk7CiAgICAgICAgICAgICAgICBjb25zdCByb290cyA9IHJlc3VsdC5yb290czsKCiAgICAgICAgICAgICAgICByb290MUVsLnRleHRDb250ZW50ID0gZm9ybWF0Um9vdChyb290c1swXS5yZWFsLCByb290c1swXS5pbWFnKTsKICAgICAgICAgICAgICAgIHJvb3QyRWwudGV4dENvbnRlbnQgPSBmb3JtYXRSb290KHJvb3RzWzFdLnJlYWwsIHJvb3RzWzFdLmltYWcpOwogICAgICAgICAgICAgICAgcm9vdDNFbC50ZXh0Q29udGVudCA9IGZvcm1hdFJvb3Qocm9vdHNbMl0ucmVhbCwgcm9vdHNbMl0uaW1hZyk7CgogICAgICAgICAgICAgICAgY29uc3QgRHJvdW5kZWQgPSByb3VuZE51bShyZXN1bHQuRCk7CiAgICAgICAgICAgICAgICBsZXQgZGlzY0Rlc2MgPSAnJzsKICAgICAgICAgICAgICAgIGlmIChEcm91bmRlZCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBkaXNjRGVzYyA9ICdEID4gMCDigJQg0L7QtNC40L0g0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90YvQuSDQutC+0YDQtdC90Ywg0Lgg0LTQstCwINC60L7QvNC/0LvQtdC60YHQvdC+LdGB0L7Qv9GA0Y/QttGR0L3QvdGL0YUnOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhEcm91bmRlZCkgPCAxZS0xMCkgewogICAgICAgICAgICAgICAgICAgIGRpc2NEZXNjID0gJ0QgPSAwIOKAlCDRgtGA0Lgg0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90YvRhSDQutC+0YDQvdGPICjQtdGB0YLRjCDQutGA0LDRgtC90YvQtSknOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkaXNjRGVzYyA9ICdEIDwgMCDigJQg0YLRgNC4INGA0LDQt9C70LjRh9C90YvRhSDQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3Ri9GFINC60L7RgNC90Y8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlzY0luZm8udGV4dENvbnRlbnQgPSAn0JTQuNGB0LrRgNC40LzQuNC90LDQvdGCIEQg4omIICcgKyBEcm91bmRlZCArICcgKCcgKyBkaXNjRGVzYyArICcpLiBwIOKJiCAnICsgcm91bmROdW0ocmVzdWx0LnApICsgJywgcSDiiYggJyArIHJvdW5kTnVtKHJlc3VsdC5xKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcmVzZXRGb3JtKCkgewogICAgICAgICAgICAgICAgZmllbGRBLnZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBmaWVsZEIudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIGZpZWxkQy52YWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgZmllbGRELnZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgICAgICAgICAgICByb290MUVsLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICByb290MkVsLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICByb290M0VsLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICBkaXNjSW5mby50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxjQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsKICAgICAgICAgICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEZvcm0pOwoKICAgICAgICAgICAgY29uc3QgYWxsRmllbGRzID0gW2ZpZWxkQSwgZmllbGRCLCBmaWVsZEMsIGZpZWxkRF07CiAgICAgICAgICAgIGFsbEZpZWxkcy5mb3JFYWNoKGYgPT4gewogICAgICAgICAgICAgICAgZi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9KSgpOwogICAg