Калькулятор удельной теплоёмкости
Расчёт удельной теплоёмкости вещества, количества теплоты, массы или изменения температуры по классической формуле термодинамики Q = c·m·ΔT.
—
Удельная теплоёмкость
Дж/(кг·°C)
Как пользоваться калькулятором
1
Выберите, что нужно рассчитать: удельную теплоёмкость c, количество теплоты Q, массу m или изменение температуры ΔT. От этого зависит, какие поля станут недоступны для ввода.
2
Заполните известные параметры. Например, для расчёта теплоты при нагреве 2 кг воды от 20 °C до 100 °C введите m = 2 кг, c = 4200 Дж/(кг·°C), T₁ = 20, T₂ = 100. Можно выбрать вещество из списка — удельная теплоёмкость подставится автоматически.
3
Нажмите кнопку «Рассчитать». Результат появится в карточке справа (на мобильном — под формой). Значение будет выведено в нескольких единицах для удобства сравнения.
4
При необходимости измените единицы в выпадающих списках рядом с полями ввода (Дж, кДж, кал, ккал для теплоты; кг, г для массы; Дж/(кг·°C), кДж/(кг·K), кал/(г·°C) для теплоёмкости). Калькулятор автоматически переведёт значения в систему СИ перед расчётом.
Примеры использования
Нагрев воды в электрическом чайнике
Масса воды m = 1,7 кг, начальная температура T₁ = 15 °C, конечная T₂ = 95 °C, c = 4200 Дж/(кг·°C). Требуемое количество теплоты: Q = 4200 · 1,7 · (95 − 15) = 571 200 Дж ≈ 571 кДж ≈ 136,5 ккал. Это позволяет оценить время нагрева при известной мощности чайника.
Остывание алюминиевой детали
Алюминиевый блок массой 0,5 кг (c = 900 Дж/(кг·°C)) остывает от 200 °C до 30 °C. Количество отданной теплоты: Q = 900 · 0,5 · (30 − 200) = −76 500 Дж. Знак «минус» означает, что теплота отдаётся в окружающую среду. Модуль Q = 76,5 кДж.
Определение неизвестной теплоёмкости вещества
Кусок металла массой 0,3 кг получил 13 800 Дж теплоты и нагрелся от 25 °C до 85 °C. Удельная теплоёмкость: c = 13 800 / (0,3 · 60) = 767 Дж/(кг·°C), что близко к значению для стекла или кирпича. Так можно идентифицировать материал по тепловым свойствам.
Важные нюансы
- Удельная и молярная теплоёмкость: удельная теплоёмкость относится к 1 кг вещества и измеряется в Дж/(кг·K); молярная — к 1 молю (Дж/(моль·K)). Для пересчёта нужна молярная масса. Калькулятор работает с удельными величинами.
- Различие Cp и Cv: теплоёмкость при постоянном давлении (Cp) и постоянном объёме (Cv) различаются для газов. Для твёрдых тел и жидкостей разница невелика. Справочные значения в калькуляторе — это Cp при комнатной температуре и атмосферном давлении.
- Зависимость от температуры: удельная теплоёмкость реальных веществ не является строго постоянной — она зависит от температуры. Приведённые значения являются средними для диапазона 0–100 °C. При больших перепадах температур точность расчёта снижается.
- Фазовые переходы: формула Q = c·m·ΔT не учитывает теплоту плавления и парообразования. При нагреве вещества через точку плавления или кипения необходимо отдельно учитывать скрытую теплоту. Данный калькулятор применим только в пределах одного агрегатного состояния.
- Техника безопасности: при нагревании веществ в лаборатории или на кухне используйте термостойкую посуду, избегайте контакта с горячими поверхностями, применяйте защитные перчатки. Не нагревайте легковоспламеняющиеся жидкости на открытом огне без специального оборудования.
Источники данных
- IUPAC Gold Book — официальные определения удельной теплоёмкости (specific heat capacity) и молярной теплоёмкости согласно Международному союзу теоретической и прикладной химии. doi: 10.1351/goldbook.S05824
- NIST Chemistry WebBook — база данных Национального института стандартов и технологий США (National Institute of Standards and Technology), содержащая термодинамические свойства тысяч веществ, включая теплоёмкости при различных температурах. webbook.nist.gov/chemistry
- CRC Handbook of Chemistry and Physics — фундаментальный справочник (Chemical Rubber Company), содержащий таблицы удельной и молярной теплоёмкости для широкого круга веществ. Используется как стандартный источник в вузовских курсах физики и химии.
- Стандартные справочные значения из учебных пособий по общей физике (Савельев, Сивухин) и химии (Глинка, Некрасов) для распространённых веществ: воды, металлов, строительных материалов, пищевых продуктов. Расчёт основан на классической формуле Q = c·m·ΔT и школьно-вузовских табличных данных.
Калькулятор удельной теплоёмкости позволяет быстро вычислить тепловые характеристики веществ по формуле Q = c·m·ΔT. Инструмент полезен студентам физических и химических специальностей, инженерам-теплотехникам, поварам и всем, кто работает с нагревом и охлаждением материалов. Поддерживается расчёт в единицах СИ (Дж, кг, °C) и внесистемных единицах (калории, ккал, граммы). Встроенный справочник содержит удельные теплоёмкости 20 распространённых веществ — от воды и масел до металлов и строительных материалов. Все вычисления сопровождаются подробной расшифровкой и переводом в альтернативные единицы измерения.
CiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vINCh0L/RgNCw0LLQvtGH0L3QuNC6INCy0LXRidC10YHRgtCyOiDRg9C00LXQu9GM0L3QsNGPINGC0LXQv9C70L7RkdC80LrQvtGB0YLRjCDQsiDQlNC2LyjQutCzwrfCsEMpCiAgICB2YXIgc3Vic3RhbmNlRGF0YSA9IHsKICAgICAgd2F0ZXI6IHsgYzogNDIwMCwgbmFtZTogJ9CS0L7QtNCwINC20LjQtNC60LDRjycgfSwKICAgICAgaWNlOiB7IGM6IDIxMDAsIG5hbWU6ICfQm9GR0LQnIH0sCiAgICAgIHN0ZWFtOiB7IGM6IDIyMDAsIG5hbWU6ICfQktC+0LTRj9C90L7QuSDQv9Cw0YAnIH0sCiAgICAgIGFsdW1pbnVtOiB7IGM6IDkwMCwgbmFtZTogJ9CQ0LvRjtC80LjQvdC40LknIH0sCiAgICAgIGlyb246IHsgYzogNDYwLCBuYW1lOiAn0JbQtdC70LXQt9C+JyB9LAogICAgICBjb3BwZXI6IHsgYzogMzgwLCBuYW1lOiAn0JzQtdC00YwnIH0sCiAgICAgIHNpbHZlcjogeyBjOiAyNTAsIG5hbWU6ICfQodC10YDQtdCx0YDQvicgfSwKICAgICAgZ29sZDogeyBjOiAxMzAsIG5hbWU6ICfQl9C+0LvQvtGC0L4nIH0sCiAgICAgIGdsYXNzOiB7IGM6IDg0MCwgbmFtZTogJ9Ch0YLQtdC60LvQvicgfSwKICAgICAgYnJpY2s6IHsgYzogODgwLCBuYW1lOiAn0JrQuNGA0L/QuNGHINC60LXRgNCw0LzQuNGH0LXRgdC60LjQuScgfSwKICAgICAgd29vZDogeyBjOiAxNzAwLCBuYW1lOiAn0JTRgNC10LLQtdGB0LjQvdCwICjRgdC+0YHQvdCwKScgfSwKICAgICAgb2lsOiB7IGM6IDE3MDAsIG5hbWU6ICfQnNCw0YHQu9C+INC/0L7QtNGB0L7Qu9C90LXRh9C90L7QtScgfSwKICAgICAgZXRoYW5vbDogeyBjOiAyNDAwLCBuYW1lOiAn0K3RgtC40LvQvtCy0YvQuSDRgdC/0LjRgNGCJyB9LAogICAgICBhaXI6IHsgYzogMTAwNSwgbmFtZTogJ9CS0L7Qt9C00YPRhSDRgdGD0YXQvtC5JyB9LAogICAgICBzYW5kOiB7IGM6IDgzMCwgbmFtZTogJ9Cf0LXRgdC+0Log0LrQstCw0YDRhtC10LLRi9C5JyB9LAogICAgICBncmFuaXRlOiB7IGM6IDc5MCwgbmFtZTogJ9CT0YDQsNC90LjRgicgfSwKICAgICAgbWlsazogeyBjOiAzOTAwLCBuYW1lOiAn0JzQvtC70L7QutC+INGG0LXQu9GM0L3QvtC1JyB9LAogICAgICBnbHljZXJpbjogeyBjOiAyNDMwLCBuYW1lOiAn0JPQu9C40YbQtdGA0LjQvScgfSwKICAgICAgbWVyY3VyeTogeyBjOiAxNDAsIG5hbWU6ICfQoNGC0YPRgtGMJyB9LAogICAgICBsZWFkOiB7IGM6IDEzMCwgbmFtZTogJ9Ch0LLQuNC90LXRhicgfQogICAgfTsKCiAgICAvLyDQmtC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0L/QtdGA0LXQstC+0LTQsCDQsiDQsdCw0LfQvtCy0YvQtSDQtdC00LjQvdC40YbRiyAo0JTQtiwg0LrQsykKICAgIHZhciBxVW5pdEZhY3RvcnMgPSB7CiAgICAgIEo6IDEsCiAgICAgIGtKOiAxMDAwLAogICAgICBjYWw6IDQuMTg0LAogICAgICBrY2FsOiA0MTg0CiAgICB9OwoKICAgIHZhciBtYXNzVW5pdEZhY3RvcnMgPSB7CiAgICAgIGtnOiAxLAogICAgICBnOiAwLjAwMQogICAgfTsKCiAgICB2YXIgY1VuaXRGYWN0b3JzID0gewogICAgICBKX2tnQzogMSwKICAgICAga0pfa2dLOiAxMDAwLAogICAgICBjYWxfZ0M6IDQxODQKICAgIH07CgogICAgdmFyIGNVbml0TGFiZWxzID0gewogICAgICBKX2tnQzogJ9CU0LYvKNC60LPCt8KwQyknLAogICAgICBrSl9rZ0s6ICfQutCU0LYvKNC60LPCt0spJywKICAgICAgY2FsX2dDOiAn0LrQsNC7LyjQs8K3wrBDKScKICAgIH07CgogICAgdmFyIHFVbml0TGFiZWxzID0gewogICAgICBKOiAn0JTQticsCiAgICAgIGtKOiAn0LrQlNC2JywKICAgICAgY2FsOiAn0LrQsNC7JywKICAgICAga2NhbDogJ9C60LrQsNC7JwogICAgfTsKCiAgICB2YXIgbWFzc1VuaXRMYWJlbHMgPSB7CiAgICAgIGtnOiAn0LrQsycsCiAgICAgIGc6ICfQsycKICAgIH07CgogICAgLy8gRE9NLdGN0LvQtdC80LXQvdGC0YsKICAgIHZhciBjYWxjTW9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxjTW9kZScpOwogICAgdmFyIHN1YnN0YW5jZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UnKTsKICAgIHZhciBtYXNzVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzc1ZhbHVlJyk7CiAgICB2YXIgbWFzc1VuaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzc1VuaXQnKTsKICAgIHZhciBjVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY1ZhbHVlJyk7CiAgICB2YXIgY1VuaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY1VuaXQnKTsKICAgIHZhciB0MVZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3QxVmFsdWUnKTsKICAgIHZhciB0MlZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3QyVmFsdWUnKTsKICAgIHZhciBxVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncVZhbHVlJyk7CiAgICB2YXIgcVVuaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncVVuaXQnKTsKICAgIHZhciBjYWxjdWxhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsY3VsYXRlQnRuJyk7CiAgICB2YXIgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXRCdG4nKTsKCiAgICB2YXIgbWFzc0dyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3NHcm91cCcpOwogICAgdmFyIGNWYWx1ZUdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NWYWx1ZUdyb3VwJyk7CiAgICB2YXIgdDFHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0MUdyb3VwJyk7CiAgICB2YXIgdDJHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0Mkdyb3VwJyk7CiAgICB2YXIgcUdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3FHcm91cCcpOwoKICAgIHZhciBtYXNzRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzc0Vycm9yJyk7CiAgICB2YXIgY0Vycm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NFcnJvcicpOwogICAgdmFyIHQxRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndDFFcnJvcicpOwogICAgdmFyIHQyRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndDJFcnJvcicpOwogICAgdmFyIHFFcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxRXJyb3InKTsKICAgIHZhciBnZW5lcmFsRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhbEVycm9yJyk7CgogICAgdmFyIHByaW1hcnlSZXN1bHRWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmltYXJ5UmVzdWx0VmFsdWUnKTsKICAgIHZhciBwcmltYXJ5UmVzdWx0TGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbWFyeVJlc3VsdExhYmVsJyk7CiAgICB2YXIgcHJpbWFyeVJlc3VsdFVuaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbWFyeVJlc3VsdFVuaXQnKTsKICAgIHZhciByZXN1bHREZXRhaWxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdERldGFpbHMnKTsKCiAgICAvLyDQntCx0L3QvtCy0LvQtdC90LjQtSDQstC40LTQuNC80L7RgdGC0Lgg0L/QvtC70LXQuSDQsiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC+0YIg0YDQtdC20LjQvNCwCiAgICBmdW5jdGlvbiB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKSB7CiAgICAgIHZhciBtb2RlID0gY2FsY01vZGUudmFsdWU7CgogICAgICBtYXNzR3JvdXAuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuLWZpZWxkJyk7CiAgICAgIGNWYWx1ZUdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbi1maWVsZCcpOwogICAgICB0MUdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbi1maWVsZCcpOwogICAgICB0Mkdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbi1maWVsZCcpOwogICAgICBxR3JvdXAuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuLWZpZWxkJyk7CgogICAgICBpZiAobW9kZSA9PT0gJ2MnKSB7CiAgICAgICAgY1ZhbHVlR3JvdXAuY2xhc3NMaXN0LmFkZCgnaGlkZGVuLWZpZWxkJyk7CiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ1EnKSB7CiAgICAgICAgcUdyb3VwLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbi1maWVsZCcpOwogICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdtJykgewogICAgICAgIG1hc3NHcm91cC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4tZmllbGQnKTsKICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnZGVsdGFUJykgewogICAgICAgIHQxR3JvdXAuY2xhc3NMaXN0LmFkZCgnaGlkZGVuLWZpZWxkJyk7CiAgICAgICAgdDJHcm91cC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4tZmllbGQnKTsKICAgICAgfQoKICAgICAgY2xlYXJBbGxFcnJvcnMoKTsKICAgIH0KCiAgICAvLyDQkNCy0YLQvtC30LDQv9C+0LvQvdC10L3QuNC1IGMg0L/RgNC4INCy0YvQsdC+0YDQtSDQstC10YnQtdGB0YLQstCwCiAgICBmdW5jdGlvbiB1cGRhdGVDRnJvbVN1YnN0YW5jZSgpIHsKICAgICAgdmFyIHN1YktleSA9IHN1YnN0YW5jZS52YWx1ZTsKICAgICAgaWYgKHN1YktleSA9PT0gJ2N1c3RvbScpIHsKICAgICAgICBjVmFsdWUudmFsdWUgPSAnJzsKICAgICAgICBjVmFsdWUucmVtb3ZlQXR0cmlidXRlKCdyZWFkb25seScpOwogICAgICAgIGNWYWx1ZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnJzsKICAgICAgfSBlbHNlIGlmIChzdWJzdGFuY2VEYXRhW3N1YktleV0pIHsKICAgICAgICB2YXIgY0luQmFzZSA9IHN1YnN0YW5jZURhdGFbc3ViS2V5XS5jOwogICAgICAgIHZhciBjdXJyZW50Q1VuaXQgPSBjVW5pdC52YWx1ZTsKICAgICAgICB2YXIgZmFjdG9yID0gY1VuaXRGYWN0b3JzW2N1cnJlbnRDVW5pdF0gfHwgMTsKICAgICAgICBjVmFsdWUudmFsdWUgPSBwYXJzZUZsb2F0KChjSW5CYXNlIC8gZmFjdG9yKS50b0ZpeGVkKDQpKTsKICAgICAgICBjVmFsdWUuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICdyZWFkb25seScpOwogICAgICAgIGNWYWx1ZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2YxZjVmOSc7CiAgICAgIH0KICAgIH0KCiAgICAvLyDQntGH0LjRgdGC0LrQsCDQvtGI0LjQsdC+0LoKICAgIGZ1bmN0aW9uIGNsZWFyQWxsRXJyb3JzKCkgewogICAgICBtYXNzRXJyb3IudGV4dENvbnRlbnQgPSAnJzsKICAgICAgY0Vycm9yLnRleHRDb250ZW50ID0gJyc7CiAgICAgIHQxRXJyb3IudGV4dENvbnRlbnQgPSAnJzsKICAgICAgdDJFcnJvci50ZXh0Q29udGVudCA9ICcnOwogICAgICBxRXJyb3IudGV4dENvbnRlbnQgPSAnJzsKICAgICAgZ2VuZXJhbEVycm9yLnRleHRDb250ZW50ID0gJyc7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0Vycm9yKGVsZW1lbnQsIG1lc3NhZ2UpIHsKICAgICAgaWYgKGVsZW1lbnQpIHsKICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgfQogICAgfQoKICAgIC8vINCf0L7Qu9GD0YfQtdC90LjQtSDRh9C40YHQu9C+0LLQvtCz0L4g0LfQvdCw0YfQtdC90LjRjyDQuNC3INC/0L7Qu9GPCiAgICBmdW5jdGlvbiBnZXROdW1lcmljVmFsdWUoaW5wdXRFbCkgewogICAgICB2YXIgdmFsID0gaW5wdXRFbC52YWx1ZS50cmltKCk7CiAgICAgIGlmICh2YWwgPT09ICcnKSByZXR1cm4gTmFOOwogICAgICB2YXIgbnVtID0gcGFyc2VGbG9hdCh2YWwpOwogICAgICByZXR1cm4gbnVtOwogICAgfQoKICAgIC8vINCS0LDQu9C40LTQsNGG0LjRjyDQuCDRgdCx0L7RgCDQv9Cw0YDQsNC80LXRgtGA0L7QsgogICAgZnVuY3Rpb24gdmFsaWRhdGVBbmRDb2xsZWN0KCkgewogICAgICBjbGVhckFsbEVycm9ycygpOwogICAgICB2YXIgbW9kZSA9IGNhbGNNb2RlLnZhbHVlOwogICAgICB2YXIgZXJyb3JzID0gW107CgogICAgICB2YXIgcGFyYW1zID0gewogICAgICAgIG1vZGU6IG1vZGUsCiAgICAgICAgbWFzc19rZzogTmFOLAogICAgICAgIGNfSmtnQzogTmFOLAogICAgICAgIGRlbHRhVDogTmFOLAogICAgICAgIFFfSjogTmFOCiAgICAgIH07CgogICAgICAvLyDQnNCw0YHRgdCwCiAgICAgIGlmIChtb2RlICE9PSAnbScpIHsKICAgICAgICB2YXIgbVZhbCA9IGdldE51bWVyaWNWYWx1ZShtYXNzVmFsdWUpOwogICAgICAgIGlmIChpc05hTihtVmFsKSB8fCBtVmFsIDw9IDApIHsKICAgICAgICAgIHNob3dFcnJvcihtYXNzRXJyb3IsICfQktCy0LXQtNC40YLQtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+INC00LvRjyDQvNCw0YHRgdGLLicpOwogICAgICAgICAgZXJyb3JzLnB1c2goJ21hc3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG1GYWN0b3IgPSBtYXNzVW5pdEZhY3RvcnNbbWFzc1VuaXQudmFsdWVdIHx8IDE7CiAgICAgICAgICBwYXJhbXMubWFzc19rZyA9IG1WYWwgKiBtRmFjdG9yOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8g0KPQtNC10LvRjNC90LDRjyDRgtC10L/Qu9C+0ZHQvNC60L7RgdGC0YwKICAgICAgaWYgKG1vZGUgIT09ICdjJykgewogICAgICAgIHZhciBjVmFsID0gZ2V0TnVtZXJpY1ZhbHVlKGNWYWx1ZSk7CiAgICAgICAgaWYgKGlzTmFOKGNWYWwpIHx8IGNWYWwgPD0gMCkgewogICAgICAgICAgc2hvd0Vycm9yKGNFcnJvciwgJ9CS0LLQtdC00LjRgtC1INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4g0LTQu9GPINGD0LTQtdC70YzQvdC+0Lkg0YLQtdC/0LvQvtGR0LzQutC+0YHRgtC4LicpOwogICAgICAgICAgZXJyb3JzLnB1c2goJ2MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNGYWN0b3IgPSBjVW5pdEZhY3RvcnNbY1VuaXQudmFsdWVdIHx8IDE7CiAgICAgICAgICBwYXJhbXMuY19Ka2dDID0gY1ZhbCAqIGNGYWN0b3I7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyDQotC10LzQv9C10YDQsNGC0YPRgNGLCiAgICAgIGlmIChtb2RlICE9PSAnZGVsdGFUJykgewogICAgICAgIHZhciB0MSA9IGdldE51bWVyaWNWYWx1ZSh0MVZhbHVlKTsKICAgICAgICB2YXIgdDIgPSBnZXROdW1lcmljVmFsdWUodDJWYWx1ZSk7CiAgICAgICAgaWYgKGlzTmFOKHQxKSkgewogICAgICAgICAgc2hvd0Vycm9yKHQxRXJyb3IsICfQktCy0LXQtNC40YLQtSDQvdCw0YfQsNC70YzQvdGD0Y4g0YLQtdC80L/QtdGA0LDRgtGD0YDRgy4nKTsKICAgICAgICAgIGVycm9ycy5wdXNoKCd0MScpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNOYU4odDIpKSB7CiAgICAgICAgICBzaG93RXJyb3IodDJFcnJvciwgJ9CS0LLQtdC00LjRgtC1INC60L7QvdC10YfQvdGD0Y4g0YLQtdC80L/QtdGA0LDRgtGD0YDRgy4nKTsKICAgICAgICAgIGVycm9ycy5wdXNoKCd0MicpOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzTmFOKHQxKSAmJiAhaXNOYU4odDIpKSB7CiAgICAgICAgICBpZiAodDEgPT09IHQyKSB7CiAgICAgICAgICAgIHNob3dFcnJvcih0MkVycm9yLCAn0KLQtdC80L/QtdGA0LDRgtGD0YDRiyDQvdC1INC00L7Qu9C20L3RiyDQsdGL0YLRjCDRgNCw0LLQvdGLICjOlFQgPSAwKS4nKTsKICAgICAgICAgICAgZXJyb3JzLnB1c2goJ2RlbHRhVF96ZXJvJyk7CiAgICAgICAgICB9CiAgICAgICAgICBwYXJhbXMuZGVsdGFUID0gdDIgLSB0MTsKICAgICAgICAgIHBhcmFtcy5UMSA9IHQxOwogICAgICAgICAgcGFyYW1zLlQyID0gdDI7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyDQmtC+0LvQuNGH0LXRgdGC0LLQviDRgtC10L/Qu9C+0YLRiwogICAgICBpZiAobW9kZSAhPT0gJ1EnKSB7CiAgICAgICAgdmFyIHFWYWwgPSBnZXROdW1lcmljVmFsdWUocVZhbHVlKTsKICAgICAgICBpZiAoaXNOYU4ocVZhbCkgfHwgcVZhbCA8IDApIHsKICAgICAgICAgIHNob3dFcnJvcihxRXJyb3IsICfQktCy0LXQtNC40YLQtSDQvdC10L7RgtGA0LjRhtCw0YLQtdC70YzQvdC+0LUg0YfQuNGB0LvQviDQtNC70Y8g0YLQtdC/0LvQvtGC0YsuJyk7CiAgICAgICAgICBlcnJvcnMucHVzaCgncScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgcUZhY3RvciA9IHFVbml0RmFjdG9yc1txVW5pdC52YWx1ZV0gfHwgMTsKICAgICAgICAgIHBhcmFtcy5RX0ogPSBxVmFsICogcUZhY3RvcjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB7IHBhcmFtczogcGFyYW1zLCBlcnJvcnM6IGVycm9ycyB9OwogICAgfQoKICAgIC8vINCk0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40LUg0YfQuNGB0LvQsAogICAgZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG51bSwgZGVjaW1hbHMpIHsKICAgICAgaWYgKGlzTmFOKG51bSkgfHwgIWlzRmluaXRlKG51bSkpIHJldHVybiAn4oCUJzsKICAgICAgZGVjaW1hbHMgPSAoZGVjaW1hbHMgIT09IHVuZGVmaW5lZCkgPyBkZWNpbWFscyA6IDI7CiAgICAgIHJldHVybiBwYXJzZUZsb2F0KG51bS50b0ZpeGVkKGRlY2ltYWxzKSkudG9TdHJpbmcoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRTY2llbnRpZmljKG51bSwgZGVjaW1hbHMpIHsKICAgICAgaWYgKGlzTmFOKG51bSkgfHwgIWlzRmluaXRlKG51bSkpIHJldHVybiAn4oCUJzsKICAgICAgaWYgKE1hdGguYWJzKG51bSkgPCAxZS02ICYmIG51bSAhPT0gMCkgewogICAgICAgIHJldHVybiBudW0udG9FeHBvbmVudGlhbChkZWNpbWFscyB8fCAzKTsKICAgICAgfQogICAgICBpZiAoTWF0aC5hYnMobnVtKSA+PSAxZTYpIHsKICAgICAgICByZXR1cm4gbnVtLnRvRXhwb25lbnRpYWwoZGVjaW1hbHMgfHwgMyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcihudW0sIGRlY2ltYWxzKTsKICAgIH0KCiAgICAvLyDQoNCw0YHRh9GR0YIKICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsKICAgICAgdmFyIGNvbGxlY3RlZCA9IHZhbGlkYXRlQW5kQ29sbGVjdCgpOwogICAgICBpZiAoY29sbGVjdGVkLmVycm9ycy5sZW5ndGggPiAwKSB7CiAgICAgICAgcHJpbWFyeVJlc3VsdFZhbHVlLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgcHJpbWFyeVJlc3VsdExhYmVsLnRleHRDb250ZW50ID0gJ9Ce0YjQuNCx0LrQsCDQstCy0L7QtNCwJzsKICAgICAgICBwcmltYXJ5UmVzdWx0VW5pdC50ZXh0Q29udGVudCA9ICcnOwogICAgICAgIHJlc3VsdERldGFpbHMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPSJjb2xvcjojZGMyNjI2OyI+0J/QvtC20LDQu9GD0LnRgdGC0LAsINC40YHQv9GA0LDQstGM0YLQtSDQvtGI0LjQsdC60Lgg0LIg0YTQvtGA0LzQtS48L3NwYW4+JzsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBwID0gY29sbGVjdGVkLnBhcmFtczsKICAgICAgdmFyIG1vZGUgPSBwLm1vZGU7CiAgICAgIHZhciByZXN1bHRTSSA9IE5hTjsKICAgICAgdmFyIHJlc3VsdExhYmVsVGV4dCA9ICcnOwogICAgICB2YXIgcmVzdWx0VW5pdFRleHQgPSAnJzsKCiAgICAgIGlmIChtb2RlID09PSAnYycpIHsKICAgICAgICByZXN1bHRTSSA9IHAuUV9KIC8gKHAubWFzc19rZyAqIE1hdGguYWJzKHAuZGVsdGFUKSk7CiAgICAgICAgcmVzdWx0TGFiZWxUZXh0ID0gJ9Cj0LTQtdC70YzQvdCw0Y8g0YLQtdC/0LvQvtGR0LzQutC+0YHRgtGMJzsKICAgICAgICByZXN1bHRVbml0VGV4dCA9ICfQlNC2LyjQutCzwrfCsEMpJzsKICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnUScpIHsKICAgICAgICByZXN1bHRTSSA9IHAuY19Ka2dDICogcC5tYXNzX2tnICogcC5kZWx0YVQ7CiAgICAgICAgcmVzdWx0TGFiZWxUZXh0ID0gJ9Ca0L7Qu9C40YfQtdGB0YLQstC+INGC0LXQv9C70L7RgtGLJzsKICAgICAgICByZXN1bHRVbml0VGV4dCA9ICfQlNC2JzsKICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnbScpIHsKICAgICAgICByZXN1bHRTSSA9IHAuUV9KIC8gKHAuY19Ka2dDICogTWF0aC5hYnMocC5kZWx0YVQpKTsKICAgICAgICByZXN1bHRMYWJlbFRleHQgPSAn0JzQsNGB0YHQsCDQstC10YnQtdGB0YLQstCwJzsKICAgICAgICByZXN1bHRVbml0VGV4dCA9ICfQutCzJzsKICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnZGVsdGFUJykgewogICAgICAgIHJlc3VsdFNJID0gcC5RX0ogLyAocC5jX0prZ0MgKiBwLm1hc3Nfa2cpOwogICAgICAgIHJlc3VsdExhYmVsVGV4dCA9ICfQmNC30LzQtdC90LXQvdC40LUg0YLQtdC80L/QtdGA0LDRgtGD0YDRiyAo0LzQvtC00YPQu9GMKSc7CiAgICAgICAgcmVzdWx0VW5pdFRleHQgPSAnwrBDJzsKICAgICAgfQoKICAgICAgaWYgKCFpc0Zpbml0ZShyZXN1bHRTSSkgfHwgaXNOYU4ocmVzdWx0U0kpIHx8IHJlc3VsdFNJIDwgMCkgewogICAgICAgIHByaW1hcnlSZXN1bHRWYWx1ZS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgIHByaW1hcnlSZXN1bHRMYWJlbC50ZXh0Q29udGVudCA9ICfQntGI0LjQsdC60LAg0YDQsNGB0YfRkdGC0LAnOwogICAgICAgIHByaW1hcnlSZXN1bHRVbml0LnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgcmVzdWx0RGV0YWlscy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9ImNvbG9yOiNkYzI2MjY7Ij7QoNC10LfRg9C70YzRgtCw0YIg0L3QtSDQvtC/0YDQtdC00LXQu9GR0L0uINCf0YDQvtCy0LXRgNGM0YLQtSDQstCy0LXQtNGR0L3QvdGL0LUg0LfQvdCw0YfQtdC90LjRjy48L3NwYW4+JzsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHByaW1hcnlSZXN1bHRMYWJlbC50ZXh0Q29udGVudCA9IHJlc3VsdExhYmVsVGV4dDsKCiAgICAgIC8vINCk0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40LUg0L7RgdC90L7QstC90L7Qs9C+INGA0LXQt9GD0LvRjNGC0LDRgtCwCiAgICAgIHZhciBhYnNSZXN1bHQgPSBNYXRoLmFicyhyZXN1bHRTSSk7CiAgICAgIHByaW1hcnlSZXN1bHRWYWx1ZS50ZXh0Q29udGVudCA9IGZvcm1hdFNjaWVudGlmaWMoYWJzUmVzdWx0LCA0KTsKCiAgICAgIC8vINCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUg0LXQtNC40L3QuNGG0YsKICAgICAgdmFyIGRldGFpbHNIVE1MID0gJyc7CgogICAgICBpZiAobW9kZSA9PT0gJ2MnKSB7CiAgICAgICAgcHJpbWFyeVJlc3VsdFVuaXQudGV4dENvbnRlbnQgPSAn0JTQti8o0LrQs8K3wrBDKSc7CiAgICAgICAgdmFyIGNfa0prZ0sgPSBhYnNSZXN1bHQgLyAxMDAwOwogICAgICAgIHZhciBjX2NhbGdDID0gYWJzUmVzdWx0IC8gNDE4NDsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+0JIg0LrQlNC2LyjQutCzwrdLKTo8L3NwYW4+PHNwYW4gY2xhc3M9ImRldGFpbC12YWx1ZSI+JyArIGZvcm1hdFNjaWVudGlmaWMoY19rSmtnSywgNCkgKyAnINC60JTQti8o0LrQs8K3Syk8L3NwYW4+PC9kaXY+JzsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+0JIg0LrQsNC7LyjQs8K3wrBDKTo8L3NwYW4+PHNwYW4gY2xhc3M9ImRldGFpbC12YWx1ZSI+JyArIGZvcm1hdFNjaWVudGlmaWMoY19jYWxnQywgNikgKyAnINC60LDQuy8o0LPCt8KwQyk8L3NwYW4+PC9kaXY+JzsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLWFsdCI+0JjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC90LDRjyDRhNC+0YDQvNGD0LvQsDogYyA9IFEgLyAobSDCtyB8zpRUfCk8L2Rpdj4nOwogICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdRJykgewogICAgICAgIHByaW1hcnlSZXN1bHRVbml0LnRleHRDb250ZW50ID0gJ9CU0LYnOwogICAgICAgIHZhciBxX2tKID0gcmVzdWx0U0kgLyAxMDAwOwogICAgICAgIHZhciBxX2NhbCA9IHJlc3VsdFNJIC8gNC4xODQ7CiAgICAgICAgdmFyIHFfa2NhbCA9IHJlc3VsdFNJIC8gNDE4NDsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+0JIg0LrQlNC2Ojwvc3Bhbj48c3BhbiBjbGFzcz0iZGV0YWlsLXZhbHVlIj4nICsgZm9ybWF0U2NpZW50aWZpYyhxX2tKLCA0KSArICcg0LrQlNC2PC9zcGFuPjwvZGl2Pic7CiAgICAgICAgZGV0YWlsc0hUTUwgKz0gJzxkaXYgY2xhc3M9ImRldGFpbC1yb3ciPjxzcGFuIGNsYXNzPSJkZXRhaWwtbGFiZWwiPtCSINC60LDQuzo8L3NwYW4+PHNwYW4gY2xhc3M9ImRldGFpbC12YWx1ZSI+JyArIGZvcm1hdFNjaWVudGlmaWMocV9jYWwsIDIpICsgJyDQutCw0Ls8L3NwYW4+PC9kaXY+JzsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+0JIg0LrQutCw0Ls6PC9zcGFuPjxzcGFuIGNsYXNzPSJkZXRhaWwtdmFsdWUiPicgKyBmb3JtYXRTY2llbnRpZmljKHFfa2NhbCwgNCkgKyAnINC60LrQsNC7PC9zcGFuPjwvZGl2Pic7CiAgICAgICAgZGV0YWlsc0hUTUwgKz0gJzxkaXYgY2xhc3M9ImRldGFpbC1hbHQiPtCX0L3QsNC6OiAnICsgKHJlc3VsdFNJID49IDAgPyAn0L/QvtC70L7QttC40YLQtdC70YzQvdGL0LkgKNGC0LXQu9C+INC/0L7Qu9GD0YfQsNC10YIg0YLQtdC/0LvQviknIDogJ9C+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C5ICjRgtC10LvQviDQvtGC0LTQsNGR0YIg0YLQtdC/0LvQviknKSArICc8L2Rpdj4nOwogICAgICAgIGRldGFpbHNIVE1MICs9ICc8ZGl2IGNsYXNzPSJkZXRhaWwtYWx0Ij7QmNGB0L/QvtC70YzQt9C+0LLQsNC90L3QsNGPINGE0L7RgNC80YPQu9CwOiBRID0gYyDCtyBtIMK3IM6UVDwvZGl2Pic7CiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ20nKSB7CiAgICAgICAgcHJpbWFyeVJlc3VsdFVuaXQudGV4dENvbnRlbnQgPSAn0LrQsyc7CiAgICAgICAgdmFyIG1fZyA9IHJlc3VsdFNJICogMTAwMDsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+0JIg0LPRgNCw0LzQvNCw0YU6PC9zcGFuPjxzcGFuIGNsYXNzPSJkZXRhaWwtdmFsdWUiPicgKyBmb3JtYXRTY2llbnRpZmljKG1fZywgMikgKyAnINCzPC9zcGFuPjwvZGl2Pic7CiAgICAgICAgZGV0YWlsc0hUTUwgKz0gJzxkaXYgY2xhc3M9ImRldGFpbC1hbHQiPtCY0YHQv9C+0LvRjNC30L7QstCw0L3QvdCw0Y8g0YTQvtGA0LzRg9C70LA6IG0gPSBRIC8gKGMgwrcgfM6UVHwpPC9kaXY+JzsKICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnZGVsdGFUJykgewogICAgICAgIHByaW1hcnlSZXN1bHRVbml0LnRleHRDb250ZW50ID0gJ8KwQyAo0LjQu9C4IEspJzsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+0K3QutCy0LjQstCw0LvQtdC90YLQvdC+INCyINC60LXQu9GM0LLQuNC90LDRhTo8L3NwYW4+PHNwYW4gY2xhc3M9ImRldGFpbC12YWx1ZSI+JyArIGZvcm1hdFNjaWVudGlmaWMoYWJzUmVzdWx0LCA0KSArICcgSzwvc3Bhbj48L2Rpdj4nOwogICAgICAgIGRldGFpbHNIVE1MICs9ICc8ZGl2IGNsYXNzPSJkZXRhaWwtYWx0Ij7QmNGB0L/QvtC70YzQt9C+0LLQsNC90L3QsNGPINGE0L7RgNC80YPQu9CwOiB8zpRUfCA9IFEgLyAoYyDCtyBtKTwvZGl2Pic7CiAgICAgICAgZGV0YWlsc0hUTUwgKz0gJzxkaXYgY2xhc3M9ImRldGFpbC1hbHQiPtCf0YDQuNC80LXRh9Cw0L3QuNC1OiDQv9C+0LrQsNC30LDQvSDQvNC+0LTRg9C70Ywg0LjQt9C80LXQvdC10L3QuNGPINGC0LXQvNC/0LXRgNCw0YLRg9GA0YsuINCd0LDQv9GA0LDQstC70LXQvdC40LUgKNC90LDQs9GA0LXQsiDQuNC70Lgg0L7RhdC70LDQttC00LXQvdC40LUpINC30LDQstC40YHQuNGCINC+0YIg0LfQvdCw0LrQsCBRLjwvZGl2Pic7CiAgICAgIH0KCiAgICAgIC8vINCf0L7QutCw0Lcg0LjRgdGF0L7QtNC90YvRhSDQtNCw0L3QvdGL0YUKICAgICAgZGV0YWlsc0hUTUwgKz0gJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTJweDtjb2xvcjojOTRhM2I4OyI+0JjRgdGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUg0YDQsNGB0YfRkdGC0LA6PC9kaXY+JzsKICAgICAgaWYgKG1vZGUgIT09ICdtJykgewogICAgICAgIGRldGFpbHNIVE1MICs9ICc8ZGl2IGNsYXNzPSJkZXRhaWwtcm93Ij48c3BhbiBjbGFzcz0iZGV0YWlsLWxhYmVsIj7QnNCw0YHRgdCwOjwvc3Bhbj48c3BhbiBjbGFzcz0iZGV0YWlsLXZhbHVlIj4nICsgZm9ybWF0TnVtYmVyKHAubWFzc19rZywgNCkgKyAnINC60LM8L3NwYW4+PC9kaXY+JzsKICAgICAgfQogICAgICBpZiAobW9kZSAhPT0gJ2MnKSB7CiAgICAgICAgZGV0YWlsc0hUTUwgKz0gJzxkaXYgY2xhc3M9ImRldGFpbC1yb3ciPjxzcGFuIGNsYXNzPSJkZXRhaWwtbGFiZWwiPtCi0LXQv9C70L7RkdC80LrQvtGB0YLRjDo8L3NwYW4+PHNwYW4gY2xhc3M9ImRldGFpbC12YWx1ZSI+JyArIGZvcm1hdE51bWJlcihwLmNfSmtnQywgMikgKyAnINCU0LYvKNC60LPCt8KwQyk8L3NwYW4+PC9kaXY+JzsKICAgICAgfQogICAgICBpZiAobW9kZSAhPT0gJ2RlbHRhVCcpIHsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+zpRUIChU4oKCIOKIkiBU4oKBKTo8L3NwYW4+PHNwYW4gY2xhc3M9ImRldGFpbC12YWx1ZSI+JyArIGZvcm1hdE51bWJlcihwLmRlbHRhVCwgMikgKyAnIMKwQzwvc3Bhbj48L2Rpdj4nOwogICAgICB9CiAgICAgIGlmIChtb2RlICE9PSAnUScpIHsKICAgICAgICBkZXRhaWxzSFRNTCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+PHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+0KLQtdC/0LvQvtGC0LAgUTo8L3NwYW4+PHNwYW4gY2xhc3M9ImRldGFpbC12YWx1ZSI+JyArIGZvcm1hdE51bWJlcihwLlFfSiwgMikgKyAnINCU0LY8L3NwYW4+PC9kaXY+JzsKICAgICAgfQoKICAgICAgcmVzdWx0RGV0YWlscy5pbm5lckhUTUwgPSBkZXRhaWxzSFRNTDsKICAgIH0KCiAgICAvLyDQodCx0YDQvtGBCiAgICBmdW5jdGlvbiByZXNldEFsbCgpIHsKICAgICAgY2FsY01vZGUudmFsdWUgPSAnYyc7CiAgICAgIHN1YnN0YW5jZS52YWx1ZSA9ICdjdXN0b20nOwogICAgICBtYXNzVmFsdWUudmFsdWUgPSAnJzsKICAgICAgbWFzc1VuaXQudmFsdWUgPSAna2cnOwogICAgICBjVmFsdWUudmFsdWUgPSAnJzsKICAgICAgY1ZhbHVlLnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKTsKICAgICAgY1ZhbHVlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcnOwogICAgICBjVW5pdC52YWx1ZSA9ICdKX2tnQyc7CiAgICAgIHQxVmFsdWUudmFsdWUgPSAnJzsKICAgICAgdDJWYWx1ZS52YWx1ZSA9ICcnOwogICAgICBxVmFsdWUudmFsdWUgPSAnJzsKICAgICAgcVVuaXQudmFsdWUgPSAnSic7CiAgICAgIGNsZWFyQWxsRXJyb3JzKCk7CiAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOwogICAgICBwcmltYXJ5UmVzdWx0VmFsdWUudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgcHJpbWFyeVJlc3VsdExhYmVsLnRleHRDb250ZW50ID0gJ9Cj0LTQtdC70YzQvdCw0Y8g0YLQtdC/0LvQvtGR0LzQutC+0YHRgtGMJzsKICAgICAgcHJpbWFyeVJlc3VsdFVuaXQudGV4dENvbnRlbnQgPSAn0JTQti8o0LrQs8K3wrBDKSc7CiAgICAgIHJlc3VsdERldGFpbHMuaW5uZXJIVE1MID0gJyc7CiAgICB9CgogICAgLy8g0KHQu9GD0YjQsNGC0LXQu9C4INGB0L7QsdGL0YLQuNC5CiAgICBjYWxjTW9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7CiAgICAgIGNsZWFyQWxsRXJyb3JzKCk7CiAgICB9KTsKCiAgICBzdWJzdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgIHVwZGF0ZUNGcm9tU3Vic3RhbmNlKCk7CiAgICAgIGNsZWFyQWxsRXJyb3JzKCk7CiAgICB9KTsKCiAgICBjVW5pdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKHN1YnN0YW5jZS52YWx1ZSAhPT0gJ2N1c3RvbScpIHsKICAgICAgICB1cGRhdGVDRnJvbVN1YnN0YW5jZSgpOwogICAgICB9CiAgICAgIGNsZWFyQWxsRXJyb3JzKCk7CiAgICB9KTsKCiAgICBjYWxjdWxhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgY2FsY3VsYXRlKCk7CiAgICB9KTsKCiAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICByZXNldEFsbCgpOwogICAgfSk7CgogICAgLy8g0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8KICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOwogICAgcHJpbWFyeVJlc3VsdFZhbHVlLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICBwcmltYXJ5UmVzdWx0TGFiZWwudGV4dENvbnRlbnQgPSAn0KPQtNC10LvRjNC90LDRjyDRgtC10L/Qu9C+0ZHQvNC60L7RgdGC0YwnOwogICAgcHJpbWFyeVJlc3VsdFVuaXQudGV4dENvbnRlbnQgPSAn0JTQti8o0LrQs8K3wrBDKSc7CiAgICByZXN1bHREZXRhaWxzLmlubmVySFRNTCA9ICcnOwoKICB9KSgpOwo=