Skip to content

Instantly share code, notes, and snippets.

@mkitti
Last active December 7, 2022 02:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkitti/f051b4df7e054bea53c0903e0fa8d5bb to your computer and use it in GitHub Desktop.
Save mkitti/f051b4df7e054bea53c0903e0fa8d5bb to your computer and use it in GitHub Desktop.
SVG Demo of Fourier Transform
<!DOCTYPE html><html lang="en"><head><meta name="viewport" content="width=device-width"><meta charset="utf-8">
<meta name="pluto-insertion-spot-meta">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="white"><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#2a2928"><meta name="color-scheme" content="light dark"><link rel="icon" type="image/png" sizes="16x16" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/favicon-16x16.347d2855.png" integrity="sha384-3qsGeVLdddzV9oIkj3PhXXQX2CZCjOD/CiyrPQOX6InOWw3HAHClrsQhPfX9uRAj" crossorigin="anonymous"><link rel="icon" type="image/png" sizes="32x32" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/favicon-32x32.8789add4.png" integrity="sha384-cOe5vSoBIgKNgkUL27p9RpsGVY0uBg9PejLccDy+fR8ZD1Iv5dF1MGHjIZAIZwm6" crossorigin="anonymous"><link rel="icon" type="image/png" sizes="96x96" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/favicon-96x96.48689391.png" integrity="sha384-TN49cYb8GyNmrZT14bsYXXo4l1x1NJeJ/EHuVAauAKsNPopPHLojijs9jFT4Vs8c" crossorigin="anonymous"><link rel="pluto-logo-big" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/logo.004c1d7c.svg" integrity="sha384-GkQkODcGxsrSRJCkeakBXihum0GUM44cwBgKyutDimectXCbCgj6Vu3jlrueqEcN" crossorigin="anonymous"><link rel="pluto-logo-small" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/favicon_unsaturated.d1387b25.svg" integrity="sha384-omwjH+Qy3hpAVf5FYd/pkaDBuVAfsEDRN7eBxEA8Ek00OAWP+aiV+GpEYk3I7lyo" crossorigin="anonymous"><script type="module" src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.a387c700.js" integrity="sha384-QIR9QyVw/4Jjo61jdv+/mCwdQswxAKPDEp9b4ZO4iitvft7o7DizyKCKnv5Z2gp5" crossorigin="anonymous"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/juliamono.a2a5b30d.css" integrity="sha384-w9GV7UZkK3QBeqyAZWUEUfw3PoTu18mc0hv4YHtsbAmJztljHyviMYTzE31mbfYz" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.068d9aa1.css" integrity="sha384-aHmbK3lRzFq1wFrbmy+lGOAI6NqK4W9YtrUt5Hsly9hxAUYU8tJ9JNBnixenGWPR" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/vollkorn.089565a8.css" integrity="sha384-jnV/84VtSgBLF70H+s2rxJcOUZIMDR+X/ElFZA83i9ZtZSWiIMFAgPyrWkOJV08q" crossorigin="anonymous"><script defer="">console.log("Pluto.jl, by Fons van der Plas (https://github.com/fonsp), Mikołaj Bochenski (https://github.com/malyvsen), Michiel Dral (https://github.com/dralletje) and friends 🌈");</script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.4b96dd74.js" defer="" integrity="sha384-Y+UtWANyXLeovyghpAI8j9/VZXWboD6G5ZCckOsJO99PawAh/utJxFikf62WBaSu" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.9f9dc874.js" defer="" integrity="sha384-tkFo1EK72I9JvoTmHFa199dfRzW8mkXPUkHb/N7UhYI+bxKzX3Kh8LNCZz1ltsFF" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.90ede145.js" defer="" integrity="sha384-CuNU9gQg6fa/yynNqNWjHWzPm4nj+d7O6+HXsNGSqClhs/bYQIbBC3Lw/kh8Ukui" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.dbeed08a.js" defer="" integrity="sha384-1BEdQwXfZi4ZpsNV8w1X8pQcVK1/DS/+/M8OTo3gol7mdEspSN7nT6llX57NQCSt" crossorigin="anonymous"></script><script id="iframe-resizer-content-window-script" src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.6386bd9d.js" crossorigin="anonymous" defer="" integrity="sha384-tgN2a0VDi/lCYwZuDqT7L+A/Y/9kpxf3HV7zv2BJ5Fu7zW0EClq0nM4crfK3TRPs"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.8158fa1d.css" type="text/css" integrity="sha384-GPV/oHrMyayhHoGAwB87CuP4Z/qQDdQDpASH4hYmPhuXXq7f0V9nCWpru4ZBn9Xi" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.9fb5a9e0.css" type="text/css" media="all" data-pluto-file="hide-ui" integrity="sha384-7uAgyRtq5iffqlxCL5SnLdJGDJvclXx1F88O8PTht8UrVz9PXuytcPcxgxC6zeCQ" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.d3307b27.css" type="text/css" integrity="sha384-3x2qZDazgbcSpu1KwtC7K1OB1Tkfg6mRNoxs0wf+u5qGDUVfPW9p0dgiiuz/vnWq" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.e3402eb2.css" type="text/css" integrity="sha384-B+5EZ65SoErJCxHBqVwY2DKgNzKHjf/49SFYB2EfFS8GNvMy/aFGjAPMDiVq+QpM" crossorigin="anonymous"><link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/juliamono.a2a5b30d.css" as="style" integrity="sha384-w9GV7UZkK3QBeqyAZWUEUfw3PoTu18mc0hv4YHtsbAmJztljHyviMYTzE31mbfYz" crossorigin="anonymous"><link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/vollkorn.089565a8.css" as="style" integrity="sha384-jnV/84VtSgBLF70H+s2rxJcOUZIMDR+X/ElFZA83i9ZtZSWiIMFAgPyrWkOJV08q" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.e82e08bd.css" type="text/css" integrity="sha384-7YN+h8b6N4N65qk8TG/J2KPF95D8z3sGNd06rokz4CX9oWu0KnRAF5cVWu3BkkaN" crossorigin="anonymous"><script data-pluto-file="launch-parameters">
window.pluto_notebook_id = undefined;
window.pluto_isolated_cell_ids = undefined;
window.pluto_notebookfile = "data:text/julia;charset=utf-8;base64,IyMjIEEgUGx1dG8uamwgbm90ZWJvb2sgIyMjCiMgdjAuMTkuMTYKCnVzaW5nIE1hcmtkb3duCnVzaW5nIEludGVyYWN0aXZlVXRpbHMKCiMgVGhpcyBQbHV0byBub3RlYm9vayB1c2VzIEBiaW5kIGZvciBpbnRlcmFjdGl2aXR5LiBXaGVuIHJ1bm5pbmcgdGhpcyBub3RlYm9vayBvdXRzaWRlIG9mIFBsdXRvLCB0aGUgZm9sbG93aW5nICdtb2NrIHZlcnNpb24nIG9mIEBiaW5kIGdpdmVzIGJvdW5kIHZhcmlhYmxlcyBhIGRlZmF1bHQgdmFsdWUgKGluc3RlYWQgb2YgYW4gZXJyb3IpLgptYWNybyBiaW5kKGRlZiwgZWxlbWVudCkKICAgIHF1b3RlCiAgICAgICAgbG9jYWwgaXYgPSB0cnkgQmFzZS5sb2FkZWRfbW9kdWxlc1tCYXNlLlBrZ0lkKEJhc2UuVVVJRCgiNmU2OTZjNzItNjU0Mi0yMDY3LTcyNjUtNDIyMDZjNzU2MTUwIiksICJBYnN0cmFjdFBsdXRvRGluZ2V0amVzIildLkJvbmRzLmluaXRpYWxfdmFsdWUgY2F0Y2g7IGIgLT4gbWlzc2luZzsgZW5kCiAgICAgICAgbG9jYWwgZWwgPSAkKGVzYyhlbGVtZW50KSkKICAgICAgICBnbG9iYWwgJChlc2MoZGVmKSkgPSBDb3JlLmFwcGxpY2FibGUoQmFzZS5nZXQsIGVsKSA/IEJhc2UuZ2V0KGVsKSA6IGl2KGVsKQogICAgICAgIGVsCiAgICBlbmQKZW5kCgojIOKVlOKVkOKVoSAzNjI3MTRiMC03NWQ4LTExZWQtMjJjMC00OWNjZWIxNjFiYjUKYmVnaW4KCXVzaW5nIEZGVFcKCXVzaW5nIEh5cGVydGV4dExpdGVyYWwKCc64ID0gcmFuZ2UoLc+ALCBzdG9wPc+ALCBsZW5ndGg9MTAxKQplbmQKCiMg4pWU4pWQ4pWhIGM4MTVlOGUxLWZmYjEtNGI5My04ZjNlLWE4ZmQwYzE0OTU5NwpiZWdpbgoJIyBmbGF0dGVuZWQKCSNzdmdfeCA9IDEwMCpjb3MuKM64KSAuKiBSX2NpcmNsZV9jb3MuKM64KSAuKyAyMDAKCSNzdmdfeSA9IDEwMCpzaW4uKM64KSAuKiBSX2NpcmNsZV9jb3MuKM64KSAuKyAyMDAKCgkjIGNpcmNsZQoJc3ZnX3ggPSAxMDAqY29zLijOuCkgLisgMjAwCglzdmdfeSA9IDEwMCpzaW4uKM64KSAuKyAyMDAKCWJ1ZiA9IElPQnVmZmVyKCkKCWZvciAoeCwgeSkgaW4gemlwKHN2Z194LCBzdmdfeSkKCQlwcmludChidWYsIHggLCIsICIsIHksICIsIikKCWVuZAoJc3RyID0gU3RyaW5nKHRha2UhKGJ1ZilbMTplbmQtMV0pCglAYmluZCBteXN2ZyBAaHRsKCIiIgoJPHN2ZyBpZD0ic3ZnLWVkaXQtZGVtbyIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZhbHVlPSIzIj4KCQoJPGRlZnM+CgkgICAgPGNpcmNsZSBpZD0icG9pbnQtaGFuZGxlIgoJICAgICAgICByPSIxMCIgeD0iMCIgeT0iMCIKCSAgICAgICAgc3Ryb2tlLXdpZHRoPSI0IgoJICAgICAgICBmaWxsPSIjZmZmIgoJICAgICAgICBmaWxsLW9wYWNpdHk9IjAuNCIKCSAgICAgICAgc3Ryb2tlPSIjZmZmIi8+Cgk8L2RlZnM+Cgk8Y2lyY2xlIGN4PSIyMDAiIGN5PSIyMDAiIHI9IjEwIiAvPgoJPHBvbHlnb24gaWQ9ImVkaXQtc3RhciIKCSAgICBzdHJva2U9IiMyOWUiCgkgICAgc3Ryb2tlLXdpZHRoPSIyMCIKCSAgICBzdHJva2UtbGluZWpvaW49InJvdW5kIgoJICAgIGZpbGw9Im5vbmUiCgkgICAgcG9pbnRzPSIkKHN0cikiLz4KCTwvc3ZnPgoJPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vaW50ZXJhY3Rqc0AxLjEwLjE3L2Rpc3QvaW50ZXJhY3QubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZm91cmllci9mb3VyaWVyLm1pbi5qcyI+PC9zY3JpcHQ+Cgk8c2NyaXB0PgoJY29uc29sZS5sb2coIlNWRyBTY3JpcHQiKQogIGNvbnN0IHNucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycKICBjb25zdCB4bnMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycKICBjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Zy1lZGl0LWRlbW8nKQogIGNvbnN0IHN0YXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zdGFyJykKICBsZXQgcm9vdE1hdHJpeAogIGNvbnN0IG9yaWdpbmFsUG9pbnRzID0gW10KICBsZXQgdHJhbnNmb3JtZWRQb2ludHMgPSBbXQoKICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3Rhci5wb2ludHMubnVtYmVyT2ZJdGVtczsgaSA8IGxlbi0yMDsgaSArPSAyMCkgewogICAgY29uc3QgaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHNucywgJ3VzZScpCiAgICBjb25zdCBwb2ludCA9IHN0YXIucG9pbnRzLmdldEl0ZW0oaSkKICAgIGNvbnN0IG5ld1BvaW50ID0gcm9vdC5jcmVhdGVTVkdQb2ludCgpCgogICAgaGFuZGxlLnNldEF0dHJpYnV0ZU5TKHhucywgJ2hyZWYnLCAnI3BvaW50LWhhbmRsZScpCiAgICBoYW5kbGUuc2V0QXR0cmlidXRlKCdjbGFzcycsICdwb2ludC1oYW5kbGUnKQoKICAgIGhhbmRsZS54LmJhc2VWYWwudmFsdWUgPSBuZXdQb2ludC54ID0gcG9pbnQueAogICAgaGFuZGxlLnkuYmFzZVZhbC52YWx1ZSA9IG5ld1BvaW50LnkgPSBwb2ludC55CgogICAgaGFuZGxlLnNldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcsIGkpCgogICAgb3JpZ2luYWxQb2ludHMucHVzaChuZXdQb2ludCkKCiAgICByb290LmFwcGVuZENoaWxkKGhhbmRsZSkKICB9CgogIGZ1bmN0aW9uIGFwcGx5VHJhbnNmb3JtcyAoZXZlbnQpIHsKICAgIHJvb3RNYXRyaXggPSByb290LmdldFNjcmVlbkNUTSgpCgogICAgdHJhbnNmb3JtZWRQb2ludHMgPSBvcmlnaW5hbFBvaW50cy5tYXAoKHBvaW50KSA9PiB7CiAgICAgIHJldHVybiBwb2ludC5tYXRyaXhUcmFuc2Zvcm0ocm9vdE1hdHJpeCkKICAgIH0pCgogICAgaW50ZXJhY3QoJy5wb2ludC1oYW5kbGUnKS5kcmFnZ2FibGUoewogICAgICBzbmFwOiB7CiAgICAgICAgdGFyZ2V0czogdHJhbnNmb3JtZWRQb2ludHMsCiAgICAgICAgcmFuZ2U6IDIwICogTWF0aC5tYXgocm9vdE1hdHJpeC5hLCByb290TWF0cml4LmQpLAogICAgICB9LAogICAgfSkKICB9CgoKICBmdW5jdGlvbiB1cGRhdGVQb2ludHMoKSB7CiAgICBjb25zdCBzdGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2VkaXQtc3RhciIpCgljb25zdCBjb250cm9sUG9pbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnBvaW50LWhhbmRsZSIpCgljb25zdCBudW1fY3AgPSA1Cgljb25zdCBudW1fcHQgPSAxMDEKCWxldCB4ID0gbmV3IEFycmF5KG51bV9jcCkKCWxldCB5ID0gbmV3IEFycmF5KG51bV9jcCkKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBudW1fY3A7IGkrKykgewogICAgIHhbaV0gPSBjb250cm9sUG9pbnRzW2ldLnguYmFzZVZhbC52YWx1ZQogICAgIHlbaV0gPSBjb250cm9sUG9pbnRzW2ldLnkuYmFzZVZhbC52YWx1ZQogICAgfQoKCS8vbGV0IHhoYXQgPSBuZXcgQXJyYXkoMTAxKQoJLy9sZXQgeWhhdCA9IG5ldyBBcnJheSgxMDEpCgljb25zdCBbeGhhdCwgeWhhdF0gPSBmb3VyaWVyLmRmdCh4ICx5KQoJCiAgICBsZXQgeGxvbmdoYXQgPSBuZXcgQXJyYXkobnVtX3B0KS5maWxsKDAuMCkKICAgIGxldCB5bG9uZ2hhdCA9IG5ldyBBcnJheShudW1fcHQpLmZpbGwoMC4wKQoKCXhsb25naGF0WzBdID0geGhhdFswXSAqIG51bV9wdCAvIG51bV9jcAoJeGxvbmdoYXRbMV0gPSB4aGF0WzFdICogbnVtX3B0IC8gbnVtX2NwCgl4bG9uZ2hhdFsyXSA9IHhoYXRbMl0gKiBudW1fcHQgLyBudW1fY3AKCXhsb25naGF0Wzk5XSA9IHhoYXRbM10gKiBudW1fcHQgLyBudW1fY3AKCXhsb25naGF0WzEwMF0gPSB4aGF0WzRdICogbnVtX3B0IC8gbnVtX2NwCgoJeWxvbmdoYXRbMF0gPSB5aGF0WzBdICogbnVtX3B0IC8gbnVtX2NwCgl5bG9uZ2hhdFsxXSA9IHloYXRbMV0gKiBudW1fcHQgLyBudW1fY3AKCXlsb25naGF0WzJdID0geWhhdFsyXSAqIG51bV9wdCAvIG51bV9jcAoJeWxvbmdoYXRbOTldID0geWhhdFszXSAqIG51bV9wdCAvIG51bV9jcAoJeWxvbmdoYXRbMTAwXSA9IHloYXRbNF0gKiBudW1fcHQgLyBudW1fY3AKCgkvL2xldCB4bG9uZyA9IG5ldyBBcnJheSgxMDEpCgkvL2xldCB5bG9uZyA9IG5ldyBBcnJheSgxMDEpCgljb25zdCBbeGxvbmcsIHlsb25nXSA9IGZvdXJpZXIuaWRmdCh4bG9uZ2hhdCwgeWxvbmdoYXQpCgkKICAgIGZvciAodmFyIGk9MDsgaSA8IG51bV9wdDsgaSsrKSB7CiAgICAgIHN0YXIucG9pbnRzW2ldLnggPSB4bG9uZ1tpXQogICAgICBzdGFyLnBvaW50c1tpXS55ID0geWxvbmdbaV0KICAgIH0KCQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUG9pbnRzUmFkaWFsKCkgewogICAgY29uc3Qgc3RhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNlZGl0LXN0YXIiKQoJY29uc3QgY29udHJvbFBvaW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wb2ludC1oYW5kbGUiKQoJY29uc3QgbnVtX2NwID0gNQoJY29uc3QgbnVtX3B0ID0gMTAwCglsZXQgeCA9IG5ldyBBcnJheShudW1fY3ApCglsZXQgeSA9IG5ldyBBcnJheShudW1fY3ApCglsZXQgciA9IG5ldyBBcnJheShudW1fY3ApCiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtX2NwOyBpKyspIHsKICAgICB4W2ldID0gY29udHJvbFBvaW50c1tpXS54LmJhc2VWYWwudmFsdWUKICAgICB5W2ldID0gY29udHJvbFBvaW50c1tpXS55LmJhc2VWYWwudmFsdWUKCSByW2ldID0gTWF0aC5oeXBvdCh4W2ldLTIwMCwgeVtpXS0yMDApCgkgLy9jb25zb2xlLmxvZyhyW2ldKQogICAgfQoJCgoJbGV0IHogPSBuZXcgQXJyYXkobnVtX2NwKS5maWxsKDAuMCkKCWNvbnN0IFtyaGF0LCBpaGF0XSA9IGZvdXJpZXIuZGZ0KHIsIHopCgoJbGV0IHJsb25naGF0ID0gbmV3IEFycmF5KG51bV9wdCkuZmlsbCgwLjApCglsZXQgaWxvbmdoYXQgPSBuZXcgQXJyYXkobnVtX3B0KS5maWxsKDAuMCkKCglybG9uZ2hhdFswXSA9IHJoYXRbMF0gKiBudW1fcHQgLyBudW1fY3AKCXJsb25naGF0WzFdID0gcmhhdFsxXSAqIG51bV9wdCAvIG51bV9jcAoJcmxvbmdoYXRbMl0gPSByaGF0WzJdICogbnVtX3B0IC8gbnVtX2NwCglybG9uZ2hhdFs5OV0gPSByaGF0WzNdICogbnVtX3B0IC8gbnVtX2NwCglybG9uZ2hhdFsxMDBdID0gcmhhdFs0XSAqIG51bV9wdCAvIG51bV9jcAoKCWlsb25naGF0WzBdID0gaWhhdFswXSAqIG51bV9wdCAvIG51bV9jcAoJaWxvbmdoYXRbMV0gPSBpaGF0WzFdICogbnVtX3B0IC8gbnVtX2NwCglpbG9uZ2hhdFsyXSA9IGloYXRbMl0gKiBudW1fcHQgLyBudW1fY3AKCWlsb25naGF0Wzk5XSA9IGloYXRbM10gKiBudW1fcHQgLyBudW1fY3AKCWlsb25naGF0WzEwMF0gPSBpaGF0WzRdICogbnVtX3B0IC8gbnVtX2NwCgoJY29uc3QgW3Jsb25nLCBfXSA9IGZvdXJpZXIuaWRmdChybG9uZ2hhdCwgaWxvbmdoYXQpCgkKCS8vbGV0IHhsb25nID0gbmV3IEFycmF5KG51bV9wdCkKCS8vbGV0IHlsb25nID0gbmV3IEFycmF5KG51bV9wdCkKCglsZXQgdGhldGEgPSAtTWF0aC5QSQoKCWZvcih2YXIgaT0wOyBpIDwgbnVtX3B0OyBpKyspIHsKCSAgIC8vY29uc29sZS5sb2cocmxvbmdbaV0pCgkgICBzdGFyLnBvaW50c1tpXS54ID0gcmxvbmdbaV0gKiBNYXRoLmNvcyh0aGV0YSkgKyAyMDAKCSAgIHN0YXIucG9pbnRzW2ldLnkgPSBybG9uZ1tpXSAqIE1hdGguc2luKHRoZXRhKSArIDIwMAoJICAgdGhldGEgKz0gMiAqIE1hdGguUEkgLyAobnVtX3B0KQoJfQoKCXN0YXIucG9pbnRzW251bV9wdF0ueCA9IHN0YXIucG9pbnRzWzBdLngKCXN0YXIucG9pbnRzW251bV9wdF0ueSA9IHN0YXIucG9pbnRzWzBdLnkKCgkKICB9CgogIGludGVyYWN0KHJvb3QpLm9uKCdtb3VzZWRvd24nLCBhcHBseVRyYW5zZm9ybXMpLm9uKCd0b3VjaHN0YXJ0JywgYXBwbHlUcmFuc2Zvcm1zKQoKICBpbnRlcmFjdCgnLnBvaW50LWhhbmRsZScpCiAgICAuZHJhZ2dhYmxlKHsKICAgICAgb25zdGFydDogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2RyYWdnaW5nJykKICAgICAgfSwKICAgICAgb25tb3ZlOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICBjb25zdCBpID0gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpIHwgMAogICAgICAgIGNvbnN0IHBvaW50ID0gc3Rhci5wb2ludHMuZ2V0SXRlbShpKQoKCQkvL0dldCBhbmdsZSBhbmQgcmFkaXVzCgkJY29uc3QgdGhldGEgPSBNYXRoLmF0YW4yKHBvaW50LnkgLSAyMDAsIHBvaW50LnggLSAyMDApCgoJICAgIC8vdW5jb25zdHJhaW5lZAogICAgICAgIHBvaW50LnggKz0gZXZlbnQuZHggLyByb290TWF0cml4LmEKICAgICAgICBwb2ludC55ICs9IGV2ZW50LmR5IC8gcm9vdE1hdHJpeC5kCgoJICAgIC8vcmFkaWFsbHkgY29uc3RyYWluZWQKCQljb25zdCByYWRpYWwgPSBNYXRoLmh5cG90KHBvaW50LnkgLSAyMDAsIHBvaW50LnggLSAyMDApCSAgICAKCSAgICBwb2ludC54ID0gcmFkaWFsICogTWF0aC5jb3ModGhldGEpICsgMjAwCgkgICAgcG9pbnQueSA9IHJhZGlhbCAqIE1hdGguc2luKHRoZXRhKSArIDIwMAoKICAgICAgICBldmVudC50YXJnZXQueC5iYXNlVmFsLnZhbHVlID0gcG9pbnQueAogICAgICAgIGV2ZW50LnRhcmdldC55LmJhc2VWYWwudmFsdWUgPSBwb2ludC55CgoJCS8vdXBkYXRlUG9pbnRzUmFkaWFsKCkKCSAgICAvL3VwZGF0ZVBvaW50cygpCiAgICAgIH0sCiAgICAgIG9uZW5kOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICByb290LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnJykKCSAgICB1cGRhdGVQb2ludHNSYWRpYWwoKQogICAgICB9LAogICAgICBzbmFwOiB7CiAgICAgICAgdGFyZ2V0czogb3JpZ2luYWxQb2ludHMsCiAgICAgICAgcmFuZ2U6IDEwLAogICAgICAgIHJlbGF0aXZlUG9pbnRzOiBbeyB4OiAwLjUsIHk6IDAuNSB9XSwKICAgICAgfSwKICAgICAgcmVzdHJpY3Q6IHsgcmVzdHJpY3Rpb246IGRvY3VtZW50LnJvb3RFbGVtZW50IH0sCiAgICB9KQogICAgLnN0eWxlQ3Vyc29yKGZhbHNlKQoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZXZlbnQpID0+IHsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCkKICB9KQo8L3NjcmlwdD4KCSIiIikKZW5kCgojIOKVlOKVkOKVoSAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDEKUExVVE9fUFJPSkVDVF9UT01MX0NPTlRFTlRTID0gIiIiCltkZXBzXQpGRlRXID0gIjdhMWNjNmNhLTUyZWYtNTlmNS04M2NkLTNhNzA1NWMwOTM0MSIKSHlwZXJ0ZXh0TGl0ZXJhbCA9ICJhYzExOTJhOC1mNGIzLTRiZmUtYmEyMi1hZjViOTJjZDNhYjIiCgpbY29tcGF0XQpGRlRXID0gIn4xLjUuMCIKSHlwZXJ0ZXh0TGl0ZXJhbCA9ICJ+MC45LjQiCiIiIgoKIyDilZTilZDilaEgMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAyClBMVVRPX01BTklGRVNUX1RPTUxfQ09OVEVOVFMgPSAiIiIKIyBUaGlzIGZpbGUgaXMgbWFjaGluZS1nZW5lcmF0ZWQgLSBlZGl0aW5nIGl0IGRpcmVjdGx5IGlzIG5vdCBhZHZpc2VkCgpqdWxpYV92ZXJzaW9uID0gIjEuOC4zIgptYW5pZmVzdF9mb3JtYXQgPSAiMi4wIgpwcm9qZWN0X2hhc2ggPSAiYzA1M2M1NDNmY2EyMDEzOTZjNjUzMjc5YmY0NmI4ZmY4ZWVmZjQ0NiIKCltbZGVwcy5BYnN0cmFjdEZGVHNdXQpkZXBzID0gWyJDaGFpblJ1bGVzQ29yZSIsICJMaW5lYXJBbGdlYnJhIl0KZ2l0LXRyZWUtc2hhMSA9ICI2OWY3MDIwYmQ3MmYwNjljMjE5YjVlOGMyMzZjMWZhOTBkMmNiNDA5Igp1dWlkID0gIjYyMWY0OTc5LWM2MjgtNWQ1NC04NjhlLWZjZjRlM2U4MTg1YyIKdmVyc2lvbiA9ICIxLjIuMSIKCltbZGVwcy5BcmdUb29sc11dCnV1aWQgPSAiMGRhZDg0YzUtZDExMi00MmU2LThkMjgtZWYxMmRhYmI3ODlmIgp2ZXJzaW9uID0gIjEuMS4xIgoKW1tkZXBzLkFydGlmYWN0c11dCnV1aWQgPSAiNTZmMjJkNzItZmQ2ZC05OGYxLTAyZjAtMDhkZGMwOTA3YzMzIgoKW1tkZXBzLkJhc2U2NF1dCnV1aWQgPSAiMmEwZjQ0ZTMtNmM4My01NWJkLTg3ZTQtYjE5NzhkOThiZDVmIgoKW1tkZXBzLkNoYWluUnVsZXNDb3JlXV0KZGVwcyA9IFsiQ29tcGF0IiwgIkxpbmVhckFsZ2VicmEiLCAiU3BhcnNlQXJyYXlzIl0KZ2l0LXRyZWUtc2hhMSA9ICJlN2ZmNmNhZGY3NDNjMDk4ZTA4ZmNhMjVjOTExMDNlZTQzMDNjOWJiIgp1dWlkID0gImQzNjBkMmU2LWIyNGMtMTFlOS1hMmEzLTJhMmFlMmRiY2NlNCIKdmVyc2lvbiA9ICIxLjE1LjYiCgpbW2RlcHMuQ29tcGF0XV0KZGVwcyA9IFsiRGF0ZXMiLCAiTGluZWFyQWxnZWJyYSIsICJVVUlEcyJdCmdpdC10cmVlLXNoYTEgPSAiMDBhMmNjY2M3ZjA5OGZmM2I2NjgwNjg2MmQyNzVjYTNkYjllNmU1YSIKdXVpZCA9ICIzNGRhMjE4NS1iMjliLTVjMTMtYjBjNy1hY2YxNzI1MTNkMjAiCnZlcnNpb24gPSAiNC41LjAiCgpbW2RlcHMuQ29tcGlsZXJTdXBwb3J0TGlicmFyaWVzX2psbF1dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJMaWJkbCJdCnV1aWQgPSAiZTY2ZTAwNzgtNzAxNS01NDUwLTkyZjctMTVmYmQ5NTdmMmFlIgp2ZXJzaW9uID0gIjAuNS4yKzAiCgpbW2RlcHMuRGF0ZXNdXQpkZXBzID0gWyJQcmludGYiXQp1dWlkID0gImFkZTJjYTcwLTM4OTEtNTk0NS05OGZiLWRjMDk5NDMyZTA2YSIKCltbZGVwcy5Eb3dubG9hZHNdXQpkZXBzID0gWyJBcmdUb29scyIsICJGaWxlV2F0Y2hpbmciLCAiTGliQ1VSTCIsICJOZXR3b3JrT3B0aW9ucyJdCnV1aWQgPSAiZjQzYTI0MWYtYzIwYS00YWQ0LTg1MmMtZjZiMTI0Nzg2MWM2Igp2ZXJzaW9uID0gIjEuNi4wIgoKW1tkZXBzLkZGVFddXQpkZXBzID0gWyJBYnN0cmFjdEZGVHMiLCAiRkZUV19qbGwiLCAiTGluZWFyQWxnZWJyYSIsICJNS0xfamxsIiwgIlByZWZlcmVuY2VzIiwgIlJlZXhwb3J0Il0KZ2l0LXRyZWUtc2hhMSA9ICI5MDYzMGVmZmYwODk0ZjgxNDIzMDhlMzM0NDczZWJhNTRjNDMzNTQ5Igp1dWlkID0gIjdhMWNjNmNhLTUyZWYtNTlmNS04M2NkLTNhNzA1NWMwOTM0MSIKdmVyc2lvbiA9ICIxLjUuMCIKCltbZGVwcy5GRlRXX2psbF1dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJKTExXcmFwcGVycyIsICJMaWJkbCIsICJQa2ciXQpnaXQtdHJlZS1zaGExID0gImM2MDMzY2MzODkyZDBlZjViYjljZDI5YjdmMmYwMzMxZWE1MTg0ZWEiCnV1aWQgPSAiZjU4NTE0MzYtMGQ3YS01ZjEzLWI5ZGUtZjAyNzA4ZmQxNzFhIgp2ZXJzaW9uID0gIjMuMy4xMCswIgoKW1tkZXBzLkZpbGVXYXRjaGluZ11dCnV1aWQgPSAiN2IxZjYwNzktNzM3YS01OGRjLWI4YmMtN2EyY2E1YzFiNWVlIgoKW1tkZXBzLkh5cGVydGV4dExpdGVyYWxdXQpkZXBzID0gWyJUcmlja3MiXQpnaXQtdHJlZS1zaGExID0gImM0N2M1ZmE0YzUzMDhmMjdjY2FhYzM1NTA0ODU4ZDg5MTRlMTAyZjkiCnV1aWQgPSAiYWMxMTkyYTgtZjRiMy00YmZlLWJhMjItYWY1YjkyY2QzYWIyIgp2ZXJzaW9uID0gIjAuOS40IgoKW1tkZXBzLkludGVsT3Blbk1QX2psbF1dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJKTExXcmFwcGVycyIsICJMaWJkbCIsICJQa2ciXQpnaXQtdHJlZS1zaGExID0gImQ5NzllNTRiNzFkYTgyZjNhNjViNjI1NTNkYTRmYzNkMThjOTAwNGMiCnV1aWQgPSAiMWQ1Y2M3YjgtNDkwOS01MTllLWEwZjgtZDBmNWFkOTcxMmQwIgp2ZXJzaW9uID0gIjIwMTguMC4zKzIiCgpbW2RlcHMuSW50ZXJhY3RpdmVVdGlsc11dCmRlcHMgPSBbIk1hcmtkb3duIl0KdXVpZCA9ICJiNzdlMGE0Yy1kMjkxLTU3YTAtOTBlOC04ZGIyNWEyN2EyNDAiCgpbW2RlcHMuSkxMV3JhcHBlcnNdXQpkZXBzID0gWyJQcmVmZXJlbmNlcyJdCmdpdC10cmVlLXNoYTEgPSAiYWJjOTg4NWE3Y2EyMDUyYTczNmE2MDBmN2ZhNjYyMDlmOTY1MDZlMSIKdXVpZCA9ICI2OTJiM2JjZC0zYzg1LTRiMWYtYjEwOC1mMTNjZTBlYjMyMTAiCnZlcnNpb24gPSAiMS40LjEiCgpbW2RlcHMuTGF6eUFydGlmYWN0c11dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJQa2ciXQp1dWlkID0gIjRhZjU0ZmUxLWVjYTAtNDNhOC04NWE3LTc4N2Q5MWI3ODRlMyIKCltbZGVwcy5MaWJDVVJMXV0KZGVwcyA9IFsiTGliQ1VSTF9qbGwiLCAiTW96aWxsYUNBQ2VydHNfamxsIl0KdXVpZCA9ICJiMjcwMzJjMi1hM2U3LTUwYzgtODBjZC0yZDM2ZGJjYmZkMjEiCnZlcnNpb24gPSAiMC42LjMiCgpbW2RlcHMuTGliQ1VSTF9qbGxdXQpkZXBzID0gWyJBcnRpZmFjdHMiLCAiTGliU1NIMl9qbGwiLCAiTGliZGwiLCAiTWJlZFRMU19qbGwiLCAiWmxpYl9qbGwiLCAibmdodHRwMl9qbGwiXQp1dWlkID0gImRlYWM5YjQ3LThiYzctNTkwNi1hMGZlLTM1YWM1NmRjODRjMCIKdmVyc2lvbiA9ICI3Ljg0LjArMCIKCltbZGVwcy5MaWJHaXQyXV0KZGVwcyA9IFsiQmFzZTY0IiwgIk5ldHdvcmtPcHRpb25zIiwgIlByaW50ZiIsICJTSEEiXQp1dWlkID0gIjc2Zjg1NDUwLTUyMjYtNWI1YS04ZWFhLTUyOWFkMDQ1YjQzMyIKCltbZGVwcy5MaWJTU0gyX2psbF1dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJMaWJkbCIsICJNYmVkVExTX2psbCJdCnV1aWQgPSAiMjk4MTZiNWEtYjlhYi01NDZmLTkzM2MtZWRhZDE4ODZkZmE4Igp2ZXJzaW9uID0gIjEuMTAuMiswIgoKW1tkZXBzLkxpYmRsXV0KdXVpZCA9ICI4ZjM5OWRhMy0zNTU3LTU2NzUtYjVmZi1mYjgzMmM5N2NiZGIiCgpbW2RlcHMuTGluZWFyQWxnZWJyYV1dCmRlcHMgPSBbIkxpYmRsIiwgImxpYmJsYXN0cmFtcG9saW5lX2psbCJdCnV1aWQgPSAiMzdlMmU0NmQtZjg5ZC01MzlkLWI0ZWUtODM4ZmNjY2M5YzhlIgoKW1tkZXBzLkxvZ2dpbmddXQp1dWlkID0gIjU2ZGRiMDE2LTg1N2ItNTRlMS1iODNkLWRiNGQ1OGRiNTU2OCIKCltbZGVwcy5NS0xfamxsXV0KZGVwcyA9IFsiQXJ0aWZhY3RzIiwgIkludGVsT3Blbk1QX2psbCIsICJKTExXcmFwcGVycyIsICJMYXp5QXJ0aWZhY3RzIiwgIkxpYmRsIiwgIlBrZyJdCmdpdC10cmVlLXNoYTEgPSAiMmNlODY5NWUxZTY5OWI2ODcwMmMwMzQwMjY3MmE2OWY1NGI4YWNhOSIKdXVpZCA9ICI4NTZmMDQ0Yy1kODZlLTVkMDktYjYwMi1hZWFiNzZkYzhiYTciCnZlcnNpb24gPSAiMjAyMi4yLjArMCIKCltbZGVwcy5NYXJrZG93bl1dCmRlcHMgPSBbIkJhc2U2NCJdCnV1aWQgPSAiZDZmNDM3NmUtYWVmNS01MDVhLTk2YzEtOWMwMjczOTQ2MDdhIgoKW1tkZXBzLk1iZWRUTFNfamxsXV0KZGVwcyA9IFsiQXJ0aWZhY3RzIiwgIkxpYmRsIl0KdXVpZCA9ICJjOGZmZDljMy0zMzBkLTU4NDEtYjc4ZS0wODE3ZDcxNDVmYTEiCnZlcnNpb24gPSAiMi4yOC4wKzAiCgpbW2RlcHMuTW96aWxsYUNBQ2VydHNfamxsXV0KdXVpZCA9ICIxNGEzNjA2ZC1mNjBkLTU2MmUtOTEyMS0xMmQ5NzJjZDgxNTkiCnZlcnNpb24gPSAiMjAyMi4yLjEiCgpbW2RlcHMuTmV0d29ya09wdGlvbnNdXQp1dWlkID0gImNhNTc1OTMwLWMyZTMtNDNhOS1hY2U0LTFlOTg4YjJjMTkwOCIKdmVyc2lvbiA9ICIxLjIuMCIKCltbZGVwcy5PcGVuQkxBU19qbGxdXQpkZXBzID0gWyJBcnRpZmFjdHMiLCAiQ29tcGlsZXJTdXBwb3J0TGlicmFyaWVzX2psbCIsICJMaWJkbCJdCnV1aWQgPSAiNDUzNjYyOWEtYzUyOC01YjgwLWJkNDYtZjgwZDUxYzViMzYzIgp2ZXJzaW9uID0gIjAuMy4yMCswIgoKW1tkZXBzLlBrZ11dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJEYXRlcyIsICJEb3dubG9hZHMiLCAiTGliR2l0MiIsICJMaWJkbCIsICJMb2dnaW5nIiwgIk1hcmtkb3duIiwgIlByaW50ZiIsICJSRVBMIiwgIlJhbmRvbSIsICJTSEEiLCAiU2VyaWFsaXphdGlvbiIsICJUT01MIiwgIlRhciIsICJVVUlEcyIsICJwN3ppcF9qbGwiXQp1dWlkID0gIjQ0Y2ZlOTVhLTFlYjItNTJlYS1iNjcyLWUyYWZkZjY5Yjc4ZiIKdmVyc2lvbiA9ICIxLjguMCIKCltbZGVwcy5QcmVmZXJlbmNlc11dCmRlcHMgPSBbIlRPTUwiXQpnaXQtdHJlZS1zaGExID0gIjQ3ZTVmNDM3Y2MwZTdlZjJjZTg0MDZjZTFlN2UyNGQ0NDkxNWY4OGQiCnV1aWQgPSAiMjEyMTZjNmEtMmU3My02NTYzLTZlNjUtNzI2NTY2NjU3MjUwIgp2ZXJzaW9uID0gIjEuMy4wIgoKW1tkZXBzLlByaW50Zl1dCmRlcHMgPSBbIlVuaWNvZGUiXQp1dWlkID0gImRlMDg1OGRhLTYzMDMtNWU2Ny04NzQ0LTUxZWRkZWVlYjhkNyIKCltbZGVwcy5SRVBMXV0KZGVwcyA9IFsiSW50ZXJhY3RpdmVVdGlscyIsICJNYXJrZG93biIsICJTb2NrZXRzIiwgIlVuaWNvZGUiXQp1dWlkID0gIjNmYTBjZDk2LWVlZjEtNTY3Ni04YTYxLWIzYjg3NThiYmZmYiIKCltbZGVwcy5SYW5kb21dXQpkZXBzID0gWyJTSEEiLCAiU2VyaWFsaXphdGlvbiJdCnV1aWQgPSAiOWEzZjgyODQtYTJjOS01ZjAyLTlhMTEtODQ1OTgwYTFmZDVjIgoKW1tkZXBzLlJlZXhwb3J0XV0KZ2l0LXRyZWUtc2hhMSA9ICI0NWU0Mjg0MjE2NjYwNzNlYWI2ZjJkYTVjOWQzMTBkOTliYjEyZjliIgp1dWlkID0gIjE4OWEzODY3LTMwNTAtNTJkYS1hODM2LWU2MzBiYTkwYWI2OSIKdmVyc2lvbiA9ICIxLjIuMiIKCltbZGVwcy5TSEFdXQp1dWlkID0gImVhOGU5MTljLTI0M2MtNTFhZi04ODI1LWFhYTYzY2Q3MjFjZSIKdmVyc2lvbiA9ICIwLjcuMCIKCltbZGVwcy5TZXJpYWxpemF0aW9uXV0KdXVpZCA9ICI5ZTg4YjQyYS1mODI5LTViMGMtYmJlOS05ZTkyMzE5ODE2NmIiCgpbW2RlcHMuU29ja2V0c11dCnV1aWQgPSAiNjQ2MmZlMGItMjRkZS01NjMxLTg2OTctZGQ5NDFmOTBkZWNjIgoKW1tkZXBzLlNwYXJzZUFycmF5c11dCmRlcHMgPSBbIkxpbmVhckFsZ2VicmEiLCAiUmFuZG9tIl0KdXVpZCA9ICIyZjAxMTg0ZS1lMjJiLTVkZjUtYWU2My1kOTNlYmFiNjllYWYiCgpbW2RlcHMuVE9NTF1dCmRlcHMgPSBbIkRhdGVzIl0KdXVpZCA9ICJmYTI2N2YxZi02MDQ5LTRmMTQtYWE1NC0zM2JhZmFlMWVkNzYiCnZlcnNpb24gPSAiMS4wLjAiCgpbW2RlcHMuVGFyXV0KZGVwcyA9IFsiQXJnVG9vbHMiLCAiU0hBIl0KdXVpZCA9ICJhNGU1NjlhNi1lODA0LTRmYTQtYjBmMy1lZWY3YTFkNWIxM2UiCnZlcnNpb24gPSAiMS4xMC4xIgoKW1tkZXBzLlRyaWNrc11dCmdpdC10cmVlLXNoYTEgPSAiNmJhYzc3NWYyZDQyYTYxMWNkZmNkMWZiMjE3ZWU3MTk2MzBjNDE3NSIKdXVpZCA9ICI0MTBhNGI0ZC00OWU0LTRmYmMtYWI2ZC1jYjcxYjE3YjM3NzUiCnZlcnNpb24gPSAiMC4xLjYiCgpbW2RlcHMuVVVJRHNdXQpkZXBzID0gWyJSYW5kb20iLCAiU0hBIl0KdXVpZCA9ICJjZjcxMThhNy02OTc2LTViMWEtOWEzOS03YWRjNzJmNTkxYTQiCgpbW2RlcHMuVW5pY29kZV1dCnV1aWQgPSAiNGVjMGE4M2UtNDkzZS01MGUyLWI5YWMtOGY3MmFjZjVhOGY1IgoKW1tkZXBzLlpsaWJfamxsXV0KZGVwcyA9IFsiTGliZGwiXQp1dWlkID0gIjgzNzc1YTU4LTFmMWQtNTEzZi1iMTk3LWQ3MTM1NGFiMDA3YSIKdmVyc2lvbiA9ICIxLjIuMTIrMyIKCltbZGVwcy5saWJibGFzdHJhbXBvbGluZV9qbGxdXQpkZXBzID0gWyJBcnRpZmFjdHMiLCAiTGliZGwiLCAiT3BlbkJMQVNfamxsIl0KdXVpZCA9ICI4ZTg1MGI5MC04NmRiLTUzNGMtYTBkMy0xNDc4MTc2YzdkOTMiCnZlcnNpb24gPSAiNS4xLjErMCIKCltbZGVwcy5uZ2h0dHAyX2psbF1dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJMaWJkbCJdCnV1aWQgPSAiOGU4NTBlZGUtNzY4OC01MzM5LWEwN2MtMzAyYWNkMmFhZjhkIgp2ZXJzaW9uID0gIjEuNDguMCswIgoKW1tkZXBzLnA3emlwX2psbF1dCmRlcHMgPSBbIkFydGlmYWN0cyIsICJMaWJkbCJdCnV1aWQgPSAiM2YxOWU5MzMtMzNkOC01M2IzLWFhYWItYmQ1MTEwYzNiN2EwIgp2ZXJzaW9uID0gIjE3LjQuMCswIgoiIiIKCiMg4pWU4pWQ4pWhIENlbGwgb3JkZXI6CiMg4pWg4pWQMzYyNzE0YjAtNzVkOC0xMWVkLTIyYzAtNDljY2ViMTYxYmI1CiMg4pWg4pWQYzgxNWU4ZTEtZmZiMS00YjkzLThmM2UtYThmZDBjMTQ5NTk3CiMg4pWf4pSAMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAxCiMg4pWf4pSAMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAyCg==";
window.pluto_disable_ui = true;
window.pluto_slider_server_url = undefined;
window.pluto_binder_url = "https://mybinder.org/v2/gh/fonsp/pluto-on-binder/v0.19.16";
window.pluto_statefile = "data:;base64,3gAQpWJvbmRzgaVteXN2Z4GldmFsdWXArGNlbGxfcmVzdWx0c4LZJDM2MjcxNGIwLTc1ZDgtMTFlZC0yMmMwLTQ5Y2NlYjE2MWJiNYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZOC0zLjE0MTU5MjY1MzU4OTc5MzowLjA2MjgzMTg1MzA3MTc5NTg3OjMuMTQxNTkyNjUzNTg5NzkzpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2OP/NxFoc7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMzYyNzE0YjAtNzVkOC0xMWVkLTIyYzAtNDljY2ViMTYxYmI1uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAOyNbLVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGM4MTVlOGUxLWZmYjEtNGI5My04ZjNlLWE4ZmQwYzE0OTU5N4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaJds8Ym9uZCBkZWY9Im15c3ZnIiB1bmlxdWVfaWQ9InduUiYjNDM7dWwvbHBjYnkiPgk8c3ZnIGlkPSJzdmctZWRpdC1kZW1vIiB2aWV3Qm94PSIwIDAgNDAwIDQwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmFsdWU9IjMiPgoJCgk8ZGVmcz4KCSAgICA8Y2lyY2xlIGlkPSJwb2ludC1oYW5kbGUiCgkgICAgICAgIHI9IjEwIiB4PSIwIiB5PSIwIgoJICAgICAgICBzdHJva2Utd2lkdGg9IjQiCgkgICAgICAgIGZpbGw9IiNmZmYiCgkgICAgICAgIGZpbGwtb3BhY2l0eT0iMC40IgoJICAgICAgICBzdHJva2U9IiNmZmYiLz4KCTwvZGVmcz4KCTxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgcj0iMTAiIC8+Cgk8cG9seWdvbiBpZD0iZWRpdC1zdGFyIgoJICAgIHN0cm9rZT0iIzI5ZSIKCSAgICBzdHJva2Utd2lkdGg9IjIwIgoJICAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCgkgICAgZmlsbD0ibm9uZSIKCSAgICBwb2ludHM9IjEwMC4wLCAyMDAuMCwxMDAuMTk3MzI3MTU3MTcyODUsIDE5My43MjA5NDgwNDcwNjg2NSwxMDAuNzg4NTI5ODY4NTUyMjIsIDE4Ny40NjY2NzY2NDM1Njk1NCwxMDEuNzcxMjc0OTI3MTMxMTMsIDE4MS4yNjE4Njg1NDE0Mjc1MywxMDMuMTQxNjgzODg3MTM2ODksIDE3NS4xMzEwMTEyODM1MTQ1LDEwNC44OTQzNDgzNzA0ODQ2NSwgMTY5LjA5ODMwMDU2MjUwNTI0LDEwNy4wMjIzNTE0MTExNzQ4NywgMTYzLjE4NzU0NDczMTUzMjE3LDEwOS41MTcyOTQ3NTMzOTgwNiwgMTU3LjQyMjA3MDg0MzQ5MjcyLDExMi4zNjkzMzE5OTU2MTM2MywgMTUxLjgyNDYzMjU4OTgyODQ3LDExNS41NjcyMDc0NDk3OTg0OSwgMTQ2LjQxNzMyMDUwMjEwMDMyLDExOS4wOTgzMDA1NjI1MDUyNywgMTQxLjIyMTQ3NDc3MDc1MjY4LDEyMi45NDg2NzU3MjI0MjEwOSwgMTM2LjI1NzYwMTAyNTEzMSwxMjcuMTAzMTM3MjU3ODU4ODYsIDEzMS41NDUyODk0MDcxMzExMiwxMzEuNTQ1Mjg5NDA3MTMxMTIsIDEyNy4xMDMxMzcyNTc4NTg4NiwxMzYuMjU3NjAxMDI1MTMxLCAxMjIuOTQ4Njc1NzIyNDIxMDcsMTQxLjIyMTQ3NDc3MDc1MjcsIDExOS4wOTgzMDA1NjI1MDUyNiwxNDYuNDE3MzIwNTAyMTAwMzUsIDExNS41NjcyMDc0NDk3OTg0OSwxNTEuODI0NjMyNTg5ODI4NSwgMTEyLjM2OTMzMTk5NTYxMzYzLDE1Ny40MjIwNzA4NDM0OTI3MiwgMTA5LjUxNzI5NDc1MzM5ODA1LDE2My4xODc1NDQ3MzE1MzIyLCAxMDcuMDIyMzUxNDExMTc0ODUsMTY5LjA5ODMwMDU2MjUwNTI3LCAxMDQuODk0MzQ4MzcwNDg0NjQsMTc1LjEzMTAxMTI4MzUxNDU0LCAxMDMuMTQxNjgzODg3MTM2ODgsMTgxLjI2MTg2ODU0MTQyNzUzLCAxMDEuNzcxMjc0OTI3MTMxMTMsMTg3LjQ2NjY3NjY0MzU2OTYsIDEwMC43ODg1Mjk4Njg1NTIyMiwxOTMuNzIwOTQ4MDQ3MDY4NjUsIDEwMC4xOTczMjcxNTcxNzI4NSwyMDAuMCwgMTAwLjAsMjA2LjI3OTA1MTk1MjkzMTM1LCAxMDAuMTk3MzI3MTU3MTcyODUsMjEyLjUzMzMyMzM1NjQzMDQzLCAxMDAuNzg4NTI5ODY4NTUyMjIsMjE4LjczODEzMTQ1ODU3MjQ3LCAxMDEuNzcxMjc0OTI3MTMxMTUsMjI0Ljg2ODk4ODcxNjQ4NTUsIDEwMy4xNDE2ODM4ODcxMzY4OSwyMzAuOTAxNjk5NDM3NDk0NzYsIDEwNC44OTQzNDgzNzA0ODQ2NSwyMzYuODEyNDU1MjY4NDY3OCwgMTA3LjAyMjM1MTQxMTE3NDg3LDI0Mi41Nzc5MjkxNTY1MDcyNSwgMTA5LjUxNzI5NDc1MzM5ODA1LDI0OC4xNzUzNjc0MTAxNzE1MywgMTEyLjM2OTMzMTk5NTYxMzYzLDI1My41ODI2Nzk0OTc4OTk2NSwgMTE1LjU2NzIwNzQ0OTc5ODQ5LDI1OC43Nzg1MjUyMjkyNDczLCAxMTkuMDk4MzAwNTYyNTA1MjYsMjYzLjc0MjM5ODk3NDg2OSwgMTIyLjk0ODY3NTcyMjQyMTA3LDI2OC40NTQ3MTA1OTI4Njg5LCAxMjcuMTAzMTM3MjU3ODU4ODUsMjcyLjg5Njg2Mjc0MjE0MTE0LCAxMzEuNTQ1Mjg5NDA3MTMxMTIsMjc3LjA1MTMyNDI3NzU3ODk0LCAxMzYuMjU3NjAxMDI1MTMxMDQsMjgwLjkwMTY5OTQzNzQ5NDc2LCAxNDEuMjIxNDc0NzcwNzUyNjgsMjg0LjQzMjc5MjU1MDIwMTUsIDE0Ni40MTczMjA1MDIxMDAzMiwyODcuNjMwNjY4MDA0Mzg2NCwgMTUxLjgyNDYzMjU4OTgyODQ3LDI5MC40ODI3MDUyNDY2MDE5NCwgMTU3LjQyMjA3MDg0MzQ5Mjc1LDI5Mi45Nzc2NDg1ODg4MjUxNiwgMTYzLjE4NzU0NDczMTUzMjIsMjk1LjEwNTY1MTYyOTUxNTM2LCAxNjkuMDk4MzAwNTYyNTA1MjcsMjk2Ljg1ODMxNjExMjg2MzEsIDE3NS4xMzEwMTEyODM1MTQ1LDI5OC4yMjg3MjUwNzI4Njg5LCAxODEuMjYxODY4NTQxNDI3NTMsMjk5LjIxMTQ3MDEzMTQ0Nzc1LCAxODcuNDY2Njc2NjQzNTY5NTcsMjk5LjgwMjY3Mjg0MjgyNzIsIDE5My43MjA5NDgwNDcwNjg2NywzMDAuMCwgMjAwLjAsMjk5LjgwMjY3Mjg0MjgyNzIsIDIwNi4yNzkwNTE5NTI5MzEzMywyOTkuMjExNDcwMTMxNDQ3NzUsIDIxMi41MzMzMjMzNTY0MzA0MywyOTguMjI4NzI1MDcyODY4OSwgMjE4LjczODEzMTQ1ODU3MjQ3LDI5Ni44NTgzMTYxMTI4NjMxLCAyMjQuODY4OTg4NzE2NDg1NSwyOTUuMTA1NjUxNjI5NTE1MzYsIDIzMC45MDE2OTk0Mzc0OTQ3MywyOTIuOTc3NjQ4NTg4ODI1MTYsIDIzNi44MTI0NTUyNjg0Njc4LDI5MC40ODI3MDUyNDY2MDE5NCwgMjQyLjU3NzkyOTE1NjUwNzI1LDI4Ny42MzA2NjgwMDQzODY0LCAyNDguMTc1MzY3NDEwMTcxNTMsMjg0LjQzMjc5MjU1MDIwMTUsIDI1My41ODI2Nzk0OTc4OTk2OCwyODAuOTAxNjk5NDM3NDk0NzYsIDI1OC43Nzg1MjUyMjkyNDczLDI3Ny4wNTEzMjQyNzc1Nzg5NCwgMjYzLjc0MjM5ODk3NDg2ODkzLDI3Mi44OTY4NjI3NDIxNDExNCwgMjY4LjQ1NDcxMDU5Mjg2ODksMjY4LjQ1NDcxMDU5Mjg2ODksIDI3Mi44OTY4NjI3NDIxNDExNCwyNjMuNzQyMzk4OTc0ODY5LCAyNzcuMDUxMzI0Mjc3NTc4OTQsMjU4Ljc3ODUyNTIyOTI0NzMsIDI4MC45MDE2OTk0Mzc0OTQ3NiwyNTMuNTgyNjc5NDk3ODk5NjUsIDI4NC40MzI3OTI1NTAyMDE1LDI0OC4xNzUzNjc0MTAxNzE1MywgMjg3LjYzMDY2ODAwNDM4NjQsMjQyLjU3NzkyOTE1NjUwNzI1LCAyOTAuNDgyNzA1MjQ2NjAxOTQsMjM2LjgxMjQ1NTI2ODQ2NzgsIDI5Mi45Nzc2NDg1ODg4MjUxLDIzMC45MDE2OTk0Mzc0OTQ3NiwgMjk1LjEwNTY1MTYyOTUxNTM2LDIyNC44Njg5ODg3MTY0ODU1LCAyOTYuODU4MzE2MTEyODYzMSwyMTguNzM4MTMxNDU4NTcyNDcsIDI5OC4yMjg3MjUwNzI4Njg5LDIxMi41MzMzMjMzNTY0MzA0MywgMjk5LjIxMTQ3MDEzMTQ0Nzc1LDIwNi4yNzkwNTE5NTI5MzEzNSwgMjk5LjgwMjY3Mjg0MjgyNzIsMjAwLjAsIDMwMC4wLDE5My43MjA5NDgwNDcwNjg2NSwgMjk5LjgwMjY3Mjg0MjgyNzIsMTg3LjQ2NjY3NjY0MzU2OTYsIDI5OS4yMTE0NzAxMzE0NDc3NSwxODEuMjYxODY4NTQxNDI3NTMsIDI5OC4yMjg3MjUwNzI4Njg5LDE3NS4xMzEwMTEyODM1MTQ1NCwgMjk2Ljg1ODMxNjExMjg2MzEsMTY5LjA5ODMwMDU2MjUwNTI3LCAyOTUuMTA1NjUxNjI5NTE1MzYsMTYzLjE4NzU0NDczMTUzMjIsIDI5Mi45Nzc2NDg1ODg4MjUxNiwxNTcuNDIyMDcwODQzNDkyNzIsIDI5MC40ODI3MDUyNDY2MDE5NCwxNTEuODI0NjMyNTg5ODI4NSwgMjg3LjYzMDY2ODAwNDM4NjQsMTQ2LjQxNzMyMDUwMjEwMDM1LCAyODQuNDMyNzkyNTUwMjAxNSwxNDEuMjIxNDc0NzcwNzUyNywgMjgwLjkwMTY5OTQzNzQ5NDc2LDEzNi4yNTc2MDEwMjUxMzEsIDI3Ny4wNTEzMjQyNzc1Nzg5NCwxMzEuNTQ1Mjg5NDA3MTMxMTIsIDI3Mi44OTY4NjI3NDIxNDExNCwxMjcuMTAzMTM3MjU3ODU4ODYsIDI2OC40NTQ3MTA1OTI4Njg5LDEyMi45NDg2NzU3MjI0MjEwOSwgMjYzLjc0MjM5ODk3NDg2OSwxMTkuMDk4MzAwNTYyNTA1MjcsIDI1OC43Nzg1MjUyMjkyNDczLDExNS41NjcyMDc0NDk3OTg0OSwgMjUzLjU4MjY3OTQ5Nzg5OTY4LDExMi4zNjkzMzE5OTU2MTM2MywgMjQ4LjE3NTM2NzQxMDE3MTUzLDEwOS41MTcyOTQ3NTMzOTgwNiwgMjQyLjU3NzkyOTE1NjUwNzI4LDEwNy4wMjIzNTE0MTExNzQ4NywgMjM2LjgxMjQ1NTI2ODQ2NzgzLDEwNC44OTQzNDgzNzA0ODQ2NSwgMjMwLjkwMTY5OTQzNzQ5NDc2LDEwMy4xNDE2ODM4ODcxMzY4OSwgMjI0Ljg2ODk4ODcxNjQ4NTUsMTAxLjc3MTI3NDkyNzEzMTEzLCAyMTguNzM4MTMxNDU4NTcyNDcsMTAwLjc4ODUyOTg2ODU1MjIyLCAyMTIuNTMzMzIzMzU2NDMwNDYsMTAwLjE5NzMyNzE1NzE3Mjg1LCAyMDYuMjc5MDUxOTUyOTMxMzUsMTAwLjAsIDIwMC4wIi8+Cgk8L3N2Zz4KCTxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2ludGVyYWN0anNAMS4xMC4xNy9kaXN0L2ludGVyYWN0Lm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2ZvdXJpZXIvZm91cmllci5taW4uanMiPjwvc2NyaXB0PgoJPHNjcmlwdD4KCWNvbnNvbGUubG9nKCJTVkcgU2NyaXB0IikKICBjb25zdCBzbnMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnCiAgY29uc3QgeG5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnCiAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmctZWRpdC1kZW1vJykKICBjb25zdCBzdGFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc3RhcicpCiAgbGV0IHJvb3RNYXRyaXgKICBjb25zdCBvcmlnaW5hbFBvaW50cyA9IFtdCiAgbGV0IHRyYW5zZm9ybWVkUG9pbnRzID0gW10KCiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0YXIucG9pbnRzLm51bWJlck9mSXRlbXM7IGkgPCBsZW4tMjA7IGkgKz0gMjApIHsKICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzbnMsICd1c2UnKQogICAgY29uc3QgcG9pbnQgPSBzdGFyLnBvaW50cy5nZXRJdGVtKGkpCiAgICBjb25zdCBuZXdQb2ludCA9IHJvb3QuY3JlYXRlU1ZHUG9pbnQoKQoKICAgIGhhbmRsZS5zZXRBdHRyaWJ1dGVOUyh4bnMsICdocmVmJywgJyNwb2ludC1oYW5kbGUnKQogICAgaGFuZGxlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncG9pbnQtaGFuZGxlJykKCiAgICBoYW5kbGUueC5iYXNlVmFsLnZhbHVlID0gbmV3UG9pbnQueCA9IHBvaW50LngKICAgIGhhbmRsZS55LmJhc2VWYWwudmFsdWUgPSBuZXdQb2ludC55ID0gcG9pbnQueQoKICAgIGhhbmRsZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXgnLCBpKQoKICAgIG9yaWdpbmFsUG9pbnRzLnB1c2gobmV3UG9pbnQpCgogICAgcm9vdC5hcHBlbmRDaGlsZChoYW5kbGUpCiAgfQoKICBmdW5jdGlvbiBhcHBseVRyYW5zZm9ybXMgKGV2ZW50KSB7CiAgICByb290TWF0cml4ID0gcm9vdC5nZXRTY3JlZW5DVE0oKQoKICAgIHRyYW5zZm9ybWVkUG9pbnRzID0gb3JpZ2luYWxQb2ludHMubWFwKChwb2ludCkgPT4gewogICAgICByZXR1cm4gcG9pbnQubWF0cml4VHJhbnNmb3JtKHJvb3RNYXRyaXgpCiAgICB9KQoKICAgIGludGVyYWN0KCcucG9pbnQtaGFuZGxlJykuZHJhZ2dhYmxlKHsKICAgICAgc25hcDogewogICAgICAgIHRhcmdldHM6IHRyYW5zZm9ybWVkUG9pbnRzLAogICAgICAgIHJhbmdlOiAyMCAqIE1hdGgubWF4KHJvb3RNYXRyaXguYSwgcm9vdE1hdHJpeC5kKSwKICAgICAgfSwKICAgIH0pCiAgfQoKCiAgZnVuY3Rpb24gdXBkYXRlUG9pbnRzKCkgewogICAgY29uc3Qgc3RhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNlZGl0LXN0YXIiKQoJY29uc3QgY29udHJvbFBvaW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wb2ludC1oYW5kbGUiKQoJY29uc3QgbnVtX2NwID0gNQoJY29uc3QgbnVtX3B0ID0gMTAxCglsZXQgeCA9IG5ldyBBcnJheShudW1fY3ApCglsZXQgeSA9IG5ldyBBcnJheShudW1fY3ApCiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtX2NwOyBpKyspIHsKICAgICB4W2ldID0gY29udHJvbFBvaW50c1tpXS54LmJhc2VWYWwudmFsdWUKICAgICB5W2ldID0gY29udHJvbFBvaW50c1tpXS55LmJhc2VWYWwudmFsdWUKICAgIH0KCgkvL2xldCB4aGF0ID0gbmV3IEFycmF5KDEwMSkKCS8vbGV0IHloYXQgPSBuZXcgQXJyYXkoMTAxKQoJY29uc3QgW3hoYXQsIHloYXRdID0gZm91cmllci5kZnQoeCAseSkKCQogICAgbGV0IHhsb25naGF0ID0gbmV3IEFycmF5KG51bV9wdCkuZmlsbCgwLjApCiAgICBsZXQgeWxvbmdoYXQgPSBuZXcgQXJyYXkobnVtX3B0KS5maWxsKDAuMCkKCgl4bG9uZ2hhdFswXSA9IHhoYXRbMF0gKiBudW1fcHQgLyBudW1fY3AKCXhsb25naGF0WzFdID0geGhhdFsxXSAqIG51bV9wdCAvIG51bV9jcAoJeGxvbmdoYXRbMl0gPSB4aGF0WzJdICogbnVtX3B0IC8gbnVtX2NwCgl4bG9uZ2hhdFs5OV0gPSB4aGF0WzNdICogbnVtX3B0IC8gbnVtX2NwCgl4bG9uZ2hhdFsxMDBdID0geGhhdFs0XSAqIG51bV9wdCAvIG51bV9jcAoKCXlsb25naGF0WzBdID0geWhhdFswXSAqIG51bV9wdCAvIG51bV9jcAoJeWxvbmdoYXRbMV0gPSB5aGF0WzFdICogbnVtX3B0IC8gbnVtX2NwCgl5bG9uZ2hhdFsyXSA9IHloYXRbMl0gKiBudW1fcHQgLyBudW1fY3AKCXlsb25naGF0Wzk5XSA9IHloYXRbM10gKiBudW1fcHQgLyBudW1fY3AKCXlsb25naGF0WzEwMF0gPSB5aGF0WzRdICogbnVtX3B0IC8gbnVtX2NwCgoJLy9sZXQgeGxvbmcgPSBuZXcgQXJyYXkoMTAxKQoJLy9sZXQgeWxvbmcgPSBuZXcgQXJyYXkoMTAxKQoJY29uc3QgW3hsb25nLCB5bG9uZ10gPSBmb3VyaWVyLmlkZnQoeGxvbmdoYXQsIHlsb25naGF0KQoJCiAgICBmb3IgKHZhciBpPTA7IGkgPCBudW1fcHQ7IGkrKykgewogICAgICBzdGFyLnBvaW50c1tpXS54ID0geGxvbmdbaV0KICAgICAgc3Rhci5wb2ludHNbaV0ueSA9IHlsb25nW2ldCiAgICB9CgkKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVBvaW50c1JhZGlhbCgpIHsKICAgIGNvbnN0IHN0YXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjZWRpdC1zdGFyIikKCWNvbnN0IGNvbnRyb2xQb2ludHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucG9pbnQtaGFuZGxlIikKCWNvbnN0IG51bV9jcCA9IDUKCWNvbnN0IG51bV9wdCA9IDEwMAoJbGV0IHggPSBuZXcgQXJyYXkobnVtX2NwKQoJbGV0IHkgPSBuZXcgQXJyYXkobnVtX2NwKQoJbGV0IHIgPSBuZXcgQXJyYXkobnVtX2NwKQogICAgZm9yKHZhciBpID0gMDsgaSA8IG51bV9jcDsgaSsrKSB7CiAgICAgeFtpXSA9IGNvbnRyb2xQb2ludHNbaV0ueC5iYXNlVmFsLnZhbHVlCiAgICAgeVtpXSA9IGNvbnRyb2xQb2ludHNbaV0ueS5iYXNlVmFsLnZhbHVlCgkgcltpXSA9IE1hdGguaHlwb3QoeFtpXS0yMDAsIHlbaV0tMjAwKQoJIC8vY29uc29sZS5sb2cocltpXSkKICAgIH0KCQoKCWxldCB6ID0gbmV3IEFycmF5KG51bV9jcCkuZmlsbCgwLjApCgljb25zdCBbcmhhdCwgaWhhdF0gPSBmb3VyaWVyLmRmdChyLCB6KQoKCWxldCBybG9uZ2hhdCA9IG5ldyBBcnJheShudW1fcHQpLmZpbGwoMC4wKQoJbGV0IGlsb25naGF0ID0gbmV3IEFycmF5KG51bV9wdCkuZmlsbCgwLjApCgoJcmxvbmdoYXRbMF0gPSByaGF0WzBdICogbnVtX3B0IC8gbnVtX2NwCglybG9uZ2hhdFsxXSA9IHJoYXRbMV0gKiBudW1fcHQgLyBudW1fY3AKCXJsb25naGF0WzJdID0gcmhhdFsyXSAqIG51bV9wdCAvIG51bV9jcAoJcmxvbmdoYXRbOTldID0gcmhhdFszXSAqIG51bV9wdCAvIG51bV9jcAoJcmxvbmdoYXRbMTAwXSA9IHJoYXRbNF0gKiBudW1fcHQgLyBudW1fY3AKCglpbG9uZ2hhdFswXSA9IGloYXRbMF0gKiBudW1fcHQgLyBudW1fY3AKCWlsb25naGF0WzFdID0gaWhhdFsxXSAqIG51bV9wdCAvIG51bV9jcAoJaWxvbmdoYXRbMl0gPSBpaGF0WzJdICogbnVtX3B0IC8gbnVtX2NwCglpbG9uZ2hhdFs5OV0gPSBpaGF0WzNdICogbnVtX3B0IC8gbnVtX2NwCglpbG9uZ2hhdFsxMDBdID0gaWhhdFs0XSAqIG51bV9wdCAvIG51bV9jcAoKCWNvbnN0IFtybG9uZywgX10gPSBmb3VyaWVyLmlkZnQocmxvbmdoYXQsIGlsb25naGF0KQoJCgkvL2xldCB4bG9uZyA9IG5ldyBBcnJheShudW1fcHQpCgkvL2xldCB5bG9uZyA9IG5ldyBBcnJheShudW1fcHQpCgoJbGV0IHRoZXRhID0gLU1hdGguUEkKCglmb3IodmFyIGk9MDsgaSA8IG51bV9wdDsgaSsrKSB7CgkgICAvL2NvbnNvbGUubG9nKHJsb25nW2ldKQoJICAgc3Rhci5wb2ludHNbaV0ueCA9IHJsb25nW2ldICogTWF0aC5jb3ModGhldGEpICsgMjAwCgkgICBzdGFyLnBvaW50c1tpXS55ID0gcmxvbmdbaV0gKiBNYXRoLnNpbih0aGV0YSkgKyAyMDAKCSAgIHRoZXRhICs9IDIgKiBNYXRoLlBJIC8gKG51bV9wdCkKCX0KCglzdGFyLnBvaW50c1tudW1fcHRdLnggPSBzdGFyLnBvaW50c1swXS54CglzdGFyLnBvaW50c1tudW1fcHRdLnkgPSBzdGFyLnBvaW50c1swXS55CgoJCiAgfQoKICBpbnRlcmFjdChyb290KS5vbignbW91c2Vkb3duJywgYXBwbHlUcmFuc2Zvcm1zKS5vbigndG91Y2hzdGFydCcsIGFwcGx5VHJhbnNmb3JtcykKCiAgaW50ZXJhY3QoJy5wb2ludC1oYW5kbGUnKQogICAgLmRyYWdnYWJsZSh7CiAgICAgIG9uc3RhcnQ6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCdjbGFzcycsICdkcmFnZ2luZycpCiAgICAgIH0sCiAgICAgIG9ubW92ZTogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgY29uc3QgaSA9IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXgnKSB8IDAKICAgICAgICBjb25zdCBwb2ludCA9IHN0YXIucG9pbnRzLmdldEl0ZW0oaSkKCgkJLy9HZXQgYW5nbGUgYW5kIHJhZGl1cwoJCWNvbnN0IHRoZXRhID0gTWF0aC5hdGFuMihwb2ludC55IC0gMjAwLCBwb2ludC54IC0gMjAwKQoKCSAgICAvL3VuY29uc3RyYWluZWQKICAgICAgICBwb2ludC54ICs9IGV2ZW50LmR4IC8gcm9vdE1hdHJpeC5hCiAgICAgICAgcG9pbnQueSArPSBldmVudC5keSAvIHJvb3RNYXRyaXguZAoKCSAgICAvL3JhZGlhbGx5IGNvbnN0cmFpbmVkCgkJY29uc3QgcmFkaWFsID0gTWF0aC5oeXBvdChwb2ludC55IC0gMjAwLCBwb2ludC54IC0gMjAwKQkgICAgCgkgICAgcG9pbnQueCA9IHJhZGlhbCAqIE1hdGguY29zKHRoZXRhKSArIDIwMAoJICAgIHBvaW50LnkgPSByYWRpYWwgKiBNYXRoLnNpbih0aGV0YSkgKyAyMDAKCiAgICAgICAgZXZlbnQudGFyZ2V0LnguYmFzZVZhbC52YWx1ZSA9IHBvaW50LngKICAgICAgICBldmVudC50YXJnZXQueS5iYXNlVmFsLnZhbHVlID0gcG9pbnQueQoKCQkvL3VwZGF0ZVBvaW50c1JhZGlhbCgpCgkgICAgLy91cGRhdGVQb2ludHMoKQogICAgICB9LAogICAgICBvbmVuZDogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJycpCgkgICAgdXBkYXRlUG9pbnRzUmFkaWFsKCkKICAgICAgfSwKICAgICAgc25hcDogewogICAgICAgIHRhcmdldHM6IG9yaWdpbmFsUG9pbnRzLAogICAgICAgIHJhbmdlOiAxMCwKICAgICAgICByZWxhdGl2ZVBvaW50czogW3sgeDogMC41LCB5OiAwLjUgfV0sCiAgICAgIH0sCiAgICAgIHJlc3RyaWN0OiB7IHJlc3RyaWN0aW9uOiBkb2N1bWVudC5yb290RWxlbWVudCB9LAogICAgfSkKICAgIC5zdHlsZUN1cnNvcihmYWxzZSkKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGV2ZW50KSA9PiB7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpCiAgfSkKPC9zY3JpcHQ+Cgk8L2JvbmQ+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HY4/83jwo9sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRjODE1ZThlMS1mZmIxLTRiOTMtOGYzZS1hOGZkMGMxNDk1OTe5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4+nUaItXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwrFjZWxsX2RlcGVuZGVuY2llc4LZJDM2MjcxNGIwLTc1ZDgtMTFlZC0yMmMwLTQ5Y2NlYjE2MWJiNYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMHp2NlbGxfaWTZJDM2MjcxNGIwLTc1ZDgtMTFlZC0yMmMwLTQ5Y2NlYjE2MWJiNbRkb3duc3RyZWFtX2NlbGxzX21hcIOwSHlwZXJ0ZXh0TGl0ZXJhbJHZJGM4MTVlOGUxLWZmYjEtNGI5My04ZjNlLWE4ZmQwYzE0OTU5N6LOuJHZJGM4MTVlOGUxLWZmYjEtNGI5My04ZjNlLWE4ZmQwYzE0OTU5N6RGRlRXkLJ1cHN0cmVhbV9jZWxsc19tYXCDoS2QpXJhbmdlkKLPgJDZJGM4MTVlOGUxLWZmYjEtNGI5My04ZjNlLWE4ZmQwYzE0OTU5N4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGM4MTVlOGUxLWZmYjEtNGI5My04ZjNlLWE4ZmQwYzE0OTU5N7Rkb3duc3RyZWFtX2NlbGxzX21hcIWjYnVmkKNzdHKQpW15c3ZnkKVzdmdfeJClc3ZnX3mQsnVwc3RyZWFtX2NlbGxzX21hcN4AF6hJT0J1ZmZlcpCmU3RyaW5nkKN6aXCQpEBodGyQpE1haW6Q2SBIeXBlcnRleHRMaXRlcmFsLmF0dHJpYnV0ZV92YWx1ZZC3SHlwZXJ0ZXh0TGl0ZXJhbC5SZXN1bHSQ2SBNYWluLlBsdXRvUnVubmVyLkNvcmUuYXBwbGljYWJsZZChOpC3SHlwZXJ0ZXh0TGl0ZXJhbC5CeXBhc3OQuU1haW4uUGx1dG9SdW5uZXIuQmFzZS5nZXSQpUBiaW5kkNkoTWFpbi5QbHV0b1J1bm5lci5QbHV0b1J1bm5lci5jcmVhdGVfYm9uZJCjZW5kkKV0YWtlIZChLZClcHJpbnSQsEh5cGVydGV4dExpdGVyYWyR2SQzNjI3MTRiMC03NWQ4LTExZWQtMjJjMC00OWNjZWIxNjFiYjWhK5ChKpCjY29zkKLOuJHZJDM2MjcxNGIwLTc1ZDgtMTFlZC0yMmMwLTQ5Y2NlYjE2MWJiNaNzaW6QtGNlbGxfZXhlY3V0aW9uX29yZGVyktkkMzYyNzE0YjAtNzVkOC0xMWVkLTIyYzAtNDljY2ViMTYxYmI12SRjODE1ZThlMS1mZmIxLTRiOTMtOGYzZS1hOGZkMGMxNDk1OTe0bGFzdF9ob3RfcmVsb2FkX3RpbWXLAAAAAAAAAACpc2hvcnRwYXRouEludGVyZXN0aW5nIGJsdWVwcmludC5qbK5wcm9jZXNzX3N0YXR1c6VyZWFkeaRwYXRo2UZDOlxVc2Vyc1xraXR0aXNvcGlrdWxtXC5qdWxpYVxwbHV0b19ub3RlYm9va3NcSW50ZXJlc3RpbmcgYmx1ZXByaW50Lmpsrmxhc3Rfc2F2ZV90aW1ly0HY4/9DOl41qmNlbGxfb3JkZXKS2SQzNjI3MTRiMC03NWQ4LTExZWQtMjJjMC00OWNjZWIxNjFiYjXZJGM4MTVlOGUxLWZmYjEtNGI5My04ZjNlLWE4ZmQwYzE0OTU5N7FwdWJsaXNoZWRfb2JqZWN0c4ClbmJwa2eIsmluc3RhbGxlZF92ZXJzaW9uc4KwSHlwZXJ0ZXh0TGl0ZXJhbKUwLjkuNKRGRlRXpTEuNS4wsHRlcm1pbmFsX291dHB1dHOCsEh5cGVydGV4dExpdGVyYWzZJxtbMzJtG1sxbUxvYWRpbmcbWzIybRtbMzltIHBhY2thZ2VzLi4uCqRGRlRX2dkbWzMybRtbMW1Mb2FkaW5nG1syMm0bWzM5bSBwYWNrYWdlcy4uLgobWzMybRtbMW1QcmVjb21waWxpbmcbWzIybRtbMzltIHByb2plY3QuLi4KG1szMm0gIOKckyAbWzM5bRtbOTBtTUtMX2psbBtbMzltChtbMzJtICDinJMgG1szOW1GRlRXCiAgMiBkZXBlbmRlbmNpZXMgc3VjY2Vzc2Z1bGx5IHByZWNvbXBpbGVkIGluIDUgc2Vjb25kcy4gMTQgYWxyZWFkeSBwcmVjb21waWxlZC4Kp2VuYWJsZWTDt3Jlc3RhcnRfcmVjb21tZW5kZWRfbXNnwLRyZXN0YXJ0X3JlcXVpcmVkX21zZ8CtYnVzeV9wYWNrYWdlc5CvaW5zdGFsbF90aW1lX25zzwAAAAJ/rwHcrGluc3RhbnRpYXRlZMOrY2VsbF9pbnB1dHOC2SQzNjI3MTRiMC03NWQ4LTExZWQtMjJjMC00OWNjZWIxNjFiYjWEp2NlbGxfaWTZJDM2MjcxNGIwLTc1ZDgtMTFlZC0yMmMwLTQ5Y2NlYjE2MWJiNaRjb2Rl2VNiZWdpbgoJdXNpbmcgRkZUVwoJdXNpbmcgSHlwZXJ0ZXh0TGl0ZXJhbAoJzrggPSByYW5nZSgtz4AsIHN0b3A9z4AsIGxlbmd0aD0xMDEpCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkYzgxNWU4ZTEtZmZiMS00YjkzLThmM2UtYThmZDBjMTQ5NTk3hKdjZWxsX2lk2SRjODE1ZThlMS1mZmIxLTRiOTMtOGYzZS1hOGZkMGMxNDk1OTekY29kZdoYW2JlZ2luCgkjIGZsYXR0ZW5lZAoJI3N2Z194ID0gMTAwKmNvcy4ozrgpIC4qIFJfY2lyY2xlX2Nvcy4ozrgpIC4rIDIwMAoJI3N2Z195ID0gMTAwKnNpbi4ozrgpIC4qIFJfY2lyY2xlX2Nvcy4ozrgpIC4rIDIwMAoKCSMgY2lyY2xlCglzdmdfeCA9IDEwMCpjb3MuKM64KSAuKyAyMDAKCXN2Z195ID0gMTAwKnNpbi4ozrgpIC4rIDIwMAoJYnVmID0gSU9CdWZmZXIoKQoJZm9yICh4LCB5KSBpbiB6aXAoc3ZnX3gsIHN2Z195KQoJCXByaW50KGJ1ZiwgeCAsIiwgIiwgeSwgIiwiKQoJZW5kCglzdHIgPSBTdHJpbmcodGFrZSEoYnVmKVsxOmVuZC0xXSkKCUBiaW5kIG15c3ZnIEBodGwoIiIiCgk8c3ZnIGlkPSJzdmctZWRpdC1kZW1vIiB2aWV3Qm94PSIwIDAgNDAwIDQwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmFsdWU9IjMiPgoJCgk8ZGVmcz4KCSAgICA8Y2lyY2xlIGlkPSJwb2ludC1oYW5kbGUiCgkgICAgICAgIHI9IjEwIiB4PSIwIiB5PSIwIgoJICAgICAgICBzdHJva2Utd2lkdGg9IjQiCgkgICAgICAgIGZpbGw9IiNmZmYiCgkgICAgICAgIGZpbGwtb3BhY2l0eT0iMC40IgoJICAgICAgICBzdHJva2U9IiNmZmYiLz4KCTwvZGVmcz4KCTxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgcj0iMTAiIC8+Cgk8cG9seWdvbiBpZD0iZWRpdC1zdGFyIgoJICAgIHN0cm9rZT0iIzI5ZSIKCSAgICBzdHJva2Utd2lkdGg9IjIwIgoJICAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCgkgICAgZmlsbD0ibm9uZSIKCSAgICBwb2ludHM9IiQoc3RyKSIvPgoJPC9zdmc+Cgk8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9pbnRlcmFjdGpzQDEuMTAuMTcvZGlzdC9pbnRlcmFjdC5taW4uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9mb3VyaWVyL2ZvdXJpZXIubWluLmpzIj48L3NjcmlwdD4KCTxzY3JpcHQ+Cgljb25zb2xlLmxvZygiU1ZHIFNjcmlwdCIpCiAgY29uc3Qgc25zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJwogIGNvbnN0IHhucyA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJwogIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZnLWVkaXQtZGVtbycpCiAgY29uc3Qgc3RhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXN0YXInKQogIGxldCByb290TWF0cml4CiAgY29uc3Qgb3JpZ2luYWxQb2ludHMgPSBbXQogIGxldCB0cmFuc2Zvcm1lZFBvaW50cyA9IFtdCgogIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdGFyLnBvaW50cy5udW1iZXJPZkl0ZW1zOyBpIDwgbGVuLTIwOyBpICs9IDIwKSB7CiAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc25zLCAndXNlJykKICAgIGNvbnN0IHBvaW50ID0gc3Rhci5wb2ludHMuZ2V0SXRlbShpKQogICAgY29uc3QgbmV3UG9pbnQgPSByb290LmNyZWF0ZVNWR1BvaW50KCkKCiAgICBoYW5kbGUuc2V0QXR0cmlidXRlTlMoeG5zLCAnaHJlZicsICcjcG9pbnQtaGFuZGxlJykKICAgIGhhbmRsZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3BvaW50LWhhbmRsZScpCgogICAgaGFuZGxlLnguYmFzZVZhbC52YWx1ZSA9IG5ld1BvaW50LnggPSBwb2ludC54CiAgICBoYW5kbGUueS5iYXNlVmFsLnZhbHVlID0gbmV3UG9pbnQueSA9IHBvaW50LnkKCiAgICBoYW5kbGUuc2V0QXR0cmlidXRlKCdkYXRhLWluZGV4JywgaSkKCiAgICBvcmlnaW5hbFBvaW50cy5wdXNoKG5ld1BvaW50KQoKICAgIHJvb3QuYXBwZW5kQ2hpbGQoaGFuZGxlKQogIH0KCiAgZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm1zIChldmVudCkgewogICAgcm9vdE1hdHJpeCA9IHJvb3QuZ2V0U2NyZWVuQ1RNKCkKCiAgICB0cmFuc2Zvcm1lZFBvaW50cyA9IG9yaWdpbmFsUG9pbnRzLm1hcCgocG9pbnQpID0+IHsKICAgICAgcmV0dXJuIHBvaW50Lm1hdHJpeFRyYW5zZm9ybShyb290TWF0cml4KQogICAgfSkKCiAgICBpbnRlcmFjdCgnLnBvaW50LWhhbmRsZScpLmRyYWdnYWJsZSh7CiAgICAgIHNuYXA6IHsKICAgICAgICB0YXJnZXRzOiB0cmFuc2Zvcm1lZFBvaW50cywKICAgICAgICByYW5nZTogMjAgKiBNYXRoLm1heChyb290TWF0cml4LmEsIHJvb3RNYXRyaXguZCksCiAgICAgIH0sCiAgICB9KQogIH0KCgogIGZ1bmN0aW9uIHVwZGF0ZVBvaW50cygpIHsKICAgIGNvbnN0IHN0YXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjZWRpdC1zdGFyIikKCWNvbnN0IGNvbnRyb2xQb2ludHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucG9pbnQtaGFuZGxlIikKCWNvbnN0IG51bV9jcCA9IDUKCWNvbnN0IG51bV9wdCA9IDEwMQoJbGV0IHggPSBuZXcgQXJyYXkobnVtX2NwKQoJbGV0IHkgPSBuZXcgQXJyYXkobnVtX2NwKQogICAgZm9yKHZhciBpID0gMDsgaSA8IG51bV9jcDsgaSsrKSB7CiAgICAgeFtpXSA9IGNvbnRyb2xQb2ludHNbaV0ueC5iYXNlVmFsLnZhbHVlCiAgICAgeVtpXSA9IGNvbnRyb2xQb2ludHNbaV0ueS5iYXNlVmFsLnZhbHVlCiAgICB9CgoJLy9sZXQgeGhhdCA9IG5ldyBBcnJheSgxMDEpCgkvL2xldCB5aGF0ID0gbmV3IEFycmF5KDEwMSkKCWNvbnN0IFt4aGF0LCB5aGF0XSA9IGZvdXJpZXIuZGZ0KHggLHkpCgkKICAgIGxldCB4bG9uZ2hhdCA9IG5ldyBBcnJheShudW1fcHQpLmZpbGwoMC4wKQogICAgbGV0IHlsb25naGF0ID0gbmV3IEFycmF5KG51bV9wdCkuZmlsbCgwLjApCgoJeGxvbmdoYXRbMF0gPSB4aGF0WzBdICogbnVtX3B0IC8gbnVtX2NwCgl4bG9uZ2hhdFsxXSA9IHhoYXRbMV0gKiBudW1fcHQgLyBudW1fY3AKCXhsb25naGF0WzJdID0geGhhdFsyXSAqIG51bV9wdCAvIG51bV9jcAoJeGxvbmdoYXRbOTldID0geGhhdFszXSAqIG51bV9wdCAvIG51bV9jcAoJeGxvbmdoYXRbMTAwXSA9IHhoYXRbNF0gKiBudW1fcHQgLyBudW1fY3AKCgl5bG9uZ2hhdFswXSA9IHloYXRbMF0gKiBudW1fcHQgLyBudW1fY3AKCXlsb25naGF0WzFdID0geWhhdFsxXSAqIG51bV9wdCAvIG51bV9jcAoJeWxvbmdoYXRbMl0gPSB5aGF0WzJdICogbnVtX3B0IC8gbnVtX2NwCgl5bG9uZ2hhdFs5OV0gPSB5aGF0WzNdICogbnVtX3B0IC8gbnVtX2NwCgl5bG9uZ2hhdFsxMDBdID0geWhhdFs0XSAqIG51bV9wdCAvIG51bV9jcAoKCS8vbGV0IHhsb25nID0gbmV3IEFycmF5KDEwMSkKCS8vbGV0IHlsb25nID0gbmV3IEFycmF5KDEwMSkKCWNvbnN0IFt4bG9uZywgeWxvbmddID0gZm91cmllci5pZGZ0KHhsb25naGF0LCB5bG9uZ2hhdCkKCQogICAgZm9yICh2YXIgaT0wOyBpIDwgbnVtX3B0OyBpKyspIHsKICAgICAgc3Rhci5wb2ludHNbaV0ueCA9IHhsb25nW2ldCiAgICAgIHN0YXIucG9pbnRzW2ldLnkgPSB5bG9uZ1tpXQogICAgfQoJCiAgfQoKICBmdW5jdGlvbiB1cGRhdGVQb2ludHNSYWRpYWwoKSB7CiAgICBjb25zdCBzdGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2VkaXQtc3RhciIpCgljb25zdCBjb250cm9sUG9pbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnBvaW50LWhhbmRsZSIpCgljb25zdCBudW1fY3AgPSA1Cgljb25zdCBudW1fcHQgPSAxMDAKCWxldCB4ID0gbmV3IEFycmF5KG51bV9jcCkKCWxldCB5ID0gbmV3IEFycmF5KG51bV9jcCkKCWxldCByID0gbmV3IEFycmF5KG51bV9jcCkKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBudW1fY3A7IGkrKykgewogICAgIHhbaV0gPSBjb250cm9sUG9pbnRzW2ldLnguYmFzZVZhbC52YWx1ZQogICAgIHlbaV0gPSBjb250cm9sUG9pbnRzW2ldLnkuYmFzZVZhbC52YWx1ZQoJIHJbaV0gPSBNYXRoLmh5cG90KHhbaV0tMjAwLCB5W2ldLTIwMCkKCSAvL2NvbnNvbGUubG9nKHJbaV0pCiAgICB9CgkKCglsZXQgeiA9IG5ldyBBcnJheShudW1fY3ApLmZpbGwoMC4wKQoJY29uc3QgW3JoYXQsIGloYXRdID0gZm91cmllci5kZnQociwgeikKCglsZXQgcmxvbmdoYXQgPSBuZXcgQXJyYXkobnVtX3B0KS5maWxsKDAuMCkKCWxldCBpbG9uZ2hhdCA9IG5ldyBBcnJheShudW1fcHQpLmZpbGwoMC4wKQoKCXJsb25naGF0WzBdID0gcmhhdFswXSAqIG51bV9wdCAvIG51bV9jcAoJcmxvbmdoYXRbMV0gPSByaGF0WzFdICogbnVtX3B0IC8gbnVtX2NwCglybG9uZ2hhdFsyXSA9IHJoYXRbMl0gKiBudW1fcHQgLyBudW1fY3AKCXJsb25naGF0Wzk5XSA9IHJoYXRbM10gKiBudW1fcHQgLyBudW1fY3AKCXJsb25naGF0WzEwMF0gPSByaGF0WzRdICogbnVtX3B0IC8gbnVtX2NwCgoJaWxvbmdoYXRbMF0gPSBpaGF0WzBdICogbnVtX3B0IC8gbnVtX2NwCglpbG9uZ2hhdFsxXSA9IGloYXRbMV0gKiBudW1fcHQgLyBudW1fY3AKCWlsb25naGF0WzJdID0gaWhhdFsyXSAqIG51bV9wdCAvIG51bV9jcAoJaWxvbmdoYXRbOTldID0gaWhhdFszXSAqIG51bV9wdCAvIG51bV9jcAoJaWxvbmdoYXRbMTAwXSA9IGloYXRbNF0gKiBudW1fcHQgLyBudW1fY3AKCgljb25zdCBbcmxvbmcsIF9dID0gZm91cmllci5pZGZ0KHJsb25naGF0LCBpbG9uZ2hhdCkKCQoJLy9sZXQgeGxvbmcgPSBuZXcgQXJyYXkobnVtX3B0KQoJLy9sZXQgeWxvbmcgPSBuZXcgQXJyYXkobnVtX3B0KQoKCWxldCB0aGV0YSA9IC1NYXRoLlBJCgoJZm9yKHZhciBpPTA7IGkgPCBudW1fcHQ7IGkrKykgewoJICAgLy9jb25zb2xlLmxvZyhybG9uZ1tpXSkKCSAgIHN0YXIucG9pbnRzW2ldLnggPSBybG9uZ1tpXSAqIE1hdGguY29zKHRoZXRhKSArIDIwMAoJICAgc3Rhci5wb2ludHNbaV0ueSA9IHJsb25nW2ldICogTWF0aC5zaW4odGhldGEpICsgMjAwCgkgICB0aGV0YSArPSAyICogTWF0aC5QSSAvIChudW1fcHQpCgl9CgoJc3Rhci5wb2ludHNbbnVtX3B0XS54ID0gc3Rhci5wb2ludHNbMF0ueAoJc3Rhci5wb2ludHNbbnVtX3B0XS55ID0gc3Rhci5wb2ludHNbMF0ueQoKCQogIH0KCiAgaW50ZXJhY3Qocm9vdCkub24oJ21vdXNlZG93bicsIGFwcGx5VHJhbnNmb3Jtcykub24oJ3RvdWNoc3RhcnQnLCBhcHBseVRyYW5zZm9ybXMpCgogIGludGVyYWN0KCcucG9pbnQtaGFuZGxlJykKICAgIC5kcmFnZ2FibGUoewogICAgICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICByb290LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnZHJhZ2dpbmcnKQogICAgICB9LAogICAgICBvbm1vdmU6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgIGNvbnN0IGkgPSBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV4JykgfCAwCiAgICAgICAgY29uc3QgcG9pbnQgPSBzdGFyLnBvaW50cy5nZXRJdGVtKGkpCgoJCS8vR2V0IGFuZ2xlIGFuZCByYWRpdXMKCQljb25zdCB0aGV0YSA9IE1hdGguYXRhbjIocG9pbnQueSAtIDIwMCwgcG9pbnQueCAtIDIwMCkKCgkgICAgLy91bmNvbnN0cmFpbmVkCiAgICAgICAgcG9pbnQueCArPSBldmVudC5keCAvIHJvb3RNYXRyaXguYQogICAgICAgIHBvaW50LnkgKz0gZXZlbnQuZHkgLyByb290TWF0cml4LmQKCgkgICAgLy9yYWRpYWxseSBjb25zdHJhaW5lZAoJCWNvbnN0IHJhZGlhbCA9IE1hdGguaHlwb3QocG9pbnQueSAtIDIwMCwgcG9pbnQueCAtIDIwMCkJICAgIAoJICAgIHBvaW50LnggPSByYWRpYWwgKiBNYXRoLmNvcyh0aGV0YSkgKyAyMDAKCSAgICBwb2ludC55ID0gcmFkaWFsICogTWF0aC5zaW4odGhldGEpICsgMjAwCgogICAgICAgIGV2ZW50LnRhcmdldC54LmJhc2VWYWwudmFsdWUgPSBwb2ludC54CiAgICAgICAgZXZlbnQudGFyZ2V0LnkuYmFzZVZhbC52YWx1ZSA9IHBvaW50LnkKCgkJLy91cGRhdGVQb2ludHNSYWRpYWwoKQoJICAgIC8vdXBkYXRlUG9pbnRzKCkKICAgICAgfSwKICAgICAgb25lbmQ6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCdjbGFzcycsICcnKQoJICAgIHVwZGF0ZVBvaW50c1JhZGlhbCgpCiAgICAgIH0sCiAgICAgIHNuYXA6IHsKICAgICAgICB0YXJnZXRzOiBvcmlnaW5hbFBvaW50cywKICAgICAgICByYW5nZTogMTAsCiAgICAgICAgcmVsYXRpdmVQb2ludHM6IFt7IHg6IDAuNSwgeTogMC41IH1dLAogICAgICB9LAogICAgICByZXN0cmljdDogeyByZXN0cmljdGlvbjogZG9jdW1lbnQucm9vdEVsZW1lbnQgfSwKICAgIH0pCiAgICAuc3R5bGVDdXJzb3IoZmFsc2UpCgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIChldmVudCkgPT4gewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKQogIH0pCjwvc2NyaXB0PgoJIiIiKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMKrbm90ZWJvb2tfaWTZJDM2MjcxNGIwLTc1ZDgtMTFlZC0xNDk0LWE3ODVhYmU0MzEzY6tpbl90ZW1wX2RpcsOobWV0YWRhdGGA";
window.pluto_preamble_html = undefined;
</script>
<meta name="pluto-insertion-spot-parameters">
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.505b982d.js" type="module" defer="" integrity="sha384-RAKZ8kuxvc3ilICBZgvEJ57Z4OfXYz37Eoglh4v+smYrAwpEH6pkrwdz+rKsXJLg" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.16/frontend-dist/editor.b9f0ac7b.js" integrity="sha384-bgokkaJz2F/u6BCZYRcl36Jkfwy7x9SeobwBF3EWarMEaCfg5aSU3Z7nSuLQdETn" crossorigin="anonymous"></script><script type="text/javascript" id="MathJax-script" integrity="sha384-4kE/rQ11E8xT9QgrCBTyvenkuPfQo8rXYQvJZuMgxyPOoUfpatjQPlgdv6V5yhUK" crossorigin="" not-the-src-yet="https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-svg-full.js" async=""></script></head><body class="loading no-MαθJax"> <div style="display:flex;min-height:100vh;"> <pluto-editor class="fullscreen"></pluto-editor> </div> </body></html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment