From 23f92bc3359efce073675087214b12d2e1f41aa5 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Tue, 23 Sep 2025 13:46:27 +0300 Subject: [PATCH] Add runner install template management (#525) * Add template api endpoints Signed-off-by: Gabriel Adrian Samfira * Added template bypass Pools and scale sets will automatically migrate to the new template system for runner install scripts. If a pool or a scale set cannot be migrate, it is left alone. It is expected that users set a runner install template manually for scenarios we don't yet have a template for (windows on gitea for example). Signed-off-by: Gabriel Adrian Samfira * Integrate templates with pool create/update Signed-off-by: Gabriel Adrian Samfira * Add webapp integration with templates Signed-off-by: Gabriel Adrian Samfira * Add unit tests Signed-off-by: Gabriel Adrian Samfira * Populate all relevant context fields Signed-off-by: Gabriel Adrian Samfira * Update dependencies Signed-off-by: Gabriel Adrian Samfira * Fix lint Signed-off-by: Gabriel Adrian Samfira * Validate uint Signed-off-by: Gabriel Adrian Samfira * Add CLI template management Signed-off-by: Gabriel Adrian Samfira * Some editor improvements and bugfixes Signed-off-by: Gabriel Adrian Samfira * Fix scale set return values post create Signed-off-by: Gabriel Adrian Samfira * Fix template websocket events filter Signed-off-by: Gabriel Adrian Samfira --------- Signed-off-by: Gabriel Adrian Samfira --- apiserver/controllers/metadata.go | 17 + apiserver/controllers/templates.go | 259 ++ apiserver/routers/routers.go | 22 +- apiserver/swagger-models.yaml | 32 +- apiserver/swagger.yaml | 146 + auth/context.go | 24 +- auth/instance_middleware.go | 50 +- cache/controller_cache.go | 42 + cache/template_cache.go | 79 + client/garm_api_client.go | 5 + .../templates/create_template_parameters.go | 151 + client/templates/create_template_responses.go | 184 ++ .../templates/delete_template_parameters.go | 152 + client/templates/delete_template_responses.go | 106 + client/templates/get_template_parameters.go | 152 + client/templates/get_template_responses.go | 184 ++ client/templates/list_templates_parameters.go | 231 ++ client/templates/list_templates_responses.go | 184 ++ client/templates/templates_client.go | 257 ++ .../templates/update_template_parameters.go | 173 ++ client/templates/update_template_responses.go | 184 ++ cmd/garm-cli/cmd/pool.go | 20 + cmd/garm-cli/cmd/scalesets.go | 20 + cmd/garm-cli/cmd/templates.go | 485 ++++ cmd/garm-cli/cmd/util.go | 41 + cmd/garm-cli/editor/editor.go | 783 ++++++ database/common/mocks/Store.go | 341 ++- database/common/store.go | 11 + database/common/watcher.go | 1 + database/sql/models.go | 22 + database/sql/pools.go | 3 + database/sql/pools_test.go | 2 +- database/sql/scalesets.go | 12 +- database/sql/sql.go | 147 +- database/sql/templates.go | 311 +++ database/sql/templates_test.go | 426 +++ database/sql/util.go | 39 + go.mod | 5 + go.sum | 41 + internal/templates/templates.go | 96 + .../userdata/gitea_linux_userdata.tmpl | 139 + .../userdata/github_linux_userdata.tmpl | 179 ++ .../userdata/github_windows_userdata.tmpl | 509 ++++ .../templates/userdata/linux_wrapper.tmpl | 13 + .../templates/userdata/windows_wrapper.tmpl | 57 + params/params.go | 23 + params/requests.go | 51 + runner/enterprises.go | 25 +- runner/metadata.go | 199 +- runner/metadata_test.go | 498 ++++ runner/organizations.go | 24 +- runner/pool/pool.go | 15 +- runner/repositories.go | 71 +- runner/scalesets.go | 19 + runner/templates.go | 104 + runner/templates_test.go | 326 +++ util/util.go | 47 + .../cloudconfig/cloudconfig.go | 184 ++ .../cloudconfig/templates.go | 786 ++++++ .../garm-provider-common/cloudconfig/util.go | 207 ++ .../github.com/gdamore/encoding/.appveyor.yml | 13 + .../gdamore/encoding/CODE_OF_CONDUCT.md | 73 + vendor/github.com/gdamore/encoding/LICENSE | 202 ++ vendor/github.com/gdamore/encoding/README.md | 20 + .../github.com/gdamore/encoding/SECURITY.md | 12 + vendor/github.com/gdamore/encoding/ascii.go | 36 + vendor/github.com/gdamore/encoding/charmap.go | 195 ++ vendor/github.com/gdamore/encoding/doc.go | 17 + vendor/github.com/gdamore/encoding/ebcdic.go | 273 ++ vendor/github.com/gdamore/encoding/latin1.go | 33 + vendor/github.com/gdamore/encoding/latin5.go | 35 + vendor/github.com/gdamore/encoding/utf8.go | 35 + vendor/github.com/gdamore/tcell/v2/.gitignore | 1 + vendor/github.com/gdamore/tcell/v2/AUTHORS | 4 + .../github.com/gdamore/tcell/v2/CHANGESv2.md | 82 + vendor/github.com/gdamore/tcell/v2/LICENSE | 202 ++ .../gdamore/tcell/v2/README-wasm.md | 61 + vendor/github.com/gdamore/tcell/v2/README.md | 238 ++ .../github.com/gdamore/tcell/v2/SECURITY.md | 15 + .../github.com/gdamore/tcell/v2/TUTORIAL.md | 313 +++ vendor/github.com/gdamore/tcell/v2/UKRAINE.md | 77 + vendor/github.com/gdamore/tcell/v2/attr.go | 34 + vendor/github.com/gdamore/tcell/v2/cell.go | 249 ++ .../gdamore/tcell/v2/charset_plan9.go | 23 + .../gdamore/tcell/v2/charset_stub.go | 22 + .../gdamore/tcell/v2/charset_unix.go | 50 + .../gdamore/tcell/v2/charset_windows.go | 22 + vendor/github.com/gdamore/tcell/v2/color.go | 1128 ++++++++ .../github.com/gdamore/tcell/v2/colorfit.go | 53 + .../gdamore/tcell/v2/console_stub.go | 24 + .../gdamore/tcell/v2/console_win.go | 1411 ++++++++++ vendor/github.com/gdamore/tcell/v2/doc.go | 47 + .../github.com/gdamore/tcell/v2/encoding.go | 140 + vendor/github.com/gdamore/tcell/v2/errors.go | 73 + vendor/github.com/gdamore/tcell/v2/event.go | 53 + vendor/github.com/gdamore/tcell/v2/focus.go | 28 + .../github.com/gdamore/tcell/v2/interrupt.go | 41 + vendor/github.com/gdamore/tcell/v2/key.go | 470 ++++ vendor/github.com/gdamore/tcell/v2/mouse.go | 103 + .../gdamore/tcell/v2/nonblock_bsd.go | 43 + .../gdamore/tcell/v2/nonblock_unix.go | 41 + vendor/github.com/gdamore/tcell/v2/paste.go | 72 + vendor/github.com/gdamore/tcell/v2/resize.go | 66 + vendor/github.com/gdamore/tcell/v2/runes.go | 111 + vendor/github.com/gdamore/tcell/v2/screen.go | 495 ++++ .../github.com/gdamore/tcell/v2/simulation.go | 528 ++++ .../github.com/gdamore/tcell/v2/stdin_unix.go | 186 ++ vendor/github.com/gdamore/tcell/v2/style.go | 202 ++ .../gdamore/tcell/v2/terminfo/.gitignore | 1 + .../gdamore/tcell/v2/terminfo/README.md | 25 + .../gdamore/tcell/v2/terminfo/TERMINALS.md | 7 + .../tcell/v2/terminfo/a/aixterm/term.go | 83 + .../tcell/v2/terminfo/a/alacritty/direct.go | 69 + .../tcell/v2/terminfo/a/alacritty/term.go | 76 + .../gdamore/tcell/v2/terminfo/a/ansi/term.go | 43 + .../tcell/v2/terminfo/b/beterm/term.go | 57 + .../gdamore/tcell/v2/terminfo/base/base.go | 33 + .../tcell/v2/terminfo/c/cygwin/term.go | 66 + .../tcell/v2/terminfo/d/dtterm/term.go | 71 + .../tcell/v2/terminfo/dynamic/dynamic.go | 423 +++ .../gdamore/tcell/v2/terminfo/e/emacs/term.go | 65 + .../tcell/v2/terminfo/extended/extended.go | 57 + .../gdamore/tcell/v2/terminfo/f/foot/foot.go | 70 + .../gdamore/tcell/v2/terminfo/g/gnome/term.go | 136 + .../gdamore/tcell/v2/terminfo/gen.sh | 19 + .../tcell/v2/terminfo/h/hpterm/term.go | 51 + .../tcell/v2/terminfo/k/konsole/term.go | 138 + .../gdamore/tcell/v2/terminfo/k/kterm/term.go | 71 + .../gdamore/tcell/v2/terminfo/l/linux/term.go | 73 + .../gdamore/tcell/v2/terminfo/models.txt | 31 + .../tcell/v2/terminfo/p/pcansi/term.go | 41 + .../gdamore/tcell/v2/terminfo/r/rxvt/term.go | 493 ++++ .../tcell/v2/terminfo/s/screen/term.go | 128 + .../tcell/v2/terminfo/s/simpleterm/term.go | 136 + .../gdamore/tcell/v2/terminfo/s/sun/term.go | 112 + .../gdamore/tcell/v2/terminfo/t/tmux/term.go | 142 + .../gdamore/tcell/v2/terminfo/terminfo.go | 781 ++++++ .../gdamore/tcell/v2/terminfo/v/vt100/term.go | 51 + .../gdamore/tcell/v2/terminfo/v/vt102/term.go | 50 + .../gdamore/tcell/v2/terminfo/v/vt220/term.go | 63 + .../gdamore/tcell/v2/terminfo/v/vt320/term.go | 66 + .../gdamore/tcell/v2/terminfo/v/vt400/term.go | 50 + .../gdamore/tcell/v2/terminfo/v/vt420/term.go | 56 + .../gdamore/tcell/v2/terminfo/v/vt52/term.go | 39 + .../gdamore/tcell/v2/terminfo/w/wy50/term.go | 60 + .../gdamore/tcell/v2/terminfo/w/wy60/term.go | 66 + .../tcell/v2/terminfo/w/wy99_ansi/term.go | 120 + .../gdamore/tcell/v2/terminfo/x/xfce/term.go | 70 + .../tcell/v2/terminfo/x/xterm/direct.go | 92 + .../gdamore/tcell/v2/terminfo/x/xterm/term.go | 201 ++ .../tcell/v2/terminfo/x/xterm_ghostty/term.go | 79 + .../tcell/v2/terminfo/x/xterm_kitty/term.go | 75 + .../gdamore/tcell/v2/terms_default.go | 24 + .../gdamore/tcell/v2/terms_dynamic.go | 43 + .../gdamore/tcell/v2/terms_static.go | 28 + vendor/github.com/gdamore/tcell/v2/tscreen.go | 2153 +++++++++++++++ .../gdamore/tcell/v2/tscreen_plan9.go | 36 + .../gdamore/tcell/v2/tscreen_stub.go | 32 + .../gdamore/tcell/v2/tscreen_unix.go | 37 + vendor/github.com/gdamore/tcell/v2/tty.go | 56 + .../github.com/gdamore/tcell/v2/tty_plan9.go | 270 ++ .../github.com/gdamore/tcell/v2/tty_unix.go | 198 ++ vendor/github.com/gdamore/tcell/v2/wscreen.go | 676 +++++ .../lucasb-eyer/go-colorful/.gitignore | 101 + .../lucasb-eyer/go-colorful/CHANGELOG.md | 42 + .../lucasb-eyer/go-colorful/LICENSE | 7 + .../lucasb-eyer/go-colorful/README.md | 482 ++++ .../lucasb-eyer/go-colorful/colorgens.go | 55 + .../lucasb-eyer/go-colorful/colors.go | 979 +++++++ .../go-colorful/happy_palettegen.go | 25 + .../lucasb-eyer/go-colorful/hexcolor.go | 67 + .../go-colorful/hsluv-snapshot-rev4.json | 1 + .../lucasb-eyer/go-colorful/hsluv.go | 207 ++ .../go-colorful/soft_palettegen.go | 185 ++ .../go-colorful/warm_palettegen.go | 25 + vendor/github.com/rivo/tview/CONTRIBUTING.md | 35 + vendor/github.com/rivo/tview/LICENSE.txt | 21 + vendor/github.com/rivo/tview/README.md | 171 ++ vendor/github.com/rivo/tview/ansi.go | 283 ++ vendor/github.com/rivo/tview/application.go | 899 ++++++ vendor/github.com/rivo/tview/borders.go | 45 + vendor/github.com/rivo/tview/box.go | 486 ++++ vendor/github.com/rivo/tview/button.go | 199 ++ vendor/github.com/rivo/tview/checkbox.go | 338 +++ vendor/github.com/rivo/tview/doc.go | 224 ++ vendor/github.com/rivo/tview/dropdown.go | 741 +++++ vendor/github.com/rivo/tview/flex.go | 275 ++ vendor/github.com/rivo/tview/form.go | 896 ++++++ vendor/github.com/rivo/tview/frame.go | 235 ++ vendor/github.com/rivo/tview/grid.go | 717 +++++ vendor/github.com/rivo/tview/image.go | 764 +++++ vendor/github.com/rivo/tview/inputfield.go | 717 +++++ vendor/github.com/rivo/tview/list.go | 779 ++++++ vendor/github.com/rivo/tview/modal.go | 214 ++ vendor/github.com/rivo/tview/pages.go | 354 +++ vendor/github.com/rivo/tview/primitive.go | 69 + vendor/github.com/rivo/tview/semigraphics.go | 328 +++ vendor/github.com/rivo/tview/strings.go | 634 +++++ vendor/github.com/rivo/tview/styles.go | 35 + vendor/github.com/rivo/tview/table.go | 1725 ++++++++++++ vendor/github.com/rivo/tview/textarea.go | 2447 +++++++++++++++++ vendor/github.com/rivo/tview/textview.go | 1446 ++++++++++ vendor/github.com/rivo/tview/treeview.go | 910 ++++++ vendor/github.com/rivo/tview/tview.gif | Bin 0 -> 973384 bytes vendor/github.com/rivo/tview/util.go | 158 ++ vendor/golang.org/x/sys/plan9/asm.s | 8 + vendor/golang.org/x/sys/plan9/asm_plan9_386.s | 30 + .../golang.org/x/sys/plan9/asm_plan9_amd64.s | 30 + vendor/golang.org/x/sys/plan9/asm_plan9_arm.s | 25 + vendor/golang.org/x/sys/plan9/const_plan9.go | 70 + vendor/golang.org/x/sys/plan9/dir_plan9.go | 212 ++ vendor/golang.org/x/sys/plan9/env_plan9.go | 31 + vendor/golang.org/x/sys/plan9/errors_plan9.go | 50 + vendor/golang.org/x/sys/plan9/mkall.sh | 150 + vendor/golang.org/x/sys/plan9/mkerrors.sh | 246 ++ .../golang.org/x/sys/plan9/mksysnum_plan9.sh | 23 + vendor/golang.org/x/sys/plan9/pwd_plan9.go | 19 + vendor/golang.org/x/sys/plan9/race.go | 30 + vendor/golang.org/x/sys/plan9/race0.go | 25 + vendor/golang.org/x/sys/plan9/str.go | 22 + vendor/golang.org/x/sys/plan9/syscall.go | 109 + .../golang.org/x/sys/plan9/syscall_plan9.go | 361 +++ .../x/sys/plan9/zsyscall_plan9_386.go | 284 ++ .../x/sys/plan9/zsyscall_plan9_amd64.go | 284 ++ .../x/sys/plan9/zsyscall_plan9_arm.go | 284 ++ .../golang.org/x/sys/plan9/zsysnum_plan9.go | 49 + vendor/golang.org/x/term/CONTRIBUTING.md | 26 + vendor/golang.org/x/term/LICENSE | 27 + vendor/golang.org/x/term/PATENTS | 22 + vendor/golang.org/x/term/README.md | 16 + vendor/golang.org/x/term/codereview.cfg | 1 + vendor/golang.org/x/term/term.go | 60 + vendor/golang.org/x/term/term_plan9.go | 42 + vendor/golang.org/x/term/term_unix.go | 91 + vendor/golang.org/x/term/term_unix_bsd.go | 12 + vendor/golang.org/x/term/term_unix_other.go | 12 + vendor/golang.org/x/term/term_unsupported.go | 38 + vendor/golang.org/x/term/term_windows.go | 82 + vendor/golang.org/x/term/terminal.go | 1048 +++++++ vendor/golang.org/x/text/encoding/encoding.go | 335 +++ .../internal/identifier/identifier.go | 81 + .../text/encoding/internal/identifier/mib.go | 1627 +++++++++++ vendor/modules.txt | 56 + .../_app/immutable/assets/0.CP-xI7De.css | 1 + .../_app/immutable/assets/0.pWW488Rd.css | 1 - .../immutable/assets/_layout.CP-xI7De.css | 1 + .../immutable/assets/_layout.pWW488Rd.css | 1 - .../assets/_app/immutable/chunks/-esynYXT.js | 7 - .../assets/_app/immutable/chunks/2Xl6sR6s.js | 2 + .../assets/_app/immutable/chunks/41x1-UqF.js | 1 + .../chunks/{BXdh0O4_.js => 91PQ6UtW.js} | 2 +- .../assets/_app/immutable/chunks/B-_QCM7E.js | 1 + .../assets/_app/immutable/chunks/B0Y2gXDu.js | 1 - .../chunks/{DxLDbRe7.js => B1V2wE0x.js} | 2 +- .../assets/_app/immutable/chunks/B1coRVG4.js | 1 - .../assets/_app/immutable/chunks/B27KefbC.js | 1 - .../assets/_app/immutable/chunks/B3a35v7J.js | 1 - .../assets/_app/immutable/chunks/BAnDfGwP.js | 1 - .../assets/_app/immutable/chunks/BM4Azg_w.js | 1 + .../assets/_app/immutable/chunks/BMHtEUeX.js | 1 - .../assets/_app/immutable/chunks/BQabvZPm.js | 1 - .../assets/_app/immutable/chunks/BUaPampd.js | 2 + .../assets/_app/immutable/chunks/BV_mDmfH.js | 1 + .../chunks/{D9uxtZe_.js => BVyy60Ai.js} | 2 +- .../assets/_app/immutable/chunks/BZ2WxPPD.js | 1 + .../assets/_app/immutable/chunks/Bc0BXFmi.js | 1 - .../assets/_app/immutable/chunks/BgSaD1r_.js | 1 + .../chunks/{D6DjlyIQ.js => Bgbd8SZ5.js} | 2 +- .../assets/_app/immutable/chunks/Bo3f8OIz.js | 1 + .../assets/_app/immutable/chunks/BxQMwFca.js | 1 - .../assets/_app/immutable/chunks/C2rI8IaC.js | 1 + .../assets/_app/immutable/chunks/C73ZVvpW.js | 1 - .../chunks/{0HF0aP0D.js => C7KJ549w.js} | 2 +- .../chunks/{DT0EGONV.js => C7KraPli.js} | 2 +- .../assets/_app/immutable/chunks/C98nByjP.js | 1 + .../assets/_app/immutable/chunks/CCFUzH5i.js | 1 + .../assets/_app/immutable/chunks/CPFytHjx.js | 1 + .../assets/_app/immutable/chunks/CRKWEg6v.js | 2 - .../chunks/{Dkb9lSSG.js => CTvJf3dP.js} | 2 +- .../assets/_app/immutable/chunks/CYqkNFLz.js | 1 + .../assets/_app/immutable/chunks/CiGy614T.js | 1 - .../assets/_app/immutable/chunks/CiWDXYQd.js | 1 + .../assets/_app/immutable/chunks/Cqnw7O8j.js | 1 + .../assets/_app/immutable/chunks/CrNwrvNH.js | 1 - .../assets/_app/immutable/chunks/Cwu7L3Xf.js | 1 + .../chunks/{DJsbLMno.js => D6f8Dk7c.js} | 4 +- .../chunks/{D0m048VH.js => D7e9zx6w.js} | 2 +- .../assets/_app/immutable/chunks/DF8ZTWYj.js | 1 - .../assets/_app/immutable/chunks/DJ6ZD3Tj.js | 1 - .../chunks/{c_t0vA9G.js => DJsB5Z5V.js} | 4 +- .../assets/_app/immutable/chunks/DPR9Z_fe.js | 1 + .../chunks/{B0m3rqSR.js => DVsSf1wv.js} | 2 +- .../assets/_app/immutable/chunks/Ddit_D7n.js | 1 - .../assets/_app/immutable/chunks/Djd10kRn.js | 1 - .../assets/_app/immutable/chunks/DliFOxtc.js | 1 + .../assets/_app/immutable/chunks/DqFqoVWr.js | 1 + .../assets/_app/immutable/chunks/DqbUkQgD.js | 7 + .../assets/_app/immutable/chunks/Du50aAe5.js | 1 + .../assets/_app/immutable/chunks/JUkrBp3F.js | 1 + .../assets/_app/immutable/chunks/R3ADTHgb.js | 19 + .../assets/_app/immutable/chunks/U3V4g_hv.js | 1 + .../assets/_app/immutable/chunks/WI-og7-I.js | 1 + .../assets/_app/immutable/chunks/b5SBTec5.js | 1 - .../assets/_app/immutable/chunks/cPTQ2Ibn.js | 2 + .../assets/_app/immutable/chunks/e1m7WRO5.js | 1 - .../assets/_app/immutable/chunks/oOdVuDuv.js | 1 + .../assets/_app/immutable/chunks/xe-4nY5o.js | 1 - .../_app/immutable/entry/app.B4u5nxVj.js | 2 + .../_app/immutable/entry/app.Cfl2QgNR.js | 2 - .../_app/immutable/entry/start.-FfRLqKC.js | 1 + .../_app/immutable/entry/start.DNVtGLiy.js | 1 - .../assets/_app/immutable/nodes/0.DYP5Tzsv.js | 13 + .../assets/_app/immutable/nodes/0.W3yf06lM.js | 13 - .../assets/_app/immutable/nodes/1.BQyKnLFk.js | 1 + .../assets/_app/immutable/nodes/1.R-OM_0cI.js | 1 - .../nodes/{10.DJKJweNi.js => 10.BTAzlY6Z.js} | 2 +- .../_app/immutable/nodes/11.DtXtnXMl.js | 1 - .../_app/immutable/nodes/11.kE-kE_J5.js | 1 + .../_app/immutable/nodes/12.4nNpW1qS.js | 1 + .../_app/immutable/nodes/12.Cnc0Zn3x.js | 1 - .../nodes/{13.DReyzJRQ.js => 13.B0F9yHlE.js} | 2 +- .../_app/immutable/nodes/14.Cn4SQVXe.js | 1 - .../_app/immutable/nodes/14.FP7fqeji.js | 1 + .../nodes/{15.D_6PjcIl.js => 15.1LkKX8Mu.js} | 2 +- .../_app/immutable/nodes/16.Ik_X802Y.js | 1 - .../_app/immutable/nodes/16.Un1eDEkg.js | 1 + .../_app/immutable/nodes/17.BTCY_aol.js | 1 - .../_app/immutable/nodes/17.DCq-Dc1c.js | 1 + .../_app/immutable/nodes/18.MXydOOIa.js | 1 - .../_app/immutable/nodes/18.xleZqgRD.js | 1 + .../_app/immutable/nodes/19.CWBEFCxV.js | 1 + .../assets/_app/immutable/nodes/2.C24-dbK7.js | 1 + .../assets/_app/immutable/nodes/2.gx-OccLZ.js | 1 - .../_app/immutable/nodes/20.BcQWH_IW.js | 2 + .../_app/immutable/nodes/21.Nj7C5iaJ.js | 2 + .../assets/_app/immutable/nodes/3.BvdHw7b_.js | 7 - .../assets/_app/immutable/nodes/3.CcPcfE5H.js | 7 + .../assets/_app/immutable/nodes/4.CdHupLIu.js | 3 + .../assets/_app/immutable/nodes/4.D_eeR06y.js | 3 - .../assets/_app/immutable/nodes/5.BZ5sZ9vU.js | 1 + .../assets/_app/immutable/nodes/5.YDqRaTm4.js | 1 - .../assets/_app/immutable/nodes/6.CAXPtVkl.js | 1 + .../assets/_app/immutable/nodes/6.D20Gw7eV.js | 1 - .../assets/_app/immutable/nodes/7.CRLDW2c_.js | 1 + .../assets/_app/immutable/nodes/7.VnEcY_XD.js | 1 - .../assets/_app/immutable/nodes/8.D4Evg3dB.js | 1 - .../assets/_app/immutable/nodes/8.DVlwXnoT.js | 1 + .../assets/_app/immutable/nodes/9.BqnVeyTj.js | 1 - .../assets/_app/immutable/nodes/9.el4sTgm4.js | 1 + webapp/assets/_app/version.json | 2 +- webapp/assets/index.html | 22 +- webapp/package-lock.json | 454 ++- webapp/package.json | 7 + webapp/src/lib/api/client.ts | 13 + webapp/src/lib/api/generated-client.ts | 34 + .../api/generated/.openapi-generator/FILES | 4 + webapp/src/lib/api/generated/api.ts | 598 ++++ webapp/src/lib/components/ActionButton.svelte | 11 +- webapp/src/lib/components/CodeEditor.svelte | 349 +++ .../lib/components/ConfirmationModal.svelte | 74 + .../src/lib/components/CreatePoolModal.svelte | 121 +- .../lib/components/CreateScaleSetModal.svelte | 134 +- webapp/src/lib/components/DataTable.svelte | 11 +- webapp/src/lib/components/DetailHeader.svelte | 16 +- .../lib/components/InstancesSection.svelte | 2 +- webapp/src/lib/components/MobileCard.svelte | 15 +- webapp/src/lib/components/Navigation.svelte | 52 +- .../src/lib/components/UpdatePoolModal.svelte | 120 +- .../lib/components/UpdateScaleSetModal.svelte | 121 +- .../lib/components/cells/ActionsCell.svelte | 13 +- .../lib/components/cells/EntityCell.svelte | 6 +- webapp/src/lib/stores/eager-cache.ts | 59 +- webapp/src/lib/stores/theme.js | 48 + webapp/src/lib/stores/websocket.ts | 3 +- webapp/src/lib/utils/jwt.ts | 80 + webapp/src/routes/+layout.svelte | 16 +- webapp/src/routes/init/+page.svelte | 4 +- webapp/src/routes/login/+page.svelte | 4 +- webapp/src/routes/pools/[id]/+page.svelte | 14 +- webapp/src/routes/scalesets/[id]/+page.svelte | 21 +- webapp/src/routes/templates/+page.svelte | 345 +++ webapp/src/routes/templates/[id]/+page.svelte | 723 +++++ .../src/routes/templates/create/+page.svelte | 513 ++++ webapp/src/test/factories.ts | 43 +- webapp/swagger.yaml | 223 ++ workers/cache/cache.go | 36 + workers/provider/instance_manager.go | 13 +- workers/websocket/events/params.go | 3 +- 388 files changed, 52970 insertions(+), 555 deletions(-) create mode 100644 apiserver/controllers/templates.go create mode 100644 cache/controller_cache.go create mode 100644 cache/template_cache.go create mode 100644 client/templates/create_template_parameters.go create mode 100644 client/templates/create_template_responses.go create mode 100644 client/templates/delete_template_parameters.go create mode 100644 client/templates/delete_template_responses.go create mode 100644 client/templates/get_template_parameters.go create mode 100644 client/templates/get_template_responses.go create mode 100644 client/templates/list_templates_parameters.go create mode 100644 client/templates/list_templates_responses.go create mode 100644 client/templates/templates_client.go create mode 100644 client/templates/update_template_parameters.go create mode 100644 client/templates/update_template_responses.go create mode 100644 cmd/garm-cli/cmd/templates.go create mode 100644 cmd/garm-cli/editor/editor.go create mode 100644 database/sql/templates.go create mode 100644 database/sql/templates_test.go create mode 100644 internal/templates/templates.go create mode 100644 internal/templates/userdata/gitea_linux_userdata.tmpl create mode 100644 internal/templates/userdata/github_linux_userdata.tmpl create mode 100644 internal/templates/userdata/github_windows_userdata.tmpl create mode 100644 internal/templates/userdata/linux_wrapper.tmpl create mode 100644 internal/templates/userdata/windows_wrapper.tmpl create mode 100644 runner/metadata_test.go create mode 100644 runner/templates.go create mode 100644 runner/templates_test.go create mode 100644 vendor/github.com/cloudbase/garm-provider-common/cloudconfig/cloudconfig.go create mode 100644 vendor/github.com/cloudbase/garm-provider-common/cloudconfig/templates.go create mode 100644 vendor/github.com/cloudbase/garm-provider-common/cloudconfig/util.go create mode 100644 vendor/github.com/gdamore/encoding/.appveyor.yml create mode 100644 vendor/github.com/gdamore/encoding/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/gdamore/encoding/LICENSE create mode 100644 vendor/github.com/gdamore/encoding/README.md create mode 100644 vendor/github.com/gdamore/encoding/SECURITY.md create mode 100644 vendor/github.com/gdamore/encoding/ascii.go create mode 100644 vendor/github.com/gdamore/encoding/charmap.go create mode 100644 vendor/github.com/gdamore/encoding/doc.go create mode 100644 vendor/github.com/gdamore/encoding/ebcdic.go create mode 100644 vendor/github.com/gdamore/encoding/latin1.go create mode 100644 vendor/github.com/gdamore/encoding/latin5.go create mode 100644 vendor/github.com/gdamore/encoding/utf8.go create mode 100644 vendor/github.com/gdamore/tcell/v2/.gitignore create mode 100644 vendor/github.com/gdamore/tcell/v2/AUTHORS create mode 100644 vendor/github.com/gdamore/tcell/v2/CHANGESv2.md create mode 100644 vendor/github.com/gdamore/tcell/v2/LICENSE create mode 100644 vendor/github.com/gdamore/tcell/v2/README-wasm.md create mode 100644 vendor/github.com/gdamore/tcell/v2/README.md create mode 100644 vendor/github.com/gdamore/tcell/v2/SECURITY.md create mode 100644 vendor/github.com/gdamore/tcell/v2/TUTORIAL.md create mode 100644 vendor/github.com/gdamore/tcell/v2/UKRAINE.md create mode 100644 vendor/github.com/gdamore/tcell/v2/attr.go create mode 100644 vendor/github.com/gdamore/tcell/v2/cell.go create mode 100644 vendor/github.com/gdamore/tcell/v2/charset_plan9.go create mode 100644 vendor/github.com/gdamore/tcell/v2/charset_stub.go create mode 100644 vendor/github.com/gdamore/tcell/v2/charset_unix.go create mode 100644 vendor/github.com/gdamore/tcell/v2/charset_windows.go create mode 100644 vendor/github.com/gdamore/tcell/v2/color.go create mode 100644 vendor/github.com/gdamore/tcell/v2/colorfit.go create mode 100644 vendor/github.com/gdamore/tcell/v2/console_stub.go create mode 100644 vendor/github.com/gdamore/tcell/v2/console_win.go create mode 100644 vendor/github.com/gdamore/tcell/v2/doc.go create mode 100644 vendor/github.com/gdamore/tcell/v2/encoding.go create mode 100644 vendor/github.com/gdamore/tcell/v2/errors.go create mode 100644 vendor/github.com/gdamore/tcell/v2/event.go create mode 100644 vendor/github.com/gdamore/tcell/v2/focus.go create mode 100644 vendor/github.com/gdamore/tcell/v2/interrupt.go create mode 100644 vendor/github.com/gdamore/tcell/v2/key.go create mode 100644 vendor/github.com/gdamore/tcell/v2/mouse.go create mode 100644 vendor/github.com/gdamore/tcell/v2/nonblock_bsd.go create mode 100644 vendor/github.com/gdamore/tcell/v2/nonblock_unix.go create mode 100644 vendor/github.com/gdamore/tcell/v2/paste.go create mode 100644 vendor/github.com/gdamore/tcell/v2/resize.go create mode 100644 vendor/github.com/gdamore/tcell/v2/runes.go create mode 100644 vendor/github.com/gdamore/tcell/v2/screen.go create mode 100644 vendor/github.com/gdamore/tcell/v2/simulation.go create mode 100644 vendor/github.com/gdamore/tcell/v2/stdin_unix.go create mode 100644 vendor/github.com/gdamore/tcell/v2/style.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/.gitignore create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/README.md create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/TERMINALS.md create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/a/aixterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/direct.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/a/ansi/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/b/beterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/base/base.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/c/cygwin/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/d/dtterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/dynamic/dynamic.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/e/emacs/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/extended/extended.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/g/gnome/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/gen.sh create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/h/hpterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/k/konsole/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/k/kterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/l/linux/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/models.txt create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/p/pcansi/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/r/rxvt/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/s/screen/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/s/simpleterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/s/sun/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/v/vt100/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/v/vt102/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/v/vt220/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/v/vt320/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/v/vt400/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/v/vt420/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/v/vt52/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/w/wy50/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/w/wy60/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/w/wy99_ansi/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/x/xfce/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/direct.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_ghostty/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty/term.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terms_default.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terms_dynamic.go create mode 100644 vendor/github.com/gdamore/tcell/v2/terms_static.go create mode 100644 vendor/github.com/gdamore/tcell/v2/tscreen.go create mode 100644 vendor/github.com/gdamore/tcell/v2/tscreen_plan9.go create mode 100644 vendor/github.com/gdamore/tcell/v2/tscreen_stub.go create mode 100644 vendor/github.com/gdamore/tcell/v2/tscreen_unix.go create mode 100644 vendor/github.com/gdamore/tcell/v2/tty.go create mode 100644 vendor/github.com/gdamore/tcell/v2/tty_plan9.go create mode 100644 vendor/github.com/gdamore/tcell/v2/tty_unix.go create mode 100644 vendor/github.com/gdamore/tcell/v2/wscreen.go create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/.gitignore create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/CHANGELOG.md create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/LICENSE create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/README.md create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/colorgens.go create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/colors.go create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/happy_palettegen.go create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/hexcolor.go create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/hsluv-snapshot-rev4.json create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/hsluv.go create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/soft_palettegen.go create mode 100644 vendor/github.com/lucasb-eyer/go-colorful/warm_palettegen.go create mode 100644 vendor/github.com/rivo/tview/CONTRIBUTING.md create mode 100644 vendor/github.com/rivo/tview/LICENSE.txt create mode 100644 vendor/github.com/rivo/tview/README.md create mode 100644 vendor/github.com/rivo/tview/ansi.go create mode 100644 vendor/github.com/rivo/tview/application.go create mode 100644 vendor/github.com/rivo/tview/borders.go create mode 100644 vendor/github.com/rivo/tview/box.go create mode 100644 vendor/github.com/rivo/tview/button.go create mode 100644 vendor/github.com/rivo/tview/checkbox.go create mode 100644 vendor/github.com/rivo/tview/doc.go create mode 100644 vendor/github.com/rivo/tview/dropdown.go create mode 100644 vendor/github.com/rivo/tview/flex.go create mode 100644 vendor/github.com/rivo/tview/form.go create mode 100644 vendor/github.com/rivo/tview/frame.go create mode 100644 vendor/github.com/rivo/tview/grid.go create mode 100644 vendor/github.com/rivo/tview/image.go create mode 100644 vendor/github.com/rivo/tview/inputfield.go create mode 100644 vendor/github.com/rivo/tview/list.go create mode 100644 vendor/github.com/rivo/tview/modal.go create mode 100644 vendor/github.com/rivo/tview/pages.go create mode 100644 vendor/github.com/rivo/tview/primitive.go create mode 100644 vendor/github.com/rivo/tview/semigraphics.go create mode 100644 vendor/github.com/rivo/tview/strings.go create mode 100644 vendor/github.com/rivo/tview/styles.go create mode 100644 vendor/github.com/rivo/tview/table.go create mode 100644 vendor/github.com/rivo/tview/textarea.go create mode 100644 vendor/github.com/rivo/tview/textview.go create mode 100644 vendor/github.com/rivo/tview/treeview.go create mode 100644 vendor/github.com/rivo/tview/tview.gif create mode 100644 vendor/github.com/rivo/tview/util.go create mode 100644 vendor/golang.org/x/sys/plan9/asm.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_386.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_arm.s create mode 100644 vendor/golang.org/x/sys/plan9/const_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/dir_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/env_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/errors_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/mkall.sh create mode 100644 vendor/golang.org/x/sys/plan9/mkerrors.sh create mode 100644 vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh create mode 100644 vendor/golang.org/x/sys/plan9/pwd_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/race.go create mode 100644 vendor/golang.org/x/sys/plan9/race0.go create mode 100644 vendor/golang.org/x/sys/plan9/str.go create mode 100644 vendor/golang.org/x/sys/plan9/syscall.go create mode 100644 vendor/golang.org/x/sys/plan9/syscall_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go create mode 100644 vendor/golang.org/x/sys/plan9/zsysnum_plan9.go create mode 100644 vendor/golang.org/x/term/CONTRIBUTING.md create mode 100644 vendor/golang.org/x/term/LICENSE create mode 100644 vendor/golang.org/x/term/PATENTS create mode 100644 vendor/golang.org/x/term/README.md create mode 100644 vendor/golang.org/x/term/codereview.cfg create mode 100644 vendor/golang.org/x/term/term.go create mode 100644 vendor/golang.org/x/term/term_plan9.go create mode 100644 vendor/golang.org/x/term/term_unix.go create mode 100644 vendor/golang.org/x/term/term_unix_bsd.go create mode 100644 vendor/golang.org/x/term/term_unix_other.go create mode 100644 vendor/golang.org/x/term/term_unsupported.go create mode 100644 vendor/golang.org/x/term/term_windows.go create mode 100644 vendor/golang.org/x/term/terminal.go create mode 100644 vendor/golang.org/x/text/encoding/encoding.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/identifier.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/mib.go create mode 100644 webapp/assets/_app/immutable/assets/0.CP-xI7De.css delete mode 100644 webapp/assets/_app/immutable/assets/0.pWW488Rd.css create mode 100644 webapp/assets/_app/immutable/assets/_layout.CP-xI7De.css delete mode 100644 webapp/assets/_app/immutable/assets/_layout.pWW488Rd.css delete mode 100644 webapp/assets/_app/immutable/chunks/-esynYXT.js create mode 100644 webapp/assets/_app/immutable/chunks/2Xl6sR6s.js create mode 100644 webapp/assets/_app/immutable/chunks/41x1-UqF.js rename webapp/assets/_app/immutable/chunks/{BXdh0O4_.js => 91PQ6UtW.js} (54%) create mode 100644 webapp/assets/_app/immutable/chunks/B-_QCM7E.js delete mode 100644 webapp/assets/_app/immutable/chunks/B0Y2gXDu.js rename webapp/assets/_app/immutable/chunks/{DxLDbRe7.js => B1V2wE0x.js} (77%) delete mode 100644 webapp/assets/_app/immutable/chunks/B1coRVG4.js delete mode 100644 webapp/assets/_app/immutable/chunks/B27KefbC.js delete mode 100644 webapp/assets/_app/immutable/chunks/B3a35v7J.js delete mode 100644 webapp/assets/_app/immutable/chunks/BAnDfGwP.js create mode 100644 webapp/assets/_app/immutable/chunks/BM4Azg_w.js delete mode 100644 webapp/assets/_app/immutable/chunks/BMHtEUeX.js delete mode 100644 webapp/assets/_app/immutable/chunks/BQabvZPm.js create mode 100644 webapp/assets/_app/immutable/chunks/BUaPampd.js create mode 100644 webapp/assets/_app/immutable/chunks/BV_mDmfH.js rename webapp/assets/_app/immutable/chunks/{D9uxtZe_.js => BVyy60Ai.js} (97%) create mode 100644 webapp/assets/_app/immutable/chunks/BZ2WxPPD.js delete mode 100644 webapp/assets/_app/immutable/chunks/Bc0BXFmi.js create mode 100644 webapp/assets/_app/immutable/chunks/BgSaD1r_.js rename webapp/assets/_app/immutable/chunks/{D6DjlyIQ.js => Bgbd8SZ5.js} (90%) create mode 100644 webapp/assets/_app/immutable/chunks/Bo3f8OIz.js delete mode 100644 webapp/assets/_app/immutable/chunks/BxQMwFca.js create mode 100644 webapp/assets/_app/immutable/chunks/C2rI8IaC.js delete mode 100644 webapp/assets/_app/immutable/chunks/C73ZVvpW.js rename webapp/assets/_app/immutable/chunks/{0HF0aP0D.js => C7KJ549w.js} (60%) rename webapp/assets/_app/immutable/chunks/{DT0EGONV.js => C7KraPli.js} (71%) create mode 100644 webapp/assets/_app/immutable/chunks/C98nByjP.js create mode 100644 webapp/assets/_app/immutable/chunks/CCFUzH5i.js create mode 100644 webapp/assets/_app/immutable/chunks/CPFytHjx.js delete mode 100644 webapp/assets/_app/immutable/chunks/CRKWEg6v.js rename webapp/assets/_app/immutable/chunks/{Dkb9lSSG.js => CTvJf3dP.js} (94%) create mode 100644 webapp/assets/_app/immutable/chunks/CYqkNFLz.js delete mode 100644 webapp/assets/_app/immutable/chunks/CiGy614T.js create mode 100644 webapp/assets/_app/immutable/chunks/CiWDXYQd.js create mode 100644 webapp/assets/_app/immutable/chunks/Cqnw7O8j.js delete mode 100644 webapp/assets/_app/immutable/chunks/CrNwrvNH.js create mode 100644 webapp/assets/_app/immutable/chunks/Cwu7L3Xf.js rename webapp/assets/_app/immutable/chunks/{DJsbLMno.js => D6f8Dk7c.js} (52%) rename webapp/assets/_app/immutable/chunks/{D0m048VH.js => D7e9zx6w.js} (69%) delete mode 100644 webapp/assets/_app/immutable/chunks/DF8ZTWYj.js delete mode 100644 webapp/assets/_app/immutable/chunks/DJ6ZD3Tj.js rename webapp/assets/_app/immutable/chunks/{c_t0vA9G.js => DJsB5Z5V.js} (89%) create mode 100644 webapp/assets/_app/immutable/chunks/DPR9Z_fe.js rename webapp/assets/_app/immutable/chunks/{B0m3rqSR.js => DVsSf1wv.js} (71%) delete mode 100644 webapp/assets/_app/immutable/chunks/Ddit_D7n.js delete mode 100644 webapp/assets/_app/immutable/chunks/Djd10kRn.js create mode 100644 webapp/assets/_app/immutable/chunks/DliFOxtc.js create mode 100644 webapp/assets/_app/immutable/chunks/DqFqoVWr.js create mode 100644 webapp/assets/_app/immutable/chunks/DqbUkQgD.js create mode 100644 webapp/assets/_app/immutable/chunks/Du50aAe5.js create mode 100644 webapp/assets/_app/immutable/chunks/JUkrBp3F.js create mode 100644 webapp/assets/_app/immutable/chunks/R3ADTHgb.js create mode 100644 webapp/assets/_app/immutable/chunks/U3V4g_hv.js create mode 100644 webapp/assets/_app/immutable/chunks/WI-og7-I.js delete mode 100644 webapp/assets/_app/immutable/chunks/b5SBTec5.js create mode 100644 webapp/assets/_app/immutable/chunks/cPTQ2Ibn.js delete mode 100644 webapp/assets/_app/immutable/chunks/e1m7WRO5.js create mode 100644 webapp/assets/_app/immutable/chunks/oOdVuDuv.js delete mode 100644 webapp/assets/_app/immutable/chunks/xe-4nY5o.js create mode 100644 webapp/assets/_app/immutable/entry/app.B4u5nxVj.js delete mode 100644 webapp/assets/_app/immutable/entry/app.Cfl2QgNR.js create mode 100644 webapp/assets/_app/immutable/entry/start.-FfRLqKC.js delete mode 100644 webapp/assets/_app/immutable/entry/start.DNVtGLiy.js create mode 100644 webapp/assets/_app/immutable/nodes/0.DYP5Tzsv.js delete mode 100644 webapp/assets/_app/immutable/nodes/0.W3yf06lM.js create mode 100644 webapp/assets/_app/immutable/nodes/1.BQyKnLFk.js delete mode 100644 webapp/assets/_app/immutable/nodes/1.R-OM_0cI.js rename webapp/assets/_app/immutable/nodes/{10.DJKJweNi.js => 10.BTAzlY6Z.js} (80%) delete mode 100644 webapp/assets/_app/immutable/nodes/11.DtXtnXMl.js create mode 100644 webapp/assets/_app/immutable/nodes/11.kE-kE_J5.js create mode 100644 webapp/assets/_app/immutable/nodes/12.4nNpW1qS.js delete mode 100644 webapp/assets/_app/immutable/nodes/12.Cnc0Zn3x.js rename webapp/assets/_app/immutable/nodes/{13.DReyzJRQ.js => 13.B0F9yHlE.js} (83%) delete mode 100644 webapp/assets/_app/immutable/nodes/14.Cn4SQVXe.js create mode 100644 webapp/assets/_app/immutable/nodes/14.FP7fqeji.js rename webapp/assets/_app/immutable/nodes/{15.D_6PjcIl.js => 15.1LkKX8Mu.js} (80%) delete mode 100644 webapp/assets/_app/immutable/nodes/16.Ik_X802Y.js create mode 100644 webapp/assets/_app/immutable/nodes/16.Un1eDEkg.js delete mode 100644 webapp/assets/_app/immutable/nodes/17.BTCY_aol.js create mode 100644 webapp/assets/_app/immutable/nodes/17.DCq-Dc1c.js delete mode 100644 webapp/assets/_app/immutable/nodes/18.MXydOOIa.js create mode 100644 webapp/assets/_app/immutable/nodes/18.xleZqgRD.js create mode 100644 webapp/assets/_app/immutable/nodes/19.CWBEFCxV.js create mode 100644 webapp/assets/_app/immutable/nodes/2.C24-dbK7.js delete mode 100644 webapp/assets/_app/immutable/nodes/2.gx-OccLZ.js create mode 100644 webapp/assets/_app/immutable/nodes/20.BcQWH_IW.js create mode 100644 webapp/assets/_app/immutable/nodes/21.Nj7C5iaJ.js delete mode 100644 webapp/assets/_app/immutable/nodes/3.BvdHw7b_.js create mode 100644 webapp/assets/_app/immutable/nodes/3.CcPcfE5H.js create mode 100644 webapp/assets/_app/immutable/nodes/4.CdHupLIu.js delete mode 100644 webapp/assets/_app/immutable/nodes/4.D_eeR06y.js create mode 100644 webapp/assets/_app/immutable/nodes/5.BZ5sZ9vU.js delete mode 100644 webapp/assets/_app/immutable/nodes/5.YDqRaTm4.js create mode 100644 webapp/assets/_app/immutable/nodes/6.CAXPtVkl.js delete mode 100644 webapp/assets/_app/immutable/nodes/6.D20Gw7eV.js create mode 100644 webapp/assets/_app/immutable/nodes/7.CRLDW2c_.js delete mode 100644 webapp/assets/_app/immutable/nodes/7.VnEcY_XD.js delete mode 100644 webapp/assets/_app/immutable/nodes/8.D4Evg3dB.js create mode 100644 webapp/assets/_app/immutable/nodes/8.DVlwXnoT.js delete mode 100644 webapp/assets/_app/immutable/nodes/9.BqnVeyTj.js create mode 100644 webapp/assets/_app/immutable/nodes/9.el4sTgm4.js create mode 100644 webapp/src/lib/components/CodeEditor.svelte create mode 100644 webapp/src/lib/components/ConfirmationModal.svelte create mode 100644 webapp/src/lib/stores/theme.js create mode 100644 webapp/src/lib/utils/jwt.ts create mode 100644 webapp/src/routes/templates/+page.svelte create mode 100644 webapp/src/routes/templates/[id]/+page.svelte create mode 100644 webapp/src/routes/templates/create/+page.svelte diff --git a/apiserver/controllers/metadata.go b/apiserver/controllers/metadata.go index 4b112b17..eb42344e 100644 --- a/apiserver/controllers/metadata.go +++ b/apiserver/controllers/metadata.go @@ -123,3 +123,20 @@ func (a *APIController) RootCertificateBundleHandler(w http.ResponseWriter, r *h slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response") } } + +func (a *APIController) RunnerInstallScriptHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + installScript, err := a.r.GetRunnerInstallScript(ctx) + if err != nil { + slog.InfoContext(ctx, "failed to get runner install template", "error", err) + handleError(ctx, w, err) + return + } + + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + if _, err := w.Write(installScript); err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response") + } +} diff --git a/apiserver/controllers/templates.go b/apiserver/controllers/templates.go new file mode 100644 index 00000000..091e97f7 --- /dev/null +++ b/apiserver/controllers/templates.go @@ -0,0 +1,259 @@ +// Copyright 2025 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package controllers + +import ( + "encoding/json" + "log/slog" + "math" + "net/http" + "strconv" + + "github.com/gorilla/mux" + + gErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" + runnerParams "github.com/cloudbase/garm/params" +) + +// swagger:route GET /templates templates ListTemplates +// +// List templates. +// +// Parameters: +// + name: osType +// description: OS type of the templates. +// type: string +// in: query +// required: false +// +// + name: partialName +// description: Partial or full name of the template. +// type: string +// in: query +// required: false +// +// + name: forgeType +// description: Forge type of the templates. +// type: string +// in: query +// required: false +// +// Responses: +// 200: Templates +// default: APIErrorResponse +func (a *APIController) ListTemplatesHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var partialName *string + var osType *commonParams.OSType + var forgeType *runnerParams.EndpointType + + queryName := r.URL.Query().Get("partialName") + queryOSType := r.URL.Query().Get("osType") + queryForgeType := r.URL.Query().Get("forgeType") + if queryName != "" { + partialName = &queryName + } + if queryOSType != "" { + asOsType := commonParams.OSType(queryOSType) + osType = &asOsType + } + + if queryForgeType != "" { + asForgeType := runnerParams.EndpointType(queryForgeType) + forgeType = &asForgeType + } + + templates, err := a.r.ListTemplates(ctx, osType, forgeType, partialName) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "listing templates") + handleError(ctx, w, err) + return + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(templates); err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response") + } +} + +// swagger:route GET /templates/{templateID} templates GetTemplate +// +// Get template by ID. +// +// Parameters: +// + name: templateID +// description: ID of the template to fetch. +// type: number +// in: path +// required: true +// +// Responses: +// 200: Template +// default: APIErrorResponse +func (a *APIController) GetTemplateHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + vars := mux.Vars(r) + templateID, err := getValueFromVarsAsUint(vars, "templateID") + if err != nil { + handleError(ctx, w, err) + return + } + template, err := a.r.GetTemplate(ctx, templateID) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "fetching template") + handleError(ctx, w, err) + return + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(template); err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response") + } +} + +// swagger:route DELETE /templates/{templateID} templates DeleteTemplate +// +// Get template by ID. +// +// Parameters: +// + name: templateID +// description: ID of the template to delete. +// type: number +// in: path +// required: true +// +// Responses: +// default: APIErrorResponse +func (a *APIController) DeleteTemplateHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + vars := mux.Vars(r) + templateID, err := getValueFromVarsAsUint(vars, "templateID") + if err != nil { + handleError(ctx, w, err) + return + } + if err := a.r.DeleteTemplate(ctx, templateID); err != nil { + handleError(ctx, w, err) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) +} + +// swagger:route POST /templates templates CreateTemplate +// +// Create template with the parameters given. +// +// Parameters: +// + name: Body +// description: Parameters used when creating the template. +// type: CreateTemplateParams +// in: body +// required: true +// +// Responses: +// 200: Template +// default: APIErrorResponse +func (a *APIController) CreateTemplateHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var templateData runnerParams.CreateTemplateParams + if err := json.NewDecoder(r.Body).Decode(&templateData); err != nil { + handleError(ctx, w, gErrors.ErrBadRequest) + return + } + + template, err := a.r.CreateTemplate(ctx, templateData) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "error creating template") + handleError(ctx, w, err) + return + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(template); err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response") + } +} + +// swagger:route PUT /templates/{templateID} templates UpdateTemplate +// +// Update template with the parameters given. +// +// Parameters: +// + name: templateID +// description: ID of the template to update. +// type: string +// in: path +// required: true +// +// + name: Body +// description: Parameters used when updating the template. +// type: UpdateTemplateParams +// in: body +// required: true +// +// Responses: +// 200: Template +// default: APIErrorResponse +func (a *APIController) UpdateTemplateHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + vars := mux.Vars(r) + templateID, err := getValueFromVarsAsUint(vars, "templateID") + if err != nil { + handleError(ctx, w, err) + return + } + + var updatePayload runnerParams.UpdateTemplateParams + if err := json.NewDecoder(r.Body).Decode(&updatePayload); err != nil { + handleError(ctx, w, gErrors.ErrBadRequest) + return + } + + template, err := a.r.UpdateTemplate(ctx, templateID, updatePayload) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "error updating template") + handleError(ctx, w, err) + return + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(template); err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response") + } +} + +func getValueFromVarsAsUint(vars map[string]string, key string) (uint, error) { + ret, ok := vars[key] + if !ok { + return 0, gErrors.NewBadRequestError("no %s specified", key) + } + asUint, err := strconv.ParseUint(ret, 10, 64) + if err != nil { + return 0, gErrors.NewBadRequestError("invalid value for %q: %q", key, ret) + } + + if asUint > math.MaxUint { + return 0, gErrors.NewBadRequestError("%s is larger than allowed size for an unsigned int", key) + } + return uint(asUint), nil +} diff --git a/apiserver/routers/routers.go b/apiserver/routers/routers.go index ff241165..b3fdf850 100644 --- a/apiserver/routers/routers.go +++ b/apiserver/routers/routers.go @@ -172,7 +172,9 @@ func NewAPIRouter(han *controllers.APIController, authMiddleware, initMiddleware metadataRouter.Handle("/systemd/unit-file", http.HandlerFunc(han.SystemdUnitFileHandler)).Methods("GET", "OPTIONS") metadataRouter.Handle("/system/cert-bundle/", http.HandlerFunc(han.RootCertificateBundleHandler)).Methods("GET", "OPTIONS") metadataRouter.Handle("/system/cert-bundle", http.HandlerFunc(han.RootCertificateBundleHandler)).Methods("GET", "OPTIONS") - + // install script + metadataRouter.Handle("/install-script/", http.HandlerFunc(han.RunnerInstallScriptHandler)).Methods("GET", "OPTIONS") + metadataRouter.Handle("/install-script", http.HandlerFunc(han.RunnerInstallScriptHandler)).Methods("GET", "OPTIONS") // Login authRouter := apiSubRouter.PathPrefix("/auth").Subrouter() authRouter.Handle("/{login:login\\/?}", http.HandlerFunc(han.LoginHandler)).Methods("POST", "OPTIONS") @@ -518,6 +520,24 @@ func NewAPIRouter(han *controllers.APIController, authMiddleware, initMiddleware apiRouter.Handle("/gitea/credentials/{id}/", http.HandlerFunc(han.UpdateGiteaCredential)).Methods("PUT", "OPTIONS") apiRouter.Handle("/gitea/credentials/{id}", http.HandlerFunc(han.UpdateGiteaCredential)).Methods("PUT", "OPTIONS") + /////////////// + // Templates // + /////////////// + apiRouter.Handle("/templates/", http.HandlerFunc(han.ListTemplatesHandler)).Methods("GET", "OPTIONS") + apiRouter.Handle("/templates", http.HandlerFunc(han.ListTemplatesHandler)).Methods("GET", "OPTIONS") + // Create template + apiRouter.Handle("/templates/", http.HandlerFunc(han.CreateTemplateHandler)).Methods("POST", "OPTIONS") + apiRouter.Handle("/templates", http.HandlerFunc(han.CreateTemplateHandler)).Methods("POST", "OPTIONS") + // Get template + apiRouter.Handle("/templates/{templateID}/", http.HandlerFunc(han.GetTemplateHandler)).Methods("GET", "OPTIONS") + apiRouter.Handle("/templates/{templateID}", http.HandlerFunc(han.GetTemplateHandler)).Methods("GET", "OPTIONS") + // Delete Gitea Credential + apiRouter.Handle("/templates/{templateID}/", http.HandlerFunc(han.DeleteTemplateHandler)).Methods("DELETE", "OPTIONS") + apiRouter.Handle("/templates/{templateID}", http.HandlerFunc(han.DeleteTemplateHandler)).Methods("DELETE", "OPTIONS") + // Update template + apiRouter.Handle("/templates/{templateID}/", http.HandlerFunc(han.UpdateTemplateHandler)).Methods("PUT", "OPTIONS") + apiRouter.Handle("/templates/{templateID}", http.HandlerFunc(han.UpdateTemplateHandler)).Methods("PUT", "OPTIONS") + ///////////////////////// // Websocket endpoints // ///////////////////////// diff --git a/apiserver/swagger-models.yaml b/apiserver/swagger-models.yaml index 74eaac84..e3b4b76f 100644 --- a/apiserver/swagger-models.yaml +++ b/apiserver/swagger-models.yaml @@ -59,7 +59,7 @@ definitions: alias: garm_params items: $ref: '#/definitions/Job' - Job: + Job: type: object x-go-type: type: Job @@ -343,3 +343,33 @@ definitions: import: package: github.com/cloudbase/garm/params alias: garm_params + UpdateTemplateParams: + type: object + x-go-type: + type: UpdateTemplateParams + import: + package: github.com/cloudbase/garm/params + alias: garm_params + CreateTemplateParams: + type: object + x-go-type: + type: CreateTemplateParams + import: + package: github.com/cloudbase/garm/params + alias: garm_params + Template: + type: object + x-go-type: + type: Template + import: + package: github.com/cloudbase/garm/params + alias: garm_params + Templates: + type: array + x-go-type: + type: Templates + import: + package: github.com/cloudbase/garm/params + alias: garm_params + items: + $ref: '#/definitions/Template' diff --git a/apiserver/swagger.yaml b/apiserver/swagger.yaml index bf02a2d7..a2e317c9 100644 --- a/apiserver/swagger.yaml +++ b/apiserver/swagger.yaml @@ -86,6 +86,13 @@ definitions: alias: garm_params package: github.com/cloudbase/garm/params type: CreateScaleSetParams + CreateTemplateParams: + type: object + x-go-type: + import: + alias: garm_params + package: github.com/cloudbase/garm/params + type: CreateTemplateParams Credentials: items: $ref: '#/definitions/ForgeCredentials' @@ -281,6 +288,22 @@ definitions: alias: garm_params package: github.com/cloudbase/garm/params type: ScaleSets + Template: + type: object + x-go-type: + import: + alias: garm_params + package: github.com/cloudbase/garm/params + type: Template + Templates: + items: + $ref: '#/definitions/Template' + type: array + x-go-type: + import: + alias: garm_params + package: github.com/cloudbase/garm/params + type: Templates UpdateControllerParams: type: object x-go-type: @@ -337,6 +360,13 @@ definitions: alias: garm_params package: github.com/cloudbase/garm/params type: UpdateScaleSetParams + UpdateTemplateParams: + type: object + x-go-type: + import: + alias: garm_params + package: github.com/cloudbase/garm/params + type: UpdateTemplateParams User: type: object x-go-type: @@ -2267,6 +2297,122 @@ paths: summary: List runner instances in a scale set. tags: - instances + /templates: + get: + operationId: ListTemplates + parameters: + - description: OS type of the templates. + in: query + name: osType + type: string + - description: Partial or full name of the template. + in: query + name: partialName + type: string + - description: Forge type of the templates. + in: query + name: forgeType + type: string + responses: + "200": + description: Templates + schema: + $ref: '#/definitions/Templates' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: List templates. + tags: + - templates + post: + operationId: CreateTemplate + parameters: + - description: Parameters used when creating the template. + in: body + name: Body + required: true + schema: + $ref: '#/definitions/CreateTemplateParams' + description: Parameters used when creating the template. + type: object + responses: + "200": + description: Template + schema: + $ref: '#/definitions/Template' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Create template with the parameters given. + tags: + - templates + /templates/{templateID}: + delete: + operationId: DeleteTemplate + parameters: + - description: ID of the template to delete. + in: path + name: templateID + required: true + type: number + responses: + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Get template by ID. + tags: + - templates + get: + operationId: GetTemplate + parameters: + - description: ID of the template to fetch. + in: path + name: templateID + required: true + type: number + responses: + "200": + description: Template + schema: + $ref: '#/definitions/Template' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Get template by ID. + tags: + - templates + put: + operationId: UpdateTemplate + parameters: + - description: ID of the template to update. + in: path + name: templateID + required: true + type: string + - description: Parameters used when updating the template. + in: body + name: Body + required: true + schema: + $ref: '#/definitions/UpdateTemplateParams' + description: Parameters used when updating the template. + type: object + responses: + "200": + description: Template + schema: + $ref: '#/definitions/Template' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Update template with the parameters given. + tags: + - templates produces: - application/json security: diff --git a/auth/context.go b/auth/context.go index 90fa9a7b..81bb7564 100644 --- a/auth/context.go +++ b/auth/context.go @@ -41,6 +41,7 @@ const ( instanceEntityKey contextFlags = "entity" instanceRunnerStatus contextFlags = "status" instanceTokenFetched contextFlags = "tokenFetched" + instanceAuthToken contextFlags = "instanceAuthToken" instanceHasJITConfig contextFlags = "hasJITConfig" instanceParams contextFlags = "instanceParams" instanceForgeTypeKey contextFlags = "forge_type" @@ -159,19 +160,31 @@ func InstancePoolType(ctx context.Context) string { return elem.(string) } -func SetInstanceEntity(ctx context.Context, val string) context.Context { +func SetInstanceEntity(ctx context.Context, val params.ForgeEntity) context.Context { return context.WithValue(ctx, instanceEntityKey, val) } -func InstanceEntity(ctx context.Context) string { +func InstanceEntity(ctx context.Context) (params.ForgeEntity, error) { elem := ctx.Value(instanceEntityKey) if elem == nil { - return "" + return params.ForgeEntity{}, runnerErrors.ErrNotFound } - return elem.(string) + return elem.(params.ForgeEntity), nil } -func PopulateInstanceContext(ctx context.Context, instance params.Instance, claims *InstanceJWTClaims) context.Context { +func SetInstanceAuthToken(ctx context.Context, token string) context.Context { + return context.WithValue(ctx, instanceAuthToken, token) +} + +func InstanceAuthToken(ctx context.Context) (string, error) { + elem := ctx.Value(instanceAuthToken) + if elem == nil { + return "", runnerErrors.ErrUnauthorized + } + return elem.(string), nil +} + +func PopulateInstanceContext(ctx context.Context, instance params.Instance, entity params.ForgeEntity, claims *InstanceJWTClaims) context.Context { ctx = SetInstanceID(ctx, instance.ID) ctx = SetInstanceName(ctx, instance.Name) ctx = SetInstancePoolID(ctx, instance.PoolID) @@ -180,6 +193,7 @@ func PopulateInstanceContext(ctx context.Context, instance params.Instance, clai ctx = SetInstanceHasJITConfig(ctx, instance.JitConfiguration) ctx = SetInstanceParams(ctx, instance) ctx = SetInstanceForgeType(ctx, claims.ForgeType) + ctx = SetInstanceEntity(ctx, entity) return ctx } diff --git a/auth/instance_middleware.go b/auth/instance_middleware.go index 315558a2..887e3e39 100644 --- a/auth/instance_middleware.go +++ b/auth/instance_middleware.go @@ -16,6 +16,7 @@ package auth import ( "context" + "errors" "fmt" "log/slog" "math" @@ -111,21 +112,67 @@ func NewInstanceMiddleware(store dbCommon.Store, cfg config.JWTAuth) (Middleware }, nil } +func (amw *instanceMiddleware) getForgeEntityFromInstance(ctx context.Context, instance params.Instance) (params.ForgeEntity, error) { + var entityGetter params.EntityGetter + var err error + switch { + case instance.PoolID != "": + entityGetter, err = amw.store.GetPoolByID(ctx, instance.PoolID) + case instance.ScaleSetID != 0: + entityGetter, err = amw.store.GetScaleSetByID(ctx, instance.ScaleSetID) + default: + return params.ForgeEntity{}, errors.New("instance not associated with a pool or scale set") + } + + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext( + ctx, "failed to get entity getter", + "instance", instance.Name) + return params.ForgeEntity{}, fmt.Errorf("error fetching entity getter: %w", err) + } + + poolEntity, err := entityGetter.GetEntity() + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext( + ctx, "failed to get entity", + "instance", instance.Name) + return params.ForgeEntity{}, fmt.Errorf("error fetching entity: %w", err) + } + + entity, err := amw.store.GetForgeEntity(ctx, poolEntity.EntityType, poolEntity.ID) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext( + ctx, "failed to get entity", + "instance", instance.Name) + return params.ForgeEntity{}, fmt.Errorf("error fetching entity: %w", err) + } + return entity, nil +} + func (amw *instanceMiddleware) claimsToContext(ctx context.Context, claims *InstanceJWTClaims) (context.Context, error) { if claims == nil { + slog.InfoContext(ctx, "no claims for instance") return ctx, runnerErrors.ErrUnauthorized } if claims.Name == "" { + slog.ErrorContext(ctx, "no name in calaims") return nil, runnerErrors.ErrUnauthorized } instanceInfo, err := amw.store.GetInstance(ctx, claims.Name) if err != nil { + slog.ErrorContext(ctx, "failed to get instance", "error", err) return ctx, runnerErrors.ErrUnauthorized } - ctx = PopulateInstanceContext(ctx, instanceInfo, claims) + entity, err := amw.getForgeEntityFromInstance(ctx, instanceInfo) + if err != nil { + slog.ErrorContext(ctx, "failed to get entity from instance", "error", err) + return ctx, runnerErrors.ErrUnauthorized + } + + ctx = PopulateInstanceContext(ctx, instanceInfo, entity, claims) return ctx, nil } @@ -169,6 +216,7 @@ func (amw *instanceMiddleware) Middleware(next http.Handler) http.Handler { invalidAuthResponse(ctx, w) return } + ctx = SetInstanceAuthToken(ctx, bearerToken[1]) if InstanceID(ctx) == "" { invalidAuthResponse(ctx, w) diff --git a/cache/controller_cache.go b/cache/controller_cache.go new file mode 100644 index 00000000..cfabdd89 --- /dev/null +++ b/cache/controller_cache.go @@ -0,0 +1,42 @@ +package cache + +import ( + "sync" + + "github.com/cloudbase/garm/params" +) + +var garmControllerCache *ControllerCache + +func init() { + ctrlCache := &ControllerCache{} + garmControllerCache = ctrlCache +} + +type ControllerCache struct { + controllerInfo params.ControllerInfo + + mux sync.Mutex +} + +func (c *ControllerCache) SetControllerCache(ctrl params.ControllerInfo) { + c.mux.Lock() + defer c.mux.Unlock() + + c.controllerInfo = ctrl +} + +func (c *ControllerCache) ControllerInfo() params.ControllerInfo { + c.mux.Lock() + defer c.mux.Unlock() + + return c.controllerInfo +} + +func ControllerInfo() params.ControllerInfo { + return garmControllerCache.ControllerInfo() +} + +func SetControllerCache(ctrl params.ControllerInfo) { + garmControllerCache.SetControllerCache(ctrl) +} diff --git a/cache/template_cache.go b/cache/template_cache.go new file mode 100644 index 00000000..9ea67819 --- /dev/null +++ b/cache/template_cache.go @@ -0,0 +1,79 @@ +package cache + +import ( + "sync" + + commonParams "github.com/cloudbase/garm-provider-common/params" + "github.com/cloudbase/garm/params" +) + +var templateCache *TemplateCache + +func init() { + tplCache := &TemplateCache{ + cache: make(map[uint]params.Template), + } + templateCache = tplCache +} + +type TemplateCache struct { + mux sync.Mutex + + cache map[uint]params.Template +} + +func (t *TemplateCache) SetTemplateCache(tpl params.Template) { + t.mux.Lock() + defer t.mux.Unlock() + + t.cache[tpl.ID] = tpl +} + +func (t *TemplateCache) GetTemplate(id uint) (params.Template, bool) { + t.mux.Lock() + defer t.mux.Unlock() + + tpl, ok := t.cache[id] + if !ok { + return params.Template{}, false + } + + return tpl, true +} + +func (t *TemplateCache) ListTemplates(osType *commonParams.OSType, forgeType *params.EndpointType) []params.Template { + ret := []params.Template{} + for _, val := range t.cache { + if osType != nil && val.OSType != *osType { + continue + } + if forgeType != nil && val.ForgeType != *forgeType { + continue + } + ret = append(ret, val) + } + return ret +} + +func (t *TemplateCache) DeleteTemplate(id uint) { + t.mux.Lock() + defer t.mux.Unlock() + + delete(t.cache, id) +} + +func SetTemplateCache(tpl params.Template) { + templateCache.SetTemplateCache(tpl) +} + +func GetTemplate(id uint) (params.Template, bool) { + return templateCache.GetTemplate(id) +} + +func ListTemplates(osType *commonParams.OSType, forgeType *params.EndpointType) []params.Template { + return templateCache.ListTemplates(osType, forgeType) +} + +func DeleteTemplate(id uint) { + templateCache.DeleteTemplate(id) +} diff --git a/client/garm_api_client.go b/client/garm_api_client.go index f5bc51b2..f6f833b7 100644 --- a/client/garm_api_client.go +++ b/client/garm_api_client.go @@ -25,6 +25,7 @@ import ( "github.com/cloudbase/garm/client/providers" "github.com/cloudbase/garm/client/repositories" "github.com/cloudbase/garm/client/scalesets" + "github.com/cloudbase/garm/client/templates" ) // Default garm API HTTP client. @@ -84,6 +85,7 @@ func New(transport runtime.ClientTransport, formats strfmt.Registry) *GarmAPI { cli.Providers = providers.New(transport, formats) cli.Repositories = repositories.New(transport, formats) cli.Scalesets = scalesets.New(transport, formats) + cli.Templates = templates.New(transport, formats) return cli } @@ -158,6 +160,8 @@ type GarmAPI struct { Scalesets scalesets.ClientService + Templates templates.ClientService + Transport runtime.ClientTransport } @@ -179,4 +183,5 @@ func (c *GarmAPI) SetTransport(transport runtime.ClientTransport) { c.Providers.SetTransport(transport) c.Repositories.SetTransport(transport) c.Scalesets.SetTransport(transport) + c.Templates.SetTransport(transport) } diff --git a/client/templates/create_template_parameters.go b/client/templates/create_template_parameters.go new file mode 100644 index 00000000..96cce54b --- /dev/null +++ b/client/templates/create_template_parameters.go @@ -0,0 +1,151 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + + garm_params "github.com/cloudbase/garm/params" +) + +// NewCreateTemplateParams creates a new CreateTemplateParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewCreateTemplateParams() *CreateTemplateParams { + return &CreateTemplateParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewCreateTemplateParamsWithTimeout creates a new CreateTemplateParams object +// with the ability to set a timeout on a request. +func NewCreateTemplateParamsWithTimeout(timeout time.Duration) *CreateTemplateParams { + return &CreateTemplateParams{ + timeout: timeout, + } +} + +// NewCreateTemplateParamsWithContext creates a new CreateTemplateParams object +// with the ability to set a context for a request. +func NewCreateTemplateParamsWithContext(ctx context.Context) *CreateTemplateParams { + return &CreateTemplateParams{ + Context: ctx, + } +} + +// NewCreateTemplateParamsWithHTTPClient creates a new CreateTemplateParams object +// with the ability to set a custom HTTPClient for a request. +func NewCreateTemplateParamsWithHTTPClient(client *http.Client) *CreateTemplateParams { + return &CreateTemplateParams{ + HTTPClient: client, + } +} + +/* +CreateTemplateParams contains all the parameters to send to the API endpoint + + for the create template operation. + + Typically these are written to a http.Request. +*/ +type CreateTemplateParams struct { + + /* Body. + + Parameters used when creating the template. + */ + Body garm_params.CreateTemplateParams + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the create template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *CreateTemplateParams) WithDefaults() *CreateTemplateParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the create template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *CreateTemplateParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the create template params +func (o *CreateTemplateParams) WithTimeout(timeout time.Duration) *CreateTemplateParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the create template params +func (o *CreateTemplateParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the create template params +func (o *CreateTemplateParams) WithContext(ctx context.Context) *CreateTemplateParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the create template params +func (o *CreateTemplateParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the create template params +func (o *CreateTemplateParams) WithHTTPClient(client *http.Client) *CreateTemplateParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the create template params +func (o *CreateTemplateParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithBody adds the body to the create template params +func (o *CreateTemplateParams) WithBody(body garm_params.CreateTemplateParams) *CreateTemplateParams { + o.SetBody(body) + return o +} + +// SetBody adds the body to the create template params +func (o *CreateTemplateParams) SetBody(body garm_params.CreateTemplateParams) { + o.Body = body +} + +// WriteToRequest writes these params to a swagger request +func (o *CreateTemplateParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + if err := r.SetBodyParam(o.Body); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/client/templates/create_template_responses.go b/client/templates/create_template_responses.go new file mode 100644 index 00000000..348b9276 --- /dev/null +++ b/client/templates/create_template_responses.go @@ -0,0 +1,184 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + apiserver_params "github.com/cloudbase/garm/apiserver/params" + garm_params "github.com/cloudbase/garm/params" +) + +// CreateTemplateReader is a Reader for the CreateTemplate structure. +type CreateTemplateReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *CreateTemplateReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewCreateTemplateOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewCreateTemplateDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewCreateTemplateOK creates a CreateTemplateOK with default headers values +func NewCreateTemplateOK() *CreateTemplateOK { + return &CreateTemplateOK{} +} + +/* +CreateTemplateOK describes a response with status code 200, with default header values. + +Template +*/ +type CreateTemplateOK struct { + Payload garm_params.Template +} + +// IsSuccess returns true when this create template o k response has a 2xx status code +func (o *CreateTemplateOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this create template o k response has a 3xx status code +func (o *CreateTemplateOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this create template o k response has a 4xx status code +func (o *CreateTemplateOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this create template o k response has a 5xx status code +func (o *CreateTemplateOK) IsServerError() bool { + return false +} + +// IsCode returns true when this create template o k response a status code equal to that given +func (o *CreateTemplateOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the create template o k response +func (o *CreateTemplateOK) Code() int { + return 200 +} + +func (o *CreateTemplateOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /templates][%d] createTemplateOK %s", 200, payload) +} + +func (o *CreateTemplateOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /templates][%d] createTemplateOK %s", 200, payload) +} + +func (o *CreateTemplateOK) GetPayload() garm_params.Template { + return o.Payload +} + +func (o *CreateTemplateOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewCreateTemplateDefault creates a CreateTemplateDefault with default headers values +func NewCreateTemplateDefault(code int) *CreateTemplateDefault { + return &CreateTemplateDefault{ + _statusCode: code, + } +} + +/* +CreateTemplateDefault describes a response with status code -1, with default header values. + +APIErrorResponse +*/ +type CreateTemplateDefault struct { + _statusCode int + + Payload apiserver_params.APIErrorResponse +} + +// IsSuccess returns true when this create template default response has a 2xx status code +func (o *CreateTemplateDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this create template default response has a 3xx status code +func (o *CreateTemplateDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this create template default response has a 4xx status code +func (o *CreateTemplateDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this create template default response has a 5xx status code +func (o *CreateTemplateDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this create template default response a status code equal to that given +func (o *CreateTemplateDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the create template default response +func (o *CreateTemplateDefault) Code() int { + return o._statusCode +} + +func (o *CreateTemplateDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /templates][%d] CreateTemplate default %s", o._statusCode, payload) +} + +func (o *CreateTemplateDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /templates][%d] CreateTemplate default %s", o._statusCode, payload) +} + +func (o *CreateTemplateDefault) GetPayload() apiserver_params.APIErrorResponse { + return o.Payload +} + +func (o *CreateTemplateDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/client/templates/delete_template_parameters.go b/client/templates/delete_template_parameters.go new file mode 100644 index 00000000..3c4c92f4 --- /dev/null +++ b/client/templates/delete_template_parameters.go @@ -0,0 +1,152 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// NewDeleteTemplateParams creates a new DeleteTemplateParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewDeleteTemplateParams() *DeleteTemplateParams { + return &DeleteTemplateParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewDeleteTemplateParamsWithTimeout creates a new DeleteTemplateParams object +// with the ability to set a timeout on a request. +func NewDeleteTemplateParamsWithTimeout(timeout time.Duration) *DeleteTemplateParams { + return &DeleteTemplateParams{ + timeout: timeout, + } +} + +// NewDeleteTemplateParamsWithContext creates a new DeleteTemplateParams object +// with the ability to set a context for a request. +func NewDeleteTemplateParamsWithContext(ctx context.Context) *DeleteTemplateParams { + return &DeleteTemplateParams{ + Context: ctx, + } +} + +// NewDeleteTemplateParamsWithHTTPClient creates a new DeleteTemplateParams object +// with the ability to set a custom HTTPClient for a request. +func NewDeleteTemplateParamsWithHTTPClient(client *http.Client) *DeleteTemplateParams { + return &DeleteTemplateParams{ + HTTPClient: client, + } +} + +/* +DeleteTemplateParams contains all the parameters to send to the API endpoint + + for the delete template operation. + + Typically these are written to a http.Request. +*/ +type DeleteTemplateParams struct { + + /* TemplateID. + + ID of the template to delete. + */ + TemplateID float64 + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the delete template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *DeleteTemplateParams) WithDefaults() *DeleteTemplateParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the delete template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *DeleteTemplateParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the delete template params +func (o *DeleteTemplateParams) WithTimeout(timeout time.Duration) *DeleteTemplateParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the delete template params +func (o *DeleteTemplateParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the delete template params +func (o *DeleteTemplateParams) WithContext(ctx context.Context) *DeleteTemplateParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the delete template params +func (o *DeleteTemplateParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the delete template params +func (o *DeleteTemplateParams) WithHTTPClient(client *http.Client) *DeleteTemplateParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the delete template params +func (o *DeleteTemplateParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithTemplateID adds the templateID to the delete template params +func (o *DeleteTemplateParams) WithTemplateID(templateID float64) *DeleteTemplateParams { + o.SetTemplateID(templateID) + return o +} + +// SetTemplateID adds the templateId to the delete template params +func (o *DeleteTemplateParams) SetTemplateID(templateID float64) { + o.TemplateID = templateID +} + +// WriteToRequest writes these params to a swagger request +func (o *DeleteTemplateParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + + // path param templateID + if err := r.SetPathParam("templateID", swag.FormatFloat64(o.TemplateID)); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/client/templates/delete_template_responses.go b/client/templates/delete_template_responses.go new file mode 100644 index 00000000..98ef92dc --- /dev/null +++ b/client/templates/delete_template_responses.go @@ -0,0 +1,106 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + apiserver_params "github.com/cloudbase/garm/apiserver/params" +) + +// DeleteTemplateReader is a Reader for the DeleteTemplate structure. +type DeleteTemplateReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *DeleteTemplateReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + result := NewDeleteTemplateDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result +} + +// NewDeleteTemplateDefault creates a DeleteTemplateDefault with default headers values +func NewDeleteTemplateDefault(code int) *DeleteTemplateDefault { + return &DeleteTemplateDefault{ + _statusCode: code, + } +} + +/* +DeleteTemplateDefault describes a response with status code -1, with default header values. + +APIErrorResponse +*/ +type DeleteTemplateDefault struct { + _statusCode int + + Payload apiserver_params.APIErrorResponse +} + +// IsSuccess returns true when this delete template default response has a 2xx status code +func (o *DeleteTemplateDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this delete template default response has a 3xx status code +func (o *DeleteTemplateDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this delete template default response has a 4xx status code +func (o *DeleteTemplateDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this delete template default response has a 5xx status code +func (o *DeleteTemplateDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this delete template default response a status code equal to that given +func (o *DeleteTemplateDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the delete template default response +func (o *DeleteTemplateDefault) Code() int { + return o._statusCode +} + +func (o *DeleteTemplateDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[DELETE /templates/{templateID}][%d] DeleteTemplate default %s", o._statusCode, payload) +} + +func (o *DeleteTemplateDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[DELETE /templates/{templateID}][%d] DeleteTemplate default %s", o._statusCode, payload) +} + +func (o *DeleteTemplateDefault) GetPayload() apiserver_params.APIErrorResponse { + return o.Payload +} + +func (o *DeleteTemplateDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/client/templates/get_template_parameters.go b/client/templates/get_template_parameters.go new file mode 100644 index 00000000..b40f2cee --- /dev/null +++ b/client/templates/get_template_parameters.go @@ -0,0 +1,152 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// NewGetTemplateParams creates a new GetTemplateParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewGetTemplateParams() *GetTemplateParams { + return &GetTemplateParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewGetTemplateParamsWithTimeout creates a new GetTemplateParams object +// with the ability to set a timeout on a request. +func NewGetTemplateParamsWithTimeout(timeout time.Duration) *GetTemplateParams { + return &GetTemplateParams{ + timeout: timeout, + } +} + +// NewGetTemplateParamsWithContext creates a new GetTemplateParams object +// with the ability to set a context for a request. +func NewGetTemplateParamsWithContext(ctx context.Context) *GetTemplateParams { + return &GetTemplateParams{ + Context: ctx, + } +} + +// NewGetTemplateParamsWithHTTPClient creates a new GetTemplateParams object +// with the ability to set a custom HTTPClient for a request. +func NewGetTemplateParamsWithHTTPClient(client *http.Client) *GetTemplateParams { + return &GetTemplateParams{ + HTTPClient: client, + } +} + +/* +GetTemplateParams contains all the parameters to send to the API endpoint + + for the get template operation. + + Typically these are written to a http.Request. +*/ +type GetTemplateParams struct { + + /* TemplateID. + + ID of the template to fetch. + */ + TemplateID float64 + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the get template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetTemplateParams) WithDefaults() *GetTemplateParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the get template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetTemplateParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the get template params +func (o *GetTemplateParams) WithTimeout(timeout time.Duration) *GetTemplateParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the get template params +func (o *GetTemplateParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the get template params +func (o *GetTemplateParams) WithContext(ctx context.Context) *GetTemplateParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the get template params +func (o *GetTemplateParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the get template params +func (o *GetTemplateParams) WithHTTPClient(client *http.Client) *GetTemplateParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the get template params +func (o *GetTemplateParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithTemplateID adds the templateID to the get template params +func (o *GetTemplateParams) WithTemplateID(templateID float64) *GetTemplateParams { + o.SetTemplateID(templateID) + return o +} + +// SetTemplateID adds the templateId to the get template params +func (o *GetTemplateParams) SetTemplateID(templateID float64) { + o.TemplateID = templateID +} + +// WriteToRequest writes these params to a swagger request +func (o *GetTemplateParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + + // path param templateID + if err := r.SetPathParam("templateID", swag.FormatFloat64(o.TemplateID)); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/client/templates/get_template_responses.go b/client/templates/get_template_responses.go new file mode 100644 index 00000000..7ac2da83 --- /dev/null +++ b/client/templates/get_template_responses.go @@ -0,0 +1,184 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + apiserver_params "github.com/cloudbase/garm/apiserver/params" + garm_params "github.com/cloudbase/garm/params" +) + +// GetTemplateReader is a Reader for the GetTemplate structure. +type GetTemplateReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *GetTemplateReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewGetTemplateOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewGetTemplateDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewGetTemplateOK creates a GetTemplateOK with default headers values +func NewGetTemplateOK() *GetTemplateOK { + return &GetTemplateOK{} +} + +/* +GetTemplateOK describes a response with status code 200, with default header values. + +Template +*/ +type GetTemplateOK struct { + Payload garm_params.Template +} + +// IsSuccess returns true when this get template o k response has a 2xx status code +func (o *GetTemplateOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this get template o k response has a 3xx status code +func (o *GetTemplateOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get template o k response has a 4xx status code +func (o *GetTemplateOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this get template o k response has a 5xx status code +func (o *GetTemplateOK) IsServerError() bool { + return false +} + +// IsCode returns true when this get template o k response a status code equal to that given +func (o *GetTemplateOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the get template o k response +func (o *GetTemplateOK) Code() int { + return 200 +} + +func (o *GetTemplateOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates/{templateID}][%d] getTemplateOK %s", 200, payload) +} + +func (o *GetTemplateOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates/{templateID}][%d] getTemplateOK %s", 200, payload) +} + +func (o *GetTemplateOK) GetPayload() garm_params.Template { + return o.Payload +} + +func (o *GetTemplateOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewGetTemplateDefault creates a GetTemplateDefault with default headers values +func NewGetTemplateDefault(code int) *GetTemplateDefault { + return &GetTemplateDefault{ + _statusCode: code, + } +} + +/* +GetTemplateDefault describes a response with status code -1, with default header values. + +APIErrorResponse +*/ +type GetTemplateDefault struct { + _statusCode int + + Payload apiserver_params.APIErrorResponse +} + +// IsSuccess returns true when this get template default response has a 2xx status code +func (o *GetTemplateDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this get template default response has a 3xx status code +func (o *GetTemplateDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this get template default response has a 4xx status code +func (o *GetTemplateDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this get template default response has a 5xx status code +func (o *GetTemplateDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this get template default response a status code equal to that given +func (o *GetTemplateDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the get template default response +func (o *GetTemplateDefault) Code() int { + return o._statusCode +} + +func (o *GetTemplateDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates/{templateID}][%d] GetTemplate default %s", o._statusCode, payload) +} + +func (o *GetTemplateDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates/{templateID}][%d] GetTemplate default %s", o._statusCode, payload) +} + +func (o *GetTemplateDefault) GetPayload() apiserver_params.APIErrorResponse { + return o.Payload +} + +func (o *GetTemplateDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/client/templates/list_templates_parameters.go b/client/templates/list_templates_parameters.go new file mode 100644 index 00000000..2daf93e6 --- /dev/null +++ b/client/templates/list_templates_parameters.go @@ -0,0 +1,231 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// NewListTemplatesParams creates a new ListTemplatesParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewListTemplatesParams() *ListTemplatesParams { + return &ListTemplatesParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewListTemplatesParamsWithTimeout creates a new ListTemplatesParams object +// with the ability to set a timeout on a request. +func NewListTemplatesParamsWithTimeout(timeout time.Duration) *ListTemplatesParams { + return &ListTemplatesParams{ + timeout: timeout, + } +} + +// NewListTemplatesParamsWithContext creates a new ListTemplatesParams object +// with the ability to set a context for a request. +func NewListTemplatesParamsWithContext(ctx context.Context) *ListTemplatesParams { + return &ListTemplatesParams{ + Context: ctx, + } +} + +// NewListTemplatesParamsWithHTTPClient creates a new ListTemplatesParams object +// with the ability to set a custom HTTPClient for a request. +func NewListTemplatesParamsWithHTTPClient(client *http.Client) *ListTemplatesParams { + return &ListTemplatesParams{ + HTTPClient: client, + } +} + +/* +ListTemplatesParams contains all the parameters to send to the API endpoint + + for the list templates operation. + + Typically these are written to a http.Request. +*/ +type ListTemplatesParams struct { + + /* ForgeType. + + Forge type of the templates. + */ + ForgeType *string + + /* OsType. + + OS type of the templates. + */ + OsType *string + + /* PartialName. + + Partial or full name of the template. + */ + PartialName *string + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the list templates params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *ListTemplatesParams) WithDefaults() *ListTemplatesParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the list templates params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *ListTemplatesParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the list templates params +func (o *ListTemplatesParams) WithTimeout(timeout time.Duration) *ListTemplatesParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the list templates params +func (o *ListTemplatesParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the list templates params +func (o *ListTemplatesParams) WithContext(ctx context.Context) *ListTemplatesParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the list templates params +func (o *ListTemplatesParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the list templates params +func (o *ListTemplatesParams) WithHTTPClient(client *http.Client) *ListTemplatesParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the list templates params +func (o *ListTemplatesParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithForgeType adds the forgeType to the list templates params +func (o *ListTemplatesParams) WithForgeType(forgeType *string) *ListTemplatesParams { + o.SetForgeType(forgeType) + return o +} + +// SetForgeType adds the forgeType to the list templates params +func (o *ListTemplatesParams) SetForgeType(forgeType *string) { + o.ForgeType = forgeType +} + +// WithOsType adds the osType to the list templates params +func (o *ListTemplatesParams) WithOsType(osType *string) *ListTemplatesParams { + o.SetOsType(osType) + return o +} + +// SetOsType adds the osType to the list templates params +func (o *ListTemplatesParams) SetOsType(osType *string) { + o.OsType = osType +} + +// WithPartialName adds the partialName to the list templates params +func (o *ListTemplatesParams) WithPartialName(partialName *string) *ListTemplatesParams { + o.SetPartialName(partialName) + return o +} + +// SetPartialName adds the partialName to the list templates params +func (o *ListTemplatesParams) SetPartialName(partialName *string) { + o.PartialName = partialName +} + +// WriteToRequest writes these params to a swagger request +func (o *ListTemplatesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + + if o.ForgeType != nil { + + // query param forgeType + var qrForgeType string + + if o.ForgeType != nil { + qrForgeType = *o.ForgeType + } + qForgeType := qrForgeType + if qForgeType != "" { + + if err := r.SetQueryParam("forgeType", qForgeType); err != nil { + return err + } + } + } + + if o.OsType != nil { + + // query param osType + var qrOsType string + + if o.OsType != nil { + qrOsType = *o.OsType + } + qOsType := qrOsType + if qOsType != "" { + + if err := r.SetQueryParam("osType", qOsType); err != nil { + return err + } + } + } + + if o.PartialName != nil { + + // query param partialName + var qrPartialName string + + if o.PartialName != nil { + qrPartialName = *o.PartialName + } + qPartialName := qrPartialName + if qPartialName != "" { + + if err := r.SetQueryParam("partialName", qPartialName); err != nil { + return err + } + } + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/client/templates/list_templates_responses.go b/client/templates/list_templates_responses.go new file mode 100644 index 00000000..ecf6c16a --- /dev/null +++ b/client/templates/list_templates_responses.go @@ -0,0 +1,184 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + apiserver_params "github.com/cloudbase/garm/apiserver/params" + garm_params "github.com/cloudbase/garm/params" +) + +// ListTemplatesReader is a Reader for the ListTemplates structure. +type ListTemplatesReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *ListTemplatesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewListTemplatesOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewListTemplatesDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewListTemplatesOK creates a ListTemplatesOK with default headers values +func NewListTemplatesOK() *ListTemplatesOK { + return &ListTemplatesOK{} +} + +/* +ListTemplatesOK describes a response with status code 200, with default header values. + +Templates +*/ +type ListTemplatesOK struct { + Payload garm_params.Templates +} + +// IsSuccess returns true when this list templates o k response has a 2xx status code +func (o *ListTemplatesOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this list templates o k response has a 3xx status code +func (o *ListTemplatesOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this list templates o k response has a 4xx status code +func (o *ListTemplatesOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this list templates o k response has a 5xx status code +func (o *ListTemplatesOK) IsServerError() bool { + return false +} + +// IsCode returns true when this list templates o k response a status code equal to that given +func (o *ListTemplatesOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the list templates o k response +func (o *ListTemplatesOK) Code() int { + return 200 +} + +func (o *ListTemplatesOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates][%d] listTemplatesOK %s", 200, payload) +} + +func (o *ListTemplatesOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates][%d] listTemplatesOK %s", 200, payload) +} + +func (o *ListTemplatesOK) GetPayload() garm_params.Templates { + return o.Payload +} + +func (o *ListTemplatesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewListTemplatesDefault creates a ListTemplatesDefault with default headers values +func NewListTemplatesDefault(code int) *ListTemplatesDefault { + return &ListTemplatesDefault{ + _statusCode: code, + } +} + +/* +ListTemplatesDefault describes a response with status code -1, with default header values. + +APIErrorResponse +*/ +type ListTemplatesDefault struct { + _statusCode int + + Payload apiserver_params.APIErrorResponse +} + +// IsSuccess returns true when this list templates default response has a 2xx status code +func (o *ListTemplatesDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this list templates default response has a 3xx status code +func (o *ListTemplatesDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this list templates default response has a 4xx status code +func (o *ListTemplatesDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this list templates default response has a 5xx status code +func (o *ListTemplatesDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this list templates default response a status code equal to that given +func (o *ListTemplatesDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the list templates default response +func (o *ListTemplatesDefault) Code() int { + return o._statusCode +} + +func (o *ListTemplatesDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates][%d] ListTemplates default %s", o._statusCode, payload) +} + +func (o *ListTemplatesDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /templates][%d] ListTemplates default %s", o._statusCode, payload) +} + +func (o *ListTemplatesDefault) GetPayload() apiserver_params.APIErrorResponse { + return o.Payload +} + +func (o *ListTemplatesDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/client/templates/templates_client.go b/client/templates/templates_client.go new file mode 100644 index 00000000..63151afd --- /dev/null +++ b/client/templates/templates_client.go @@ -0,0 +1,257 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "github.com/go-openapi/runtime" + httptransport "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// New creates a new templates API client. +func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService { + return &Client{transport: transport, formats: formats} +} + +// New creates a new templates API client with basic auth credentials. +// It takes the following parameters: +// - host: http host (github.com). +// - basePath: any base path for the API client ("/v1", "/v3"). +// - scheme: http scheme ("http", "https"). +// - user: user for basic authentication header. +// - password: password for basic authentication header. +func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService { + transport := httptransport.New(host, basePath, []string{scheme}) + transport.DefaultAuthentication = httptransport.BasicAuth(user, password) + return &Client{transport: transport, formats: strfmt.Default} +} + +// New creates a new templates API client with a bearer token for authentication. +// It takes the following parameters: +// - host: http host (github.com). +// - basePath: any base path for the API client ("/v1", "/v3"). +// - scheme: http scheme ("http", "https"). +// - bearerToken: bearer token for Bearer authentication header. +func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService { + transport := httptransport.New(host, basePath, []string{scheme}) + transport.DefaultAuthentication = httptransport.BearerToken(bearerToken) + return &Client{transport: transport, formats: strfmt.Default} +} + +/* +Client for templates API +*/ +type Client struct { + transport runtime.ClientTransport + formats strfmt.Registry +} + +// ClientOption may be used to customize the behavior of Client methods. +type ClientOption func(*runtime.ClientOperation) + +// ClientService is the interface for Client methods +type ClientService interface { + CreateTemplate(params *CreateTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateTemplateOK, error) + + DeleteTemplate(params *DeleteTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) error + + GetTemplate(params *GetTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetTemplateOK, error) + + ListTemplates(params *ListTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListTemplatesOK, error) + + UpdateTemplate(params *UpdateTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateTemplateOK, error) + + SetTransport(transport runtime.ClientTransport) +} + +/* +CreateTemplate creates template with the parameters given +*/ +func (a *Client) CreateTemplate(params *CreateTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateTemplateOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewCreateTemplateParams() + } + op := &runtime.ClientOperation{ + ID: "CreateTemplate", + Method: "POST", + PathPattern: "/templates", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http"}, + Params: params, + Reader: &CreateTemplateReader{formats: a.formats}, + AuthInfo: authInfo, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*CreateTemplateOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*CreateTemplateDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +/* +DeleteTemplate gets template by ID +*/ +func (a *Client) DeleteTemplate(params *DeleteTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) error { + // TODO: Validate the params before sending + if params == nil { + params = NewDeleteTemplateParams() + } + op := &runtime.ClientOperation{ + ID: "DeleteTemplate", + Method: "DELETE", + PathPattern: "/templates/{templateID}", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http"}, + Params: params, + Reader: &DeleteTemplateReader{formats: a.formats}, + AuthInfo: authInfo, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + _, err := a.transport.Submit(op) + if err != nil { + return err + } + return nil +} + +/* +GetTemplate gets template by ID +*/ +func (a *Client) GetTemplate(params *GetTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetTemplateOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewGetTemplateParams() + } + op := &runtime.ClientOperation{ + ID: "GetTemplate", + Method: "GET", + PathPattern: "/templates/{templateID}", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http"}, + Params: params, + Reader: &GetTemplateReader{formats: a.formats}, + AuthInfo: authInfo, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*GetTemplateOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*GetTemplateDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +/* +ListTemplates lists templates +*/ +func (a *Client) ListTemplates(params *ListTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListTemplatesOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewListTemplatesParams() + } + op := &runtime.ClientOperation{ + ID: "ListTemplates", + Method: "GET", + PathPattern: "/templates", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http"}, + Params: params, + Reader: &ListTemplatesReader{formats: a.formats}, + AuthInfo: authInfo, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*ListTemplatesOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*ListTemplatesDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +/* +UpdateTemplate updates template with the parameters given +*/ +func (a *Client) UpdateTemplate(params *UpdateTemplateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateTemplateOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewUpdateTemplateParams() + } + op := &runtime.ClientOperation{ + ID: "UpdateTemplate", + Method: "PUT", + PathPattern: "/templates/{templateID}", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http"}, + Params: params, + Reader: &UpdateTemplateReader{formats: a.formats}, + AuthInfo: authInfo, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*UpdateTemplateOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*UpdateTemplateDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +// SetTransport changes the transport on the client +func (a *Client) SetTransport(transport runtime.ClientTransport) { + a.transport = transport +} diff --git a/client/templates/update_template_parameters.go b/client/templates/update_template_parameters.go new file mode 100644 index 00000000..d897ccda --- /dev/null +++ b/client/templates/update_template_parameters.go @@ -0,0 +1,173 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + + garm_params "github.com/cloudbase/garm/params" +) + +// NewUpdateTemplateParams creates a new UpdateTemplateParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewUpdateTemplateParams() *UpdateTemplateParams { + return &UpdateTemplateParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewUpdateTemplateParamsWithTimeout creates a new UpdateTemplateParams object +// with the ability to set a timeout on a request. +func NewUpdateTemplateParamsWithTimeout(timeout time.Duration) *UpdateTemplateParams { + return &UpdateTemplateParams{ + timeout: timeout, + } +} + +// NewUpdateTemplateParamsWithContext creates a new UpdateTemplateParams object +// with the ability to set a context for a request. +func NewUpdateTemplateParamsWithContext(ctx context.Context) *UpdateTemplateParams { + return &UpdateTemplateParams{ + Context: ctx, + } +} + +// NewUpdateTemplateParamsWithHTTPClient creates a new UpdateTemplateParams object +// with the ability to set a custom HTTPClient for a request. +func NewUpdateTemplateParamsWithHTTPClient(client *http.Client) *UpdateTemplateParams { + return &UpdateTemplateParams{ + HTTPClient: client, + } +} + +/* +UpdateTemplateParams contains all the parameters to send to the API endpoint + + for the update template operation. + + Typically these are written to a http.Request. +*/ +type UpdateTemplateParams struct { + + /* Body. + + Parameters used when updating the template. + */ + Body garm_params.UpdateTemplateParams + + /* TemplateID. + + ID of the template to update. + */ + TemplateID string + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the update template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *UpdateTemplateParams) WithDefaults() *UpdateTemplateParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the update template params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *UpdateTemplateParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the update template params +func (o *UpdateTemplateParams) WithTimeout(timeout time.Duration) *UpdateTemplateParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the update template params +func (o *UpdateTemplateParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the update template params +func (o *UpdateTemplateParams) WithContext(ctx context.Context) *UpdateTemplateParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the update template params +func (o *UpdateTemplateParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the update template params +func (o *UpdateTemplateParams) WithHTTPClient(client *http.Client) *UpdateTemplateParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the update template params +func (o *UpdateTemplateParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithBody adds the body to the update template params +func (o *UpdateTemplateParams) WithBody(body garm_params.UpdateTemplateParams) *UpdateTemplateParams { + o.SetBody(body) + return o +} + +// SetBody adds the body to the update template params +func (o *UpdateTemplateParams) SetBody(body garm_params.UpdateTemplateParams) { + o.Body = body +} + +// WithTemplateID adds the templateID to the update template params +func (o *UpdateTemplateParams) WithTemplateID(templateID string) *UpdateTemplateParams { + o.SetTemplateID(templateID) + return o +} + +// SetTemplateID adds the templateId to the update template params +func (o *UpdateTemplateParams) SetTemplateID(templateID string) { + o.TemplateID = templateID +} + +// WriteToRequest writes these params to a swagger request +func (o *UpdateTemplateParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + if err := r.SetBodyParam(o.Body); err != nil { + return err + } + + // path param templateID + if err := r.SetPathParam("templateID", o.TemplateID); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/client/templates/update_template_responses.go b/client/templates/update_template_responses.go new file mode 100644 index 00000000..7cb254a5 --- /dev/null +++ b/client/templates/update_template_responses.go @@ -0,0 +1,184 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + apiserver_params "github.com/cloudbase/garm/apiserver/params" + garm_params "github.com/cloudbase/garm/params" +) + +// UpdateTemplateReader is a Reader for the UpdateTemplate structure. +type UpdateTemplateReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *UpdateTemplateReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewUpdateTemplateOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewUpdateTemplateDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewUpdateTemplateOK creates a UpdateTemplateOK with default headers values +func NewUpdateTemplateOK() *UpdateTemplateOK { + return &UpdateTemplateOK{} +} + +/* +UpdateTemplateOK describes a response with status code 200, with default header values. + +Template +*/ +type UpdateTemplateOK struct { + Payload garm_params.Template +} + +// IsSuccess returns true when this update template o k response has a 2xx status code +func (o *UpdateTemplateOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this update template o k response has a 3xx status code +func (o *UpdateTemplateOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this update template o k response has a 4xx status code +func (o *UpdateTemplateOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this update template o k response has a 5xx status code +func (o *UpdateTemplateOK) IsServerError() bool { + return false +} + +// IsCode returns true when this update template o k response a status code equal to that given +func (o *UpdateTemplateOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the update template o k response +func (o *UpdateTemplateOK) Code() int { + return 200 +} + +func (o *UpdateTemplateOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[PUT /templates/{templateID}][%d] updateTemplateOK %s", 200, payload) +} + +func (o *UpdateTemplateOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[PUT /templates/{templateID}][%d] updateTemplateOK %s", 200, payload) +} + +func (o *UpdateTemplateOK) GetPayload() garm_params.Template { + return o.Payload +} + +func (o *UpdateTemplateOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewUpdateTemplateDefault creates a UpdateTemplateDefault with default headers values +func NewUpdateTemplateDefault(code int) *UpdateTemplateDefault { + return &UpdateTemplateDefault{ + _statusCode: code, + } +} + +/* +UpdateTemplateDefault describes a response with status code -1, with default header values. + +APIErrorResponse +*/ +type UpdateTemplateDefault struct { + _statusCode int + + Payload apiserver_params.APIErrorResponse +} + +// IsSuccess returns true when this update template default response has a 2xx status code +func (o *UpdateTemplateDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this update template default response has a 3xx status code +func (o *UpdateTemplateDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this update template default response has a 4xx status code +func (o *UpdateTemplateDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this update template default response has a 5xx status code +func (o *UpdateTemplateDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this update template default response a status code equal to that given +func (o *UpdateTemplateDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the update template default response +func (o *UpdateTemplateDefault) Code() int { + return o._statusCode +} + +func (o *UpdateTemplateDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[PUT /templates/{templateID}][%d] UpdateTemplate default %s", o._statusCode, payload) +} + +func (o *UpdateTemplateDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[PUT /templates/{templateID}][%d] UpdateTemplate default %s", o._statusCode, payload) +} + +func (o *UpdateTemplateDefault) GetPayload() apiserver_params.APIErrorResponse { + return o.Payload +} + +func (o *UpdateTemplateDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/cmd/garm-cli/cmd/pool.go b/cmd/garm-cli/cmd/pool.go index 5b8cadf3..458b17a6 100644 --- a/cmd/garm-cli/cmd/pool.go +++ b/cmd/garm-cli/cmd/pool.go @@ -52,6 +52,7 @@ var ( poolAll bool poolGitHubRunnerGroup string priority uint + poolTemplateNameOrID string ) type poolsPayloadGetter interface { @@ -256,6 +257,14 @@ var poolAddCmd = &cobra.Command{ } var err error + if cmd.Flags().Changed("runner-install-template") && poolTemplateNameOrID != "" { + tmplID, err := resolveTemplateAsUint(poolTemplateNameOrID) + if err != nil { + return fmt.Errorf("failed to resolve template") + } + newPoolParams.TemplateID = &tmplID + } + var response poolPayloadGetter if cmd.Flags().Changed("repo") { poolRepository, err = resolveRepository(poolRepository, endpointName) @@ -324,6 +333,14 @@ explicitly remove them using the runner delete command. updatePoolReq := apiClientPools.NewUpdatePoolParams() poolUpdateParams := params.UpdatePoolParams{} + if cmd.Flags().Changed("runner-install-template") && poolTemplateNameOrID != "" { + tmplID, err := resolveTemplateAsUint(poolTemplateNameOrID) + if err != nil { + return fmt.Errorf("failed to resolve template") + } + poolUpdateParams.TemplateID = &tmplID + } + if cmd.Flags().Changed("image") { poolUpdateParams.Image = poolImage } @@ -427,6 +444,7 @@ func init() { poolUpdateCmd.Flags().StringVar(&poolExtraSpecsFile, "extra-specs-file", "", "A file containing a valid json which will be passed to the IaaS provider managing the pool.") poolUpdateCmd.Flags().StringVar(&poolExtraSpecs, "extra-specs", "", "A valid json which will be passed to the IaaS provider managing the pool.") poolUpdateCmd.MarkFlagsMutuallyExclusive("extra-specs-file", "extra-specs") + poolUpdateCmd.Flags().StringVar(&poolTemplateNameOrID, "runner-install-template", "", "The runner install template name or ID to use for this pool.") poolAddCmd.Flags().StringVar(&poolProvider, "provider-name", "", "The name of the provider where runners will be created.") poolAddCmd.Flags().UintVar(&priority, "priority", 0, "When multiple pools match the same labels, priority dictates the order by which they are returned, in descending order.") @@ -443,6 +461,7 @@ func init() { poolAddCmd.Flags().UintVar(&poolRunnerBootstrapTimeout, "runner-bootstrap-timeout", 20, "Duration in minutes after which a runner is considered failed if it does not join Github.") poolAddCmd.Flags().UintVar(&poolMinIdleRunners, "min-idle-runners", 1, "Attempt to maintain a minimum of idle self-hosted runners of this type.") poolAddCmd.Flags().BoolVar(&poolEnabled, "enabled", false, "Enable this pool.") + poolAddCmd.Flags().StringVar(&poolTemplateNameOrID, "runner-install-template", "", "The runner install template name or ID to use for this pool.") poolAddCmd.Flags().StringVar(&endpointName, "endpoint", "", "When using the name of an entity, the endpoint must be specified when multiple entities with the same name exist.") poolAddCmd.MarkFlagRequired("provider-name") //nolint @@ -582,6 +601,7 @@ func formatOnePool(pool params.Pool) { t.AppendRow(table.Row{"Tags", strings.Join(tags, ", ")}) t.AppendRow(table.Row{"Belongs to", belongsTo}) t.AppendRow(table.Row{"Level", level}) + t.AppendRow(table.Row{"Template", fmt.Sprintf("%s (ID: %d)", pool.TemplateName, pool.TemplateID)}) t.AppendRow(table.Row{"Enabled", pool.Enabled}) t.AppendRow(table.Row{"Runner Prefix", pool.GetRunnerPrefix()}) t.AppendRow(table.Row{"Extra specs", string(pool.ExtraSpecs)}) diff --git a/cmd/garm-cli/cmd/scalesets.go b/cmd/garm-cli/cmd/scalesets.go index a78fe33f..cf643dd6 100644 --- a/cmd/garm-cli/cmd/scalesets.go +++ b/cmd/garm-cli/cmd/scalesets.go @@ -48,6 +48,7 @@ var ( scalesetExtraSpecsFile string scalesetExtraSpecs string scalesetGitHubRunnerGroup string + scaleSetTemplateNameOrID string ) type scalesetPayloadGetter interface { @@ -250,6 +251,14 @@ var scaleSetAddCmd = &cobra.Command{ } var err error + if cmd.Flags().Changed("runner-install-template") && scaleSetTemplateNameOrID != "" { + tmplID, err := resolveTemplateAsUint(scaleSetTemplateNameOrID) + if err != nil { + return fmt.Errorf("failed to resolve template") + } + newScaleSetParams.TemplateID = &tmplID + } + var response scalesetPayloadGetter if cmd.Flags().Changed("repo") { scalesetRepository, err = resolveRepository(scalesetRepository, endpointName) @@ -318,6 +327,14 @@ explicitly remove them using the runner delete command. updateScaleSetReq := apiClientScaleSets.NewUpdateScaleSetParams() scaleSetUpdateParams := params.UpdateScaleSetParams{} + if cmd.Flags().Changed("runner-install-template") && scaleSetTemplateNameOrID != "" { + tmplID, err := resolveTemplateAsUint(scaleSetTemplateNameOrID) + if err != nil { + return fmt.Errorf("failed to resolve template") + } + scaleSetUpdateParams.TemplateID = &tmplID + } + if cmd.Flags().Changed("image") { scaleSetUpdateParams.Image = scalesetImage } @@ -412,6 +429,7 @@ func init() { scaleSetUpdateCmd.Flags().UintVar(&scalesetRunnerBootstrapTimeout, "runner-bootstrap-timeout", 20, "Duration in minutes after which a runner is considered failed if it does not join Github.") scaleSetUpdateCmd.Flags().StringVar(&scalesetExtraSpecsFile, "extra-specs-file", "", "A file containing a valid json which will be passed to the IaaS provider managing the scale set.") scaleSetUpdateCmd.Flags().StringVar(&scalesetExtraSpecs, "extra-specs", "", "A valid json which will be passed to the IaaS provider managing the scale set.") + scaleSetUpdateCmd.Flags().StringVar(&scaleSetTemplateNameOrID, "runner-install-template", "", "The runner install template name or ID to use for this scale set.") scaleSetUpdateCmd.MarkFlagsMutuallyExclusive("extra-specs-file", "extra-specs") scaleSetAddCmd.Flags().StringVar(&scalesetProvider, "provider-name", "", "The name of the provider where runners will be created.") @@ -429,6 +447,7 @@ func init() { scaleSetAddCmd.Flags().UintVar(&scalesetMinIdleRunners, "min-idle-runners", 1, "Attempt to maintain a minimum of idle self-hosted runners of this type.") scaleSetAddCmd.Flags().BoolVar(&scalesetEnabled, "enabled", false, "Enable this scale set.") scaleSetAddCmd.Flags().StringVar(&endpointName, "endpoint", "", "When using the name of an entity, the endpoint must be specified when multiple entities with the same name exist.") + scaleSetAddCmd.Flags().StringVar(&scaleSetTemplateNameOrID, "runner-install-template", "", "The runner install template name or ID to use for this scale set.") scaleSetAddCmd.MarkFlagRequired("provider-name") //nolint scaleSetAddCmd.MarkFlagRequired("name") //nolint scaleSetAddCmd.MarkFlagRequired("image") //nolint @@ -519,6 +538,7 @@ func formatOneScaleSet(scaleSet params.ScaleSet) { t.AppendRow(table.Row{"Min Idle Runners", scaleSet.MinIdleRunners}) t.AppendRow(table.Row{"Runner Bootstrap Timeout", scaleSet.RunnerBootstrapTimeout}) t.AppendRow(table.Row{"Belongs to", belongsTo}) + t.AppendRow(table.Row{"Template", fmt.Sprintf("%s (ID: %d)", scaleSet.TemplateName, scaleSet.TemplateID)}) t.AppendRow(table.Row{"Level", level}) t.AppendRow(table.Row{"Enabled", scaleSet.Enabled}) t.AppendRow(table.Row{"Runner Prefix", scaleSet.GetRunnerPrefix()}) diff --git a/cmd/garm-cli/cmd/templates.go b/cmd/garm-cli/cmd/templates.go new file mode 100644 index 00000000..4f29fc9f --- /dev/null +++ b/cmd/garm-cli/cmd/templates.go @@ -0,0 +1,485 @@ +// Copyright 2025 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +package cmd + +import ( + "fmt" + "os" + "strings" + + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + + commonParams "github.com/cloudbase/garm-provider-common/params" + apiTemplates "github.com/cloudbase/garm/client/templates" + "github.com/cloudbase/garm/cmd/garm-cli/common" + "github.com/cloudbase/garm/cmd/garm-cli/editor" + "github.com/cloudbase/garm/params" +) + +var ( + templateName string + templatePath string + templateOSType string + templateForgeType string + templateDescription string +) + +// templatesCmd represents the the templates command. +var templatesCmd = &cobra.Command{ + Use: "template", + SilenceUsage: true, + Short: "Manage templates", + Long: `Manage runner install templates. + +The commands in this group enable you to manage github and gitea runner install templates for both Linux and Windows. +Templates are a convenience feature that allows providers to point the userdata of the new runner to an URL in GARM +which will serve an OS specific script (catered to the runner type) that will set up the runner software on a new +generic machine. + +Templates give users the flexibility to easily change and manage runner install scripts without setting the entire +template body in extra_specs. Think of it as an easier way to manage runner install scripts that allows you to keep +the templates in GARM itself instead of keeping track of multiple files written for various pools or scale sets. +`, + Run: nil, +} + +var templateCreateCmd = &cobra.Command{ + Use: "create", + Aliases: []string{"add"}, + SilenceUsage: true, + Short: "Create a new template", + Long: `Create a new runner install template.`, + RunE: func(_ *cobra.Command, _ []string) error { + if needsInit { + return errNeedsInitError + } + + forge := params.EndpointType(templateForgeType) + switch forge { + case params.GithubEndpointType, params.GiteaEndpointType: + default: + return fmt.Errorf("invalid forge type: %q (supported: %s)", forge, strings.Join([]string{string(params.GithubEndpointType), string(params.GiteaEndpointType)}, ", ")) + } + + osType := commonParams.OSType(templateOSType) + switch osType { + case commonParams.Linux, commonParams.Windows: + default: + return fmt.Errorf("invalid OS type: %q (supported: %s)", osType, strings.Join([]string{string(params.GithubEndpointType), string(params.GiteaEndpointType)}, ", ")) + } + + if templatePath == "" { + return fmt.Errorf("missing template path") + } + + mode, err := os.Stat(templatePath) + if err != nil { + return fmt.Errorf("failed to access %s: %q", templatePath, err) + } + if mode.Size() > 1<<20 { + return fmt.Errorf("script is larger than 1 MB") + } + data, err := os.ReadFile(templatePath) + if err != nil { + return fmt.Errorf("failed to read template file: %q", err) + } + + createTemplateReq := apiTemplates.NewCreateTemplateParams() + createTemplateReq.Body.Name = templateName + createTemplateReq.Body.ForgeType = forge + createTemplateReq.Body.OSType = osType + createTemplateReq.Body.Description = templateDescription + createTemplateReq.Body.Data = data + + response, err := apiCli.Templates.CreateTemplate(createTemplateReq, authToken) + if err != nil { + return err + } + formatOneTemplate(response.Payload) + return nil + }, +} + +var templateUpdateCmd = &cobra.Command{ + Use: "update [flags] template_id", + SilenceUsage: true, + Short: "Update template", + Long: `Update a runner install template.`, + RunE: func(cmd *cobra.Command, args []string) error { + if needsInit { + return errNeedsInitError + } + + updateReq := apiTemplates.NewUpdateTemplateParams() + + var changes bool + + if len(args) != 1 { + return fmt.Errorf("invalid positional parameters; requires template_id") + } + + tplID, err := resolveTemplateAsUint(args[0]) + if err != nil { + return fmt.Errorf("failed to determine template ID: %s", err) + } + + if cmd.Flags().Changed("name") { + updateReq.Body.Name = &templateName + changes = true + } + if cmd.Flags().Changed("description") { + updateReq.Body.Description = &templateDescription + changes = true + } + + if cmd.Flags().Changed("path") { + mode, err := os.Stat(templatePath) + if err != nil { + return fmt.Errorf("failed to access %s: %q", templatePath, err) + } + if mode.Size() > 1<<20 { + return fmt.Errorf("script is larger than 1 MB") + } + data, err := os.ReadFile(templatePath) + if err != nil { + return fmt.Errorf("failed to read template file: %q", err) + } + updateReq.Body.Data = data + changes = true + } + if !changes { + return fmt.Errorf("at least one of name, description or path must be specified") + } + + updateReq.TemplateID = fmt.Sprintf("%d", tplID) + + response, err := apiCli.Templates.UpdateTemplate(updateReq, authToken) + if err != nil { + return fmt.Errorf("failed to update template: %q", err) + } + + formatOneTemplate(response.Payload) + return nil + }, +} + +var templateListCmd = &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + SilenceUsage: true, + Short: "List templates", + Long: `List available runner install templates.`, + RunE: func(cmd *cobra.Command, _ []string) error { + if needsInit { + return errNeedsInitError + } + + listReq := apiTemplates.NewListTemplatesParams() + + if cmd.Flags().Changed("name") { + listReq.PartialName = &templateName + } + + if cmd.Flags().Changed("os-type") { + listReq.OsType = &templateOSType + } + + if cmd.Flags().Changed("forge-type") { + listReq.ForgeType = &templateForgeType + } + + response, err := apiCli.Templates.ListTemplates(listReq, authToken) + if err != nil { + return fmt.Errorf("failed to list templates: %q", err) + } + formatTemplateList(response.Payload) + return nil + }, +} + +var templateShowCmd = &cobra.Command{ + Use: "show [flags] template_name_or_id", + SilenceUsage: true, + Short: "Show template", + Long: `Show template details.`, + RunE: func(_ *cobra.Command, args []string) error { + if needsInit { + return errNeedsInitError + } + + if len(args) != 1 { + return fmt.Errorf("invalid number of parameters; requires template_name_or_id") + } + + tplID, err := resolveTemplate(args[0]) + if err != nil { + return fmt.Errorf("failed to determine template ID: %s", err) + } + + getReq := apiTemplates.NewGetTemplateParams() + getReq.TemplateID = tplID + + response, err := apiCli.Templates.GetTemplate(getReq, authToken) + if err != nil { + return fmt.Errorf("failed to get template: %q", err) + } + formatOneTemplate(response.Payload) + return nil + }, +} + +var templateDownloadCmd = &cobra.Command{ + Use: "download [flags] template_name_or_id", + SilenceUsage: true, + Short: "Download template", + Long: `Download a specific template to a file.`, + RunE: func(_ *cobra.Command, args []string) error { + if needsInit { + return errNeedsInitError + } + + if len(args) != 1 { + return fmt.Errorf("invalid number of parameters; requires template_name_or_id") + } + + tplID, err := resolveTemplate(args[0]) + if err != nil { + return fmt.Errorf("failed to determine template ID: %q", err) + } + + getReq := apiTemplates.NewGetTemplateParams() + getReq.TemplateID = tplID + + response, err := apiCli.Templates.GetTemplate(getReq, authToken) + if err != nil { + return fmt.Errorf("failed to get template: %q", err) + } + + if _, err := os.Stat(templatePath); err == nil { + return fmt.Errorf("destination path already exists; will not overwrite") + } + + if err := os.WriteFile(templatePath, response.Payload.Data, 0o600); err != nil { + return fmt.Errorf("failed to save file %s: %s", templatePath, err) + } + return nil + }, +} + +var templateDeleteCmd = &cobra.Command{ + Use: "delete", + Aliases: []string{"remove", "rm"}, + SilenceUsage: true, + Short: "Delete template", + Long: `Delete a specific template.`, + RunE: func(_ *cobra.Command, args []string) error { + if needsInit { + return errNeedsInitError + } + if len(args) != 1 { + return fmt.Errorf("invalid number of parameters; requires template_name_or_id") + } + + tplID, err := resolveTemplate(args[0]) + if err != nil { + return fmt.Errorf("failed to determine template ID: %q", err) + } + + deleteReq := apiTemplates.NewDeleteTemplateParams() + deleteReq.TemplateID = tplID + + if err := apiCli.Templates.DeleteTemplate(deleteReq, authToken); err != nil { + return fmt.Errorf("failed to delete template: %s", err) + } + return nil + }, +} + +var templateCopyCmd = &cobra.Command{ + Use: "copy [flags] source_template new_name", + Aliases: []string{"clone", "cp"}, + SilenceUsage: true, + Short: "Clone a template", + Long: `Create a new template using an existing template as a source.`, + RunE: func(cmd *cobra.Command, args []string) error { + if needsInit { + return errNeedsInitError + } + + if len(args) != 2 { + return fmt.Errorf("invalid number of parameters; requires source_template and new_name") + } + + tplID, err := resolveTemplate(args[0]) + if err != nil { + return fmt.Errorf("failed to determine template ID: %q", err) + } + + getReq := apiTemplates.NewGetTemplateParams() + getReq.TemplateID = tplID + + response, err := apiCli.Templates.GetTemplate(getReq, authToken) + if err != nil { + return fmt.Errorf("failed to get source template: %q", err) + } + + createTemplateReq := apiTemplates.NewCreateTemplateParams() + createTemplateReq.Body.Data = response.Payload.Data + createTemplateReq.Body.ForgeType = response.Payload.ForgeType + createTemplateReq.Body.OSType = response.Payload.OSType + + createTemplateReq.Body.Name = args[1] + + if cmd.Flags().Changed("description") { + createTemplateReq.Body.Description = templateDescription + } else { + createTemplateReq.Body.Description = response.Payload.Description + } + + newResponse, err := apiCli.Templates.CreateTemplate(createTemplateReq, authToken) + if err != nil { + return fmt.Errorf("failed to create template: %s", err) + } + formatOneTemplate(newResponse.Payload) + return nil + }, +} + +var templateEditCmd = &cobra.Command{ + Use: "edit [flags] template_name_or_id", + SilenceUsage: true, + Short: "Edit runner install templates", + Long: `Edit templates with optional basic vim keybindings.`, + RunE: func(_ *cobra.Command, args []string) error { + if needsInit { + return errNeedsInitError + } + if len(args) != 1 { + return fmt.Errorf("invalid number of parameters; requires template_name_or_id") + } + + tplID, err := resolveTemplate(args[0]) + if err != nil { + return fmt.Errorf("failed to determine template ID: %q", err) + } + + getReq := apiTemplates.NewGetTemplateParams() + getReq.TemplateID = tplID + + response, err := apiCli.Templates.GetTemplate(getReq, authToken) + if err != nil { + return fmt.Errorf("failed to get source template: %q", err) + } + + ed := editor.NewEditor() + + newContent, saved, err := ed.EditText(string(response.Payload.Data)) + if err != nil { + return fmt.Errorf("failed to open editor: %s", err) + } + + if saved && newContent != string(response.Payload.Data) { + updateReq := apiTemplates.NewUpdateTemplateParams() + updateReq.TemplateID = fmt.Sprintf("%d", response.Payload.ID) + updateReq.Body.Data = []byte(newContent) + + _, err = apiCli.Templates.UpdateTemplate(updateReq, authToken) + if err != nil { + return fmt.Errorf("failed to update template: %s", err) + } + fmt.Println("changes saved successfully") + } else { + fmt.Println("changes discarded") + } + return nil + }, +} + +func init() { + templateCreateCmd.Flags().StringVar(&templateName, "name", "", "Name of the template.") + templateCreateCmd.Flags().StringVar(&templateDescription, "description", "", "Template description.") + templateCreateCmd.Flags().StringVar(&templatePath, "path", "", "Path on disk to the template.") + templateCreateCmd.Flags().StringVar(&templateForgeType, "forge-type", "", "The forge type of the template. Supported values: github, gitea.") + templateCreateCmd.Flags().StringVar(&templateOSType, "os-type", "", "Operating system type (windows, linux, etc).") + + templateCreateCmd.MarkFlagRequired("name") //nolint + templateCreateCmd.MarkFlagRequired("path") //nolint + templateCreateCmd.MarkFlagRequired("forge-type") //nolint + templateCreateCmd.MarkFlagRequired("os-type") //nolint + + templateUpdateCmd.Flags().StringVar(&templateName, "name", "", "Name of the template.") + templateUpdateCmd.Flags().StringVar(&templateDescription, "description", "", "Template description.") + templateUpdateCmd.Flags().StringVar(&templatePath, "path", "", "Path on disk to the template.") + + templateListCmd.Flags().StringVar(&templateName, "name", "", "Full or partial name to search by.") + templateListCmd.Flags().StringVar(&templateForgeType, "forge-type", "", "The forge type of the template. Supported values: github, gitea.") + templateListCmd.Flags().StringVar(&templateOSType, "os-type", "", "Operating system type (windows, linux, etc).") + + templateDownloadCmd.Flags().StringVar(&templatePath, "path", "", "Destination path for the download.") + templateDownloadCmd.MarkFlagRequired("path") //nolint + + templateCopyCmd.Flags().StringVar(&templateDescription, "description", "", "Template description.") + + templatesCmd.AddCommand(templateCreateCmd) + templatesCmd.AddCommand(templateShowCmd) + templatesCmd.AddCommand(templateListCmd) + templatesCmd.AddCommand(templateUpdateCmd) + templatesCmd.AddCommand(templateDeleteCmd) + templatesCmd.AddCommand(templateCopyCmd) + templatesCmd.AddCommand(templateEditCmd) + templatesCmd.AddCommand(templateDownloadCmd) + rootCmd.AddCommand(templatesCmd) +} + +func formatOneTemplate(template params.Template) { + if outputFormat == common.OutputFormatJSON { + printAsJSON(template) + return + } + t := table.NewWriter() + header := table.Row{"Field", "Value"} + t.AppendHeader(header) + + t.AppendRow(table.Row{"ID", template.ID}) + t.AppendRow(table.Row{"Created At", template.CreatedAt}) + t.AppendRow(table.Row{"Updated At", template.UpdatedAt}) + t.AppendRow(table.Row{"Name", template.Name}) + t.AppendRow(table.Row{"Description", template.Description}) + t.AppendRow(table.Row{"Owner", template.Owner}) + t.AppendRow(table.Row{"Forge Type", template.ForgeType}) + t.AppendRow(table.Row{"OS Type", template.OSType}) + + t.SetColumnConfigs([]table.ColumnConfig{ + {Number: 1, AutoMerge: true}, + {Number: 2, AutoMerge: false, WidthMax: 100}, + }) + fmt.Println(t.Render()) +} + +func formatTemplateList(templates params.Templates) { + if outputFormat == common.OutputFormatJSON { + printAsJSON(templates) + return + } + t := table.NewWriter() + header := table.Row{"ID", "Name", "Description", "Forge Type", "OS Type", "Owner"} + t.AppendHeader(header) + for _, val := range templates { + row := table.Row{val.ID, val.Name, val.Description, val.ForgeType, val.OSType, val.Owner} + t.AppendRow(row) + t.AppendSeparator() + } + fmt.Println(t.Render()) +} diff --git a/cmd/garm-cli/cmd/util.go b/cmd/garm-cli/cmd/util.go index 26f57abb..a1e2ab85 100644 --- a/cmd/garm-cli/cmd/util.go +++ b/cmd/garm-cli/cmd/util.go @@ -2,6 +2,8 @@ package cmd import ( "fmt" + "math" + "strconv" "strings" "github.com/google/uuid" @@ -9,8 +11,47 @@ import ( apiClientEnterprises "github.com/cloudbase/garm/client/enterprises" apiClientOrgs "github.com/cloudbase/garm/client/organizations" apiClientRepos "github.com/cloudbase/garm/client/repositories" + apiTemplates "github.com/cloudbase/garm/client/templates" + "github.com/cloudbase/garm/params" ) +func resolveTemplateAsUint(nameOrID string) (uint, error) { + if parsed, err := strconv.ParseUint(nameOrID, 10, 64); err == nil { + if parsed > math.MaxUint { + return 0, fmt.Errorf("ID is too large") + } + return uint(parsed), nil + } + + listTplReq := apiTemplates.NewListTemplatesParams() + listTplReq.PartialName = &nameOrID + response, err := apiCli.Templates.ListTemplates(listTplReq, authToken) + if err != nil { + return 0, fmt.Errorf("failed to list templates") + } + if len(response.Payload) == 0 { + return 0, fmt.Errorf("no such template: %s", nameOrID) + } + exactMatches := []params.Template{} + for _, val := range response.Payload { + if val.Name == nameOrID { + exactMatches = append(exactMatches, val) + } + } + if len(exactMatches) > 1 { + return 0, fmt.Errorf("multiple templates found with name: %s", nameOrID) + } + return exactMatches[0].ID, nil +} + +func resolveTemplate(nameOrID string) (float64, error) { + id, err := resolveTemplateAsUint(nameOrID) + if err != nil { + return 0, err + } + return float64(id), nil +} + func resolveRepository(nameOrID, endpoint string) (string, error) { if nameOrID == "" { return "", fmt.Errorf("missing repository name or ID") diff --git a/cmd/garm-cli/editor/editor.go b/cmd/garm-cli/editor/editor.go new file mode 100644 index 00000000..a87ce88d --- /dev/null +++ b/cmd/garm-cli/editor/editor.go @@ -0,0 +1,783 @@ +package editor + +import ( + "fmt" + "strings" + + "github.com/gdamore/tcell/v2" + "github.com/rivo/tview" +) + +// VimMode represents the current vim editing mode +type VimMode int + +const ( + VimNormal VimMode = iota + VimInsert + VimSearch +) + +// Editor represents a text editor that can be launched with initial content +type Editor struct { + app *tview.Application + pages *tview.Pages + editor *tview.TextArea + footer *tview.TextView + result string + saved bool + useVim bool + vimMode VimMode + waitingForSecondG bool + searchTerm string + searchInput *tview.InputField +} + +// NewEditor creates a new editor instance +func NewEditor() *Editor { + e := &Editor{ + app: tview.NewApplication(), + pages: tview.NewPages(), + useVim: false, + vimMode: VimNormal, + } + return e +} + +// SetVimMode enables or disables vim modal editing +func (e *Editor) SetVimMode(enabled bool) { + e.useVim = enabled + if enabled { + e.vimMode = VimNormal + } +} + +// toggleVimMode toggles vim mode on/off and updates the UI +func (e *Editor) toggleVimMode() { + e.useVim = !e.useVim + if e.useVim { + e.vimMode = VimNormal + } + e.updateTitle() + e.updateFooter() +} + +// updateTitle updates the editor title to show current vim mode +func (e *Editor) updateTitle() { + if e.useVim { + var modeStr string + switch e.vimMode { + case VimNormal: + modeStr = "NORMAL" + case VimInsert: + modeStr = "INSERT" + case VimSearch: + modeStr = "SEARCH" + } + e.editor.SetTitle(fmt.Sprintf("Text Editor (VIM - %s)", modeStr)) + } else { + e.editor.SetTitle("Text Editor") + } +} + +// resetGCommand resets the gg command state +func (e *Editor) resetGCommand() { + e.waitingForSecondG = false +} + +// updateFooter updates the footer text based on current mode +func (e *Editor) updateFooter() { + if e.footer == nil { + return + } + + footerText := "[yellow]Ctrl+S[white]: Save & Exit | [yellow]Ctrl+Q[white]: Quit | [yellow]Alt+H[white]: Help | [yellow]Alt+V[white]: Toggle VIM" + if e.useVim { + switch e.vimMode { + case VimNormal: + footerText += " | [green]VIM NORMAL[white]: i/a/o for insert, h/j/k/l/arrows nav, G/gg, / search, n/N find next/prev, x del" + case VimInsert: + footerText += " | [green]VIM INSERT[white]: Esc for normal mode" + case VimSearch: + footerText += " | [green]VIM SEARCH[white]: Enter search term, Enter to find, Esc to cancel" + } + } + e.footer.SetText(footerText) +} + +// handleVimInput manages vim modal input handling +func (e *Editor) handleVimInput(event *tcell.EventKey) *tcell.EventKey { + switch e.vimMode { + case VimNormal: + return e.handleVimNormalMode(event) + case VimInsert: + return e.handleVimInsertMode(event) + case VimSearch: + return e.handleVimSearchMode(event) + } + return event +} + +// handleVimNormalMode handles input in vim normal mode +func (e *Editor) handleVimNormalMode(event *tcell.EventKey) *tcell.EventKey { + // Handle global commands first + if result := e.handleGlobalCommands(event); result != event { + return result + } + + // Handle vim character-based commands + if result := e.handleVimCharCommands(event); result != event { + return result + } + + // Handle key-based navigation + return e.handleKeyNavigation(event) +} + +// handleGlobalCommands handles global commands available in all modes +func (e *Editor) handleGlobalCommands(event *tcell.EventKey) *tcell.EventKey { + switch { + case event.Key() == tcell.KeyCtrlS: + e.result = e.editor.GetText() + e.saved = true + e.app.Stop() + return nil + case event.Key() == tcell.KeyCtrlQ: + e.app.Stop() + return nil + case event.Rune() == 'h' && event.Modifiers()&tcell.ModAlt != 0: + e.pages.SwitchToPage("help") + return nil + case event.Key() == tcell.KeyCtrlUnderscore: + e.pages.SwitchToPage("help") + return nil + } + return event // Continue processing +} + +// handleVimCharCommands handles vim character-based commands +func (e *Editor) handleVimCharCommands(event *tcell.EventKey) *tcell.EventKey { + // Handle mode switching commands + if result := e.handleModeSwitching(event); result != event { + return result + } + + // Handle navigation commands + if result := e.handleCharNavigation(event); result != event { + return result + } + + // Handle editing commands + return e.handleEditingCommands(event) +} + +// handleModeSwitching handles commands that switch vim modes +func (e *Editor) handleModeSwitching(event *tcell.EventKey) *tcell.EventKey { + switch event.Rune() { + case 'i': + e.resetGCommand() + e.enterInsertMode() + return nil + case 'a': + e.resetGCommand() + e.enterInsertMode() + return tcell.NewEventKey(tcell.KeyRight, 0, tcell.ModNone) + case 'A': + e.resetGCommand() + e.enterInsertMode() + return tcell.NewEventKey(tcell.KeyEnd, 0, tcell.ModNone) + case 'I': + e.resetGCommand() + e.enterInsertMode() + return tcell.NewEventKey(tcell.KeyHome, 0, tcell.ModNone) + case 'o': + e.resetGCommand() + e.enterInsertMode() + e.insertNewLineBelow() + return nil + case 'O': + e.resetGCommand() + e.enterInsertMode() + e.insertNewLineAbove() + return nil + } + return event // Continue processing +} + +// enterInsertMode switches to insert mode +func (e *Editor) enterInsertMode() { + e.vimMode = VimInsert + e.updateTitle() + e.updateFooter() +} + +// exitInsertMode switches to normal mode +func (e *Editor) exitInsertMode() { + if e.vimMode != VimInsert { + return + } + + e.vimMode = VimNormal + e.updateTitle() + e.updateFooter() +} + +// handleCharNavigation handles character-based navigation commands +func (e *Editor) handleCharNavigation(event *tcell.EventKey) *tcell.EventKey { + switch event.Rune() { + case 'h': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyLeft, 0, tcell.ModNone) + case 'j': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyDown, 0, tcell.ModNone) + case 'k': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyUp, 0, tcell.ModNone) + case 'l': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyRight, 0, tcell.ModNone) + case '0': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyHome, 0, tcell.ModNone) + case '$': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyEnd, 0, tcell.ModNone) + case 'w': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyRight, 0, tcell.ModCtrl) + case 'b': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyLeft, 0, tcell.ModCtrl) + case 'G': + e.resetGCommand() + e.goToEnd() + return nil + case 'g': + return e.handleGCommand(event) + } + return event // Continue processing +} + +// handleEditingCommands handles editing and search commands +func (e *Editor) handleEditingCommands(event *tcell.EventKey) *tcell.EventKey { + switch event.Rune() { + case 'x': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyDelete, 0, tcell.ModNone) + case 'X': + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyBackspace, 0, tcell.ModNone) + case 'd': + e.resetGCommand() + return e.handleDeleteCommand(event) + case '/': + e.resetGCommand() + e.startSearch() + return nil + case 'n': + e.resetGCommand() + e.findNext() + return nil + case 'N': + e.resetGCommand() + e.findPrevious() + return nil + } + + return event // Continue processing +} + +// handleKeyNavigation handles key-based navigation (arrow keys, etc.) +func (e *Editor) handleKeyNavigation(event *tcell.EventKey) *tcell.EventKey { + switch event.Key() { + case tcell.KeyEscape: + e.resetGCommand() + return nil + case tcell.KeyLeft: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyLeft, 0, tcell.ModNone) + case tcell.KeyDown: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyDown, 0, tcell.ModNone) + case tcell.KeyUp: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyUp, 0, tcell.ModNone) + case tcell.KeyRight: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyRight, 0, tcell.ModNone) + case tcell.KeyHome: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyHome, 0, tcell.ModNone) + case tcell.KeyEnd: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyEnd, 0, tcell.ModNone) + case tcell.KeyPgUp: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyPgUp, 0, tcell.ModNone) + case tcell.KeyPgDn: + e.resetGCommand() + return tcell.NewEventKey(tcell.KeyPgDn, 0, tcell.ModNone) + } + + // Block all other text input in normal mode + return nil +} + +// handleVimInsertMode handles input in vim insert mode +func (e *Editor) handleVimInsertMode(event *tcell.EventKey) *tcell.EventKey { + switch event.Key() { + case tcell.KeyEscape: + e.exitInsertMode() + return nil + case tcell.KeyCtrlS: + e.result = e.editor.GetText() + e.saved = true + e.app.Stop() + return nil + case tcell.KeyCtrlQ: + e.app.Stop() + return nil + } + + // Pass through all other keys in insert mode + return event +} + +// Helper functions for vim operations +func (e *Editor) insertNewLineBelow() { + // Move to end of current line and insert newline + e.editor.InputHandler()(tcell.NewEventKey(tcell.KeyEnd, 0, tcell.ModNone), nil) + e.editor.InputHandler()(tcell.NewEventKey(tcell.KeyEnter, 0, tcell.ModNone), nil) +} + +func (e *Editor) insertNewLineAbove() { + // Move to beginning of line, insert newline, move up + e.editor.InputHandler()(tcell.NewEventKey(tcell.KeyHome, 0, tcell.ModNone), nil) + e.editor.InputHandler()(tcell.NewEventKey(tcell.KeyEnter, 0, tcell.ModNone), nil) + e.editor.InputHandler()(tcell.NewEventKey(tcell.KeyUp, 0, tcell.ModNone), nil) +} + +func (e *Editor) goToEnd() { + // Go to end of document by setting text with cursor at end + text := e.editor.GetText() + e.editor.SetText(text, true) // true = cursor at end +} + +func (e *Editor) goToBeginning() { + // Go to beginning of document by setting text with cursor at beginning + text := e.editor.GetText() + e.editor.SetText(text, false) // false = cursor at beginning +} + +func (e *Editor) handleGCommand(_ *tcell.EventKey) *tcell.EventKey { + // For now, let's implement a simpler approach + // In vim, single 'g' usually requires a second command + // But let's make gg work by tracking the state in the editor instance + if e.waitingForSecondG { + // This is the second 'g' - execute gg (go to beginning) + e.waitingForSecondG = false + e.goToBeginning() + return nil + } + // First 'g' press - wait for second one + e.waitingForSecondG = true + return nil +} + +func (e *Editor) handleDeleteCommand(_ *tcell.EventKey) *tcell.EventKey { + // For now, just implement x (delete character) + // A full implementation would handle dd, dw, etc. + return tcell.NewEventKey(tcell.KeyDelete, 0, tcell.ModNone) +} + +// handleVimSearchMode handles input in vim search mode +func (e *Editor) handleVimSearchMode(event *tcell.EventKey) *tcell.EventKey { + // Search mode is handled by the modal dialog, so this shouldn't be called + // But keep it for consistency + switch event.Key() { + case tcell.KeyEscape: + e.cancelSearch() + return nil + case tcell.KeyCtrlS: + e.result = e.editor.GetText() + e.saved = true + e.app.Stop() + return nil + case tcell.KeyCtrlQ: + e.app.Stop() + return nil + } + + return event +} + +// startSearch enters search mode and shows search input +func (e *Editor) startSearch() { + e.vimMode = VimSearch + e.updateTitle() + e.updateFooter() + e.showSearchInput() +} + +// cancelSearch exits search mode without searching +func (e *Editor) cancelSearch() { + e.vimMode = VimNormal + e.updateTitle() + e.updateFooter() + e.hideSearchInput() +} + +// findNext finds the next occurrence of the search term +func (e *Editor) findNext() { + if e.searchTerm == "" { + return + } + + text := e.editor.GetText() + fromRow, fromCol, _, _ := e.editor.GetCursor() + + // Convert current position to linear position + lines := strings.Split(text, "\n") + currentPos := 0 + for i := 0; i < fromRow && i < len(lines); i++ { + currentPos += len(lines[i]) + 1 // +1 for newline + } + currentPos += fromCol + + // Search from current position + 1 + searchFrom := currentPos + 1 + if searchFrom < len(text) { + index := strings.Index(text[searchFrom:], e.searchTerm) + if index != -1 { + e.goToPosition(searchFrom + index) + return + } + } + + // Wrap around search from beginning + index := strings.Index(text, e.searchTerm) + if index != -1 && index < currentPos { + e.goToPosition(index) + } +} + +// findPrevious finds the previous occurrence of the search term +func (e *Editor) findPrevious() { + if e.searchTerm == "" { + return + } + + text := e.editor.GetText() + fromRow, fromCol, _, _ := e.editor.GetCursor() + + // Convert current position to linear position + lines := strings.Split(text, "\n") + currentPos := 0 + for i := 0; i < fromRow && i < len(lines); i++ { + currentPos += len(lines[i]) + 1 // +1 for newline + } + currentPos += fromCol + + // Search backwards from current position + if currentPos > 0 { + index := strings.LastIndex(text[:currentPos], e.searchTerm) + if index != -1 { + e.goToPosition(index) + return + } + } + + // Wrap around search from end + index := strings.LastIndex(text, e.searchTerm) + if index != -1 && index > currentPos { + e.goToPosition(index) + } +} + +// goToPosition moves cursor to a specific character position in the text +func (e *Editor) goToPosition(pos int) { + text := e.editor.GetText() + if pos >= len(text) { + return + } + + // Simple approach: reset text with cursor at beginning, then move right + e.editor.SetText(text, false) + + // Move cursor to the right position by simulating key presses + for range pos { + e.editor.InputHandler()(tcell.NewEventKey(tcell.KeyRight, 0, tcell.ModNone), nil) + } +} + +// showSearchInput displays the search input field +func (e *Editor) showSearchInput() { + // Create search input field with proper handling + e.searchInput = tview.NewInputField(). + SetLabel("Search: "). + SetFieldWidth(30). + SetText("") + + // Set input capture for the search input + e.searchInput.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + if event.Key() == tcell.KeyEnter { + // Get search term and perform search + e.searchTerm = e.searchInput.GetText() + if e.searchTerm != "" { + e.findNext() + } + e.vimMode = VimNormal + e.updateTitle() + e.updateFooter() + e.pages.RemovePage("search") + e.pages.SwitchToPage("main") + e.app.SetFocus(e.editor) + return nil + } else if event.Key() == tcell.KeyEscape { + // Cancel search + e.vimMode = VimNormal + e.updateTitle() + e.updateFooter() + e.pages.RemovePage("search") + e.pages.SwitchToPage("main") + e.app.SetFocus(e.editor) + return nil + } + return event + }) + + // Create a container with border and title + flex := tview.NewFlex(). + SetDirection(tview.FlexRow). + AddItem(nil, 0, 1, false). + AddItem(e.searchInput, 1, 1, true). + AddItem(nil, 0, 1, false) + + container := tview.NewFlex(). + AddItem(nil, 0, 1, false). + AddItem(flex, 40, 1, true). + AddItem(nil, 0, 1, false) + + // Create bordered frame + frame := tview.NewFrame(container). + SetBorders(1, 1, 1, 1, 2, 2). + AddText("Search", true, tview.AlignCenter, tcell.ColorWhite) + + // Add to pages and switch + e.pages.AddPage("search", frame, true, true) + e.app.SetFocus(e.searchInput) +} + +// hideSearchInput hides the search input field +func (e *Editor) hideSearchInput() { + e.pages.RemovePage("search") + e.pages.SwitchToPage("main") + e.app.SetFocus(e.editor) +} + +// EditText launches the editor with initial content and returns the edited text +func (e *Editor) EditText(initialContent string) (string, bool, error) { + e.result = initialContent + e.saved = false + + e.editor = tview.NewTextArea(). + SetText(initialContent, false). + SetWrap(false) + + e.editor.SetBorder(true). + SetTitleAlign(tview.AlignCenter) + + e.updateTitle() + + e.editor.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + // Handle global commands first (available in all modes) + switch { + case event.Key() == tcell.KeyCtrlS: + e.result = e.editor.GetText() + e.saved = true + e.app.Stop() + return nil + case event.Key() == tcell.KeyCtrlQ: + e.app.Stop() + return nil + case event.Rune() == 'h' && event.Modifiers()&tcell.ModAlt != 0: + e.pages.SwitchToPage("help") + return nil + case event.Key() == tcell.KeyCtrlUnderscore: + e.pages.SwitchToPage("help") + return nil + case event.Rune() == 'v' && event.Modifiers()&tcell.ModAlt != 0: + // Toggle vim mode + e.toggleVimMode() + return nil + } + + // Handle vim keybindings if enabled + if e.useVim { + return e.handleVimInput(event) + } + + return event + }) + + // Create footer with shortcuts + e.footer = tview.NewTextView(). + SetDynamicColors(true). + SetTextAlign(tview.AlignCenter) + + e.updateFooter() + + // Create layout with editor and footer + grid := tview.NewGrid(). + SetRows(0, 1). + AddItem(e.editor, 0, 0, 1, 1, 0, 0, true). + AddItem(e.footer, 1, 0, 1, 1, 0, 0, false) + + // Create help pages + e.createHelpPages() + + // Add main editor page + e.pages.AddPage("main", grid, true, true) + + e.app.SetRoot(e.pages, true) + + // Run the editor + err := e.app.Run() + if err != nil { + return "", false, err + } + + return e.result, e.saved, nil +} + +// createHelpPages creates the help system with multiple pages +func (e *Editor) createHelpPages() { + // Create three separate help pages + help1 := tview.NewTextView() + help1.SetDynamicColors(true) + navText := `[green]Navigation[white] + +[yellow]Arrow Keys[white]: Move cursor around +[yellow]Ctrl-A, Home[white]: Move to beginning of line +[yellow]Ctrl-E, End[white]: Move to end of line +[yellow]Ctrl-F, Page Down[white]: Move down by one page +[yellow]Ctrl-B, Page Up[white]: Move up by one page +[yellow]Alt-Up[white]: Scroll page up +[yellow]Alt-Down[white]: Scroll page down +[yellow]Alt-Left[white]: Scroll page left +[yellow]Alt-Right[white]: Scroll page right +[yellow]Alt-B, Ctrl-Left[white]: Move back by one word +[yellow]Alt-F, Ctrl-Right[white]: Move forward by one word` + + if e.useVim { + navText += ` + +[green]VIM Navigation (Normal Mode)[white] +[yellow]h/j/k/l or Arrow Keys[white]: Move left/down/up/right +[yellow]0/$ or Home/End[white]: Beginning/end of line +[yellow]w/b[white]: Word forward/backward +[yellow]gg/G[white]: Beginning/end of document +[yellow]Page Up/Down[white]: Page navigation + +[green]VIM Mode Switching[white] +[yellow]i[white]: Insert mode at cursor +[yellow]a[white]: Insert mode after cursor +[yellow]A[white]: Insert mode at end of line +[yellow]I[white]: Insert mode at beginning of line +[yellow]o[white]: New line below + insert mode +[yellow]O[white]: New line above + insert mode + +[green]VIM Editing[white] +[yellow]x/X[white]: Delete character right/left +[yellow]Esc[white]: Return to normal mode +[yellow]Alt+V[white]: Toggle VIM mode on/off + +[green]VIM Search[white] +[yellow]/[white]: Search for text (opens dialog) +[yellow]n[white]: Find next occurrence +[yellow]N[white]: Find previous occurrence` + } + + navText += ` + +[blue]Press Enter for more help, Escape to return to editor[white]` + + help1.SetText(navText) + help1.SetBorder(true) + help1.SetTitle("Help - Navigation") + + help2 := tview.NewTextView() + help2.SetDynamicColors(true) + help2.SetText(`[green]Editing[white] + +Type to enter text. +[yellow]Ctrl-H, Backspace[white]: Delete left character +[yellow]Ctrl-D, Delete[white]: Delete right character +[yellow]Ctrl-K[white]: Delete to end of line +[yellow]Ctrl-W[white]: Delete rest of word +[yellow]Ctrl-U[white]: Delete current line + +[green]Selection & Clipboard[white] + +Hold [yellow]Shift[white] + movement keys to select +Double-click to select a word +[yellow]Ctrl-L[white]: Select entire text +[yellow]Ctrl-Q[white]: Copy selection +[yellow]Ctrl-X[white]: Cut selection +[yellow]Ctrl-V[white]: Paste + +[blue]Press Enter for more help, Escape to return to editor[white]`) + help2.SetBorder(true) + help2.SetTitle("Help - Editing") + + help3 := tview.NewTextView() + help3.SetDynamicColors(true) + help3.SetText(`[green]Editor Commands[white] + +[yellow]Ctrl-S[white]: Save changes and exit editor +[yellow]Ctrl-Q[white]: Quit without saving changes +[yellow]Alt+H[white]: Show this help +[yellow]Alt+V[white]: Toggle VIM mode on/off + +[green]Mouse Support[white] + +Click to position cursor +Drag to select text +Double-click to select word +Mouse wheel to scroll + +[blue]Press Enter to cycle back, Escape to return to editor[white]`) + help3.SetBorder(true) + help3.SetTitle("Help - Commands") + + helpPages := tview.NewPages() + helpPages.AddPage("help1", help1, true, true) + helpPages.AddPage("help2", help2, true, false) + helpPages.AddPage("help3", help3, true, false) + + currentHelpPage := 0 + helpPageNames := []string{"help1", "help2", "help3"} + + // Set input capture for all help pages + for _, helpView := range []*tview.TextView{help1, help2, help3} { + helpView.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + if event.Key() == tcell.KeyEscape { + e.pages.SwitchToPage("main") + return nil + } else if event.Key() == tcell.KeyEnter { + currentHelpPage = (currentHelpPage + 1) % len(helpPageNames) + helpPages.SwitchToPage(helpPageNames[currentHelpPage]) + return nil + } + return event + }) + } + + // Center the help dialog + helpGrid := tview.NewGrid(). + SetColumns(0, 80, 0). + SetRows(0, 25, 0). + AddItem(helpPages, 1, 1, 1, 1, 0, 0, true) + + e.pages.AddPage("help", helpGrid, true, false) +} diff --git a/database/common/mocks/Store.go b/database/common/mocks/Store.go index 024a1271..9635bbd3 100644 --- a/database/common/mocks/Store.go +++ b/database/common/mocks/Store.go @@ -5,8 +5,10 @@ package mocks import ( context "context" - params "github.com/cloudbase/garm/params" + garm_provider_commonparams "github.com/cloudbase/garm-provider-common/params" mock "github.com/stretchr/testify/mock" + + params "github.com/cloudbase/garm/params" ) // Store is an autogenerated mock type for the Store type @@ -923,6 +925,63 @@ func (_c *Store_CreateScaleSetInstance_Call) RunAndReturn(run func(context.Conte return _c } +// CreateTemplate provides a mock function with given fields: ctx, param +func (_m *Store) CreateTemplate(ctx context.Context, param params.CreateTemplateParams) (params.Template, error) { + ret := _m.Called(ctx, param) + + if len(ret) == 0 { + panic("no return value specified for CreateTemplate") + } + + var r0 params.Template + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, params.CreateTemplateParams) (params.Template, error)); ok { + return rf(ctx, param) + } + if rf, ok := ret.Get(0).(func(context.Context, params.CreateTemplateParams) params.Template); ok { + r0 = rf(ctx, param) + } else { + r0 = ret.Get(0).(params.Template) + } + + if rf, ok := ret.Get(1).(func(context.Context, params.CreateTemplateParams) error); ok { + r1 = rf(ctx, param) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Store_CreateTemplate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateTemplate' +type Store_CreateTemplate_Call struct { + *mock.Call +} + +// CreateTemplate is a helper method to define mock.On call +// - ctx context.Context +// - param params.CreateTemplateParams +func (_e *Store_Expecter) CreateTemplate(ctx interface{}, param interface{}) *Store_CreateTemplate_Call { + return &Store_CreateTemplate_Call{Call: _e.mock.On("CreateTemplate", ctx, param)} +} + +func (_c *Store_CreateTemplate_Call) Run(run func(ctx context.Context, param params.CreateTemplateParams)) *Store_CreateTemplate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(params.CreateTemplateParams)) + }) + return _c +} + +func (_c *Store_CreateTemplate_Call) Return(template params.Template, err error) *Store_CreateTemplate_Call { + _c.Call.Return(template, err) + return _c +} + +func (_c *Store_CreateTemplate_Call) RunAndReturn(run func(context.Context, params.CreateTemplateParams) (params.Template, error)) *Store_CreateTemplate_Call { + _c.Call.Return(run) + return _c +} + // CreateUser provides a mock function with given fields: ctx, user func (_m *Store) CreateUser(ctx context.Context, user params.NewUserParams) (params.User, error) { ret := _m.Called(ctx, user) @@ -1639,6 +1698,53 @@ func (_c *Store_DeleteScaleSetByID_Call) RunAndReturn(run func(context.Context, return _c } +// DeleteTemplate provides a mock function with given fields: ctx, id +func (_m *Store) DeleteTemplate(ctx context.Context, id uint) error { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for DeleteTemplate") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint) error); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Store_DeleteTemplate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteTemplate' +type Store_DeleteTemplate_Call struct { + *mock.Call +} + +// DeleteTemplate is a helper method to define mock.On call +// - ctx context.Context +// - id uint +func (_e *Store_Expecter) DeleteTemplate(ctx interface{}, id interface{}) *Store_DeleteTemplate_Call { + return &Store_DeleteTemplate_Call{Call: _e.mock.On("DeleteTemplate", ctx, id)} +} + +func (_c *Store_DeleteTemplate_Call) Run(run func(ctx context.Context, id uint)) *Store_DeleteTemplate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint)) + }) + return _c +} + +func (_c *Store_DeleteTemplate_Call) Return(err error) *Store_DeleteTemplate_Call { + _c.Call.Return(err) + return _c +} + +func (_c *Store_DeleteTemplate_Call) RunAndReturn(run func(context.Context, uint) error) *Store_DeleteTemplate_Call { + _c.Call.Return(run) + return _c +} + // FindPoolsMatchingAllTags provides a mock function with given fields: ctx, entityType, entityID, tags func (_m *Store) FindPoolsMatchingAllTags(ctx context.Context, entityType params.ForgeEntityType, entityID string, tags []string) ([]params.Pool, error) { ret := _m.Called(ctx, entityType, entityID, tags) @@ -2792,6 +2898,120 @@ func (_c *Store_GetScaleSetByID_Call) RunAndReturn(run func(context.Context, uin return _c } +// GetTemplate provides a mock function with given fields: ctx, id +func (_m *Store) GetTemplate(ctx context.Context, id uint) (params.Template, error) { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for GetTemplate") + } + + var r0 params.Template + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint) (params.Template, error)); ok { + return rf(ctx, id) + } + if rf, ok := ret.Get(0).(func(context.Context, uint) params.Template); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Get(0).(params.Template) + } + + if rf, ok := ret.Get(1).(func(context.Context, uint) error); ok { + r1 = rf(ctx, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Store_GetTemplate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTemplate' +type Store_GetTemplate_Call struct { + *mock.Call +} + +// GetTemplate is a helper method to define mock.On call +// - ctx context.Context +// - id uint +func (_e *Store_Expecter) GetTemplate(ctx interface{}, id interface{}) *Store_GetTemplate_Call { + return &Store_GetTemplate_Call{Call: _e.mock.On("GetTemplate", ctx, id)} +} + +func (_c *Store_GetTemplate_Call) Run(run func(ctx context.Context, id uint)) *Store_GetTemplate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint)) + }) + return _c +} + +func (_c *Store_GetTemplate_Call) Return(_a0 params.Template, _a1 error) *Store_GetTemplate_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Store_GetTemplate_Call) RunAndReturn(run func(context.Context, uint) (params.Template, error)) *Store_GetTemplate_Call { + _c.Call.Return(run) + return _c +} + +// GetTemplateByName provides a mock function with given fields: ctx, name +func (_m *Store) GetTemplateByName(ctx context.Context, name string) (params.Template, error) { + ret := _m.Called(ctx, name) + + if len(ret) == 0 { + panic("no return value specified for GetTemplateByName") + } + + var r0 params.Template + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (params.Template, error)); ok { + return rf(ctx, name) + } + if rf, ok := ret.Get(0).(func(context.Context, string) params.Template); ok { + r0 = rf(ctx, name) + } else { + r0 = ret.Get(0).(params.Template) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Store_GetTemplateByName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTemplateByName' +type Store_GetTemplateByName_Call struct { + *mock.Call +} + +// GetTemplateByName is a helper method to define mock.On call +// - ctx context.Context +// - name string +func (_e *Store_Expecter) GetTemplateByName(ctx interface{}, name interface{}) *Store_GetTemplateByName_Call { + return &Store_GetTemplateByName_Call{Call: _e.mock.On("GetTemplateByName", ctx, name)} +} + +func (_c *Store_GetTemplateByName_Call) Run(run func(ctx context.Context, name string)) *Store_GetTemplateByName_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *Store_GetTemplateByName_Call) Return(_a0 params.Template, _a1 error) *Store_GetTemplateByName_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Store_GetTemplateByName_Call) RunAndReturn(run func(context.Context, string) (params.Template, error)) *Store_GetTemplateByName_Call { + _c.Call.Return(run) + return _c +} + // GetUser provides a mock function with given fields: ctx, user func (_m *Store) GetUser(ctx context.Context, user string) (params.User, error) { ret := _m.Called(ctx, user) @@ -4063,6 +4283,67 @@ func (_c *Store_ListScaleSetInstances_Call) RunAndReturn(run func(context.Contex return _c } +// ListTemplates provides a mock function with given fields: ctx, osType, forgeType, partialName +func (_m *Store) ListTemplates(ctx context.Context, osType *garm_provider_commonparams.OSType, forgeType *params.EndpointType, partialName *string) ([]params.Template, error) { + ret := _m.Called(ctx, osType, forgeType, partialName) + + if len(ret) == 0 { + panic("no return value specified for ListTemplates") + } + + var r0 []params.Template + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *garm_provider_commonparams.OSType, *params.EndpointType, *string) ([]params.Template, error)); ok { + return rf(ctx, osType, forgeType, partialName) + } + if rf, ok := ret.Get(0).(func(context.Context, *garm_provider_commonparams.OSType, *params.EndpointType, *string) []params.Template); ok { + r0 = rf(ctx, osType, forgeType, partialName) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]params.Template) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *garm_provider_commonparams.OSType, *params.EndpointType, *string) error); ok { + r1 = rf(ctx, osType, forgeType, partialName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Store_ListTemplates_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListTemplates' +type Store_ListTemplates_Call struct { + *mock.Call +} + +// ListTemplates is a helper method to define mock.On call +// - ctx context.Context +// - osType *garm_provider_commonparams.OSType +// - forgeType *params.EndpointType +// - partialName *string +func (_e *Store_Expecter) ListTemplates(ctx interface{}, osType interface{}, forgeType interface{}, partialName interface{}) *Store_ListTemplates_Call { + return &Store_ListTemplates_Call{Call: _e.mock.On("ListTemplates", ctx, osType, forgeType, partialName)} +} + +func (_c *Store_ListTemplates_Call) Run(run func(ctx context.Context, osType *garm_provider_commonparams.OSType, forgeType *params.EndpointType, partialName *string)) *Store_ListTemplates_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*garm_provider_commonparams.OSType), args[2].(*params.EndpointType), args[3].(*string)) + }) + return _c +} + +func (_c *Store_ListTemplates_Call) Return(_a0 []params.Template, _a1 error) *Store_ListTemplates_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Store_ListTemplates_Call) RunAndReturn(run func(context.Context, *garm_provider_commonparams.OSType, *params.EndpointType, *string) ([]params.Template, error)) *Store_ListTemplates_Call { + _c.Call.Return(run) + return _c +} + // LockJob provides a mock function with given fields: ctx, jobID, entityID func (_m *Store) LockJob(ctx context.Context, jobID int64, entityID string) error { ret := _m.Called(ctx, jobID, entityID) @@ -4951,6 +5232,64 @@ func (_c *Store_UpdateRepository_Call) RunAndReturn(run func(context.Context, st return _c } +// UpdateTemplate provides a mock function with given fields: ctx, id, param +func (_m *Store) UpdateTemplate(ctx context.Context, id uint, param params.UpdateTemplateParams) (params.Template, error) { + ret := _m.Called(ctx, id, param) + + if len(ret) == 0 { + panic("no return value specified for UpdateTemplate") + } + + var r0 params.Template + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint, params.UpdateTemplateParams) (params.Template, error)); ok { + return rf(ctx, id, param) + } + if rf, ok := ret.Get(0).(func(context.Context, uint, params.UpdateTemplateParams) params.Template); ok { + r0 = rf(ctx, id, param) + } else { + r0 = ret.Get(0).(params.Template) + } + + if rf, ok := ret.Get(1).(func(context.Context, uint, params.UpdateTemplateParams) error); ok { + r1 = rf(ctx, id, param) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Store_UpdateTemplate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateTemplate' +type Store_UpdateTemplate_Call struct { + *mock.Call +} + +// UpdateTemplate is a helper method to define mock.On call +// - ctx context.Context +// - id uint +// - param params.UpdateTemplateParams +func (_e *Store_Expecter) UpdateTemplate(ctx interface{}, id interface{}, param interface{}) *Store_UpdateTemplate_Call { + return &Store_UpdateTemplate_Call{Call: _e.mock.On("UpdateTemplate", ctx, id, param)} +} + +func (_c *Store_UpdateTemplate_Call) Run(run func(ctx context.Context, id uint, param params.UpdateTemplateParams)) *Store_UpdateTemplate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint), args[2].(params.UpdateTemplateParams)) + }) + return _c +} + +func (_c *Store_UpdateTemplate_Call) Return(template params.Template, err error) *Store_UpdateTemplate_Call { + _c.Call.Return(template, err) + return _c +} + +func (_c *Store_UpdateTemplate_Call) RunAndReturn(run func(context.Context, uint, params.UpdateTemplateParams) (params.Template, error)) *Store_UpdateTemplate_Call { + _c.Call.Return(run) + return _c +} + // UpdateUser provides a mock function with given fields: ctx, user, param func (_m *Store) UpdateUser(ctx context.Context, user string, param params.UpdateUserParams) (params.User, error) { ret := _m.Called(ctx, user, param) diff --git a/database/common/store.go b/database/common/store.go index 0cf5d929..525560de 100644 --- a/database/common/store.go +++ b/database/common/store.go @@ -17,6 +17,7 @@ package common import ( "context" + commonParams "github.com/cloudbase/garm-provider-common/params" "github.com/cloudbase/garm/params" ) @@ -168,6 +169,15 @@ type GiteaCredentialsStore interface { DeleteGiteaCredentials(ctx context.Context, id uint) (err error) } +type TemplateStore interface { + ListTemplates(ctx context.Context, osType *commonParams.OSType, forgeType *params.EndpointType, partialName *string) ([]params.Template, error) + CreateTemplate(ctx context.Context, param params.CreateTemplateParams) (template params.Template, err error) + GetTemplate(ctx context.Context, id uint) (params.Template, error) + GetTemplateByName(ctx context.Context, name string) (params.Template, error) + UpdateTemplate(ctx context.Context, id uint, param params.UpdateTemplateParams) (template params.Template, err error) + DeleteTemplate(ctx context.Context, id uint) (err error) +} + //go:generate go run github.com/vektra/mockery/v2@latest type Store interface { RepoStore @@ -185,6 +195,7 @@ type Store interface { ScaleSetInstanceStore GiteaEndpointStore GiteaCredentialsStore + TemplateStore ControllerInfo() (params.ControllerInfo, error) InitController() (params.ControllerInfo, error) diff --git a/database/common/watcher.go b/database/common/watcher.go index 94152094..aaa4e37d 100644 --- a/database/common/watcher.go +++ b/database/common/watcher.go @@ -35,6 +35,7 @@ const ( GiteaCredentialsEntityType DatabaseEntityType = "gitea_credentials" // #nosec G101 GithubEndpointEntityType DatabaseEntityType = "github_endpoint" ScaleSetEntityType DatabaseEntityType = "scaleset" + TemplateEntityType DatabaseEntityType = "template" ) const ( diff --git a/database/sql/models.go b/database/sql/models.go index d3cb044a..1fa8ba25 100644 --- a/database/sql/models.go +++ b/database/sql/models.go @@ -69,6 +69,22 @@ type Tag struct { Pools []*Pool `gorm:"many2many:pool_tags;constraint:OnDelete:CASCADE,OnUpdate:CASCADE;"` } +type Template struct { + gorm.Model + + Name string `gorm:"index:idx_template,unique;type:varchar(128)"` + UserID *uuid.UUID `gorm:"index:idx_template,unique"` + User User `gorm:"foreignKey:UserID"` + + Description string `gorm:"type:text"` + OSType commonParams.OSType `gorm:"type:varchar(32);index:idx_tpl_os_type"` + ForgeType params.EndpointType `gorm:"type:varchar(32);index:idx_tpl_forge_type"` + Data []byte `gorm:"type:longblob"` + + ScaleSets []ScaleSet `gorm:"foreignKey:TemplateID"` + Pools []Pool `gorm:"foreignKey:TemplateID"` +} + type Pool struct { Base @@ -98,6 +114,9 @@ type Pool struct { EnterpriseID *uuid.UUID `gorm:"index"` Enterprise Enterprise `gorm:"foreignKey:EnterpriseID"` + TemplateID *uint `gorm:"index"` + Template Template `gorm:"foreignKey:TemplateID"` + Instances []Instance `gorm:"foreignKey:PoolID"` Priority uint `gorm:"index:idx_pool_priority"` } @@ -151,6 +170,9 @@ type ScaleSet struct { EnterpriseID *uuid.UUID `gorm:"index"` Enterprise Enterprise `gorm:"foreignKey:EnterpriseID"` + TemplateID *uint `gorm:"index"` + Template Template `gorm:"foreignKey:TemplateID"` + Instances []Instance `gorm:"foreignKey:ScaleSetFkID"` } diff --git a/database/sql/pools.go b/database/sql/pools.go index e86087ad..a01655a4 100644 --- a/database/sql/pools.go +++ b/database/sql/pools.go @@ -72,6 +72,7 @@ func (s *sqlDatabase) GetPoolByID(_ context.Context, poolID string) (params.Pool "Organization.Endpoint", "Repository", "Repository.Endpoint", + "Template", } pool, err := s.getPoolByID(s.conn, poolID, preloadList...) if err != nil { @@ -291,6 +292,7 @@ func (s *sqlDatabase) CreateEntityPool(ctx context.Context, entity params.ForgeE RunnerBootstrapTimeout: param.RunnerBootstrapTimeout, GitHubRunnerGroup: param.GitHubRunnerGroup, Priority: param.Priority, + TemplateID: param.TemplateID, } if len(param.ExtraSpecs) > 0 { newPool.ExtraSpecs = datatypes.JSON(param.ExtraSpecs) @@ -352,6 +354,7 @@ func (s *sqlDatabase) GetEntityPool(_ context.Context, entity params.ForgeEntity "Organization.Endpoint", "Repository", "Repository.Endpoint", + "Template", } pool, err := s.getEntityPool(s.conn, entity.EntityType, entity.ID, poolID, preloadList...) if err != nil { diff --git a/database/sql/pools_test.go b/database/sql/pools_test.go index 297f4cdf..fa5d178e 100644 --- a/database/sql/pools_test.go +++ b/database/sql/pools_test.go @@ -150,7 +150,7 @@ func (s *PoolsTestSuite) TestListAllPools() { func (s *PoolsTestSuite) TestListAllPoolsDBFetchErr() { s.Fixtures.SQLMock. - ExpectQuery(regexp.QuoteMeta("SELECT `pools`.`id`,`pools`.`created_at`,`pools`.`updated_at`,`pools`.`deleted_at`,`pools`.`provider_name`,`pools`.`runner_prefix`,`pools`.`max_runners`,`pools`.`min_idle_runners`,`pools`.`runner_bootstrap_timeout`,`pools`.`image`,`pools`.`flavor`,`pools`.`os_type`,`pools`.`os_arch`,`pools`.`enabled`,`pools`.`git_hub_runner_group`,`pools`.`repo_id`,`pools`.`org_id`,`pools`.`enterprise_id`,`pools`.`priority` FROM `pools` WHERE `pools`.`deleted_at` IS NULL")). + ExpectQuery(regexp.QuoteMeta("SELECT `pools`.`id`,`pools`.`created_at`,`pools`.`updated_at`,`pools`.`deleted_at`,`pools`.`provider_name`,`pools`.`runner_prefix`,`pools`.`max_runners`,`pools`.`min_idle_runners`,`pools`.`runner_bootstrap_timeout`,`pools`.`image`,`pools`.`flavor`,`pools`.`os_type`,`pools`.`os_arch`,`pools`.`enabled`,`pools`.`git_hub_runner_group`,`pools`.`repo_id`,`pools`.`org_id`,`pools`.`enterprise_id`,`pools`.`template_id`,`pools`.`priority` FROM `pools` WHERE `pools`.`deleted_at` IS NULL")). WillReturnError(fmt.Errorf("mocked fetching all pools error")) _, err := s.StoreSQLMocked.ListAllPools(s.adminCtx) diff --git a/database/sql/scalesets.go b/database/sql/scalesets.go index 5877ad5c..404c67ac 100644 --- a/database/sql/scalesets.go +++ b/database/sql/scalesets.go @@ -56,7 +56,7 @@ func (s *sqlDatabase) ListAllScaleSets(_ context.Context) ([]params.ScaleSet, er return ret, nil } -func (s *sqlDatabase) CreateEntityScaleSet(_ context.Context, entity params.ForgeEntity, param params.CreateScaleSetParams) (scaleSet params.ScaleSet, err error) { +func (s *sqlDatabase) CreateEntityScaleSet(ctx context.Context, entity params.ForgeEntity, param params.CreateScaleSetParams) (scaleSet params.ScaleSet, err error) { if err := param.Validate(); err != nil { return params.ScaleSet{}, fmt.Errorf("failed to validate create params: %w", err) } @@ -83,6 +83,7 @@ func (s *sqlDatabase) CreateEntityScaleSet(_ context.Context, entity params.Forg Enabled: param.Enabled, GitHubRunnerGroup: param.GitHubRunnerGroup, State: params.ScaleSetPendingCreate, + TemplateID: param.TemplateID, } if len(param.ExtraSpecs) > 0 { @@ -118,12 +119,12 @@ func (s *sqlDatabase) CreateEntityScaleSet(_ context.Context, entity params.Forg return params.ScaleSet{}, err } - dbScaleSet, err := s.getScaleSetByID(s.conn, newScaleSet.ID, "Instances", "Enterprise", "Organization", "Repository") + dbScaleSet, err := s.GetScaleSetByID(ctx, newScaleSet.ID) if err != nil { return params.ScaleSet{}, fmt.Errorf("error fetching scale set: %w", err) } - return s.sqlToCommonScaleSet(dbScaleSet) + return dbScaleSet, nil } func (s *sqlDatabase) listEntityScaleSets(tx *gorm.DB, entityType params.ForgeEntityType, entityID string, preload ...string) ([]ScaleSet, error) { @@ -298,6 +299,10 @@ func (s *sqlDatabase) updateScaleSet(tx *gorm.DB, scaleSet ScaleSet, param param scaleSet.ScaleSetID = param.ScaleSetID } + if param.TemplateID != nil { + scaleSet.TemplateID = param.TemplateID + } + if param.Name != "" { scaleSet.Name = param.Name } @@ -364,6 +369,7 @@ func (s *sqlDatabase) GetScaleSetByID(_ context.Context, scaleSet uint) (params. "Organization.Endpoint", "Repository", "Repository.Endpoint", + "Template", ) if err != nil { return params.ScaleSet{}, fmt.Errorf("error fetching scale set by ID: %w", err) diff --git a/database/sql/sql.go b/database/sql/sql.go index 7d1fc96c..9f4c37ab 100644 --- a/database/sql/sql.go +++ b/database/sql/sql.go @@ -28,10 +28,12 @@ import ( "gorm.io/gorm/logger" runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" "github.com/cloudbase/garm/auth" "github.com/cloudbase/garm/config" "github.com/cloudbase/garm/database/common" "github.com/cloudbase/garm/database/watcher" + "github.com/cloudbase/garm/internal/templates" "github.com/cloudbase/garm/params" "github.com/cloudbase/garm/util/appdefaults" ) @@ -49,7 +51,9 @@ func newDBConn(dbCfg config.Database) (conn *gorm.DB, err error) { return nil, fmt.Errorf("error getting DB URI string: %w", err) } - gormConfig := &gorm.Config{} + gormConfig := &gorm.Config{ + TranslateError: true, + } if !dbCfg.Debug { gormConfig.Logger = logger.Default.LogMode(logger.Silent) } @@ -390,6 +394,139 @@ func (s *sqlDatabase) migrateWorkflow() error { return nil } +func (s *sqlDatabase) ensureTemplates(migrateTemplates bool) error { + if !migrateTemplates { + return nil + } + // make sure we have a default forge/OSType template. Currently we have Windows + // and Linux for GitHub and Linux for Gitea. + githubWindowsData, err := templates.GetTemplateContent(commonParams.Windows, params.GithubEndpointType) + if err != nil { + return fmt.Errorf("failed to get windows template for github: %w", err) + } + + githubLinuxData, err := templates.GetTemplateContent(commonParams.Linux, params.GithubEndpointType) + if err != nil { + return fmt.Errorf("failed to get linux template for github: %w", err) + } + + giteaLinuxData, err := templates.GetTemplateContent(commonParams.Linux, params.GiteaEndpointType) + if err != nil { + return fmt.Errorf("failed to get linux template for gitea: %w", err) + } + + adminCtx := auth.GetAdminContext(s.ctx) + + githubWindowsParams := params.CreateTemplateParams{ + Name: "github_windows", + Description: "Default Windows runner install template for GitHub", + OSType: commonParams.Windows, + ForgeType: params.GithubEndpointType, + Data: githubWindowsData, + } + githubWindowsSystemTemplate, err := s.createSystemTemplate(adminCtx, githubWindowsParams) + if err != nil { + return fmt.Errorf("failed to create github windows template: %w", err) + } + + githubLinuxParams := params.CreateTemplateParams{ + Name: "github_linux", + Description: "Default Linux runner install template for GitHub", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: githubLinuxData, + } + githubLinuxSystemTemplate, err := s.createSystemTemplate(adminCtx, githubLinuxParams) + if err != nil { + return fmt.Errorf("failed to create github linux template: %w", err) + } + + giteaLinuxParams := params.CreateTemplateParams{ + Name: "gitea_linux", + Description: "Default Linux runner install template for Gitea", + OSType: commonParams.Linux, + ForgeType: params.GiteaEndpointType, + Data: giteaLinuxData, + } + giteaLinuxSystemTemplate, err := s.createSystemTemplate(adminCtx, giteaLinuxParams) + if err != nil { + return fmt.Errorf("failed to create gitea linux template: %w", err) + } + + getTplID := func(forgeType params.EndpointType, osType commonParams.OSType) uint { + var templateID uint + switch forgeType { + case params.GiteaEndpointType: + switch osType { + case commonParams.Linux: + templateID = giteaLinuxSystemTemplate.ID + default: + return 0 + } + case params.GithubEndpointType: + switch osType { + case commonParams.Linux: + templateID = githubLinuxSystemTemplate.ID + case commonParams.Windows: + templateID = githubWindowsSystemTemplate.ID + default: + return 0 + } + default: + return 0 + } + return templateID + } + + pools, err := s.ListAllPools(s.ctx) + if err != nil { + return fmt.Errorf("failed to list pools: %w", err) + } + + for _, pool := range pools { + forgeType := pool.Endpoint.EndpointType + osType := pool.OSType + entity, err := pool.GetEntity() + if err != nil { + return fmt.Errorf("failed to get pool entity: %w", err) + } + templateID := getTplID(forgeType, osType) + if pool.TemplateID == 0 && templateID != 0 { + updateParams := params.UpdatePoolParams{ + TemplateID: &templateID, + } + if _, err := s.UpdateEntityPool(adminCtx, entity, pool.ID, updateParams); err != nil { + return fmt.Errorf("failed to update pool template: %w", err) + } + } + } + + scaleSets, err := s.ListAllScaleSets(adminCtx) + if err != nil { + return fmt.Errorf("failed to list scale sets: %w", err) + } + + for _, scaleSet := range scaleSets { + forgeType := scaleSet.Endpoint.EndpointType + osType := scaleSet.OSType + entity, err := scaleSet.GetEntity() + if err != nil { + return fmt.Errorf("failed to get scale set entity: %w", err) + } + templateID := getTplID(forgeType, osType) + if scaleSet.TemplateID == 0 && templateID != 0 { + updateParams := params.UpdateScaleSetParams{ + TemplateID: &templateID, + } + if _, err := s.UpdateEntityScaleSet(adminCtx, entity, scaleSet.ID, updateParams, nil); err != nil { + return fmt.Errorf("failed to update pool template: %w", err) + } + } + } + + return nil +} + func (s *sqlDatabase) migrateDB() error { if s.conn.Migrator().HasIndex(&Organization{}, "idx_organizations_name") { if err := s.conn.Migrator().DropIndex(&Organization{}, "idx_organizations_name"); err != nil { @@ -446,6 +583,8 @@ func (s *sqlDatabase) migrateDB() error { hasMinAgeField = true } + migrateTemplates := !s.conn.Migrator().HasTable(&Template{}) + s.conn.Exec("PRAGMA foreign_keys = OFF") if err := s.conn.AutoMigrate( &User{}, @@ -453,6 +592,7 @@ func (s *sqlDatabase) migrateDB() error { &GithubCredentials{}, &GiteaCredentials{}, &Tag{}, + &Template{}, &Pool{}, &Repository{}, &Organization{}, @@ -494,5 +634,10 @@ func (s *sqlDatabase) migrateDB() error { return fmt.Errorf("error migrating credentials: %w", err) } } + + if err := s.ensureTemplates(migrateTemplates); err != nil { + return fmt.Errorf("failed to create default templates: %w", err) + } + return nil } diff --git a/database/sql/templates.go b/database/sql/templates.go new file mode 100644 index 00000000..3414185b --- /dev/null +++ b/database/sql/templates.go @@ -0,0 +1,311 @@ +// Copyright 2025 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package sql + +import ( + "context" + "errors" + "fmt" + + "gorm.io/gorm" + + runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" + "github.com/cloudbase/garm/auth" + "github.com/cloudbase/garm/database/common" + "github.com/cloudbase/garm/params" +) + +func (s *sqlDatabase) ListTemplates(ctx context.Context, osType *commonParams.OSType, forgeType *params.EndpointType, partialName *string) ([]params.Template, error) { + var templates []Template + q := s.conn.Model(&Template{}).Omit("data").Preload("User") + if !auth.IsAdmin(ctx) { + userID, err := getUIDFromContext(ctx) + if err != nil { + return nil, fmt.Errorf("error listing templates: %w", err) + } + q = q.Where("user_id = ? or user_id IS NULL", userID) + } + + if osType != nil { + q = q.Where("os_type = ?", *osType) + } + + if partialName != nil { + q = q.Where("name like ? COLLATE NOCASE", fmt.Sprintf("%%%s%%", *partialName)) + } + + if forgeType != nil { + q = q.Where("forge_type = ?", *forgeType) + } + + q = q.Find(&templates) + if q.Error != nil { + return nil, fmt.Errorf("failed to get templates: %w", q.Error) + } + + ret := make([]params.Template, len(templates)) + for idx, tpl := range templates { + retTpl, err := s.sqlToParamTemplate(tpl) + if err != nil { + return nil, fmt.Errorf("failed to convert template: %w", err) + } + ret[idx] = retTpl + } + return ret, nil +} + +func (s *sqlDatabase) getTemplate(ctx context.Context, tx *gorm.DB, id uint, preload ...string) (Template, error) { + var template Template + q := tx.Model(&Template{}).Where("id = ?", id) + + if len(preload) > 0 { + for _, item := range preload { + q = q.Preload(item) + } + } + + if !auth.IsAdmin(ctx) { + userID, err := getUIDFromContext(ctx) + if err != nil { + return Template{}, fmt.Errorf("error listing templates: %w", err) + } + q = q.Where("user_id = ? or user_id IS NULL", userID) + } + + q = q.First(&template) + if q.Error != nil { + if errors.Is(q.Error, gorm.ErrRecordNotFound) { + return Template{}, runnerErrors.ErrNotFound + } + return Template{}, fmt.Errorf("failed to get template: %w", q.Error) + } + return template, nil +} + +func (s *sqlDatabase) GetTemplate(ctx context.Context, id uint) (params.Template, error) { + template, err := s.getTemplate(ctx, s.conn, id, "User") + if err != nil { + return params.Template{}, fmt.Errorf("failed to get template: %w", err) + } + + ret, err := s.sqlToParamTemplate(template) + if err != nil { + return params.Template{}, fmt.Errorf("failed to convert template: %w", err) + } + return ret, nil +} + +func (s *sqlDatabase) GetTemplateByName(ctx context.Context, name string) (params.Template, error) { + userID, err := getUIDFromContext(ctx) + if err != nil { + return params.Template{}, fmt.Errorf("failed to get template: %w", err) + } + var templates []Template + q := s.conn.Model(&Template{}). + Where("name = ?", name). + Where("user_id = ? or user_id IS NULL", userID). + Preload("ScaleSets"). + Preload("Pools"). + Preload("User") + + q = q.Find(&templates) + if q.Error != nil { + if errors.Is(q.Error, gorm.ErrRecordNotFound) { + return params.Template{}, runnerErrors.ErrNotFound + } + return params.Template{}, fmt.Errorf("failed to get template: %w", q.Error) + } + + if len(templates) == 0 { + return params.Template{}, runnerErrors.ErrNotFound + } + if len(templates) > 1 { + return params.Template{}, runnerErrors.NewConflictError("multiple templates match the specified name %q. Please get template by ID.", name) + } + ret, err := s.sqlToParamTemplate(templates[0]) + if err != nil { + return params.Template{}, fmt.Errorf("failed to convert template: %w", err) + } + return ret, nil +} + +func (s *sqlDatabase) createSystemTemplate(ctx context.Context, param params.CreateTemplateParams) (template params.Template, err error) { + if !auth.IsAdmin(ctx) { + return params.Template{}, runnerErrors.ErrUnauthorized + } + defer func() { + if err == nil { + s.sendNotify(common.TemplateEntityType, common.CreateOperation, template) + } + }() + sealed, err := s.marshalAndSeal(param.Data) + if err != nil { + return params.Template{}, fmt.Errorf("failed to seal data: %w", err) + } + tpl := Template{ + UserID: nil, + Name: param.Name, + Description: param.Description, + OSType: param.OSType, + Data: sealed, + ForgeType: param.ForgeType, + } + + if err := s.conn.Create(&tpl).Error; err != nil { + if errors.Is(err, gorm.ErrDuplicatedKey) { + return params.Template{}, runnerErrors.NewConflictError("a template name already exists with the specified name") + } + return params.Template{}, fmt.Errorf("error creating template: %w", err) + } + + template, err = s.sqlToParamTemplate(tpl) + if err != nil { + return params.Template{}, fmt.Errorf("failed to convert template: %w", err) + } + + return template, nil +} + +func (s *sqlDatabase) CreateTemplate(ctx context.Context, param params.CreateTemplateParams) (template params.Template, err error) { + userID, err := getUIDFromContext(ctx) + if err != nil { + return params.Template{}, fmt.Errorf("error creating template: %w", err) + } + defer func() { + if err == nil { + s.sendNotify(common.TemplateEntityType, common.CreateOperation, template) + } + }() + + sealed, err := s.marshalAndSeal(param.Data) + if err != nil { + return params.Template{}, fmt.Errorf("failed to seal data: %w", err) + } + tpl := Template{ + UserID: &userID, + Name: param.Name, + Description: param.Description, + OSType: param.OSType, + Data: sealed, + ForgeType: param.ForgeType, + } + if err := param.Validate(); err != nil { + return params.Template{}, fmt.Errorf("failed to validate create params: %w", err) + } + + if err := s.conn.Create(&tpl).Error; err != nil { + if errors.Is(err, gorm.ErrDuplicatedKey) { + return params.Template{}, runnerErrors.NewConflictError("a template name already exists with the specified name") + } + return params.Template{}, fmt.Errorf("error creating template: %w", err) + } + + return s.GetTemplate(ctx, tpl.ID) +} + +func (s *sqlDatabase) UpdateTemplate(ctx context.Context, id uint, param params.UpdateTemplateParams) (template params.Template, err error) { + var hasChange bool + defer func() { + if err == nil && hasChange { + s.sendNotify(common.TemplateEntityType, common.UpdateOperation, template) + } + }() + var tpl Template + err = s.conn.Transaction(func(tx *gorm.DB) error { + tpl, err = s.getTemplate(ctx, tx, id) + if err != nil { + return fmt.Errorf("failed to get template: %w", err) + } + if !auth.IsAdmin(ctx) { + if tpl.UserID == nil { + return runnerErrors.NewBadRequestError("cannot edit system templates") + } + } + if param.Description != nil { + hasChange = true + tpl.Description = *param.Description + } + + if param.Name != nil { + hasChange = true + tpl.Name = *param.Name + } + if len(param.Data) > 0 { + hasChange = true + data, err := s.marshalAndSeal(param.Data) + if err != nil { + return fmt.Errorf("failed to seal data: %w", err) + } + tpl.Data = data + } + + if !hasChange { + return nil + } + + if q := tx.Save(&tpl); q.Error != nil { + return fmt.Errorf("failed to save template: %w", q.Error) + } + + template, err = s.sqlToParamTemplate(tpl) + if err != nil { + return fmt.Errorf("failed to convert template: %w", err) + } + return nil + }) + if err != nil { + return params.Template{}, fmt.Errorf("failed to update template: %w", err) + } + return s.GetTemplate(ctx, tpl.ID) +} + +func (s *sqlDatabase) DeleteTemplate(ctx context.Context, id uint) (err error) { + var template params.Template + + defer func() { + if err == nil { + s.sendNotify(common.TemplateEntityType, common.DeleteOperation, template) + } + }() + err = s.conn.Transaction(func(tx *gorm.DB) error { + tpl, err := s.getTemplate(ctx, tx, id, "Pools", "ScaleSets") + if err != nil { + return fmt.Errorf("failed to get template: %w", err) + } + if !auth.IsAdmin(ctx) { + if tpl.UserID == nil { + return runnerErrors.NewBadRequestError("cannot delete system templates") + } + } + + if len(tpl.Pools) > 0 || len(tpl.ScaleSets) > 0 { + return runnerErrors.NewBadRequestError("cannot delete template while in use by pools or scale sets") + } + template, err = s.sqlToParamTemplate(tpl) + if err != nil { + return fmt.Errorf("failed to convert template: %w", err) + } + + if q := tx.Unscoped().Delete(&tpl); q.Error != nil { + return fmt.Errorf("failed to delete template: %w", err) + } + return nil + }) + if err != nil { + return fmt.Errorf("failed to delete template: %w", err) + } + return nil +} diff --git a/database/sql/templates_test.go b/database/sql/templates_test.go new file mode 100644 index 00000000..1acf6c12 --- /dev/null +++ b/database/sql/templates_test.go @@ -0,0 +1,426 @@ +// Copyright 2025 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package sql + +import ( + "context" + "fmt" + "regexp" + "testing" + + "github.com/stretchr/testify/suite" + "gopkg.in/DATA-DOG/go-sqlmock.v1" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" + + runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" + dbCommon "github.com/cloudbase/garm/database/common" + "github.com/cloudbase/garm/database/watcher" + garmTesting "github.com/cloudbase/garm/internal/testing" + "github.com/cloudbase/garm/params" +) + +type TemplatesTestFixtures struct { + Templates []params.Template + SQLMock sqlmock.Sqlmock + User params.User + AdminUser params.User +} + +type TemplatesTestSuite struct { + suite.Suite + Store dbCommon.Store + ctx context.Context + adminCtx context.Context + + StoreSQLMocked *sqlDatabase + Fixtures *TemplatesTestFixtures +} + +func (s *TemplatesTestSuite) assertSQLMockExpectations() { + err := s.Fixtures.SQLMock.ExpectationsWereMet() + if err != nil { + s.FailNow(fmt.Sprintf("failed to meet sqlmock expectations, got error: %v", err)) + } +} + +func (s *TemplatesTestSuite) TearDownTest() { + watcher.CloseWatcher() +} + +func (s *TemplatesTestSuite) SetupTest() { + ctx := context.Background() + watcher.InitWatcher(ctx) + + db, err := NewSQLDatabase(context.Background(), garmTesting.GetTestSqliteDBConfig(s.T())) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create db connection: %s", err)) + } + s.Store = db + + adminCtx := garmTesting.ImpersonateAdminContext(context.Background(), db, s.T()) + s.adminCtx = adminCtx + + // Create a regular user for testing user-scoped templates + user := garmTesting.CreateGARMTestUser(adminCtx, "testuser", db, s.T()) + // Create proper user context (non-admin) + s.ctx = adminCtx // For now, use admin context to avoid complexity + + // Create test templates + templates := []params.Template{} + + // Create system template (user_id = nil) + sysTemplate, err := s.Store.CreateTemplate(s.adminCtx, params.CreateTemplateParams{ + Name: "system-template", + Description: "System template for testing", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd", "image": "ubuntu:22.04"}`), + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create system template: %s", err)) + } + templates = append(templates, sysTemplate) + + // Create user template + userTemplate, err := s.Store.CreateTemplate(s.ctx, params.CreateTemplateParams{ + Name: "user-template", + Description: "User template for testing", + OSType: commonParams.Windows, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "azure", "image": "windows-2022"}`), + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create user template: %s", err)) + } + templates = append(templates, userTemplate) + + // Create store with mocked sql connection + sqlDB, sqlMock, err := sqlmock.New() + if err != nil { + s.FailNow(fmt.Sprintf("failed to run 'sqlmock.New()', got error: %v", err)) + } + s.T().Cleanup(func() { sqlDB.Close() }) + mysqlConfig := mysql.Config{ + Conn: sqlDB, + SkipInitializeWithVersion: true, + } + dialector := mysql.New(mysqlConfig) + mockDB, err := gorm.Open(dialector, &gorm.Config{ + Logger: logger.Default.LogMode(logger.Info), + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to open mock database connection: %v", err)) + } + + storeSQLMocked := &sqlDatabase{ + conn: mockDB, + cfg: garmTesting.GetTestSqliteDBConfig(s.T()), + } + + s.StoreSQLMocked = storeSQLMocked + s.Fixtures = &TemplatesTestFixtures{ + Templates: templates, + SQLMock: sqlMock, + User: user, + } +} + +func (s *TemplatesTestSuite) TestListTemplates() { + templates, err := s.Store.ListTemplates(s.adminCtx, nil, nil, nil) + s.Require().Nil(err) + // Should include both test templates and any system templates + s.Require().GreaterOrEqual(len(templates), len(s.Fixtures.Templates)) + + // Find our test templates in the results + foundNames := make(map[string]bool) + for _, template := range templates { + foundNames[template.Name] = true + } + + for _, expected := range s.Fixtures.Templates { + s.Require().True(foundNames[expected.Name], "Expected template %s not found", expected.Name) + } +} + +func (s *TemplatesTestSuite) TestListTemplatesWithOSTypeFilter() { + osType := commonParams.Linux + templates, err := s.Store.ListTemplates(s.adminCtx, &osType, nil, nil) + s.Require().Nil(err) + s.Require().GreaterOrEqual(len(templates), 1) + + // Verify all returned templates have the correct OS type + for _, template := range templates { + s.Require().Equal(commonParams.Linux, template.OSType) + } + + // Find our test template + found := false + for _, template := range templates { + if template.Name == "system-template" { + found = true + break + } + } + s.Require().True(found, "Expected system-template not found") +} + +func (s *TemplatesTestSuite) TestListTemplatesWithForgeTypeFilter() { + forgeType := params.GithubEndpointType + templates, err := s.Store.ListTemplates(s.adminCtx, nil, &forgeType, nil) + s.Require().Nil(err) + s.Require().GreaterOrEqual(len(templates), 2) + + // Verify all returned templates have the correct forge type + for _, template := range templates { + s.Require().Equal(params.GithubEndpointType, template.ForgeType) + } +} + +func (s *TemplatesTestSuite) TestListTemplatesWithNameFilter() { + partialName := "system" + templates, err := s.Store.ListTemplates(s.adminCtx, nil, nil, &partialName) + s.Require().Nil(err) + s.Require().Len(templates, 1) + s.Require().Equal("system-template", templates[0].Name) +} + +func (s *TemplatesTestSuite) TestListTemplatesDBFetchErr() { + s.Fixtures.SQLMock. + ExpectQuery(regexp.QuoteMeta("SELECT `templates`.`id`,`templates`.`created_at`,`templates`.`updated_at`,`templates`.`deleted_at`,`templates`.`name`,`templates`.`user_id`,`templates`.`description`,`templates`.`os_type`,`templates`.`forge_type` FROM `templates` WHERE `templates`.`deleted_at` IS NULL")). + WillReturnError(fmt.Errorf("mocked fetching templates error")) + + _, err := s.StoreSQLMocked.ListTemplates(s.adminCtx, nil, nil, nil) + s.assertSQLMockExpectations() + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "failed to get templates") +} + +func (s *TemplatesTestSuite) TestGetTemplate() { + template, err := s.Store.GetTemplate(s.adminCtx, s.Fixtures.Templates[0].ID) + s.Require().Nil(err) + s.Require().Equal(s.Fixtures.Templates[0].ID, template.ID) + s.Require().Equal(s.Fixtures.Templates[0].Name, template.Name) +} + +func (s *TemplatesTestSuite) TestGetTemplateInvalidID() { + _, err := s.Store.GetTemplate(s.adminCtx, 9999) + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrNotFound) +} + +func (s *TemplatesTestSuite) TestGetTemplateByName() { + template, err := s.Store.GetTemplateByName(s.ctx, "user-template") + s.Require().Nil(err) + s.Require().Equal("user-template", template.Name) +} + +func (s *TemplatesTestSuite) TestGetTemplateByNameNotFound() { + _, err := s.Store.GetTemplateByName(s.ctx, "nonexistent-template") + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrNotFound) +} + +func (s *TemplatesTestSuite) TestGetTemplateByNameMultipleTemplatesConflict() { + // Create a scenario where a user can see multiple templates with the same name: + // 1. A user template with a specific name + // 2. A system template (user_id = NULL) with the same name + // Both will be visible to the user, creating a conflict + templateName := "duplicate-name-template" + + // Create a user template first + _, err := s.Store.CreateTemplate(s.ctx, params.CreateTemplateParams{ + Name: templateName, + Description: "User template with duplicate name", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd", "image": "ubuntu:22.04"}`), + }) + s.Require().Nil(err) + + // Create a system template by directly inserting into the database + // since the createSystemTemplate method isn't exported + sqlDB := s.Store.(*sqlDatabase) + sealed, err := sqlDB.marshalAndSeal([]byte(`{"provider": "azure", "image": "windows-2022"}`)) + s.Require().Nil(err) + + systemTemplate := Template{ + UserID: nil, // system template + Name: templateName, + Description: "System template with duplicate name", + OSType: commonParams.Windows, + ForgeType: params.GithubEndpointType, + Data: sealed, + } + err = sqlDB.conn.Create(&systemTemplate).Error + s.Require().Nil(err) + + // Now try to get template by name - should return conflict error + _, err = s.Store.GetTemplateByName(s.ctx, templateName) + s.Require().NotNil(err) + expectedErr := runnerErrors.NewConflictError("multiple templates match the specified name %q. Please get template by ID.", templateName) + s.Require().Equal(expectedErr, err) +} + +func (s *TemplatesTestSuite) TestCreateTemplateDuplicateName() { + // Test that creating a template with a duplicate name for the same user returns a conflict error + templateName := "duplicate-user-template" + + // Create first template + _, err := s.Store.CreateTemplate(s.ctx, params.CreateTemplateParams{ + Name: templateName, + Description: "First template", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd", "image": "ubuntu:22.04"}`), + }) + s.Require().Nil(err) + + // Try to create second template with same name for same user - should fail + _, err = s.Store.CreateTemplate(s.ctx, params.CreateTemplateParams{ + Name: templateName, + Description: "Second template with same name", + OSType: commonParams.Windows, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "azure", "image": "windows-2022"}`), + }) + s.Require().NotNil(err) + expectedErr := runnerErrors.NewConflictError("a template name already exists with the specified name") + s.Require().Equal(expectedErr, err) +} + +func (s *TemplatesTestSuite) TestCreateTemplateSystemAndUserConflict() { + // Test scenarios where system and user templates might conflict + templateName := "conflicting-template" + + // Create a user template first + _, err := s.Store.CreateTemplate(s.ctx, params.CreateTemplateParams{ + Name: templateName, + Description: "User template", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd", "image": "ubuntu:22.04"}`), + }) + s.Require().Nil(err) + + // Now try to create a system template with the same name using direct access to createSystemTemplate + // This should succeed since the unique constraint is on (name, user_id) and system templates have user_id = NULL + sqlDB := s.Store.(*sqlDatabase) + _, err = sqlDB.createSystemTemplate(s.adminCtx, params.CreateTemplateParams{ + Name: templateName, + Description: "System template with same name", + OSType: commonParams.Windows, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "azure", "image": "windows-2022"}`), + }) + + // This should succeed because system templates (user_id = NULL) and user templates + // (user_id = specific_user_id) can coexist with the same name due to the composite unique constraint + s.Require().Nil(err) + + // Verify both templates exist + userTemplates, err := s.Store.ListTemplates(s.ctx, nil, nil, &templateName) + s.Require().Nil(err) + s.Require().Len(userTemplates, 2) // User can see both their template and the system template +} + +func (s *TemplatesTestSuite) TestCreateTemplate() { + template, err := s.Store.CreateTemplate(s.ctx, params.CreateTemplateParams{ + Name: "new-template", + Description: "New template for testing", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd", "image": "ubuntu:20.04"}`), + }) + s.Require().Nil(err) + s.Require().Equal("new-template", template.Name) + s.Require().Equal("New template for testing", template.Description) + s.Require().Equal(commonParams.Linux, template.OSType) +} + +func (s *TemplatesTestSuite) TestCreateTemplateInvalidParams() { + _, err := s.Store.CreateTemplate(s.ctx, params.CreateTemplateParams{ + Name: "", // Empty name should fail validation + Description: "Invalid template", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd"}`), + }) + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "failed to validate create params") +} + +func (s *TemplatesTestSuite) TestUpdateTemplate() { + newName := "updated-template-name" + newDescription := "Updated description" + template, err := s.Store.UpdateTemplate(s.ctx, s.Fixtures.Templates[1].ID, params.UpdateTemplateParams{ + Name: &newName, + Description: &newDescription, + Data: []byte(`{"provider": "updated", "image": "updated:latest"}`), + }) + s.Require().Nil(err) + s.Require().Equal(newName, template.Name) + s.Require().Equal(newDescription, template.Description) +} + +func (s *TemplatesTestSuite) TestUpdateTemplateNoChanges() { + originalTemplate := s.Fixtures.Templates[1] + _, err := s.Store.UpdateTemplate(s.ctx, s.Fixtures.Templates[1].ID, params.UpdateTemplateParams{}) + s.Require().Nil(err) + // When no changes are made, the template should be returned unchanged + // But the Update function may return an empty template if there are no changes + // So let's get the template explicitly to verify it's unchanged + updatedTemplate, err := s.Store.GetTemplate(s.ctx, s.Fixtures.Templates[1].ID) + s.Require().Nil(err) + s.Require().Equal(originalTemplate.Name, updatedTemplate.Name) + s.Require().Equal(originalTemplate.Description, updatedTemplate.Description) +} + +func (s *TemplatesTestSuite) TestUpdateTemplateInvalidID() { + newName := "updated-name" + _, err := s.Store.UpdateTemplate(s.ctx, 9999, params.UpdateTemplateParams{ + Name: &newName, + }) + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "failed to get template") +} + +func (s *TemplatesTestSuite) TestDeleteTemplate() { + err := s.Store.DeleteTemplate(s.ctx, s.Fixtures.Templates[1].ID) + s.Require().Nil(err) + + // Verify template is deleted + _, err = s.Store.GetTemplate(s.ctx, s.Fixtures.Templates[1].ID) + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrNotFound) +} + +func (s *TemplatesTestSuite) TestDeleteTemplateInvalidID() { + err := s.Store.DeleteTemplate(s.ctx, 9999) + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "failed to get template") +} + +func (s *TemplatesTestSuite) TestDeleteSystemTemplateAsNonAdmin() { + // Since both contexts are admin for simplicity, we'll skip this test + // In a real scenario, you'd set up a proper non-admin context + s.T().Skip("Skipping non-admin test - requires proper user context setup") +} + +func TestTemplatesTestSuite(t *testing.T) { + suite.Run(t, new(TemplatesTestSuite)) +} diff --git a/database/sql/util.go b/database/sql/util.go index 9509aacf..1276fdef 100644 --- a/database/sql/util.go +++ b/database/sql/util.go @@ -286,6 +286,11 @@ func (s *sqlDatabase) sqlToCommonPool(pool Pool) (params.Pool, error) { UpdatedAt: pool.UpdatedAt, } + if pool.TemplateID != nil && *pool.TemplateID != 0 { + ret.TemplateID = *pool.TemplateID + ret.TemplateName = pool.Template.Name + } + var ep GithubEndpoint if pool.RepoID != nil { ret.RepoID = pool.RepoID.String() @@ -357,6 +362,11 @@ func (s *sqlDatabase) sqlToCommonScaleSet(scaleSet ScaleSet) (params.ScaleSet, e DesiredRunnerCount: scaleSet.DesiredRunnerCount, } + if scaleSet.TemplateID != nil && *scaleSet.TemplateID != 0 { + ret.TemplateID = *scaleSet.TemplateID + ret.TemplateName = scaleSet.Template.Name + } + var ep GithubEndpoint if scaleSet.RepoID != nil { ret.RepoID = scaleSet.RepoID.String() @@ -532,6 +542,10 @@ func (s *sqlDatabase) updatePool(tx *gorm.DB, pool Pool, param params.UpdatePool pool.MaxRunners = *param.MaxRunners } + if param.TemplateID != nil { + pool.TemplateID = param.TemplateID + } + if param.MinIdleRunners != nil { pool.MinIdleRunners = *param.MinIdleRunners } @@ -963,3 +977,28 @@ func getUIDFromContext(ctx context.Context) (uuid.UUID, error) { } return asUUID, nil } + +func (s *sqlDatabase) sqlToParamTemplate(template Template) (params.Template, error) { + var data []byte + if len(template.Data) > 0 { + if err := s.unsealAndUnmarshal(template.Data, &data); err != nil { + return params.Template{}, fmt.Errorf("error unsealing template: %w", err) + } + } + + owner := "system" + if template.UserID != nil { + owner = template.User.Username + } + return params.Template{ + ID: template.ID, + CreatedAt: template.CreatedAt, + UpdatedAt: template.UpdatedAt, + Name: template.Name, + Description: template.Description, + Data: data, + ForgeType: template.ForgeType, + Owner: owner, + OSType: template.OSType, + }, nil +} diff --git a/go.mod b/go.mod index 9be81550..ef8ec524 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/bradleyfalzon/ghinstallation/v2 v2.16.0 github.com/cloudbase/garm-provider-common v0.1.7 github.com/felixge/httpsnoop v1.0.4 + github.com/gdamore/tcell/v2 v2.9.0 github.com/go-openapi/errors v0.22.2 github.com/go-openapi/runtime v0.28.0 github.com/go-openapi/strfmt v0.23.0 @@ -21,6 +22,7 @@ require ( github.com/manifoldco/promptui v0.9.0 github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 github.com/prometheus/client_golang v1.23.0 + github.com/rivo/tview v0.42.0 github.com/spf13/cobra v1.10.1 github.com/stretchr/testify v1.11.1 golang.org/x/crypto v0.42.0 @@ -42,6 +44,7 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/gdamore/encoding v1.0.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.23.0 // indirect @@ -68,6 +71,7 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect @@ -93,6 +97,7 @@ require ( go.opentelemetry.io/otel/trace v1.36.0 // indirect golang.org/x/net v0.43.0 // indirect golang.org/x/sys v0.36.0 // indirect + golang.org/x/term v0.35.0 // indirect golang.org/x/text v0.29.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 08a45b03..e7b186dc 100644 --- a/go.sum +++ b/go.sum @@ -27,6 +27,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw= +github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo= +github.com/gdamore/tcell/v2 v2.9.0 h1:N6t+eqK7/xwtRPwxzs1PXeRWnm0H9l02CrgJ7DLn1ys= +github.com/gdamore/tcell/v2 v2.9.0/go.mod h1:8/ZoqM9rxzYphT9tH/9LnunhV9oPBqwS8WHGYm5nrmo= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -125,6 +129,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= @@ -162,6 +168,8 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/rivo/tview v0.42.0 h1:b/ftp+RxtDsHSaynXTbJb+/n/BxDEi+W3UfF5jILK6c= +github.com/rivo/tview v0.42.0/go.mod h1:cSfIYfhpSGCjp3r/ECJb+GKS7cGJnqV8vfjQPwoXyfY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -181,6 +189,7 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 h1:xzABM9let0HLLqFypcxvLmlvEciCHL7+Lv+4vwZqecI= github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569/go.mod h1:2Ly+NIftZN4de9zRmENdYbvPQeaVIYKWpLFStLFEBgI= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFXVw= go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= @@ -195,23 +204,55 @@ go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKr go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= diff --git a/internal/templates/templates.go b/internal/templates/templates.go new file mode 100644 index 00000000..70ff7326 --- /dev/null +++ b/internal/templates/templates.go @@ -0,0 +1,96 @@ +package templates + +import ( + "bufio" + "bytes" + "embed" + "fmt" + "io" + "os" + "path" + "text/template" + + "github.com/cloudbase/garm-provider-common/cloudconfig" + runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" + "github.com/cloudbase/garm/params" +) + +//go:embed all:userdata +var Userdata embed.FS + +type WrapperContext struct { + CallbackToken string + MetadataURL string +} + +func GetTemplateContent(osType commonParams.OSType, forge params.EndpointType) ([]byte, error) { + switch forge { + case params.GithubEndpointType: + switch osType { + case commonParams.Linux, commonParams.Windows: + default: + return nil, runnerErrors.NewNotFoundError("could not find template for forge github and OS type: %q", osType) + } + case params.GiteaEndpointType: + if osType != commonParams.Linux { + return nil, runnerErrors.NewNotFoundError("could not find template for gitea with OS type: %q", osType) + } + default: + return nil, runnerErrors.NewNotFoundError("could not find template for forge type: %q", forge) + } + + templateName := fmt.Sprintf("%s_%s_userdata.tmpl", forge, osType) + fd, err := Userdata.Open(path.Join("userdata", templateName)) + if err != nil { + if os.IsNotExist(err) { + return nil, runnerErrors.NewNotFoundError("could not find template for OS type %q and forge %q", osType, forge) + } + } + + data, err := io.ReadAll(fd) + if err != nil { + fd.Close() + return nil, fmt.Errorf("failed to read template: %w", err) + } + fd.Close() + return data, nil +} + +func RenderRunnerInstallScript(tpl string, context cloudconfig.InstallRunnerParams) ([]byte, error) { + t, err := template.New("").Parse(tpl) + if err != nil { + return nil, fmt.Errorf("failed to parse template: %w", err) + } + + var buf bytes.Buffer + if err := t.Execute(&buf, context); err != nil { + return nil, fmt.Errorf("failed to execute template: %w", err) + } + data := buf.String() + return []byte(data), nil +} + +func RenderRunnerInstallWrapper(osType commonParams.OSType, metadataURL, token string) ([]byte, error) { + tmpl, err := template.ParseFS(Userdata, "userdata/*_wrapper.tmpl") + if err != nil { + return nil, fmt.Errorf("failed to parse templates: %w", err) + } + + templateCtx := WrapperContext{ + MetadataURL: metadataURL, + CallbackToken: token, + } + + templateName := fmt.Sprintf("%s_wrapper.tmpl", osType) + var b bytes.Buffer + wr := bufio.NewWriter(&b) + wr.Flush() + + if err := tmpl.ExecuteTemplate(wr, templateName, templateCtx); err != nil { + return nil, fmt.Errorf("failed to execute template: %w", err) + } + wr.Flush() + + return b.Bytes(), nil +} diff --git a/internal/templates/userdata/gitea_linux_userdata.tmpl b/internal/templates/userdata/gitea_linux_userdata.tmpl new file mode 100644 index 00000000..2b4dee03 --- /dev/null +++ b/internal/templates/userdata/gitea_linux_userdata.tmpl @@ -0,0 +1,139 @@ +#!/bin/bash + +set -e +set -o pipefail + +{{- if .EnableBootDebug }} +set -x +{{- end }} + +CALLBACK_URL="{{ .CallbackURL }}" +METADATA_URL="{{ .MetadataURL }}" +BEARER_TOKEN="{{ .CallbackToken }}" + +RUN_HOME="/home/{{.RunnerUsername}}/act-runner" + +if [ -z "$METADATA_URL" ];then + echo "no token is available and METADATA_URL is not set" + exit 1 +fi + +function call() { + PAYLOAD="$1" + [[ $CALLBACK_URL =~ ^(.*)/status(/)?$ ]] || CALLBACK_URL="${CALLBACK_URL}/status" + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X POST -d "${PAYLOAD}" -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${CALLBACK_URL}" || echo "failed to call home: exit code ($?)" +} + +function systemInfo() { + if [ -f "/etc/os-release" ];then + . /etc/os-release + fi + OS_NAME=${NAME:-""} + OS_VERSION=${VERSION_ID:-""} + AGENT_ID=${1:-null} + # strip status from the callback url + [[ $CALLBACK_URL =~ ^(.*)/status(/)?$ ]] && CALLBACK_URL="${BASH_REMATCH[1]}" || true + SYSINFO_URL="${CALLBACK_URL}/system-info/" + PAYLOAD="{\"os_name\": \"$OS_NAME\", \"os_version\": \"$OS_VERSION\", \"agent_id\": $AGENT_ID}" + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X POST -d "${PAYLOAD}" -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${SYSINFO_URL}" || true +} + +function sendStatus() { + MSG="$1" + call "{\"status\": \"installing\", \"message\": \"$MSG\"}" +} + +function success() { + MSG="$1" + ID=${2:-null} + call "{\"status\": \"idle\", \"message\": \"$MSG\", \"agent_id\": $ID}" +} + +function fail() { + MSG="$1" + call "{\"status\": \"failed\", \"message\": \"$MSG\"}" + exit 1 +} + +function downloadAndExtractRunner() { + sendStatus "downloading tools from {{ .DownloadURL }}" + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -L -o "/home/{{ .RunnerUsername }}/{{ .FileName }}" "{{ .DownloadURL }}" || fail "failed to download tools" + mkdir -p "$RUN_HOME" || fail "failed to create actions-runner folder" + sendStatus "extracting runner" + xz -d -c "/home/{{ .RunnerUsername }}/{{ .FileName }}" > "$RUN_HOME/act_runner" || fail "failed to extract runner" + chown {{ .RunnerUsername }}:{{ .RunnerGroup }} -R "$RUN_HOME"/ || fail "failed to change owner" + chmod +x "$RUN_HOME/act_runner" || fail "failed to set executable flag" +} + +if [ ! -d "$RUN_HOME" ];then + downloadAndExtractRunner +else + sendStatus "using cached runner found in $RUN_HOME" +fi + +cd "$RUN_HOME" + +sendStatus "configuring runner" +function getRunnerFile() { + curl --retry 5 --retry-delay 5 \ + --retry-connrefused --fail -s \ + -X GET -H 'Accept: application/json' \ + -H "Authorization: Bearer ${BEARER_TOKEN}" \ + "${METADATA_URL}/$1" -o "$2" +} + +GITHUB_TOKEN=$(curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X GET -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${METADATA_URL}/runner-registration-token/") + +set +e +attempt=1 +while true; do + ERROUT=$(mktemp) + ./act_runner register --ephemeral --no-interactive --instance "{{ .RepoURL }}" --token "$GITHUB_TOKEN" --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" 2>$ERROUT + if [ $? -eq 0 ]; then + rm $ERROUT || true + sendStatus "runner successfully configured after $attempt attempt(s)" + break + fi + LAST_ERR=$(cat $ERROUT) + echo "$LAST_ERR" + + if [ $attempt -gt 5 ];then + rm $ERROUT || true + fail "failed to configure runner: $LAST_ERR" + fi + + sendStatus "failed to configure runner (attempt $attempt): $LAST_ERR (retrying in 5 seconds)" + attempt=$((attempt+1)) + rm $ERROUT || true + sleep 5 +done +set -e + +getRunnerFile "system/service-name" ""$RUN_HOME"/.service" || fail "failed to get service name file" +sed -i 's/$/\.service/' "$RUN_HOME"/.service +SVC_NAME=$(cat "$RUN_HOME"/.service) + +sendStatus "generating systemd unit file" +getRunnerFile "systemd/unit-file?runAsUser={{ .RunnerUsername }}" "$SVC_NAME" || fail "failed to get service file" +sudo mv $SVC_NAME /etc/systemd/system/ || fail "failed to move service file" +sudo chown root:root /etc/systemd/system/$SVC_NAME || fail "failed to change owner" +if [ -e "/sys/fs/selinux" ];then + sudo chcon -h system_u:object_r:systemd_unit_file_t:s0 /etc/systemd/system/$SVC_NAME || fail "failed to change selinux context" + sudo chcon -R -h user_u:object_r:bin_t:s0 /home/runner/ || fail "failed to change selinux context" +fi + +sudo systemctl daemon-reload || fail "failed to reload systemd" + +AGENT_ID="" +sendStatus "starting service" +sudo systemctl enable --now $SVC_NAME + +set +e +AGENT_ID=$(grep '"id"' "$RUN_HOME"/.runner | tr -d -c 0-9) +if [ $? -ne 0 ];then + fail "failed to get agent ID" +fi +set -e + +systemInfo $AGENT_ID +success "runner successfully installed" $AGENT_ID diff --git a/internal/templates/userdata/github_linux_userdata.tmpl b/internal/templates/userdata/github_linux_userdata.tmpl new file mode 100644 index 00000000..cd672d7e --- /dev/null +++ b/internal/templates/userdata/github_linux_userdata.tmpl @@ -0,0 +1,179 @@ +#!/bin/bash + +set -e +set -o pipefail + +{{- if .EnableBootDebug }} +set -x +{{- end }} + +CALLBACK_URL="{{ .CallbackURL }}" +METADATA_URL="{{ .MetadataURL }}" +BEARER_TOKEN="{{ .CallbackToken }}" + +RUN_HOME="/home/{{ .RunnerUsername }}/actions-runner" + +if [ -z "$METADATA_URL" ];then + echo "no token is available and METADATA_URL is not set" + exit 1 +fi + +function call() { + PAYLOAD="$1" + [[ $CALLBACK_URL =~ ^(.*)/status(/)?$ ]] || CALLBACK_URL="${CALLBACK_URL}/status" + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X POST -d "${PAYLOAD}" -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${CALLBACK_URL}" || echo "failed to call home: exit code ($?)" +} + +function systemInfo() { + if [ -f "/etc/os-release" ];then + . /etc/os-release + fi + OS_NAME=${NAME:-""} + OS_VERSION=${VERSION_ID:-""} + AGENT_ID=${1:-null} + # strip status from the callback url + [[ $CALLBACK_URL =~ ^(.*)/status(/)?$ ]] && CALLBACK_URL="${BASH_REMATCH[1]}" || true + SYSINFO_URL="${CALLBACK_URL}/system-info/" + PAYLOAD="{\"os_name\": \"$OS_NAME\", \"os_version\": \"$OS_VERSION\", \"agent_id\": $AGENT_ID}" + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X POST -d "${PAYLOAD}" -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${SYSINFO_URL}" || true +} + +function sendStatus() { + MSG="$1" + call "{\"status\": \"installing\", \"message\": \"$MSG\"}" +} + +function success() { + MSG="$1" + ID=${2:-null} + call "{\"status\": \"idle\", \"message\": \"$MSG\", \"agent_id\": $ID}" +} + +function fail() { + MSG="$1" + call "{\"status\": \"failed\", \"message\": \"$MSG\"}" + exit 1 +} + +function downloadAndExtractRunner() { + sendStatus "downloading tools from {{ .DownloadURL }}" + if [ ! -z "{{ .TempDownloadToken }}" ]; then + TEMP_TOKEN="Authorization: Bearer {{ .TempDownloadToken }}" + fi + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -L -H "${TEMP_TOKEN}" -o "/home/{{ .RunnerUsername }}/{{ .FileName }}" "{{ .DownloadURL }}" || fail "failed to download tools" + mkdir -p "$RUN_HOME" || fail "failed to create actions-runner folder" + sendStatus "extracting runner" + tar xf "/home/{{ .RunnerUsername }}/{{ .FileName }}" -C "$RUN_HOME"/ || fail "failed to extract runner" + chown {{ .RunnerUsername }}:{{ .RunnerGroup }} -R "$RUN_HOME"/ || fail "failed to change owner" +} + +if [ ! -d "$RUN_HOME" ];then + downloadAndExtractRunner + sendStatus "installing dependencies" + cd "$RUN_HOME" + sudo ./bin/installdependencies.sh || fail "failed to install dependencies" +else + sendStatus "using cached runner found in $RUN_HOME" + cd "$RUN_HOME" +fi + + +sendStatus "configuring runner" +{{- if .UseJITConfig }} +function getRunnerFile() { + curl --retry 5 --retry-delay 5 \ + --retry-connrefused --fail -s \ + -X GET -H 'Accept: application/json' \ + -H "Authorization: Bearer ${BEARER_TOKEN}" \ + "${METADATA_URL}/$1" -o "$2" +} + +sendStatus "downloading JIT credentials" +getRunnerFile "credentials/runner" ""$RUN_HOME"/.runner" || fail "failed to get runner file" +getRunnerFile "credentials/credentials" ""$RUN_HOME"/.credentials" || fail "failed to get credentials file" +getRunnerFile "credentials/credentials_rsaparams" ""$RUN_HOME"/.credentials_rsaparams" || fail "failed to get credentials_rsaparams file" +getRunnerFile "system/service-name" ""$RUN_HOME"/.service" || fail "failed to get service name file" +sed -i 's/$/\.service/' "$RUN_HOME"/.service + +SVC_NAME=$(cat "$RUN_HOME"/.service) + +sendStatus "generating systemd unit file" +getRunnerFile "systemd/unit-file?runAsUser={{ .RunnerUsername }}" "$SVC_NAME" || fail "failed to get service file" +sudo mv $SVC_NAME /etc/systemd/system/ || fail "failed to move service file" +sudo chown root:root /etc/systemd/system/$SVC_NAME || fail "failed to change owner" +if [ -e "/sys/fs/selinux" ];then + sudo chcon -h system_u:object_r:systemd_unit_file_t:s0 /etc/systemd/system/$SVC_NAME || fail "failed to change selinux context" +fi + +sendStatus "enabling runner service" +cp "$RUN_HOME"/bin/runsvc.sh "$RUN_HOME"/ || fail "failed to copy runsvc.sh" +# Chown is not needed for the cached runner +# sudo chown {{ .RunnerUsername }}:{{ .RunnerGroup }} -R /home/{{ .RunnerUsername }} || fail "failed to change owner" +sudo systemctl daemon-reload || fail "failed to reload systemd" +sudo systemctl enable $SVC_NAME +{{- else}} + +GITHUB_TOKEN=$(curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X GET -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${METADATA_URL}/runner-registration-token/") + +set +e +attempt=1 +while true; do + ERROUT=$(mktemp) + {{- if .GitHubRunnerGroup }} + ./config.sh --unattended --url "{{ .RepoURL }}" --token "$GITHUB_TOKEN" --runnergroup {{.GitHubRunnerGroup}} --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral 2>$ERROUT + {{- else}} + ./config.sh --unattended --url "{{ .RepoURL }}" --token "$GITHUB_TOKEN" --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral 2>$ERROUT + {{- end}} + if [ $? -eq 0 ]; then + rm $ERROUT || true + sendStatus "runner successfully configured after $attempt attempt(s)" + break + fi + LAST_ERR=$(cat $ERROUT) + echo "$LAST_ERR" + + # if the runner is already configured, remove it and try again. In the past configuring a runner + # managed to register it but timed out later, resulting in an error. + ./config.sh remove --token "$GITHUB_TOKEN" || true + + if [ $attempt -gt 5 ];then + rm $ERROUT || true + fail "failed to configure runner: $LAST_ERR" + fi + + sendStatus "failed to configure runner (attempt $attempt): $LAST_ERR (retrying in 5 seconds)" + attempt=$((attempt+1)) + rm $ERROUT || true + sleep 5 +done +set -e + +sendStatus "installing runner service" +sudo ./svc.sh install {{ .RunnerUsername }} || fail "failed to install service" +{{- end}} + +if [ -e "/sys/fs/selinux" ];then + sudo chcon -R -h user_u:object_r:bin_t:s0 /home/runner/ || fail "failed to change selinux context" +fi + +AGENT_ID="" +{{- if .UseJITConfig }} +if [ -f "$RUN_HOME/env.sh" ];then + pushd $RUN_HOME + source env.sh + popd +fi +sudo systemctl start $SVC_NAME || fail "failed to start service" +{{- else}} +sendStatus "starting service" +sudo ./svc.sh start || fail "failed to start service" + +set +e +AGENT_ID=$(grep "agentId" "$RUN_HOME"/.runner | tr -d -c 0-9) +if [ $? -ne 0 ];then + fail "failed to get agent ID" +fi +set -e +{{- end}} +systemInfo $AGENT_ID +success "runner successfully installed" $AGENT_ID \ No newline at end of file diff --git a/internal/templates/userdata/github_windows_userdata.tmpl b/internal/templates/userdata/github_windows_userdata.tmpl new file mode 100644 index 00000000..165f9fb5 --- /dev/null +++ b/internal/templates/userdata/github_windows_userdata.tmpl @@ -0,0 +1,509 @@ +#ps1_sysnative +Param( + [Parameter(Mandatory=$false)] + [string]$Token="{{.CallbackToken}}" +) + +$ErrorActionPreference="Stop" + +function Start-ExecuteWithRetry { + [CmdletBinding()] + param( + [Parameter(Mandatory=$true)] + [ScriptBlock]$ScriptBlock, + [int]$MaxRetryCount=10, + [int]$RetryInterval=3, + [string]$RetryMessage, + [array]$ArgumentList=@() + ) + PROCESS { + $currentErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = "Continue" + $retryCount = 0 + while ($true) { + try { + $res = Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList $ArgumentList + $ErrorActionPreference = $currentErrorActionPreference + return $res + } catch [System.Exception] { + $retryCount++ + + if ($_.Exception -is [System.Net.WebException]) { + $webResponse = $_.Exception.Response + # Skip retry on Error: 4XX (e.g. 401 Unauthorized, 404 Not Found etc.) + if ($webResponse -and $webResponse.StatusCode -ge 400 -and $webResponse.StatusCode -lt 500) { + # Skip retry on 4xx errors + Write-Output "Encountered non-retryable error (4xx): $($_.Exception.Message)" + $ErrorActionPreference = $currentErrorActionPreference + throw + } + } + + if ($retryCount -gt $MaxRetryCount) { + $ErrorActionPreference = $currentErrorActionPreference + throw + } else { + if ($RetryMessage) { + Write-Output $RetryMessage + } elseif ($_) { + Write-Output $_ + } + Start-Sleep -Seconds $RetryInterval + } + } + } + } +} + +function Get-RandomString { + [CmdletBinding()] + Param( + [int]$Length=13 + ) + PROCESS { + if($Length -lt 6) { + $Length = 6 + } + $special = @(44, 45, 46, 64) + $numeric = 48..57 + $upper = 65..90 + $lower = 97..122 + + $passwd = [System.Collections.Generic.List[object]](New-object "System.Collections.Generic.List[object]") + for($i=0; $i -lt $Length-4; $i++){ + $c = get-random -input ($special + $numeric + $upper + $lower) + $passwd.Add([char]$c) + } + + $passwd.Add([char](get-random -input $numeric)) + $passwd.Add([char](get-random -input $special)) + $passwd.Add([char](get-random -input $upper)) + $passwd.Add([char](get-random -input $lower)) + + $Random = New-Object Random + return [string]::join("",($passwd|Sort-Object {$Random.Next()})) + } +} + +Add-Type -TypeDefinition @" +using System; +using System.Runtime.InteropServices; +using System.Text; + +public class GrantSysPrivileges +{ + [StructLayout(LayoutKind.Sequential)] + public struct LSA_UNICODE_STRING + { + public ushort Length; + public ushort MaximumLength; + public IntPtr Buffer; + } + + [StructLayout(LayoutKind.Sequential)] + public struct LSA_OBJECT_ATTRIBUTES + { + public int Length; + public IntPtr RootDirectory; + public IntPtr ObjectName; + public uint Attributes; + public IntPtr SecurityDescriptor; + public IntPtr SecurityQualityOfService; + } + + [DllImport("advapi32.dll", SetLastError=true)] + public static extern uint LsaOpenPolicy( + ref LSA_UNICODE_STRING SystemName, + ref LSA_OBJECT_ATTRIBUTES ObjectAttributes, + uint DesiredAccess, + out IntPtr PolicyHandle + ); + + [DllImport("advapi32.dll", SetLastError=true)] + public static extern uint LsaAddAccountRights( + IntPtr PolicyHandle, + IntPtr AccountSid, + LSA_UNICODE_STRING[] UserRights, + uint CountOfRights + ); + + [DllImport("advapi32.dll")] + public static extern uint LsaClose(IntPtr PolicyHandle); + + [DllImport("advapi32.dll")] + public static extern uint LsaNtStatusToWinError(uint status); + + public const uint POLICY_ALL_ACCESS = 0x00F0FFF; + + public static uint GrantPrivilege(byte[] sid, string[] rights) + { + LSA_OBJECT_ATTRIBUTES loa = new LSA_OBJECT_ATTRIBUTES(); + LSA_UNICODE_STRING systemName = new LSA_UNICODE_STRING(); + + IntPtr policyHandle; + uint result = LsaOpenPolicy(ref systemName, ref loa, POLICY_ALL_ACCESS, out policyHandle); + if (result != 0) + { + return LsaNtStatusToWinError(result); + } + + LSA_UNICODE_STRING[] userRights = new LSA_UNICODE_STRING[rights.Length]; + for (int i = 0; i < rights.Length; i++) + { + byte[] bytes = Encoding.Unicode.GetBytes(rights[i]); + IntPtr ptr = Marshal.AllocHGlobal(bytes.Length); + Marshal.Copy(bytes, 0, ptr, bytes.Length); + + userRights[i].Buffer = ptr; + userRights[i].Length = (ushort)bytes.Length; + userRights[i].MaximumLength = (ushort)(bytes.Length); + } + + IntPtr sidPtr = Marshal.AllocHGlobal(sid.Length); + Marshal.Copy(sid, 0, sidPtr, sid.Length); + + result = LsaAddAccountRights(policyHandle, sidPtr, userRights, (uint)rights.Length); + LsaClose(policyHandle); + + foreach (var right in userRights) + { + Marshal.FreeHGlobal(right.Buffer); + } + Marshal.FreeHGlobal(sidPtr); + + return LsaNtStatusToWinError(result); + } +} +"@ -Language CSharp + +function Invoke-FastWebRequest { + [CmdletBinding()] + Param( + [Parameter(Mandatory=$True,ValueFromPipeline=$true,Position=0)] + [System.Uri]$Uri, + [Parameter(Position=1)] + [string]$OutFile, + [Hashtable]$Headers=@{}, + [switch]$SkipIntegrityCheck=$false + ) + PROCESS + { + if(!([System.Management.Automation.PSTypeName]'System.Net.Http.HttpClient').Type) + { + $assembly = [System.Reflection.Assembly]::LoadWithPartialName("System.Net.Http") + } + + if(!$OutFile) { + $OutFile = $Uri.PathAndQuery.Substring($Uri.PathAndQuery.LastIndexOf("/") + 1) + if(!$OutFile) { + throw "The ""OutFile"" parameter needs to be specified" + } + } + + $fragment = $Uri.Fragment.Trim('#') + if ($fragment) { + $details = $fragment.Split("=") + $algorithm = $details[0] + $hash = $details[1] + } + + if (!$SkipIntegrityCheck -and $fragment -and (Test-Path $OutFile)) { + try { + return (Test-FileIntegrity -File $OutFile -Algorithm $algorithm -ExpectedHash $hash) + } catch { + Remove-Item $OutFile + } + } + + $client = new-object System.Net.Http.HttpClient + foreach ($k in $Headers.Keys){ + $client.DefaultRequestHeaders.Add($k, $Headers[$k]) + } + $task = $client.GetStreamAsync($Uri) + $response = $task.Result + if($task.IsFaulted) { + $msg = "Request for URL '{0}' is faulted. Task status: {1}." -f @($Uri, $task.Status) + if($task.Exception) { + $msg += "Exception details: {0}" -f @($task.Exception) + } + Throw $msg + } + $outStream = New-Object IO.FileStream $OutFile, Create, Write, None + + try { + $totRead = 0 + $buffer = New-Object Byte[] 1MB + while (($read = $response.Read($buffer, 0, $buffer.Length)) -gt 0) { + $totRead += $read + $outStream.Write($buffer, 0, $read); + } + } + finally { + $outStream.Close() + } + if(!$SkipIntegrityCheck -and $fragment) { + Test-FileIntegrity -File $OutFile -Algorithm $algorithm -ExpectedHash $hash + } + } +} + +function Import-Certificate() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + $CertificateData, + [parameter(Mandatory=$false)] + [System.Security.Cryptography.X509Certificates.StoreLocation]$StoreLocation="LocalMachine", + [parameter(Mandatory=$false)] + [System.Security.Cryptography.X509Certificates.StoreName]$StoreName="TrustedPublisher" + ) + PROCESS + { + $store = New-Object System.Security.Cryptography.X509Certificates.X509Store( + $StoreName, $StoreLocation) + $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite) + $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($CertificateData) + $store.Add($cert) + } +} + +function Invoke-APICall() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [object]$Payload, + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + Invoke-WebRequest -UseBasicParsing -Method Post -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $CallbackURL -Body (ConvertTo-Json $Payload) | Out-Null + } +} + +function Update-GarmStatus() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$Message, + [parameter(Mandatory=$false)] + [int64]$AgentID=0, + [parameter(Mandatory=$false)] + [string]$Status="installing", + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + $body = @{ + "status"=$Status + "message"=$Message + } + + if ($AgentID -ne 0) { + $body["agent_id"] = $AgentID + } + Invoke-APICall -Payload $body -CallbackURL $CallbackURL | Out-Null + } +} + +function Invoke-GarmSuccess() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$Message, + [parameter(Mandatory=$true)] + [int64]$AgentID, + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + Update-GarmStatus -Message $Message -AgentID $AgentID -CallbackURL $CallbackURL -Status "idle" | Out-Null + } +} + +function Invoke-GarmFailure() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$Message, + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + Update-GarmStatus -Message $Message -CallbackURL $CallbackURL -Status "failed" | Out-Null + Throw $Message + } +} + +function Set-SystemInfo { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$CallbackURL, + [parameter(Mandatory=$true)] + [string]$RunnerDir, + [parameter(Mandatory=$true)] + [string]$BearerToken + ) + + # Construct the path to the .runner file + $agentInfoFile = Join-Path $RunnerDir ".runner" + + # Read and parse the JSON content from the .runner file + $agentInfo = ConvertFrom-Json (Get-Content -Raw -Path $agentInfoFile) + $AgentId = $agentInfo.agent_id + + # Retrieve OS information + $osInfo = Get-WmiObject -Class Win32_OperatingSystem + $osName = $osInfo.Caption + $osVersion = $osInfo.Version + + # Strip status from the callback URL + if ($CallbackUrl -match '^(.*)/status(/)?$') { + $CallbackUrl = $matches[1] + } + + $SysInfoUrl = "$CallbackUrl/system-info/" + $Payload = @{ + os_name = $OSName + os_version = $OSVersion + agent_id = $AgentId + } | ConvertTo-Json + + # Send the POST request + try { + Invoke-RestMethod -Uri $SysInfoUrl -Method Post -Body $Payload -ContentType 'application/json' -Headers @{ 'Authorization' = "Bearer $BearerToken" } -ErrorAction Stop + } catch { + Write-Output "Failed to send the system information." + } +} + +$GHRunnerGroup = "{{.GitHubRunnerGroup}}" + +function Install-Runner() { + $CallbackURL="{{.CallbackURL}}" + if (!($CallbackURL -match "^(.*)/status(/)?$")) { + $CallbackURL = "$CallbackURL/status" + } + + if ($Token.Length -eq 0) { + Throw "missing callback authentication token" + } + try { + $MetadataURL="{{.MetadataURL}}" + $DownloadURL="{{.DownloadURL}}" + if($MetadataURL -eq ""){ + Throw "missing metadata URL" + } + + # Create user with administrator rights to run service as + $userPasswd = Get-RandomString -Length 10 + $secPasswd = ConvertTo-SecureString "$userPasswd" -AsPlainText -Force + $userName = "runner" + $user = Get-LocalUser -Name $userName -ErrorAction SilentlyContinue + if (-not $user) { + New-LocalUser -Name $userName -Password $secPasswd -PasswordNeverExpires -UserMayNotChangePassword + } else { + Set-LocalUser -PasswordNeverExpires $true -Name $userName -Password $secPasswd + } + $pscreds = New-Object System.Management.Automation.PSCredential (".\$userName", $secPasswd) + $hasUser = Get-LocalGroupMember -SID S-1-5-32-544 -Member $userName -ErrorAction SilentlyContinue + if (-not $hasUser){ + Add-LocalGroupMember -SID S-1-5-32-544 -Member $userName + } + $ntAcct = New-Object System.Security.Principal.NTAccount($userName) + $sid = $ntAcct.Translate([System.Security.Principal.SecurityIdentifier]) + $sidBytes = New-Object byte[] ($sid.BinaryLength) + $sid.GetBinaryForm($sidBytes, 0) + + $result = [GrantSysPrivileges]::GrantPrivilege($sidBytes, ("SeBatchLogonRight", "SeServiceLogonRight")) + if ($result -ne 0) { + Throw "Failed to grant privileges" + } + + $bundle = wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/system/cert-bundle + $converted = ConvertFrom-Json $bundle + foreach ($i in $converted.root_certificates.psobject.Properties){ + $data = [System.Convert]::FromBase64String($i.Value) + Import-Certificate -CertificateData $data -StoreName Root -StoreLocation LocalMachine + } + + $runnerDir = "C:\actions-runner" + # Check if a cached runner is available + if (-not (Test-Path $runnerDir)) { + # No cached runner found, proceed to download and extract + Update-GarmStatus -CallbackURL $CallbackURL -Message "downloading tools from {{ .DownloadURL }}" + + $downloadToken="{{.TempDownloadToken}}" + $DownloadTokenHeaders=@{} + if ($downloadToken.Length -gt 0) { + $DownloadTokenHeaders=@{ + "Authorization"="Bearer $downloadToken" + } + } + + $downloadPath = Join-Path $env:TMP "{{ .FileName }}" + Start-ExecuteWithRetry -ScriptBlock { + Invoke-FastWebRequest -Uri "{{ .DownloadURL }}" -OutFile $downloadPath -Headers $DownloadTokenHeaders + } -MaxRetryCount 5 -RetryInterval 5 -RetryMessage "Retrying download of runner..." + + mkdir $runnerDir + Update-GarmStatus -CallbackURL $CallbackURL -Message "extracting runner" + Add-Type -AssemblyName System.IO.Compression.FileSystem + [System.IO.Compression.ZipFile]::ExtractToDirectory($downloadPath, "$runnerDir") + } else { + Update-GarmStatus -CallbackURL $CallbackURL -Message "using cached runner found at $runnerDir" + } + + # Ensure runner has full access to actions-runner folder + $runnerACL = Get-Acl $runnerDir + $runnerACL.SetAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule( + $userName, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow" + ))) + Set-Acl -Path $runnerDir -AclObject $runnerAcl + + Update-GarmStatus -CallbackURL $CallbackURL -Message "configuring and starting runner" + cd $runnerDir + + {{- if .UseJITConfig }} + Update-GarmStatus -CallbackURL $CallbackURL -Message "downloading JIT credentials" + wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/credentials/runner -OutFile (Join-Path $runnerDir ".runner") + wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/credentials/credentials -OutFile (Join-Path $runnerDir ".credentials") + + Add-Type -AssemblyName System.Security + $rsaData = (wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/credentials/credentials_rsaparams) + $encodedBytes = [System.Text.Encoding]::UTF8.GetBytes($rsaData) + $protectedBytes = [Security.Cryptography.ProtectedData]::Protect( $encodedBytes, $null, [Security.Cryptography.DataProtectionScope]::LocalMachine ) + [System.IO.File]::WriteAllBytes((Join-Path $runnerDir ".credentials_rsaparams"), $protectedBytes) + + $serviceNameFile = (Join-Path $runnerDir ".service") + wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/system/service-name -OutFile $serviceNameFile + + Update-GarmStatus -CallbackURL $CallbackURL -Message "Creating system service" + $SVC_NAME=(gc -raw $serviceNameFile) + New-Service -Name "$SVC_NAME" -BinaryPathName "C:\actions-runner\bin\RunnerService.exe" -DisplayName "$SVC_NAME" -Description "GitHub Actions Runner ($SVC_NAME)" -StartupType Automatic -Credential $pscreds + Start-Service "$SVC_NAME" + Set-SystemInfo -CallbackURL $CallbackURL -RunnerDir $runnerDir -BearerToken $Token + Update-GarmStatus -Message "runner successfully installed" -CallbackURL $CallbackURL -Status "idle" | Out-Null + + {{- else }} + $GithubRegistrationToken = Start-ExecuteWithRetry -ScriptBlock { + Invoke-WebRequest -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/runner-registration-token/ + } -MaxRetryCount 5 -RetryInterval 5 -RetryMessage "Retrying download of GitHub registration token..." + {{- if .GitHubRunnerGroup }} + ./config.cmd --unattended --url "{{ .RepoURL }}" --token $GithubRegistrationToken --runnergroup {{.GitHubRunnerGroup}} --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral --runasservice --windowslogonaccount "$userName" --windowslogonpassword "$userPasswd" + {{- else}} + ./config.cmd --unattended --url "{{ .RepoURL }}" --token $GithubRegistrationToken --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral --runasservice --windowslogonaccount "$userName" --windowslogonpassword "$userPasswd" + {{- end}} + if ($LASTEXITCODE) { + Throw "Failed to configure runner. Err code $LASTEXITCODE" + } + $agentInfoFile = Join-Path $runnerDir ".runner" + $agentInfo = ConvertFrom-Json (gc -raw $agentInfoFile) + Set-SystemInfo -CallbackURL $CallbackURL -RunnerDir $runnerDir -BearerToken $Token + Invoke-GarmSuccess -CallbackURL $CallbackURL -Message "runner successfully installed" -AgentID $agentInfo.agentId + {{- end }} + } catch { + Invoke-GarmFailure -CallbackURL $CallbackURL -Message $_ + } +} +Install-Runner \ No newline at end of file diff --git a/internal/templates/userdata/linux_wrapper.tmpl b/internal/templates/userdata/linux_wrapper.tmpl new file mode 100644 index 00000000..b672e8a5 --- /dev/null +++ b/internal/templates/userdata/linux_wrapper.tmpl @@ -0,0 +1,13 @@ +#!/bin/bash + +set -ex +set -o pipefail + +METADATA_URL="{{ .MetadataURL }}" +BEARER_TOKEN="{{ .CallbackToken }}" + +curl -H "Authorization: Bearer $BEARER_TOKEN" --retry 5 --retry-delay 5 --retry-connrefused --fail $METADATA_URL/install-script/ -o /tmp/real-install.sh +chmod +x /tmp/real-install.sh + +/tmp/real-install.sh +rm -f /tmp/real-install.sh diff --git a/internal/templates/userdata/windows_wrapper.tmpl b/internal/templates/userdata/windows_wrapper.tmpl new file mode 100644 index 00000000..f2b040ed --- /dev/null +++ b/internal/templates/userdata/windows_wrapper.tmpl @@ -0,0 +1,57 @@ +$ErrorActionPreference="Stop" + +function Start-ExecuteWithRetry { + [CmdletBinding()] + param( + [Parameter(Mandatory=$true)] + [ScriptBlock]$ScriptBlock, + [int]$MaxRetryCount=10, + [int]$RetryInterval=3, + [string]$RetryMessage, + [array]$ArgumentList=@() + ) + PROCESS { + $currentErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = "Continue" + $retryCount = 0 + while ($true) { + try { + $res = Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList $ArgumentList + $ErrorActionPreference = $currentErrorActionPreference + return $res + } catch [System.Exception] { + $retryCount++ + + if ($_.Exception -is [System.Net.WebException]) { + $webResponse = $_.Exception.Response + # Skip retry on Error: 4XX (e.g. 401 Unauthorized, 404 Not Found etc.) + if ($webResponse -and $webResponse.StatusCode -ge 400 -and $webResponse.StatusCode -lt 500) { + # Skip retry on 4xx errors + Write-Output "Encountered non-retryable error (4xx): $($_.Exception.Message)" + $ErrorActionPreference = $currentErrorActionPreference + throw + } + } + + if ($retryCount -gt $MaxRetryCount) { + $ErrorActionPreference = $currentErrorActionPreference + throw + } else { + if ($RetryMessage) { + Write-Output $RetryMessage + } elseif ($_) { + Write-Output $_ + } + Start-Sleep -Seconds $RetryInterval + } + } + } + } +} + +$installScript = (Join-Path $env:TMP, "garm-install.ps1") +Start-ExecuteWithRetry -ScriptBlock { + wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer {{ .CallbackToken }}"} -Uri {{ .MetadataURL }}/install-script/ -OutFile $installScript +} -MaxRetryCount 5 -RetryInterval 5 -RetryMessage "Retrying download of runner install script..." + +$installScript \ No newline at end of file diff --git a/params/params.go b/params/params.go index 50e26d26..baf1106e 100644 --- a/params/params.go +++ b/params/params.go @@ -400,6 +400,9 @@ type Pool struct { // When fetching matching pools for a set of tags, the result will be sorted in descending // order of priority. Priority uint `json:"priority,omitempty"` + + TemplateID uint `json:"template_id,omitempty"` + TemplateName string `json:"template_name,omitempty"` } func (p Pool) BelongsTo(entity ForgeEntity) bool { @@ -544,6 +547,8 @@ type ScaleSet struct { EnterpriseID string `json:"enterprise_id,omitempty"` EnterpriseName string `json:"enterprise_name,omitempty"` + TemplateID uint `json:"template_id,omitempty"` + TemplateName string `json:"template_name,omitempty"` LastMessageID int64 `json:"-"` } @@ -1259,3 +1264,21 @@ type EnterpriseFilter struct { Name string Endpoint string } + +// swagger:model Template +type Template struct { + ID uint `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + + Name string `json:"name"` + Description string `json:"description"` + OSType commonParams.OSType `json:"os_type"` + ForgeType EndpointType `json:"forge_type,omitempty"` + Data []byte `json:"data"` + Owner string `json:"owner_id,omitempty"` +} + +// used by swagger client generated code +// swagger:model Templates +type Templates []Template diff --git a/params/requests.go b/params/requests.go index c9021434..1d544263 100644 --- a/params/requests.go +++ b/params/requests.go @@ -173,6 +173,7 @@ type UpdatePoolParams struct { // The runner group must be created by someone with access to the enterprise. GitHubRunnerGroup *string `json:"github-runner-group,omitempty"` Priority *uint `json:"priority,omitempty"` + TemplateID *uint `json:"template_id,omitempty"` } type CreateInstanceParams struct { @@ -212,6 +213,7 @@ type CreatePoolParams struct { // The runner group must be created by someone with access to the enterprise. GitHubRunnerGroup string `json:"github-runner-group,omitempty"` Priority uint `json:"priority,omitempty"` + TemplateID *uint `json:"template_id,omitempty"` } func (p *CreatePoolParams) Validate() error { @@ -586,6 +588,7 @@ type CreateScaleSetParams struct { // pool will be added to. // The runner group must be created by someone with access to the enterprise. GitHubRunnerGroup string `json:"github-runner-group,omitempty"` + TemplateID *uint `json:"template_id,omitempty"` } func (s *CreateScaleSetParams) Validate() error { @@ -636,6 +639,7 @@ type UpdateScaleSetParams struct { GitHubRunnerGroup *string `json:"runner_group,omitempty"` State *ScaleSetState `json:"state"` ExtendedState *string `json:"extended_state"` + TemplateID *uint `json:"template_id,omitempty"` ScaleSetID int `json:"-"` } @@ -787,3 +791,50 @@ func (u UpdateGiteaCredentialsParams) Validate() error { return nil } + +// swagger:model CreateTemplateParams +type CreateTemplateParams struct { + Name string `json:"name"` + Description string `json:"description"` + Data []byte `json:"data"` + OSType commonParams.OSType `json:"os_type"` + ForgeType EndpointType `json:"forge_type,omitempty"` +} + +func (c *CreateTemplateParams) Validate() error { + if c.Name == "" { + return fmt.Errorf("name cannot be empty") + } + + if len(c.Data) == 0 { + return fmt.Errorf("template data is empty") + } + + switch c.OSType { + case commonParams.Linux, commonParams.Windows: + default: + return fmt.Errorf("invalid OS type: %q", c.OSType) + } + + switch c.ForgeType { + case GithubEndpointType, GiteaEndpointType: + default: + return fmt.Errorf("invalid forge type: %q", c.ForgeType) + } + return nil +} + +// swagger:model UpdateTemplateParams +type UpdateTemplateParams struct { + Name *string `json:"name"` + Description *string `json:"description"` + Data []byte `json:"data"` +} + +func (u *UpdateTemplateParams) Validate() error { + if u.Name != nil && *u.Name == "" { + return fmt.Errorf("name cannot be empty") + } + + return nil +} diff --git a/runner/enterprises.go b/runner/enterprises.go index 6b393abd..448871cc 100644 --- a/runner/enterprises.go +++ b/runner/enterprises.go @@ -219,11 +219,17 @@ func (r *Runner) CreateEnterprisePool(ctx context.Context, enterpriseID string, param.RunnerBootstrapTimeout = appdefaults.DefaultRunnerBootstrapTimeout } - entity := params.ForgeEntity{ - ID: enterpriseID, - EntityType: params.ForgeEntityTypeEnterprise, + entity, err := r.store.GetForgeEntity(ctx, params.ForgeEntityTypeEnterprise, enterpriseID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to get repo: %w", err) } + template, err := r.findTemplate(ctx, entity, param.OSType, param.TemplateID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to find suitable template: %w", err) + } + + createPoolParams.TemplateID = &template.ID pool, err := r.store.CreateEntityPool(ctx, entity, createPoolParams) if err != nil { return params.Pool{}, fmt.Errorf("failed to create enterprise pool: %w", err) @@ -298,10 +304,17 @@ func (r *Runner) UpdateEnterprisePool(ctx context.Context, enterpriseID, poolID if !auth.IsAdmin(ctx) { return params.Pool{}, runnerErrors.ErrUnauthorized } + entity, err := r.store.GetForgeEntity(ctx, params.ForgeEntityTypeEnterprise, enterpriseID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to get repo: %w", err) + } - entity := params.ForgeEntity{ - ID: enterpriseID, - EntityType: params.ForgeEntityTypeEnterprise, + if param.TemplateID != nil { + template, err := r.findTemplate(ctx, entity, param.OSType, param.TemplateID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to find suitable template: %w", err) + } + param.TemplateID = &template.ID } pool, err := r.store.GetEntityPool(ctx, entity, poolID) if err != nil { diff --git a/runner/metadata.go b/runner/metadata.go index b309b96e..17cf0caa 100644 --- a/runner/metadata.go +++ b/runner/metadata.go @@ -18,15 +18,27 @@ import ( "bytes" "context" "encoding/base64" + "encoding/json" "errors" "fmt" "html/template" "log/slog" + "strings" + "github.com/cloudbase/garm-provider-common/cloudconfig" "github.com/cloudbase/garm-provider-common/defaults" runnerErrors "github.com/cloudbase/garm-provider-common/errors" + "github.com/cloudbase/garm-provider-common/util" "github.com/cloudbase/garm/auth" + "github.com/cloudbase/garm/cache" + "github.com/cloudbase/garm/internal/templates" "github.com/cloudbase/garm/params" + garmUtil "github.com/cloudbase/garm/util" +) + +var ( + poolIDLabelprefix = "runner-pool-id" + controllerLabelPrefix = "runner-controller-id" ) var githubSystemdUnitTemplate = `[Unit] @@ -75,43 +87,6 @@ func validateInstanceState(ctx context.Context) (params.Instance, error) { return instance, nil } -func (r *Runner) getForgeEntityFromInstance(ctx context.Context, instance params.Instance) (params.ForgeEntity, error) { - var entityGetter params.EntityGetter - var err error - switch { - case instance.PoolID != "": - entityGetter, err = r.store.GetPoolByID(r.ctx, instance.PoolID) - case instance.ScaleSetID != 0: - entityGetter, err = r.store.GetScaleSetByID(r.ctx, instance.ScaleSetID) - default: - return params.ForgeEntity{}, errors.New("instance not associated with a pool or scale set") - } - - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext( - ctx, "failed to get entity getter", - "instance", instance.Name) - return params.ForgeEntity{}, fmt.Errorf("error fetching entity getter: %w", err) - } - - poolEntity, err := entityGetter.GetEntity() - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext( - ctx, "failed to get entity", - "instance", instance.Name) - return params.ForgeEntity{}, fmt.Errorf("error fetching entity: %w", err) - } - - entity, err := r.store.GetForgeEntity(r.ctx, poolEntity.EntityType, poolEntity.ID) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext( - ctx, "failed to get entity", - "instance", instance.Name) - return params.ForgeEntity{}, fmt.Errorf("error fetching entity: %w", err) - } - return entity, nil -} - func (r *Runner) getServiceNameForEntity(entity params.ForgeEntity) (string, error) { switch entity.EntityType { case params.ForgeEntityTypeEnterprise: @@ -126,16 +101,10 @@ func (r *Runner) getServiceNameForEntity(entity params.ForgeEntity) (string, err } func (r *Runner) GetRunnerServiceName(ctx context.Context) (string, error) { - instance, err := validateInstanceState(ctx) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext( - ctx, "failed to get instance params") - return "", runnerErrors.ErrUnauthorized - } - entity, err := r.getForgeEntityFromInstance(ctx, instance) + entity, err := auth.InstanceEntity(ctx) if err != nil { slog.ErrorContext(r.ctx, "failed to get entity", "error", err) - return "", fmt.Errorf("error fetching entity: %w", err) + return "", runnerErrors.ErrUnauthorized } serviceName, err := r.getServiceNameForEntity(entity) @@ -146,17 +115,151 @@ func (r *Runner) GetRunnerServiceName(ctx context.Context) (string, error) { return serviceName, nil } -func (r *Runner) GenerateSystemdUnitFile(ctx context.Context, runAsUser string) ([]byte, error) { +func getLabelsForInstance(instance params.Instance) []string { + jitEnabled := len(instance.JitConfiguration) > 0 + if jitEnabled { + return []string{} + } + + if instance.ScaleSetID > 0 { + return []string{} + } + + pool, ok := cache.GetPoolByID(instance.PoolID) + if !ok { + return []string{} + } + var labels []string + for _, val := range pool.Tags { + labels = append(labels, val.Name) + } + + labels = append(labels, fmt.Sprintf("%s=%s", controllerLabelPrefix, cache.ControllerInfo().ControllerID.String())) + labels = append(labels, fmt.Sprintf("%s=%s", poolIDLabelprefix, instance.PoolID)) + return labels +} + +func (r *Runner) getRunnerInstallTemplateContext(instance params.Instance, entity params.ForgeEntity, token string, extraContext map[string]string) (cloudconfig.InstallRunnerParams, error) { + tools, err := cache.GetGithubToolsCache(entity.ID) + if err != nil { + return cloudconfig.InstallRunnerParams{}, fmt.Errorf("failed to get tools: %w", err) + } + + foundTools, err := util.GetTools(instance.OSType, instance.OSArch, tools) + if err != nil { + return cloudconfig.InstallRunnerParams{}, fmt.Errorf("failed to find tools: %w", err) + } + + installRunnerParams := cloudconfig.InstallRunnerParams{ + FileName: foundTools.GetFilename(), + DownloadURL: foundTools.GetDownloadURL(), + RunnerUsername: defaults.DefaultUser, + RunnerGroup: defaults.DefaultUser, + RepoURL: entity.ForgeURL(), + MetadataURL: instance.MetadataURL, + RunnerName: instance.Name, + RunnerLabels: strings.Join(getLabelsForInstance(instance), ","), + CallbackURL: instance.CallbackURL, + CallbackToken: token, + TempDownloadToken: foundTools.GetTempDownloadToken(), + GitHubRunnerGroup: instance.GitHubRunnerGroup, + ExtraContext: extraContext, + CABundle: string(entity.Credentials.CABundle), + UseJITConfig: len(instance.JitConfiguration) > 0, + } + return installRunnerParams, nil +} + +func (r *Runner) GetRunnerInstallScript(ctx context.Context) ([]byte, error) { instance, err := validateInstanceState(ctx) if err != nil { slog.With(slog.Any("error", err)).ErrorContext( ctx, "failed to get instance params") return nil, runnerErrors.ErrUnauthorized } - entity, err := r.getForgeEntityFromInstance(ctx, instance) + + entity, err := auth.InstanceEntity(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get instance entity: %w", err) + } + + token, err := auth.InstanceAuthToken(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get instance token: %w", err) + } + + var templateID uint + var specs cloudconfig.CloudConfigSpec + var extraSpecs json.RawMessage + switch { + case instance.PoolID != "": + pool, err := r.store.GetPoolByID(r.ctx, instance.PoolID) + if err != nil { + return nil, fmt.Errorf("failed to get pool for instance: %w", err) + } + specs, err = garmUtil.GetCloudConfigSpecFromExtraSpecs(pool.ExtraSpecs) + if err != nil { + return nil, fmt.Errorf("failed to extract extra specs from pool: %w", err) + } + extraSpecs = pool.ExtraSpecs + templateID = pool.TemplateID + case instance.ScaleSetID > 0: + scaleSet, err := r.store.GetScaleSetByID(r.ctx, instance.ScaleSetID) + if err != nil { + return nil, fmt.Errorf("failed to get scale set for instance: %w", err) + } + specs, err = garmUtil.GetCloudConfigSpecFromExtraSpecs(scaleSet.ExtraSpecs) + if err != nil { + return nil, fmt.Errorf("failed to extract extra specs from scale set: %w", err) + } + extraSpecs = scaleSet.ExtraSpecs + templateID = scaleSet.TemplateID + default: + return nil, fmt.Errorf("instance is not part of a pool or scale set") + } + + if templateID == 0 && len(specs.RunnerInstallTemplate) == 0 { + return nil, runnerErrors.NewConflictError("pool or scale set has no template associated and no template is defined in extra_specs") + } + + installCtx, err := r.getRunnerInstallTemplateContext(instance, entity, token, specs.ExtraContext) + if err != nil { + return nil, fmt.Errorf("failed to get runner install context: %w", err) + } + + var extraSpecsMap map[string]any + if extraSpecs != nil { + if err := json.Unmarshal(extraSpecs, &extraSpecsMap); err == nil { + if debug, ok := extraSpecsMap["enable_boot_debug"]; ok { + installCtx.EnableBootDebug = debug.(bool) + } + } + } + + var tplBytes []byte + if len(specs.RunnerInstallTemplate) > 0 { + installCtx.ExtraContext = specs.ExtraContext + tplBytes = specs.RunnerInstallTemplate + } else { + template, err := r.store.GetTemplate(r.ctx, templateID) + if err != nil { + return nil, fmt.Errorf("failed to get template: %w", err) + } + tplBytes = template.Data + } + + installScript, err := templates.RenderRunnerInstallScript(string(tplBytes), installCtx) + if err != nil { + return nil, fmt.Errorf("failed to get runner install script: %w", err) + } + return installScript, nil +} + +func (r *Runner) GenerateSystemdUnitFile(ctx context.Context, runAsUser string) ([]byte, error) { + entity, err := auth.InstanceEntity(ctx) if err != nil { slog.ErrorContext(r.ctx, "failed to get entity", "error", err) - return nil, fmt.Errorf("error fetching entity: %w", err) + return nil, runnerErrors.ErrUnauthorized } serviceName, err := r.getServiceNameForEntity(entity) diff --git a/runner/metadata_test.go b/runner/metadata_test.go new file mode 100644 index 00000000..be2b8832 --- /dev/null +++ b/runner/metadata_test.go @@ -0,0 +1,498 @@ +// Copyright 2025 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package runner + +import ( + "context" + "encoding/base64" + "fmt" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/suite" + + runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" + "github.com/cloudbase/garm/auth" + "github.com/cloudbase/garm/database" + dbCommon "github.com/cloudbase/garm/database/common" + garmTesting "github.com/cloudbase/garm/internal/testing" + "github.com/cloudbase/garm/params" + "github.com/cloudbase/garm/runner/common" + runnerCommonMocks "github.com/cloudbase/garm/runner/common/mocks" + runnerMocks "github.com/cloudbase/garm/runner/mocks" +) + +type MetadataTestFixtures struct { + AdminContext context.Context + Store dbCommon.Store + Providers map[string]common.Provider + ProviderMock *runnerCommonMocks.Provider + PoolMgrMock *runnerCommonMocks.PoolManager + PoolMgrCtrlMock *runnerMocks.PoolManagerController + TestInstance params.Instance + TestEntity params.ForgeEntity + TestPool params.Pool + TestTemplate params.Template +} + +type MetadataTestSuite struct { + suite.Suite + Fixtures *MetadataTestFixtures + Runner *Runner + + adminCtx context.Context + instanceCtx context.Context + unauthorizedCtx context.Context + invalidInstanceCtx context.Context + jitInstanceCtx context.Context + githubEndpoint params.ForgeEndpoint +} + +func (s *MetadataTestSuite) SetupTest() { + // create testing sqlite database + dbCfg := garmTesting.GetTestSqliteDBConfig(s.T()) + db, err := database.NewDatabase(context.Background(), dbCfg) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create db connection: %s", err)) + } + + s.adminCtx = garmTesting.ImpersonateAdminContext(context.Background(), db, s.T()) + + s.githubEndpoint = garmTesting.CreateDefaultGithubEndpoint(s.adminCtx, db, s.T()) + testCreds := garmTesting.CreateTestGithubCredentials(s.adminCtx, "test-creds", db, s.T(), s.githubEndpoint) + + // Create test organization + org, err := db.CreateOrganization(s.adminCtx, "test-org", testCreds, "test-webhook-secret", params.PoolBalancerTypeRoundRobin) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create test org: %s", err)) + } + + entity, err := org.GetEntity() + if err != nil { + s.FailNow(fmt.Sprintf("failed to get entity: %s", err)) + } + // Set entity name for service name generation + entity.Name = "test-org" + + // Create test template + template, err := db.CreateTemplate(s.adminCtx, params.CreateTemplateParams{ + Name: "test-template", + Description: "Test template for metadata tests", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`#!/bin/bash\necho "Installing runner..."`), + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create test template: %s", err)) + } + + // Create test pool + pool, err := db.CreateEntityPool(s.adminCtx, entity, params.CreatePoolParams{ + ProviderName: "test-provider", + MaxRunners: 2, + MinIdleRunners: 1, + Image: "ubuntu:22.04", + Flavor: "medium", + OSType: commonParams.Linux, + OSArch: commonParams.Amd64, + Tags: []string{"linux", "amd64"}, + RunnerBootstrapTimeout: 10, + TemplateID: &template.ID, + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create test pool: %s", err)) + } + + // Create test instance + instance, err := db.CreateInstance(s.adminCtx, pool.ID, params.CreateInstanceParams{ + Name: "test-instance", + OSType: commonParams.Linux, + OSArch: commonParams.Amd64, + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create test instance: %s", err)) + } + + providerMock := runnerCommonMocks.NewProvider(s.T()) + poolMgrMock := runnerCommonMocks.NewPoolManager(s.T()) + poolMgrCtrlMock := runnerMocks.NewPoolManagerController(s.T()) + + fixtures := &MetadataTestFixtures{ + AdminContext: s.adminCtx, + Store: db, + Providers: map[string]common.Provider{ + "test-provider": providerMock, + }, + ProviderMock: providerMock, + PoolMgrMock: poolMgrMock, + PoolMgrCtrlMock: poolMgrCtrlMock, + TestInstance: instance, + TestEntity: entity, + TestPool: pool, + TestTemplate: template, + } + + s.Fixtures = fixtures + + // setup test runner + runner := &Runner{ + providers: fixtures.Providers, + ctx: fixtures.AdminContext, + store: fixtures.Store, + poolManagerCtrl: fixtures.PoolMgrCtrlMock, + } + s.Runner = runner + + // Set up various contexts for testing + s.setupContexts() +} + +func (s *MetadataTestSuite) setupContexts() { + // Valid instance context + s.instanceCtx = auth.SetInstanceParams(context.Background(), s.Fixtures.TestInstance) + s.instanceCtx = auth.SetInstanceRunnerStatus(s.instanceCtx, params.RunnerPending) + s.instanceCtx = auth.SetInstanceEntity(s.instanceCtx, s.Fixtures.TestEntity) + s.instanceCtx = auth.SetInstanceAuthToken(s.instanceCtx, "test-auth-token") + + // Unauthorized context (no instance params) + s.unauthorizedCtx = context.Background() + + // Invalid instance context (wrong status) + s.invalidInstanceCtx = auth.SetInstanceParams(context.Background(), s.Fixtures.TestInstance) + s.invalidInstanceCtx = auth.SetInstanceRunnerStatus(s.invalidInstanceCtx, params.RunnerActive) + s.invalidInstanceCtx = auth.SetInstanceEntity(s.invalidInstanceCtx, s.Fixtures.TestEntity) + + // JIT instance context + jitInstance := s.Fixtures.TestInstance + jitInstance.JitConfiguration = map[string]string{ + ".runner": base64.StdEncoding.EncodeToString([]byte("runner config")), + ".credentials": base64.StdEncoding.EncodeToString([]byte("credentials config")), + } + s.jitInstanceCtx = auth.SetInstanceParams(context.Background(), jitInstance) + s.jitInstanceCtx = auth.SetInstanceRunnerStatus(s.jitInstanceCtx, params.RunnerPending) + s.jitInstanceCtx = auth.SetInstanceEntity(s.jitInstanceCtx, s.Fixtures.TestEntity) + s.jitInstanceCtx = auth.SetInstanceHasJITConfig(s.jitInstanceCtx, jitInstance.JitConfiguration) +} + +func (s *MetadataTestSuite) TestGetServiceNameForEntity() { + tests := []struct { + name string + entity params.ForgeEntity + expected string + hasError bool + }{ + { + name: "Organization entity", + entity: params.ForgeEntity{ + EntityType: params.ForgeEntityTypeOrganization, + Owner: "test-owner", + Name: "test-name", + }, + expected: "actions.runner.test-owner.test-name", + hasError: false, + }, + { + name: "Repository entity", + entity: params.ForgeEntity{ + EntityType: params.ForgeEntityTypeRepository, + Owner: "test-owner", + Name: "test-repo", + }, + expected: "actions.runner.test-owner-test-repo.test-repo", + hasError: false, + }, + { + name: "Enterprise entity", + entity: params.ForgeEntity{ + EntityType: params.ForgeEntityTypeEnterprise, + Owner: "test-enterprise", + Name: "test-name", + }, + expected: "actions.runner.test-enterprise.test-name", + hasError: false, + }, + { + name: "Unknown entity type", + entity: params.ForgeEntity{ + EntityType: "unknown", + Owner: "test-owner", + Name: "test-name", + }, + expected: "", + hasError: true, + }, + } + + for _, tt := range tests { + s.Run(tt.name, func() { + serviceName, err := s.Runner.getServiceNameForEntity(tt.entity) + if tt.hasError { + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "unknown entity type") + } else { + s.Require().Nil(err) + s.Require().Equal(tt.expected, serviceName) + } + }) + } +} + +func (s *MetadataTestSuite) TestGetRunnerServiceName() { + serviceName, err := s.Runner.GetRunnerServiceName(s.instanceCtx) + + s.Require().Nil(err) + s.Require().Equal("actions.runner.test-org.test-org", serviceName) +} + +func (s *MetadataTestSuite) TestGetRunnerServiceNameUnauthorized() { + _, err := s.Runner.GetRunnerServiceName(s.unauthorizedCtx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetLabelsForInstance() { + // Test with regular instance + // Since we can't easily set up the cache in tests, labels might be empty + // but the function should not panic + labels := getLabelsForInstance(s.Fixtures.TestInstance) + s.Require().NotNil(labels) // Should return a slice, even if empty + + // Test with JIT instance (should return empty labels) + jitInstance := s.Fixtures.TestInstance + jitInstance.JitConfiguration = map[string]string{"test": "config"} + jitLabels := getLabelsForInstance(jitInstance) + s.Require().Empty(jitLabels) + + // Test with scale set instance (should return empty labels) + scaleSetInstance := s.Fixtures.TestInstance + scaleSetInstance.ScaleSetID = 123 + scaleSetLabels := getLabelsForInstance(scaleSetInstance) + s.Require().Empty(scaleSetLabels) +} + +func (s *MetadataTestSuite) TestGetRunnerInstallScript() { + // This test requires complex cache setup for github tools + // Skipping for now as it would require significant test infrastructure + s.T().Skip("Skipping install script test - requires github tools cache setup") +} + +func (s *MetadataTestSuite) TestGetRunnerInstallScriptUnauthorized() { + _, err := s.Runner.GetRunnerInstallScript(s.unauthorizedCtx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetRunnerInstallScriptInvalidState() { + _, err := s.Runner.GetRunnerInstallScript(s.invalidInstanceCtx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGenerateSystemdUnitFile() { + tests := []struct { + name string + runAsUser string + forgeType params.EndpointType + expectedTemplate string + }{ + { + name: "GitHub with custom user", + runAsUser: "custom-user", + forgeType: params.GithubEndpointType, + expectedTemplate: "GitHub Actions Runner", + }, + { + name: "GitHub with default user", + runAsUser: "", + forgeType: params.GithubEndpointType, + expectedTemplate: "GitHub Actions Runner", + }, + { + name: "Gitea with custom user", + runAsUser: "gitea-user", + forgeType: params.GiteaEndpointType, + expectedTemplate: "Act Runner", + }, + } + + for _, tt := range tests { + s.Run(tt.name, func() { + // Set up entity with specific forge type + entity := s.Fixtures.TestEntity + entity.Credentials.ForgeType = tt.forgeType + ctx := auth.SetInstanceEntity(context.Background(), entity) + + unitFile, err := s.Runner.GenerateSystemdUnitFile(ctx, tt.runAsUser) + + s.Require().Nil(err) + s.Require().NotEmpty(unitFile) + s.Require().Contains(string(unitFile), tt.expectedTemplate) + s.Require().Contains(string(unitFile), "test-org") + + if tt.runAsUser != "" { + s.Require().Contains(string(unitFile), tt.runAsUser) + } else { + s.Require().Contains(string(unitFile), "runner") // default user + } + }) + } +} + +func (s *MetadataTestSuite) TestGenerateSystemdUnitFileUnknownForgeType() { + entity := s.Fixtures.TestEntity + entity.Credentials.ForgeType = "unknown" + ctx := auth.SetInstanceEntity(context.Background(), entity) + + _, err := s.Runner.GenerateSystemdUnitFile(ctx, "test-user") + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "unknown forge type") +} + +func (s *MetadataTestSuite) TestGenerateSystemdUnitFileUnauthorized() { + _, err := s.Runner.GenerateSystemdUnitFile(s.unauthorizedCtx, "test-user") + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetJITConfigFile() { + fileName := ".runner" + expectedContent := "runner config" + + content, err := s.Runner.GetJITConfigFile(s.jitInstanceCtx, fileName) + + s.Require().Nil(err) + s.Require().Equal(expectedContent, string(content)) +} + +func (s *MetadataTestSuite) TestGetJITConfigFileNotJIT() { + _, err := s.Runner.GetJITConfigFile(s.instanceCtx, ".runner") + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "instance not configured for JIT") +} + +func (s *MetadataTestSuite) TestGetJITConfigFileUnauthorized() { + _, err := s.Runner.GetJITConfigFile(s.unauthorizedCtx, ".runner") + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "instance not configured for JIT") +} + +func (s *MetadataTestSuite) TestGetJITConfigFileNotFound() { + _, err := s.Runner.GetJITConfigFile(s.jitInstanceCtx, "nonexistent-file") + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "could not find file") +} + +func (s *MetadataTestSuite) TestGetInstanceGithubRegistrationToken() { + expectedToken := "test-registration-token" + + // Set up mocks + s.Fixtures.PoolMgrCtrlMock.On("GetOrgPoolManager", mock.AnythingOfType("params.Organization")).Return(s.Fixtures.PoolMgrMock, nil) + s.Fixtures.PoolMgrMock.On("GithubRunnerRegistrationToken").Return(expectedToken, nil) + + token, err := s.Runner.GetInstanceGithubRegistrationToken(s.instanceCtx) + + s.Require().Nil(err) + s.Require().Equal(expectedToken, token) + + s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) + s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) +} + +func (s *MetadataTestSuite) TestGetInstanceGithubRegistrationTokenUnauthorized() { + _, err := s.Runner.GetInstanceGithubRegistrationToken(s.unauthorizedCtx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetInstanceGithubRegistrationTokenInvalidState() { + _, err := s.Runner.GetInstanceGithubRegistrationToken(s.invalidInstanceCtx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetInstanceGithubRegistrationTokenAlreadyFetched() { + // Set up context with token already fetched + ctx := auth.SetInstanceTokenFetched(s.instanceCtx, true) + + _, err := s.Runner.GetInstanceGithubRegistrationToken(ctx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetInstanceGithubRegistrationTokenJITConfig() { + _, err := s.Runner.GetInstanceGithubRegistrationToken(s.jitInstanceCtx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetRootCertificateBundle() { + expectedBundle := params.CertificateBundle{ + RootCertificates: map[string][]byte{ + "test-ca": []byte("test-certificate"), + }, + } + + // Set up mocks + s.Fixtures.PoolMgrCtrlMock.On("GetOrgPoolManager", mock.AnythingOfType("params.Organization")).Return(s.Fixtures.PoolMgrMock, nil) + s.Fixtures.PoolMgrMock.On("RootCABundle").Return(expectedBundle, nil) + + bundle, err := s.Runner.GetRootCertificateBundle(s.instanceCtx) + + s.Require().Nil(err) + s.Require().Equal(expectedBundle.RootCertificates, bundle.RootCertificates) + + s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) + s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) +} + +func (s *MetadataTestSuite) TestGetRootCertificateBundleUnauthorized() { + _, err := s.Runner.GetRootCertificateBundle(s.unauthorizedCtx) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *MetadataTestSuite) TestGetRootCertificateBundleInvalidBundle() { + // Set up mocks to return error for invalid bundle + s.Fixtures.PoolMgrCtrlMock.On("GetOrgPoolManager", mock.AnythingOfType("params.Organization")).Return(s.Fixtures.PoolMgrMock, nil) + s.Fixtures.PoolMgrMock.On("RootCABundle").Return(params.CertificateBundle{}, fmt.Errorf("invalid bundle")) + s.Fixtures.PoolMgrMock.On("ID").Return("test-pool-manager-id") + + bundle, err := s.Runner.GetRootCertificateBundle(s.instanceCtx) + + // Should return empty bundle without error when CA bundle is invalid + s.Require().Nil(err) + s.Require().Empty(bundle.RootCertificates) + + s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) + s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) +} + +func TestMetadataTestSuite(t *testing.T) { + suite.Run(t, new(MetadataTestSuite)) +} diff --git a/runner/organizations.go b/runner/organizations.go index ffdd1c6c..04df1fff 100644 --- a/runner/organizations.go +++ b/runner/organizations.go @@ -245,11 +245,16 @@ func (r *Runner) CreateOrgPool(ctx context.Context, orgID string, param params.C param.RunnerBootstrapTimeout = appdefaults.DefaultRunnerBootstrapTimeout } - entity := params.ForgeEntity{ - ID: orgID, - EntityType: params.ForgeEntityTypeOrganization, + entity, err := r.store.GetForgeEntity(ctx, params.ForgeEntityTypeOrganization, orgID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to get repo: %w", err) } + template, err := r.findTemplate(ctx, entity, param.OSType, param.TemplateID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to find suitable template: %w", err) + } + createPoolParams.TemplateID = &template.ID pool, err := r.store.CreateEntityPool(ctx, entity, createPoolParams) if err != nil { return params.Pool{}, fmt.Errorf("error creating pool: %w", err) @@ -330,9 +335,16 @@ func (r *Runner) UpdateOrgPool(ctx context.Context, orgID, poolID string, param return params.Pool{}, runnerErrors.ErrUnauthorized } - entity := params.ForgeEntity{ - ID: orgID, - EntityType: params.ForgeEntityTypeOrganization, + entity, err := r.store.GetForgeEntity(ctx, params.ForgeEntityTypeOrganization, orgID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to get repo: %w", err) + } + if param.TemplateID != nil { + template, err := r.findTemplate(ctx, entity, param.OSType, param.TemplateID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to find suitable template: %w", err) + } + param.TemplateID = &template.ID } pool, err := r.store.GetEntityPool(ctx, entity, poolID) diff --git a/runner/pool/pool.go b/runner/pool/pool.go index f8f9c812..36a7de03 100644 --- a/runner/pool/pool.go +++ b/runner/pool/pool.go @@ -881,14 +881,23 @@ func (r *basePoolManager) addInstanceToProvider(instance params.Instance) error } jwtValidity := pool.RunnerTimeout() - jwtToken, err := r.instanceTokenGetter.NewInstanceJWTToken(instance, r.entity, jwtValidity) if err != nil { return fmt.Errorf("error fetching instance jwt token: %w", err) } + if pool.TemplateID == 0 { + cloudConfigSpecs, err := garmUtil.GetCloudConfigSpecFromExtraSpecs(pool.ExtraSpecs) + if err != nil { + return fmt.Errorf("pool has no template set and extra specs are invalid: %w", err) + } + if len(cloudConfigSpecs.RunnerInstallTemplate) == 0 { + return fmt.Errorf("pool has no template set and extra specs has no runner_install_template set") + } + } + specs := garmUtil.MaybeAddWrapperToExtraSpecs(r.ctx, pool.ExtraSpecs, pool.OSType, instance.MetadataURL, jwtToken) + // If no runner_install_template override is set by the user, we set our own. hasJITConfig := len(instance.JitConfiguration) > 0 - bootstrapArgs := commonParams.BootstrapInstance{ Name: instance.Name, Tools: r.tools, @@ -900,7 +909,7 @@ func (r *basePoolManager) addInstanceToProvider(instance params.Instance) error OSType: pool.OSType, Flavor: pool.Flavor, Image: pool.Image, - ExtraSpecs: pool.ExtraSpecs, + ExtraSpecs: specs, PoolID: instance.PoolID, CACertBundle: r.entity.Credentials.CABundle, GitHubRunnerGroup: instance.GitHubRunnerGroup, diff --git a/runner/repositories.go b/runner/repositories.go index 0f21d882..a117b4d0 100644 --- a/runner/repositories.go +++ b/runner/repositories.go @@ -22,6 +22,7 @@ import ( "strings" runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" "github.com/cloudbase/garm/auth" "github.com/cloudbase/garm/params" "github.com/cloudbase/garm/runner/common" @@ -229,6 +230,44 @@ func (r *Runner) UpdateRepository(ctx context.Context, repoID string, param para return repo, nil } +func (r *Runner) findTemplate(ctx context.Context, entity params.ForgeEntity, osType commonParams.OSType, templateID *uint) (params.Template, error) { + var template params.Template + if templateID != nil { + dbTpl, err := r.store.GetTemplate(ctx, *templateID) + if err != nil { + return params.Template{}, fmt.Errorf("failed to get template: %w", err) + } + template = dbTpl + } else { + tpls, err := r.store.ListTemplates(ctx, &osType, &entity.Credentials.ForgeType, nil) + if err != nil { + return params.Template{}, fmt.Errorf("failed to list templates: %w", err) + } + if len(tpls) == 0 { + return params.Template{}, runnerErrors.NewBadRequestError("no template ID supplied and no default template can be found") + } + for _, val := range tpls { + slog.InfoContext(ctx, "considering template", "name", val.Name, "os_type", val.OSType, "pool_os_type", osType, "forge_type", val.ForgeType, "pool_forge_type", entity.Credentials.ForgeType, "owner", val.Owner) + if val.OSType == osType && val.ForgeType == entity.Credentials.ForgeType && val.Owner == "system" { + template = val + break + } + } + } + if template.ID == 0 { + return params.Template{}, runnerErrors.NewBadRequestError("no template ID supplied and no default template can be found") + } + + if template.OSType != osType { + return params.Template{}, runnerErrors.NewBadRequestError("selected template OS type (%s) and pool OS type (%s) do not match", template.OSType, osType) + } + + if template.ForgeType != entity.Credentials.ForgeType { + return params.Template{}, runnerErrors.NewBadRequestError("selected template forge type (%s) and pool forge type (%s) do not match", template.ForgeType, entity.Credentials.ForgeType) + } + return template, nil +} + func (r *Runner) CreateRepoPool(ctx context.Context, repoID string, param params.CreatePoolParams) (params.Pool, error) { if !auth.IsAdmin(ctx) { return params.Pool{}, runnerErrors.ErrUnauthorized @@ -243,11 +282,17 @@ func (r *Runner) CreateRepoPool(ctx context.Context, repoID string, param params createPoolParams.RunnerBootstrapTimeout = appdefaults.DefaultRunnerBootstrapTimeout } - entity := params.ForgeEntity{ - ID: repoID, - EntityType: params.ForgeEntityTypeRepository, + entity, err := r.store.GetForgeEntity(ctx, params.ForgeEntityTypeRepository, repoID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to get repo: %w", err) } + template, err := r.findTemplate(ctx, entity, param.OSType, param.TemplateID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to find suitable template: %w", err) + } + + createPoolParams.TemplateID = &template.ID pool, err := r.store.CreateEntityPool(ctx, entity, createPoolParams) if err != nil { return params.Pool{}, fmt.Errorf("error creating pool: %w", err) @@ -335,16 +380,28 @@ func (r *Runner) UpdateRepoPool(ctx context.Context, repoID, poolID string, para if !auth.IsAdmin(ctx) { return params.Pool{}, runnerErrors.ErrUnauthorized } - - entity := params.ForgeEntity{ - ID: repoID, - EntityType: params.ForgeEntityTypeRepository, + entity, err := r.store.GetForgeEntity(ctx, params.ForgeEntityTypeRepository, repoID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to get repo: %w", err) } + pool, err := r.store.GetEntityPool(ctx, entity, poolID) if err != nil { return params.Pool{}, fmt.Errorf("error fetching pool: %w", err) } + if param.TemplateID != nil { + osType := param.OSType + if osType == "" { + osType = pool.OSType + } + template, err := r.findTemplate(ctx, entity, osType, param.TemplateID) + if err != nil { + return params.Pool{}, fmt.Errorf("failed to find suitable template: %w", err) + } + param.TemplateID = &template.ID + } + maxRunners := pool.MaxRunners minIdleRunners := pool.MinIdleRunners diff --git a/runner/scalesets.go b/runner/scalesets.go index 136ddec2..a9a2258d 100644 --- a/runner/scalesets.go +++ b/runner/scalesets.go @@ -146,6 +146,18 @@ func (r *Runner) UpdateScaleSetByID(ctx context.Context, scaleSetID uint, param return params.ScaleSet{}, fmt.Errorf("error getting entity: %w", err) } + if param.TemplateID != nil { + osType := param.OSType + if osType == "" { + osType = scaleSet.OSType + } + template, err := r.findTemplate(ctx, entity, osType, param.TemplateID) + if err != nil { + return params.ScaleSet{}, fmt.Errorf("failed to find suitable template: %w", err) + } + param.TemplateID = &template.ID + } + ghCli, err := github.Client(ctx, entity) if err != nil { return params.ScaleSet{}, fmt.Errorf("error creating github client: %w", err) @@ -216,6 +228,13 @@ func (r *Runner) CreateEntityScaleSet(ctx context.Context, entityType params.For return params.ScaleSet{}, runnerErrors.NewBadRequestError("scale sets are only supported for github entities") } + template, err := r.findTemplate(ctx, entity, param.OSType, param.TemplateID) + if err != nil { + return params.ScaleSet{}, fmt.Errorf("failed to find suitable template: %w", err) + } + + param.TemplateID = &template.ID + ghCli, err := github.Client(ctx, entity) if err != nil { return params.ScaleSet{}, fmt.Errorf("error creating github client: %w", err) diff --git a/runner/templates.go b/runner/templates.go new file mode 100644 index 00000000..32505b40 --- /dev/null +++ b/runner/templates.go @@ -0,0 +1,104 @@ +// Copyright 2025 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +package runner + +import ( + "context" + "errors" + "fmt" + + runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" + "github.com/cloudbase/garm/auth" + "github.com/cloudbase/garm/params" +) + +func (r *Runner) CreateTemplate(ctx context.Context, param params.CreateTemplateParams) (params.Template, error) { + if !auth.IsAdmin(ctx) { + return params.Template{}, runnerErrors.ErrUnauthorized + } + + if err := param.Validate(); err != nil { + return params.Template{}, runnerErrors.NewBadRequestError("invalid create params %q", err) + } + + template, err := r.store.CreateTemplate(ctx, param) + if err != nil { + return params.Template{}, fmt.Errorf("failed to create template: %w", err) + } + return template, nil +} + +func (r *Runner) GetTemplate(ctx context.Context, id uint) (params.Template, error) { + if !auth.IsAdmin(ctx) { + return params.Template{}, runnerErrors.ErrUnauthorized + } + template, err := r.store.GetTemplate(ctx, id) + if err != nil { + return params.Template{}, fmt.Errorf("failed to get template: %w", err) + } + return template, nil +} + +func (r *Runner) GetTemplateByName(ctx context.Context, templateName string) (params.Template, error) { + if !auth.IsAdmin(ctx) { + return params.Template{}, runnerErrors.ErrUnauthorized + } + template, err := r.store.GetTemplateByName(ctx, templateName) + if err != nil { + return params.Template{}, fmt.Errorf("failed to get template: %w", err) + } + return template, nil +} + +func (r *Runner) ListTemplates(ctx context.Context, osType *commonParams.OSType, forgeType *params.EndpointType, partialName *string) ([]params.Template, error) { + if !auth.IsAdmin(ctx) { + return nil, runnerErrors.ErrUnauthorized + } + + templates, err := r.store.ListTemplates(ctx, osType, forgeType, partialName) + if err != nil { + return nil, fmt.Errorf("failed to list templates: %w", err) + } + return templates, nil +} + +func (r *Runner) UpdateTemplate(ctx context.Context, id uint, param params.UpdateTemplateParams) (params.Template, error) { + if !auth.IsAdmin(ctx) { + return params.Template{}, runnerErrors.ErrUnauthorized + } + + if err := param.Validate(); err != nil { + return params.Template{}, runnerErrors.NewBadRequestError("invalid update params: %q", err) + } + + template, err := r.store.UpdateTemplate(ctx, id, param) + if err != nil { + return params.Template{}, fmt.Errorf("failed to update template: %w", err) + } + return template, nil +} + +func (r *Runner) DeleteTemplate(ctx context.Context, id uint) error { + if !auth.IsAdmin(ctx) { + return runnerErrors.ErrUnauthorized + } + + if err := r.store.DeleteTemplate(ctx, id); err != nil { + if !errors.Is(err, runnerErrors.ErrNotFound) { + return fmt.Errorf("failed to delete template: %w", err) + } + } + return nil +} diff --git a/runner/templates_test.go b/runner/templates_test.go new file mode 100644 index 00000000..a37d1d2e --- /dev/null +++ b/runner/templates_test.go @@ -0,0 +1,326 @@ +// Copyright 2025 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package runner + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/suite" + + runnerErrors "github.com/cloudbase/garm-provider-common/errors" + commonParams "github.com/cloudbase/garm-provider-common/params" + "github.com/cloudbase/garm/database" + dbCommon "github.com/cloudbase/garm/database/common" + garmTesting "github.com/cloudbase/garm/internal/testing" + "github.com/cloudbase/garm/params" + "github.com/cloudbase/garm/runner/common" + runnerCommonMocks "github.com/cloudbase/garm/runner/common/mocks" + runnerMocks "github.com/cloudbase/garm/runner/mocks" +) + +const ( + testTemplate1Name = "test-template-1" +) + +type TemplateTestFixtures struct { + AdminContext context.Context + Store dbCommon.Store + Templates []params.Template + Providers map[string]common.Provider + ProviderMock *runnerCommonMocks.Provider + PoolMgrCtrlMock *runnerMocks.PoolManagerController + CreateTemplateParams params.CreateTemplateParams + UpdateTemplateParams params.UpdateTemplateParams +} + +type TemplateTestSuite struct { + suite.Suite + Fixtures *TemplateTestFixtures + Runner *Runner + + adminCtx context.Context + nonAdminCtx context.Context + githubEndpoint params.ForgeEndpoint +} + +func (s *TemplateTestSuite) SetupTest() { + // create testing sqlite database + dbCfg := garmTesting.GetTestSqliteDBConfig(s.T()) + db, err := database.NewDatabase(context.Background(), dbCfg) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create db connection: %s", err)) + } + + s.adminCtx = garmTesting.ImpersonateAdminContext(context.Background(), db, s.T()) + s.nonAdminCtx = context.Background() // Non-admin context for unauthorized tests + + s.githubEndpoint = garmTesting.CreateDefaultGithubEndpoint(s.adminCtx, db, s.T()) + + // Create test templates + template1, err := db.CreateTemplate(s.adminCtx, params.CreateTemplateParams{ + Name: testTemplate1Name, + Description: "Test template 1", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd", "image": "ubuntu:22.04"}`), + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create test template 1: %s", err)) + } + + template2, err := db.CreateTemplate(s.adminCtx, params.CreateTemplateParams{ + Name: "test-template-2", + Description: "Test template 2", + OSType: commonParams.Windows, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "azure", "image": "windows-2022"}`), + }) + if err != nil { + s.FailNow(fmt.Sprintf("failed to create test template 2: %s", err)) + } + + templates := []params.Template{template1, template2} + + providerMock := runnerCommonMocks.NewProvider(s.T()) + fixtures := &TemplateTestFixtures{ + AdminContext: s.adminCtx, + Store: db, + Templates: templates, + Providers: map[string]common.Provider{ + "test-provider": providerMock, + }, + ProviderMock: providerMock, + PoolMgrCtrlMock: runnerMocks.NewPoolManagerController(s.T()), + CreateTemplateParams: params.CreateTemplateParams{ + Name: "new-template", + Description: "New test template", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd", "image": "ubuntu:20.04"}`), + }, + UpdateTemplateParams: params.UpdateTemplateParams{ + Name: garmTesting.Ptr("updated-template-name"), + Description: garmTesting.Ptr("Updated description"), + Data: []byte(`{"provider": "updated", "image": "updated:latest"}`), + }, + } + + s.Fixtures = fixtures + + // setup test runner + runner := &Runner{ + providers: fixtures.Providers, + ctx: fixtures.AdminContext, + store: fixtures.Store, + poolManagerCtrl: fixtures.PoolMgrCtrlMock, + } + s.Runner = runner +} + +func (s *TemplateTestSuite) TestCreateTemplate() { + template, err := s.Runner.CreateTemplate(s.adminCtx, s.Fixtures.CreateTemplateParams) + + s.Require().Nil(err) + s.Require().Equal(s.Fixtures.CreateTemplateParams.Name, template.Name) + s.Require().Equal(s.Fixtures.CreateTemplateParams.Description, template.Description) + s.Require().Equal(s.Fixtures.CreateTemplateParams.OSType, template.OSType) + s.Require().Equal(s.Fixtures.CreateTemplateParams.ForgeType, template.ForgeType) +} + +func (s *TemplateTestSuite) TestCreateTemplateUnauthorized() { + _, err := s.Runner.CreateTemplate(s.nonAdminCtx, s.Fixtures.CreateTemplateParams) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *TemplateTestSuite) TestCreateTemplateInvalidParams() { + invalidParams := params.CreateTemplateParams{ + Name: "", // Empty name should fail validation + Description: "Invalid template", + OSType: commonParams.Linux, + ForgeType: params.GithubEndpointType, + Data: []byte(`{"provider": "lxd"}`), + } + + _, err := s.Runner.CreateTemplate(s.adminCtx, invalidParams) + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "invalid create params") +} + +func (s *TemplateTestSuite) TestGetTemplate() { + template, err := s.Runner.GetTemplate(s.adminCtx, s.Fixtures.Templates[0].ID) + + s.Require().Nil(err) + s.Require().Equal(s.Fixtures.Templates[0].ID, template.ID) + s.Require().Equal(s.Fixtures.Templates[0].Name, template.Name) + s.Require().Equal(s.Fixtures.Templates[0].Description, template.Description) +} + +func (s *TemplateTestSuite) TestGetTemplateUnauthorized() { + _, err := s.Runner.GetTemplate(s.nonAdminCtx, s.Fixtures.Templates[0].ID) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *TemplateTestSuite) TestGetTemplateNotFound() { + _, err := s.Runner.GetTemplate(s.adminCtx, 9999) + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "failed to get template") +} + +func (s *TemplateTestSuite) TestListTemplates() { + templates, err := s.Runner.ListTemplates(s.adminCtx, nil, nil, nil) + + s.Require().Nil(err) + s.Require().GreaterOrEqual(len(templates), len(s.Fixtures.Templates)) + + // Find our test templates in the results + foundNames := make(map[string]bool) + for _, template := range templates { + foundNames[template.Name] = true + } + + for _, expected := range s.Fixtures.Templates { + s.Require().True(foundNames[expected.Name], "Expected template %s not found", expected.Name) + } +} + +func (s *TemplateTestSuite) TestListTemplatesUnauthorized() { + _, err := s.Runner.ListTemplates(s.nonAdminCtx, nil, nil, nil) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *TemplateTestSuite) TestListTemplatesWithOSTypeFilter() { + osType := commonParams.Linux + templates, err := s.Runner.ListTemplates(s.adminCtx, &osType, nil, nil) + + s.Require().Nil(err) + s.Require().GreaterOrEqual(len(templates), 1) + + // Verify all returned templates have the correct OS type + for _, template := range templates { + s.Require().Equal(commonParams.Linux, template.OSType) + } + + // Find our test template + found := false + for _, template := range templates { + if template.Name == testTemplate1Name { + found = true + break + } + } + s.Require().True(found, "Expected %s not found", testTemplate1Name) +} + +func (s *TemplateTestSuite) TestListTemplatesWithForgeTypeFilter() { + forgeType := params.GithubEndpointType + templates, err := s.Runner.ListTemplates(s.adminCtx, nil, &forgeType, nil) + + s.Require().Nil(err) + s.Require().GreaterOrEqual(len(templates), 2) + + // Verify all returned templates have the correct forge type + for _, template := range templates { + s.Require().Equal(params.GithubEndpointType, template.ForgeType) + } +} + +func (s *TemplateTestSuite) TestListTemplatesWithNameFilter() { + partialName := testTemplate1Name + templates, err := s.Runner.ListTemplates(s.adminCtx, nil, nil, &partialName) + + s.Require().Nil(err) + s.Require().GreaterOrEqual(len(templates), 1) + + found := false + for _, template := range templates { + if template.Name == testTemplate1Name { + found = true + break + } + } + s.Require().True(found, "Expected %s not found", testTemplate1Name) +} + +func (s *TemplateTestSuite) TestUpdateTemplate() { + template, err := s.Runner.UpdateTemplate(s.adminCtx, s.Fixtures.Templates[0].ID, s.Fixtures.UpdateTemplateParams) + + s.Require().Nil(err) + s.Require().Equal(*s.Fixtures.UpdateTemplateParams.Name, template.Name) + s.Require().Equal(*s.Fixtures.UpdateTemplateParams.Description, template.Description) +} + +func (s *TemplateTestSuite) TestUpdateTemplateUnauthorized() { + _, err := s.Runner.UpdateTemplate(s.nonAdminCtx, s.Fixtures.Templates[0].ID, s.Fixtures.UpdateTemplateParams) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *TemplateTestSuite) TestUpdateTemplateInvalidParams() { + invalidParams := params.UpdateTemplateParams{ + Name: garmTesting.Ptr(""), // Empty name should fail validation + } + + _, err := s.Runner.UpdateTemplate(s.adminCtx, s.Fixtures.Templates[0].ID, invalidParams) + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "invalid update params") +} + +func (s *TemplateTestSuite) TestUpdateTemplateNotFound() { + _, err := s.Runner.UpdateTemplate(s.adminCtx, 9999, s.Fixtures.UpdateTemplateParams) + + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "failed to update template") +} + +func (s *TemplateTestSuite) TestDeleteTemplate() { + err := s.Runner.DeleteTemplate(s.adminCtx, s.Fixtures.Templates[1].ID) + + s.Require().Nil(err) + + // Verify template is deleted by trying to get it + _, err = s.Runner.GetTemplate(s.adminCtx, s.Fixtures.Templates[1].ID) + s.Require().NotNil(err) + s.Require().Contains(err.Error(), "failed to get template") +} + +func (s *TemplateTestSuite) TestDeleteTemplateUnauthorized() { + err := s.Runner.DeleteTemplate(s.nonAdminCtx, s.Fixtures.Templates[0].ID) + + s.Require().NotNil(err) + s.Require().ErrorIs(err, runnerErrors.ErrUnauthorized) +} + +func (s *TemplateTestSuite) TestDeleteTemplateNotFound() { + // The DeleteTemplate function silently handles ErrNotFound, so this should not error + err := s.Runner.DeleteTemplate(s.adminCtx, 9999) + + s.Require().Nil(err) // Should not error for not found templates +} + +func TestTemplateTestSuite(t *testing.T) { + suite.Run(t, new(TemplateTestSuite)) +} diff --git a/util/util.go b/util/util.go index dc92ce0e..001c3389 100644 --- a/util/util.go +++ b/util/util.go @@ -16,12 +16,16 @@ package util import ( "context" + "encoding/json" "fmt" + "log/slog" "net/http" "unicode/utf8" + "github.com/cloudbase/garm-provider-common/cloudconfig" runnerErrors "github.com/cloudbase/garm-provider-common/errors" commonParams "github.com/cloudbase/garm-provider-common/params" + "github.com/cloudbase/garm/internal/templates" "github.com/cloudbase/garm/runner/common" ) @@ -110,3 +114,46 @@ func isASCII(s string) bool { } return true } + +func GetCloudConfigSpecFromExtraSpecs(extraSpecs json.RawMessage) (cloudconfig.CloudConfigSpec, error) { + boot := commonParams.BootstrapInstance{ + ExtraSpecs: extraSpecs, + } + + specs, err := cloudconfig.GetSpecs(boot) + if err != nil { + return cloudconfig.CloudConfigSpec{}, fmt.Errorf("failed to decode extra specs: %w", err) + } + + return specs, nil +} + +func MaybeAddWrapperToExtraSpecs(ctx context.Context, specs json.RawMessage, osType commonParams.OSType, metadataURL, token string) json.RawMessage { + data := map[string]any{} + if len(specs) > 0 { + if err := json.Unmarshal(specs, &data); err != nil { + slog.WarnContext(ctx, "failed to unmarshal extra specs", "error", err) + return specs + } + } + + if _, ok := data["runner_install_template"]; ok { + // User has already set a runner install template override. Do not touch. + return specs + } + + wrapper, err := templates.RenderRunnerInstallWrapper(osType, metadataURL, token) + if err != nil { + slog.WarnContext(ctx, "failed to get runner install wrapper", "os_type", osType, "error", err) + return specs + } + + data["runner_install_template"] = wrapper + ret, err := json.Marshal(data) + if err != nil { + slog.WarnContext(ctx, "failed to marshal extra specs", "error", err) + return specs + } + + return json.RawMessage(ret) +} diff --git a/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/cloudconfig.go b/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/cloudconfig.go new file mode 100644 index 00000000..a49fe42a --- /dev/null +++ b/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/cloudconfig.go @@ -0,0 +1,184 @@ +// Copyright 2022 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package cloudconfig + +import ( + "crypto/x509" + "encoding/base64" + "fmt" + "strings" + "sync" + + "github.com/cloudbase/garm-provider-common/defaults" + + "github.com/pkg/errors" + "gopkg.in/yaml.v3" +) + +func NewDefaultCloudInitConfig() *CloudInit { + return &CloudInit{ + PackageUpgrade: true, + Packages: []string{ + "curl", + "tar", + }, + Users: []string{"default"}, + SystemInfo: &SystemInfo{ + DefaultUser: DefaultUser{ + Name: defaults.DefaultUser, + Home: fmt.Sprintf("/home/%s", defaults.DefaultUser), + Shell: defaults.DefaultUserShell, + Groups: defaults.DefaultUserGroups, + Sudo: "ALL=(ALL) NOPASSWD:ALL", + }, + }, + } +} + +type DefaultUser struct { + Name string `yaml:"name"` + Home string `yaml:"home"` + Shell string `yaml:"shell"` + Groups []string `yaml:"groups,omitempty"` + Sudo string `yaml:"sudo"` +} + +type SystemInfo struct { + DefaultUser DefaultUser `yaml:"default_user"` +} + +type File struct { + Encoding string `yaml:"encoding"` + Content string `yaml:"content"` + Owner string `yaml:"owner"` + Path string `yaml:"path"` + Permissions string `yaml:"permissions"` +} + +type CloudInit struct { + mux sync.Mutex + + Users []string `yaml:"users"` + PackageUpgrade bool `yaml:"package_upgrade"` + Packages []string `yaml:"packages,omitempty"` + SSHAuthorizedKeys []string `yaml:"ssh_authorized_keys,omitempty"` + SystemInfo *SystemInfo `yaml:"system_info,omitempty"` + RunCmd []string `yaml:"runcmd,omitempty"` + WriteFiles []File `yaml:"write_files,omitempty"` + CACerts CACerts `yaml:"ca-certs,omitempty"` +} + +type CACerts struct { + RemoveDefaults bool `yaml:"remove-defaults"` + Trusted []string `yaml:"trusted"` +} + +func (c *CloudInit) AddCACert(cert []byte) error { + c.mux.Lock() + defer c.mux.Unlock() + + if cert == nil { + return nil + } + + roots := x509.NewCertPool() + if ok := roots.AppendCertsFromPEM(cert); !ok { + return fmt.Errorf("failed to parse CA cert bundle") + } + c.CACerts.Trusted = append(c.CACerts.Trusted, string(cert)) + + return nil +} + +func (c *CloudInit) AddSSHKey(keys ...string) { + c.mux.Lock() + defer c.mux.Unlock() + + // TODO(gabriel-samfira): Validate the SSH public key. + for _, key := range keys { + found := false + for _, val := range c.SSHAuthorizedKeys { + if val == key { + found = true + break + } + } + if !found { + c.SSHAuthorizedKeys = append(c.SSHAuthorizedKeys, key) + } + } +} + +func (c *CloudInit) AddPackage(pkgs ...string) { + c.mux.Lock() + defer c.mux.Unlock() + + for _, pkg := range pkgs { + found := false + for _, val := range c.Packages { + if val == pkg { + found = true + break + } + } + if !found { + c.Packages = append(c.Packages, pkg) + } + } +} + +func (c *CloudInit) AddRunCmd(cmd string) { + c.mux.Lock() + defer c.mux.Unlock() + + c.RunCmd = append(c.RunCmd, cmd) +} + +func (c *CloudInit) AddFile(contents []byte, path, owner, permissions string) { + c.mux.Lock() + defer c.mux.Unlock() + + for _, val := range c.WriteFiles { + if val.Path == path { + return + } + } + + file := File{ + Encoding: "b64", + Content: base64.StdEncoding.EncodeToString(contents), + Owner: owner, + Permissions: permissions, + Path: path, + } + c.WriteFiles = append(c.WriteFiles, file) +} + +func (c *CloudInit) Serialize() (string, error) { + c.mux.Lock() + defer c.mux.Unlock() + + ret := []string{ + "#cloud-config", + } + + asYaml, err := yaml.Marshal(c) + if err != nil { + return "", errors.Wrap(err, "marshaling to yaml") + } + + ret = append(ret, string(asYaml)) + return strings.Join(ret, "\n"), nil +} diff --git a/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/templates.go b/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/templates.go new file mode 100644 index 00000000..6193f825 --- /dev/null +++ b/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/templates.go @@ -0,0 +1,786 @@ +// Copyright 2022 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package cloudconfig + +import ( + "bytes" + "fmt" + "text/template" + + "github.com/cloudbase/garm-provider-common/params" + "github.com/pkg/errors" +) + +var CloudConfigTemplate = `#!/bin/bash + +set -e +set -o pipefail + +{{- if .EnableBootDebug }} +set -x +{{- end }} + +CALLBACK_URL="{{ .CallbackURL }}" +METADATA_URL="{{ .MetadataURL }}" +BEARER_TOKEN="{{ .CallbackToken }}" + +RUN_HOME="/home/{{ .RunnerUsername }}/actions-runner" + +if [ -z "$METADATA_URL" ];then + echo "no token is available and METADATA_URL is not set" + exit 1 +fi + +function call() { + PAYLOAD="$1" + [[ $CALLBACK_URL =~ ^(.*)/status(/)?$ ]] || CALLBACK_URL="${CALLBACK_URL}/status" + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X POST -d "${PAYLOAD}" -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${CALLBACK_URL}" || echo "failed to call home: exit code ($?)" +} + +function systemInfo() { + if [ -f "/etc/os-release" ];then + . /etc/os-release + fi + OS_NAME=${NAME:-""} + OS_VERSION=${VERSION_ID:-""} + AGENT_ID=${1:-null} + # strip status from the callback url + [[ $CALLBACK_URL =~ ^(.*)/status(/)?$ ]] && CALLBACK_URL="${BASH_REMATCH[1]}" || true + SYSINFO_URL="${CALLBACK_URL}/system-info/" + PAYLOAD="{\"os_name\": \"$OS_NAME\", \"os_version\": \"$OS_VERSION\", \"agent_id\": $AGENT_ID}" + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X POST -d "${PAYLOAD}" -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${SYSINFO_URL}" || true +} + +function sendStatus() { + MSG="$1" + call "{\"status\": \"installing\", \"message\": \"$MSG\"}" +} + +function success() { + MSG="$1" + ID=${2:-null} + call "{\"status\": \"idle\", \"message\": \"$MSG\", \"agent_id\": $ID}" +} + +function fail() { + MSG="$1" + call "{\"status\": \"failed\", \"message\": \"$MSG\"}" + exit 1 +} + +function downloadAndExtractRunner() { + sendStatus "downloading tools from {{ .DownloadURL }}" + if [ ! -z "{{ .TempDownloadToken }}" ]; then + TEMP_TOKEN="Authorization: Bearer {{ .TempDownloadToken }}" + fi + curl --retry 5 --retry-delay 5 --retry-connrefused --fail -L -H "${TEMP_TOKEN}" -o "/home/{{ .RunnerUsername }}/{{ .FileName }}" "{{ .DownloadURL }}" || fail "failed to download tools" + mkdir -p "$RUN_HOME" || fail "failed to create actions-runner folder" + sendStatus "extracting runner" + tar xf "/home/{{ .RunnerUsername }}/{{ .FileName }}" -C "$RUN_HOME"/ || fail "failed to extract runner" + chown {{ .RunnerUsername }}:{{ .RunnerGroup }} -R "$RUN_HOME"/ || fail "failed to change owner" +} + +if [ ! -d "$RUN_HOME" ];then + downloadAndExtractRunner + sendStatus "installing dependencies" + cd "$RUN_HOME" + sudo ./bin/installdependencies.sh || fail "failed to install dependencies" +else + sendStatus "using cached runner found in $RUN_HOME" + cd "$RUN_HOME" +fi + + +sendStatus "configuring runner" +{{- if .UseJITConfig }} +function getRunnerFile() { + curl --retry 5 --retry-delay 5 \ + --retry-connrefused --fail -s \ + -X GET -H 'Accept: application/json' \ + -H "Authorization: Bearer ${BEARER_TOKEN}" \ + "${METADATA_URL}/$1" -o "$2" +} + +sendStatus "downloading JIT credentials" +getRunnerFile "credentials/runner" ""$RUN_HOME"/.runner" || fail "failed to get runner file" +getRunnerFile "credentials/credentials" ""$RUN_HOME"/.credentials" || fail "failed to get credentials file" +getRunnerFile "credentials/credentials_rsaparams" ""$RUN_HOME"/.credentials_rsaparams" || fail "failed to get credentials_rsaparams file" +getRunnerFile "system/service-name" ""$RUN_HOME"/.service" || fail "failed to get service name file" +sed -i 's/$/\.service/' "$RUN_HOME"/.service + +SVC_NAME=$(cat "$RUN_HOME"/.service) + +sendStatus "generating systemd unit file" +getRunnerFile "systemd/unit-file?runAsUser={{ .RunnerUsername }}" "$SVC_NAME" || fail "failed to get service file" +sudo mv $SVC_NAME /etc/systemd/system/ || fail "failed to move service file" +sudo chown root:root /etc/systemd/system/$SVC_NAME || fail "failed to change owner" +if [ -e "/sys/fs/selinux" ];then + sudo chcon -h system_u:object_r:systemd_unit_file_t:s0 /etc/systemd/system/$SVC_NAME || fail "failed to change selinux context" +fi + +sendStatus "enabling runner service" +cp "$RUN_HOME"/bin/runsvc.sh "$RUN_HOME"/ || fail "failed to copy runsvc.sh" +# Chown is not needed for the cached runner +# sudo chown {{ .RunnerUsername }}:{{ .RunnerGroup }} -R /home/{{ .RunnerUsername }} || fail "failed to change owner" +sudo systemctl daemon-reload || fail "failed to reload systemd" +sudo systemctl enable $SVC_NAME +{{- else}} + +GITHUB_TOKEN=$(curl --retry 5 --retry-delay 5 --retry-connrefused --fail -s -X GET -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "${METADATA_URL}/runner-registration-token/") + +set +e +attempt=1 +while true; do + ERROUT=$(mktemp) + {{- if .GitHubRunnerGroup }} + ./config.sh --unattended --url "{{ .RepoURL }}" --token "$GITHUB_TOKEN" --runnergroup {{.GitHubRunnerGroup}} --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral 2>$ERROUT + {{- else}} + ./config.sh --unattended --url "{{ .RepoURL }}" --token "$GITHUB_TOKEN" --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral 2>$ERROUT + {{- end}} + if [ $? -eq 0 ]; then + rm $ERROUT || true + sendStatus "runner successfully configured after $attempt attempt(s)" + break + fi + LAST_ERR=$(cat $ERROUT) + echo "$LAST_ERR" + + # if the runner is already configured, remove it and try again. In the past configuring a runner + # managed to register it but timed out later, resulting in an error. + ./config.sh remove --token "$GITHUB_TOKEN" || true + + if [ $attempt -gt 5 ];then + rm $ERROUT || true + fail "failed to configure runner: $LAST_ERR" + fi + + sendStatus "failed to configure runner (attempt $attempt): $LAST_ERR (retrying in 5 seconds)" + attempt=$((attempt+1)) + rm $ERROUT || true + sleep 5 +done +set -e + +sendStatus "installing runner service" +sudo ./svc.sh install {{ .RunnerUsername }} || fail "failed to install service" +{{- end}} + +if [ -e "/sys/fs/selinux" ];then + sudo chcon -R -h user_u:object_r:bin_t:s0 /home/runner/ || fail "failed to change selinux context" +fi + +AGENT_ID="" +{{- if .UseJITConfig }} +if [ -f "$RUN_HOME/env.sh" ];then + pushd $RUN_HOME + source env.sh + popd +fi +sudo systemctl start $SVC_NAME || fail "failed to start service" +{{- else}} +sendStatus "starting service" +sudo ./svc.sh start || fail "failed to start service" + +set +e +AGENT_ID=$(grep "agentId" "$RUN_HOME"/.runner | tr -d -c 0-9) +if [ $? -ne 0 ];then + fail "failed to get agent ID" +fi +set -e +{{- end}} +systemInfo $AGENT_ID +success "runner successfully installed" $AGENT_ID +` + +var WindowsSetupScriptTemplate = `#ps1_sysnative +Param( + [Parameter(Mandatory=$false)] + [string]$Token="{{.CallbackToken}}" +) + +$ErrorActionPreference="Stop" + +function Start-ExecuteWithRetry { + [CmdletBinding()] + param( + [Parameter(Mandatory=$true)] + [ScriptBlock]$ScriptBlock, + [int]$MaxRetryCount=10, + [int]$RetryInterval=3, + [string]$RetryMessage, + [array]$ArgumentList=@() + ) + PROCESS { + $currentErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = "Continue" + $retryCount = 0 + while ($true) { + try { + $res = Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList $ArgumentList + $ErrorActionPreference = $currentErrorActionPreference + return $res + } catch [System.Exception] { + $retryCount++ + + if ($_.Exception -is [System.Net.WebException]) { + $webResponse = $_.Exception.Response + # Skip retry on Error: 4XX (e.g. 401 Unauthorized, 404 Not Found etc.) + if ($webResponse -and $webResponse.StatusCode -ge 400 -and $webResponse.StatusCode -lt 500) { + # Skip retry on 4xx errors + Write-Output "Encountered non-retryable error (4xx): $($_.Exception.Message)" + $ErrorActionPreference = $currentErrorActionPreference + throw + } + } + + if ($retryCount -gt $MaxRetryCount) { + $ErrorActionPreference = $currentErrorActionPreference + throw + } else { + if ($RetryMessage) { + Write-Output $RetryMessage + } elseif ($_) { + Write-Output $_ + } + Start-Sleep -Seconds $RetryInterval + } + } + } + } +} + +function Get-RandomString { + [CmdletBinding()] + Param( + [int]$Length=13 + ) + PROCESS { + if($Length -lt 6) { + $Length = 6 + } + $special = @(44, 45, 46, 64) + $numeric = 48..57 + $upper = 65..90 + $lower = 97..122 + + $passwd = [System.Collections.Generic.List[object]](New-object "System.Collections.Generic.List[object]") + for($i=0; $i -lt $Length-4; $i++){ + $c = get-random -input ($special + $numeric + $upper + $lower) + $passwd.Add([char]$c) + } + + $passwd.Add([char](get-random -input $numeric)) + $passwd.Add([char](get-random -input $special)) + $passwd.Add([char](get-random -input $upper)) + $passwd.Add([char](get-random -input $lower)) + + $Random = New-Object Random + return [string]::join("",($passwd|Sort-Object {$Random.Next()})) + } +} + +Add-Type -TypeDefinition @" +using System; +using System.Runtime.InteropServices; +using System.Text; + +public class GrantSysPrivileges +{ + [StructLayout(LayoutKind.Sequential)] + public struct LSA_UNICODE_STRING + { + public ushort Length; + public ushort MaximumLength; + public IntPtr Buffer; + } + + [StructLayout(LayoutKind.Sequential)] + public struct LSA_OBJECT_ATTRIBUTES + { + public int Length; + public IntPtr RootDirectory; + public IntPtr ObjectName; + public uint Attributes; + public IntPtr SecurityDescriptor; + public IntPtr SecurityQualityOfService; + } + + [DllImport("advapi32.dll", SetLastError=true)] + public static extern uint LsaOpenPolicy( + ref LSA_UNICODE_STRING SystemName, + ref LSA_OBJECT_ATTRIBUTES ObjectAttributes, + uint DesiredAccess, + out IntPtr PolicyHandle + ); + + [DllImport("advapi32.dll", SetLastError=true)] + public static extern uint LsaAddAccountRights( + IntPtr PolicyHandle, + IntPtr AccountSid, + LSA_UNICODE_STRING[] UserRights, + uint CountOfRights + ); + + [DllImport("advapi32.dll")] + public static extern uint LsaClose(IntPtr PolicyHandle); + + [DllImport("advapi32.dll")] + public static extern uint LsaNtStatusToWinError(uint status); + + public const uint POLICY_ALL_ACCESS = 0x00F0FFF; + + public static uint GrantPrivilege(byte[] sid, string[] rights) + { + LSA_OBJECT_ATTRIBUTES loa = new LSA_OBJECT_ATTRIBUTES(); + LSA_UNICODE_STRING systemName = new LSA_UNICODE_STRING(); + + IntPtr policyHandle; + uint result = LsaOpenPolicy(ref systemName, ref loa, POLICY_ALL_ACCESS, out policyHandle); + if (result != 0) + { + return LsaNtStatusToWinError(result); + } + + LSA_UNICODE_STRING[] userRights = new LSA_UNICODE_STRING[rights.Length]; + for (int i = 0; i < rights.Length; i++) + { + byte[] bytes = Encoding.Unicode.GetBytes(rights[i]); + IntPtr ptr = Marshal.AllocHGlobal(bytes.Length); + Marshal.Copy(bytes, 0, ptr, bytes.Length); + + userRights[i].Buffer = ptr; + userRights[i].Length = (ushort)bytes.Length; + userRights[i].MaximumLength = (ushort)(bytes.Length); + } + + IntPtr sidPtr = Marshal.AllocHGlobal(sid.Length); + Marshal.Copy(sid, 0, sidPtr, sid.Length); + + result = LsaAddAccountRights(policyHandle, sidPtr, userRights, (uint)rights.Length); + LsaClose(policyHandle); + + foreach (var right in userRights) + { + Marshal.FreeHGlobal(right.Buffer); + } + Marshal.FreeHGlobal(sidPtr); + + return LsaNtStatusToWinError(result); + } +} +"@ -Language CSharp + +function Invoke-FastWebRequest { + [CmdletBinding()] + Param( + [Parameter(Mandatory=$True,ValueFromPipeline=$true,Position=0)] + [System.Uri]$Uri, + [Parameter(Position=1)] + [string]$OutFile, + [Hashtable]$Headers=@{}, + [switch]$SkipIntegrityCheck=$false + ) + PROCESS + { + if(!([System.Management.Automation.PSTypeName]'System.Net.Http.HttpClient').Type) + { + $assembly = [System.Reflection.Assembly]::LoadWithPartialName("System.Net.Http") + } + + if(!$OutFile) { + $OutFile = $Uri.PathAndQuery.Substring($Uri.PathAndQuery.LastIndexOf("/") + 1) + if(!$OutFile) { + throw "The ""OutFile"" parameter needs to be specified" + } + } + + $fragment = $Uri.Fragment.Trim('#') + if ($fragment) { + $details = $fragment.Split("=") + $algorithm = $details[0] + $hash = $details[1] + } + + if (!$SkipIntegrityCheck -and $fragment -and (Test-Path $OutFile)) { + try { + return (Test-FileIntegrity -File $OutFile -Algorithm $algorithm -ExpectedHash $hash) + } catch { + Remove-Item $OutFile + } + } + + $client = new-object System.Net.Http.HttpClient + foreach ($k in $Headers.Keys){ + $client.DefaultRequestHeaders.Add($k, $Headers[$k]) + } + $task = $client.GetStreamAsync($Uri) + $response = $task.Result + if($task.IsFaulted) { + $msg = "Request for URL '{0}' is faulted. Task status: {1}." -f @($Uri, $task.Status) + if($task.Exception) { + $msg += "Exception details: {0}" -f @($task.Exception) + } + Throw $msg + } + $outStream = New-Object IO.FileStream $OutFile, Create, Write, None + + try { + $totRead = 0 + $buffer = New-Object Byte[] 1MB + while (($read = $response.Read($buffer, 0, $buffer.Length)) -gt 0) { + $totRead += $read + $outStream.Write($buffer, 0, $read); + } + } + finally { + $outStream.Close() + } + if(!$SkipIntegrityCheck -and $fragment) { + Test-FileIntegrity -File $OutFile -Algorithm $algorithm -ExpectedHash $hash + } + } +} + +function Import-Certificate() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + $CertificateData, + [parameter(Mandatory=$false)] + [System.Security.Cryptography.X509Certificates.StoreLocation]$StoreLocation="LocalMachine", + [parameter(Mandatory=$false)] + [System.Security.Cryptography.X509Certificates.StoreName]$StoreName="TrustedPublisher" + ) + PROCESS + { + $store = New-Object System.Security.Cryptography.X509Certificates.X509Store( + $StoreName, $StoreLocation) + $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite) + $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($CertificateData) + $store.Add($cert) + } +} + +function Invoke-APICall() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [object]$Payload, + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + Invoke-WebRequest -UseBasicParsing -Method Post -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $CallbackURL -Body (ConvertTo-Json $Payload) | Out-Null + } +} + +function Update-GarmStatus() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$Message, + [parameter(Mandatory=$false)] + [int64]$AgentID=0, + [parameter(Mandatory=$false)] + [string]$Status="installing", + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + $body = @{ + "status"=$Status + "message"=$Message + } + + if ($AgentID -ne 0) { + $body["agent_id"] = $AgentID + } + Invoke-APICall -Payload $body -CallbackURL $CallbackURL | Out-Null + } +} + +function Invoke-GarmSuccess() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$Message, + [parameter(Mandatory=$true)] + [int64]$AgentID, + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + Update-GarmStatus -Message $Message -AgentID $AgentID -CallbackURL $CallbackURL -Status "idle" | Out-Null + } +} + +function Invoke-GarmFailure() { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$Message, + [parameter(Mandatory=$true)] + [string]$CallbackURL + ) + PROCESS{ + Update-GarmStatus -Message $Message -CallbackURL $CallbackURL -Status "failed" | Out-Null + Throw $Message + } +} + +function Set-SystemInfo { + [CmdletBinding()] + param ( + [parameter(Mandatory=$true)] + [string]$CallbackURL, + [parameter(Mandatory=$true)] + [string]$RunnerDir, + [parameter(Mandatory=$true)] + [string]$BearerToken + ) + + # Construct the path to the .runner file + $agentInfoFile = Join-Path $RunnerDir ".runner" + + # Read and parse the JSON content from the .runner file + $agentInfo = ConvertFrom-Json (Get-Content -Raw -Path $agentInfoFile) + $AgentId = $agentInfo.agent_id + + # Retrieve OS information + $osInfo = Get-WmiObject -Class Win32_OperatingSystem + $osName = $osInfo.Caption + $osVersion = $osInfo.Version + + # Strip status from the callback URL + if ($CallbackUrl -match '^(.*)/status(/)?$') { + $CallbackUrl = $matches[1] + } + + $SysInfoUrl = "$CallbackUrl/system-info/" + $Payload = @{ + os_name = $OSName + os_version = $OSVersion + agent_id = $AgentId + } | ConvertTo-Json + + # Send the POST request + try { + Invoke-RestMethod -Uri $SysInfoUrl -Method Post -Body $Payload -ContentType 'application/json' -Headers @{ 'Authorization' = "Bearer $BearerToken" } -ErrorAction Stop + } catch { + Write-Output "Failed to send the system information." + } +} + +$GHRunnerGroup = "{{.GitHubRunnerGroup}}" + +function Install-Runner() { + $CallbackURL="{{.CallbackURL}}" + if (!($CallbackURL -match "^(.*)/status(/)?$")) { + $CallbackURL = "$CallbackURL/status" + } + + if ($Token.Length -eq 0) { + Throw "missing callback authentication token" + } + try { + $MetadataURL="{{.MetadataURL}}" + $DownloadURL="{{.DownloadURL}}" + if($MetadataURL -eq ""){ + Throw "missing metadata URL" + } + + # Create user with administrator rights to run service as + $userPasswd = Get-RandomString -Length 10 + $secPasswd = ConvertTo-SecureString "$userPasswd" -AsPlainText -Force + $userName = "runner" + $user = Get-LocalUser -Name $userName -ErrorAction SilentlyContinue + if (-not $user) { + New-LocalUser -Name $userName -Password $secPasswd -PasswordNeverExpires -UserMayNotChangePassword + } else { + Set-LocalUser -PasswordNeverExpires $true -Name $userName -Password $secPasswd + } + $pscreds = New-Object System.Management.Automation.PSCredential (".\$userName", $secPasswd) + $hasUser = Get-LocalGroupMember -SID S-1-5-32-544 -Member $userName -ErrorAction SilentlyContinue + if (-not $hasUser){ + Add-LocalGroupMember -SID S-1-5-32-544 -Member $userName + } + $ntAcct = New-Object System.Security.Principal.NTAccount($userName) + $sid = $ntAcct.Translate([System.Security.Principal.SecurityIdentifier]) + $sidBytes = New-Object byte[] ($sid.BinaryLength) + $sid.GetBinaryForm($sidBytes, 0) + + $result = [GrantSysPrivileges]::GrantPrivilege($sidBytes, ("SeBatchLogonRight", "SeServiceLogonRight")) + if ($result -ne 0) { + Throw "Failed to grant privileges" + } + + $bundle = wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/system/cert-bundle + $converted = ConvertFrom-Json $bundle + foreach ($i in $converted.root_certificates.psobject.Properties){ + $data = [System.Convert]::FromBase64String($i.Value) + Import-Certificate -CertificateData $data -StoreName Root -StoreLocation LocalMachine + } + + $runnerDir = "C:\actions-runner" + # Check if a cached runner is available + if (-not (Test-Path $runnerDir)) { + # No cached runner found, proceed to download and extract + Update-GarmStatus -CallbackURL $CallbackURL -Message "downloading tools from {{ .DownloadURL }}" + + $downloadToken="{{.TempDownloadToken}}" + $DownloadTokenHeaders=@{} + if ($downloadToken.Length -gt 0) { + $DownloadTokenHeaders=@{ + "Authorization"="Bearer $downloadToken" + } + } + + $downloadPath = Join-Path $env:TMP "{{ .FileName }}" + Start-ExecuteWithRetry -ScriptBlock { + Invoke-FastWebRequest -Uri "{{ .DownloadURL }}" -OutFile $downloadPath -Headers $DownloadTokenHeaders + } -MaxRetryCount 5 -RetryInterval 5 -RetryMessage "Retrying download of runner..." + + mkdir $runnerDir + Update-GarmStatus -CallbackURL $CallbackURL -Message "extracting runner" + Add-Type -AssemblyName System.IO.Compression.FileSystem + [System.IO.Compression.ZipFile]::ExtractToDirectory($downloadPath, "$runnerDir") + } else { + Update-GarmStatus -CallbackURL $CallbackURL -Message "using cached runner found at $runnerDir" + } + + # Ensure runner has full access to actions-runner folder + $runnerACL = Get-Acl $runnerDir + $runnerACL.SetAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule( + $userName, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow" + ))) + Set-Acl -Path $runnerDir -AclObject $runnerAcl + + Update-GarmStatus -CallbackURL $CallbackURL -Message "configuring and starting runner" + cd $runnerDir + + {{- if .UseJITConfig }} + Update-GarmStatus -CallbackURL $CallbackURL -Message "downloading JIT credentials" + wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/credentials/runner -OutFile (Join-Path $runnerDir ".runner") + wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/credentials/credentials -OutFile (Join-Path $runnerDir ".credentials") + + Add-Type -AssemblyName System.Security + $rsaData = (wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/credentials/credentials_rsaparams) + $encodedBytes = [System.Text.Encoding]::UTF8.GetBytes($rsaData) + $protectedBytes = [Security.Cryptography.ProtectedData]::Protect( $encodedBytes, $null, [Security.Cryptography.DataProtectionScope]::LocalMachine ) + [System.IO.File]::WriteAllBytes((Join-Path $runnerDir ".credentials_rsaparams"), $protectedBytes) + + $serviceNameFile = (Join-Path $runnerDir ".service") + wget -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/system/service-name -OutFile $serviceNameFile + + Update-GarmStatus -CallbackURL $CallbackURL -Message "Creating system service" + $SVC_NAME=(gc -raw $serviceNameFile) + New-Service -Name "$SVC_NAME" -BinaryPathName "C:\actions-runner\bin\RunnerService.exe" -DisplayName "$SVC_NAME" -Description "GitHub Actions Runner ($SVC_NAME)" -StartupType Automatic -Credential $pscreds + Start-Service "$SVC_NAME" + Set-SystemInfo -CallbackURL $CallbackURL -RunnerDir $runnerDir -BearerToken $Token + Update-GarmStatus -Message "runner successfully installed" -CallbackURL $CallbackURL -Status "idle" | Out-Null + + {{- else }} + $GithubRegistrationToken = Start-ExecuteWithRetry -ScriptBlock { + Invoke-WebRequest -UseBasicParsing -Headers @{"Accept"="application/json"; "Authorization"="Bearer $Token"} -Uri $MetadataURL/runner-registration-token/ + } -MaxRetryCount 5 -RetryInterval 5 -RetryMessage "Retrying download of GitHub registration token..." + {{- if .GitHubRunnerGroup }} + ./config.cmd --unattended --url "{{ .RepoURL }}" --token $GithubRegistrationToken --runnergroup {{.GitHubRunnerGroup}} --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral --runasservice --windowslogonaccount "$userName" --windowslogonpassword "$userPasswd" + {{- else}} + ./config.cmd --unattended --url "{{ .RepoURL }}" --token $GithubRegistrationToken --name "{{ .RunnerName }}" --labels "{{ .RunnerLabels }}" --no-default-labels --ephemeral --runasservice --windowslogonaccount "$userName" --windowslogonpassword "$userPasswd" + {{- end}} + if ($LASTEXITCODE) { + Throw "Failed to configure runner. Err code $LASTEXITCODE" + } + $agentInfoFile = Join-Path $runnerDir ".runner" + $agentInfo = ConvertFrom-Json (gc -raw $agentInfoFile) + Set-SystemInfo -CallbackURL $CallbackURL -RunnerDir $runnerDir -BearerToken $Token + Invoke-GarmSuccess -CallbackURL $CallbackURL -Message "runner successfully installed" -AgentID $agentInfo.agentId + {{- end }} + } catch { + Invoke-GarmFailure -CallbackURL $CallbackURL -Message $_ + } +} +Install-Runner +` + +// InstallRunnerParams holds the parameters needed to render the runner install script. +type InstallRunnerParams struct { + // FileName is the name of the file that will be downloaded from the download URL. + // This will be the runner archive downloaded from GitHub. + FileName string + // DownloadURL is the URL from which the runner archive will be downloaded. + DownloadURL string + // RunnerUsername is the username of the user that will run the runner service. + RunnerUsername string + // RunnerGroup is the group of the user that will run the runner service. + RunnerGroup string + // RepoURL is the URL or the github repo the github runner agent needs to configure itself. + RepoURL string + // MetadataURL is the URL where instances can fetch information needed to set themselves up. + // This URL is set in the GARM config file. + MetadataURL string + // RunnerName is the name of the runner. GARM will use this to register the runner with GitHub. + RunnerName string + // RunnerLabels is a comma separated list of labels that will be added to the runner. + RunnerLabels string + // CallbackURL is the URL where the instance can send a post, signaling progress or status. + // This URL is set in the GARM config file. + CallbackURL string + // CallbackToken is the token that needs to be set by the instance in the headers in order to call + // the CallbackURL. + CallbackToken string + // TempDownloadToken is the token that needs to be set by the instance in the headers in order to download + // the githun runner. This is usually needed when using garm against a GHES instance. + TempDownloadToken string + // CABundle is a CA certificate bundle which will be sent to instances and which will tipically be installed + // as a system wide trusted root CA by either cloud-init or whatever mechanism the provider will use to set + // up the runner. + CABundle string + // GitHubRunnerGroup is the github runner group in which the newly installed runner should be added to. + GitHubRunnerGroup string + // EnableBootDebug will enable bash debug mode. + EnableBootDebug bool + // ExtraContext is a map of extra context that will be passed to the runner install template. + // This option is useful for situations in which you're supplying your own template and you need + // to pass in information that is not available in the default template. + ExtraContext map[string]string + // UseJITConfig indicates whether to attempt to configure the runner using JIT or a registration token. + UseJITConfig bool +} + +func InstallRunnerScript(installParams InstallRunnerParams, osType params.OSType, tpl string) ([]byte, error) { + if tpl == "" { + switch osType { + case params.Linux: + tpl = CloudConfigTemplate + case params.Windows: + tpl = WindowsSetupScriptTemplate + default: + return nil, fmt.Errorf("unsupported os type: %s", osType) + } + } + + t, err := template.New("").Parse(tpl) + if err != nil { + return nil, errors.Wrap(err, "parsing template") + } + + var buf bytes.Buffer + if err := t.Execute(&buf, installParams); err != nil { + return nil, errors.Wrap(err, "rendering template") + } + + return buf.Bytes(), nil +} diff --git a/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/util.go b/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/util.go new file mode 100644 index 00000000..2a8f4a34 --- /dev/null +++ b/vendor/github.com/cloudbase/garm-provider-common/cloudconfig/util.go @@ -0,0 +1,207 @@ +// Copyright 2023 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package cloudconfig + +import ( + "encoding/json" + "fmt" + "sort" + "strings" + + "github.com/cloudbase/garm-provider-common/defaults" + "github.com/cloudbase/garm-provider-common/params" + "github.com/pkg/errors" +) + +// CloudConfigSpec is a struct that holds extra specs that can be used to customize user data. +type CloudConfigSpec struct { + // RunnerInstallTemplate can be used to override the default runner install template. + // If used, the caller is responsible for the correctness of the template as well as the + // suitability of the template for the target OS. + RunnerInstallTemplate []byte `json:"runner_install_template,omitempty" jsonschema:"title=default runner install template,description=This option can be used to override the default runner install template. If used, the caller is responsible for the correctness of the template as well as the suitability of the template for the target OS. Use the extra_context extra spec if your template has variables in it that need to be expanded."` + // PreInstallScripts is a map of pre-install scripts that will be run before the + // runner install script. These will run as root and can be used to prep a generic image + // before we attempt to install the runner. The key of the map is the name of the script + // as it will be written to disk. The value is a byte array with the contents of the script. + // + // These scripts will be added and run in alphabetical order. + // + // On Linux, we will set the executable flag. On Windows, the name matters as Windows looks for an + // extension to determine if the file is an executable or not. In theory this can hold binaries, + // but in most cases this will most likely hold scripts. We do not currenly validate the payload, + // so it's up to the user what they upload here. + // Caution needs to be exercised when using this feature, as the total size of userdata is limited + // on most providers. + PreInstallScripts map[string][]byte `json:"pre_install_scripts,omitempty" jsonschema:"title=pre-install scripts,description= map of pre-install scripts that will be run before the runner install script. These will run as root and can be used to prep a generic image before we attempt to install the runner. The key of the map is the name of the script as it will be written to disk. The value is a byte array with the contents of the script."` + // ExtraContext is a map of extra context that will be passed to the runner install template. + ExtraContext map[string]string `json:"extra_context,omitempty" jsonschema:"title=map of extra context,description=Extra context that will be passed to the runner_install_template."` +} + +func sortMapKeys(m map[string][]byte) []string { + var keys []string + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + + return keys +} + +// GetSpecs returns the cloud config specific extra specs from the bootstrap params. +func GetSpecs(bootstrapParams params.BootstrapInstance) (CloudConfigSpec, error) { + var extraSpecs CloudConfigSpec + if len(bootstrapParams.ExtraSpecs) == 0 { + return extraSpecs, nil + } + + if err := json.Unmarshal(bootstrapParams.ExtraSpecs, &extraSpecs); err != nil { + return CloudConfigSpec{}, errors.Wrap(err, "unmarshaling extra specs") + } + + if extraSpecs.ExtraContext == nil { + extraSpecs.ExtraContext = map[string]string{} + } + + if extraSpecs.PreInstallScripts == nil { + extraSpecs.PreInstallScripts = map[string][]byte{} + } + + return extraSpecs, nil +} + +// GetRunnerInstallScript returns the runner install script for the given bootstrap params. +// This function will return either the default script for the given OS type or will use the supplied template +// if one is provided. +func GetRunnerInstallScript(bootstrapParams params.BootstrapInstance, tools params.RunnerApplicationDownload, runnerName string) ([]byte, error) { + if tools.GetFilename() == "" { + return nil, fmt.Errorf("missing tools filename") + } + + if tools.GetDownloadURL() == "" { + return nil, fmt.Errorf("missing tools download URL") + } + + tempToken := tools.GetTempDownloadToken() + extraSpecs, err := GetSpecs(bootstrapParams) + if err != nil { + return nil, errors.Wrap(err, "getting specs") + } + + installRunnerParams := InstallRunnerParams{ + FileName: tools.GetFilename(), + DownloadURL: tools.GetDownloadURL(), + TempDownloadToken: tempToken, + MetadataURL: bootstrapParams.MetadataURL, + RunnerUsername: defaults.DefaultUser, + RunnerGroup: defaults.DefaultUser, + RepoURL: bootstrapParams.RepoURL, + RunnerName: runnerName, + RunnerLabels: strings.Join(bootstrapParams.Labels, ","), + CallbackURL: bootstrapParams.CallbackURL, + CallbackToken: bootstrapParams.InstanceToken, + GitHubRunnerGroup: bootstrapParams.GitHubRunnerGroup, + ExtraContext: extraSpecs.ExtraContext, + EnableBootDebug: bootstrapParams.UserDataOptions.EnableBootDebug, + UseJITConfig: bootstrapParams.JitConfigEnabled, + } + + if bootstrapParams.CACertBundle != nil && len(bootstrapParams.CACertBundle) > 0 { + installRunnerParams.CABundle = string(bootstrapParams.CACertBundle) + } + + installScript, err := InstallRunnerScript(installRunnerParams, bootstrapParams.OSType, string(extraSpecs.RunnerInstallTemplate)) + if err != nil { + return nil, errors.Wrap(err, "generating script") + } + + return installScript, nil +} + +// GetCloudInitConfig returns the cloud-init specific userdata config. This config can be used on most clouds +// for most Linux machines. The install runner script must be generated separately either by GetRunnerInstallScript() +// or some other means. +func GetCloudInitConfig(bootstrapParams params.BootstrapInstance, installScript []byte) (string, error) { + extraSpecs, err := GetSpecs(bootstrapParams) + if err != nil { + return "", errors.Wrap(err, "getting specs") + } + + cloudCfg := NewDefaultCloudInitConfig() + + if bootstrapParams.UserDataOptions.DisableUpdatesOnBoot { + cloudCfg.PackageUpgrade = false + cloudCfg.Packages = []string{} + } + for _, pkg := range bootstrapParams.UserDataOptions.ExtraPackages { + cloudCfg.AddPackage(pkg) + } + + if len(extraSpecs.PreInstallScripts) > 0 { + names := sortMapKeys(extraSpecs.PreInstallScripts) + for _, name := range names { + script := extraSpecs.PreInstallScripts[name] + cloudCfg.AddFile(script, fmt.Sprintf("/garm-pre-install/%s", name), "root:root", "755") + cloudCfg.AddRunCmd(fmt.Sprintf("/garm-pre-install/%s", name)) + } + } + cloudCfg.AddRunCmd("rm -rf /garm-pre-install") + + cloudCfg.AddSSHKey(bootstrapParams.SSHKeys...) + cloudCfg.AddFile(installScript, "/install_runner.sh", "root:root", "755") + cloudCfg.AddRunCmd(fmt.Sprintf("su -l -c /install_runner.sh %s", defaults.DefaultUser)) + cloudCfg.AddRunCmd("rm -f /install_runner.sh") + if bootstrapParams.CACertBundle != nil && len(bootstrapParams.CACertBundle) > 0 { + if err := cloudCfg.AddCACert(bootstrapParams.CACertBundle); err != nil { + return "", errors.Wrap(err, "adding CA cert bundle") + } + } + + asStr, err := cloudCfg.Serialize() + if err != nil { + return "", errors.Wrap(err, "creating cloud config") + } + + return asStr, nil +} + +// GetCloudConfig is a helper function that generates a cloud-init config for Linux and a powershell script for Windows. +// In most cases this function should do, but in situations where a more custom approach is needed, you may need to call +// GetCloudInitConfig() or GetRunnerInstallScript() directly and compose the final userdata in a different way. +// The extra specs PreInstallScripts is only supported on Linux via cloud-init by this function. On some providers, like Azure +// Windows initialization scripts are run by creating a separate CustomScriptExtension resource for each individual script. +// On other clouds it may be different. This function aims to be generic, which is why it only supports the PreInstallScripts +// via cloud-init. +func GetCloudConfig(bootstrapParams params.BootstrapInstance, tools params.RunnerApplicationDownload, runnerName string) (string, error) { + installScript, err := GetRunnerInstallScript(bootstrapParams, tools, runnerName) + if err != nil { + return "", errors.Wrap(err, "generating script") + } + + var asStr string + switch bootstrapParams.OSType { + case params.Linux: + cloudCfg, err := GetCloudInitConfig(bootstrapParams, installScript) + if err != nil { + return "", errors.Wrap(err, "getting cloud init config") + } + return cloudCfg, nil + case params.Windows: + asStr = string(installScript) + default: + return "", fmt.Errorf("unknown os type: %s", bootstrapParams.OSType) + } + + return asStr, nil +} diff --git a/vendor/github.com/gdamore/encoding/.appveyor.yml b/vendor/github.com/gdamore/encoding/.appveyor.yml new file mode 100644 index 00000000..19a4c5dd --- /dev/null +++ b/vendor/github.com/gdamore/encoding/.appveyor.yml @@ -0,0 +1,13 @@ +version: 1.0.{build} +clone_folder: c:\gopath\src\github.com\gdamore\encoding +environment: + GOPATH: c:\gopath +build_script: +- go version +- go env +- SET PATH=%LOCALAPPDATA%\atom\bin;%GOPATH%\bin;%PATH% +- go get -t ./... +- go build +- go install ./... +test_script: +- go test ./... diff --git a/vendor/github.com/gdamore/encoding/CODE_OF_CONDUCT.md b/vendor/github.com/gdamore/encoding/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..65527da0 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/CODE_OF_CONDUCT.md @@ -0,0 +1,73 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at garrett@damore.org. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org diff --git a/vendor/github.com/gdamore/encoding/LICENSE b/vendor/github.com/gdamore/encoding/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/gdamore/encoding/README.md b/vendor/github.com/gdamore/encoding/README.md new file mode 100644 index 00000000..2ce29a9f --- /dev/null +++ b/vendor/github.com/gdamore/encoding/README.md @@ -0,0 +1,20 @@ +## encoding + + +[![Linux](https://img.shields.io/github/actions/workflow/status/gdamore/encoding/linux.yml?branch=main&logoColor=grey&logo=linux&label=)](https://github.com/gdamore/encoding/actions/workflows/linux.yml) +[![Windows](https://img.shields.io/github/actions/workflow/status/gdamore/encoding/windows.yml?branch=main&logoColor=grey&logo=windows&label=)](https://github.com/gdamore/encoding/actions/workflows/windows.yml) +[![Apache License](https://img.shields.io/github/license/gdamore/encoding.svg?logoColor=silver&logo=opensourceinitiative&color=blue&label=)](https://github.com/gdamore/encoding/blob/master/LICENSE) +[![Coverage](https://img.shields.io/codecov/c/github/gdamore/encoding?logoColor=grey&logo=codecov&label=)](https://codecov.io/gh/gdamore/encoding) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/gdamore/encoding) + +Package encoding provides a number of encodings that are missing from the +standard Go [encoding]("https://godoc.org/golang.org/x/text/encoding") package. + +We hope that we can contribute these to the standard Go library someday. It +turns out that some of these are useful for dealing with I/O streams coming +from non-UTF friendly sources. + +The UTF8 Encoder is also useful for situations where valid UTF-8 might be +carried in streams that contain non-valid UTF; in particular I use it for +helping me cope with terminals that embed escape sequences in otherwise +valid UTF-8. diff --git a/vendor/github.com/gdamore/encoding/SECURITY.md b/vendor/github.com/gdamore/encoding/SECURITY.md new file mode 100644 index 00000000..b9f64966 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/SECURITY.md @@ -0,0 +1,12 @@ +# Security Policy + +We take security very seriously in mangos, since you may be using it in +Internet-facing applications. + +## Reporting a Vulnerability + +To report a vulnerability, please contact us on our discord. +You may also send an email to garrett@damore.org, or info@staysail.tech. + +We will keep the reporter updated on any status updates on a regular basis, +and will respond within two business days for any reported security issue. diff --git a/vendor/github.com/gdamore/encoding/ascii.go b/vendor/github.com/gdamore/encoding/ascii.go new file mode 100644 index 00000000..b7321f43 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/ascii.go @@ -0,0 +1,36 @@ +// Copyright 2015 Garrett D'Amore +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package encoding + +import ( + "golang.org/x/text/encoding" +) + +// ASCII represents the 7-bit US-ASCII scheme. It decodes directly to +// UTF-8 without change, as all ASCII values are legal UTF-8. +// Unicode values less than 128 (i.e. 7 bits) map 1:1 with ASCII. +// It encodes runes outside of that to 0x1A, the ASCII substitution character. +var ASCII encoding.Encoding + +func init() { + amap := make(map[byte]rune) + for i := 128; i <= 255; i++ { + amap[byte(i)] = RuneError + } + + cm := &Charmap{Map: amap} + cm.Init() + ASCII = cm +} diff --git a/vendor/github.com/gdamore/encoding/charmap.go b/vendor/github.com/gdamore/encoding/charmap.go new file mode 100644 index 00000000..e8089c45 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/charmap.go @@ -0,0 +1,195 @@ +// Copyright 2024 Garrett D'Amore +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package encoding + +import ( + "sync" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/transform" +) + +const ( + // RuneError is an alias for the UTF-8 replacement rune, '\uFFFD'. + RuneError = '\uFFFD' + + // RuneSelf is the rune below which UTF-8 and the Unicode values are + // identical. Its also the limit for ASCII. + RuneSelf = 0x80 + + // ASCIISub is the ASCII substitution character. + ASCIISub = '\x1a' +) + +// Charmap is a structure for setting up encodings for 8-bit character sets, +// for transforming between UTF8 and that other character set. It has some +// ideas borrowed from golang.org/x/text/encoding/charmap, but it uses a +// different implementation. This implementation uses maps, and supports +// user-defined maps. +// +// We do assume that a character map has a reasonable substitution character, +// and that valid encodings are stable (exactly a 1:1 map) and stateless +// (that is there is no shift character or anything like that.) Hence this +// approach will not work for many East Asian character sets. +// +// Measurement shows little or no measurable difference in the performance of +// the two approaches. The difference was down to a couple of nsec/op, and +// no consistent pattern as to which ran faster. With the conversion to +// UTF-8 the code takes about 25 nsec/op. The conversion in the reverse +// direction takes about 100 nsec/op. (The larger cost for conversion +// from UTF-8 is most likely due to the need to convert the UTF-8 byte stream +// to a rune before conversion. +type Charmap struct { + transform.NopResetter + bytes map[rune]byte + runes [256][]byte + once sync.Once + + // The map between bytes and runes. To indicate that a specific + // byte value is invalid for a charcter set, use the rune + // utf8.RuneError. Values that are absent from this map will + // be assumed to have the identity mapping -- that is the default + // is to assume ISO8859-1, where all 8-bit characters have the same + // numeric value as their Unicode runes. (Not to be confused with + // the UTF-8 values, which *will* be different for non-ASCII runes.) + // + // If no values less than RuneSelf are changed (or have non-identity + // mappings), then the character set is assumed to be an ASCII + // superset, and certain assumptions and optimizations become + // available for ASCII bytes. + Map map[byte]rune + + // The ReplacementChar is the byte value to use for substitution. + // It should normally be ASCIISub for ASCII encodings. This may be + // unset (left to zero) for mappings that are strictly ASCII supersets. + // In that case ASCIISub will be assumed instead. + ReplacementChar byte +} + +type cmapDecoder struct { + transform.NopResetter + runes [256][]byte +} + +type cmapEncoder struct { + transform.NopResetter + bytes map[rune]byte + replace byte +} + +// Init initializes internal values of a character map. This should +// be done early, to minimize the cost of allocation of transforms +// later. It is not strictly necessary however, as the allocation +// functions will arrange to call it if it has not already been done. +func (c *Charmap) Init() { + c.once.Do(c.initialize) +} + +func (c *Charmap) initialize() { + c.bytes = make(map[rune]byte) + ascii := true + + for i := 0; i < 256; i++ { + r, ok := c.Map[byte(i)] + if !ok { + r = rune(i) + } + if r < 128 && r != rune(i) { + ascii = false + } + if r != RuneError { + c.bytes[r] = byte(i) + } + utf := make([]byte, utf8.RuneLen(r)) + utf8.EncodeRune(utf, r) + c.runes[i] = utf + } + if ascii && c.ReplacementChar == '\x00' { + c.ReplacementChar = ASCIISub + } +} + +// NewDecoder returns a Decoder the converts from the 8-bit +// character set to UTF-8. Unknown mappings, if any, are mapped +// to '\uFFFD'. +func (c *Charmap) NewDecoder() *encoding.Decoder { + c.Init() + return &encoding.Decoder{Transformer: &cmapDecoder{runes: c.runes}} +} + +// NewEncoder returns a Transformer that converts from UTF8 to the +// 8-bit character set. Unknown mappings are mapped to 0x1A. +func (c *Charmap) NewEncoder() *encoding.Encoder { + c.Init() + return &encoding.Encoder{ + Transformer: &cmapEncoder{ + bytes: c.bytes, + replace: c.ReplacementChar, + }, + } +} + +func (d *cmapDecoder) Transform(dst, src []byte, atEOF bool) (int, int, error) { + var e error + var ndst, nsrc int + + for _, c := range src { + b := d.runes[c] + l := len(b) + + if ndst+l > len(dst) { + e = transform.ErrShortDst + break + } + for i := 0; i < l; i++ { + dst[ndst] = b[i] + ndst++ + } + nsrc++ + } + return ndst, nsrc, e +} + +func (d *cmapEncoder) Transform(dst, src []byte, atEOF bool) (int, int, error) { + var e error + var ndst, nsrc int + for nsrc < len(src) { + if ndst >= len(dst) { + e = transform.ErrShortDst + break + } + + r, sz := utf8.DecodeRune(src[nsrc:]) + if r == utf8.RuneError && sz == 1 { + // If its inconclusive due to insufficient data in + // in the source, report it + if atEOF && !utf8.FullRune(src[nsrc:]) { + e = transform.ErrShortSrc + break + } + } + + if c, ok := d.bytes[r]; ok { + dst[ndst] = c + } else { + dst[ndst] = d.replace + } + nsrc += sz + ndst++ + } + + return ndst, nsrc, e +} diff --git a/vendor/github.com/gdamore/encoding/doc.go b/vendor/github.com/gdamore/encoding/doc.go new file mode 100644 index 00000000..8a7b48d7 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/doc.go @@ -0,0 +1,17 @@ +// Copyright 2015 Garrett D'Amore +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package encoding provides a few of the encoding structures that are +// missing from the Go x/text/encoding tree. +package encoding diff --git a/vendor/github.com/gdamore/encoding/ebcdic.go b/vendor/github.com/gdamore/encoding/ebcdic.go new file mode 100644 index 00000000..8e13f1a9 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/ebcdic.go @@ -0,0 +1,273 @@ +// Copyright 2015 Garrett D'Amore +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package encoding + +import ( + "golang.org/x/text/encoding" +) + +// EBCDIC represents the 8-bit EBCDIC scheme, found in some mainframe +// environments. If you don't know what this is, consider yourself lucky. +var EBCDIC encoding.Encoding + +func init() { + cm := &Charmap{ + ReplacementChar: '\x3f', + Map: map[byte]rune{ + // 0x00-0x03 match + 0x04: RuneError, + 0x05: '\t', + 0x06: RuneError, + 0x07: '\x7f', + 0x08: RuneError, + 0x09: RuneError, + 0x0a: RuneError, + // 0x0b-0x13 match + 0x14: RuneError, + 0x15: '\x85', // Not in any ISO code + 0x16: '\x08', + 0x17: RuneError, + // 0x18-0x19 match + 0x1a: RuneError, + 0x1b: RuneError, + // 0x1c-0x1f match + 0x20: RuneError, + 0x21: RuneError, + 0x22: RuneError, + 0x23: RuneError, + 0x24: RuneError, + 0x25: '\n', + 0x26: '\x17', + 0x27: '\x1b', + 0x28: RuneError, + 0x29: RuneError, + 0x2a: RuneError, + 0x2b: RuneError, + 0x2c: RuneError, + 0x2d: '\x05', + 0x2e: '\x06', + 0x2f: '\x07', + 0x30: RuneError, + 0x31: RuneError, + 0x32: '\x16', + 0x33: RuneError, + 0x34: RuneError, + 0x35: RuneError, + 0x36: RuneError, + 0x37: '\x04', + 0x38: RuneError, + 0x39: RuneError, + 0x3a: RuneError, + 0x3b: RuneError, + 0x3c: '\x14', + 0x3d: '\x15', + 0x3e: RuneError, + 0x3f: '\x1a', // also replacement char + 0x40: ' ', + 0x41: '\xa0', + 0x42: RuneError, + 0x43: RuneError, + 0x44: RuneError, + 0x45: RuneError, + 0x46: RuneError, + 0x47: RuneError, + 0x48: RuneError, + 0x49: RuneError, + 0x4a: RuneError, + 0x4b: '.', + 0x4c: '<', + 0x4d: '(', + 0x4e: '+', + 0x4f: '|', + 0x50: '&', + 0x51: RuneError, + 0x52: RuneError, + 0x53: RuneError, + 0x54: RuneError, + 0x55: RuneError, + 0x56: RuneError, + 0x57: RuneError, + 0x58: RuneError, + 0x59: RuneError, + 0x5a: '!', + 0x5b: '$', + 0x5c: '*', + 0x5d: ')', + 0x5e: ';', + 0x5f: '¬', + 0x60: '-', + 0x61: '/', + 0x62: RuneError, + 0x63: RuneError, + 0x64: RuneError, + 0x65: RuneError, + 0x66: RuneError, + 0x67: RuneError, + 0x68: RuneError, + 0x69: RuneError, + 0x6a: '¦', + 0x6b: ',', + 0x6c: '%', + 0x6d: '_', + 0x6e: '>', + 0x6f: '?', + 0x70: RuneError, + 0x71: RuneError, + 0x72: RuneError, + 0x73: RuneError, + 0x74: RuneError, + 0x75: RuneError, + 0x76: RuneError, + 0x77: RuneError, + 0x78: RuneError, + 0x79: '`', + 0x7a: ':', + 0x7b: '#', + 0x7c: '@', + 0x7d: '\'', + 0x7e: '=', + 0x7f: '"', + 0x80: RuneError, + 0x81: 'a', + 0x82: 'b', + 0x83: 'c', + 0x84: 'd', + 0x85: 'e', + 0x86: 'f', + 0x87: 'g', + 0x88: 'h', + 0x89: 'i', + 0x8a: RuneError, + 0x8b: RuneError, + 0x8c: RuneError, + 0x8d: RuneError, + 0x8e: RuneError, + 0x8f: '±', + 0x90: RuneError, + 0x91: 'j', + 0x92: 'k', + 0x93: 'l', + 0x94: 'm', + 0x95: 'n', + 0x96: 'o', + 0x97: 'p', + 0x98: 'q', + 0x99: 'r', + 0x9a: RuneError, + 0x9b: RuneError, + 0x9c: RuneError, + 0x9d: RuneError, + 0x9e: RuneError, + 0x9f: RuneError, + 0xa0: RuneError, + 0xa1: '~', + 0xa2: 's', + 0xa3: 't', + 0xa4: 'u', + 0xa5: 'v', + 0xa6: 'w', + 0xa7: 'x', + 0xa8: 'y', + 0xa9: 'z', + 0xaa: RuneError, + 0xab: RuneError, + 0xac: RuneError, + 0xad: RuneError, + 0xae: RuneError, + 0xaf: RuneError, + 0xb0: '^', + 0xb1: RuneError, + 0xb2: RuneError, + 0xb3: RuneError, + 0xb4: RuneError, + 0xb5: RuneError, + 0xb6: RuneError, + 0xb7: RuneError, + 0xb8: RuneError, + 0xb9: RuneError, + 0xba: '[', + 0xbb: ']', + 0xbc: RuneError, + 0xbd: RuneError, + 0xbe: RuneError, + 0xbf: RuneError, + 0xc0: '{', + 0xc1: 'A', + 0xc2: 'B', + 0xc3: 'C', + 0xc4: 'D', + 0xc5: 'E', + 0xc6: 'F', + 0xc7: 'G', + 0xc8: 'H', + 0xc9: 'I', + 0xca: '\xad', // NB: soft hyphen + 0xcb: RuneError, + 0xcc: RuneError, + 0xcd: RuneError, + 0xce: RuneError, + 0xcf: RuneError, + 0xd0: '}', + 0xd1: 'J', + 0xd2: 'K', + 0xd3: 'L', + 0xd4: 'M', + 0xd5: 'N', + 0xd6: 'O', + 0xd7: 'P', + 0xd8: 'Q', + 0xd9: 'R', + 0xda: RuneError, + 0xdb: RuneError, + 0xdc: RuneError, + 0xdd: RuneError, + 0xde: RuneError, + 0xdf: RuneError, + 0xe0: '\\', + 0xe1: '\u2007', // Non-breaking space + 0xe2: 'S', + 0xe3: 'T', + 0xe4: 'U', + 0xe5: 'V', + 0xe6: 'W', + 0xe7: 'X', + 0xe8: 'Y', + 0xe9: 'Z', + 0xea: RuneError, + 0xeb: RuneError, + 0xec: RuneError, + 0xed: RuneError, + 0xee: RuneError, + 0xef: RuneError, + 0xf0: '0', + 0xf1: '1', + 0xf2: '2', + 0xf3: '3', + 0xf4: '4', + 0xf5: '5', + 0xf6: '6', + 0xf7: '7', + 0xf8: '8', + 0xf9: '9', + 0xfa: RuneError, + 0xfb: RuneError, + 0xfc: RuneError, + 0xfd: RuneError, + 0xfe: RuneError, + 0xff: RuneError, + }} + cm.Init() + EBCDIC = cm +} diff --git a/vendor/github.com/gdamore/encoding/latin1.go b/vendor/github.com/gdamore/encoding/latin1.go new file mode 100644 index 00000000..226bf01d --- /dev/null +++ b/vendor/github.com/gdamore/encoding/latin1.go @@ -0,0 +1,33 @@ +// Copyright 2015 Garrett D'Amore +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package encoding + +import ( + "golang.org/x/text/encoding" +) + +// ISO8859_1 represents the 8-bit ISO8859-1 scheme. It decodes directly to +// UTF-8 without change, as all ISO8859-1 values are legal UTF-8. +// Unicode values less than 256 (i.e. 8 bits) map 1:1 with 8859-1. +// It encodes runes outside of that to 0x1A, the ASCII substitution character. +var ISO8859_1 encoding.Encoding + +func init() { + cm := &Charmap{} + cm.Init() + + // 8859-1 is the 8-bit identity map for Unicode. + ISO8859_1 = cm +} diff --git a/vendor/github.com/gdamore/encoding/latin5.go b/vendor/github.com/gdamore/encoding/latin5.go new file mode 100644 index 00000000..c75ecf27 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/latin5.go @@ -0,0 +1,35 @@ +// Copyright 2015 Garrett D'Amore +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package encoding + +import ( + "golang.org/x/text/encoding" +) + +// ISO8859_9 represents the 8-bit ISO8859-9 scheme. +var ISO8859_9 encoding.Encoding + +func init() { + cm := &Charmap{Map: map[byte]rune{ + 0xD0: 'Ğ', + 0xDD: 'İ', + 0xDE: 'Ş', + 0xF0: 'ğ', + 0xFD: 'ı', + 0xFE: 'ş', + }} + cm.Init() + ISO8859_9 = cm +} diff --git a/vendor/github.com/gdamore/encoding/utf8.go b/vendor/github.com/gdamore/encoding/utf8.go new file mode 100644 index 00000000..2d59f4b3 --- /dev/null +++ b/vendor/github.com/gdamore/encoding/utf8.go @@ -0,0 +1,35 @@ +// Copyright 2015 Garrett D'Amore +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package encoding + +import ( + "golang.org/x/text/encoding" +) + +type validUtf8 struct{} + +// UTF8 is an encoding for UTF-8. All it does is verify that the UTF-8 +// in is valid. The main reason for its existence is that it will detect +// and report ErrSrcShort or ErrDstShort, whereas the Nop encoding just +// passes every byte, blithely. +var UTF8 encoding.Encoding = validUtf8{} + +func (validUtf8) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: encoding.UTF8Validator} +} + +func (validUtf8) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: encoding.UTF8Validator} +} diff --git a/vendor/github.com/gdamore/tcell/v2/.gitignore b/vendor/github.com/gdamore/tcell/v2/.gitignore new file mode 100644 index 00000000..c57100a5 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/.gitignore @@ -0,0 +1 @@ +coverage.txt diff --git a/vendor/github.com/gdamore/tcell/v2/AUTHORS b/vendor/github.com/gdamore/tcell/v2/AUTHORS new file mode 100644 index 00000000..53f87ee6 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/AUTHORS @@ -0,0 +1,4 @@ +Garrett D'Amore +Zachary Yedidia +Junegunn Choi +Staysail Systems, Inc. diff --git a/vendor/github.com/gdamore/tcell/v2/CHANGESv2.md b/vendor/github.com/gdamore/tcell/v2/CHANGESv2.md new file mode 100644 index 00000000..ad97c11b --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/CHANGESv2.md @@ -0,0 +1,82 @@ +## Breaking Changes in _Tcell_ v2 + +A number of changes were made to _Tcell_ for version two, and some of these are breaking. + +### Import Path + +The import path for tcell has changed to `github.com/gdamore/tcell/v2` to reflect a new major version. + +### Style Is Not Numeric + +The type `Style` has changed to a structure, to allow us to add additional data such as flags for color setting, +more attribute bits, and so forth. +Applications that relied on this being a number will need to be updated to use the accessor methods. + +### Mouse Event Changes + +The middle mouse button was reported as button 2 on Linux, but as button 3 on Windows, +and the right mouse button was reported the reverse way. +_Tcell_ now always reports the right mouse button as button 2, and the middle button as button 3. +To help make this clearer, new symbols `ButtonPrimary`, `ButtonSecondary`, and +`ButtonMiddle` are provided. +(Note that which button is right vs. left may be impacted by user preferences. +Usually the left button will be considered the Primary, and the right will be the Secondary.) +Applications may need to adjust their handling of mouse buttons 2 and 3 accordingly. + +### Terminals Removed + +A number of terminals have been removed. +These are mostly ancient definitions unlikely to be used by anyone, such as `adm3a`. + +### High Number Function Keys + +Historically terminfo reported function keys with modifiers set as a different +function key altogether. For example, Shift-F1 was reported as F13 on XTerm. +_Tcell_ now prefers to report these using the base key (such as F1) with modifiers added. +This works on XTerm and VTE based emulators, but some emulators may not support this. +The new behavior more closely aligns with behavior on Windows platforms. + +## New Features in _Tcell_ v2 + +These features are not breaking, but are introduced in version 2. + +### Improved Modifier Support + +For terminals that appear to behave like the venerable XTerm, _tcell_ +automatically adds modifier reporting for ALT, CTRL, SHIFT, and META keys +when the terminal reports them. + +### Better Support for Palettes (Themes) + +When using a color by its name or palette entry, _Tcell_ now tries to +use that palette entry as is; this should avoid some inconsistency and respect +terminal themes correctly. + +When true fidelity to RGB values is needed, the new `TrueColor()` API can be used +to create a direct color, which bypasses the palette altogether. + +### Automatic TrueColor Detection + +For some terminals, if the `Tc` or `RGB` properties are present in terminfo, +_Tcell_ will automatically assume the terminal supports 24-bit color. + +### ColorReset + +A new color value, `ColorReset` can be used on the foreground or background +to reset the color the default used by the terminal. + +### tmux Support + +_Tcell_ now has improved support for tmux, when the `$TERM` variable is set to "tmux". + +### Strikethrough Support + +_Tcell_ has support for strikethrough when the terminal supports it, using the new `StrikeThrough()` API. + +### Bracketed Paste Support + +_Tcell_ provides the long requested capability to discriminate paste event by using the +bracketed-paste capability present in some terminals. This is automatically available on +terminals that support XTerm style mouse handling, but applications must opt-in to this +by using the new `EnablePaste()` function. A new `EventPaste` type of event will be +delivered when starting and finishing a paste operation. \ No newline at end of file diff --git a/vendor/github.com/gdamore/tcell/v2/LICENSE b/vendor/github.com/gdamore/tcell/v2/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/gdamore/tcell/v2/README-wasm.md b/vendor/github.com/gdamore/tcell/v2/README-wasm.md new file mode 100644 index 00000000..278bacad --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/README-wasm.md @@ -0,0 +1,61 @@ +# WASM for _Tcell_ + +You can build _Tcell_ project into a webpage by compiling it slightly differently. This will result in a _Tcell_ project you can embed into another html page, or use as a standalone page. + +## Building your project + +WASM needs special build flags in order to work. You can build it by executing +```sh +GOOS=js GOARCH=wasm go build -o yourfile.wasm +``` + +## Additional files + +You also need 5 other files in the same directory as the wasm. Four (`tcell.html`, `tcell.js`, `termstyle.css`, and `beep.wav`) are provided in the `webfiles` directory. The last one, `wasm_exec.js`, can be copied from GOROOT into the current directory by executing +```sh +cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" ./ +``` + +In `tcell.js`, you also need to change the constant +```js +const wasmFilePath = "yourfile.wasm" +``` +to the file you outputted to when building. + +## Displaying your project + +### Standalone + +You can see the project (with an white background around the terminal) by serving the directory. You can do this using any framework, including another golang project: + +```golang +// server.go + +package main + +import ( + "log" + "net/http" +) + +func main() { + log.Fatal(http.ListenAndServe(":8080", + http.FileServer(http.Dir("/path/to/dir/to/serve")), + )) +} + +``` + +To see the webpage with this example, you can type in `localhost:8080/tcell.html` into your browser while `server.go` is running. + +### Embedding +It is recommended to use an iframe if you want to embed the app into a webpage: +```html + +``` + +## Other considerations + +### Accessing files + +`io.Open(filename)` and other related functions for reading file systems do not work; use `http.Get(filename)` instead. \ No newline at end of file diff --git a/vendor/github.com/gdamore/tcell/v2/README.md b/vendor/github.com/gdamore/tcell/v2/README.md new file mode 100644 index 00000000..93ceb845 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/README.md @@ -0,0 +1,238 @@ + + +# Tcell + +_Tcell_ is a _Go_ package that provides a cell based view for text terminals, like _XTerm_. +It was inspired by _termbox_, but includes many additional improvements. + +[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua) +[![Linux](https://img.shields.io/github/actions/workflow/status/gdamore/tcell/linux.yml?branch=main&logoColor=grey&logo=linux&label=)](https://github.com/gdamore/tcell/actions/workflows/linux.yml) +[![Windows](https://img.shields.io/github/actions/workflow/status/gdamore/tcell/windows.yml?branch=main&logoColor=grey&label=Windows)](https://github.com/gdamore/tcell/actions/workflows/windows.yml) +[![Web Assembly](https://img.shields.io/github/actions/workflow/status/gdamore/tcell/webasm.yml?branch=main&logoColor=grey&logo=webassembly&label=)](https://github.com/gdamore/tcell/actions/workflows/webasm.yml) +[![Apache License](https://img.shields.io/github/license/gdamore/tcell.svg?logoColor=silver&logo=opensourceinitiative&color=blue&label=)](https://github.com/gdamore/tcell/blob/master/LICENSE) +[![Docs](https://img.shields.io/badge/godoc-reference-blue.svg?label=&logo=go)](https://pkg.go.dev/github.com/gdamore/tcell/v2) +[![Discord](https://img.shields.io/discord/639503822733180969?label=&logo=discord)](https://discord.gg/urTTxDN) +[![Coverage](https://img.shields.io/codecov/c/github/gdamore/tcell?logoColor=grey&logo=codecov&label=)](https://codecov.io/gh/gdamore/tcell) +[![Go Report Card](https://goreportcard.com/badge/github.com/gdamore/tcell/v2)](https://goreportcard.com/report/github.com/gdamore/tcell/v2) +[![Latest Release](https://img.shields.io/github/v/release/gdamore/tcell.svg?logo=github&label=)](https://github.com/gdamore/tcell/releases) + +Please see [here](UKRAINE.md) for an important message for the people of Russia. + +NOTE: This is version 2 of _Tcell_. There are breaking changes relative to version 1. +Version 1.x remains available using the import `github.com/gdamore/tcell`. + +## Tutorial + +A brief, and still somewhat rough, [tutorial](TUTORIAL.md) is available. + +## Examples + +A number of example are posted up on our [Gallery](https://github.com/gdamore/tcell/wikis/Gallery/). + +Let us know if you want to add your masterpiece to the list! + +## Pure Go Terminfo Database + +_Tcell_ includes a full parser and expander for terminfo capability strings, +so that it can avoid hard coding escape strings for formatting. It also favors +portability, and includes support for all POSIX systems. + +The database is also flexible & extensible, and can be modified by either running +a program to build the entire database, or an entry for just a single terminal. + +## More Portable + +_Tcell_ is portable to a wide variety of systems, and is pure Go, without +any need for CGO. +_Tcell_ is believed to work with mainstream systems officially supported by golang. + +Following the Go support policy, _Tcell_ officially only supports the current ("stable") version of go, +and the version immediately prior ("oldstable"). This policy is necessary to make sure that we can +update dependencies to pick up security fixes and new features, and it allows us to adopt changes +(such as library and language features) that are only supported in newer versions of Go. + +## No Async IO + +_Tcell_ is able to operate without requiring `SIGIO` signals (unlike _termbox_), +or asynchronous I/O, and can instead use standard Go file objects and Go routines. +This means it should be safe, especially for +use with programs that use exec, or otherwise need to manipulate the tty streams. +This model is also much closer to idiomatic Go, leading to fewer surprises. + +## Rich Unicode & non-Unicode support + +_Tcell_ includes enhanced support for Unicode, including wide characters and +combining characters, provided your terminal can support them. +Note that +Windows terminals generally don't support the full Unicode repertoire. + +It will also convert to and from Unicode locales, so that the program +can work with UTF-8 internally, and get reasonable output in other locales. +_Tcell_ tries hard to convert to native characters on both input and output. +On output _Tcell_ even makes use of the alternate character set to facilitate +drawing certain characters. + +## More Function Keys + +_Tcell_ also has richer support for a larger number of special keys that some +terminals can send. + +## Better Color Handling + +_Tcell_ will respect your terminal's color space as specified within your terminfo entries. +For example attempts to emit color sequences on VT100 terminals +won't result in unintended consequences. + +_Tcell_ maps 16 colors down to 8, for terminals that need it. +(The upper 8 colors are just brighter versions of the lower 8.) + +## Better Mouse Support + +_Tcell_ supports enhanced mouse tracking mode, so your application can receive +regular mouse motion events, and wheel events, if your terminal supports it. + +## _Termbox_ Compatibility + +A compatibility layer for _termbox_ is provided in the `compat` directory. +To use it, try importing `github.com/gdamore/tcell/termbox` instead. +Most _termbox-go_ programs will probably work without further modification. + +## Working With Unicode + +Internally _Tcell_ uses UTF-8, just like Go. +However, _Tcell_ understands how to +convert to and from other character sets, using the capabilities of +the `golang.org/x/text/encoding` packages. +Your application must supply +them, as the full set of the most common ones bloats the program by about 2 MB. +If you're lazy, and want them all anyway, see the `encoding` sub-directory. + +## Wide & Combining Characters + +The `SetContent()` API takes a primary rune, and an optional list of combining runes. +If any of the runes is a wide (East Asian) rune occupying two cells, +then the library will skip output from the following cell. Care must be +taken in the application to avoid explicitly attempting to set content in the +next cell, otherwise the results are undefined. (Normally the wide character +is displayed, and the other character is not; do not depend on that behavior.) + +## Colors + +_Tcell_ assumes the ANSI/XTerm color model, including the 256 color map that +XTerm uses when it supports 256 colors. The terminfo guidance will be +honored, with respect to the number of colors supported. Also, only +terminals which expose ANSI style `setaf` and `setab` will support color; +if you have a color terminal that only has `setf` and `setb`, please submit +a ticket. + +## 24-bit Color + +_Tcell_ _supports 24-bit color!_ (That is, if your terminal can support it.) + +NOTE: Technically the approach of using 24-bit RGB values for color is more +accurately described as "direct color", but most people use the term "true color". +We follow the (inaccurate) common convention. + +There are a few ways you can enable (or disable) true color. + +- For many terminals, we can detect it automatically if your terminal + includes the `RGB` or `Tc` capabilities (or rather it did when the database + was updated.) + +- You can force this one by setting the `COLORTERM` environment variable to + `24-bit`, `truecolor` or `24bit`. This is the same method used + by most other terminal applications that support 24-bit color. + +- If you set your `TERM` environment variable to a value with the suffix `-truecolor` + then 24-bit color compatible with XTerm and ECMA-48 will be assumed. + (This feature is deprecated. + It is recommended to use one of other methods listed above.) + +- You can disable 24-bit color by setting `TCELL_TRUECOLOR=disable` in your + environment. + +When using TrueColor, programs will display the colors that the programmer +intended, overriding any "`themes`" you may have set in your terminal +emulator. (For some cases, accurate color fidelity is more important +than respecting themes. For other cases, such as typical text apps that +only use a few colors, its more desirable to respect the themes that +the user has established.) + +## Performance + +Reasonable attempts have been made to minimize sending data to terminals, +avoiding repeated sequences or drawing the same cell on refresh updates. + +## Terminfo + +(Not relevant for Windows users.) + +The Terminfo implementation operates with a built-in database. +This should satisfy most users. However, it can also (on systems +with ncurses installed), dynamically parse the output from `infocmp` +for terminals it does not already know about. + +See the `terminfo/` directory for more information about generating +new entries for the built-in database. + +_Tcell_ requires that the terminal support the `cup` mode of cursor addressing. +Ancient terminals without the ability to position the cursor directly +are not supported. +This is unlikely to be a problem; such terminals have not been mass-produced +since the early 1970s. + +## Mouse Support + +Mouse support is detected via the `kmous` terminfo variable, however, +enablement/disablement and decoding mouse events is done using hard coded +sequences based on the XTerm X11 model. All popular +terminals with mouse tracking support this model. (Full terminfo support +is not possible as terminfo sequences are not defined.) + +On Windows, the mouse works normally. + +Mouse wheel buttons on various terminals are known to work, but the support +in terminal emulators, as well as support for various buttons and +live mouse tracking, varies widely. +Modern _xterm_, macOS _Terminal_, and _iTerm_ all work well. + +## Bracketed Paste + +Terminals that appear to support the XTerm mouse model also can support +bracketed paste, for applications that opt-in. See `EnablePaste()` for details. + +## Testability + +There is a `SimulationScreen`, that can be used to simulate a real screen +for automated testing. The supplied tests do this. The simulation contains +event delivery, screen resizing support, and capabilities to inject events +and examine "`physical`" screen contents. + +## Platforms + +### POSIX (Linux, FreeBSD, macOS, Solaris, etc.) + +Everything works using pure Go on mainstream platforms. Some more esoteric +platforms (e.g., AIX) may need to be added. Pull requests are welcome! + +### Windows + +Windows console mode applications are supported. + +Modern console applications like ConEmu and the Windows Terminal, +support all the good features (resize, mouse tracking, etc.) + +### WASM + +WASM is supported, but needs additional setup detailed in [README-wasm](README-wasm.md). + +### Plan9 and its variants + +Plan 9 is supported on a limited basis. The Plan 9 backend opens `/dev/cons` for I/O, enables raw mode by writing `rawon`/`rawoff` to `/dev/consctl`, watches `/dev/wctl` for resize notifications, and then constructs a **terminfo-backed** `Screen` (so `NewScreen` works as on other platforms). Typical usage is inside `vt(1)` with `TERM=vt100`. Expect **monochrome text** and **no mouse reporting** under stock `vt(1)` (it generally does not emit ANSI color or xterm mouse sequences). If a Plan 9 terminal supplies ANSI color escape sequences and xterm-style mouse reporting, color can be picked up via **terminfo** and mouse support could be added by wiring those sequences into the Plan 9 TTY path; contributions that improve terminal detection and broaden feature support are welcome. + +### Commercial Support + +_Tcell_ is absolutely free, but if you want to obtain commercial, professional support, there are options. + +- [TideLift](https://tidelift.com/) subscriptions include support for _Tcell_, as well as many other open source packages. +- [Staysail Systems Inc.](mailto:info@staysail.tech) offers direct support, and custom development around _Tcell_ on an hourly basis. diff --git a/vendor/github.com/gdamore/tcell/v2/SECURITY.md b/vendor/github.com/gdamore/tcell/v2/SECURITY.md new file mode 100644 index 00000000..5c0aa5ab --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/SECURITY.md @@ -0,0 +1,15 @@ +# SECURITY + +It's somewhat unlikely that tcell is in a security sensitive path, +but we do take security seriously. + +## Vulnerabilityu Response + +If you report a vulnerability, we will respond within 2 business days. + +## Report a Vulnerability + +If you wish to report a vulnerability found in tcell, simply send a message +to garrett@damore.org. You may also reach us on our discord channel - +https://discord.gg/urTTxDN - a private message to `gdamore` on that channel +may be submitted instead of mail. diff --git a/vendor/github.com/gdamore/tcell/v2/TUTORIAL.md b/vendor/github.com/gdamore/tcell/v2/TUTORIAL.md new file mode 100644 index 00000000..f52fcff0 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/TUTORIAL.md @@ -0,0 +1,313 @@ +# _Tcell_ Tutorial + +_Tcell_ provides a low-level, portable API for building terminal-based programs. +A [terminal emulator](https://en.wikipedia.org/wiki/Terminal_emulator) +(or a real terminal such as a DEC VT-220) is used to interact with such a program. + +_Tcell_'s interface is fairly low-level. +While it provides a reasonably portable way of dealing with all the usual terminal +features, it may be easier to utilize a higher level framework. +A number of such frameworks are listed on the _Tcell_ main [README](README.md). + +This tutorial provides the details of _Tcell_, and is appropriate for developers +wishing to create their own application frameworks or needing more direct access +to the terminal capabilities. + +## Resize events + +Applications receive an event of type `EventResize` when they are first initialized and each time the terminal is resized. +The new size is available as `Size`. + +```go +switch ev := ev.(type) { +case *tcell.EventResize: + w, h := ev.Size() + logMessage(fmt.Sprintf("Resized to %dx%d", w, h)) +} +``` + +## Key events + +When a key is pressed, applications receive an event of type `EventKey`. +This event describes the modifier keys pressed (if any) and the pressed key or rune. + +When a rune key is pressed, an event with its `Key` set to `KeyRune` is dispatched. + +When a non-rune key is pressed, it is available as the `Key` of the event. + +```go +switch ev := ev.(type) { +case *tcell.EventKey: + mod, key, ch := ev.Mod(), ev.Key(), ev.Rune() + logMessage(fmt.Sprintf("EventKey Modifiers: %d Key: %d Rune: %d", mod, key, ch)) +} +``` + +### Key event restrictions + +Terminal-based programs have less visibility into keyboard activity than graphical applications. + +When a key is pressed and held, additional key press events are sent by the terminal emulator. +The rate of these repeated events depends on the emulator's configuration. +Key release events are not available. + +It is not possible to distinguish runes typed while holding shift and runes typed using caps lock. +Capital letters are reported without the Shift modifier. + +## Mouse events + +Applications receive an event of type `EventMouse` when the mouse moves, or a mouse button is pressed or released. +Mouse events are only delivered if +`EnableMouse` has been called. + +The mouse buttons being pressed (if any) are available as `Buttons`, and the position of the mouse is available as `Position`. + +```go +switch ev := ev.(type) { +case *tcell.EventMouse: + mod := ev.Modifiers() + btns := ev.Buttons() + x, y := ev.Position() + logMessage(fmt.Sprintf("EventMouse Modifiers: %d Buttons: %d Position: %d,%d", mod, btns, x, y)) +} +``` + +### Mouse buttons + +Identifier | Alias | Description +-----------|-----------------|----------- +Button1 | ButtonPrimary | Left button +Button2 | ButtonSecondary | Right button +Button3 | ButtonMiddle | Middle button +Button4 | | Side button (thumb/next) +Button5 | | Side button (thumb/prev) +WheelUp | | Scroll wheel up +WheelDown | | Scroll wheel down +WheelLeft | | Horizontal wheel left +WheelRight | | Horizontal wheel right + +## Usage + +To create a _Tcell_ application, first initialize a screen to hold it. + +```go +s, err := tcell.NewScreen() +if err != nil { + log.Fatalf("%+v", err) +} +if err := s.Init(); err != nil { + log.Fatalf("%+v", err) +} + +// Set default text style +defStyle := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset) +s.SetStyle(defStyle) + +// Clear screen +s.Clear() +``` + +Text may be drawn on the screen using `SetContent`. + +```go +s.SetContent(0, 0, 'H', nil, defStyle) +s.SetContent(1, 0, 'i', nil, defStyle) +s.SetContent(2, 0, '!', nil, defStyle) +``` + +To draw text more easily, define a render function. + +```go +func drawText(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, text string) { + row := y1 + col := x1 + for _, r := range []rune(text) { + s.SetContent(col, row, r, nil, style) + col++ + if col >= x2 { + row++ + col = x1 + } + if row > y2 { + break + } + } +} +``` + +Lastly, define an event loop to handle user input and update application state. + +```go +quit := func() { + s.Fini() + os.Exit(0) +} +for { + // Update screen + s.Show() + + // Poll event + ev := s.PollEvent() + + // Process event + switch ev := ev.(type) { + case *tcell.EventResize: + s.Sync() + case *tcell.EventKey: + if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC { + quit() + } + } +} +``` + +## Demo application + +The following demonstrates how to initialize a screen, draw text/graphics and handle user input. + +```go +package main + +import ( + "fmt" + "log" + + "github.com/gdamore/tcell/v2" +) + +func drawText(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, text string) { + row := y1 + col := x1 + for _, r := range []rune(text) { + s.SetContent(col, row, r, nil, style) + col++ + if col >= x2 { + row++ + col = x1 + } + if row > y2 { + break + } + } +} + +func drawBox(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, text string) { + if y2 < y1 { + y1, y2 = y2, y1 + } + if x2 < x1 { + x1, x2 = x2, x1 + } + + // Fill background + for row := y1; row <= y2; row++ { + for col := x1; col <= x2; col++ { + s.SetContent(col, row, ' ', nil, style) + } + } + + // Draw borders + for col := x1; col <= x2; col++ { + s.SetContent(col, y1, tcell.RuneHLine, nil, style) + s.SetContent(col, y2, tcell.RuneHLine, nil, style) + } + for row := y1 + 1; row < y2; row++ { + s.SetContent(x1, row, tcell.RuneVLine, nil, style) + s.SetContent(x2, row, tcell.RuneVLine, nil, style) + } + + // Only draw corners if necessary + if y1 != y2 && x1 != x2 { + s.SetContent(x1, y1, tcell.RuneULCorner, nil, style) + s.SetContent(x2, y1, tcell.RuneURCorner, nil, style) + s.SetContent(x1, y2, tcell.RuneLLCorner, nil, style) + s.SetContent(x2, y2, tcell.RuneLRCorner, nil, style) + } + + drawText(s, x1+1, y1+1, x2-1, y2-1, style, text) +} + +func main() { + defStyle := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset) + boxStyle := tcell.StyleDefault.Foreground(tcell.ColorWhite).Background(tcell.ColorPurple) + + // Initialize screen + s, err := tcell.NewScreen() + if err != nil { + log.Fatalf("%+v", err) + } + if err := s.Init(); err != nil { + log.Fatalf("%+v", err) + } + s.SetStyle(defStyle) + s.EnableMouse() + s.EnablePaste() + s.Clear() + + // Draw initial boxes + drawBox(s, 1, 1, 42, 7, boxStyle, "Click and drag to draw a box") + drawBox(s, 5, 9, 32, 14, boxStyle, "Press C to reset") + + quit := func() { + // You have to catch panics in a defer, clean up, and + // re-raise them - otherwise your application can + // die without leaving any diagnostic trace. + maybePanic := recover() + s.Fini() + if maybePanic != nil { + panic(maybePanic) + } + } + defer quit() + + // Here's how to get the screen size when you need it. + // xmax, ymax := s.Size() + + // Here's an example of how to inject a keystroke where it will + // be picked up by the next PollEvent call. Note that the + // queue is LIFO, it has a limited length, and PostEvent() can + // return an error. + // s.PostEvent(tcell.NewEventKey(tcell.KeyRune, rune('a'), 0)) + + // Event loop + ox, oy := -1, -1 + for { + // Update screen + s.Show() + + // Poll event + ev := s.PollEvent() + + // Process event + switch ev := ev.(type) { + case *tcell.EventResize: + s.Sync() + case *tcell.EventKey: + if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC { + return + } else if ev.Key() == tcell.KeyCtrlL { + s.Sync() + } else if ev.Rune() == 'C' || ev.Rune() == 'c' { + s.Clear() + } + case *tcell.EventMouse: + x, y := ev.Position() + + switch ev.Buttons() { + case tcell.Button1, tcell.Button2: + if ox < 0 { + ox, oy = x, y // record location when click started + } + + case tcell.ButtonNone: + if ox >= 0 { + label := fmt.Sprintf("%d,%d to %d,%d", ox, oy, x, y) + drawBox(s, ox, oy, x, y, boxStyle, label) + ox, oy = -1, -1 + } + } + } + } +} +``` + diff --git a/vendor/github.com/gdamore/tcell/v2/UKRAINE.md b/vendor/github.com/gdamore/tcell/v2/UKRAINE.md new file mode 100644 index 00000000..d86d3e12 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/UKRAINE.md @@ -0,0 +1,77 @@ +# Ukraine, Russia, and a World Tragedy + +## A message to those inside Russia + +### Written March 4, 2022. + +It is with a very heavy heart that I write this. I am normally opposed to the use of open source +projects to communicate political positions or advocate for things outside the immediate relevancy +to that project. + +However, the events occurring in Ukraine, and specifically the unprecedented invasion of Ukraine by +Russian forces operating under orders from Russian President Vladimir Putin compel me to speak out. + +Those who know me, know that I have family, friends, and colleagues in Russia, and Ukraine both. My closest friends +have historically been Russian friends my wife's hometown of Chelyabinsk. I myself have in the past +frequently traveled to Russia, and indeed operated a software development firm with offices in St. Petersburg. +I had a special kinship with Russia and its people. + +I say "had", because I fear that the actions of Putin, and the massive disinformation campaign that his regime +has waged inside Russia, mean that it's likely that I won't see those friends again. At present, I'm not sure +my wife will see her own mother again. We no longer feel it's safe for either of us to return Russia given +actions taken by the regime to crack down on those who express disagreement. + +Russian citizens are being led to believe it is acting purely defensively, and that only legitimate military +targets are being targeted, and that all the information we have received in the West are fakes. + +I am confident that nothing could be further from the truth. + +This has caused many in Russia, including people whom I respect and believe to be smarter than this, to +stand by Putin, and endorse his actions. The claim is that the entirety of NATO is operating at the behest +of the USA, and that the entirety of Europe was poised to attack Russia. While this is clearly absurd to those +of us with any understanding of western politics, Russian citizens are being fed this lie, and believing it. + +If you're reading this from inside Russia -- YOU are the person that I hope this message reaches. Your +government is LYING to you. Of course, all governments lie all the time. But consider this. Almost the +entire world has condemned the invasion of Ukraine as criminal, and has applied sanctions. Even countries +which have poor relations with the US sanctioning Russia, as well as nations which historically have remained +neutral. (Famously neutral -- even during World War II, Switzerland has acted to apply sanctions in +concert with the rest of the world.) + +Ask yourself, why does Putin fear a free press so much, if what he says is true? Why the crack-downs on +children expressing only a desire for peace with Ukraine? Why would the entire world unified against him, +if Putin was in the right? Why would the only countries that stood with Russia against +the UN resolution to condemn these acts as crimes be Belarus, North Korea, and Syria? Even countries normally +allied to Russia could not bring themselves to do more than abstain from the vote to condemn it. + +To be clear, I do not claim that the actions taken by the West or by the Ukrainian government were completely +blameless. On the contrary, I understand that Western media is biased, and the truth is rarely exactly +as reported. I believe that there is a kernel of truth in the claims of fascists and ultra-nationalist +militias operating in Ukraine and specifically Donbas. However, I am also equally certain that Putin's +response is out of proportion, and that concerns about such militias are principally just a pretext to justify +an invasion. + +Europe is at war, unlike we've seen in my lifetime. The world is more divided, and closer to nuclear holocaust +than it has been since the Cold War. And that is 100% the fault of Putin. + +While Putin remains in power, there cannot really be any way for Russian international relations to return +to normal. Putin has set your country on a path to return to the Cold War, likely because he fancies himself +to be a new Stalin. However, unlike the Soviet Union, the Russian economy does not have the wherewithal to +stand on its own, and the invasion of Ukraine has fully ensured that Russia will not find any friends anywhere +else in Europe, and probably few places in Asia. + +The *only* paths forward for Russia are either a Russia without Putin (and those who would support his agenda), +or a complete breakdown of Russian prosperity, likely followed by the increasing international conflict that will +be the natural escalation from a country that is isolated and impoverished. Those of us observing from the West are +gravely concerned, because we cannot see any end to this madness that does not result in nuclear conflict, +unless from within. + +In the meantime, the worst prices will be paid for by innocents in Ukraine, and by young Russian mean +forced to carry out the orders of Putin's corrupt regime. + +And *that* is why I write this -- to appeal to those within Russia to open your eyes, and think with +your minds. It is right and proper to be proud of your country and its rich heritage. But it is also +right and proper to look for ways to save it from the ruinous path that its current leadership has set it upon, +and to recognize when that leadership is no longer acting in interest of the country or its people. + + - Garrett D'Amore, March 4, 2022 \ No newline at end of file diff --git a/vendor/github.com/gdamore/tcell/v2/attr.go b/vendor/github.com/gdamore/tcell/v2/attr.go new file mode 100644 index 00000000..05af5e5d --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/attr.go @@ -0,0 +1,34 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +// AttrMask represents a mask of text attributes, apart from color. +// Note that support for attributes may vary widely across terminals. +type AttrMask uint + +// Attributes are not colors, but affect the display of text. They can +// be combined, in some cases, but not others. (E.g. you can have Dim Italic, +// but only CurlyUnderline cannot be mixed with DottedUnderline.) +const ( + AttrBold AttrMask = 1 << iota + AttrBlink + AttrReverse + AttrUnderline // Deprecated: Use UnderlineStyle + AttrDim + AttrItalic + AttrStrikeThrough + AttrInvalid AttrMask = 1 << 31 // Mark the style or attributes invalid + AttrNone AttrMask = 0 // Just normal text. +) diff --git a/vendor/github.com/gdamore/tcell/v2/cell.go b/vendor/github.com/gdamore/tcell/v2/cell.go new file mode 100644 index 00000000..43faedb3 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/cell.go @@ -0,0 +1,249 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "os" + "reflect" + + runewidth "github.com/mattn/go-runewidth" +) + +type cell struct { + currMain rune + currComb []rune + currStyle Style + lastMain rune + lastStyle Style + lastComb []rune + width int + lock bool +} + +// CellBuffer represents a two-dimensional array of character cells. +// This is primarily intended for use by Screen implementors; it +// contains much of the common code they need. To create one, just +// declare a variable of its type; no explicit initialization is necessary. +// +// CellBuffer is not thread safe. +type CellBuffer struct { + w int + h int + cells []cell +} + +// SetContent sets the contents (primary rune, combining runes, +// and style) for a cell at a given location. If the background or +// foreground of the style is set to ColorNone, then the respective +// color is left un changed. +func (cb *CellBuffer) SetContent(x int, y int, + mainc rune, combc []rune, style Style, +) { + if x >= 0 && y >= 0 && x < cb.w && y < cb.h { + c := &cb.cells[(y*cb.w)+x] + + // Wide characters: we want to mark the "wide" cells + // dirty as well as the base cell, to make sure we consider + // both cells as dirty together. We only need to do this + // if we're changing content + if (c.width > 0) && (mainc != c.currMain || len(combc) != len(c.currComb) || (len(combc) > 0 && !reflect.DeepEqual(combc, c.currComb))) { + for i := 0; i < c.width; i++ { + cb.SetDirty(x+i, y, true) + } + } + + c.currComb = append([]rune{}, combc...) + + if c.currMain != mainc { + c.width = runewidth.RuneWidth(mainc) + } + c.currMain = mainc + if style.fg == ColorNone { + style.fg = c.currStyle.fg + } + if style.bg == ColorNone { + style.bg = c.currStyle.bg + } + c.currStyle = style + } +} + +// GetContent returns the contents of a character cell, including the +// primary rune, any combining character runes (which will usually be +// nil), the style, and the display width in cells. (The width can be +// either 1, normally, or 2 for East Asian full-width characters.) +func (cb *CellBuffer) GetContent(x, y int) (rune, []rune, Style, int) { + var mainc rune + var combc []rune + var style Style + var width int + if x >= 0 && y >= 0 && x < cb.w && y < cb.h { + c := &cb.cells[(y*cb.w)+x] + mainc, combc, style = c.currMain, c.currComb, c.currStyle + if width = c.width; width == 0 || mainc < ' ' { + width = 1 + mainc = ' ' + } + } + return mainc, combc, style, width +} + +// Size returns the (width, height) in cells of the buffer. +func (cb *CellBuffer) Size() (int, int) { + return cb.w, cb.h +} + +// Invalidate marks all characters within the buffer as dirty. +func (cb *CellBuffer) Invalidate() { + for i := range cb.cells { + cb.cells[i].lastMain = rune(0) + } +} + +// Dirty checks if a character at the given location needs to be +// refreshed on the physical display. This returns true if the cell +// content is different since the last time it was marked clean. +func (cb *CellBuffer) Dirty(x, y int) bool { + if x >= 0 && y >= 0 && x < cb.w && y < cb.h { + c := &cb.cells[(y*cb.w)+x] + if c.lock { + return false + } + if c.lastMain == rune(0) { + return true + } + if c.lastMain != c.currMain { + return true + } + if c.lastStyle != c.currStyle { + return true + } + if len(c.lastComb) != len(c.currComb) { + return true + } + for i := range c.lastComb { + if c.lastComb[i] != c.currComb[i] { + return true + } + } + } + return false +} + +// SetDirty is normally used to indicate that a cell has +// been displayed (in which case dirty is false), or to manually +// force a cell to be marked dirty. +func (cb *CellBuffer) SetDirty(x, y int, dirty bool) { + if x >= 0 && y >= 0 && x < cb.w && y < cb.h { + c := &cb.cells[(y*cb.w)+x] + if dirty { + c.lastMain = rune(0) + } else { + if c.currMain == rune(0) { + c.currMain = ' ' + } + c.lastMain = c.currMain + c.lastComb = c.currComb + c.lastStyle = c.currStyle + } + } +} + +// LockCell locks a cell from being drawn, effectively marking it "clean" until +// the lock is removed. This can be used to prevent tcell from drawing a given +// cell, even if the underlying content has changed. For example, when drawing a +// sixel graphic directly to a TTY screen an implementer must lock the region +// underneath the graphic to prevent tcell from drawing on top of the graphic. +func (cb *CellBuffer) LockCell(x, y int) { + if x < 0 || y < 0 { + return + } + if x >= cb.w || y >= cb.h { + return + } + c := &cb.cells[(y*cb.w)+x] + c.lock = true +} + +// UnlockCell removes a lock from the cell and marks it as dirty +func (cb *CellBuffer) UnlockCell(x, y int) { + if x < 0 || y < 0 { + return + } + if x >= cb.w || y >= cb.h { + return + } + c := &cb.cells[(y*cb.w)+x] + c.lock = false + cb.SetDirty(x, y, true) +} + +// Resize is used to resize the cells array, with different dimensions, +// while preserving the original contents. The cells will be invalidated +// so that they can be redrawn. +func (cb *CellBuffer) Resize(w, h int) { + if cb.h == h && cb.w == w { + return + } + + newc := make([]cell, w*h) + for y := 0; y < h && y < cb.h; y++ { + for x := 0; x < w && x < cb.w; x++ { + oc := &cb.cells[(y*cb.w)+x] + nc := &newc[(y*w)+x] + nc.currMain = oc.currMain + nc.currComb = oc.currComb + nc.currStyle = oc.currStyle + nc.width = oc.width + nc.lastMain = rune(0) + } + } + cb.cells = newc + cb.h = h + cb.w = w +} + +// Fill fills the entire cell buffer array with the specified character +// and style. Normally choose ' ' to clear the screen. This API doesn't +// support combining characters, or characters with a width larger than one. +// If either the foreground or background are ColorNone, then the respective +// color is unchanged. +func (cb *CellBuffer) Fill(r rune, style Style) { + for i := range cb.cells { + c := &cb.cells[i] + c.currMain = r + c.currComb = nil + cs := style + if cs.fg == ColorNone { + cs.fg = c.currStyle.fg + } + if cs.bg == ColorNone { + cs.bg = c.currStyle.bg + } + c.currStyle = cs + c.width = 1 + } +} + +var runeConfig *runewidth.Condition + +func init() { + // The defaults for the runewidth package are poorly chosen for terminal + // applications. We however will honor the setting in the environment if + // it is set. + if os.Getenv("RUNEWIDTH_EASTASIAN") == "" { + runewidth.DefaultCondition.EastAsianWidth = false + } +} diff --git a/vendor/github.com/gdamore/tcell/v2/charset_plan9.go b/vendor/github.com/gdamore/tcell/v2/charset_plan9.go new file mode 100644 index 00000000..959d181e --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/charset_plan9.go @@ -0,0 +1,23 @@ +//go:build plan9 +// +build plan9 + +// Copyright 2025 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +// Plan 9 uses UTF-8 system-wide, so we return "UTF-8" unconditionally. +func getCharset() string { + return "UTF-8" +} diff --git a/vendor/github.com/gdamore/tcell/v2/charset_stub.go b/vendor/github.com/gdamore/tcell/v2/charset_stub.go new file mode 100644 index 00000000..829be2c2 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/charset_stub.go @@ -0,0 +1,22 @@ +//go:build nacl +// +build nacl + +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +func getCharset() string { + return "" +} diff --git a/vendor/github.com/gdamore/tcell/v2/charset_unix.go b/vendor/github.com/gdamore/tcell/v2/charset_unix.go new file mode 100644 index 00000000..8bbf1f5e --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/charset_unix.go @@ -0,0 +1,50 @@ +//go:build !windows && !nacl && !plan9 +// +build !windows,!nacl,!plan9 + +// Copyright 2016 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "os" + "strings" +) + +func getCharset() string { + // Determine the character set. This can help us later. + // Per POSIX, we search for LC_ALL first, then LC_CTYPE, and + // finally LANG. First one set wins. + locale := "" + if locale = os.Getenv("LC_ALL"); locale == "" { + if locale = os.Getenv("LC_CTYPE"); locale == "" { + locale = os.Getenv("LANG") + } + } + if locale == "POSIX" || locale == "C" { + return "US-ASCII" + } + if i := strings.IndexRune(locale, '@'); i >= 0 { + locale = locale[:i] + } + if i := strings.IndexRune(locale, '.'); i >= 0 { + locale = locale[i+1:] + } else { + // Default assumption, and on Linux we can see LC_ALL + // without a character set, which we assume implies UTF-8. + return "UTF-8" + } + // XXX: add support for aliases + return locale +} diff --git a/vendor/github.com/gdamore/tcell/v2/charset_windows.go b/vendor/github.com/gdamore/tcell/v2/charset_windows.go new file mode 100644 index 00000000..08068a02 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/charset_windows.go @@ -0,0 +1,22 @@ +//go:build windows +// +build windows + +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +func getCharset() string { + return "UTF-16" +} diff --git a/vendor/github.com/gdamore/tcell/v2/color.go b/vendor/github.com/gdamore/tcell/v2/color.go new file mode 100644 index 00000000..904848ea --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/color.go @@ -0,0 +1,1128 @@ +// Copyright 2023 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "fmt" + ic "image/color" + "strconv" +) + +// Color represents a color. The low numeric values are the same as used +// by ECMA-48, and beyond that XTerm. A 24-bit RGB value may be used by +// adding in the ColorIsRGB flag. For Color names we use the W3C approved +// color names. +// +// We use a 64-bit integer to allow future expansion if we want to add an +// 8-bit alpha, while still leaving us some room for extra options. +// +// Note that on various terminals colors may be approximated however, or +// not supported at all. If no suitable representation for a color is known, +// the library will simply not set any color, deferring to whatever default +// attributes the terminal uses. +type Color uint64 + +const ( + // ColorDefault is used to leave the Color unchanged from whatever + // system or terminal default may exist. It's also the zero value. + ColorDefault Color = 0 + + // ColorValid is used to indicate the color value is actually + // valid (initialized). This is useful to permit the zero value + // to be treated as the default. + ColorValid Color = 1 << 32 + + // ColorIsRGB is used to indicate that the numeric value is not + // a known color constant, but rather an RGB value. The lower + // order 3 bytes are RGB. + ColorIsRGB Color = 1 << 33 + + // ColorSpecial is a flag used to indicate that the values have + // special meaning, and live outside of the color space(s). + ColorSpecial Color = 1 << 34 +) + +// Note that the order of these options is important -- it follows the +// definitions used by ECMA and XTerm. Hence any further named colors +// must begin at a value not less than 256. +const ( + ColorBlack = ColorValid + iota + ColorMaroon + ColorGreen + ColorOlive + ColorNavy + ColorPurple + ColorTeal + ColorSilver + ColorGray + ColorRed + ColorLime + ColorYellow + ColorBlue + ColorFuchsia + ColorAqua + ColorWhite + Color16 + Color17 + Color18 + Color19 + Color20 + Color21 + Color22 + Color23 + Color24 + Color25 + Color26 + Color27 + Color28 + Color29 + Color30 + Color31 + Color32 + Color33 + Color34 + Color35 + Color36 + Color37 + Color38 + Color39 + Color40 + Color41 + Color42 + Color43 + Color44 + Color45 + Color46 + Color47 + Color48 + Color49 + Color50 + Color51 + Color52 + Color53 + Color54 + Color55 + Color56 + Color57 + Color58 + Color59 + Color60 + Color61 + Color62 + Color63 + Color64 + Color65 + Color66 + Color67 + Color68 + Color69 + Color70 + Color71 + Color72 + Color73 + Color74 + Color75 + Color76 + Color77 + Color78 + Color79 + Color80 + Color81 + Color82 + Color83 + Color84 + Color85 + Color86 + Color87 + Color88 + Color89 + Color90 + Color91 + Color92 + Color93 + Color94 + Color95 + Color96 + Color97 + Color98 + Color99 + Color100 + Color101 + Color102 + Color103 + Color104 + Color105 + Color106 + Color107 + Color108 + Color109 + Color110 + Color111 + Color112 + Color113 + Color114 + Color115 + Color116 + Color117 + Color118 + Color119 + Color120 + Color121 + Color122 + Color123 + Color124 + Color125 + Color126 + Color127 + Color128 + Color129 + Color130 + Color131 + Color132 + Color133 + Color134 + Color135 + Color136 + Color137 + Color138 + Color139 + Color140 + Color141 + Color142 + Color143 + Color144 + Color145 + Color146 + Color147 + Color148 + Color149 + Color150 + Color151 + Color152 + Color153 + Color154 + Color155 + Color156 + Color157 + Color158 + Color159 + Color160 + Color161 + Color162 + Color163 + Color164 + Color165 + Color166 + Color167 + Color168 + Color169 + Color170 + Color171 + Color172 + Color173 + Color174 + Color175 + Color176 + Color177 + Color178 + Color179 + Color180 + Color181 + Color182 + Color183 + Color184 + Color185 + Color186 + Color187 + Color188 + Color189 + Color190 + Color191 + Color192 + Color193 + Color194 + Color195 + Color196 + Color197 + Color198 + Color199 + Color200 + Color201 + Color202 + Color203 + Color204 + Color205 + Color206 + Color207 + Color208 + Color209 + Color210 + Color211 + Color212 + Color213 + Color214 + Color215 + Color216 + Color217 + Color218 + Color219 + Color220 + Color221 + Color222 + Color223 + Color224 + Color225 + Color226 + Color227 + Color228 + Color229 + Color230 + Color231 + Color232 + Color233 + Color234 + Color235 + Color236 + Color237 + Color238 + Color239 + Color240 + Color241 + Color242 + Color243 + Color244 + Color245 + Color246 + Color247 + Color248 + Color249 + Color250 + Color251 + Color252 + Color253 + Color254 + Color255 + ColorAliceBlue = ColorIsRGB | ColorValid | 0xF0F8FF + ColorAntiqueWhite = ColorIsRGB | ColorValid | 0xFAEBD7 + ColorAquaMarine = ColorIsRGB | ColorValid | 0x7FFFD4 + ColorAzure = ColorIsRGB | ColorValid | 0xF0FFFF + ColorBeige = ColorIsRGB | ColorValid | 0xF5F5DC + ColorBisque = ColorIsRGB | ColorValid | 0xFFE4C4 + ColorBlanchedAlmond = ColorIsRGB | ColorValid | 0xFFEBCD + ColorBlueViolet = ColorIsRGB | ColorValid | 0x8A2BE2 + ColorBrown = ColorIsRGB | ColorValid | 0xA52A2A + ColorBurlyWood = ColorIsRGB | ColorValid | 0xDEB887 + ColorCadetBlue = ColorIsRGB | ColorValid | 0x5F9EA0 + ColorChartreuse = ColorIsRGB | ColorValid | 0x7FFF00 + ColorChocolate = ColorIsRGB | ColorValid | 0xD2691E + ColorCoral = ColorIsRGB | ColorValid | 0xFF7F50 + ColorCornflowerBlue = ColorIsRGB | ColorValid | 0x6495ED + ColorCornsilk = ColorIsRGB | ColorValid | 0xFFF8DC + ColorCrimson = ColorIsRGB | ColorValid | 0xDC143C + ColorDarkBlue = ColorIsRGB | ColorValid | 0x00008B + ColorDarkCyan = ColorIsRGB | ColorValid | 0x008B8B + ColorDarkGoldenrod = ColorIsRGB | ColorValid | 0xB8860B + ColorDarkGray = ColorIsRGB | ColorValid | 0xA9A9A9 + ColorDarkGreen = ColorIsRGB | ColorValid | 0x006400 + ColorDarkKhaki = ColorIsRGB | ColorValid | 0xBDB76B + ColorDarkMagenta = ColorIsRGB | ColorValid | 0x8B008B + ColorDarkOliveGreen = ColorIsRGB | ColorValid | 0x556B2F + ColorDarkOrange = ColorIsRGB | ColorValid | 0xFF8C00 + ColorDarkOrchid = ColorIsRGB | ColorValid | 0x9932CC + ColorDarkRed = ColorIsRGB | ColorValid | 0x8B0000 + ColorDarkSalmon = ColorIsRGB | ColorValid | 0xE9967A + ColorDarkSeaGreen = ColorIsRGB | ColorValid | 0x8FBC8F + ColorDarkSlateBlue = ColorIsRGB | ColorValid | 0x483D8B + ColorDarkSlateGray = ColorIsRGB | ColorValid | 0x2F4F4F + ColorDarkTurquoise = ColorIsRGB | ColorValid | 0x00CED1 + ColorDarkViolet = ColorIsRGB | ColorValid | 0x9400D3 + ColorDeepPink = ColorIsRGB | ColorValid | 0xFF1493 + ColorDeepSkyBlue = ColorIsRGB | ColorValid | 0x00BFFF + ColorDimGray = ColorIsRGB | ColorValid | 0x696969 + ColorDodgerBlue = ColorIsRGB | ColorValid | 0x1E90FF + ColorFireBrick = ColorIsRGB | ColorValid | 0xB22222 + ColorFloralWhite = ColorIsRGB | ColorValid | 0xFFFAF0 + ColorForestGreen = ColorIsRGB | ColorValid | 0x228B22 + ColorGainsboro = ColorIsRGB | ColorValid | 0xDCDCDC + ColorGhostWhite = ColorIsRGB | ColorValid | 0xF8F8FF + ColorGold = ColorIsRGB | ColorValid | 0xFFD700 + ColorGoldenrod = ColorIsRGB | ColorValid | 0xDAA520 + ColorGreenYellow = ColorIsRGB | ColorValid | 0xADFF2F + ColorHoneydew = ColorIsRGB | ColorValid | 0xF0FFF0 + ColorHotPink = ColorIsRGB | ColorValid | 0xFF69B4 + ColorIndianRed = ColorIsRGB | ColorValid | 0xCD5C5C + ColorIndigo = ColorIsRGB | ColorValid | 0x4B0082 + ColorIvory = ColorIsRGB | ColorValid | 0xFFFFF0 + ColorKhaki = ColorIsRGB | ColorValid | 0xF0E68C + ColorLavender = ColorIsRGB | ColorValid | 0xE6E6FA + ColorLavenderBlush = ColorIsRGB | ColorValid | 0xFFF0F5 + ColorLawnGreen = ColorIsRGB | ColorValid | 0x7CFC00 + ColorLemonChiffon = ColorIsRGB | ColorValid | 0xFFFACD + ColorLightBlue = ColorIsRGB | ColorValid | 0xADD8E6 + ColorLightCoral = ColorIsRGB | ColorValid | 0xF08080 + ColorLightCyan = ColorIsRGB | ColorValid | 0xE0FFFF + ColorLightGoldenrodYellow = ColorIsRGB | ColorValid | 0xFAFAD2 + ColorLightGray = ColorIsRGB | ColorValid | 0xD3D3D3 + ColorLightGreen = ColorIsRGB | ColorValid | 0x90EE90 + ColorLightPink = ColorIsRGB | ColorValid | 0xFFB6C1 + ColorLightSalmon = ColorIsRGB | ColorValid | 0xFFA07A + ColorLightSeaGreen = ColorIsRGB | ColorValid | 0x20B2AA + ColorLightSkyBlue = ColorIsRGB | ColorValid | 0x87CEFA + ColorLightSlateGray = ColorIsRGB | ColorValid | 0x778899 + ColorLightSteelBlue = ColorIsRGB | ColorValid | 0xB0C4DE + ColorLightYellow = ColorIsRGB | ColorValid | 0xFFFFE0 + ColorLimeGreen = ColorIsRGB | ColorValid | 0x32CD32 + ColorLinen = ColorIsRGB | ColorValid | 0xFAF0E6 + ColorMediumAquamarine = ColorIsRGB | ColorValid | 0x66CDAA + ColorMediumBlue = ColorIsRGB | ColorValid | 0x0000CD + ColorMediumOrchid = ColorIsRGB | ColorValid | 0xBA55D3 + ColorMediumPurple = ColorIsRGB | ColorValid | 0x9370DB + ColorMediumSeaGreen = ColorIsRGB | ColorValid | 0x3CB371 + ColorMediumSlateBlue = ColorIsRGB | ColorValid | 0x7B68EE + ColorMediumSpringGreen = ColorIsRGB | ColorValid | 0x00FA9A + ColorMediumTurquoise = ColorIsRGB | ColorValid | 0x48D1CC + ColorMediumVioletRed = ColorIsRGB | ColorValid | 0xC71585 + ColorMidnightBlue = ColorIsRGB | ColorValid | 0x191970 + ColorMintCream = ColorIsRGB | ColorValid | 0xF5FFFA + ColorMistyRose = ColorIsRGB | ColorValid | 0xFFE4E1 + ColorMoccasin = ColorIsRGB | ColorValid | 0xFFE4B5 + ColorNavajoWhite = ColorIsRGB | ColorValid | 0xFFDEAD + ColorOldLace = ColorIsRGB | ColorValid | 0xFDF5E6 + ColorOliveDrab = ColorIsRGB | ColorValid | 0x6B8E23 + ColorOrange = ColorIsRGB | ColorValid | 0xFFA500 + ColorOrangeRed = ColorIsRGB | ColorValid | 0xFF4500 + ColorOrchid = ColorIsRGB | ColorValid | 0xDA70D6 + ColorPaleGoldenrod = ColorIsRGB | ColorValid | 0xEEE8AA + ColorPaleGreen = ColorIsRGB | ColorValid | 0x98FB98 + ColorPaleTurquoise = ColorIsRGB | ColorValid | 0xAFEEEE + ColorPaleVioletRed = ColorIsRGB | ColorValid | 0xDB7093 + ColorPapayaWhip = ColorIsRGB | ColorValid | 0xFFEFD5 + ColorPeachPuff = ColorIsRGB | ColorValid | 0xFFDAB9 + ColorPeru = ColorIsRGB | ColorValid | 0xCD853F + ColorPink = ColorIsRGB | ColorValid | 0xFFC0CB + ColorPlum = ColorIsRGB | ColorValid | 0xDDA0DD + ColorPowderBlue = ColorIsRGB | ColorValid | 0xB0E0E6 + ColorRebeccaPurple = ColorIsRGB | ColorValid | 0x663399 + ColorRosyBrown = ColorIsRGB | ColorValid | 0xBC8F8F + ColorRoyalBlue = ColorIsRGB | ColorValid | 0x4169E1 + ColorSaddleBrown = ColorIsRGB | ColorValid | 0x8B4513 + ColorSalmon = ColorIsRGB | ColorValid | 0xFA8072 + ColorSandyBrown = ColorIsRGB | ColorValid | 0xF4A460 + ColorSeaGreen = ColorIsRGB | ColorValid | 0x2E8B57 + ColorSeashell = ColorIsRGB | ColorValid | 0xFFF5EE + ColorSienna = ColorIsRGB | ColorValid | 0xA0522D + ColorSkyblue = ColorIsRGB | ColorValid | 0x87CEEB + ColorSlateBlue = ColorIsRGB | ColorValid | 0x6A5ACD + ColorSlateGray = ColorIsRGB | ColorValid | 0x708090 + ColorSnow = ColorIsRGB | ColorValid | 0xFFFAFA + ColorSpringGreen = ColorIsRGB | ColorValid | 0x00FF7F + ColorSteelBlue = ColorIsRGB | ColorValid | 0x4682B4 + ColorTan = ColorIsRGB | ColorValid | 0xD2B48C + ColorThistle = ColorIsRGB | ColorValid | 0xD8BFD8 + ColorTomato = ColorIsRGB | ColorValid | 0xFF6347 + ColorTurquoise = ColorIsRGB | ColorValid | 0x40E0D0 + ColorViolet = ColorIsRGB | ColorValid | 0xEE82EE + ColorWheat = ColorIsRGB | ColorValid | 0xF5DEB3 + ColorWhiteSmoke = ColorIsRGB | ColorValid | 0xF5F5F5 + ColorYellowGreen = ColorIsRGB | ColorValid | 0x9ACD32 +) + +// These are aliases for the color gray, because some of us spell +// it as grey. +const ( + ColorGrey = ColorGray + ColorDimGrey = ColorDimGray + ColorDarkGrey = ColorDarkGray + ColorDarkSlateGrey = ColorDarkSlateGray + ColorLightGrey = ColorLightGray + ColorLightSlateGrey = ColorLightSlateGray + ColorSlateGrey = ColorSlateGray +) + +// ColorValues maps color constants to their RGB values. +var ColorValues = map[Color]int32{ + ColorBlack: 0x000000, + ColorMaroon: 0x800000, + ColorGreen: 0x008000, + ColorOlive: 0x808000, + ColorNavy: 0x000080, + ColorPurple: 0x800080, + ColorTeal: 0x008080, + ColorSilver: 0xC0C0C0, + ColorGray: 0x808080, + ColorRed: 0xFF0000, + ColorLime: 0x00FF00, + ColorYellow: 0xFFFF00, + ColorBlue: 0x0000FF, + ColorFuchsia: 0xFF00FF, + ColorAqua: 0x00FFFF, + ColorWhite: 0xFFFFFF, + Color16: 0x000000, // black + Color17: 0x00005F, + Color18: 0x000087, + Color19: 0x0000AF, + Color20: 0x0000D7, + Color21: 0x0000FF, // blue + Color22: 0x005F00, + Color23: 0x005F5F, + Color24: 0x005F87, + Color25: 0x005FAF, + Color26: 0x005FD7, + Color27: 0x005FFF, + Color28: 0x008700, + Color29: 0x00875F, + Color30: 0x008787, + Color31: 0x0087Af, + Color32: 0x0087D7, + Color33: 0x0087FF, + Color34: 0x00AF00, + Color35: 0x00AF5F, + Color36: 0x00AF87, + Color37: 0x00AFAF, + Color38: 0x00AFD7, + Color39: 0x00AFFF, + Color40: 0x00D700, + Color41: 0x00D75F, + Color42: 0x00D787, + Color43: 0x00D7AF, + Color44: 0x00D7D7, + Color45: 0x00D7FF, + Color46: 0x00FF00, // lime + Color47: 0x00FF5F, + Color48: 0x00FF87, + Color49: 0x00FFAF, + Color50: 0x00FFd7, + Color51: 0x00FFFF, // aqua + Color52: 0x5F0000, + Color53: 0x5F005F, + Color54: 0x5F0087, + Color55: 0x5F00AF, + Color56: 0x5F00D7, + Color57: 0x5F00FF, + Color58: 0x5F5F00, + Color59: 0x5F5F5F, + Color60: 0x5F5F87, + Color61: 0x5F5FAF, + Color62: 0x5F5FD7, + Color63: 0x5F5FFF, + Color64: 0x5F8700, + Color65: 0x5F875F, + Color66: 0x5F8787, + Color67: 0x5F87AF, + Color68: 0x5F87D7, + Color69: 0x5F87FF, + Color70: 0x5FAF00, + Color71: 0x5FAF5F, + Color72: 0x5FAF87, + Color73: 0x5FAFAF, + Color74: 0x5FAFD7, + Color75: 0x5FAFFF, + Color76: 0x5FD700, + Color77: 0x5FD75F, + Color78: 0x5FD787, + Color79: 0x5FD7AF, + Color80: 0x5FD7D7, + Color81: 0x5FD7FF, + Color82: 0x5FFF00, + Color83: 0x5FFF5F, + Color84: 0x5FFF87, + Color85: 0x5FFFAF, + Color86: 0x5FFFD7, + Color87: 0x5FFFFF, + Color88: 0x870000, + Color89: 0x87005F, + Color90: 0x870087, + Color91: 0x8700AF, + Color92: 0x8700D7, + Color93: 0x8700FF, + Color94: 0x875F00, + Color95: 0x875F5F, + Color96: 0x875F87, + Color97: 0x875FAF, + Color98: 0x875FD7, + Color99: 0x875FFF, + Color100: 0x878700, + Color101: 0x87875F, + Color102: 0x878787, + Color103: 0x8787AF, + Color104: 0x8787D7, + Color105: 0x8787FF, + Color106: 0x87AF00, + Color107: 0x87AF5F, + Color108: 0x87AF87, + Color109: 0x87AFAF, + Color110: 0x87AFD7, + Color111: 0x87AFFF, + Color112: 0x87D700, + Color113: 0x87D75F, + Color114: 0x87D787, + Color115: 0x87D7AF, + Color116: 0x87D7D7, + Color117: 0x87D7FF, + Color118: 0x87FF00, + Color119: 0x87FF5F, + Color120: 0x87FF87, + Color121: 0x87FFAF, + Color122: 0x87FFD7, + Color123: 0x87FFFF, + Color124: 0xAF0000, + Color125: 0xAF005F, + Color126: 0xAF0087, + Color127: 0xAF00AF, + Color128: 0xAF00D7, + Color129: 0xAF00FF, + Color130: 0xAF5F00, + Color131: 0xAF5F5F, + Color132: 0xAF5F87, + Color133: 0xAF5FAF, + Color134: 0xAF5FD7, + Color135: 0xAF5FFF, + Color136: 0xAF8700, + Color137: 0xAF875F, + Color138: 0xAF8787, + Color139: 0xAF87AF, + Color140: 0xAF87D7, + Color141: 0xAF87FF, + Color142: 0xAFAF00, + Color143: 0xAFAF5F, + Color144: 0xAFAF87, + Color145: 0xAFAFAF, + Color146: 0xAFAFD7, + Color147: 0xAFAFFF, + Color148: 0xAFD700, + Color149: 0xAFD75F, + Color150: 0xAFD787, + Color151: 0xAFD7AF, + Color152: 0xAFD7D7, + Color153: 0xAFD7FF, + Color154: 0xAFFF00, + Color155: 0xAFFF5F, + Color156: 0xAFFF87, + Color157: 0xAFFFAF, + Color158: 0xAFFFD7, + Color159: 0xAFFFFF, + Color160: 0xD70000, + Color161: 0xD7005F, + Color162: 0xD70087, + Color163: 0xD700AF, + Color164: 0xD700D7, + Color165: 0xD700FF, + Color166: 0xD75F00, + Color167: 0xD75F5F, + Color168: 0xD75F87, + Color169: 0xD75FAF, + Color170: 0xD75FD7, + Color171: 0xD75FFF, + Color172: 0xD78700, + Color173: 0xD7875F, + Color174: 0xD78787, + Color175: 0xD787AF, + Color176: 0xD787D7, + Color177: 0xD787FF, + Color178: 0xD7AF00, + Color179: 0xD7AF5F, + Color180: 0xD7AF87, + Color181: 0xD7AFAF, + Color182: 0xD7AFD7, + Color183: 0xD7AFFF, + Color184: 0xD7D700, + Color185: 0xD7D75F, + Color186: 0xD7D787, + Color187: 0xD7D7AF, + Color188: 0xD7D7D7, + Color189: 0xD7D7FF, + Color190: 0xD7FF00, + Color191: 0xD7FF5F, + Color192: 0xD7FF87, + Color193: 0xD7FFAF, + Color194: 0xD7FFD7, + Color195: 0xD7FFFF, + Color196: 0xFF0000, // red + Color197: 0xFF005F, + Color198: 0xFF0087, + Color199: 0xFF00AF, + Color200: 0xFF00D7, + Color201: 0xFF00FF, // fuchsia + Color202: 0xFF5F00, + Color203: 0xFF5F5F, + Color204: 0xFF5F87, + Color205: 0xFF5FAF, + Color206: 0xFF5FD7, + Color207: 0xFF5FFF, + Color208: 0xFF8700, + Color209: 0xFF875F, + Color210: 0xFF8787, + Color211: 0xFF87AF, + Color212: 0xFF87D7, + Color213: 0xFF87FF, + Color214: 0xFFAF00, + Color215: 0xFFAF5F, + Color216: 0xFFAF87, + Color217: 0xFFAFAF, + Color218: 0xFFAFD7, + Color219: 0xFFAFFF, + Color220: 0xFFD700, + Color221: 0xFFD75F, + Color222: 0xFFD787, + Color223: 0xFFD7AF, + Color224: 0xFFD7D7, + Color225: 0xFFD7FF, + Color226: 0xFFFF00, // yellow + Color227: 0xFFFF5F, + Color228: 0xFFFF87, + Color229: 0xFFFFAF, + Color230: 0xFFFFD7, + Color231: 0xFFFFFF, // white + Color232: 0x080808, + Color233: 0x121212, + Color234: 0x1C1C1C, + Color235: 0x262626, + Color236: 0x303030, + Color237: 0x3A3A3A, + Color238: 0x444444, + Color239: 0x4E4E4E, + Color240: 0x585858, + Color241: 0x626262, + Color242: 0x6C6C6C, + Color243: 0x767676, + Color244: 0x808080, // grey + Color245: 0x8A8A8A, + Color246: 0x949494, + Color247: 0x9E9E9E, + Color248: 0xA8A8A8, + Color249: 0xB2B2B2, + Color250: 0xBCBCBC, + Color251: 0xC6C6C6, + Color252: 0xD0D0D0, + Color253: 0xDADADA, + Color254: 0xE4E4E4, + Color255: 0xEEEEEE, + ColorAliceBlue: 0xF0F8FF, + ColorAntiqueWhite: 0xFAEBD7, + ColorAquaMarine: 0x7FFFD4, + ColorAzure: 0xF0FFFF, + ColorBeige: 0xF5F5DC, + ColorBisque: 0xFFE4C4, + ColorBlanchedAlmond: 0xFFEBCD, + ColorBlueViolet: 0x8A2BE2, + ColorBrown: 0xA52A2A, + ColorBurlyWood: 0xDEB887, + ColorCadetBlue: 0x5F9EA0, + ColorChartreuse: 0x7FFF00, + ColorChocolate: 0xD2691E, + ColorCoral: 0xFF7F50, + ColorCornflowerBlue: 0x6495ED, + ColorCornsilk: 0xFFF8DC, + ColorCrimson: 0xDC143C, + ColorDarkBlue: 0x00008B, + ColorDarkCyan: 0x008B8B, + ColorDarkGoldenrod: 0xB8860B, + ColorDarkGray: 0xA9A9A9, + ColorDarkGreen: 0x006400, + ColorDarkKhaki: 0xBDB76B, + ColorDarkMagenta: 0x8B008B, + ColorDarkOliveGreen: 0x556B2F, + ColorDarkOrange: 0xFF8C00, + ColorDarkOrchid: 0x9932CC, + ColorDarkRed: 0x8B0000, + ColorDarkSalmon: 0xE9967A, + ColorDarkSeaGreen: 0x8FBC8F, + ColorDarkSlateBlue: 0x483D8B, + ColorDarkSlateGray: 0x2F4F4F, + ColorDarkTurquoise: 0x00CED1, + ColorDarkViolet: 0x9400D3, + ColorDeepPink: 0xFF1493, + ColorDeepSkyBlue: 0x00BFFF, + ColorDimGray: 0x696969, + ColorDodgerBlue: 0x1E90FF, + ColorFireBrick: 0xB22222, + ColorFloralWhite: 0xFFFAF0, + ColorForestGreen: 0x228B22, + ColorGainsboro: 0xDCDCDC, + ColorGhostWhite: 0xF8F8FF, + ColorGold: 0xFFD700, + ColorGoldenrod: 0xDAA520, + ColorGreenYellow: 0xADFF2F, + ColorHoneydew: 0xF0FFF0, + ColorHotPink: 0xFF69B4, + ColorIndianRed: 0xCD5C5C, + ColorIndigo: 0x4B0082, + ColorIvory: 0xFFFFF0, + ColorKhaki: 0xF0E68C, + ColorLavender: 0xE6E6FA, + ColorLavenderBlush: 0xFFF0F5, + ColorLawnGreen: 0x7CFC00, + ColorLemonChiffon: 0xFFFACD, + ColorLightBlue: 0xADD8E6, + ColorLightCoral: 0xF08080, + ColorLightCyan: 0xE0FFFF, + ColorLightGoldenrodYellow: 0xFAFAD2, + ColorLightGray: 0xD3D3D3, + ColorLightGreen: 0x90EE90, + ColorLightPink: 0xFFB6C1, + ColorLightSalmon: 0xFFA07A, + ColorLightSeaGreen: 0x20B2AA, + ColorLightSkyBlue: 0x87CEFA, + ColorLightSlateGray: 0x778899, + ColorLightSteelBlue: 0xB0C4DE, + ColorLightYellow: 0xFFFFE0, + ColorLimeGreen: 0x32CD32, + ColorLinen: 0xFAF0E6, + ColorMediumAquamarine: 0x66CDAA, + ColorMediumBlue: 0x0000CD, + ColorMediumOrchid: 0xBA55D3, + ColorMediumPurple: 0x9370DB, + ColorMediumSeaGreen: 0x3CB371, + ColorMediumSlateBlue: 0x7B68EE, + ColorMediumSpringGreen: 0x00FA9A, + ColorMediumTurquoise: 0x48D1CC, + ColorMediumVioletRed: 0xC71585, + ColorMidnightBlue: 0x191970, + ColorMintCream: 0xF5FFFA, + ColorMistyRose: 0xFFE4E1, + ColorMoccasin: 0xFFE4B5, + ColorNavajoWhite: 0xFFDEAD, + ColorOldLace: 0xFDF5E6, + ColorOliveDrab: 0x6B8E23, + ColorOrange: 0xFFA500, + ColorOrangeRed: 0xFF4500, + ColorOrchid: 0xDA70D6, + ColorPaleGoldenrod: 0xEEE8AA, + ColorPaleGreen: 0x98FB98, + ColorPaleTurquoise: 0xAFEEEE, + ColorPaleVioletRed: 0xDB7093, + ColorPapayaWhip: 0xFFEFD5, + ColorPeachPuff: 0xFFDAB9, + ColorPeru: 0xCD853F, + ColorPink: 0xFFC0CB, + ColorPlum: 0xDDA0DD, + ColorPowderBlue: 0xB0E0E6, + ColorRebeccaPurple: 0x663399, + ColorRosyBrown: 0xBC8F8F, + ColorRoyalBlue: 0x4169E1, + ColorSaddleBrown: 0x8B4513, + ColorSalmon: 0xFA8072, + ColorSandyBrown: 0xF4A460, + ColorSeaGreen: 0x2E8B57, + ColorSeashell: 0xFFF5EE, + ColorSienna: 0xA0522D, + ColorSkyblue: 0x87CEEB, + ColorSlateBlue: 0x6A5ACD, + ColorSlateGray: 0x708090, + ColorSnow: 0xFFFAFA, + ColorSpringGreen: 0x00FF7F, + ColorSteelBlue: 0x4682B4, + ColorTan: 0xD2B48C, + ColorThistle: 0xD8BFD8, + ColorTomato: 0xFF6347, + ColorTurquoise: 0x40E0D0, + ColorViolet: 0xEE82EE, + ColorWheat: 0xF5DEB3, + ColorWhiteSmoke: 0xF5F5F5, + ColorYellowGreen: 0x9ACD32, +} + +// Special colors. +const ( + // ColorReset is used to indicate that the color should use the + // vanilla terminal colors. (Basically go back to the defaults.) + ColorReset = ColorSpecial | iota + + // ColorNone indicates that we should not change the color from + // whatever is already displayed. This can only be used in limited + // circumstances. + ColorNone +) + +// ColorNames holds the written names of colors. Useful to present a list of +// recognized named colors. +var ColorNames = map[string]Color{ + "black": ColorBlack, + "maroon": ColorMaroon, + "green": ColorGreen, + "olive": ColorOlive, + "navy": ColorNavy, + "purple": ColorPurple, + "teal": ColorTeal, + "silver": ColorSilver, + "gray": ColorGray, + "red": ColorRed, + "lime": ColorLime, + "yellow": ColorYellow, + "blue": ColorBlue, + "fuchsia": ColorFuchsia, + "aqua": ColorAqua, + "white": ColorWhite, + "aliceblue": ColorAliceBlue, + "antiquewhite": ColorAntiqueWhite, + "aquamarine": ColorAquaMarine, + "azure": ColorAzure, + "beige": ColorBeige, + "bisque": ColorBisque, + "blanchedalmond": ColorBlanchedAlmond, + "blueviolet": ColorBlueViolet, + "brown": ColorBrown, + "burlywood": ColorBurlyWood, + "cadetblue": ColorCadetBlue, + "chartreuse": ColorChartreuse, + "chocolate": ColorChocolate, + "coral": ColorCoral, + "cornflowerblue": ColorCornflowerBlue, + "cornsilk": ColorCornsilk, + "crimson": ColorCrimson, + "darkblue": ColorDarkBlue, + "darkcyan": ColorDarkCyan, + "darkgoldenrod": ColorDarkGoldenrod, + "darkgray": ColorDarkGray, + "darkgreen": ColorDarkGreen, + "darkkhaki": ColorDarkKhaki, + "darkmagenta": ColorDarkMagenta, + "darkolivegreen": ColorDarkOliveGreen, + "darkorange": ColorDarkOrange, + "darkorchid": ColorDarkOrchid, + "darkred": ColorDarkRed, + "darksalmon": ColorDarkSalmon, + "darkseagreen": ColorDarkSeaGreen, + "darkslateblue": ColorDarkSlateBlue, + "darkslategray": ColorDarkSlateGray, + "darkturquoise": ColorDarkTurquoise, + "darkviolet": ColorDarkViolet, + "deeppink": ColorDeepPink, + "deepskyblue": ColorDeepSkyBlue, + "dimgray": ColorDimGray, + "dodgerblue": ColorDodgerBlue, + "firebrick": ColorFireBrick, + "floralwhite": ColorFloralWhite, + "forestgreen": ColorForestGreen, + "gainsboro": ColorGainsboro, + "ghostwhite": ColorGhostWhite, + "gold": ColorGold, + "goldenrod": ColorGoldenrod, + "greenyellow": ColorGreenYellow, + "honeydew": ColorHoneydew, + "hotpink": ColorHotPink, + "indianred": ColorIndianRed, + "indigo": ColorIndigo, + "ivory": ColorIvory, + "khaki": ColorKhaki, + "lavender": ColorLavender, + "lavenderblush": ColorLavenderBlush, + "lawngreen": ColorLawnGreen, + "lemonchiffon": ColorLemonChiffon, + "lightblue": ColorLightBlue, + "lightcoral": ColorLightCoral, + "lightcyan": ColorLightCyan, + "lightgoldenrodyellow": ColorLightGoldenrodYellow, + "lightgray": ColorLightGray, + "lightgreen": ColorLightGreen, + "lightpink": ColorLightPink, + "lightsalmon": ColorLightSalmon, + "lightseagreen": ColorLightSeaGreen, + "lightskyblue": ColorLightSkyBlue, + "lightslategray": ColorLightSlateGray, + "lightsteelblue": ColorLightSteelBlue, + "lightyellow": ColorLightYellow, + "limegreen": ColorLimeGreen, + "linen": ColorLinen, + "mediumaquamarine": ColorMediumAquamarine, + "mediumblue": ColorMediumBlue, + "mediumorchid": ColorMediumOrchid, + "mediumpurple": ColorMediumPurple, + "mediumseagreen": ColorMediumSeaGreen, + "mediumslateblue": ColorMediumSlateBlue, + "mediumspringgreen": ColorMediumSpringGreen, + "mediumturquoise": ColorMediumTurquoise, + "mediumvioletred": ColorMediumVioletRed, + "midnightblue": ColorMidnightBlue, + "mintcream": ColorMintCream, + "mistyrose": ColorMistyRose, + "moccasin": ColorMoccasin, + "navajowhite": ColorNavajoWhite, + "oldlace": ColorOldLace, + "olivedrab": ColorOliveDrab, + "orange": ColorOrange, + "orangered": ColorOrangeRed, + "orchid": ColorOrchid, + "palegoldenrod": ColorPaleGoldenrod, + "palegreen": ColorPaleGreen, + "paleturquoise": ColorPaleTurquoise, + "palevioletred": ColorPaleVioletRed, + "papayawhip": ColorPapayaWhip, + "peachpuff": ColorPeachPuff, + "peru": ColorPeru, + "pink": ColorPink, + "plum": ColorPlum, + "powderblue": ColorPowderBlue, + "rebeccapurple": ColorRebeccaPurple, + "rosybrown": ColorRosyBrown, + "royalblue": ColorRoyalBlue, + "saddlebrown": ColorSaddleBrown, + "salmon": ColorSalmon, + "sandybrown": ColorSandyBrown, + "seagreen": ColorSeaGreen, + "seashell": ColorSeashell, + "sienna": ColorSienna, + "skyblue": ColorSkyblue, + "slateblue": ColorSlateBlue, + "slategray": ColorSlateGray, + "snow": ColorSnow, + "springgreen": ColorSpringGreen, + "steelblue": ColorSteelBlue, + "tan": ColorTan, + "thistle": ColorThistle, + "tomato": ColorTomato, + "turquoise": ColorTurquoise, + "violet": ColorViolet, + "wheat": ColorWheat, + "whitesmoke": ColorWhiteSmoke, + "yellowgreen": ColorYellowGreen, + "grey": ColorGray, + "dimgrey": ColorDimGray, + "darkgrey": ColorDarkGray, + "darkslategrey": ColorDarkSlateGray, + "lightgrey": ColorLightGray, + "lightslategrey": ColorLightSlateGray, + "slategrey": ColorSlateGray, +} + +// Valid indicates the color is a valid value (has been set). +func (c Color) Valid() bool { + return c&ColorValid != 0 +} + +// IsRGB is true if the color is an RGB specific value. +func (c Color) IsRGB() bool { + return c&(ColorValid|ColorIsRGB) == (ColorValid | ColorIsRGB) +} + +// CSS returns the CSS hex string ( #ABCDEF ) if valid +// if not a valid color returns empty string +func (c Color) CSS() string { + if !c.Valid() { + return "" + } + return fmt.Sprintf("#%06X", c.Hex()) +} + +// String implements fmt.Stringer to return either the +// W3C name if it has one or the CSS hex string '#ABCDEF' +func (c Color) String() string { + if !c.Valid() { + switch c { + case ColorNone: + return "none" + case ColorDefault: + return "default" + case ColorReset: + return "reset" + } + return "" + } + return c.Name(true) +} + +// Name returns W3C name or an empty string if no arguments +// if passed true as an argument it will falls back to +// the CSS hex string if no W3C name found '#ABCDEF' +func (c Color) Name(css ...bool) string { + for name, hex := range ColorNames { + if c == hex { + return name + } + } + if len(css) > 0 && css[0] { + return c.CSS() + } + return "" +} + +// Hex returns the color's hexadecimal RGB 24-bit value with each component +// consisting of a single byte, R << 16 | G << 8 | B. If the color +// is unknown or unset, -1 is returned. +func (c Color) Hex() int32 { + if !c.Valid() { + return -1 + } + if c&ColorIsRGB != 0 { + return int32(c & 0xffffff) + } + if v, ok := ColorValues[c]; ok { + return v + } + return -1 +} + +// RGB returns the red, green, and blue components of the color, with +// each component represented as a value 0-255. In the event that the +// color cannot be broken up (not set usually), -1 is returned for each value. +func (c Color) RGB() (int32, int32, int32) { + v := c.Hex() + if v < 0 { + return -1, -1, -1 + } + return (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff +} + +// TrueColor returns the true color (RGB) version of the provided color. +// This is useful for ensuring color accuracy when using named colors. +// This will override terminal theme colors. +func (c Color) TrueColor() Color { + if !c.Valid() { + return ColorDefault + } + if c&ColorIsRGB != 0 { + return c | ColorValid + } + return Color(c.Hex()) | ColorIsRGB | ColorValid +} + +// NewRGBColor returns a new color with the given red, green, and blue values. +// Each value must be represented in the range 0-255. +func NewRGBColor(r, g, b int32) Color { + return NewHexColor(((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)) +} + +// NewHexColor returns a color using the given 24-bit RGB value. +func NewHexColor(v int32) Color { + return ColorIsRGB | Color(v) | ColorValid +} + +// GetColor creates a Color from a color name (W3C name). A hex value may +// be supplied as a string in the format "#ffffff". +func GetColor(name string) Color { + if c, ok := ColorNames[name]; ok { + return c + } + if len(name) == 7 && name[0] == '#' { + if v, e := strconv.ParseInt(name[1:], 16, 32); e == nil { + return NewHexColor(int32(v)) + } + } + return ColorDefault +} + +// PaletteColor creates a color based on the palette index. +func PaletteColor(index int) Color { + return Color(index) | ColorValid +} + +// FromImageColor converts an image/color.Color into tcell.Color. +// The alpha value is dropped, so it should be tracked separately if it is +// needed. +func FromImageColor(imageColor ic.Color) Color { + r, g, b, _ := imageColor.RGBA() + // NOTE image/color.Color RGB values range is [0, 0xFFFF] as uint32 + return NewRGBColor(int32(r>>8), int32(g>>8), int32(b>>8)) +} diff --git a/vendor/github.com/gdamore/tcell/v2/colorfit.go b/vendor/github.com/gdamore/tcell/v2/colorfit.go new file mode 100644 index 00000000..f690097f --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/colorfit.go @@ -0,0 +1,53 @@ +// Copyright 2016 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "math" + + "github.com/lucasb-eyer/go-colorful" +) + +// FindColor attempts to find a given color, or the best match possible for it, +// from the palette given. This is an expensive operation, so results should +// be cached by the caller. +func FindColor(c Color, palette []Color) Color { + match := ColorDefault + dist := float64(0) + r, g, b := c.RGB() + c1 := colorful.Color{ + R: float64(r) / 255.0, + G: float64(g) / 255.0, + B: float64(b) / 255.0, + } + for _, d := range palette { + r, g, b = d.RGB() + c2 := colorful.Color{ + R: float64(r) / 255.0, + G: float64(g) / 255.0, + B: float64(b) / 255.0, + } + // CIE94 is more accurate, but really really expensive. + nd := c1.DistanceCIE76(c2) + if math.IsNaN(nd) { + nd = math.Inf(1) + } + if match == ColorDefault || nd < dist { + match = d + dist = nd + } + } + return match +} diff --git a/vendor/github.com/gdamore/tcell/v2/console_stub.go b/vendor/github.com/gdamore/tcell/v2/console_stub.go new file mode 100644 index 00000000..6ff7e92a --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/console_stub.go @@ -0,0 +1,24 @@ +//go:build !windows +// +build !windows + +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +// NewConsoleScreen returns a console based screen. This platform +// doesn't have support for any, so it returns nil and a suitable error. +func NewConsoleScreen() (Screen, error) { + return nil, ErrNoScreen +} diff --git a/vendor/github.com/gdamore/tcell/v2/console_win.go b/vendor/github.com/gdamore/tcell/v2/console_win.go new file mode 100644 index 00000000..a46f3c31 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/console_win.go @@ -0,0 +1,1411 @@ +//go:build windows +// +build windows + +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "errors" + "fmt" + "os" + "strings" + "sync" + "syscall" + "unicode/utf16" + "unsafe" +) + +type cScreen struct { + in syscall.Handle + out syscall.Handle + cancelflag syscall.Handle + scandone chan struct{} + quit chan struct{} + curx int + cury int + style Style + fini bool + vten bool + truecolor bool + running bool + disableAlt bool // disable the alternate screen + title string + + w int + h int + + oscreen consoleInfo + ocursor cursorInfo + cursorStyle CursorStyle + cursorColor Color + oimode uint32 + oomode uint32 + cells CellBuffer + focusEnable bool + + mouseEnabled bool + wg sync.WaitGroup + eventQ chan Event + stopQ chan struct{} + finiOnce sync.Once + + sync.Mutex +} + +var winLock sync.Mutex + +var winPalette = []Color{ + ColorBlack, + ColorMaroon, + ColorGreen, + ColorNavy, + ColorOlive, + ColorPurple, + ColorTeal, + ColorSilver, + ColorGray, + ColorRed, + ColorLime, + ColorBlue, + ColorYellow, + ColorFuchsia, + ColorAqua, + ColorWhite, +} + +var winColors = map[Color]Color{ + ColorBlack: ColorBlack, + ColorMaroon: ColorMaroon, + ColorGreen: ColorGreen, + ColorNavy: ColorNavy, + ColorOlive: ColorOlive, + ColorPurple: ColorPurple, + ColorTeal: ColorTeal, + ColorSilver: ColorSilver, + ColorGray: ColorGray, + ColorRed: ColorRed, + ColorLime: ColorLime, + ColorBlue: ColorBlue, + ColorYellow: ColorYellow, + ColorFuchsia: ColorFuchsia, + ColorAqua: ColorAqua, + ColorWhite: ColorWhite, +} + +var ( + k32 = syscall.NewLazyDLL("kernel32.dll") + u32 = syscall.NewLazyDLL("user32.dll") +) + +// We have to bring in the kernel32 and user32 DLLs directly, so we can get +// access to some system calls that the core Go API lacks. +// +// Note that Windows appends some functions with W to indicate that wide +// characters (Unicode) are in use. The documentation refers to them +// without this suffix, as the resolution is made via preprocessor. +var ( + procReadConsoleInput = k32.NewProc("ReadConsoleInputW") + procWaitForMultipleObjects = k32.NewProc("WaitForMultipleObjects") + procCreateEvent = k32.NewProc("CreateEventW") + procSetEvent = k32.NewProc("SetEvent") + procGetConsoleCursorInfo = k32.NewProc("GetConsoleCursorInfo") + procSetConsoleCursorInfo = k32.NewProc("SetConsoleCursorInfo") + procSetConsoleCursorPosition = k32.NewProc("SetConsoleCursorPosition") + procSetConsoleMode = k32.NewProc("SetConsoleMode") + procGetConsoleMode = k32.NewProc("GetConsoleMode") + procGetConsoleScreenBufferInfo = k32.NewProc("GetConsoleScreenBufferInfo") + procFillConsoleOutputAttribute = k32.NewProc("FillConsoleOutputAttribute") + procFillConsoleOutputCharacter = k32.NewProc("FillConsoleOutputCharacterW") + procSetConsoleWindowInfo = k32.NewProc("SetConsoleWindowInfo") + procSetConsoleScreenBufferSize = k32.NewProc("SetConsoleScreenBufferSize") + procSetConsoleTextAttribute = k32.NewProc("SetConsoleTextAttribute") + procGetLargestConsoleWindowSize = k32.NewProc("GetLargestConsoleWindowSize") + procMessageBeep = u32.NewProc("MessageBeep") +) + +const ( + w32Infinite = ^uintptr(0) + w32WaitObject0 = uintptr(0) +) + +const ( + // VT100/XTerm escapes understood by the console + vtShowCursor = "\x1b[?25h" + vtHideCursor = "\x1b[?25l" + vtCursorPos = "\x1b[%d;%dH" // Note that it is Y then X + vtSgr0 = "\x1b[0m" + vtBold = "\x1b[1m" + vtUnderline = "\x1b[4m" + vtBlink = "\x1b[5m" // Not sure if this is processed + vtReverse = "\x1b[7m" + vtSetFg = "\x1b[38;5;%dm" + vtSetBg = "\x1b[48;5;%dm" + vtSetFgRGB = "\x1b[38;2;%d;%d;%dm" // RGB + vtSetBgRGB = "\x1b[48;2;%d;%d;%dm" // RGB + vtCursorDefault = "\x1b[0 q" + vtCursorBlinkingBlock = "\x1b[1 q" + vtCursorSteadyBlock = "\x1b[2 q" + vtCursorBlinkingUnderline = "\x1b[3 q" + vtCursorSteadyUnderline = "\x1b[4 q" + vtCursorBlinkingBar = "\x1b[5 q" + vtCursorSteadyBar = "\x1b[6 q" + vtDisableAm = "\x1b[?7l" + vtEnableAm = "\x1b[?7h" + vtEnterCA = "\x1b[?1049h\x1b[22;0;0t" + vtExitCA = "\x1b[?1049l\x1b[23;0;0t" + vtDoubleUnderline = "\x1b[4:2m" + vtCurlyUnderline = "\x1b[4:3m" + vtDottedUnderline = "\x1b[4:4m" + vtDashedUnderline = "\x1b[4:5m" + vtUnderColor = "\x1b[58:5:%dm" + vtUnderColorRGB = "\x1b[58:2::%d:%d:%dm" + vtUnderColorReset = "\x1b[59m" + vtEnterUrl = "\x1b]8;%s;%s\x1b\\" // NB arg 1 is id, arg 2 is url + vtExitUrl = "\x1b]8;;\x1b\\" + vtCursorColorRGB = "\x1b]12;#%02x%02x%02x\007" + vtCursorColorReset = "\x1b]112\007" + vtSaveTitle = "\x1b[22;2t" + vtRestoreTitle = "\x1b[23;2t" + vtSetTitle = "\x1b]2;%s\x1b\\" +) + +var vtCursorStyles = map[CursorStyle]string{ + CursorStyleDefault: vtCursorDefault, + CursorStyleBlinkingBlock: vtCursorBlinkingBlock, + CursorStyleSteadyBlock: vtCursorSteadyBlock, + CursorStyleBlinkingUnderline: vtCursorBlinkingUnderline, + CursorStyleSteadyUnderline: vtCursorSteadyUnderline, + CursorStyleBlinkingBar: vtCursorBlinkingBar, + CursorStyleSteadyBar: vtCursorSteadyBar, +} + +// NewConsoleScreen returns a Screen for the Windows console associated +// with the current process. The Screen makes use of the Windows Console +// API to display content and read events. +func NewConsoleScreen() (Screen, error) { + return &baseScreen{screenImpl: &cScreen{}}, nil +} + +func (s *cScreen) Init() error { + s.eventQ = make(chan Event, 10) + s.quit = make(chan struct{}) + s.scandone = make(chan struct{}) + in, e := syscall.Open("CONIN$", syscall.O_RDWR, 0) + if e != nil { + return e + } + s.in = in + out, e := syscall.Open("CONOUT$", syscall.O_RDWR, 0) + if e != nil { + _ = syscall.Close(s.in) + return e + } + s.out = out + + s.truecolor = true + + // ConEmu handling of colors and scrolling when in VT output mode is extremely poor. + // The color palette will scroll even though characters do not, when + // emitting stuff for the last character. In the future we might change this to + // look at specific versions of ConEmu if they fix the bug. + // We can also try disabling auto margin mode. + tryVt := true + if os.Getenv("ConEmuPID") != "" { + s.truecolor = false + tryVt = false + } + switch os.Getenv("TCELL_TRUECOLOR") { + case "disable": + s.truecolor = false + case "enable": + s.truecolor = true + tryVt = true + } + + s.Lock() + + s.curx = -1 + s.cury = -1 + s.style = StyleDefault + s.getCursorInfo(&s.ocursor) + s.getConsoleInfo(&s.oscreen) + s.getOutMode(&s.oomode) + s.getInMode(&s.oimode) + s.resize() + + s.fini = false + s.setInMode(modeResizeEn | modeExtendFlg) + + // If a user needs to force old style console, they may do so + // by setting TCELL_VTMODE to disable. This is an undocumented safety net for now. + // It may be removed in the future. (This mostly exists because of ConEmu.) + switch os.Getenv("TCELL_VTMODE") { + case "disable": + tryVt = false + case "enable": + tryVt = true + } + switch os.Getenv("TCELL_ALTSCREEN") { + case "enable": + s.disableAlt = false // also the default + case "disable": + s.disableAlt = true + } + if tryVt { + s.setOutMode(modeVtOutput | modeNoAutoNL | modeCookedOut | modeUnderline) + var om uint32 + s.getOutMode(&om) + if om&modeVtOutput == modeVtOutput { + s.vten = true + } else { + s.truecolor = false + s.setOutMode(0) + } + } else { + s.setOutMode(0) + } + + s.Unlock() + + return s.engage() +} + +func (s *cScreen) CharacterSet() string { + // We are always UTF-16LE on Windows + return "UTF-16LE" +} + +func (s *cScreen) EnableMouse(...MouseFlags) { + s.Lock() + s.mouseEnabled = true + s.enableMouse(true) + s.Unlock() +} + +func (s *cScreen) DisableMouse() { + s.Lock() + s.mouseEnabled = false + s.enableMouse(false) + s.Unlock() +} + +func (s *cScreen) enableMouse(on bool) { + if on { + s.setInMode(modeResizeEn | modeMouseEn | modeExtendFlg) + } else { + s.setInMode(modeResizeEn | modeExtendFlg) + } +} + +// Windows lacks bracketed paste (for now) + +func (s *cScreen) EnablePaste() {} + +func (s *cScreen) DisablePaste() {} + +func (s *cScreen) EnableFocus() { + s.Lock() + s.focusEnable = true + s.Unlock() +} + +func (s *cScreen) DisableFocus() { + s.Lock() + s.focusEnable = false + s.Unlock() +} + +func (s *cScreen) Fini() { + s.finiOnce.Do(func() { + close(s.quit) + s.disengage() + }) +} + +func (s *cScreen) disengage() { + s.Lock() + if !s.running { + s.Unlock() + return + } + s.running = false + stopQ := s.stopQ + _, _, _ = procSetEvent.Call(uintptr(s.cancelflag)) + close(stopQ) + s.Unlock() + + s.wg.Wait() + + if s.vten { + s.emitVtString(vtCursorStyles[CursorStyleDefault]) + s.emitVtString(vtCursorColorReset) + s.emitVtString(vtEnableAm) + if !s.disableAlt { + s.emitVtString(vtRestoreTitle) + s.emitVtString(vtExitCA) + } + } else if !s.disableAlt { + s.clearScreen(StyleDefault, s.vten) + s.setCursorPos(0, 0, false) + } + s.setCursorInfo(&s.ocursor) + s.setBufferSize(int(s.oscreen.size.x), int(s.oscreen.size.y)) + s.setInMode(s.oimode) + s.setOutMode(s.oomode) + _, _, _ = procSetConsoleTextAttribute.Call( + uintptr(s.out), + uintptr(s.mapStyle(StyleDefault))) +} + +func (s *cScreen) engage() error { + s.Lock() + defer s.Unlock() + if s.running { + return errors.New("already engaged") + } + s.stopQ = make(chan struct{}) + cf, _, e := procCreateEvent.Call( + uintptr(0), + uintptr(1), + uintptr(0), + uintptr(0)) + if cf == uintptr(0) { + return e + } + s.running = true + s.cancelflag = syscall.Handle(cf) + s.enableMouse(s.mouseEnabled) + + if s.vten { + s.setOutMode(modeVtOutput | modeNoAutoNL | modeCookedOut | modeUnderline) + if !s.disableAlt { + s.emitVtString(vtSaveTitle) + s.emitVtString(vtEnterCA) + } + s.emitVtString(vtDisableAm) + if s.title != "" { + s.emitVtString(fmt.Sprintf(vtSetTitle, s.title)) + } + } else { + s.setOutMode(0) + } + + s.clearScreen(s.style, s.vten) + s.hideCursor() + + s.cells.Invalidate() + s.hideCursor() + s.resize() + s.draw() + s.doCursor() + + s.wg.Add(1) + go s.scanInput(s.stopQ) + return nil +} + +type cursorInfo struct { + size uint32 + visible uint32 +} + +type coord struct { + x int16 + y int16 +} + +func (c coord) uintptr() uintptr { + // little endian, put x first + return uintptr(c.x) | (uintptr(c.y) << 16) +} + +type rect struct { + left int16 + top int16 + right int16 + bottom int16 +} + +func (s *cScreen) emitVtString(vs string) { + esc := utf16.Encode([]rune(vs)) + _ = syscall.WriteConsole(s.out, &esc[0], uint32(len(esc)), nil, nil) +} + +func (s *cScreen) showCursor() { + if s.vten { + s.emitVtString(vtShowCursor) + s.emitVtString(vtCursorStyles[s.cursorStyle]) + if s.cursorColor == ColorReset { + s.emitVtString(vtCursorColorReset) + } else if s.cursorColor.Valid() { + r, g, b := s.cursorColor.RGB() + s.emitVtString(fmt.Sprintf(vtCursorColorRGB, r, g, b)) + } + } else { + s.setCursorInfo(&cursorInfo{size: 100, visible: 1}) + } +} + +func (s *cScreen) hideCursor() { + if s.vten { + s.emitVtString(vtHideCursor) + } else { + s.setCursorInfo(&cursorInfo{size: 1, visible: 0}) + } +} + +func (s *cScreen) ShowCursor(x, y int) { + s.Lock() + if !s.fini { + s.curx = x + s.cury = y + } + s.doCursor() + s.Unlock() +} + +func (s *cScreen) SetCursor(cs CursorStyle, cc Color) { + s.Lock() + if !s.fini { + if _, ok := vtCursorStyles[cs]; ok { + s.cursorStyle = cs + s.cursorColor = cc + s.doCursor() + } + } + s.Unlock() +} + +func (s *cScreen) doCursor() { + x, y := s.curx, s.cury + + if x < 0 || y < 0 || x >= s.w || y >= s.h { + s.hideCursor() + } else { + s.setCursorPos(x, y, s.vten) + s.showCursor() + } +} + +func (s *cScreen) HideCursor() { + s.ShowCursor(-1, -1) +} + +type inputRecord struct { + typ uint16 + _ uint16 + data [16]byte +} + +const ( + keyEvent uint16 = 1 + mouseEvent uint16 = 2 + resizeEvent uint16 = 4 + menuEvent uint16 = 8 // don't use + focusEvent uint16 = 16 +) + +type mouseRecord struct { + x int16 + y int16 + btns uint32 + mod uint32 + flags uint32 +} + +type focusRecord struct { + focused int32 // actually BOOL +} + +const ( + mouseHWheeled uint32 = 0x8 + mouseVWheeled uint32 = 0x4 + // mouseDoubleClick uint32 = 0x2 + // mouseMoved uint32 = 0x1 +) + +type resizeRecord struct { + x int16 + y int16 +} + +type keyRecord struct { + isdown int32 + repeat uint16 + kcode uint16 + scode uint16 + ch uint16 + mod uint32 +} + +const ( + // Constants per Microsoft. We don't put the modifiers + // here. + vkCancel = 0x03 + vkBack = 0x08 // Backspace + vkTab = 0x09 + vkClear = 0x0c + vkReturn = 0x0d + vkPause = 0x13 + vkEscape = 0x1b + vkSpace = 0x20 + vkPrior = 0x21 // PgUp + vkNext = 0x22 // PgDn + vkEnd = 0x23 + vkHome = 0x24 + vkLeft = 0x25 + vkUp = 0x26 + vkRight = 0x27 + vkDown = 0x28 + vkPrint = 0x2a + vkPrtScr = 0x2c + vkInsert = 0x2d + vkDelete = 0x2e + vkHelp = 0x2f + vkF1 = 0x70 + vkF2 = 0x71 + vkF3 = 0x72 + vkF4 = 0x73 + vkF5 = 0x74 + vkF6 = 0x75 + vkF7 = 0x76 + vkF8 = 0x77 + vkF9 = 0x78 + vkF10 = 0x79 + vkF11 = 0x7a + vkF12 = 0x7b + vkF13 = 0x7c + vkF14 = 0x7d + vkF15 = 0x7e + vkF16 = 0x7f + vkF17 = 0x80 + vkF18 = 0x81 + vkF19 = 0x82 + vkF20 = 0x83 + vkF21 = 0x84 + vkF22 = 0x85 + vkF23 = 0x86 + vkF24 = 0x87 +) + +var vkKeys = map[uint16]Key{ + vkCancel: KeyCancel, + vkBack: KeyBackspace, + vkTab: KeyTab, + vkClear: KeyClear, + vkPause: KeyPause, + vkPrint: KeyPrint, + vkPrtScr: KeyPrint, + vkPrior: KeyPgUp, + vkNext: KeyPgDn, + vkReturn: KeyEnter, + vkEnd: KeyEnd, + vkHome: KeyHome, + vkLeft: KeyLeft, + vkUp: KeyUp, + vkRight: KeyRight, + vkDown: KeyDown, + vkInsert: KeyInsert, + vkDelete: KeyDelete, + vkHelp: KeyHelp, + vkEscape: KeyEscape, + vkSpace: ' ', + vkF1: KeyF1, + vkF2: KeyF2, + vkF3: KeyF3, + vkF4: KeyF4, + vkF5: KeyF5, + vkF6: KeyF6, + vkF7: KeyF7, + vkF8: KeyF8, + vkF9: KeyF9, + vkF10: KeyF10, + vkF11: KeyF11, + vkF12: KeyF12, + vkF13: KeyF13, + vkF14: KeyF14, + vkF15: KeyF15, + vkF16: KeyF16, + vkF17: KeyF17, + vkF18: KeyF18, + vkF19: KeyF19, + vkF20: KeyF20, + vkF21: KeyF21, + vkF22: KeyF22, + vkF23: KeyF23, + vkF24: KeyF24, +} + +// NB: All Windows platforms are little endian. We assume this +// never, ever change. The following code is endian safe. and does +// not use unsafe pointers. +func getu32(v []byte) uint32 { + return uint32(v[0]) + (uint32(v[1]) << 8) + (uint32(v[2]) << 16) + (uint32(v[3]) << 24) +} + +func geti32(v []byte) int32 { + return int32(getu32(v)) +} + +func getu16(v []byte) uint16 { + return uint16(v[0]) + (uint16(v[1]) << 8) +} + +func geti16(v []byte) int16 { + return int16(getu16(v)) +} + +// Convert windows dwControlKeyState to modifier mask +func mod2mask(cks uint32, filter_ctrl_alt bool) ModMask { + mm := ModNone + // Left or right control + ctrl := (cks & (0x0008 | 0x0004)) != 0 + // Left or right alt + alt := (cks & (0x0002 | 0x0001)) != 0 + // Filter out ctrl+alt (it means AltGr) + if !filter_ctrl_alt || !(ctrl && alt) { + if ctrl { + mm |= ModCtrl + } + if alt { + mm |= ModAlt + } + } + // Any shift + if (cks & 0x0010) != 0 { + mm |= ModShift + } + return mm +} + +func mrec2btns(mbtns, flags uint32) ButtonMask { + btns := ButtonNone + if mbtns&0x1 != 0 { + btns |= Button1 + } + if mbtns&0x2 != 0 { + btns |= Button2 + } + if mbtns&0x4 != 0 { + btns |= Button3 + } + if mbtns&0x8 != 0 { + btns |= Button4 + } + if mbtns&0x10 != 0 { + btns |= Button5 + } + if mbtns&0x20 != 0 { + btns |= Button6 + } + if mbtns&0x40 != 0 { + btns |= Button7 + } + if mbtns&0x80 != 0 { + btns |= Button8 + } + + if flags&mouseVWheeled != 0 { + if mbtns&0x80000000 == 0 { + btns |= WheelUp + } else { + btns |= WheelDown + } + } + if flags&mouseHWheeled != 0 { + if mbtns&0x80000000 == 0 { + btns |= WheelRight + } else { + btns |= WheelLeft + } + } + return btns +} + +func (s *cScreen) postEvent(ev Event) { + select { + case s.eventQ <- ev: + case <-s.quit: + } +} + +func (s *cScreen) getConsoleInput() error { + // cancelFlag comes first as WaitForMultipleObjects returns the lowest index + // in the event that both events are signalled. + waitObjects := []syscall.Handle{s.cancelflag, s.in} + // As arrays are contiguous in memory, a pointer to the first object is the + // same as a pointer to the array itself. + pWaitObjects := unsafe.Pointer(&waitObjects[0]) + + rv, _, er := procWaitForMultipleObjects.Call( + uintptr(len(waitObjects)), + uintptr(pWaitObjects), + uintptr(0), + w32Infinite) + // WaitForMultipleObjects returns WAIT_OBJECT_0 + the index. + switch rv { + case w32WaitObject0: // s.cancelFlag + return errors.New("cancelled") + case w32WaitObject0 + 1: // s.in + rec := &inputRecord{} + var nrec int32 + rv, _, er := procReadConsoleInput.Call( + uintptr(s.in), + uintptr(unsafe.Pointer(rec)), + uintptr(1), + uintptr(unsafe.Pointer(&nrec))) + if rv == 0 { + return er + } + if nrec != 1 { + return nil + } + switch rec.typ { + case keyEvent: + krec := &keyRecord{} + krec.isdown = geti32(rec.data[0:]) + krec.repeat = getu16(rec.data[4:]) + krec.kcode = getu16(rec.data[6:]) + krec.scode = getu16(rec.data[8:]) + krec.ch = getu16(rec.data[10:]) + krec.mod = getu32(rec.data[12:]) + + if krec.isdown == 0 || krec.repeat < 1 { + // it's a key release event, ignore it + return nil + } + if krec.ch != 0 { + // synthesized key code + for krec.repeat > 0 { + // convert shift+tab to backtab + if mod2mask(krec.mod, false) == ModShift && krec.ch == vkTab { + s.postEvent(NewEventKey(KeyBacktab, 0, ModNone)) + } else { + s.postEvent(NewEventKey(KeyRune, rune(krec.ch), mod2mask(krec.mod, true))) + } + krec.repeat-- + } + return nil + } + key := KeyNUL // impossible on Windows + ok := false + if key, ok = vkKeys[krec.kcode]; !ok { + return nil + } + for krec.repeat > 0 { + s.postEvent(NewEventKey(key, rune(krec.ch), mod2mask(krec.mod, false))) + krec.repeat-- + } + + case mouseEvent: + var mrec mouseRecord + mrec.x = geti16(rec.data[0:]) + mrec.y = geti16(rec.data[2:]) + mrec.btns = getu32(rec.data[4:]) + mrec.mod = getu32(rec.data[8:]) + mrec.flags = getu32(rec.data[12:]) + btns := mrec2btns(mrec.btns, mrec.flags) + // we ignore double click, events are delivered normally + s.postEvent(NewEventMouse(int(mrec.x), int(mrec.y), btns, mod2mask(mrec.mod, false))) + + case resizeEvent: + var rrec resizeRecord + rrec.x = geti16(rec.data[0:]) + rrec.y = geti16(rec.data[2:]) + s.postEvent(NewEventResize(int(rrec.x), int(rrec.y))) + + case focusEvent: + var focus focusRecord + focus.focused = geti32(rec.data[0:]) + s.Lock() + enabled := s.focusEnable + s.Unlock() + if enabled { + s.postEvent(NewEventFocus(focus.focused != 0)) + } + + default: + } + default: + return er + } + + return nil +} + +func (s *cScreen) scanInput(stopQ chan struct{}) { + defer s.wg.Done() + for { + select { + case <-stopQ: + return + default: + } + if e := s.getConsoleInput(); e != nil { + return + } + } +} + +func (s *cScreen) Colors() int { + if s.vten { + return 1 << 24 + } + // Windows console can display 8 colors, in either low or high intensity + return 16 +} + +var vgaColors = map[Color]uint16{ + ColorBlack: 0, + ColorMaroon: 0x4, + ColorGreen: 0x2, + ColorNavy: 0x1, + ColorOlive: 0x6, + ColorPurple: 0x5, + ColorTeal: 0x3, + ColorSilver: 0x7, + ColorGrey: 0x8, + ColorRed: 0xc, + ColorLime: 0xa, + ColorBlue: 0x9, + ColorYellow: 0xe, + ColorFuchsia: 0xd, + ColorAqua: 0xb, + ColorWhite: 0xf, +} + +// Windows uses RGB signals +func mapColor2RGB(c Color) uint16 { + winLock.Lock() + if v, ok := winColors[c]; ok { + c = v + } else { + v = FindColor(c, winPalette) + winColors[c] = v + c = v + } + winLock.Unlock() + + if vc, ok := vgaColors[c]; ok { + return vc + } + return 0 +} + +// Map a tcell style to Windows attributes +func (s *cScreen) mapStyle(style Style) uint16 { + f, b, a := style.fg, style.bg, style.attrs + fa := s.oscreen.attrs & 0xf + ba := (s.oscreen.attrs) >> 4 & 0xf + if f != ColorDefault && f != ColorReset { + fa = mapColor2RGB(f) + } + if b != ColorDefault && b != ColorReset { + ba = mapColor2RGB(b) + } + var attr uint16 + // We simulate reverse by doing the color swap ourselves. + // Apparently windows cannot really do this except in DBCS + // views. + if a&AttrReverse != 0 { + attr = ba + attr |= fa << 4 + } else { + attr = fa + attr |= ba << 4 + } + if a&AttrBold != 0 { + attr |= 0x8 + } + if a&AttrDim != 0 { + attr &^= 0x8 + } + if a&AttrUnderline != 0 { + // Best effort -- doesn't seem to work though. + attr |= 0x8000 + } + // Blink is unsupported + return attr +} + +func (s *cScreen) makeVtStyle(style Style) string { + esc := &strings.Builder{} + + fg, bg, attrs := style.fg, style.bg, style.attrs + us, uc := style.ulStyle, style.ulColor + + esc.WriteString(vtSgr0) + if attrs&(AttrBold|AttrDim) == AttrBold { + esc.WriteString(vtBold) + } + if attrs&AttrBlink != 0 { + esc.WriteString(vtBlink) + } + if us != UnderlineStyleNone { + if uc == ColorReset { + esc.WriteString(vtUnderColorReset) + } else if uc.IsRGB() { + r, g, b := uc.RGB() + _, _ = fmt.Fprintf(esc, vtUnderColorRGB, int(r), int(g), int(b)) + } else if uc.Valid() { + _, _ = fmt.Fprintf(esc, vtUnderColor, uc&0xff) + } + + esc.WriteString(vtUnderline) + // legacy ConHost does not understand these but Terminal does + switch us { + case UnderlineStyleSolid: + case UnderlineStyleDouble: + esc.WriteString(vtDoubleUnderline) + case UnderlineStyleCurly: + esc.WriteString(vtCurlyUnderline) + case UnderlineStyleDotted: + esc.WriteString(vtDottedUnderline) + case UnderlineStyleDashed: + esc.WriteString(vtDashedUnderline) + } + } + + if attrs&AttrReverse != 0 { + esc.WriteString(vtReverse) + } + if fg.IsRGB() { + r, g, b := fg.RGB() + _, _ = fmt.Fprintf(esc, vtSetFgRGB, r, g, b) + } else if fg.Valid() { + _, _ = fmt.Fprintf(esc, vtSetFg, fg&0xff) + } + if bg.IsRGB() { + r, g, b := bg.RGB() + _, _ = fmt.Fprintf(esc, vtSetBgRGB, r, g, b) + } else if bg.Valid() { + _, _ = fmt.Fprintf(esc, vtSetBg, bg&0xff) + } + // URL string can be long, so don't send it unless we really need to + if style.url != "" { + _, _ = fmt.Fprintf(esc, vtEnterUrl, style.urlId, style.url) + } else { + esc.WriteString(vtExitUrl) + } + + return esc.String() +} + +func (s *cScreen) sendVtStyle(style Style) { + s.emitVtString(s.makeVtStyle(style)) +} + +func (s *cScreen) writeString(x, y int, style Style, vtBuf, ch []uint16) { + // we assume the caller has hidden the cursor + if len(ch) == 0 { + return + } + + if s.vten { + vtBuf = append(vtBuf, utf16.Encode([]rune(fmt.Sprintf(vtCursorPos, y+1, x+1)))...) + styleStr := s.makeVtStyle(style) + vtBuf = append(vtBuf, utf16.Encode([]rune(styleStr))...) + vtBuf = append(vtBuf, ch...) + _ = syscall.WriteConsole(s.out, &vtBuf[0], uint32(len(vtBuf)), nil, nil) + vtBuf = vtBuf[:0] + } else { + s.setCursorPos(x, y, s.vten) + _, _, _ = procSetConsoleTextAttribute.Call( + uintptr(s.out), + uintptr(s.mapStyle(style))) + _ = syscall.WriteConsole(s.out, &ch[0], uint32(len(ch)), nil, nil) + } +} + +func (s *cScreen) draw() { + // allocate a scratch line bit enough for no combining chars. + // if you have combining characters, you may pay for extra allocations. + buf := make([]uint16, 0, s.w) + var vtBuf []uint16 + wcs := buf[:] + lstyle := styleInvalid + + lx, ly := -1, -1 + ra := make([]rune, 1) + + for y := 0; y < s.h; y++ { + for x := 0; x < s.w; x++ { + mainc, combc, style, width := s.cells.GetContent(x, y) + dirty := s.cells.Dirty(x, y) + if style == StyleDefault { + style = s.style + } + + if !dirty || style != lstyle { + // write out any data queued thus far + // because we are going to skip over some + // cells, or because we need to change styles + s.writeString(lx, ly, lstyle, vtBuf, wcs) + wcs = buf[0:0] + lstyle = StyleDefault + if !dirty { + continue + } + } + if x > s.w-width { + mainc = ' ' + combc = nil + width = 1 + } + if len(wcs) == 0 { + lstyle = style + lx = x + ly = y + } + ra[0] = mainc + wcs = append(wcs, utf16.Encode(ra)...) + if len(combc) != 0 { + wcs = append(wcs, utf16.Encode(combc)...) + } + for dx := 0; dx < width; dx++ { + s.cells.SetDirty(x+dx, y, false) + } + x += width - 1 + } + s.writeString(lx, ly, lstyle, vtBuf, wcs) + wcs = buf[0:0] + lstyle = styleInvalid + } +} + +func (s *cScreen) Show() { + s.Lock() + if !s.fini { + s.hideCursor() + s.resize() + s.draw() + s.doCursor() + } + s.Unlock() +} + +func (s *cScreen) Sync() { + s.Lock() + if !s.fini { + s.cells.Invalidate() + s.hideCursor() + s.resize() + s.draw() + s.doCursor() + } + s.Unlock() +} + +type consoleInfo struct { + size coord + pos coord + attrs uint16 + win rect + maxsz coord +} + +func (s *cScreen) getConsoleInfo(info *consoleInfo) { + _, _, _ = procGetConsoleScreenBufferInfo.Call( + uintptr(s.out), + uintptr(unsafe.Pointer(info))) +} + +func (s *cScreen) getCursorInfo(info *cursorInfo) { + _, _, _ = procGetConsoleCursorInfo.Call( + uintptr(s.out), + uintptr(unsafe.Pointer(info))) +} + +func (s *cScreen) setCursorInfo(info *cursorInfo) { + _, _, _ = procSetConsoleCursorInfo.Call( + uintptr(s.out), + uintptr(unsafe.Pointer(info))) +} + +func (s *cScreen) setCursorPos(x, y int, vtEnable bool) { + if vtEnable { + // Note that the string is Y first. Origin is 1,1. + s.emitVtString(fmt.Sprintf(vtCursorPos, y+1, x+1)) + } else { + _, _, _ = procSetConsoleCursorPosition.Call( + uintptr(s.out), + coord{int16(x), int16(y)}.uintptr()) + } +} + +func (s *cScreen) setBufferSize(x, y int) { + _, _, _ = procSetConsoleScreenBufferSize.Call( + uintptr(s.out), + coord{int16(x), int16(y)}.uintptr()) +} + +func (s *cScreen) Size() (int, int) { + s.Lock() + w, h := s.w, s.h + s.Unlock() + + return w, h +} + +func (s *cScreen) SetSize(w, h int) { + xy, _, _ := procGetLargestConsoleWindowSize.Call(uintptr(s.out)) + + // xy is little endian packed + y := int(xy >> 16) + x := int(xy & 0xffff) + + if x == 0 || y == 0 { + return + } + + // This is a hacky workaround for Windows Terminal. + // Essentially Windows Terminal (Windows 11) does not support application + // initiated resizing. To detect this, we look for an extremely large size + // for the maximum width. If it is > 500, then this is almost certainly + // Windows Terminal, and won't support this. (Note that the legacy console + // does support application resizing.) + if x >= 500 { + return + } + + s.setBufferSize(x, y) + r := rect{0, 0, int16(w - 1), int16(h - 1)} + _, _, _ = procSetConsoleWindowInfo.Call( + uintptr(s.out), + uintptr(1), + uintptr(unsafe.Pointer(&r))) + + s.resize() +} + +func (s *cScreen) resize() { + info := consoleInfo{} + s.getConsoleInfo(&info) + + w := int((info.win.right - info.win.left) + 1) + h := int((info.win.bottom - info.win.top) + 1) + + if s.w == w && s.h == h { + return + } + + s.cells.Resize(w, h) + s.w = w + s.h = h + + s.setBufferSize(w, h) + + r := rect{0, 0, int16(w - 1), int16(h - 1)} + _, _, _ = procSetConsoleWindowInfo.Call( + uintptr(s.out), + uintptr(1), + uintptr(unsafe.Pointer(&r))) + select { + case s.eventQ <- NewEventResize(w, h): + default: + } +} + +func (s *cScreen) clearScreen(style Style, vtEnable bool) { + if vtEnable { + s.sendVtStyle(style) + row := strings.Repeat(" ", s.w) + for y := 0; y < s.h; y++ { + s.setCursorPos(0, y, vtEnable) + s.emitVtString(row) + } + s.setCursorPos(0, 0, vtEnable) + + } else { + pos := coord{0, 0} + attr := s.mapStyle(style) + x, y := s.w, s.h + scratch := uint32(0) + count := uint32(x * y) + + _, _, _ = procFillConsoleOutputAttribute.Call( + uintptr(s.out), + uintptr(attr), + uintptr(count), + pos.uintptr(), + uintptr(unsafe.Pointer(&scratch))) + _, _, _ = procFillConsoleOutputCharacter.Call( + uintptr(s.out), + uintptr(' '), + uintptr(count), + pos.uintptr(), + uintptr(unsafe.Pointer(&scratch))) + } +} + +const ( + // Input modes + modeExtendFlg uint32 = 0x0080 + modeMouseEn = 0x0010 + modeResizeEn = 0x0008 + // modeCooked = 0x0001 + // modeVtInput = 0x0200 + + // Output modes + modeCookedOut uint32 = 0x0001 + modeVtOutput = 0x0004 + modeNoAutoNL = 0x0008 + modeUnderline = 0x0010 // ENABLE_LVB_GRID_WORLDWIDE, needed for underlines + // modeWrapEOL = 0x0002 +) + +func (s *cScreen) setInMode(mode uint32) { + _, _, _ = procSetConsoleMode.Call( + uintptr(s.in), + uintptr(mode)) +} + +func (s *cScreen) setOutMode(mode uint32) { + _, _, _ = procSetConsoleMode.Call( + uintptr(s.out), + uintptr(mode)) +} + +func (s *cScreen) getInMode(v *uint32) { + _, _, _ = procGetConsoleMode.Call( + uintptr(s.in), + uintptr(unsafe.Pointer(v))) +} + +func (s *cScreen) getOutMode(v *uint32) { + _, _, _ = procGetConsoleMode.Call( + uintptr(s.out), + uintptr(unsafe.Pointer(v))) +} + +func (s *cScreen) SetStyle(style Style) { + s.Lock() + s.style = style + s.Unlock() +} + +func (s *cScreen) SetTitle(title string) { + s.Lock() + s.title = title + if s.vten { + s.emitVtString(fmt.Sprintf(vtSetTitle, title)) + } + s.Unlock() +} + +// No fallback rune support, since we have Unicode. Yay! + +func (s *cScreen) RegisterRuneFallback(_ rune, _ string) { +} + +func (s *cScreen) UnregisterRuneFallback(_ rune) { +} + +func (s *cScreen) CanDisplay(_ rune, _ bool) bool { + // We presume we can display anything -- we're Unicode. + // (Sadly this not precisely true. Combining characters are especially + // poorly supported under Windows.) + return true +} + +func (s *cScreen) HasMouse() bool { + return true +} + +func (s *cScreen) SetClipboard(_ []byte) { +} + +func (s *cScreen) GetClipboard() { +} + +func (s *cScreen) Resize(int, int, int, int) {} + +func (s *cScreen) HasKey(k Key) bool { + // Microsoft has codes for some keys, but they are unusual, + // so we don't include them. We include all the typical + // 101, 105 key layout keys. + valid := map[Key]bool{ + KeyBackspace: true, + KeyTab: true, + KeyEscape: true, + KeyPause: true, + KeyPrint: true, + KeyPgUp: true, + KeyPgDn: true, + KeyEnter: true, + KeyEnd: true, + KeyHome: true, + KeyLeft: true, + KeyUp: true, + KeyRight: true, + KeyDown: true, + KeyInsert: true, + KeyDelete: true, + KeyF1: true, + KeyF2: true, + KeyF3: true, + KeyF4: true, + KeyF5: true, + KeyF6: true, + KeyF7: true, + KeyF8: true, + KeyF9: true, + KeyF10: true, + KeyF11: true, + KeyF12: true, + KeyRune: true, + } + + return valid[k] +} + +func (s *cScreen) Beep() error { + // A simple beep. If the sound card is not available, the sound is generated + // using the speaker. + // + // Reference: + // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebeep + const simpleBeep = 0xffffffff + if rv, _, err := procMessageBeep.Call(simpleBeep); rv == 0 { + return err + } + return nil +} + +func (s *cScreen) Suspend() error { + s.disengage() + return nil +} + +func (s *cScreen) Resume() error { + return s.engage() +} + +func (s *cScreen) Tty() (Tty, bool) { + return nil, false +} + +func (s *cScreen) GetCells() *CellBuffer { + return &s.cells +} + +func (s *cScreen) EventQ() chan Event { + return s.eventQ +} + +func (s *cScreen) StopQ() <-chan struct{} { + return s.quit +} diff --git a/vendor/github.com/gdamore/tcell/v2/doc.go b/vendor/github.com/gdamore/tcell/v2/doc.go new file mode 100644 index 00000000..690dd27a --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/doc.go @@ -0,0 +1,47 @@ +// Copyright 2018 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package tcell provides a lower-level, portable API for building +// programs that interact with terminals or consoles. It works with +// both common (and many uncommon!) terminals or terminal emulators, +// and Windows console implementations. +// +// It provides support for up to 256 colors, text attributes, and box drawing +// elements. A database of terminals built from a real terminfo database +// is provided, along with code to generate new database entries. +// +// Tcell offers very rich support for mice, dependent upon the terminal +// of course. (Windows, XTerm, and iTerm 2 are known to work very well.) +// +// If the environment is not Unicode by default, such as an ISO8859 based +// locale or GB18030, Tcell can convert input and output, so that your +// terminal can operate in whatever locale is most convenient, while the +// application program can just assume "everything is UTF-8". Reasonable +// defaults are used for updating characters to something suitable for +// display. Unicode box drawing characters will be converted to use the +// alternate character set of your terminal, if native conversions are +// not available. If no ACS is available, then some ASCII fallbacks will +// be used. +// +// Note that support for non-UTF-8 locales (other than C) must be enabled +// by the application using RegisterEncoding() -- we don't have them all +// enabled by default to avoid bloating the application unnecessarily. +// (These days UTF-8 is good enough for almost everyone, and nobody should +// be using legacy locales anymore.) Also, actual glyphs for various code +// point will only be displayed if your terminal or emulator (or the font +// the emulator is using) supports them. +// +// A rich set of key codes is supported, with support for up to 65 function +// keys, and various other special keys. +package tcell diff --git a/vendor/github.com/gdamore/tcell/v2/encoding.go b/vendor/github.com/gdamore/tcell/v2/encoding.go new file mode 100644 index 00000000..b7644c27 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/encoding.go @@ -0,0 +1,140 @@ +// Copyright 2022 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "strings" + "sync" + + "golang.org/x/text/encoding" + + gencoding "github.com/gdamore/encoding" +) + +var encodings map[string]encoding.Encoding +var encodingLk sync.Mutex +var encodingFallback EncodingFallback = EncodingFallbackFail + +// RegisterEncoding may be called by the application to register an encoding. +// The presence of additional encodings will facilitate application usage with +// terminal environments where the I/O subsystem does not support Unicode. +// +// Windows systems use Unicode natively, and do not need any of the encoding +// subsystem when using Windows Console screens. +// +// Please see the Go documentation for golang.org/x/text/encoding -- most of +// the common ones exist already as stock variables. For example, ISO8859-15 +// can be registered using the following code: +// +// import "golang.org/x/text/encoding/charmap" +// +// ... +// RegisterEncoding("ISO8859-15", charmap.ISO8859_15) +// +// Aliases can be registered as well, for example "8859-15" could be an alias +// for "ISO8859-15". +// +// For POSIX systems, this package will check the environment variables +// LC_ALL, LC_CTYPE, and LANG (in that order) to determine the character set. +// These are expected to have the following pattern: +// +// $language[.$codeset[@$variant] +// +// We extract only the $codeset part, which will usually be something like +// UTF-8 or ISO8859-15 or KOI8-R. Note that if the locale is either "POSIX" +// or "C", then we assume US-ASCII (the POSIX 'portable character set' +// and assume all other characters are somehow invalid.) +// +// Modern POSIX systems and terminal emulators may use UTF-8, and for those +// systems, this API is also unnecessary. For example, Darwin (MacOS X) and +// modern Linux running modern xterm generally will out of the box without +// any of this. Use of UTF-8 is recommended when possible, as it saves +// quite a lot processing overhead. +// +// Note that some encodings are quite large (for example GB18030 which is a +// superset of Unicode) and so the application size can be expected to +// increase quite a bit as each encoding is added. + +// The East Asian encodings have been seen to add 100-200K per encoding to the +// size of the resulting binary. +func RegisterEncoding(charset string, enc encoding.Encoding) { + encodingLk.Lock() + charset = strings.ToLower(charset) + encodings[charset] = enc + encodingLk.Unlock() +} + +// EncodingFallback describes how the system behaves when the locale +// requires a character set that we do not support. The system always +// supports UTF-8 and US-ASCII. On Windows consoles, UTF-16LE is also +// supported automatically. Other character sets must be added using the +// RegisterEncoding API. (A large group of nearly all of them can be +// added using the RegisterAll function in the encoding sub package.) +type EncodingFallback int + +const ( + // EncodingFallbackFail behavior causes GetEncoding to fail + // when it cannot find an encoding. + EncodingFallbackFail = iota + + // EncodingFallbackASCII behavior causes GetEncoding to fall back + // to a 7-bit ASCII encoding, if no other encoding can be found. + EncodingFallbackASCII + + // EncodingFallbackUTF8 behavior causes GetEncoding to assume + // UTF8 can pass unmodified upon failure. Note that this behavior + // is not recommended, unless you are sure your terminal can cope + // with real UTF8 sequences. + EncodingFallbackUTF8 +) + +// SetEncodingFallback changes the behavior of GetEncoding when a suitable +// encoding is not found. The default is EncodingFallbackFail, which +// causes GetEncoding to simply return nil. +func SetEncodingFallback(fb EncodingFallback) { + encodingLk.Lock() + encodingFallback = fb + encodingLk.Unlock() +} + +// GetEncoding is used by Screen implementors who want to locate an encoding +// for the given character set name. Note that this will return nil for +// either the Unicode (UTF-8) or ASCII encodings, since we don't use +// encodings for them but instead have our own native methods. +func GetEncoding(charset string) encoding.Encoding { + charset = strings.ToLower(charset) + encodingLk.Lock() + defer encodingLk.Unlock() + if enc, ok := encodings[charset]; ok { + return enc + } + switch encodingFallback { + case EncodingFallbackASCII: + return gencoding.ASCII + case EncodingFallbackUTF8: + return encoding.Nop + } + return nil +} + +func init() { + // We always support UTF-8 and ASCII. + encodings = make(map[string]encoding.Encoding) + encodings["utf-8"] = gencoding.UTF8 + encodings["utf8"] = gencoding.UTF8 + encodings["us-ascii"] = gencoding.ASCII + encodings["ascii"] = gencoding.ASCII + encodings["iso646"] = gencoding.ASCII +} diff --git a/vendor/github.com/gdamore/tcell/v2/errors.go b/vendor/github.com/gdamore/tcell/v2/errors.go new file mode 100644 index 00000000..201dff9f --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/errors.go @@ -0,0 +1,73 @@ +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "errors" + "time" + + "github.com/gdamore/tcell/v2/terminfo" +) + +var ( + // ErrTermNotFound indicates that a suitable terminal entry could + // not be found. This can result from either not having TERM set, + // or from the TERM failing to support certain minimal functionality, + // in particular absolute cursor addressability (the cup capability) + // is required. For example, legacy "adm3" lacks this capability, + // whereas the slightly newer "adm3a" supports it. This failure + // occurs most often with "dumb". + ErrTermNotFound = terminfo.ErrTermNotFound + + // ErrNoScreen indicates that no suitable screen could be found. + // This may result from attempting to run on a platform where there + // is no support for either termios or console I/O (such as nacl), + // or from running in an environment where there is no access to + // a suitable console/terminal device. (For example, running on + // without a controlling TTY or with no /dev/tty on POSIX platforms.) + ErrNoScreen = errors.New("no suitable screen available") + + // ErrNoCharset indicates that the locale environment the + // program is not supported by the program, because no suitable + // encoding was found for it. This problem never occurs if + // the environment is UTF-8 or UTF-16. + ErrNoCharset = errors.New("character set not supported") + + // ErrEventQFull indicates that the event queue is full, and + // cannot accept more events. + ErrEventQFull = errors.New("event queue full") +) + +// An EventError is an event representing some sort of error, and carries +// an error payload. +type EventError struct { + t time.Time + err error +} + +// When returns the time when the event was created. +func (ev *EventError) When() time.Time { + return ev.t +} + +// Error implements the error. +func (ev *EventError) Error() string { + return ev.err.Error() +} + +// NewEventError creates an ErrorEvent with the given error payload. +func NewEventError(err error) *EventError { + return &EventError{t: time.Now(), err: err} +} diff --git a/vendor/github.com/gdamore/tcell/v2/event.go b/vendor/github.com/gdamore/tcell/v2/event.go new file mode 100644 index 00000000..a3b77006 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/event.go @@ -0,0 +1,53 @@ +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "time" +) + +// Event is a generic interface used for passing around Events. +// Concrete types follow. +type Event interface { + // When reports the time when the event was generated. + When() time.Time +} + +// EventTime is a simple base event class, suitable for easy reuse. +// It can be used to deliver actual timer events as well. +type EventTime struct { + when time.Time +} + +// When returns the time stamp when the event occurred. +func (e *EventTime) When() time.Time { + return e.when +} + +// SetEventTime sets the time of occurrence for the event. +func (e *EventTime) SetEventTime(t time.Time) { + e.when = t +} + +// SetEventNow sets the time of occurrence for the event to the current time. +func (e *EventTime) SetEventNow() { + e.SetEventTime(time.Now()) +} + +// EventHandler is anything that handles events. If the handler has +// consumed the event, it should return true. False otherwise. +type EventHandler interface { + HandleEvent(Event) bool +} diff --git a/vendor/github.com/gdamore/tcell/v2/focus.go b/vendor/github.com/gdamore/tcell/v2/focus.go new file mode 100644 index 00000000..e9b93ef6 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/focus.go @@ -0,0 +1,28 @@ +// Copyright 2023 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +// EventFocus is a focus event. It is sent when the terminal window (or tab) +// gets or loses focus. +type EventFocus struct { + *EventTime + + // True if the window received focus, false if it lost focus + Focused bool +} + +func NewEventFocus(focused bool) *EventFocus { + return &EventFocus{Focused: focused} +} diff --git a/vendor/github.com/gdamore/tcell/v2/interrupt.go b/vendor/github.com/gdamore/tcell/v2/interrupt.go new file mode 100644 index 00000000..70dddfce --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/interrupt.go @@ -0,0 +1,41 @@ +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "time" +) + +// EventInterrupt is a generic wakeup event. Its can be used to +// to request a redraw. It can carry an arbitrary payload, as well. +type EventInterrupt struct { + t time.Time + v interface{} +} + +// When returns the time when this event was created. +func (ev *EventInterrupt) When() time.Time { + return ev.t +} + +// Data is used to obtain the opaque event payload. +func (ev *EventInterrupt) Data() interface{} { + return ev.v +} + +// NewEventInterrupt creates an EventInterrupt with the given payload. +func NewEventInterrupt(data interface{}) *EventInterrupt { + return &EventInterrupt{t: time.Now(), v: data} +} diff --git a/vendor/github.com/gdamore/tcell/v2/key.go b/vendor/github.com/gdamore/tcell/v2/key.go new file mode 100644 index 00000000..9741e699 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/key.go @@ -0,0 +1,470 @@ +// Copyright 2016 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "fmt" + "strings" + "time" +) + +// EventKey represents a key press. Usually this is a key press followed +// by a key release, but since terminal programs don't have a way to report +// key release events, we usually get just one event. If a key is held down +// then the terminal may synthesize repeated key presses at some predefined +// rate. We have no control over that, nor visibility into it. +// +// In some cases, we can have a modifier key, such as ModAlt, that can be +// generated with a key press. (This usually is represented by having the +// high bit set, or in some cases, by sending an ESC prior to the rune.) +// +// If the value of Key() is KeyRune, then the actual key value will be +// available with the Rune() method. This will be the case for most keys. +// In most situations, the modifiers will not be set. For example, if the +// rune is 'A', this will be reported without the ModShift bit set, since +// really can't tell if the Shift key was pressed (it might have been CAPSLOCK, +// or a terminal that only can send capitals, or keyboard with separate +// capital letters from lower case letters). +// +// Generally, terminal applications have far less visibility into keyboard +// activity than graphical applications. Hence, they should avoid depending +// overly much on availability of modifiers, or the availability of any +// specific keys. +type EventKey struct { + t time.Time + mod ModMask + key Key + ch rune +} + +// When returns the time when this Event was created, which should closely +// match the time when the key was pressed. +func (ev *EventKey) When() time.Time { + return ev.t +} + +// Rune returns the rune corresponding to the key press, if it makes sense. +// The result is only defined if the value of Key() is KeyRune. +func (ev *EventKey) Rune() rune { + return ev.ch +} + +// Key returns a virtual key code. We use this to identify specific key +// codes, such as KeyEnter, etc. Most control and function keys are reported +// with unique Key values. Normal alphanumeric and punctuation keys will +// generally return KeyRune here; the specific key can be further decoded +// using the Rune() function. +func (ev *EventKey) Key() Key { + return ev.key +} + +// Modifiers returns the modifiers that were present with the key press. Note +// that not all platforms and terminals support this equally well, and some +// cases we will not not know for sure. Hence, applications should avoid +// using this in most circumstances. +func (ev *EventKey) Modifiers() ModMask { + return ev.mod +} + +// KeyNames holds the written names of special keys. Useful to echo back a key +// name, or to look up a key from a string value. +var KeyNames = map[Key]string{ + KeyEnter: "Enter", + KeyBackspace: "Backspace", + KeyTab: "Tab", + KeyBacktab: "Backtab", + KeyEsc: "Esc", + KeyBackspace2: "Backspace2", + KeyDelete: "Delete", + KeyInsert: "Insert", + KeyUp: "Up", + KeyDown: "Down", + KeyLeft: "Left", + KeyRight: "Right", + KeyHome: "Home", + KeyEnd: "End", + KeyUpLeft: "UpLeft", + KeyUpRight: "UpRight", + KeyDownLeft: "DownLeft", + KeyDownRight: "DownRight", + KeyCenter: "Center", + KeyPgDn: "PgDn", + KeyPgUp: "PgUp", + KeyClear: "Clear", + KeyExit: "Exit", + KeyCancel: "Cancel", + KeyPause: "Pause", + KeyPrint: "Print", + KeyF1: "F1", + KeyF2: "F2", + KeyF3: "F3", + KeyF4: "F4", + KeyF5: "F5", + KeyF6: "F6", + KeyF7: "F7", + KeyF8: "F8", + KeyF9: "F9", + KeyF10: "F10", + KeyF11: "F11", + KeyF12: "F12", + KeyF13: "F13", + KeyF14: "F14", + KeyF15: "F15", + KeyF16: "F16", + KeyF17: "F17", + KeyF18: "F18", + KeyF19: "F19", + KeyF20: "F20", + KeyF21: "F21", + KeyF22: "F22", + KeyF23: "F23", + KeyF24: "F24", + KeyF25: "F25", + KeyF26: "F26", + KeyF27: "F27", + KeyF28: "F28", + KeyF29: "F29", + KeyF30: "F30", + KeyF31: "F31", + KeyF32: "F32", + KeyF33: "F33", + KeyF34: "F34", + KeyF35: "F35", + KeyF36: "F36", + KeyF37: "F37", + KeyF38: "F38", + KeyF39: "F39", + KeyF40: "F40", + KeyF41: "F41", + KeyF42: "F42", + KeyF43: "F43", + KeyF44: "F44", + KeyF45: "F45", + KeyF46: "F46", + KeyF47: "F47", + KeyF48: "F48", + KeyF49: "F49", + KeyF50: "F50", + KeyF51: "F51", + KeyF52: "F52", + KeyF53: "F53", + KeyF54: "F54", + KeyF55: "F55", + KeyF56: "F56", + KeyF57: "F57", + KeyF58: "F58", + KeyF59: "F59", + KeyF60: "F60", + KeyF61: "F61", + KeyF62: "F62", + KeyF63: "F63", + KeyF64: "F64", + KeyCtrlA: "Ctrl-A", + KeyCtrlB: "Ctrl-B", + KeyCtrlC: "Ctrl-C", + KeyCtrlD: "Ctrl-D", + KeyCtrlE: "Ctrl-E", + KeyCtrlF: "Ctrl-F", + KeyCtrlG: "Ctrl-G", + KeyCtrlJ: "Ctrl-J", + KeyCtrlK: "Ctrl-K", + KeyCtrlL: "Ctrl-L", + KeyCtrlN: "Ctrl-N", + KeyCtrlO: "Ctrl-O", + KeyCtrlP: "Ctrl-P", + KeyCtrlQ: "Ctrl-Q", + KeyCtrlR: "Ctrl-R", + KeyCtrlS: "Ctrl-S", + KeyCtrlT: "Ctrl-T", + KeyCtrlU: "Ctrl-U", + KeyCtrlV: "Ctrl-V", + KeyCtrlW: "Ctrl-W", + KeyCtrlX: "Ctrl-X", + KeyCtrlY: "Ctrl-Y", + KeyCtrlZ: "Ctrl-Z", + KeyCtrlSpace: "Ctrl-Space", + KeyCtrlUnderscore: "Ctrl-_", + KeyCtrlRightSq: "Ctrl-]", + KeyCtrlBackslash: "Ctrl-\\", + KeyCtrlCarat: "Ctrl-^", +} + +// Name returns a printable value or the key stroke. This can be used +// when printing the event, for example. +func (ev *EventKey) Name() string { + s := "" + m := []string{} + if ev.mod&ModShift != 0 { + m = append(m, "Shift") + } + if ev.mod&ModAlt != 0 { + m = append(m, "Alt") + } + if ev.mod&ModMeta != 0 { + m = append(m, "Meta") + } + if ev.mod&ModCtrl != 0 { + m = append(m, "Ctrl") + } + + ok := false + if s, ok = KeyNames[ev.key]; !ok { + if ev.key == KeyRune { + s = "Rune[" + string(ev.ch) + "]" + } else { + s = fmt.Sprintf("Key[%d,%d]", ev.key, int(ev.ch)) + } + } + if len(m) != 0 { + if ev.mod&ModCtrl != 0 && strings.HasPrefix(s, "Ctrl-") { + s = s[5:] + } + return fmt.Sprintf("%s+%s", strings.Join(m, "+"), s) + } + return s +} + +// NewEventKey attempts to create a suitable event. It parses the various +// ASCII control sequences if KeyRune is passed for Key, but if the caller +// has more precise information it should set that specifically. Callers +// that aren't sure about modifier state (most) should just pass ModNone. +func NewEventKey(k Key, ch rune, mod ModMask) *EventKey { + if k == KeyRune && (ch < ' ' || ch == 0x7f) { + // Turn specials into proper key codes. This is for + // control characters and the DEL. + k = Key(ch) + if mod == ModNone && ch < ' ' { + switch Key(ch) { + case KeyBackspace, KeyTab, KeyEsc, KeyEnter: + // these keys are directly typeable without CTRL + default: + // most likely entered with a CTRL keypress + mod = ModCtrl + } + } + } + return &EventKey{t: time.Now(), key: k, ch: ch, mod: mod} +} + +// ModMask is a mask of modifier keys. Note that it will not always be +// possible to report modifier keys. +type ModMask int16 + +// These are the modifiers keys that can be sent either with a key press, +// or a mouse event. Note that as of now, due to the confusion associated +// with Meta, and the lack of support for it on many/most platforms, the +// current implementations never use it. Instead, they use ModAlt, even for +// events that could possibly have been distinguished from ModAlt. +const ( + ModShift ModMask = 1 << iota + ModCtrl + ModAlt + ModMeta + ModNone ModMask = 0 +) + +// Key is a generic value for representing keys, and especially special +// keys (function keys, cursor movement keys, etc.) For normal keys, like +// ASCII letters, we use KeyRune, and then expect the application to +// inspect the Rune() member of the EventKey. +type Key int16 + +// This is the list of named keys. KeyRune is special however, in that it is +// a place holder key indicating that a printable character was sent. The +// actual value of the rune will be transported in the Rune of the associated +// EventKey. +const ( + KeyRune Key = iota + 256 + KeyUp + KeyDown + KeyRight + KeyLeft + KeyUpLeft + KeyUpRight + KeyDownLeft + KeyDownRight + KeyCenter + KeyPgUp + KeyPgDn + KeyHome + KeyEnd + KeyInsert + KeyDelete + KeyHelp + KeyExit + KeyClear + KeyCancel + KeyPrint + KeyPause + KeyBacktab + KeyF1 + KeyF2 + KeyF3 + KeyF4 + KeyF5 + KeyF6 + KeyF7 + KeyF8 + KeyF9 + KeyF10 + KeyF11 + KeyF12 + KeyF13 + KeyF14 + KeyF15 + KeyF16 + KeyF17 + KeyF18 + KeyF19 + KeyF20 + KeyF21 + KeyF22 + KeyF23 + KeyF24 + KeyF25 + KeyF26 + KeyF27 + KeyF28 + KeyF29 + KeyF30 + KeyF31 + KeyF32 + KeyF33 + KeyF34 + KeyF35 + KeyF36 + KeyF37 + KeyF38 + KeyF39 + KeyF40 + KeyF41 + KeyF42 + KeyF43 + KeyF44 + KeyF45 + KeyF46 + KeyF47 + KeyF48 + KeyF49 + KeyF50 + KeyF51 + KeyF52 + KeyF53 + KeyF54 + KeyF55 + KeyF56 + KeyF57 + KeyF58 + KeyF59 + KeyF60 + KeyF61 + KeyF62 + KeyF63 + KeyF64 +) + +const ( + // These key codes are used internally, and will never appear to applications. + keyPasteStart Key = iota + 16384 + keyPasteEnd +) + +// These are the control keys. Note that they overlap with other keys, +// perhaps. For example, KeyCtrlH is the same as KeyBackspace. +const ( + KeyCtrlSpace Key = iota + KeyCtrlA + KeyCtrlB + KeyCtrlC + KeyCtrlD + KeyCtrlE + KeyCtrlF + KeyCtrlG + KeyCtrlH + KeyCtrlI + KeyCtrlJ + KeyCtrlK + KeyCtrlL + KeyCtrlM + KeyCtrlN + KeyCtrlO + KeyCtrlP + KeyCtrlQ + KeyCtrlR + KeyCtrlS + KeyCtrlT + KeyCtrlU + KeyCtrlV + KeyCtrlW + KeyCtrlX + KeyCtrlY + KeyCtrlZ + KeyCtrlLeftSq // Escape + KeyCtrlBackslash + KeyCtrlRightSq + KeyCtrlCarat + KeyCtrlUnderscore +) + +// Special values - these are fixed in an attempt to make it more likely +// that aliases will encode the same way. + +// These are the defined ASCII values for key codes. They generally match +// with KeyCtrl values. +const ( + KeyNUL Key = iota + KeySOH + KeySTX + KeyETX + KeyEOT + KeyENQ + KeyACK + KeyBEL + KeyBS + KeyTAB + KeyLF + KeyVT + KeyFF + KeyCR + KeySO + KeySI + KeyDLE + KeyDC1 + KeyDC2 + KeyDC3 + KeyDC4 + KeyNAK + KeySYN + KeyETB + KeyCAN + KeyEM + KeySUB + KeyESC + KeyFS + KeyGS + KeyRS + KeyUS + KeyDEL Key = 0x7F +) + +// These keys are aliases for other names. +const ( + KeyBackspace = KeyBS + KeyTab = KeyTAB + KeyEsc = KeyESC + KeyEscape = KeyESC + KeyEnter = KeyCR + KeyBackspace2 = KeyDEL +) diff --git a/vendor/github.com/gdamore/tcell/v2/mouse.go b/vendor/github.com/gdamore/tcell/v2/mouse.go new file mode 100644 index 00000000..008c2e26 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/mouse.go @@ -0,0 +1,103 @@ +// Copyright 2020 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "time" +) + +// EventMouse is a mouse event. It is sent on either mouse up or mouse down +// events. It is also sent on mouse motion events - if the terminal supports +// it. We make every effort to ensure that mouse release events are delivered. +// Hence, click drag can be identified by a motion event with the mouse down, +// without any intervening button release. On some terminals only the initiating +// press and terminating release event will be delivered. +// +// Mouse wheel events, when reported, may appear on their own as individual +// impulses; that is, there will normally not be a release event delivered +// for mouse wheel movements. +// +// Most terminals cannot report the state of more than one button at a time -- +// and some cannot report motion events unless a button is pressed. +// +// Applications can inspect the time between events to resolve double or +// triple clicks. +type EventMouse struct { + t time.Time + btn ButtonMask + mod ModMask + x int + y int +} + +// When returns the time when this EventMouse was created. +func (ev *EventMouse) When() time.Time { + return ev.t +} + +// Buttons returns the list of buttons that were pressed or wheel motions. +func (ev *EventMouse) Buttons() ButtonMask { + return ev.btn +} + +// Modifiers returns a list of keyboard modifiers that were pressed +// with the mouse button(s). +func (ev *EventMouse) Modifiers() ModMask { + return ev.mod +} + +// Position returns the mouse position in character cells. The origin +// 0, 0 is at the upper left corner. +func (ev *EventMouse) Position() (int, int) { + return ev.x, ev.y +} + +// NewEventMouse is used to create a new mouse event. Applications +// shouldn't need to use this; its mostly for screen implementors. +func NewEventMouse(x, y int, btn ButtonMask, mod ModMask) *EventMouse { + return &EventMouse{t: time.Now(), x: x, y: y, btn: btn, mod: mod} +} + +// ButtonMask is a mask of mouse buttons and wheel events. Mouse button presses +// are normally delivered as both press and release events. Mouse wheel events +// are normally just single impulse events. Windows supports up to eight +// separate buttons plus all four wheel directions, but XTerm can only support +// mouse buttons 1-3 and wheel up/down. Its not unheard of for terminals +// to support only one or two buttons (think Macs). Old terminals, and true +// emulations (such as vt100) won't support mice at all, of course. +type ButtonMask int16 + +// These are the actual button values. Note that tcell version 1.x reversed buttons +// two and three on *nix based terminals. We use button 1 as the primary, and +// button 2 as the secondary, and button 3 (which is often missing) as the middle. +const ( + Button1 ButtonMask = 1 << iota // Usually the left (primary) mouse button. + Button2 // Usually the right (secondary) mouse button. + Button3 // Usually the middle mouse button. + Button4 // Often a side button (thumb/next). + Button5 // Often a side button (thumb/prev). + Button6 + Button7 + Button8 + WheelUp // Wheel motion up/away from user. + WheelDown // Wheel motion down/towards user. + WheelLeft // Wheel motion to left. + WheelRight // Wheel motion to right. + ButtonNone ButtonMask = 0 // No button or wheel events. + + ButtonPrimary = Button1 + ButtonSecondary = Button2 + ButtonMiddle = Button3 +) diff --git a/vendor/github.com/gdamore/tcell/v2/nonblock_bsd.go b/vendor/github.com/gdamore/tcell/v2/nonblock_bsd.go new file mode 100644 index 00000000..622888e3 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/nonblock_bsd.go @@ -0,0 +1,43 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build darwin || dragonfly || freebsd || netbsd || openbsd +// +build darwin dragonfly freebsd netbsd openbsd + +package tcell + +import ( + "syscall" + + "golang.org/x/sys/unix" +) + +// BSD systems use TIOC style ioctls. + +// tcSetBufParams is used by the tty driver on UNIX systems to configure the +// buffering parameters (minimum character count and minimum wait time in msec.) +// This also waits for output to drain first. +func tcSetBufParams(fd int, vMin uint8, vTime uint8) error { + _ = syscall.SetNonblock(fd, true) + tio, err := unix.IoctlGetTermios(fd, unix.TIOCGETA) + if err != nil { + return err + } + tio.Cc[unix.VMIN] = vMin + tio.Cc[unix.VTIME] = vTime + if err = unix.IoctlSetTermios(fd, unix.TIOCSETAW, tio); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/nonblock_unix.go b/vendor/github.com/gdamore/tcell/v2/nonblock_unix.go new file mode 100644 index 00000000..160a6419 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/nonblock_unix.go @@ -0,0 +1,41 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux || aix || zos || solaris +// +build linux aix zos solaris + +package tcell + +import ( + "syscall" + + "golang.org/x/sys/unix" +) + +// tcSetBufParams is used by the tty driver on UNIX systems to configure the +// buffering parameters (minimum character count and minimum wait time in msec.) +// This also waits for output to drain first. +func tcSetBufParams(fd int, vMin uint8, vTime uint8) error { + _ = syscall.SetNonblock(fd, true) + tio, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return err + } + tio.Cc[unix.VMIN] = vMin + tio.Cc[unix.VTIME] = vTime + if err = unix.IoctlSetTermios(fd, unix.TCSETSW, tio); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/paste.go b/vendor/github.com/gdamore/tcell/v2/paste.go new file mode 100644 index 00000000..f511f63c --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/paste.go @@ -0,0 +1,72 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "time" +) + +// EventPaste is used to mark the start and end of a bracketed paste. +// +// An event with .Start() true will be sent to mark the start of a bracketed paste, +// followed by a number of keys (string data) for the content, ending with the +// an event with .End() true. +type EventPaste struct { + start bool + t time.Time + data []byte +} + +// When returns the time when this EventPaste was created. +func (ev *EventPaste) When() time.Time { + return ev.t +} + +// Start returns true if this is the start of a paste. +func (ev *EventPaste) Start() bool { + return ev.start +} + +// End returns true if this is the end of a paste. +func (ev *EventPaste) End() bool { + return !ev.start +} + +// NewEventPaste returns a new EventPaste. +func NewEventPaste(start bool) *EventPaste { + return &EventPaste{t: time.Now(), start: start} +} + +// NewEventClipboard returns a new NewEventClipboard with a data payload +func NewEventClipboard(data []byte) *EventClipboard { + return &EventClipboard{t: time.Now(), data: data} +} + +// EventClipboard represents data from the clipboard, +// in response to a GetClipboard request. +type EventClipboard struct { + t time.Time + data []byte +} + +// Data returns the attached binary data. +func (ev *EventClipboard) Data() []byte { + return ev.data +} + +// When returns the time when this event was created. +func (ev *EventClipboard) When() time.Time { + return ev.t +} diff --git a/vendor/github.com/gdamore/tcell/v2/resize.go b/vendor/github.com/gdamore/tcell/v2/resize.go new file mode 100644 index 00000000..f3e2b3a5 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/resize.go @@ -0,0 +1,66 @@ +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "time" +) + +// EventResize is sent when the window size changes. +type EventResize struct { + t time.Time + ws WindowSize +} + +// NewEventResize creates an EventResize with the new updated window size, +// which is given in character cells. +func NewEventResize(width, height int) *EventResize { + ws := WindowSize{ + Width: width, + Height: height, + } + return &EventResize{t: time.Now(), ws: ws} +} + +// When returns the time when the Event was created. +func (ev *EventResize) When() time.Time { + return ev.t +} + +// Size returns the new window size as width, height in character cells. +func (ev *EventResize) Size() (int, int) { + return ev.ws.Width, ev.ws.Height +} + +// PixelSize returns the new window size as width, height in pixels. The size +// will be 0,0 if the screen doesn't support this feature +func (ev *EventResize) PixelSize() (int, int) { + return ev.ws.PixelWidth, ev.ws.PixelHeight +} + +type WindowSize struct { + Width int + Height int + PixelWidth int + PixelHeight int +} + +// CellDimensions returns the dimensions of a single cell, in pixels +func (ws WindowSize) CellDimensions() (int, int) { + if ws.PixelWidth == 0 || ws.PixelHeight == 0 { + return 0, 0 + } + return (ws.PixelWidth / ws.Width), (ws.PixelHeight / ws.Height) +} diff --git a/vendor/github.com/gdamore/tcell/v2/runes.go b/vendor/github.com/gdamore/tcell/v2/runes.go new file mode 100644 index 00000000..ed9c63b5 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/runes.go @@ -0,0 +1,111 @@ +// Copyright 2015 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +// The names of these constants are chosen to match Terminfo names, +// modulo case, and changing the prefix from ACS_ to Rune. These are +// the runes we provide extra special handling for, with ASCII fallbacks +// for terminals that lack them. +const ( + RuneSterling = '£' + RuneDArrow = '↓' + RuneLArrow = '←' + RuneRArrow = '→' + RuneUArrow = '↑' + RuneBullet = '·' + RuneBoard = '░' + RuneCkBoard = '▒' + RuneDegree = '°' + RuneDiamond = '◆' + RuneGEqual = '≥' + RunePi = 'π' + RuneHLine = '─' + RuneLantern = '§' + RunePlus = '┼' + RuneLEqual = '≤' + RuneLLCorner = '└' + RuneLRCorner = '┘' + RuneNEqual = '≠' + RunePlMinus = '±' + RuneS1 = '⎺' + RuneS3 = '⎻' + RuneS7 = '⎼' + RuneS9 = '⎽' + RuneBlock = '█' + RuneTTee = '┬' + RuneRTee = '┤' + RuneLTee = '├' + RuneBTee = '┴' + RuneULCorner = '┌' + RuneURCorner = '┐' + RuneVLine = '│' +) + +// RuneFallbacks is the default map of fallback strings that will be +// used to replace a rune when no other more appropriate transformation +// is available, and the rune cannot be displayed directly. +// +// New entries may be added to this map over time, as it becomes clear +// that such is desirable. Characters that represent either letters or +// numbers should not be added to this list unless it is certain that +// the meaning will still convey unambiguously. +// +// As an example, it would be appropriate to add an ASCII mapping for +// the full width form of the letter 'A', but it would not be appropriate +// to do so a glyph representing the country China. +// +// Programs that desire richer fallbacks may register additional ones, +// or change or even remove these mappings with Screen.RegisterRuneFallback +// Screen.UnregisterRuneFallback methods. +// +// Note that Unicode is presumed to be able to display all glyphs. +// This is a pretty poor assumption, but there is no easy way to +// figure out which glyphs are supported in a given font. Hence, +// some care in selecting the characters you support in your application +// is still appropriate. +var RuneFallbacks = map[rune]string{ + RuneSterling: "f", + RuneDArrow: "v", + RuneLArrow: "<", + RuneRArrow: ">", + RuneUArrow: "^", + RuneBullet: "o", + RuneBoard: "#", + RuneCkBoard: ":", + RuneDegree: "\\", + RuneDiamond: "+", + RuneGEqual: ">", + RunePi: "*", + RuneHLine: "-", + RuneLantern: "#", + RunePlus: "+", + RuneLEqual: "<", + RuneLLCorner: "+", + RuneLRCorner: "+", + RuneNEqual: "!", + RunePlMinus: "#", + RuneS1: "~", + RuneS3: "-", + RuneS7: "-", + RuneS9: "_", + RuneBlock: "#", + RuneTTee: "+", + RuneRTee: "+", + RuneLTee: "+", + RuneBTee: "+", + RuneULCorner: "+", + RuneURCorner: "+", + RuneVLine: "|", +} diff --git a/vendor/github.com/gdamore/tcell/v2/screen.go b/vendor/github.com/gdamore/tcell/v2/screen.go new file mode 100644 index 00000000..18dc5519 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/screen.go @@ -0,0 +1,495 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import "sync" + +// Screen represents the physical (or emulated) screen. +// This can be a terminal window or a physical console. Platforms implement +// this differently. +type Screen interface { + // Init initializes the screen for use. + Init() error + + // Fini finalizes the screen also releasing resources. + Fini() + + // Clear logically erases the screen. + // This is effectively a short-cut for Fill(' ', StyleDefault). + Clear() + + // Fill fills the screen with the given character and style. + // The effect of filling the screen is not visible until Show + // is called (or Sync). + Fill(rune, Style) + + // SetCell is an older API, and will be removed. Please use + // SetContent instead; SetCell is implemented in terms of SetContent. + SetCell(x int, y int, style Style, ch ...rune) + + // GetContent returns the contents at the given location. If the + // coordinates are out of range, then the values will be 0, nil, + // StyleDefault. Note that the contents returned are logical contents + // and may not actually be what is displayed, but rather are what will + // be displayed if Show() or Sync() is called. The width is the width + // in screen cells; most often this will be 1, but some East Asian + // characters and emoji require two cells. + GetContent(x, y int) (primary rune, combining []rune, style Style, width int) + + // SetContent sets the contents of the given cell location. If + // the coordinates are out of range, then the operation is ignored. + // + // The first rune is the primary non-zero width rune. The array + // that follows is a possible list of combining characters to append, + // and will usually be nil (no combining characters.) + // + // The results are not displayed until Show() or Sync() is called. + // + // Note that wide (East Asian full width and emoji) runes occupy two cells, + // and attempts to place character at next cell to the right will have + // undefined effects. Wide runes that are printed in the + // last column will be replaced with a single width space on output. + SetContent(x int, y int, primary rune, combining []rune, style Style) + + // SetStyle sets the default style to use when clearing the screen + // or when StyleDefault is specified. If it is also StyleDefault, + // then whatever system/terminal default is relevant will be used. + SetStyle(style Style) + + // ShowCursor is used to display the cursor at a given location. + // If the coordinates -1, -1 are given or are otherwise outside the + // dimensions of the screen, the cursor will be hidden. + ShowCursor(x int, y int) + + // HideCursor is used to hide the cursor. It's an alias for + // ShowCursor(-1, -1).sim + HideCursor() + + // SetCursorStyle is used to set the cursor style. If the style + // is not supported (or cursor styles are not supported at all), + // then this will have no effect. Color will be changed if supplied, + // and the terminal supports doing so. + SetCursorStyle(CursorStyle, ...Color) + + // Size returns the screen size as width, height. This changes in + // response to a call to Clear or Flush. + Size() (width, height int) + + // ChannelEvents is an infinite loop that waits for an event and + // channels it into the user provided channel ch. Closing the + // quit channel and calling the Fini method are cancellation + // signals. When a cancellation signal is received the method + // returns after closing ch. + // + // This method should be used as a goroutine. + // + // NOTE: PollEvent should not be called while this method is running. + ChannelEvents(ch chan<- Event, quit <-chan struct{}) + + // PollEvent waits for events to arrive. Main application loops + // must spin on this to prevent the application from stalling. + // Furthermore, this will return nil if the Screen is finalized. + PollEvent() Event + + // HasPendingEvent returns true if PollEvent would return an event + // without blocking. If the screen is stopped and PollEvent would + // return nil, then the return value from this function is unspecified. + // The purpose of this function is to allow multiple events to be collected + // at once, to minimize screen redraws. + HasPendingEvent() bool + + // PostEvent tries to post an event into the event stream. This + // can fail if the event queue is full. In that case, the event + // is dropped, and ErrEventQFull is returned. + PostEvent(ev Event) error + + // Deprecated: PostEventWait is unsafe, and will be removed + // in the future. + // + // PostEventWait is like PostEvent, but if the queue is full, it + // blocks until there is space in the queue, making delivery + // reliable. However, it is VERY important that this function + // never be called from within whatever event loop is polling + // with PollEvent(), otherwise a deadlock may arise. + // + // For this reason, when using this function, the use of a + // Goroutine is recommended to ensure no deadlock can occur. + PostEventWait(ev Event) + + // EnableMouse enables the mouse. (If your terminal supports it.) + // If no flags are specified, then all events are reported, if the + // terminal supports them. + EnableMouse(...MouseFlags) + + // DisableMouse disables the mouse. + DisableMouse() + + // EnablePaste enables bracketed paste mode, if supported. + EnablePaste() + + // DisablePaste disables bracketed paste mode. + DisablePaste() + + // EnableFocus enables reporting of focus events, if your terminal supports it. + EnableFocus() + + // DisableFocus disables reporting of focus events. + DisableFocus() + + // HasMouse returns true if the terminal (apparently) supports a + // mouse. Note that the return value of true doesn't guarantee that + // a mouse/pointing device is present; a false return definitely + // indicates no mouse support is available. + HasMouse() bool + + // Colors returns the number of colors. All colors are assumed to + // use the ANSI color map. If a terminal is monochrome, it will + // return 0. + Colors() int + + // Show makes all the content changes made using SetContent() visible + // on the display. + // + // It does so in the most efficient and least visually disruptive + // manner possible. + Show() + + // Sync works like Show(), but it updates every visible cell on the + // physical display, assuming that it is not synchronized with any + // internal model. This may be both expensive and visually jarring, + // so it should only be used when believed to actually be necessary. + // + // Typically, this is called as a result of a user-requested redraw + // (e.g. to clear up on-screen corruption caused by some other program), + // or during a resize event. + Sync() + + // CharacterSet returns information about the character set. + // This isn't the full locale, but it does give us the input/output + // character set. Note that this is just for diagnostic purposes, + // we normally translate input/output to/from UTF-8, regardless of + // what the user's environment is. + CharacterSet() string + + // RegisterRuneFallback adds a fallback for runes that are not + // part of the character set -- for example one could register + // o as a fallback for ø. This should be done cautiously for + // characters that might be displayed ordinarily in language + // specific text -- characters that could change the meaning of + // written text would be dangerous. The intention here is to + // facilitate fallback characters in pseudo-graphical applications. + // + // If the terminal has fallbacks already in place via an alternate + // character set, those are used in preference. Also, standard + // fallbacks for graphical characters in the alternate character set + // terminfo string are registered implicitly. + // + // The display string should be the same width as original rune. + // This makes it possible to register two character replacements + // for full width East Asian characters, for example. + // + // It is recommended that replacement strings consist only of + // 7-bit ASCII, since other characters may not display everywhere. + RegisterRuneFallback(r rune, subst string) + + // UnregisterRuneFallback unmaps a replacement. It will unmap + // the implicit ASCII replacements for alternate characters as well. + // When an unmapped char needs to be displayed, but no suitable + // glyph is available, '?' is emitted instead. It is not possible + // to "disable" the use of alternate characters that are supported + // by your terminal except by changing the terminal database. + UnregisterRuneFallback(r rune) + + // CanDisplay returns true if the given rune can be displayed on + // this screen. Note that this is a best-guess effort -- whether + // your fonts support the character or not may be questionable. + // Mostly this is for folks who work outside of Unicode. + // + // If checkFallbacks is true, then if any (possibly imperfect) + // fallbacks are registered, this will return true. This will + // also return true if the terminal can replace the glyph with + // one that is visually indistinguishable from the one requested. + CanDisplay(r rune, checkFallbacks bool) bool + + // Resize does nothing, since it's generally not possible to + // ask a screen to resize, but it allows the Screen to implement + // the View interface. + Resize(int, int, int, int) + + // HasKey returns true if the keyboard is believed to have the + // key. In some cases a keyboard may have keys with this name + // but no support for them, while in others a key may be reported + // as supported but not actually be usable (such as some emulators + // that hijack certain keys). Its best not to depend to strictly + // on this function, but it can be used for hinting when building + // menus, displayed hot-keys, etc. Note that KeyRune (literal + // runes) is always true. + HasKey(Key) bool + + // Suspend pauses input and output processing. It also restores the + // terminal settings to what they were when the application started. + // This can be used to, for example, run a sub-shell. + Suspend() error + + // Resume resumes after Suspend(). + Resume() error + + // Beep attempts to sound an OS-dependent audible alert and returns an error + // when unsuccessful. + Beep() error + + // SetSize attempts to resize the window. It also invalidates the cells and + // calls the resize function. Note that if the window size is changed, it will + // not be restored upon application exit. + // + // Many terminals cannot support this. Perversely, the "modern" Windows Terminal + // does not support application-initiated resizing, whereas the legacy terminal does. + // Also, some emulators can support this but may have it disabled by default. + SetSize(int, int) + + // LockRegion sets or unsets a lock on a region of cells. A lock on a + // cell prevents the cell from being redrawn. + LockRegion(x, y, width, height int, lock bool) + + // Tty returns the underlying Tty. If the screen is not a terminal, the + // returned bool will be false + Tty() (Tty, bool) + + // SetTitle sets a window title on the screen. + // Terminals may be configured to ignore this, or unable to. + // Tcell may attempt to save and restore the window title on entry and exit, but + // the results may vary. Use of unicode characters may not be supported. + SetTitle(string) + + // SetClipboard is used to post arbitrary data to the system clipboard. + // This need not be UTF-8 string data. It's up to the recipient to decode the + // data meaningfully. Terminals may prevent this for security reasons. + SetClipboard([]byte) + + // GetClipboard is used to request the clipboard contents. It may be ignored. + // If the terminal is willing, it will be post the clipboard contents using an + // EventPaste with the clipboard content as the Data() field. Terminals may + // prevent this for security reasons. + GetClipboard() +} + +// NewScreen returns a default Screen suitable for the user's terminal +// environment. +func NewScreen() (Screen, error) { + // Windows is happier if we try for a console screen first. + if s, _ := NewConsoleScreen(); s != nil { + return s, nil + } else if s, e := NewTerminfoScreen(); s != nil { + return s, nil + } else { + return nil, e + } +} + +// MouseFlags are options to modify the handling of mouse events. +// Actual events can be ORed together. +type MouseFlags int + +const ( + MouseButtonEvents = MouseFlags(1) // Click events only + MouseDragEvents = MouseFlags(2) // Click-drag events (includes button events) + MouseMotionEvents = MouseFlags(4) // All mouse events (includes click and drag events) +) + +// CursorStyle represents a given cursor style, which can include the shape and +// whether the cursor blinks or is solid. Support for changing this is not universal. +type CursorStyle int + +const ( + CursorStyleDefault = CursorStyle(iota) // The default + CursorStyleBlinkingBlock + CursorStyleSteadyBlock + CursorStyleBlinkingUnderline + CursorStyleSteadyUnderline + CursorStyleBlinkingBar + CursorStyleSteadyBar +) + +// screenImpl is a subset of Screen that can be used with baseScreen to formulate +// a complete implementation of Screen. See Screen for doc comments about methods. +type screenImpl interface { + Init() error + Fini() + SetStyle(style Style) + ShowCursor(x int, y int) + HideCursor() + SetCursor(CursorStyle, Color) + Size() (width, height int) + EnableMouse(...MouseFlags) + DisableMouse() + EnablePaste() + DisablePaste() + EnableFocus() + DisableFocus() + HasMouse() bool + Colors() int + Show() + Sync() + CharacterSet() string + RegisterRuneFallback(r rune, subst string) + UnregisterRuneFallback(r rune) + CanDisplay(r rune, checkFallbacks bool) bool + Resize(int, int, int, int) + HasKey(Key) bool + Suspend() error + Resume() error + Beep() error + SetSize(int, int) + SetTitle(string) + Tty() (Tty, bool) + SetClipboard([]byte) + GetClipboard() + + // Following methods are not part of the Screen api, but are used for interaction with + // the common layer code. + + // Locker locks the underlying data structures so that we can access them + // in a thread-safe way. + sync.Locker + + // GetCells returns a pointer to the underlying CellBuffer that the implementation uses. + // Various methods will write to these for performance, but will use the lock to do so. + GetCells() *CellBuffer + + // StopQ is closed when the screen is shut down via Fini. It remains open if the screen + // is merely suspended. + StopQ() <-chan struct{} + + // EventQ delivers events. Events are posted to this by the screen in response to + // key presses, resizes, etc. Application code receives events from this via the + // Screen.PollEvent, Screen.ChannelEvents APIs. + EventQ() chan Event +} + +type baseScreen struct { + screenImpl +} + +func (b *baseScreen) SetCell(x int, y int, style Style, ch ...rune) { + if len(ch) > 0 { + b.SetContent(x, y, ch[0], ch[1:], style) + } else { + b.SetContent(x, y, ' ', nil, style) + } +} + +func (b *baseScreen) Clear() { + b.Fill(' ', StyleDefault) +} + +func (b *baseScreen) Fill(r rune, style Style) { + cb := b.GetCells() + b.Lock() + cb.Fill(r, style) + b.Unlock() +} + +func (b *baseScreen) SetContent(x, y int, mainc rune, combc []rune, st Style) { + + cells := b.GetCells() + b.Lock() + cells.SetContent(x, y, mainc, combc, st) + b.Unlock() +} + +func (b *baseScreen) GetContent(x, y int) (rune, []rune, Style, int) { + var primary rune + var combining []rune + var style Style + var width int + cells := b.GetCells() + b.Lock() + primary, combining, style, width = cells.GetContent(x, y) + b.Unlock() + return primary, combining, style, width +} + +func (b *baseScreen) LockRegion(x, y, width, height int, lock bool) { + cells := b.GetCells() + b.Lock() + for j := y; j < (y + height); j += 1 { + for i := x; i < (x + width); i += 1 { + switch lock { + case true: + cells.LockCell(i, j) + case false: + cells.UnlockCell(i, j) + } + } + } + b.Unlock() +} + +func (b *baseScreen) ChannelEvents(ch chan<- Event, quit <-chan struct{}) { + defer close(ch) + for { + select { + case <-quit: + return + case <-b.StopQ(): + return + case ev := <-b.EventQ(): + select { + case <-quit: + return + case <-b.StopQ(): + return + case ch <- ev: + } + } + } +} + +func (b *baseScreen) PollEvent() Event { + select { + case <-b.StopQ(): + return nil + case ev := <-b.EventQ(): + return ev + } +} + +func (b *baseScreen) HasPendingEvent() bool { + return len(b.EventQ()) > 0 +} + +func (b *baseScreen) PostEventWait(ev Event) { + select { + case b.EventQ() <- ev: + case <-b.StopQ(): + } +} + +func (b *baseScreen) PostEvent(ev Event) error { + select { + case b.EventQ() <- ev: + return nil + default: + return ErrEventQFull + } +} + +func (b *baseScreen) SetCursorStyle(cs CursorStyle, ccs ...Color) { + if len(ccs) > 0 { + b.SetCursor(cs, ccs[0]) + } else { + b.SetCursor(cs, ColorNone) + } +} diff --git a/vendor/github.com/gdamore/tcell/v2/simulation.go b/vendor/github.com/gdamore/tcell/v2/simulation.go new file mode 100644 index 00000000..66efaa94 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/simulation.go @@ -0,0 +1,528 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "sync" + "unicode/utf8" + + "golang.org/x/text/transform" +) + +// NewSimulationScreen returns a SimulationScreen. Note that +// SimulationScreen is also a Screen. +func NewSimulationScreen(charset string) SimulationScreen { + if charset == "" { + charset = "UTF-8" + } + ss := &simscreen{charset: charset} + ss.Screen = &baseScreen{screenImpl: ss} + return ss +} + +// SimulationScreen represents a screen simulation. This is intended to +// be a superset of normal Screens, but also adds some important interfaces +// for testing. +type SimulationScreen interface { + Screen + + // InjectKeyBytes injects a stream of bytes corresponding to + // the native encoding (see charset). It turns true if the entire + // set of bytes were processed and delivered as KeyEvents, false + // if any bytes were not fully understood. Any bytes that are not + // fully converted are discarded. + InjectKeyBytes(buf []byte) bool + + // InjectKey injects a key event. The rune is a UTF-8 rune, post + // any translation. + InjectKey(key Key, r rune, mod ModMask) + + // InjectMouse injects a mouse event. + InjectMouse(x, y int, buttons ButtonMask, mod ModMask) + + // GetContents returns screen contents as an array of + // cells, along with the physical width & height. Note that the + // physical contents will be used until the next time SetSize() + // is called. + GetContents() (cells []SimCell, width int, height int) + + // GetCursor returns the cursor details. + GetCursor() (x int, y int, visible bool) + + // GetTitle gets the previously set title. + GetTitle() string + + // GetClipboardData gets the actual data for the clipboard. + GetClipboardData() []byte +} + +// SimCell represents a simulated screen cell. The purpose of this +// is to track on screen content. +type SimCell struct { + // Bytes is the actual character bytes. Normally this is + // rune data, but it could be be data in another encoding system. + Bytes []byte + + // Style is the style used to display the data. + Style Style + + // Runes is the list of runes, unadulterated, in UTF-8. + Runes []rune +} + +type simscreen struct { + physw int + physh int + fini bool + style Style + evch chan Event + quit chan struct{} + + front []SimCell + back CellBuffer + clear bool + cursorx int + cursory int + cursorvis bool + mouse bool + paste bool + charset string + encoder transform.Transformer + decoder transform.Transformer + fillchar rune + fillstyle Style + fallback map[rune]string + title string + clipboard []byte + + Screen + sync.Mutex +} + +func (s *simscreen) Init() error { + s.evch = make(chan Event, 10) + s.quit = make(chan struct{}) + s.fillchar = 'X' + s.fillstyle = StyleDefault + s.mouse = false + s.physw = 80 + s.physh = 25 + s.cursorx = -1 + s.cursory = -1 + s.style = StyleDefault + + if enc := GetEncoding(s.charset); enc != nil { + s.encoder = enc.NewEncoder() + s.decoder = enc.NewDecoder() + } else { + return ErrNoCharset + } + + s.front = make([]SimCell, s.physw*s.physh) + s.back.Resize(80, 25) + + // default fallbacks + s.fallback = make(map[rune]string) + for k, v := range RuneFallbacks { + s.fallback[k] = v + } + return nil +} + +func (s *simscreen) Fini() { + s.Lock() + s.fini = true + s.back.Resize(0, 0) + s.Unlock() + if s.quit != nil { + close(s.quit) + } + s.physw = 0 + s.physh = 0 + s.front = nil +} + +func (s *simscreen) SetStyle(style Style) { + s.Lock() + s.style = style + s.Unlock() +} + +func (s *simscreen) drawCell(x, y int) int { + + mainc, combc, style, width := s.back.GetContent(x, y) + if !s.back.Dirty(x, y) { + return width + } + if x >= s.physw || y >= s.physh || x < 0 || y < 0 { + return width + } + simc := &s.front[(y*s.physw)+x] + + if style == StyleDefault { + style = s.style + } + simc.Style = style + simc.Runes = append([]rune{mainc}, combc...) + + // now emit runes - taking care to not overrun width with a + // wide character, and to ensure that we emit exactly one regular + // character followed up by any residual combing characters + + simc.Bytes = nil + + if x > s.physw-width { + simc.Runes = []rune{' '} + simc.Bytes = []byte{' '} + return width + } + + lbuf := make([]byte, 12) + ubuf := make([]byte, 12) + nout := 0 + + for _, r := range simc.Runes { + + l := utf8.EncodeRune(ubuf, r) + + nout, _, _ = s.encoder.Transform(lbuf, ubuf[:l], true) + + if nout == 0 || lbuf[0] == '\x1a' { + + // skip combining + + if subst, ok := s.fallback[r]; ok { + simc.Bytes = append(simc.Bytes, + []byte(subst)...) + + } else if r >= ' ' && r <= '~' { + simc.Bytes = append(simc.Bytes, byte(r)) + + } else if simc.Bytes == nil { + simc.Bytes = append(simc.Bytes, '?') + } + } else { + simc.Bytes = append(simc.Bytes, lbuf[:nout]...) + } + } + s.back.SetDirty(x, y, false) + return width +} + +func (s *simscreen) ShowCursor(x, y int) { + s.Lock() + s.cursorx, s.cursory = x, y + s.showCursor() + s.Unlock() +} + +func (s *simscreen) HideCursor() { + s.ShowCursor(-1, -1) +} + +func (s *simscreen) showCursor() { + + x, y := s.cursorx, s.cursory + if x < 0 || y < 0 || x >= s.physw || y >= s.physh { + s.cursorvis = false + } else { + s.cursorvis = true + } +} + +func (s *simscreen) hideCursor() { + // does not update cursor position + s.cursorvis = false +} + +func (s *simscreen) SetCursor(CursorStyle, Color) {} + +func (s *simscreen) Show() { + s.Lock() + s.resize() + s.draw() + s.Unlock() +} + +func (s *simscreen) clearScreen() { + // We emulate a hardware clear by filling with a specific pattern + for i := range s.front { + s.front[i].Style = s.fillstyle + s.front[i].Runes = []rune{s.fillchar} + s.front[i].Bytes = []byte{byte(s.fillchar)} + } + s.clear = false +} + +func (s *simscreen) draw() { + s.hideCursor() + if s.clear { + s.clearScreen() + } + + w, h := s.back.Size() + for y := 0; y < h; y++ { + for x := 0; x < w; x++ { + width := s.drawCell(x, y) + x += width - 1 + } + } + s.showCursor() +} + +func (s *simscreen) EnableMouse(...MouseFlags) { + s.mouse = true +} + +func (s *simscreen) DisableMouse() { + s.mouse = false +} + +func (s *simscreen) EnablePaste() { + s.paste = true +} + +func (s *simscreen) DisablePaste() { + s.paste = false +} + +func (s *simscreen) EnableFocus() { +} + +func (s *simscreen) DisableFocus() { +} + +func (s *simscreen) Size() (int, int) { + s.Lock() + w, h := s.back.Size() + s.Unlock() + return w, h +} + +func (s *simscreen) resize() { + w, h := s.physw, s.physh + ow, oh := s.back.Size() + if w != ow || h != oh { + s.back.Resize(w, h) + ev := NewEventResize(w, h) + s.postEvent(ev) + } +} + +func (s *simscreen) Colors() int { + return 256 +} + +func (s *simscreen) postEvent(ev Event) { + select { + case s.evch <- ev: + case <-s.quit: + } +} + +func (s *simscreen) InjectMouse(x, y int, buttons ButtonMask, mod ModMask) { + ev := NewEventMouse(x, y, buttons, mod) + s.postEvent(ev) +} + +func (s *simscreen) InjectKey(key Key, r rune, mod ModMask) { + ev := NewEventKey(key, r, mod) + s.postEvent(ev) +} + +func (s *simscreen) InjectKeyBytes(b []byte) bool { + failed := false + +outer: + for len(b) > 0 { + if b[0] >= ' ' && b[0] <= 0x7F { + // printable ASCII easy to deal with -- no encodings + ev := NewEventKey(KeyRune, rune(b[0]), ModNone) + s.postEvent(ev) + b = b[1:] + continue + } + + if b[0] < 0x80 { + mod := ModNone + // No encodings start with low numbered values + if Key(b[0]) >= KeyCtrlA && Key(b[0]) <= KeyCtrlZ { + mod = ModCtrl + } + ev := NewEventKey(Key(b[0]), 0, mod) + s.postEvent(ev) + b = b[1:] + continue + } + + utfb := make([]byte, len(b)*4) // worst case + for l := 1; l < len(b); l++ { + s.decoder.Reset() + nout, nin, _ := s.decoder.Transform(utfb, b[:l], true) + + if nout != 0 { + r, _ := utf8.DecodeRune(utfb[:nout]) + if r != utf8.RuneError { + ev := NewEventKey(KeyRune, r, ModNone) + s.postEvent(ev) + } + b = b[nin:] + continue outer + } + } + failed = true + b = b[1:] + continue + } + + return !failed +} + +func (s *simscreen) Sync() { + s.Lock() + s.clear = true + s.resize() + s.back.Invalidate() + s.draw() + s.Unlock() +} + +func (s *simscreen) CharacterSet() string { + return s.charset +} + +func (s *simscreen) SetSize(w, h int) { + s.Lock() + newc := make([]SimCell, w*h) + for row := 0; row < h && row < s.physh; row++ { + for col := 0; col < w && col < s.physw; col++ { + newc[(row*w)+col] = s.front[(row*s.physw)+col] + } + } + s.cursorx, s.cursory = -1, -1 + s.physw, s.physh = w, h + s.front = newc + s.back.Resize(w, h) + s.Unlock() +} + +func (s *simscreen) GetContents() ([]SimCell, int, int) { + s.Lock() + cells, w, h := s.front, s.physw, s.physh + s.Unlock() + return cells, w, h +} + +func (s *simscreen) GetCursor() (int, int, bool) { + s.Lock() + x, y, vis := s.cursorx, s.cursory, s.cursorvis + s.Unlock() + return x, y, vis +} + +func (s *simscreen) RegisterRuneFallback(r rune, subst string) { + s.Lock() + s.fallback[r] = subst + s.Unlock() +} + +func (s *simscreen) UnregisterRuneFallback(r rune) { + s.Lock() + delete(s.fallback, r) + s.Unlock() +} + +func (s *simscreen) CanDisplay(r rune, checkFallbacks bool) bool { + + if enc := s.encoder; enc != nil { + nb := make([]byte, 6) + ob := make([]byte, 6) + num := utf8.EncodeRune(ob, r) + + enc.Reset() + dst, _, err := enc.Transform(nb, ob[:num], true) + if dst != 0 && err == nil && nb[0] != '\x1A' { + return true + } + } + if !checkFallbacks { + return false + } + if _, ok := s.fallback[r]; ok { + return true + } + return false +} + +func (s *simscreen) HasMouse() bool { + return false +} + +func (s *simscreen) Resize(int, int, int, int) {} + +func (s *simscreen) HasKey(Key) bool { + return true +} + +func (s *simscreen) Beep() error { + return nil +} + +func (s *simscreen) Suspend() error { + return nil +} + +func (s *simscreen) Resume() error { + return nil +} + +func (s *simscreen) Tty() (Tty, bool) { + return nil, false +} + +func (s *simscreen) GetCells() *CellBuffer { + return &s.back +} + +func (s *simscreen) EventQ() chan Event { + return s.evch +} + +func (s *simscreen) StopQ() <-chan struct{} { + return s.quit +} + +func (s *simscreen) SetTitle(title string) { + s.title = title +} + +func (s *simscreen) GetTitle() string { + return s.title +} + +func (s *simscreen) SetClipboard(data []byte) { + s.clipboard = data +} + +func (s *simscreen) GetClipboard() { + if s.clipboard != nil { + ev := NewEventClipboard(s.clipboard) + s.postEvent(ev) + } +} + +func (s *simscreen) GetClipboardData() []byte { + return s.clipboard +} diff --git a/vendor/github.com/gdamore/tcell/v2/stdin_unix.go b/vendor/github.com/gdamore/tcell/v2/stdin_unix.go new file mode 100644 index 00000000..b478b891 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/stdin_unix.go @@ -0,0 +1,186 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos + +package tcell + +import ( + "errors" + "fmt" + "os" + "os/signal" + "strconv" + "sync" + "syscall" + "time" + + "golang.org/x/sys/unix" + "golang.org/x/term" +) + +// stdIoTty is an implementation of the Tty API based upon stdin/stdout. +type stdIoTty struct { + fd int + in *os.File + out *os.File + saved *term.State + sig chan os.Signal + cb func() + stopQ chan struct{} + dev string + wg sync.WaitGroup + l sync.Mutex +} + +func (tty *stdIoTty) Read(b []byte) (int, error) { + return tty.in.Read(b) +} + +func (tty *stdIoTty) Write(b []byte) (int, error) { + return tty.out.Write(b) +} + +func (tty *stdIoTty) Close() error { + return nil +} + +func (tty *stdIoTty) Start() error { + tty.l.Lock() + defer tty.l.Unlock() + + // We open another copy of /dev/tty. This is a workaround for unusual behavior + // observed in macOS, apparently caused when a sub-shell (for example) closes our + // own tty device (when it exits for example). Getting a fresh new one seems to + // resolve the problem. (We believe this is a bug in the macOS tty driver that + // fails to account for dup() references to the same file before applying close() + // related behaviors to the tty.) We're also holding the original copy we opened + // since closing that might have deleterious effects as well. The upshot is that + // we will have up to two separate file handles open on /dev/tty. (Note that when + // using stdin/stdout instead of /dev/tty this problem is not observed.) + var err error + tty.in = os.Stdin + tty.out = os.Stdout + tty.fd = int(tty.in.Fd()) + + if !term.IsTerminal(tty.fd) { + return errors.New("device is not a terminal") + } + + _ = tty.in.SetReadDeadline(time.Time{}) + saved, err := term.MakeRaw(tty.fd) // also sets vMin and vTime + if err != nil { + return err + } + tty.saved = saved + + tty.stopQ = make(chan struct{}) + tty.wg.Add(1) + go func(stopQ chan struct{}) { + defer tty.wg.Done() + for { + select { + case <-tty.sig: + tty.l.Lock() + cb := tty.cb + tty.l.Unlock() + if cb != nil { + cb() + } + case <-stopQ: + return + } + } + }(tty.stopQ) + + signal.Notify(tty.sig, syscall.SIGWINCH) + return nil +} + +func (tty *stdIoTty) Drain() error { + _ = tty.in.SetReadDeadline(time.Now()) + if err := tcSetBufParams(tty.fd, 0, 0); err != nil { + return err + } + return nil +} + +func (tty *stdIoTty) Stop() error { + tty.l.Lock() + if err := term.Restore(tty.fd, tty.saved); err != nil { + tty.l.Unlock() + return err + } + _ = tty.in.SetReadDeadline(time.Now()) + + signal.Stop(tty.sig) + close(tty.stopQ) + tty.l.Unlock() + + tty.wg.Wait() + + return nil +} + +func (tty *stdIoTty) WindowSize() (WindowSize, error) { + size := WindowSize{} + ws, err := unix.IoctlGetWinsize(tty.fd, unix.TIOCGWINSZ) + if err != nil { + return size, err + } + w := int(ws.Col) + h := int(ws.Row) + if w == 0 { + w, _ = strconv.Atoi(os.Getenv("COLUMNS")) + } + if w == 0 { + w = 80 // default + } + if h == 0 { + h, _ = strconv.Atoi(os.Getenv("LINES")) + } + if h == 0 { + h = 25 // default + } + size.Width = w + size.Height = h + size.PixelWidth = int(ws.Xpixel) + size.PixelHeight = int(ws.Ypixel) + return size, nil +} + +func (tty *stdIoTty) NotifyResize(cb func()) { + tty.l.Lock() + tty.cb = cb + tty.l.Unlock() +} + +// NewStdioTty opens a tty using standard input/output. +func NewStdIoTty() (Tty, error) { + tty := &stdIoTty{ + sig: make(chan os.Signal), + in: os.Stdin, + out: os.Stdout, + } + var err error + tty.fd = int(tty.in.Fd()) + if !term.IsTerminal(tty.fd) { + return nil, errors.New("not a terminal") + } + if tty.saved, err = term.GetState(tty.fd); err != nil { + return nil, fmt.Errorf("failed to get state: %w", err) + } + return tty, nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/style.go b/vendor/github.com/gdamore/tcell/v2/style.go new file mode 100644 index 00000000..73995c0e --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/style.go @@ -0,0 +1,202 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +// Style represents a complete text style, including both foreground color, +// background color, and additional attributes such as "bold" or "underline". +// +// Note that not all terminals can display all colors or attributes, and +// many might have specific incompatibilities between specific attributes +// and color combinations. +// +// To use Style, just declare a variable of its type. +type Style struct { + fg Color + bg Color + ulStyle UnderlineStyle + ulColor Color + attrs AttrMask + url string + urlId string +} + +// StyleDefault represents a default style, based upon the context. +// It is the zero value. +var StyleDefault Style + +// styleInvalid is just an arbitrary invalid style used internally. +var styleInvalid = Style{attrs: AttrInvalid} + +// Foreground returns a new style based on s, with the foreground color set +// as requested. ColorDefault can be used to select the global default. +func (s Style) Foreground(c Color) Style { + s2 := s + s2.fg = c + return s2 +} + +// Background returns a new style based on s, with the background color set +// as requested. ColorDefault can be used to select the global default. +func (s Style) Background(c Color) Style { + s2 := s + s2.bg = c + return s2 +} + +// Decompose breaks a style up, returning the foreground, background, +// and other attributes. The URL if set is not included. +// Deprecated: Applications should not attempt to decompose style, +// as this content is not sufficient to describe the actual style. +func (s Style) Decompose() (fg Color, bg Color, attr AttrMask) { + return s.fg, s.bg, s.attrs +} + +func (s Style) setAttrs(attrs AttrMask, on bool) Style { + s2 := s + if on { + s2.attrs |= attrs + } else { + s2.attrs &^= attrs + } + return s2 +} + +// Normal returns the style with all attributes disabled. +func (s Style) Normal() Style { + return Style{ + fg: s.fg, + bg: s.bg, + } +} + +// Bold returns a new style based on s, with the bold attribute set +// as requested. +func (s Style) Bold(on bool) Style { + return s.setAttrs(AttrBold, on) +} + +// Blink returns a new style based on s, with the blink attribute set +// as requested. +func (s Style) Blink(on bool) Style { + return s.setAttrs(AttrBlink, on) +} + +// Dim returns a new style based on s, with the dim attribute set +// as requested. +func (s Style) Dim(on bool) Style { + return s.setAttrs(AttrDim, on) +} + +// Italic returns a new style based on s, with the italic attribute set +// as requested. +func (s Style) Italic(on bool) Style { + return s.setAttrs(AttrItalic, on) +} + +// Reverse returns a new style based on s, with the reverse attribute set +// as requested. (Reverse usually changes the foreground and background +// colors.) +func (s Style) Reverse(on bool) Style { + return s.setAttrs(AttrReverse, on) +} + +// StrikeThrough sets strikethrough mode. +func (s Style) StrikeThrough(on bool) Style { + return s.setAttrs(AttrStrikeThrough, on) +} + +// Underline style. Modern terminals have the option of rendering the +// underline using different styles, and even different colors. +type UnderlineStyle int + +const ( + UnderlineStyleNone = UnderlineStyle(iota) + UnderlineStyleSolid + UnderlineStyleDouble + UnderlineStyleCurly + UnderlineStyleDotted + UnderlineStyleDashed +) + +// Underline returns a new style based on s, with the underline attribute set +// as requested. The parameters can be: +// +// bool: on / off - enables just a simple underline +// UnderlineStyle: sets a specific style (should not coexist with the bool) +// Color: the color to use +func (s Style) Underline(params ...interface{}) Style { + s2 := s + for _, param := range params { + switch v := param.(type) { + case bool: + if v { + s2.ulStyle = UnderlineStyleSolid + s2.attrs |= AttrUnderline + } else { + s2.ulStyle = UnderlineStyleNone + s2.attrs &^= AttrUnderline + } + case UnderlineStyle: + if v == UnderlineStyleNone { + s2.attrs &^= AttrUnderline + } else { + s2.attrs |= AttrUnderline + } + s2.ulStyle = v + case Color: + s2.ulColor = v + default: + panic("Bad type for underline") + } + } + return s2 +} + +// GetUnderlineStyle returns the underline style for the style. +func (s Style) GetUnderlineStyle() UnderlineStyle { + return s.ulStyle +} + +// GetUnderlineColor returns the underline color for the style. +func (s Style) GetUnderlineColor() Color { + return s.ulColor +} + +// Attributes returns a new style based on s, with its attributes set as +// specified. +func (s Style) Attributes(attrs AttrMask) Style { + s2 := s + s2.attrs = attrs + return s2 +} + +// Url returns a style with the Url set. If the provided Url is not empty, +// and the terminal supports it, text will typically be marked up as a clickable +// link to that Url. If the Url is empty, then this mode is turned off. +func (s Style) Url(url string) Style { + s2 := s + s2.url = url + return s2 +} + +// UrlId returns a style with the UrlId set. If the provided UrlId is not empty, +// any marked up Url with this style will be given the UrlId also. If the +// terminal supports it, any text with the same UrlId will be grouped as if it +// were one Url, even if it spans multiple lines. +func (s Style) UrlId(id string) Style { + s2 := s + s2.urlId = "id=" + id + return s2 +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/.gitignore b/vendor/github.com/gdamore/tcell/v2/terminfo/.gitignore new file mode 100644 index 00000000..74f3c04f --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/.gitignore @@ -0,0 +1 @@ +mkinfo diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/README.md b/vendor/github.com/gdamore/tcell/v2/terminfo/README.md new file mode 100644 index 00000000..20ae937f --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/README.md @@ -0,0 +1,25 @@ +This package represents the parent for all terminals. + +In older versions of tcell we had (a couple of) different +external file formats for the terminal database. Those are +now removed. All terminal definitions are supplied by +one of two methods: + +1. Compiled Go code + +2. For systems with terminfo and infocmp, dynamically + generated at runtime. + +The Go code can be generated using the mkinfo utility in +this directory. The database entry should be generated +into a package in a directory named as the first character +of the package name. (This permits us to group them all +without having a huge directory of little packages.) + +It may be desirable to add new packages to the extended +package, or -- rarely -- the base package. + +Applications which want to have the large set of terminal +descriptions built into the binary can simply import the +extended package. Otherwise a smaller reasonable default +set (the base package) will be included instead. diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/TERMINALS.md b/vendor/github.com/gdamore/tcell/v2/terminfo/TERMINALS.md new file mode 100644 index 00000000..85c1e61c --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/TERMINALS.md @@ -0,0 +1,7 @@ +TERMINALS +========= + +The best way to populate terminals on Debian is to install ncurses, +ncurses-term, screen, tmux, rxvt-unicode, and dvtm. This populates the +the terminfo database so that we can have a reasonable set of starting +terminals. diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/a/aixterm/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/a/aixterm/term.go new file mode 100644 index 00000000..503c9199 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/a/aixterm/term.go @@ -0,0 +1,83 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package aixterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // IBM Aixterm Terminal Emulator + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "aixterm", + Columns: 80, + Lines: 25, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + AttrOff: "\x1b[0;10m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[32m\x1b[40m", + PadChar: "\x00", + AltChars: "jjkkllmmnnqqttuuvvwwxx", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[139q", + KeyDelete: "\x1b[P", + KeyBackspace: "\b", + KeyHome: "\x1b[H", + KeyEnd: "\x1b[146q", + KeyPgUp: "\x1b[150q", + KeyPgDn: "\x1b[154q", + KeyF1: "\x1b[001q", + KeyF2: "\x1b[002q", + KeyF3: "\x1b[003q", + KeyF4: "\x1b[004q", + KeyF5: "\x1b[005q", + KeyF6: "\x1b[006q", + KeyF7: "\x1b[007q", + KeyF8: "\x1b[008q", + KeyF9: "\x1b[009q", + KeyF10: "\x1b[010q", + KeyF11: "\x1b[011q", + KeyF12: "\x1b[012q", + KeyF13: "\x1b[013q", + KeyF14: "\x1b[014q", + KeyF15: "\x1b[015q", + KeyF16: "\x1b[016q", + KeyF17: "\x1b[017q", + KeyF18: "\x1b[018q", + KeyF19: "\x1b[019q", + KeyF20: "\x1b[020q", + KeyF21: "\x1b[021q", + KeyF22: "\x1b[022q", + KeyF23: "\x1b[023q", + KeyF24: "\x1b[024q", + KeyF25: "\x1b[025q", + KeyF26: "\x1b[026q", + KeyF27: "\x1b[027q", + KeyF28: "\x1b[028q", + KeyF29: "\x1b[029q", + KeyF30: "\x1b[030q", + KeyF31: "\x1b[031q", + KeyF32: "\x1b[032q", + KeyF33: "\x1b[033q", + KeyF34: "\x1b[034q", + KeyF35: "\x1b[035q", + KeyF36: "\x1b[036q", + KeyClear: "\x1b[144q", + KeyBacktab: "\x1b[Z", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/direct.go b/vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/direct.go new file mode 100644 index 00000000..db6351af --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/direct.go @@ -0,0 +1,69 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package alacritty + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // alacritty with direct color indexing + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "alacritty-direct", + Columns: 80, + Lines: 24, + Colors: 16777216, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + TrueColor: true, + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/term.go new file mode 100644 index 00000000..a82d6dbe --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/a/alacritty/term.go @@ -0,0 +1,76 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package alacritty + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // alacritty terminal emulator + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "alacritty", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[<", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + DoubleUnderline: "\x1b[4:2m", + CurlyUnderline: "\x1b[4:3m", + DottedUnderline: "\x1b[4:4m", + DashedUnderline: "\x1b[4:5m", + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/a/ansi/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/a/ansi/term.go new file mode 100644 index 00000000..5c572fd4 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/a/ansi/term.go @@ -0,0 +1,43 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package ansi + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // ansi/pc-term compatible with color + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "ansi", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + AttrOff: "\x1b[0;10m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "+\x10,\x11-\x18.\x190\xdb`\x04a\xb1f\xf8g\xf1h\xb0j\xd9k\xbfl\xdam\xc0n\xc5o~p\xc4q\xc4r\xc4s_t\xc3u\xb4v\xc1w\xc2x\xb3y\xf3z\xf2{\xe3|\xd8}\x9c~\xfe", + EnterAcs: "\x1b[11m", + ExitAcs: "\x1b[10m", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\x1b[D", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[L", + KeyBackspace: "\b", + KeyHome: "\x1b[H", + KeyBacktab: "\x1b[Z", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/b/beterm/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/b/beterm/term.go new file mode 100644 index 00000000..e6d88838 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/b/beterm/term.go @@ -0,0 +1,57 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package beterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // BeOS Terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "beterm", + Columns: 80, + Lines: 25, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + AttrOff: "\x1b[0;10m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?4h", + ExitKeypad: "\x1b[?4l", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[m", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\b", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[16~", + KeyF7: "\x1b[17~", + KeyF8: "\x1b[18~", + KeyF9: "\x1b[19~", + KeyF10: "\x1b[20~", + KeyF11: "\x1b[21~", + KeyF12: "\x1b[22~", + AutoMargin: true, + InsertChar: "\x1b[@", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/base/base.go b/vendor/github.com/gdamore/tcell/v2/terminfo/base/base.go new file mode 100644 index 00000000..75aeb15f --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/base/base.go @@ -0,0 +1,33 @@ +// Copyright 2020 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This is just a "minimalist" set of the base terminal descriptions. +// It should be sufficient for most applications. + +// Package base contains the base terminal descriptions that are likely +// to be needed by any stock application. It is imported by default in the +// terminfo package, so terminal types listed here will be available to any +// tcell application. +package base + +import ( + // The following imports just register themselves -- + // these are the terminal types we aggregate in this package. + _ "github.com/gdamore/tcell/v2/terminfo/a/ansi" + _ "github.com/gdamore/tcell/v2/terminfo/t/tmux" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt100" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt102" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt220" + _ "github.com/gdamore/tcell/v2/terminfo/x/xterm" +) diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/c/cygwin/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/c/cygwin/term.go new file mode 100644 index 00000000..46a0a4a3 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/c/cygwin/term.go @@ -0,0 +1,66 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package cygwin + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // ANSI emulation for Cygwin + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "cygwin", + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + AttrOff: "\x1b[0;10m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "+\x10,\x11-\x18.\x190\xdb`\x04a\xb1f\xf8g\xf1h\xb0j\xd9k\xbfl\xdam\xc0n\xc5o~p\xc4q\xc4r\xc4s_t\xc3u\xb4v\xc1w\xc2x\xb3y\xf3z\xf2{\xe3|\xd8}\x9c~\xfe", + EnterAcs: "\x1b[11m", + ExitAcs: "\x1b[10m", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\b", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[[A", + KeyF2: "\x1b[[B", + KeyF3: "\x1b[[C", + KeyF4: "\x1b[[D", + KeyF5: "\x1b[[E", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + AutoMargin: true, + InsertChar: "\x1b[@", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/d/dtterm/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/d/dtterm/term.go new file mode 100644 index 00000000..90a5fedf --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/d/dtterm/term.go @@ -0,0 +1,71 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package dtterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // CDE desktop terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "dtterm", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\b", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyHelp: "\x1b[28~", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/dynamic/dynamic.go b/vendor/github.com/gdamore/tcell/v2/terminfo/dynamic/dynamic.go new file mode 100644 index 00000000..047ebded --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/dynamic/dynamic.go @@ -0,0 +1,423 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The dynamic package is used to generate a terminal description dynamically, +// using infocmp. This is really a method of last resort, as the performance +// will be slow, and it requires a working infocmp. But, the hope is that it +// will assist folks who have to deal with a terminal description that isn't +// already built in. This requires infocmp to be in the user's path, and to +// support reasonably the -1 option. + +package dynamic + +import ( + "bytes" + "errors" + "os/exec" + "regexp" + "strconv" + "strings" + + "github.com/gdamore/tcell/v2/terminfo" +) + +type termcap struct { + name string + desc string + aliases []string + bools map[string]bool + nums map[string]int + strs map[string]string +} + +func (tc *termcap) getnum(s string) int { + return (tc.nums[s]) +} + +func (tc *termcap) getflag(s string) bool { + return (tc.bools[s]) +} + +func (tc *termcap) getstr(s string) string { + return (tc.strs[s]) +} + +const ( + none = iota + control + escaped +) + +var errNotAddressable = errors.New("terminal not cursor addressable") + +func unescape(s string) string { + // Various escapes are in \x format. Control codes are + // encoded as ^M (carat followed by ASCII equivalent). + // escapes are: \e, \E - escape + // \0 NULL, \n \l \r \t \b \f \s for equivalent C escape. + buf := &bytes.Buffer{} + esc := none + + for i := 0; i < len(s); i++ { + c := s[i] + switch esc { + case none: + switch c { + case '\\': + esc = escaped + case '^': + esc = control + default: + buf.WriteByte(c) + } + case control: + buf.WriteByte(c ^ 1<<6) + esc = none + case escaped: + switch c { + case 'E', 'e': + buf.WriteByte(0x1b) + case '0', '1', '2', '3', '4', '5', '6', '7': + if i+2 < len(s) && s[i+1] >= '0' && s[i+1] <= '7' && s[i+2] >= '0' && s[i+2] <= '7' { + buf.WriteByte(((c - '0') * 64) + ((s[i+1] - '0') * 8) + (s[i+2] - '0')) + i = i + 2 + } else if c == '0' { + buf.WriteByte(0) + } + case 'n': + buf.WriteByte('\n') + case 'r': + buf.WriteByte('\r') + case 't': + buf.WriteByte('\t') + case 'b': + buf.WriteByte('\b') + case 'f': + buf.WriteByte('\f') + case 's': + buf.WriteByte(' ') + default: + buf.WriteByte(c) + } + esc = none + } + } + return (buf.String()) +} + +func (tc *termcap) setupterm(name string) error { + cmd := exec.Command("infocmp", "-1", name) + output := &bytes.Buffer{} + cmd.Stdout = output + + tc.strs = make(map[string]string) + tc.bools = make(map[string]bool) + tc.nums = make(map[string]int) + + if err := cmd.Run(); err != nil { + return err + } + + // Now parse the output. + // We get comment lines (starting with "#"), followed by + // a header line that looks like "||...|" + // then capabilities, one per line, starting with a tab and ending + // with a comma and newline. + lines := strings.Split(output.String(), "\n") + for len(lines) > 0 && strings.HasPrefix(lines[0], "#") { + lines = lines[1:] + } + + // Ditch trailing empty last line + if lines[len(lines)-1] == "" { + lines = lines[:len(lines)-1] + } + header := lines[0] + if strings.HasSuffix(header, ",") { + header = header[:len(header)-1] + } + names := strings.Split(header, "|") + tc.name = names[0] + names = names[1:] + if len(names) > 0 { + tc.desc = names[len(names)-1] + names = names[:len(names)-1] + } + tc.aliases = names + for _, val := range lines[1:] { + if (!strings.HasPrefix(val, "\t")) || + (!strings.HasSuffix(val, ",")) { + return (errors.New("malformed infocmp: " + val)) + } + + val = val[1:] + val = val[:len(val)-1] + + if k := strings.SplitN(val, "=", 2); len(k) == 2 { + tc.strs[k[0]] = unescape(k[1]) + } else if k := strings.SplitN(val, "#", 2); len(k) == 2 { + u, err := strconv.ParseUint(k[1], 0, 0) + if err != nil { + return (err) + } + tc.nums[k[0]] = int(u) + } else { + tc.bools[val] = true + } + } + return nil +} + +// LoadTerminfo creates a Terminfo by for named terminal by attempting to parse +// the output from infocmp. This returns the terminfo entry, a description of +// the terminal, and either nil or an error. +func LoadTerminfo(name string) (*terminfo.Terminfo, string, error) { + var tc termcap + if err := tc.setupterm(name); err != nil { + return nil, "", err + } + t := &terminfo.Terminfo{} + t.Name = tc.name + t.Aliases = tc.aliases + t.Colors = tc.getnum("colors") + t.Columns = tc.getnum("cols") + t.Lines = tc.getnum("lines") + t.Bell = tc.getstr("bel") + t.Clear = tc.getstr("clear") + t.EnterCA = tc.getstr("smcup") + t.ExitCA = tc.getstr("rmcup") + t.ShowCursor = tc.getstr("cnorm") + t.HideCursor = tc.getstr("civis") + t.AttrOff = tc.getstr("sgr0") + t.Underline = tc.getstr("smul") + t.Bold = tc.getstr("bold") + t.Blink = tc.getstr("blink") + t.Dim = tc.getstr("dim") + t.Italic = tc.getstr("sitm") + t.Reverse = tc.getstr("rev") + t.EnterKeypad = tc.getstr("smkx") + t.ExitKeypad = tc.getstr("rmkx") + t.SetFg = tc.getstr("setaf") + t.SetBg = tc.getstr("setab") + t.SetCursor = tc.getstr("cup") + t.CursorBack1 = tc.getstr("cub1") + t.CursorUp1 = tc.getstr("cuu1") + t.KeyF1 = tc.getstr("kf1") + t.KeyF2 = tc.getstr("kf2") + t.KeyF3 = tc.getstr("kf3") + t.KeyF4 = tc.getstr("kf4") + t.KeyF5 = tc.getstr("kf5") + t.KeyF6 = tc.getstr("kf6") + t.KeyF7 = tc.getstr("kf7") + t.KeyF8 = tc.getstr("kf8") + t.KeyF9 = tc.getstr("kf9") + t.KeyF10 = tc.getstr("kf10") + t.KeyF11 = tc.getstr("kf11") + t.KeyF12 = tc.getstr("kf12") + t.KeyF13 = tc.getstr("kf13") + t.KeyF14 = tc.getstr("kf14") + t.KeyF15 = tc.getstr("kf15") + t.KeyF16 = tc.getstr("kf16") + t.KeyF17 = tc.getstr("kf17") + t.KeyF18 = tc.getstr("kf18") + t.KeyF19 = tc.getstr("kf19") + t.KeyF20 = tc.getstr("kf20") + t.KeyF21 = tc.getstr("kf21") + t.KeyF22 = tc.getstr("kf22") + t.KeyF23 = tc.getstr("kf23") + t.KeyF24 = tc.getstr("kf24") + t.KeyF25 = tc.getstr("kf25") + t.KeyF26 = tc.getstr("kf26") + t.KeyF27 = tc.getstr("kf27") + t.KeyF28 = tc.getstr("kf28") + t.KeyF29 = tc.getstr("kf29") + t.KeyF30 = tc.getstr("kf30") + t.KeyF31 = tc.getstr("kf31") + t.KeyF32 = tc.getstr("kf32") + t.KeyF33 = tc.getstr("kf33") + t.KeyF34 = tc.getstr("kf34") + t.KeyF35 = tc.getstr("kf35") + t.KeyF36 = tc.getstr("kf36") + t.KeyF37 = tc.getstr("kf37") + t.KeyF38 = tc.getstr("kf38") + t.KeyF39 = tc.getstr("kf39") + t.KeyF40 = tc.getstr("kf40") + t.KeyF41 = tc.getstr("kf41") + t.KeyF42 = tc.getstr("kf42") + t.KeyF43 = tc.getstr("kf43") + t.KeyF44 = tc.getstr("kf44") + t.KeyF45 = tc.getstr("kf45") + t.KeyF46 = tc.getstr("kf46") + t.KeyF47 = tc.getstr("kf47") + t.KeyF48 = tc.getstr("kf48") + t.KeyF49 = tc.getstr("kf49") + t.KeyF50 = tc.getstr("kf50") + t.KeyF51 = tc.getstr("kf51") + t.KeyF52 = tc.getstr("kf52") + t.KeyF53 = tc.getstr("kf53") + t.KeyF54 = tc.getstr("kf54") + t.KeyF55 = tc.getstr("kf55") + t.KeyF56 = tc.getstr("kf56") + t.KeyF57 = tc.getstr("kf57") + t.KeyF58 = tc.getstr("kf58") + t.KeyF59 = tc.getstr("kf59") + t.KeyF60 = tc.getstr("kf60") + t.KeyF61 = tc.getstr("kf61") + t.KeyF62 = tc.getstr("kf62") + t.KeyF63 = tc.getstr("kf63") + t.KeyF64 = tc.getstr("kf64") + t.KeyInsert = tc.getstr("kich1") + t.KeyDelete = tc.getstr("kdch1") + t.KeyBackspace = tc.getstr("kbs") + t.KeyHome = tc.getstr("khome") + t.KeyEnd = tc.getstr("kend") + t.KeyUp = tc.getstr("kcuu1") + t.KeyDown = tc.getstr("kcud1") + t.KeyRight = tc.getstr("kcuf1") + t.KeyLeft = tc.getstr("kcub1") + t.KeyPgDn = tc.getstr("knp") + t.KeyPgUp = tc.getstr("kpp") + t.KeyBacktab = tc.getstr("kcbt") + t.KeyExit = tc.getstr("kext") + t.KeyCancel = tc.getstr("kcan") + t.KeyPrint = tc.getstr("kprt") + t.KeyHelp = tc.getstr("khlp") + t.KeyClear = tc.getstr("kclr") + t.AltChars = tc.getstr("acsc") + t.EnterAcs = tc.getstr("smacs") + t.ExitAcs = tc.getstr("rmacs") + t.EnableAcs = tc.getstr("enacs") + t.Mouse = tc.getstr("kmous") + t.KeyShfRight = tc.getstr("kRIT") + t.KeyShfLeft = tc.getstr("kLFT") + t.KeyShfHome = tc.getstr("kHOM") + t.KeyShfEnd = tc.getstr("kEND") + + // Terminfo lacks descriptions for a bunch of modified keys, + // but modern XTerm and emulators often have them. Let's add them, + // if the shifted right and left arrows are defined. + if t.KeyShfRight == "\x1b[1;2C" && t.KeyShfLeft == "\x1b[1;2D" { + t.Modifiers = terminfo.ModifiersXTerm + + t.KeyShfUp = "\x1b[1;2A" + t.KeyShfDown = "\x1b[1;2B" + t.KeyMetaUp = "\x1b[1;9A" + t.KeyMetaDown = "\x1b[1;9B" + t.KeyMetaRight = "\x1b[1;9C" + t.KeyMetaLeft = "\x1b[1;9D" + t.KeyAltUp = "\x1b[1;3A" + t.KeyAltDown = "\x1b[1;3B" + t.KeyAltRight = "\x1b[1;3C" + t.KeyAltLeft = "\x1b[1;3D" + t.KeyCtrlUp = "\x1b[1;5A" + t.KeyCtrlDown = "\x1b[1;5B" + t.KeyCtrlRight = "\x1b[1;5C" + t.KeyCtrlLeft = "\x1b[1;5D" + t.KeyAltShfUp = "\x1b[1;4A" + t.KeyAltShfDown = "\x1b[1;4B" + t.KeyAltShfRight = "\x1b[1;4C" + t.KeyAltShfLeft = "\x1b[1;4D" + + t.KeyMetaShfUp = "\x1b[1;10A" + t.KeyMetaShfDown = "\x1b[1;10B" + t.KeyMetaShfRight = "\x1b[1;10C" + t.KeyMetaShfLeft = "\x1b[1;10D" + + t.KeyCtrlShfUp = "\x1b[1;6A" + t.KeyCtrlShfDown = "\x1b[1;6B" + t.KeyCtrlShfRight = "\x1b[1;6C" + t.KeyCtrlShfLeft = "\x1b[1;6D" + + t.KeyShfPgUp = "\x1b[5;2~" + t.KeyShfPgDn = "\x1b[6;2~" + } + // And also for Home and End + if t.KeyShfHome == "\x1b[1;2H" && t.KeyShfEnd == "\x1b[1;2F" { + t.KeyCtrlHome = "\x1b[1;5H" + t.KeyCtrlEnd = "\x1b[1;5F" + t.KeyAltHome = "\x1b[1;9H" + t.KeyAltEnd = "\x1b[1;9F" + t.KeyCtrlShfHome = "\x1b[1;6H" + t.KeyCtrlShfEnd = "\x1b[1;6F" + t.KeyAltShfHome = "\x1b[1;4H" + t.KeyAltShfEnd = "\x1b[1;4F" + t.KeyMetaShfHome = "\x1b[1;10H" + t.KeyMetaShfEnd = "\x1b[1;10F" + } + + // And the same thing for rxvt and workalikes (Eterm, aterm, etc.) + // It seems that urxvt at least send escaped as ALT prefix for these, + // although some places seem to indicate a separate ALT key sesquence. + if t.KeyShfRight == "\x1b[c" && t.KeyShfLeft == "\x1b[d" { + t.KeyShfUp = "\x1b[a" + t.KeyShfDown = "\x1b[b" + t.KeyCtrlUp = "\x1b[Oa" + t.KeyCtrlDown = "\x1b[Ob" + t.KeyCtrlRight = "\x1b[Oc" + t.KeyCtrlLeft = "\x1b[Od" + } + if t.KeyShfHome == "\x1b[7$" && t.KeyShfEnd == "\x1b[8$" { + t.KeyCtrlHome = "\x1b[7^" + t.KeyCtrlEnd = "\x1b[8^" + } + + // Technically the RGB flag that is provided for xterm-direct is not + // quite right. The problem is that the -direct flag that was introduced + // with ncurses 6.1 requires a parsing for the parameters that we lack. + // For this case we'll just assume it's XTerm compatible. Someday this + // may be incorrect, but right now it is correct, and nobody uses it + // anyway. + if tc.getflag("Tc") { + // This presumes XTerm 24-bit true color. + t.TrueColor = true + } else if tc.getflag("RGB") { + // This is for xterm-direct, which uses a different scheme entirely. + // (ncurses went a very different direction from everyone else, and + // so it's unlikely anything is using this definition.) + t.TrueColor = true + t.SetBg = "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m" + t.SetFg = "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m" + } + + // We only support colors in ANSI 8 or 256 color mode. + if t.Colors < 8 || t.SetFg == "" { + t.Colors = 0 + } + if t.SetCursor == "" { + return nil, "", errNotAddressable + } + + // For padding, we lookup the pad char. If that isn't present, + // and npc is *not* set, then we assume a null byte. + t.PadChar = tc.getstr("pad") + if t.PadChar == "" { + if !tc.getflag("npc") { + t.PadChar = "\u0000" + } + } + + // For terminals that use "standard" SGR sequences, lets combine the + // foreground and background together. + if strings.HasPrefix(t.SetFg, "\x1b[") && + strings.HasPrefix(t.SetBg, "\x1b[") && + strings.HasSuffix(t.SetFg, "m") && + strings.HasSuffix(t.SetBg, "m") { + fg := t.SetFg[:len(t.SetFg)-1] + r := regexp.MustCompile("%p1") + bg := r.ReplaceAllString(t.SetBg[2:], "%p2") + t.SetFgBg = fg + ";" + bg + } + + return t, tc.desc, nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/e/emacs/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/e/emacs/term.go new file mode 100644 index 00000000..f6d078d0 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/e/emacs/term.go @@ -0,0 +1,65 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package emacs + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // GNU Emacs term.el terminal emulation + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "eterm", + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + AttrOff: "\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + AutoMargin: true, + }) + + // Emacs term.el terminal emulator term-protocol-version 0.96 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "eterm-color", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + AttrOff: "\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[%p1%{30}%+%dm", + SetBg: "\x1b[%p1%'('%+%dm", + SetFgBg: "\x1b[%p1%{30}%+%d;%p2%'('%+%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/extended/extended.go b/vendor/github.com/gdamore/tcell/v2/terminfo/extended/extended.go new file mode 100644 index 00000000..6e5c2e6c --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/extended/extended.go @@ -0,0 +1,57 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package extended contains an extended set of terminal descriptions. +// Applications desiring to have a better chance of Just Working by +// default should include this package. This will significantly increase +// the size of the program. +package extended + +import ( + // The following imports just register themselves -- + // these are the terminal types we aggregate in this package. + _ "github.com/gdamore/tcell/v2/terminfo/a/aixterm" + _ "github.com/gdamore/tcell/v2/terminfo/a/alacritty" + _ "github.com/gdamore/tcell/v2/terminfo/a/ansi" + _ "github.com/gdamore/tcell/v2/terminfo/b/beterm" + _ "github.com/gdamore/tcell/v2/terminfo/c/cygwin" + _ "github.com/gdamore/tcell/v2/terminfo/d/dtterm" + _ "github.com/gdamore/tcell/v2/terminfo/e/emacs" + _ "github.com/gdamore/tcell/v2/terminfo/f/foot" + _ "github.com/gdamore/tcell/v2/terminfo/g/gnome" + _ "github.com/gdamore/tcell/v2/terminfo/h/hpterm" + _ "github.com/gdamore/tcell/v2/terminfo/k/konsole" + _ "github.com/gdamore/tcell/v2/terminfo/k/kterm" + _ "github.com/gdamore/tcell/v2/terminfo/l/linux" + _ "github.com/gdamore/tcell/v2/terminfo/p/pcansi" + _ "github.com/gdamore/tcell/v2/terminfo/r/rxvt" + _ "github.com/gdamore/tcell/v2/terminfo/s/screen" + _ "github.com/gdamore/tcell/v2/terminfo/s/simpleterm" + _ "github.com/gdamore/tcell/v2/terminfo/s/sun" + _ "github.com/gdamore/tcell/v2/terminfo/t/tmux" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt100" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt102" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt220" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt320" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt400" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt420" + _ "github.com/gdamore/tcell/v2/terminfo/v/vt52" + _ "github.com/gdamore/tcell/v2/terminfo/w/wy50" + _ "github.com/gdamore/tcell/v2/terminfo/w/wy60" + _ "github.com/gdamore/tcell/v2/terminfo/w/wy99_ansi" + _ "github.com/gdamore/tcell/v2/terminfo/x/xfce" + _ "github.com/gdamore/tcell/v2/terminfo/x/xterm" + _ "github.com/gdamore/tcell/v2/terminfo/x/xterm_ghostty" + _ "github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty" +) diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go b/vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go new file mode 100644 index 00000000..5daa3c8a --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go @@ -0,0 +1,70 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package foot + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // foot terminal emulator + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "foot", + Aliases: []string{"foot-extra"}, + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38:5:%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48:5:%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38:5:%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48:5:%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\u007f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/g/gnome/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/g/gnome/term.go new file mode 100644 index 00000000..4a81122a --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/g/gnome/term.go @@ -0,0 +1,136 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package gnome + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // GNOME Terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "gnome", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) + + // GNOME Terminal with xterm 256-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "gnome-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/gen.sh b/vendor/github.com/gdamore/tcell/v2/terminfo/gen.sh new file mode 100644 index 00000000..851175a3 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/gen.sh @@ -0,0 +1,19 @@ +#!/bin/bash +while read line +do + case "$line" in + *'|'*) + alias=${line#*|} + line=${line%|*} + ;; + *) + alias=${line%%,*} + ;; + esac + + alias=${alias//-/_} + direc=${alias:0:1} + + mkdir -p ${direc}/${alias} + go run mkinfo.go -P ${alias} -go ${direc}/${alias}/term.go ${line//,/ } +done < models.txt diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/h/hpterm/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/h/hpterm/term.go new file mode 100644 index 00000000..56a0fb73 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/h/hpterm/term.go @@ -0,0 +1,51 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package hpterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // HP X11 terminal emulator (old) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "hpterm", + Aliases: []string{"X-hpterm"}, + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b&a0y0C\x1bJ", + AttrOff: "\x1b&d@\x0f", + Underline: "\x1b&dD", + Bold: "\x1b&dB", + Dim: "\x1b&dH", + Reverse: "\x1b&dB", + EnterKeypad: "\x1b&s1A", + ExitKeypad: "\x1b&s0A", + PadChar: "\x00", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + SetCursor: "\x1b&a%p1%dy%p2%dC", + CursorBack1: "\b", + CursorUp1: "\x1bA", + KeyUp: "\x1bA", + KeyDown: "\x1bB", + KeyRight: "\x1bC", + KeyLeft: "\x1bD", + KeyInsert: "\x1bQ", + KeyDelete: "\x1bP", + KeyBackspace: "\b", + KeyHome: "\x1bh", + KeyPgUp: "\x1bV", + KeyPgDn: "\x1bU", + KeyF1: "\x1bp", + KeyF2: "\x1bq", + KeyF3: "\x1br", + KeyF4: "\x1bs", + KeyF5: "\x1bt", + KeyF6: "\x1bu", + KeyF7: "\x1bv", + KeyF8: "\x1bw", + KeyClear: "\x1bJ", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/k/konsole/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/k/konsole/term.go new file mode 100644 index 00000000..36c9423e --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/k/konsole/term.go @@ -0,0 +1,138 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package konsole + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // KDE console window + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "konsole", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[<", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) + + // KDE console window with xterm 256-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "konsole-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[<", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/k/kterm/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/k/kterm/term.go new file mode 100644 index 00000000..e1a0d8d1 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/k/kterm/term.go @@ -0,0 +1,71 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package kterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // kterm kanji terminal emulator (X window system) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "kterm", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aajjkkllmmnnooppqqrrssttuuvvwwxx~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + AutoMargin: true, + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/l/linux/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/l/linux/term.go new file mode 100644 index 00000000..8975bb38 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/l/linux/term.go @@ -0,0 +1,73 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package linux + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // Linux console + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "linux", + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + ShowCursor: "\x1b[?25h\x1b[?0c", + HideCursor: "\x1b[?25l\x1b[?1c", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[[A", + KeyF2: "\x1b[[B", + KeyF3: "\x1b[[C", + KeyF4: "\x1b[[D", + KeyF5: "\x1b[[E", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyBacktab: "\x1b\t", + AutoMargin: true, + InsertChar: "\x1b[@", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/models.txt b/vendor/github.com/gdamore/tcell/v2/terminfo/models.txt new file mode 100644 index 00000000..1c709f47 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/models.txt @@ -0,0 +1,31 @@ +aixterm +alacritty +ansi +beterm +cygwin +dtterm +eterm,eterm-color|emacs +gnome,gnome-256color +hpterm +konsole,konsole-256color +kterm +linux +pcansi +rxvt,rxvt-256color,rxvt-88color,rxvt-unicode,rxvt-unicode-256color +screen,screen-256color +st,st-256color|simpleterm +tmux,tmux-256color +vt52 +vt100 +vt102 +vt220 +vt320 +vt400 +vt420 +wy50 +wy60 +wy99-ansi,wy99a-ansi +xfce +xterm,xterm-88color,xterm-256color +xterm-ghostty +xterm-kitty diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/p/pcansi/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/p/pcansi/term.go new file mode 100644 index 00000000..aadc8719 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/p/pcansi/term.go @@ -0,0 +1,41 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package pcansi + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // ibm-pc terminal programs claiming to be ANSI + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "pcansi", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + AttrOff: "\x1b[0;10m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[37;40m", + PadChar: "\x00", + AltChars: "+\x10,\x11-\x18.\x190\xdb`\x04a\xb1f\xf8g\xf1h\xb0j\xd9k\xbfl\xdam\xc0n\xc5o~p\xc4q\xc4r\xc4s_t\xc3u\xb4v\xc1w\xc2x\xb3y\xf3z\xf2{\xe3|\xd8}\x9c~\xfe", + EnterAcs: "\x1b[12m", + ExitAcs: "\x1b[10m", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\x1b[D", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyBackspace: "\b", + KeyHome: "\x1b[H", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/r/rxvt/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/r/rxvt/term.go new file mode 100644 index 00000000..979074aa --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/r/rxvt/term.go @@ -0,0 +1,493 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package rxvt + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // rxvt terminal emulator (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt", + Aliases: []string{"rxvt-color"}, + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyShfInsert: "\x1b[2$", + KeyShfDelete: "\x1b[3$", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + AutoMargin: true, + XTermLike: true, + }) + + // rxvt 2.7.9 with xterm 256-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyShfInsert: "\x1b[2$", + KeyShfDelete: "\x1b[3$", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + AutoMargin: true, + XTermLike: true, + }) + + // rxvt 2.7.9 with xterm 88-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-88color", + Columns: 80, + Lines: 24, + Colors: 88, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyShfInsert: "\x1b[2$", + KeyShfDelete: "\x1b[3$", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + AutoMargin: true, + XTermLike: true, + }) + + // rxvt-unicode terminal (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-unicode", + Columns: 80, + Lines: 24, + Colors: 88, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[r\x1b[?1049l", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[38;5;%p1%dm", + SetBg: "\x1b[48;5;%p1%dm", + SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", + ResetFgBg: "\x1b[39;49m", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyShfInsert: "\x1b[2$", + KeyShfDelete: "\x1b[3$", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + AutoMargin: true, + InsertChar: "\x1b[@", + }) + + // rxvt-unicode terminal with 256 colors (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-unicode-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[r\x1b[?1049l", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[38;5;%p1%dm", + SetBg: "\x1b[48;5;%p1%dm", + SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", + ResetFgBg: "\x1b[39;49m", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyShfInsert: "\x1b[2$", + KeyShfDelete: "\x1b[3$", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + AutoMargin: true, + InsertChar: "\x1b[@", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/s/screen/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/s/screen/term.go new file mode 100644 index 00000000..b8595295 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/s/screen/term.go @@ -0,0 +1,128 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package screen + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // VT 100/ANSI X3.64 virtual terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "screen", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + AutoMargin: true, + }) + + // GNU Screen with 256 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "screen-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/s/simpleterm/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/s/simpleterm/term.go new file mode 100644 index 00000000..9257637c --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/s/simpleterm/term.go @@ -0,0 +1,136 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package simpleterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // aka simpleterm + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "st", + Aliases: []string{"stterm"}, + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAcs: "\x1b)0", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyClear: "\x1b[3;5~", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) + + // simpleterm with 256 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "st-256color", + Aliases: []string{"stterm-256color"}, + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAcs: "\x1b)0", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyClear: "\x1b[3;5~", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/s/sun/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/s/sun/term.go new file mode 100644 index 00000000..16cb96c2 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/s/sun/term.go @@ -0,0 +1,112 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This terminal definition is hand-coded, as the default terminfo for +// this terminal is busted with respect to color. Unlike pretty much every +// other ANSI compliant terminal, this terminal cannot combine foreground and +// background escapes. The default terminfo also only provides escapes for +// 16-bit color. + +package sun + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // Sun Microsystems Inc. workstation console + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "sun", + Aliases: []string{"sun1", "sun2"}, + Columns: 80, + Lines: 34, + Bell: "\a", + Clear: "\f", + AttrOff: "\x1b[m", + Reverse: "\x1b[7m", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[247z", + KeyDelete: "\u007f", + KeyBackspace: "\b", + KeyHome: "\x1b[214z", + KeyEnd: "\x1b[220z", + KeyPgUp: "\x1b[216z", + KeyPgDn: "\x1b[222z", + KeyF1: "\x1b[224z", + KeyF2: "\x1b[225z", + KeyF3: "\x1b[226z", + KeyF4: "\x1b[227z", + KeyF5: "\x1b[228z", + KeyF6: "\x1b[229z", + KeyF7: "\x1b[230z", + KeyF8: "\x1b[231z", + KeyF9: "\x1b[232z", + KeyF10: "\x1b[233z", + KeyF11: "\x1b[234z", + KeyF12: "\x1b[235z", + AutoMargin: true, + InsertChar: "\x1b[@", + }) + + // Sun Microsystems Workstation console with color support (IA systems) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "sun-color", + Columns: 80, + Lines: 34, + Colors: 256, + Bell: "\a", + Clear: "\f", + AttrOff: "\x1b[m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + SetFg: "\x1b[38;5;%p1%dm", + SetBg: "\x1b[48;5;%p1%dm", + ResetFgBg: "\x1b[0m", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[247z", + KeyDelete: "\u007f", + KeyBackspace: "\b", + KeyHome: "\x1b[214z", + KeyEnd: "\x1b[220z", + KeyPgUp: "\x1b[216z", + KeyPgDn: "\x1b[222z", + KeyF1: "\x1b[224z", + KeyF2: "\x1b[225z", + KeyF3: "\x1b[226z", + KeyF4: "\x1b[227z", + KeyF5: "\x1b[228z", + KeyF6: "\x1b[229z", + KeyF7: "\x1b[230z", + KeyF8: "\x1b[231z", + KeyF9: "\x1b[232z", + KeyF10: "\x1b[233z", + KeyF11: "\x1b[234z", + KeyF12: "\x1b[235z", + AutoMargin: true, + InsertChar: "\x1b[@", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go new file mode 100644 index 00000000..8aa76a06 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go @@ -0,0 +1,142 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package tmux + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // tmux terminal multiplexer + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "tmux", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + DoubleUnderline: "\x1b[4:2m", + CurlyUnderline: "\x1b[4:3m", + DottedUnderline: "\x1b[4:4m", + DashedUnderline: "\x1b[4:5m", + }) + + // tmux with 256 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "tmux-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + DoubleUnderline: "\x1b[4:2m", + CurlyUnderline: "\x1b[4:3m", + DottedUnderline: "\x1b[4:4m", + DashedUnderline: "\x1b[4:5m", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go b/vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go new file mode 100644 index 00000000..44fefc51 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go @@ -0,0 +1,781 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package terminfo + +import ( + "bytes" + "errors" + "fmt" + "io" + "os" + "strconv" + "strings" + "sync" + "time" +) + +var ( + // ErrTermNotFound indicates that a suitable terminal entry could + // not be found. This can result from either not having TERM set, + // or from the TERM failing to support certain minimal functionality, + // in particular absolute cursor addressability (the cup capability) + // is required. For example, legacy "adm3" lacks this capability, + // whereas the slightly newer "adm3a" supports it. This failure + // occurs most often with "dumb". + ErrTermNotFound = errors.New("terminal entry not found") +) + +// Terminfo represents a terminfo entry. Note that we use friendly names +// in Go, but when we write out JSON, we use the same names as terminfo. +// The name, aliases and smous, rmous fields do not come from terminfo directly. +type Terminfo struct { + Name string + Aliases []string + Columns int // cols + Lines int // lines + Colors int // colors + Bell string // bell + Clear string // clear + EnterCA string // smcup + ExitCA string // rmcup + ShowCursor string // cnorm + HideCursor string // civis + AttrOff string // sgr0 + Underline string // smul + Bold string // bold + Blink string // blink + Reverse string // rev + Dim string // dim + Italic string // sitm + EnterKeypad string // smkx + ExitKeypad string // rmkx + SetFg string // setaf + SetBg string // setab + ResetFgBg string // op + SetCursor string // cup + CursorBack1 string // cub1 + CursorUp1 string // cuu1 + PadChar string // pad + KeyBackspace string // kbs + KeyF1 string // kf1 + KeyF2 string // kf2 + KeyF3 string // kf3 + KeyF4 string // kf4 + KeyF5 string // kf5 + KeyF6 string // kf6 + KeyF7 string // kf7 + KeyF8 string // kf8 + KeyF9 string // kf9 + KeyF10 string // kf10 + KeyF11 string // kf11 + KeyF12 string // kf12 + KeyF13 string // kf13 + KeyF14 string // kf14 + KeyF15 string // kf15 + KeyF16 string // kf16 + KeyF17 string // kf17 + KeyF18 string // kf18 + KeyF19 string // kf19 + KeyF20 string // kf20 + KeyF21 string // kf21 + KeyF22 string // kf22 + KeyF23 string // kf23 + KeyF24 string // kf24 + KeyF25 string // kf25 + KeyF26 string // kf26 + KeyF27 string // kf27 + KeyF28 string // kf28 + KeyF29 string // kf29 + KeyF30 string // kf30 + KeyF31 string // kf31 + KeyF32 string // kf32 + KeyF33 string // kf33 + KeyF34 string // kf34 + KeyF35 string // kf35 + KeyF36 string // kf36 + KeyF37 string // kf37 + KeyF38 string // kf38 + KeyF39 string // kf39 + KeyF40 string // kf40 + KeyF41 string // kf41 + KeyF42 string // kf42 + KeyF43 string // kf43 + KeyF44 string // kf44 + KeyF45 string // kf45 + KeyF46 string // kf46 + KeyF47 string // kf47 + KeyF48 string // kf48 + KeyF49 string // kf49 + KeyF50 string // kf50 + KeyF51 string // kf51 + KeyF52 string // kf52 + KeyF53 string // kf53 + KeyF54 string // kf54 + KeyF55 string // kf55 + KeyF56 string // kf56 + KeyF57 string // kf57 + KeyF58 string // kf58 + KeyF59 string // kf59 + KeyF60 string // kf60 + KeyF61 string // kf61 + KeyF62 string // kf62 + KeyF63 string // kf63 + KeyF64 string // kf64 + KeyInsert string // kich1 + KeyDelete string // kdch1 + KeyHome string // khome + KeyEnd string // kend + KeyHelp string // khlp + KeyPgUp string // kpp + KeyPgDn string // knp + KeyUp string // kcuu1 + KeyDown string // kcud1 + KeyLeft string // kcub1 + KeyRight string // kcuf1 + KeyBacktab string // kcbt + KeyExit string // kext + KeyClear string // kclr + KeyPrint string // kprt + KeyCancel string // kcan + Mouse string // kmous + AltChars string // acsc + EnterAcs string // smacs + ExitAcs string // rmacs + EnableAcs string // enacs + KeyShfRight string // kRIT + KeyShfLeft string // kLFT + KeyShfHome string // kHOM + KeyShfEnd string // kEND + KeyShfInsert string // kIC + KeyShfDelete string // kDC + + // These are non-standard extensions to terminfo. This includes + // true color support, and some additional keys. Its kind of bizarre + // that shifted variants of left and right exist, but not up and down. + // Terminal support for these are going to vary amongst XTerm + // emulations, so don't depend too much on them in your application. + + StrikeThrough string // smxx + SetFgBg string // setfgbg + SetFgBgRGB string // setfgbgrgb + SetFgRGB string // setfrgb + SetBgRGB string // setbrgb + KeyShfUp string // shift-up + KeyShfDown string // shift-down + KeyShfPgUp string // shift-kpp + KeyShfPgDn string // shift-knp + KeyCtrlUp string // ctrl-up + KeyCtrlDown string // ctrl-left + KeyCtrlRight string // ctrl-right + KeyCtrlLeft string // ctrl-left + KeyMetaUp string // meta-up + KeyMetaDown string // meta-left + KeyMetaRight string // meta-right + KeyMetaLeft string // meta-left + KeyAltUp string // alt-up + KeyAltDown string // alt-left + KeyAltRight string // alt-right + KeyAltLeft string // alt-left + KeyCtrlHome string + KeyCtrlEnd string + KeyMetaHome string + KeyMetaEnd string + KeyAltHome string + KeyAltEnd string + KeyAltShfUp string + KeyAltShfDown string + KeyAltShfLeft string + KeyAltShfRight string + KeyMetaShfUp string + KeyMetaShfDown string + KeyMetaShfLeft string + KeyMetaShfRight string + KeyCtrlShfUp string + KeyCtrlShfDown string + KeyCtrlShfLeft string + KeyCtrlShfRight string + KeyCtrlShfHome string + KeyCtrlShfEnd string + KeyAltShfHome string + KeyAltShfEnd string + KeyMetaShfHome string + KeyMetaShfEnd string + EnablePaste string // bracketed paste mode + DisablePaste string + PasteStart string + PasteEnd string + Modifiers int + InsertChar string // string to insert a character (ich1) + AutoMargin bool // true if writing to last cell in line advances + TrueColor bool // true if the terminal supports direct color + CursorDefault string + CursorBlinkingBlock string + CursorSteadyBlock string + CursorBlinkingUnderline string + CursorSteadyUnderline string + CursorBlinkingBar string + CursorSteadyBar string + CursorColor string // nothing uses it yet + CursorColorRGB string // Cs (but not really because Cs uses X11 color string) + CursorColorReset string // Cr + EnterUrl string + ExitUrl string + SetWindowSize string + SetWindowTitle string // no terminfo extension + EnableFocusReporting string + DisableFocusReporting string + DisableAutoMargin string // smam + EnableAutoMargin string // rmam + DoubleUnderline string // Smulx with param 2 + CurlyUnderline string // Smulx with param 3 + DottedUnderline string // Smulx with param 4 + DashedUnderline string // Smulx with param 5 + UnderlineColor string // Setuc1 + UnderlineColorRGB string // Setulc + UnderlineColorReset string // ol + XTermLike bool // (XT) has XTerm extensions +} + +const ( + ModifiersNone = 0 + ModifiersXTerm = 1 +) + +type stack []interface{} + +func (st stack) Push(v interface{}) stack { + if b, ok := v.(bool); ok { + if b { + return append(st, 1) + } else { + return append(st, 0) + } + } + return append(st, v) +} + +func (st stack) PopString() (string, stack) { + if len(st) > 0 { + e := st[len(st)-1] + var s string + switch v := e.(type) { + case int: + s = strconv.Itoa(v) + case string: + s = v + } + return s, st[:len(st)-1] + } + return "", st + +} +func (st stack) PopInt() (int, stack) { + if len(st) > 0 { + e := st[len(st)-1] + var i int + switch v := e.(type) { + case int: + i = v + case string: + i, _ = strconv.Atoi(v) + } + return i, st[:len(st)-1] + } + return 0, st +} + +// static vars +var svars [26]string + +type paramsBuffer struct { + out bytes.Buffer + buf bytes.Buffer +} + +// Start initializes the params buffer with the initial string data. +// It also locks the paramsBuffer. The caller must call End() when +// finished. +func (pb *paramsBuffer) Start(s string) { + pb.out.Reset() + pb.buf.Reset() + pb.buf.WriteString(s) +} + +// End returns the final output from TParam, but it also releases the lock. +func (pb *paramsBuffer) End() string { + s := pb.out.String() + return s +} + +// NextCh returns the next input character to the expander. +func (pb *paramsBuffer) NextCh() (byte, error) { + return pb.buf.ReadByte() +} + +// PutCh "emits" (rather schedules for output) a single byte character. +func (pb *paramsBuffer) PutCh(ch byte) { + pb.out.WriteByte(ch) +} + +// PutString schedules a string for output. +func (pb *paramsBuffer) PutString(s string) { + pb.out.WriteString(s) +} + +// TParm takes a terminfo parameterized string, such as setaf or cup, and +// evaluates the string, and returns the result with the parameter +// applied. +func (t *Terminfo) TParm(s string, p ...interface{}) string { + var stk stack + var a string + var ai, bi int + var dvars [26]string + var params [9]interface{} + var pb = ¶msBuffer{} + + pb.Start(s) + + // make sure we always have 9 parameters -- makes it easier + // later to skip checks + for i := 0; i < len(params) && i < len(p); i++ { + params[i] = p[i] + } + + const ( + emit = iota + toEnd + toElse + ) + + skip := emit + + for { + + ch, err := pb.NextCh() + if err != nil { + break + } + + if ch != '%' { + if skip == emit { + pb.PutCh(ch) + } + continue + } + + ch, err = pb.NextCh() + if err != nil { + // XXX Error + break + } + if skip == toEnd { + if ch == ';' { + skip = emit + } + continue + } else if skip == toElse { + if ch == 'e' || ch == ';' { + skip = emit + } + continue + } + + switch ch { + case '%': // quoted % + pb.PutCh(ch) + + case 'i': // increment both parameters (ANSI cup support) + if i, ok := params[0].(int); ok { + params[0] = i + 1 + } + if i, ok := params[1].(int); ok { + params[1] = i + 1 + } + + case 's': + // NB: 's', 'c', and 'd' below are special cased for + // efficiency. They could be handled by the richer + // format support below, less efficiently. + a, stk = stk.PopString() + pb.PutString(a) + + case 'c': + // Integer as special character. + ai, stk = stk.PopInt() + pb.PutCh(byte(ai)) + + case 'd': + ai, stk = stk.PopInt() + pb.PutString(strconv.Itoa(ai)) + + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'x', 'X', 'o', ':': + // This is pretty suboptimal, but this is rarely used. + // None of the mainstream terminals use any of this, + // and it would surprise me if this code is ever + // executed outside test cases. + f := "%" + if ch == ':' { + ch, _ = pb.NextCh() + } + f += string(ch) + for ch == '+' || ch == '-' || ch == '#' || ch == ' ' { + ch, _ = pb.NextCh() + f += string(ch) + } + for (ch >= '0' && ch <= '9') || ch == '.' { + ch, _ = pb.NextCh() + f += string(ch) + } + switch ch { + case 'd', 'x', 'X', 'o': + ai, stk = stk.PopInt() + pb.PutString(fmt.Sprintf(f, ai)) + case 's': + a, stk = stk.PopString() + pb.PutString(fmt.Sprintf(f, a)) + case 'c': + ai, stk = stk.PopInt() + pb.PutString(fmt.Sprintf(f, ai)) + } + + case 'p': // push parameter + ch, _ = pb.NextCh() + ai = int(ch - '1') + if ai >= 0 && ai < len(params) { + stk = stk.Push(params[ai]) + } else { + stk = stk.Push(0) + } + + case 'P': // pop & store variable + ch, _ = pb.NextCh() + if ch >= 'A' && ch <= 'Z' { + svars[int(ch-'A')], stk = stk.PopString() + } else if ch >= 'a' && ch <= 'z' { + dvars[int(ch-'a')], stk = stk.PopString() + } + + case 'g': // recall & push variable + ch, _ = pb.NextCh() + if ch >= 'A' && ch <= 'Z' { + stk = stk.Push(svars[int(ch-'A')]) + } else if ch >= 'a' && ch <= 'z' { + stk = stk.Push(dvars[int(ch-'a')]) + } + + case '\'': // push(char) - the integer value of it + ch, _ = pb.NextCh() + _, _ = pb.NextCh() // must be ' but we don't check + stk = stk.Push(int(ch)) + + case '{': // push(int) + ai = 0 + ch, _ = pb.NextCh() + for ch >= '0' && ch <= '9' { + ai *= 10 + ai += int(ch - '0') + ch, _ = pb.NextCh() + } + // ch must be '}' but no verification + stk = stk.Push(ai) + + case 'l': // push(strlen(pop)) + a, stk = stk.PopString() + stk = stk.Push(len(a)) + + case '+': + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai + bi) + + case '-': + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai - bi) + + case '*': + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai * bi) + + case '/': + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + if bi != 0 { + stk = stk.Push(ai / bi) + } else { + stk = stk.Push(0) + } + + case 'm': // push(pop mod pop) + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + if bi != 0 { + stk = stk.Push(ai % bi) + } else { + stk = stk.Push(0) + } + + case '&': // AND + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai & bi) + + case '|': // OR + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai | bi) + + case '^': // XOR + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai ^ bi) + + case '~': // bit complement + ai, stk = stk.PopInt() + stk = stk.Push(ai ^ -1) + + case '!': // logical NOT + ai, stk = stk.PopInt() + stk = stk.Push(ai == 0) + + case '=': // numeric compare + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai == bi) + + case '>': // greater than, numeric + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai > bi) + + case '<': // less than, numeric + bi, stk = stk.PopInt() + ai, stk = stk.PopInt() + stk = stk.Push(ai < bi) + + case '?': // start conditional + + case ';': + skip = emit + + case 't': + ai, stk = stk.PopInt() + if ai == 0 { + skip = toElse + } + + case 'e': + skip = toEnd + + default: + pb.PutString("%" + string(ch)) + } + } + + return pb.End() +} + +// TPuts emits the string to the writer, but expands inline padding +// indications (of the form $<[delay]> where [delay] is msec) to +// a suitable time (unless the terminfo string indicates this isn't needed +// by specifying npc - no padding). All Terminfo based strings should be +// emitted using this function. +func (t *Terminfo) TPuts(w io.Writer, s string) { + for { + beg := strings.Index(s, "$<") + if beg < 0 { + // Most strings don't need padding, which is good news! + _, _ = io.WriteString(w, s) + return + } + _, _ = io.WriteString(w, s[:beg]) + s = s[beg+2:] + end := strings.Index(s, ">") + if end < 0 { + // unterminated.. just emit bytes unadulterated + _, _ = io.WriteString(w, "$<"+s) + return + } + val := s[:end] + s = s[end+1:] + padus := 0 + unit := time.Millisecond + dot := false + loop: + for i := range val { + switch val[i] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + padus *= 10 + padus += int(val[i] - '0') + if dot { + unit /= 10 + } + case '.': + if !dot { + dot = true + } else { + break loop + } + default: + break loop + } + } + + // Curses historically uses padding to achieve "fine grained" + // delays. We have much better clocks these days, and so we + // do not rely on padding but simply sleep a bit. + if len(t.PadChar) > 0 { + time.Sleep(unit * time.Duration(padus)) + } + } +} + +// TGoto returns a string suitable for addressing the cursor at the given +// row and column. The origin 0, 0 is in the upper left corner of the screen. +func (t *Terminfo) TGoto(col, row int) string { + return t.TParm(t.SetCursor, row, col) +} + +// TColor returns a string corresponding to the given foreground and background +// colors. Either fg or bg can be set to -1 to elide. +func (t *Terminfo) TColor(fi, bi int) string { + rv := "" + // As a special case, we map bright colors to lower versions if the + // color table only holds 8. For the remaining 240 colors, the user + // is out of luck. Someday we could create a mapping table, but its + // not worth it. + if t.Colors == 8 { + if fi > 7 && fi < 16 { + fi -= 8 + } + if bi > 7 && bi < 16 { + bi -= 8 + } + } + if t.Colors > fi && fi >= 0 { + rv += t.TParm(t.SetFg, fi) + } + if t.Colors > bi && bi >= 0 { + rv += t.TParm(t.SetBg, bi) + } + return rv +} + +var ( + dblock sync.Mutex + terminfos = make(map[string]*Terminfo) +) + +// AddTerminfo can be called to register a new Terminfo entry. +func AddTerminfo(t *Terminfo) { + dblock.Lock() + terminfos[t.Name] = t + for _, x := range t.Aliases { + terminfos[x] = t + } + dblock.Unlock() +} + +// LookupTerminfo attempts to find a definition for the named $TERM. +func LookupTerminfo(name string) (*Terminfo, error) { + if name == "" { + // else on windows: index out of bounds + // on the name[0] reference below + return nil, ErrTermNotFound + } + + addtruecolor := false + add256color := false + switch os.Getenv("COLORTERM") { + case "truecolor", "24bit", "24-bit": + addtruecolor = true + } + dblock.Lock() + t := terminfos[name] + dblock.Unlock() + + // If the name ends in -truecolor, then fabricate an entry + // from the corresponding -256color, -color, or bare terminal. + if t != nil && t.TrueColor { + addtruecolor = true + } else if t == nil && strings.HasSuffix(name, "-truecolor") { + + suffixes := []string{ + "-256color", + "-88color", + "-color", + "", + } + base := name[:len(name)-len("-truecolor")] + for _, s := range suffixes { + if t, _ = LookupTerminfo(base + s); t != nil { + addtruecolor = true + break + } + } + } + + // If the name ends in -256color, maybe fabricate using the xterm 256 color sequences + if t == nil && strings.HasSuffix(name, "-256color") { + suffixes := []string{ + "-88color", + "-color", + } + base := name[:len(name)-len("-256color")] + for _, s := range suffixes { + if t, _ = LookupTerminfo(base + s); t != nil { + add256color = true + break + } + } + } + + if t == nil { + return nil, ErrTermNotFound + } + + switch os.Getenv("TCELL_TRUECOLOR") { + case "": + case "disable": + addtruecolor = false + default: + addtruecolor = true + } + + // If the user has requested 24-bit color with $COLORTERM, then + // amend the value (unless already present). This means we don't + // need to have a value present. + if addtruecolor && + t.SetFgBgRGB == "" && + t.SetFgRGB == "" && + t.SetBgRGB == "" { + + // Supply vanilla ISO 8613-6:1994 24-bit color sequences. + t.SetFgRGB = "\x1b[38;2;%p1%d;%p2%d;%p3%dm" + t.SetBgRGB = "\x1b[48;2;%p1%d;%p2%d;%p3%dm" + t.SetFgBgRGB = "\x1b[38;2;%p1%d;%p2%d;%p3%d;" + + "48;2;%p4%d;%p5%d;%p6%dm" + } + + if add256color { + t.Colors = 256 + t.SetFg = "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m" + t.SetBg = "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m" + t.SetFgBg = "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m" + t.ResetFgBg = "\x1b[39;49m" + } + return t, nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt100/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt100/term.go new file mode 100644 index 00000000..2bad42e9 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt100/term.go @@ -0,0 +1,51 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package vt100 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // DEC VT100 (w/advanced video) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "vt100", + Aliases: []string{"vt100-am"}, + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b[H\x1b[J$<50>", + AttrOff: "\x1b[m\x0f$<2>", + Underline: "\x1b[4m$<2>", + Bold: "\x1b[1m$<2>", + Blink: "\x1b[5m$<2>", + Reverse: "\x1b[7m$<2>", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH$<5>", + CursorBack1: "\b", + CursorUp1: "\x1b[A$<2>", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyBackspace: "\b", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1bOt", + KeyF6: "\x1bOu", + KeyF7: "\x1bOv", + KeyF8: "\x1bOl", + KeyF9: "\x1bOw", + KeyF10: "\x1bOx", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt102/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt102/term.go new file mode 100644 index 00000000..1269b5b7 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt102/term.go @@ -0,0 +1,50 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package vt102 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // DEC VT102 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "vt102", + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b[H\x1b[J$<50>", + AttrOff: "\x1b[m\x0f$<2>", + Underline: "\x1b[4m$<2>", + Bold: "\x1b[1m$<2>", + Blink: "\x1b[5m$<2>", + Reverse: "\x1b[7m$<2>", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH$<5>", + CursorBack1: "\b", + CursorUp1: "\x1b[A$<2>", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyBackspace: "\b", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1bOt", + KeyF6: "\x1bOu", + KeyF7: "\x1bOv", + KeyF8: "\x1bOl", + KeyF9: "\x1bOw", + KeyF10: "\x1bOx", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt220/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt220/term.go new file mode 100644 index 00000000..a637677a --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt220/term.go @@ -0,0 +1,63 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package vt220 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // DEC VT220 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "vt220", + Aliases: []string{"vt200"}, + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0$<2>", + ExitAcs: "\x1b(B$<4>", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\b", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyHelp: "\x1b[28~", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt320/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt320/term.go new file mode 100644 index 00000000..e929ed45 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt320/term.go @@ -0,0 +1,66 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package vt320 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // DEC VT320 7 bit terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "vt320", + Aliases: []string{"vt300"}, + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1b[1~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt400/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt400/term.go new file mode 100644 index 00000000..05406563 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt400/term.go @@ -0,0 +1,50 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package vt400 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // DEC VT400 24x80 column autowrap + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "vt400", + Aliases: []string{"vt400-24", "dec-vt400"}, + Columns: 80, + Lines: 24, + Clear: "\x1b[H\x1b[J$<10/>", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyBackspace: "\b", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + AutoMargin: true, + InsertChar: "\x1b[@", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt420/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt420/term.go new file mode 100644 index 00000000..4c56f1e5 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt420/term.go @@ -0,0 +1,56 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package vt420 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // DEC VT420 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "vt420", + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b[H\x1b[2J$<50>", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B$<2>", + Underline: "\x1b[4m", + Bold: "\x1b[1m$<2>", + Blink: "\x1b[5m$<2>", + Reverse: "\x1b[7m$<2>", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0$<2>", + ExitAcs: "\x1b(B$<4>", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH$<10>", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\b", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[17~", + KeyF6: "\x1b[18~", + KeyF7: "\x1b[19~", + KeyF8: "\x1b[20~", + KeyF9: "\x1b[21~", + KeyF10: "\x1b[29~", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt52/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt52/term.go new file mode 100644 index 00000000..5d193ed7 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/v/vt52/term.go @@ -0,0 +1,39 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package vt52 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // DEC VT52 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "vt52", + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1bH\x1bJ", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + PadChar: "\x00", + AltChars: "+h.k0affggolpnqprrss", + EnterAcs: "\x1bF", + ExitAcs: "\x1bG", + SetCursor: "\x1bY%p1%' '%+%c%p2%' '%+%c", + CursorBack1: "\x1bD", + CursorUp1: "\x1bA", + KeyUp: "\x1bA", + KeyDown: "\x1bB", + KeyRight: "\x1bC", + KeyLeft: "\x1bD", + KeyBackspace: "\b", + KeyF1: "\x1bP", + KeyF2: "\x1bQ", + KeyF3: "\x1bR", + KeyF5: "\x1b?t", + KeyF6: "\x1b?u", + KeyF7: "\x1b?v", + KeyF8: "\x1b?w", + KeyF9: "\x1b?x", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy50/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy50/term.go new file mode 100644 index 00000000..beced62d --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy50/term.go @@ -0,0 +1,60 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package wy50 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // Wyse 50 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "wy50", + Aliases: []string{"wyse50"}, + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b+$<20>", + ShowCursor: "\x1b`1", + HideCursor: "\x1b`0", + AttrOff: "\x1b(\x1bH\x03", + Dim: "\x1b`7\x1b)", + Reverse: "\x1b`6\x1b)", + PadChar: "\x00", + AltChars: "a;j5k3l2m1n8q:t4u9v=w0x6", + EnterAcs: "\x1bH\x02", + ExitAcs: "\x1bH\x03", + SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", + CursorBack1: "\b", + CursorUp1: "\v", + KeyUp: "\v", + KeyDown: "\n", + KeyRight: "\f", + KeyLeft: "\b", + KeyInsert: "\x1bQ", + KeyDelete: "\x1bW", + KeyBackspace: "\b", + KeyHome: "\x1e", + KeyPgUp: "\x1bJ", + KeyPgDn: "\x1bK", + KeyF1: "\x01@\r", + KeyF2: "\x01A\r", + KeyF3: "\x01B\r", + KeyF4: "\x01C\r", + KeyF5: "\x01D\r", + KeyF6: "\x01E\r", + KeyF7: "\x01F\r", + KeyF8: "\x01G\r", + KeyF9: "\x01H\r", + KeyF10: "\x01I\r", + KeyF11: "\x01J\r", + KeyF12: "\x01K\r", + KeyF13: "\x01L\r", + KeyF14: "\x01M\r", + KeyF15: "\x01N\r", + KeyF16: "\x01O\r", + KeyPrint: "\x1bP", + KeyBacktab: "\x1bI", + KeyShfHome: "\x1b{", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy60/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy60/term.go new file mode 100644 index 00000000..27705f20 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy60/term.go @@ -0,0 +1,66 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package wy60 + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // Wyse 60 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "wy60", + Aliases: []string{"wyse60"}, + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b+$<100>", + EnterCA: "\x1bw0", + ExitCA: "\x1bw1", + ShowCursor: "\x1b`1", + HideCursor: "\x1b`0", + AttrOff: "\x1b(\x1bH\x03\x1bG0\x1bcD", + Underline: "\x1bG8", + Dim: "\x1bGp", + Blink: "\x1bG2", + Reverse: "\x1bG4", + PadChar: "\x00", + AltChars: "+/,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~", + EnterAcs: "\x1bcE", + ExitAcs: "\x1bcD", + EnableAutoMargin: "\x1bd/", + DisableAutoMargin: "\x1bd.", + SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", + CursorBack1: "\b", + CursorUp1: "\v", + KeyUp: "\v", + KeyDown: "\n", + KeyRight: "\f", + KeyLeft: "\b", + KeyInsert: "\x1bQ", + KeyDelete: "\x1bW", + KeyBackspace: "\b", + KeyHome: "\x1e", + KeyPgUp: "\x1bJ", + KeyPgDn: "\x1bK", + KeyF1: "\x01@\r", + KeyF2: "\x01A\r", + KeyF3: "\x01B\r", + KeyF4: "\x01C\r", + KeyF5: "\x01D\r", + KeyF6: "\x01E\r", + KeyF7: "\x01F\r", + KeyF8: "\x01G\r", + KeyF9: "\x01H\r", + KeyF10: "\x01I\r", + KeyF11: "\x01J\r", + KeyF12: "\x01K\r", + KeyF13: "\x01L\r", + KeyF14: "\x01M\r", + KeyF15: "\x01N\r", + KeyF16: "\x01O\r", + KeyPrint: "\x1bP", + KeyBacktab: "\x1bI", + KeyShfHome: "\x1b{", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy99_ansi/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy99_ansi/term.go new file mode 100644 index 00000000..9b5cd7e7 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/w/wy99_ansi/term.go @@ -0,0 +1,120 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package wy99_ansi + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // Wyse WY-99GT in ANSI mode (int'l PC keyboard) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "wy99-ansi", + Columns: 80, + Lines: 25, + Bell: "\a", + Clear: "\x1b[H\x1b[J$<200>", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f\x1b[\"q", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h", + ExitKeypad: "\x1b[?1l", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b$<1>", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyBackspace: "\b", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[M", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF17: "\x1b[K", + KeyF18: "\x1b[31~", + KeyF19: "\x1b[32~", + KeyF20: "\x1b[33~", + KeyF21: "\x1b[34~", + KeyF22: "\x1b[35~", + KeyF23: "\x1b[1~", + KeyF24: "\x1b[2~", + KeyBacktab: "\x1b[z", + AutoMargin: true, + }) + + // Wyse WY-99GT in ANSI mode (US PC keyboard) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "wy99a-ansi", + Columns: 80, + Lines: 25, + Bell: "\a", + Clear: "\x1b[H\x1b[J$<200>", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f\x1b[\"q", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h", + ExitKeypad: "\x1b[?1l", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b$<1>", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyBackspace: "\b", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[M", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF17: "\x1b[K", + KeyF18: "\x1b[31~", + KeyF19: "\x1b[32~", + KeyF20: "\x1b[33~", + KeyF21: "\x1b[34~", + KeyF22: "\x1b[35~", + KeyF23: "\x1b[1~", + KeyF24: "\x1b[2~", + KeyBacktab: "\x1b[z", + AutoMargin: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/x/xfce/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xfce/term.go new file mode 100644 index 00000000..b9999a1c --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xfce/term.go @@ -0,0 +1,70 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package xfce + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // Xfce Terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xfce", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/direct.go b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/direct.go new file mode 100644 index 00000000..358ebae9 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/direct.go @@ -0,0 +1,92 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This terminal definition is derived from the xterm-256color definition, but +// makes use of the RGB property these terminals have to support direct color. +// The terminfo entry for this uses a new format for the color handling introduced +// by ncurses 6.1 (and used by nobody else), so this override ensures we get +// good handling even in the face of this. + +package xterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // derived from xterm-256color, but adds full RGB support + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm-direct", + Aliases: []string{"xterm-truecolor"}, + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + SetFgRGB: "\x1b[38;2;%p1%d;%p2%d;%p3%dm", + SetBgRGB: "\x1b[48;2;%p1%d;%p2%d;%p3%dm", + SetFgBgRGB: "\x1b[38;2;%p1%d;%p2%d;%p3%d;48;2;%p4%d;%p5%d;%p6%dm", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\u007f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + TrueColor: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/term.go new file mode 100644 index 00000000..faf7d8ac --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm/term.go @@ -0,0 +1,201 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package xterm + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // xterm terminal emulator (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm", + Aliases: []string{"xterm-debian"}, + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[<", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) + + // xterm with 88 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm-88color", + Columns: 80, + Lines: 24, + Colors: 88, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[<", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) + + // xterm with 256 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[<", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_ghostty/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_ghostty/term.go new file mode 100644 index 00000000..54d88db9 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_ghostty/term.go @@ -0,0 +1,79 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package xterm_ghostty + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // Ghostty + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm-ghostty", + Aliases: []string{"ghostty"}, + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[<", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + TrueColor: true, + AutoMargin: true, + InsertChar: "\x1b[@", + DoubleUnderline: "\x1b[4:2m", + CurlyUnderline: "\x1b[4:3m", + DottedUnderline: "\x1b[4:4m", + DashedUnderline: "\x1b[4:5m", + XTermLike: true, + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty/term.go new file mode 100644 index 00000000..8ee59776 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty/term.go @@ -0,0 +1,75 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package xterm_kitty + +import "github.com/gdamore/tcell/v2/terminfo" + +func init() { + + // KovIdTTY + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm-kitty", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[?12h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h", + ExitKeypad: "\x1b[?1l", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAutoMargin: "\x1b[?7h", + DisableAutoMargin: "\x1b[?7l", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\x7f", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + TrueColor: true, + AutoMargin: true, + DoubleUnderline: "\x1b[4:2m", + CurlyUnderline: "\x1b[4:3m", + DottedUnderline: "\x1b[4:4m", + DashedUnderline: "\x1b[4:5m", + }) +} diff --git a/vendor/github.com/gdamore/tcell/v2/terms_default.go b/vendor/github.com/gdamore/tcell/v2/terms_default.go new file mode 100644 index 00000000..fefcf893 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terms_default.go @@ -0,0 +1,24 @@ +//go:build !tcell_minimal +// +build !tcell_minimal + +// Copyright 2019 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + // This imports the default terminal entries. To disable, use the + // tcell_minimal build tag. + _ "github.com/gdamore/tcell/v2/terminfo/extended" +) diff --git a/vendor/github.com/gdamore/tcell/v2/terms_dynamic.go b/vendor/github.com/gdamore/tcell/v2/terms_dynamic.go new file mode 100644 index 00000000..9e549449 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terms_dynamic.go @@ -0,0 +1,43 @@ +//go:build !tcell_minimal && !nacl && !js && !zos && !plan9 && !windows && !android +// +build !tcell_minimal,!nacl,!js,!zos,!plan9,!windows,!android + +// Copyright 2019 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + // This imports a dynamic version of the terminal database, which + // is built using infocmp. This relies on a working installation + // of infocmp (typically supplied with ncurses). We only do this + // for systems likely to have that -- i.e. UNIX based hosts. We + // also don't support Android here, because you really don't want + // to run external programs there. Generally the android terminals + // will be automatically included anyway. + "github.com/gdamore/tcell/v2/terminfo" + "github.com/gdamore/tcell/v2/terminfo/dynamic" + + "fmt" +) + +func loadDynamicTerminfo(term string) (*terminfo.Terminfo, error) { + if term == "" { + return nil, fmt.Errorf("%w: term not set", ErrTermNotFound) + } + ti, _, e := dynamic.LoadTerminfo(term) + if e != nil { + return nil, e + } + return ti, nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/terms_static.go b/vendor/github.com/gdamore/tcell/v2/terms_static.go new file mode 100644 index 00000000..6d725cbc --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/terms_static.go @@ -0,0 +1,28 @@ +//go:build tcell_minimal || nacl || zos || plan9 || windows || android || js +// +build tcell_minimal nacl zos plan9 windows android js + +// Copyright 2019 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "errors" + + "github.com/gdamore/tcell/v2/terminfo" +) + +func loadDynamicTerminfo(_ string) (*terminfo.Terminfo, error) { + return nil, errors.New("terminal type unsupported") +} diff --git a/vendor/github.com/gdamore/tcell/v2/tscreen.go b/vendor/github.com/gdamore/tcell/v2/tscreen.go new file mode 100644 index 00000000..2c1d32d3 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/tscreen.go @@ -0,0 +1,2153 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !(js && wasm) +// +build !js !wasm + +package tcell + +import ( + "bytes" + "encoding/base64" + "errors" + "io" + "os" + "strconv" + "strings" + "sync" + "time" + "unicode/utf8" + + "golang.org/x/term" + "golang.org/x/text/transform" + + "github.com/gdamore/tcell/v2/terminfo" +) + +// NewTerminfoScreen returns a Screen that uses the stock TTY interface +// and POSIX terminal control, combined with a terminfo description taken from +// the $TERM environment variable. It returns an error if the terminal +// is not supported for any reason. +// +// For terminals that do not support dynamic resize events, the $LINES +// $COLUMNS environment variables can be set to the actual window size, +// otherwise defaults taken from the terminal database are used. +func NewTerminfoScreen() (Screen, error) { + return NewTerminfoScreenFromTty(nil) +} + +// LookupTerminfo attempts to find a definition for the named $TERM falling +// back to attempting to parse the output from infocmp. +func LookupTerminfo(name string) (ti *terminfo.Terminfo, e error) { + ti, e = terminfo.LookupTerminfo(name) + if e != nil { + ti, e = loadDynamicTerminfo(name) + if e != nil { + return nil, e + } + terminfo.AddTerminfo(ti) + } + + return +} + +// NewTerminfoScreenFromTtyTerminfo returns a Screen using a custom Tty +// implementation and custom terminfo specification. +// If the passed in tty is nil, then a reasonable default (typically /dev/tty) +// is presumed, at least on UNIX hosts. (Windows hosts will typically fail this +// call altogether.) +// If passed terminfo is nil, then TERM environment variable is queried for +// terminal specification. +func NewTerminfoScreenFromTtyTerminfo(tty Tty, ti *terminfo.Terminfo) (s Screen, e error) { + if ti == nil { + ti, e = LookupTerminfo(os.Getenv("TERM")) + if e != nil { + return + } + } + + t := &tScreen{ti: ti, tty: tty} + + t.keyexist = make(map[Key]bool) + t.keycodes = make(map[string]*tKeyCode) + if len(ti.Mouse) > 0 { + t.mouse = []byte(ti.Mouse) + } + t.prepareKeys() + t.buildAcsMap() + t.resizeQ = make(chan bool, 1) + t.fallback = make(map[rune]string) + for k, v := range RuneFallbacks { + t.fallback[k] = v + } + + return &baseScreen{screenImpl: t}, nil +} + +// NewTerminfoScreenFromTty returns a Screen using a custom Tty implementation. +// If the passed in tty is nil, then a reasonable default (typically /dev/tty) +// is presumed, at least on UNIX hosts. (Windows hosts will typically fail this +// call altogether.) +func NewTerminfoScreenFromTty(tty Tty) (Screen, error) { + return NewTerminfoScreenFromTtyTerminfo(tty, nil) +} + +// tKeyCode represents a combination of a key code and modifiers. +type tKeyCode struct { + key Key + mod ModMask +} + +// tScreen represents a screen backed by a terminfo implementation. +type tScreen struct { + ti *terminfo.Terminfo + tty Tty + h int + w int + fini bool + cells CellBuffer + buffering bool // true if we are collecting writes to buf instead of sending directly to out + buf bytes.Buffer + curstyle Style + style Style + resizeQ chan bool + quit chan struct{} + keyexist map[Key]bool + keycodes map[string]*tKeyCode + keychan chan []byte + keytimer *time.Timer + keyexpire time.Time + cx int + cy int + mouse []byte + clear bool + cursorx int + cursory int + acs map[rune]string + charset string + encoder transform.Transformer + decoder transform.Transformer + fallback map[rune]string + colors map[Color]Color + palette []Color + truecolor bool + escaped bool + buttondn bool + finiOnce sync.Once + enablePaste string + disablePaste string + enterUrl string + exitUrl string + setWinSize string + enableFocus string + disableFocus string + doubleUnder string + curlyUnder string + dottedUnder string + dashedUnder string + underColor string + underRGB string + underFg string + cursorStyles map[CursorStyle]string + cursorStyle CursorStyle + cursorColor Color + cursorRGB string + cursorFg string + saved *term.State + stopQ chan struct{} + eventQ chan Event + running bool + wg sync.WaitGroup + mouseFlags MouseFlags + pasteEnabled bool + focusEnabled bool + setTitle string + saveTitle string + restoreTitle string + title string + setClipboard string + + sync.Mutex +} + +func (t *tScreen) Init() error { + if e := t.initialize(); e != nil { + return e + } + + t.keychan = make(chan []byte, 10) + t.keytimer = time.NewTimer(time.Millisecond * 50) + t.charset = "UTF-8" + + t.charset = getCharset() + if enc := GetEncoding(t.charset); enc != nil { + t.encoder = enc.NewEncoder() + t.decoder = enc.NewDecoder() + } else { + return ErrNoCharset + } + ti := t.ti + + // environment overrides + w := ti.Columns + h := ti.Lines + if i, _ := strconv.Atoi(os.Getenv("LINES")); i != 0 { + h = i + } + if i, _ := strconv.Atoi(os.Getenv("COLUMNS")); i != 0 { + w = i + } + if t.ti.SetFgBgRGB != "" || t.ti.SetFgRGB != "" || t.ti.SetBgRGB != "" { + t.truecolor = true + } + // A user who wants to have his themes honored can + // set this environment variable. + if os.Getenv("TCELL_TRUECOLOR") == "disable" { + t.truecolor = false + } + nColors := t.nColors() + if nColors > 256 { + nColors = 256 // clip to reasonable limits + } + t.colors = make(map[Color]Color, nColors) + t.palette = make([]Color, nColors) + for i := 0; i < nColors; i++ { + t.palette[i] = Color(i) | ColorValid + // identity map for our builtin colors + t.colors[Color(i)|ColorValid] = Color(i) | ColorValid + } + + t.quit = make(chan struct{}) + t.eventQ = make(chan Event, 10) + + t.Lock() + t.cx = -1 + t.cy = -1 + t.style = StyleDefault + t.cells.Resize(w, h) + t.cursorx = -1 + t.cursory = -1 + t.resize() + t.Unlock() + + if err := t.engage(); err != nil { + return err + } + + return nil +} + +func (t *tScreen) prepareKeyMod(key Key, mod ModMask, val string) { + if val != "" { + // Do not override codes that already exist + if _, exist := t.keycodes[val]; !exist { + t.keyexist[key] = true + t.keycodes[val] = &tKeyCode{key: key, mod: mod} + } + } +} + +func (t *tScreen) prepareKeyModReplace(key Key, replace Key, mod ModMask, val string) { + if val != "" { + // Do not override codes that already exist + if old, exist := t.keycodes[val]; !exist || old.key == replace { + t.keyexist[key] = true + t.keycodes[val] = &tKeyCode{key: key, mod: mod} + } + } +} + +func (t *tScreen) prepareKeyModXTerm(key Key, val string) { + + if strings.HasPrefix(val, "\x1b[") && strings.HasSuffix(val, "~") { + + // Drop the trailing ~ + val = val[:len(val)-1] + + // These suffixes are calculated assuming Xterm style modifier suffixes. + // Please see https://invisible-island.net/xterm/ctlseqs/ctlseqs.pdf for + // more information (specifically "PC-Style Function Keys"). + t.prepareKeyModReplace(key, key+12, ModShift, val+";2~") + t.prepareKeyModReplace(key, key+48, ModAlt, val+";3~") + t.prepareKeyModReplace(key, key+60, ModAlt|ModShift, val+";4~") + t.prepareKeyModReplace(key, key+24, ModCtrl, val+";5~") + t.prepareKeyModReplace(key, key+36, ModCtrl|ModShift, val+";6~") + t.prepareKeyMod(key, ModAlt|ModCtrl, val+";7~") + t.prepareKeyMod(key, ModShift|ModAlt|ModCtrl, val+";8~") + t.prepareKeyMod(key, ModMeta, val+";9~") + t.prepareKeyMod(key, ModMeta|ModShift, val+";10~") + t.prepareKeyMod(key, ModMeta|ModAlt, val+";11~") + t.prepareKeyMod(key, ModMeta|ModAlt|ModShift, val+";12~") + t.prepareKeyMod(key, ModMeta|ModCtrl, val+";13~") + t.prepareKeyMod(key, ModMeta|ModCtrl|ModShift, val+";14~") + t.prepareKeyMod(key, ModMeta|ModCtrl|ModAlt, val+";15~") + t.prepareKeyMod(key, ModMeta|ModCtrl|ModAlt|ModShift, val+";16~") + } else if strings.HasPrefix(val, "\x1bO") && len(val) == 3 { + val = val[2:] + t.prepareKeyModReplace(key, key+12, ModShift, "\x1b[1;2"+val) + t.prepareKeyModReplace(key, key+48, ModAlt, "\x1b[1;3"+val) + t.prepareKeyModReplace(key, key+24, ModCtrl, "\x1b[1;5"+val) + t.prepareKeyModReplace(key, key+36, ModCtrl|ModShift, "\x1b[1;6"+val) + t.prepareKeyModReplace(key, key+60, ModAlt|ModShift, "\x1b[1;4"+val) + t.prepareKeyMod(key, ModAlt|ModCtrl, "\x1b[1;7"+val) + t.prepareKeyMod(key, ModShift|ModAlt|ModCtrl, "\x1b[1;8"+val) + t.prepareKeyMod(key, ModMeta, "\x1b[1;9"+val) + t.prepareKeyMod(key, ModMeta|ModShift, "\x1b[1;10"+val) + t.prepareKeyMod(key, ModMeta|ModAlt, "\x1b[1;11"+val) + t.prepareKeyMod(key, ModMeta|ModAlt|ModShift, "\x1b[1;12"+val) + t.prepareKeyMod(key, ModMeta|ModCtrl, "\x1b[1;13"+val) + t.prepareKeyMod(key, ModMeta|ModCtrl|ModShift, "\x1b[1;14"+val) + t.prepareKeyMod(key, ModMeta|ModCtrl|ModAlt, "\x1b[1;15"+val) + t.prepareKeyMod(key, ModMeta|ModCtrl|ModAlt|ModShift, "\x1b[1;16"+val) + } +} + +func (t *tScreen) prepareXtermModifiers() { + if t.ti.Modifiers != terminfo.ModifiersXTerm { + return + } + t.prepareKeyModXTerm(KeyRight, t.ti.KeyRight) + t.prepareKeyModXTerm(KeyLeft, t.ti.KeyLeft) + t.prepareKeyModXTerm(KeyUp, t.ti.KeyUp) + t.prepareKeyModXTerm(KeyDown, t.ti.KeyDown) + t.prepareKeyModXTerm(KeyInsert, t.ti.KeyInsert) + t.prepareKeyModXTerm(KeyDelete, t.ti.KeyDelete) + t.prepareKeyModXTerm(KeyPgUp, t.ti.KeyPgUp) + t.prepareKeyModXTerm(KeyPgDn, t.ti.KeyPgDn) + t.prepareKeyModXTerm(KeyHome, t.ti.KeyHome) + t.prepareKeyModXTerm(KeyEnd, t.ti.KeyEnd) + t.prepareKeyModXTerm(KeyF1, t.ti.KeyF1) + t.prepareKeyModXTerm(KeyF2, t.ti.KeyF2) + t.prepareKeyModXTerm(KeyF3, t.ti.KeyF3) + t.prepareKeyModXTerm(KeyF4, t.ti.KeyF4) + t.prepareKeyModXTerm(KeyF5, t.ti.KeyF5) + t.prepareKeyModXTerm(KeyF6, t.ti.KeyF6) + t.prepareKeyModXTerm(KeyF7, t.ti.KeyF7) + t.prepareKeyModXTerm(KeyF8, t.ti.KeyF8) + t.prepareKeyModXTerm(KeyF9, t.ti.KeyF9) + t.prepareKeyModXTerm(KeyF10, t.ti.KeyF10) + t.prepareKeyModXTerm(KeyF11, t.ti.KeyF11) + t.prepareKeyModXTerm(KeyF12, t.ti.KeyF12) +} + +func (t *tScreen) prepareBracketedPaste() { + // Another workaround for lack of reporting in terminfo. + // We assume if the terminal has a mouse entry, that it + // offers bracketed paste. But we allow specific overrides + // via our terminal database. + if t.ti.EnablePaste != "" { + t.enablePaste = t.ti.EnablePaste + t.disablePaste = t.ti.DisablePaste + t.prepareKey(keyPasteStart, t.ti.PasteStart) + t.prepareKey(keyPasteEnd, t.ti.PasteEnd) + } else if t.ti.Mouse != "" || t.ti.XTermLike { + t.enablePaste = "\x1b[?2004h" + t.disablePaste = "\x1b[?2004l" + t.prepareKey(keyPasteStart, "\x1b[200~") + t.prepareKey(keyPasteEnd, "\x1b[201~") + } +} + +func (t *tScreen) prepareUnderlines() { + if t.ti.DoubleUnderline != "" { + t.doubleUnder = t.ti.DoubleUnderline + } else if t.ti.XTermLike { + t.doubleUnder = "\x1b[4:2m" + } + if t.ti.CurlyUnderline != "" { + t.curlyUnder = t.ti.CurlyUnderline + } else if t.ti.XTermLike { + t.curlyUnder = "\x1b[4:3m" + } + if t.ti.DottedUnderline != "" { + t.dottedUnder = t.ti.DottedUnderline + } else if t.ti.XTermLike { + t.dottedUnder = "\x1b[4:4m" + } + if t.ti.DashedUnderline != "" { + t.dashedUnder = t.ti.DashedUnderline + } else if t.ti.XTermLike { + t.dashedUnder = "\x1b[4:5m" + } + + // Underline colors. We're not going to rely upon terminfo for this + // Essentially all terminals that support the curly underlines are + // expected to also support coloring them too - which reflects actual + // practice since these were introduced at about the same time. + if t.ti.UnderlineColor != "" { + t.underColor = t.ti.UnderlineColor + } else if t.curlyUnder != "" { + t.underColor = "\x1b[58:5:%p1%dm" + } + if t.ti.UnderlineColorRGB != "" { + // An interesting wart here is that in order to facilitate + // using just a single parameter, the Setulc parameter takes + // the 24-bit color as an integer rather than separate bytes. + // This matches the "new" style direct color approach that + // ncurses took, even though everyone else went another way. + t.underRGB = t.ti.UnderlineColorRGB + } else if t.underColor != "" { + t.underRGB = "\x1b[58:2::%p1%d:%p2%d:%p3%dm" + } + if t.ti.UnderlineColorReset != "" { + t.underFg = t.ti.UnderlineColorReset + } else if t.curlyUnder != "" { + t.underFg = "\x1b[59m" + } +} + +func (t *tScreen) prepareExtendedOSC() { + // Linux is a special beast - because it has a mouse entry, but does + // not swallow these OSC commands properly. + if strings.Contains(t.ti.Name, "linux") { + return + } + // More stuff for limits in terminfo. This time we are applying + // the most common OSC (operating system commands). Generally + // terminals that don't understand these will ignore them. + // Again, we condition this based on mouse capabilities. + if t.ti.EnterUrl != "" { + t.enterUrl = t.ti.EnterUrl + t.exitUrl = t.ti.ExitUrl + } else if t.ti.Mouse != "" || t.ti.XTermLike { + t.enterUrl = "\x1b]8;%p2%s;%p1%s\x1b\\" + t.exitUrl = "\x1b]8;;\x1b\\" + } + + if t.ti.SetWindowSize != "" { + t.setWinSize = t.ti.SetWindowSize + } else if t.ti.Mouse != "" || t.ti.XTermLike { + t.setWinSize = "\x1b[8;%p1%p2%d;%dt" + } + + if t.ti.EnableFocusReporting != "" { + t.enableFocus = t.ti.EnableFocusReporting + } else if t.ti.Mouse != "" || t.ti.XTermLike { + t.enableFocus = "\x1b[?1004h" + } + if t.ti.DisableFocusReporting != "" { + t.disableFocus = t.ti.DisableFocusReporting + } else if t.ti.Mouse != "" || t.ti.XTermLike { + t.disableFocus = "\x1b[?1004l" + } + + if t.ti.SetWindowTitle != "" { + t.setTitle = t.ti.SetWindowTitle + } else if t.ti.XTermLike { + t.saveTitle = "\x1b[22;2t" + t.restoreTitle = "\x1b[23;2t" + // this also tries to request that UTF-8 is allowed in the title + t.setTitle = "\x1b[>2t\x1b]2;%p1%s\x1b\\" + } + + if t.setClipboard == "" && t.ti.XTermLike { + // this string takes a base64 string and sends it to the clipboard. + // it will also be able to retrieve the clipboard using "?" as the + // sent string, when we support that. + t.setClipboard = "\x1b]52;c;%p1%s\x1b\\" + } +} + +func (t *tScreen) prepareCursorStyles() { + // Another workaround for lack of reporting in terminfo. + // We assume if the terminal has a mouse entry, that it + // offers bracketed paste. But we allow specific overrides + // via our terminal database. + if t.ti.CursorDefault != "" { + t.cursorStyles = map[CursorStyle]string{ + CursorStyleDefault: t.ti.CursorDefault, + CursorStyleBlinkingBlock: t.ti.CursorBlinkingBlock, + CursorStyleSteadyBlock: t.ti.CursorSteadyBlock, + CursorStyleBlinkingUnderline: t.ti.CursorBlinkingUnderline, + CursorStyleSteadyUnderline: t.ti.CursorSteadyUnderline, + CursorStyleBlinkingBar: t.ti.CursorBlinkingBar, + CursorStyleSteadyBar: t.ti.CursorSteadyBar, + } + } else if t.ti.Mouse != "" || t.ti.XTermLike { + t.cursorStyles = map[CursorStyle]string{ + CursorStyleDefault: "\x1b[0 q", + CursorStyleBlinkingBlock: "\x1b[1 q", + CursorStyleSteadyBlock: "\x1b[2 q", + CursorStyleBlinkingUnderline: "\x1b[3 q", + CursorStyleSteadyUnderline: "\x1b[4 q", + CursorStyleBlinkingBar: "\x1b[5 q", + CursorStyleSteadyBar: "\x1b[6 q", + } + } + if t.ti.CursorColorRGB != "" { + // if it was X11 style with just a single %p1%s, then convert + t.cursorRGB = t.ti.CursorColorRGB + } + if t.ti.CursorColorReset != "" { + t.cursorFg = t.ti.CursorColorReset + } + if t.cursorRGB == "" { + t.cursorRGB = "\x1b]12;%p1%s\007" + t.cursorFg = "\x1b]112\007" + } + + // convert XTERM style color names to RGB color code. We have no way to do palette colors + t.cursorRGB = strings.Replace(t.cursorRGB, "%p1%s", "#%p1%02x%p2%02x%p3%02x", 1) +} + +func (t *tScreen) prepareKey(key Key, val string) { + t.prepareKeyMod(key, ModNone, val) +} + +func (t *tScreen) prepareKeys() { + ti := t.ti + if strings.HasPrefix(ti.Name, "xterm") { + // assume its some form of XTerm clone + t.ti.XTermLike = true + ti.XTermLike = true + } + t.prepareKey(KeyBackspace, ti.KeyBackspace) + t.prepareKey(KeyF1, ti.KeyF1) + t.prepareKey(KeyF2, ti.KeyF2) + t.prepareKey(KeyF3, ti.KeyF3) + t.prepareKey(KeyF4, ti.KeyF4) + t.prepareKey(KeyF5, ti.KeyF5) + t.prepareKey(KeyF6, ti.KeyF6) + t.prepareKey(KeyF7, ti.KeyF7) + t.prepareKey(KeyF8, ti.KeyF8) + t.prepareKey(KeyF9, ti.KeyF9) + t.prepareKey(KeyF10, ti.KeyF10) + t.prepareKey(KeyF11, ti.KeyF11) + t.prepareKey(KeyF12, ti.KeyF12) + t.prepareKey(KeyF13, ti.KeyF13) + t.prepareKey(KeyF14, ti.KeyF14) + t.prepareKey(KeyF15, ti.KeyF15) + t.prepareKey(KeyF16, ti.KeyF16) + t.prepareKey(KeyF17, ti.KeyF17) + t.prepareKey(KeyF18, ti.KeyF18) + t.prepareKey(KeyF19, ti.KeyF19) + t.prepareKey(KeyF20, ti.KeyF20) + t.prepareKey(KeyF21, ti.KeyF21) + t.prepareKey(KeyF22, ti.KeyF22) + t.prepareKey(KeyF23, ti.KeyF23) + t.prepareKey(KeyF24, ti.KeyF24) + t.prepareKey(KeyF25, ti.KeyF25) + t.prepareKey(KeyF26, ti.KeyF26) + t.prepareKey(KeyF27, ti.KeyF27) + t.prepareKey(KeyF28, ti.KeyF28) + t.prepareKey(KeyF29, ti.KeyF29) + t.prepareKey(KeyF30, ti.KeyF30) + t.prepareKey(KeyF31, ti.KeyF31) + t.prepareKey(KeyF32, ti.KeyF32) + t.prepareKey(KeyF33, ti.KeyF33) + t.prepareKey(KeyF34, ti.KeyF34) + t.prepareKey(KeyF35, ti.KeyF35) + t.prepareKey(KeyF36, ti.KeyF36) + t.prepareKey(KeyF37, ti.KeyF37) + t.prepareKey(KeyF38, ti.KeyF38) + t.prepareKey(KeyF39, ti.KeyF39) + t.prepareKey(KeyF40, ti.KeyF40) + t.prepareKey(KeyF41, ti.KeyF41) + t.prepareKey(KeyF42, ti.KeyF42) + t.prepareKey(KeyF43, ti.KeyF43) + t.prepareKey(KeyF44, ti.KeyF44) + t.prepareKey(KeyF45, ti.KeyF45) + t.prepareKey(KeyF46, ti.KeyF46) + t.prepareKey(KeyF47, ti.KeyF47) + t.prepareKey(KeyF48, ti.KeyF48) + t.prepareKey(KeyF49, ti.KeyF49) + t.prepareKey(KeyF50, ti.KeyF50) + t.prepareKey(KeyF51, ti.KeyF51) + t.prepareKey(KeyF52, ti.KeyF52) + t.prepareKey(KeyF53, ti.KeyF53) + t.prepareKey(KeyF54, ti.KeyF54) + t.prepareKey(KeyF55, ti.KeyF55) + t.prepareKey(KeyF56, ti.KeyF56) + t.prepareKey(KeyF57, ti.KeyF57) + t.prepareKey(KeyF58, ti.KeyF58) + t.prepareKey(KeyF59, ti.KeyF59) + t.prepareKey(KeyF60, ti.KeyF60) + t.prepareKey(KeyF61, ti.KeyF61) + t.prepareKey(KeyF62, ti.KeyF62) + t.prepareKey(KeyF63, ti.KeyF63) + t.prepareKey(KeyF64, ti.KeyF64) + t.prepareKey(KeyInsert, ti.KeyInsert) + t.prepareKey(KeyDelete, ti.KeyDelete) + t.prepareKey(KeyHome, ti.KeyHome) + t.prepareKey(KeyEnd, ti.KeyEnd) + t.prepareKey(KeyUp, ti.KeyUp) + t.prepareKey(KeyDown, ti.KeyDown) + t.prepareKey(KeyLeft, ti.KeyLeft) + t.prepareKey(KeyRight, ti.KeyRight) + t.prepareKey(KeyPgUp, ti.KeyPgUp) + t.prepareKey(KeyPgDn, ti.KeyPgDn) + t.prepareKey(KeyHelp, ti.KeyHelp) + t.prepareKey(KeyPrint, ti.KeyPrint) + t.prepareKey(KeyCancel, ti.KeyCancel) + t.prepareKey(KeyExit, ti.KeyExit) + t.prepareKey(KeyBacktab, ti.KeyBacktab) + + t.prepareKeyMod(KeyRight, ModShift, ti.KeyShfRight) + t.prepareKeyMod(KeyLeft, ModShift, ti.KeyShfLeft) + t.prepareKeyMod(KeyUp, ModShift, ti.KeyShfUp) + t.prepareKeyMod(KeyDown, ModShift, ti.KeyShfDown) + t.prepareKeyMod(KeyHome, ModShift, ti.KeyShfHome) + t.prepareKeyMod(KeyEnd, ModShift, ti.KeyShfEnd) + t.prepareKeyMod(KeyPgUp, ModShift, ti.KeyShfPgUp) + t.prepareKeyMod(KeyPgDn, ModShift, ti.KeyShfPgDn) + + t.prepareKeyMod(KeyRight, ModCtrl, ti.KeyCtrlRight) + t.prepareKeyMod(KeyLeft, ModCtrl, ti.KeyCtrlLeft) + t.prepareKeyMod(KeyUp, ModCtrl, ti.KeyCtrlUp) + t.prepareKeyMod(KeyDown, ModCtrl, ti.KeyCtrlDown) + t.prepareKeyMod(KeyHome, ModCtrl, ti.KeyCtrlHome) + t.prepareKeyMod(KeyEnd, ModCtrl, ti.KeyCtrlEnd) + + // Sadly, xterm handling of keycodes is somewhat erratic. In + // particular, different codes are sent depending on application + // mode is in use or not, and the entries for many of these are + // simply absent from terminfo on many systems. So we insert + // a number of escape sequences if they are not already used, in + // order to have the widest correct usage. Note that prepareKey + // will not inject codes if the escape sequence is already known. + // We also only do this for terminals that have the application + // mode present. + + // Cursor mode + if ti.EnterKeypad != "" { + t.prepareKey(KeyUp, "\x1b[A") + t.prepareKey(KeyDown, "\x1b[B") + t.prepareKey(KeyRight, "\x1b[C") + t.prepareKey(KeyLeft, "\x1b[D") + t.prepareKey(KeyEnd, "\x1b[F") + t.prepareKey(KeyHome, "\x1b[H") + t.prepareKey(KeyDelete, "\x1b[3~") + t.prepareKey(KeyHome, "\x1b[1~") + t.prepareKey(KeyEnd, "\x1b[4~") + t.prepareKey(KeyPgUp, "\x1b[5~") + t.prepareKey(KeyPgDn, "\x1b[6~") + + // Application mode + t.prepareKey(KeyUp, "\x1bOA") + t.prepareKey(KeyDown, "\x1bOB") + t.prepareKey(KeyRight, "\x1bOC") + t.prepareKey(KeyLeft, "\x1bOD") + t.prepareKey(KeyHome, "\x1bOH") + } + + t.prepareKey(keyPasteStart, ti.PasteStart) + t.prepareKey(keyPasteEnd, ti.PasteEnd) + t.prepareXtermModifiers() + t.prepareBracketedPaste() + t.prepareCursorStyles() + t.prepareUnderlines() + t.prepareExtendedOSC() + +outer: + // Add key mappings for control keys. + for i := 0; i < ' '; i++ { + // Do not insert direct key codes for ambiguous keys. + // For example, ESC is used for lots of other keys, so + // when parsing this we don't want to fast path handling + // of it, but instead wait a bit before parsing it as in + // isolation. + for esc := range t.keycodes { + if []byte(esc)[0] == byte(i) { + continue outer + } + } + + t.keyexist[Key(i)] = true + + mod := ModCtrl + switch Key(i) { + case KeyBS, KeyTAB, KeyESC, KeyCR: + // directly type-able- no control sequence + mod = ModNone + } + t.keycodes[string(rune(i))] = &tKeyCode{key: Key(i), mod: mod} + } +} + +func (t *tScreen) Fini() { + t.finiOnce.Do(t.finish) +} + +func (t *tScreen) finish() { + close(t.quit) + t.finalize() +} + +func (t *tScreen) SetStyle(style Style) { + t.Lock() + if !t.fini { + t.style = style + } + t.Unlock() +} + +func (t *tScreen) encodeRune(r rune, buf []byte) []byte { + + nb := make([]byte, 6) + ob := make([]byte, 6) + num := utf8.EncodeRune(ob, r) + ob = ob[:num] + dst := 0 + var err error + if enc := t.encoder; enc != nil { + enc.Reset() + dst, _, err = enc.Transform(nb, ob, true) + } + if err != nil || dst == 0 || nb[0] == '\x1a' { + // Combining characters are elided + if len(buf) == 0 { + if acs, ok := t.acs[r]; ok { + buf = append(buf, []byte(acs)...) + } else if fb, ok := t.fallback[r]; ok { + buf = append(buf, []byte(fb)...) + } else { + buf = append(buf, '?') + } + } + } else { + buf = append(buf, nb[:dst]...) + } + + return buf +} + +func (t *tScreen) sendFgBg(fg Color, bg Color, attr AttrMask) AttrMask { + ti := t.ti + if ti.Colors == 0 { + // foreground vs background, we calculate luminance + // and possibly do a reverse video + if !fg.Valid() { + return attr + } + v, ok := t.colors[fg] + if !ok { + v = FindColor(fg, []Color{ColorBlack, ColorWhite}) + t.colors[fg] = v + } + switch v { + case ColorWhite: + return attr + case ColorBlack: + return attr ^ AttrReverse + } + } + + if fg == ColorReset || bg == ColorReset { + t.TPuts(ti.ResetFgBg) + } + if t.truecolor { + if ti.SetFgBgRGB != "" && fg.IsRGB() && bg.IsRGB() { + r1, g1, b1 := fg.RGB() + r2, g2, b2 := bg.RGB() + t.TPuts(ti.TParm(ti.SetFgBgRGB, + int(r1), int(g1), int(b1), + int(r2), int(g2), int(b2))) + return attr + } + + if fg.IsRGB() && ti.SetFgRGB != "" { + r, g, b := fg.RGB() + t.TPuts(ti.TParm(ti.SetFgRGB, int(r), int(g), int(b))) + fg = ColorDefault + } + + if bg.IsRGB() && ti.SetBgRGB != "" { + r, g, b := bg.RGB() + t.TPuts(ti.TParm(ti.SetBgRGB, + int(r), int(g), int(b))) + bg = ColorDefault + } + } + + if fg.Valid() { + if v, ok := t.colors[fg]; ok { + fg = v + } else { + v = FindColor(fg, t.palette) + t.colors[fg] = v + fg = v + } + } + + if bg.Valid() { + if v, ok := t.colors[bg]; ok { + bg = v + } else { + v = FindColor(bg, t.palette) + t.colors[bg] = v + bg = v + } + } + + if fg.Valid() && bg.Valid() && ti.SetFgBg != "" { + t.TPuts(ti.TParm(ti.SetFgBg, int(fg&0xff), int(bg&0xff))) + } else { + if fg.Valid() && ti.SetFg != "" { + t.TPuts(ti.TParm(ti.SetFg, int(fg&0xff))) + } + if bg.Valid() && ti.SetBg != "" { + t.TPuts(ti.TParm(ti.SetBg, int(bg&0xff))) + } + } + return attr +} + +func (t *tScreen) drawCell(x, y int) int { + + ti := t.ti + + mainc, combc, style, width := t.cells.GetContent(x, y) + if !t.cells.Dirty(x, y) { + return width + } + + if y == t.h-1 && x == t.w-1 && t.ti.AutoMargin && ti.DisableAutoMargin == "" && ti.InsertChar != "" { + // our solution is somewhat goofy. + // we write to the second to the last cell what we want in the last cell, then we + // insert a character at that 2nd to last position to shift the last column into + // place, then we rewrite that 2nd to last cell. Old terminals suck. + t.TPuts(ti.TGoto(x-1, y)) + defer func() { + t.TPuts(ti.TGoto(x-1, y)) + t.TPuts(ti.InsertChar) + t.cy = y + t.cx = x - 1 + t.cells.SetDirty(x-1, y, true) + _ = t.drawCell(x-1, y) + t.TPuts(t.ti.TGoto(0, 0)) + t.cy = 0 + t.cx = 0 + }() + } else if t.cy != y || t.cx != x { + t.TPuts(ti.TGoto(x, y)) + t.cx = x + t.cy = y + } + + if style == StyleDefault { + style = t.style + } + if style != t.curstyle { + fg, bg, attrs := style.fg, style.bg, style.attrs + + t.TPuts(ti.AttrOff) + + attrs = t.sendFgBg(fg, bg, attrs) + if attrs&AttrBold != 0 { + t.TPuts(ti.Bold) + } + if us, uc := style.ulStyle, style.ulColor; us != UnderlineStyleNone { + if t.underColor != "" || t.underRGB != "" { + if uc == ColorReset { + t.TPuts(t.underFg) + } else if uc.IsRGB() { + if t.underRGB != "" { + r, g, b := uc.RGB() + t.TPuts(ti.TParm(t.underRGB, int(r), int(g), int(b))) + } else { + if v, ok := t.colors[uc]; ok { + uc = v + } else { + v = FindColor(uc, t.palette) + t.colors[uc] = v + uc = v + } + t.TPuts(ti.TParm(t.underColor, int(uc&0xff))) + } + } else if uc.Valid() { + t.TPuts(ti.TParm(t.underColor, int(uc&0xff))) + } + } + t.TPuts(ti.Underline) // to ensure everyone gets at least a basic underline + switch us { + case UnderlineStyleDouble: + t.TPuts(t.doubleUnder) + case UnderlineStyleCurly: + t.TPuts(t.curlyUnder) + case UnderlineStyleDotted: + t.TPuts(t.dottedUnder) + case UnderlineStyleDashed: + t.TPuts(t.dashedUnder) + } + } + if attrs&AttrReverse != 0 { + t.TPuts(ti.Reverse) + } + if attrs&AttrBlink != 0 { + t.TPuts(ti.Blink) + } + if attrs&AttrDim != 0 { + t.TPuts(ti.Dim) + } + if attrs&AttrItalic != 0 { + t.TPuts(ti.Italic) + } + if attrs&AttrStrikeThrough != 0 { + t.TPuts(ti.StrikeThrough) + } + + // URL string can be long, so don't send it unless we really need to + if t.enterUrl != "" && t.curstyle.url != style.url { + if style.url != "" { + t.TPuts(ti.TParm(t.enterUrl, style.url, style.urlId)) + } else { + t.TPuts(t.exitUrl) + } + } + + t.curstyle = style + } + + // now emit runes - taking care to not overrun width with a + // wide character, and to ensure that we emit exactly one regular + // character followed up by any residual combing characters + + if width < 1 { + width = 1 + } + + var str string + + buf := make([]byte, 0, 6) + + buf = t.encodeRune(mainc, buf) + for _, r := range combc { + buf = t.encodeRune(r, buf) + } + + str = string(buf) + if width > 1 && str == "?" { + // No FullWidth character support + str = "? " + t.cx = -1 + } + + if x > t.w-width { + // too wide to fit; emit a single space instead + width = 1 + str = " " + } + t.writeString(str) + t.cx += width + t.cells.SetDirty(x, y, false) + if width > 1 { + t.cx = -1 + } + + return width +} + +func (t *tScreen) ShowCursor(x, y int) { + t.Lock() + t.cursorx = x + t.cursory = y + t.Unlock() +} + +func (t *tScreen) SetCursor(cs CursorStyle, cc Color) { + t.Lock() + t.cursorStyle = cs + t.cursorColor = cc + t.Unlock() +} + +func (t *tScreen) HideCursor() { + t.ShowCursor(-1, -1) +} + +func (t *tScreen) showCursor() { + + x, y := t.cursorx, t.cursory + w, h := t.cells.Size() + if x < 0 || y < 0 || x >= w || y >= h { + t.hideCursor() + return + } + t.TPuts(t.ti.TGoto(x, y)) + t.TPuts(t.ti.ShowCursor) + if t.cursorStyles != nil { + if esc, ok := t.cursorStyles[t.cursorStyle]; ok { + t.TPuts(esc) + } + } + if t.cursorRGB != "" { + if t.cursorColor == ColorReset { + t.TPuts(t.cursorFg) + } else if t.cursorColor.Valid() { + r, g, b := t.cursorColor.RGB() + t.TPuts(t.ti.TParm(t.cursorRGB, int(r), int(g), int(b))) + } + } + t.cx = x + t.cy = y +} + +// writeString sends a string to the terminal. The string is sent as-is and +// this function does not expand inline padding indications (of the form +// $<[delay]> where [delay] is msec). In order to have these expanded, use +// TPuts. If the screen is "buffering", the string is collected in a buffer, +// with the intention that the entire buffer be sent to the terminal in one +// write operation at some point later. +func (t *tScreen) writeString(s string) { + if t.buffering { + _, _ = io.WriteString(&t.buf, s) + } else { + _, _ = io.WriteString(t.tty, s) + } +} + +func (t *tScreen) TPuts(s string) { + if t.buffering { + t.ti.TPuts(&t.buf, s) + } else { + t.ti.TPuts(t.tty, s) + } +} + +func (t *tScreen) Show() { + t.Lock() + if !t.fini { + t.resize() + t.draw() + } + t.Unlock() +} + +func (t *tScreen) clearScreen() { + t.TPuts(t.ti.AttrOff) + t.TPuts(t.exitUrl) + _ = t.sendFgBg(t.style.fg, t.style.bg, AttrNone) + t.TPuts(t.ti.Clear) + t.clear = false +} + +func (t *tScreen) hideCursor() { + // does not update cursor position + if t.ti.HideCursor != "" { + t.TPuts(t.ti.HideCursor) + } else { + // No way to hide cursor, stick it + // at bottom right of screen + t.cx, t.cy = t.cells.Size() + t.TPuts(t.ti.TGoto(t.cx, t.cy)) + } +} + +func (t *tScreen) draw() { + // clobber cursor position, because we're going to change it all + t.cx = -1 + t.cy = -1 + // make no style assumptions + t.curstyle = styleInvalid + + t.buf.Reset() + t.buffering = true + defer func() { + t.buffering = false + }() + + // hide the cursor while we move stuff around + t.hideCursor() + + if t.clear { + t.clearScreen() + } + + for y := 0; y < t.h; y++ { + for x := 0; x < t.w; x++ { + width := t.drawCell(x, y) + if width > 1 { + if x+1 < t.w { + // this is necessary so that if we ever + // go back to drawing that cell, we + // actually will *draw* it. + t.cells.SetDirty(x+1, y, true) + } + } + x += width - 1 + } + } + + // restore the cursor + t.showCursor() + + _, _ = t.buf.WriteTo(t.tty) +} + +func (t *tScreen) EnableMouse(flags ...MouseFlags) { + var f MouseFlags + flagsPresent := false + for _, flag := range flags { + f |= flag + flagsPresent = true + } + if !flagsPresent { + f = MouseMotionEvents | MouseDragEvents | MouseButtonEvents + } + + t.Lock() + t.mouseFlags = f + t.enableMouse(f) + t.Unlock() +} + +func (t *tScreen) enableMouse(f MouseFlags) { + // Rather than using terminfo to find mouse escape sequences, we rely on the fact that + // pretty much *every* terminal that supports mouse tracking follows the + // XTerm standards (the modern ones). + if len(t.mouse) != 0 { + // start by disabling all tracking. + t.TPuts("\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l") + if f&MouseButtonEvents != 0 { + t.TPuts("\x1b[?1000h") + } + if f&MouseDragEvents != 0 { + t.TPuts("\x1b[?1002h") + } + if f&MouseMotionEvents != 0 { + t.TPuts("\x1b[?1003h") + } + if f&(MouseButtonEvents|MouseDragEvents|MouseMotionEvents) != 0 { + t.TPuts("\x1b[?1006h") + } + } + +} + +func (t *tScreen) DisableMouse() { + t.Lock() + t.mouseFlags = 0 + t.enableMouse(0) + t.Unlock() +} + +func (t *tScreen) EnablePaste() { + t.Lock() + t.pasteEnabled = true + t.enablePasting(true) + t.Unlock() +} + +func (t *tScreen) DisablePaste() { + t.Lock() + t.pasteEnabled = false + t.enablePasting(false) + t.Unlock() +} + +func (t *tScreen) enablePasting(on bool) { + var s string + if on { + s = t.enablePaste + } else { + s = t.disablePaste + } + if s != "" { + t.TPuts(s) + } +} + +func (t *tScreen) EnableFocus() { + t.Lock() + t.focusEnabled = true + t.enableFocusReporting() + t.Unlock() +} + +func (t *tScreen) DisableFocus() { + t.Lock() + t.focusEnabled = false + t.disableFocusReporting() + t.Unlock() +} + +func (t *tScreen) enableFocusReporting() { + if t.enableFocus != "" { + t.TPuts(t.enableFocus) + } +} + +func (t *tScreen) disableFocusReporting() { + if t.disableFocus != "" { + t.TPuts(t.disableFocus) + } +} + +func (t *tScreen) Size() (int, int) { + t.Lock() + w, h := t.w, t.h + t.Unlock() + return w, h +} + +func (t *tScreen) resize() { + ws, err := t.tty.WindowSize() + if err != nil { + return + } + if ws.Width == t.w && ws.Height == t.h { + return + } + t.cx = -1 + t.cy = -1 + + t.cells.Resize(ws.Width, ws.Height) + t.cells.Invalidate() + t.h = ws.Height + t.w = ws.Width + ev := &EventResize{t: time.Now(), ws: ws} + select { + case t.eventQ <- ev: + default: + } +} + +func (t *tScreen) Colors() int { + // this doesn't change, no need for lock + if t.truecolor { + return 1 << 24 + } + return t.ti.Colors +} + +// nColors returns the size of the built-in palette. +// This is distinct from Colors(), as it will generally +// always be a small number. (<= 256) +func (t *tScreen) nColors() int { + return t.ti.Colors +} + +// vtACSNames is a map of bytes defined by terminfo that are used in +// the terminals Alternate Character Set to represent other glyphs. +// For example, the upper left corner of the box drawing set can be +// displayed by printing "l" while in the alternate character set. +// It's not quite that simple, since the "l" is the terminfo name, +// and it may be necessary to use a different character based on +// the terminal implementation (or the terminal may lack support for +// this altogether). See buildAcsMap below for detail. +var vtACSNames = map[byte]rune{ + '+': RuneRArrow, + ',': RuneLArrow, + '-': RuneUArrow, + '.': RuneDArrow, + '0': RuneBlock, + '`': RuneDiamond, + 'a': RuneCkBoard, + 'b': '␉', // VT100, Not defined by terminfo + 'c': '␌', // VT100, Not defined by terminfo + 'd': '␋', // VT100, Not defined by terminfo + 'e': '␊', // VT100, Not defined by terminfo + 'f': RuneDegree, + 'g': RunePlMinus, + 'h': RuneBoard, + 'i': RuneLantern, + 'j': RuneLRCorner, + 'k': RuneURCorner, + 'l': RuneULCorner, + 'm': RuneLLCorner, + 'n': RunePlus, + 'o': RuneS1, + 'p': RuneS3, + 'q': RuneHLine, + 'r': RuneS7, + 's': RuneS9, + 't': RuneLTee, + 'u': RuneRTee, + 'v': RuneBTee, + 'w': RuneTTee, + 'x': RuneVLine, + 'y': RuneLEqual, + 'z': RuneGEqual, + '{': RunePi, + '|': RuneNEqual, + '}': RuneSterling, + '~': RuneBullet, +} + +// buildAcsMap builds a map of characters that we translate from Unicode to +// alternate character encodings. To do this, we use the standard VT100 ACS +// maps. This is only done if the terminal lacks support for Unicode; we +// always prefer to emit Unicode glyphs when we are able. +func (t *tScreen) buildAcsMap() { + acsstr := t.ti.AltChars + t.acs = make(map[rune]string) + for len(acsstr) > 2 { + srcv := acsstr[0] + dstv := string(acsstr[1]) + if r, ok := vtACSNames[srcv]; ok { + t.acs[r] = t.ti.EnterAcs + dstv + t.ti.ExitAcs + } + acsstr = acsstr[2:] + } +} + +func (t *tScreen) clip(x, y int) (int, int) { + w, h := t.cells.Size() + if x < 0 { + x = 0 + } + if y < 0 { + y = 0 + } + if x > w-1 { + x = w - 1 + } + if y > h-1 { + y = h - 1 + } + return x, y +} + +// buildMouseEvent returns an event based on the supplied coordinates and button +// state. Note that the screen's mouse button state is updated based on the +// input to this function (i.e. it mutates the receiver). +func (t *tScreen) buildMouseEvent(x, y, btn int) *EventMouse { + + // XTerm mouse events only report at most one button at a time, + // which may include a wheel button. Wheel motion events are + // reported as single impulses, while other button events are reported + // as separate press & release events. + + button := ButtonNone + mod := ModNone + + // Mouse wheel has bit 6 set, no release events. It should be noted + // that wheel events are sometimes misdelivered as mouse button events + // during a click-drag, so we debounce these, considering them to be + // button press events unless we see an intervening release event. + switch btn & 0x43 { + case 0: + button = Button1 + case 1: + button = Button3 // Note we prefer to treat right as button 2 + case 2: + button = Button2 // And the middle button as button 3 + case 3: + button = ButtonNone + case 0x40: + button = WheelUp + case 0x41: + button = WheelDown + case 0x42: + button = WheelLeft + case 0x43: + button = WheelRight + } + + if btn&0x4 != 0 { + mod |= ModShift + } + if btn&0x8 != 0 { + mod |= ModAlt + } + if btn&0x10 != 0 { + mod |= ModCtrl + } + + // Some terminals will report mouse coordinates outside the + // screen, especially with click-drag events. Clip the coordinates + // to the screen in that case. + x, y = t.clip(x, y) + + return NewEventMouse(x, y, button, mod) +} + +// parseSgrMouse attempts to locate an SGR mouse record at the start of the +// buffer. It returns true, true if it found one, and the associated bytes +// be removed from the buffer. It returns true, false if the buffer might +// contain such an event, but more bytes are necessary (partial match), and +// false, false if the content is definitely *not* an SGR mouse record. +func (t *tScreen) parseSgrMouse(buf *bytes.Buffer, evs *[]Event) (bool, bool) { + + b := buf.Bytes() + + var x, y, btn, state int + dig := false + neg := false + motion := false + scroll := false + i := 0 + val := 0 + + for i = range b { + switch b[i] { + case '\x1b': + if state != 0 { + return false, false + } + state = 1 + + case '\x9b': + if state != 0 { + return false, false + } + state = 2 + + case '[': + if state != 1 { + return false, false + } + state = 2 + + case '<': + if state != 2 { + return false, false + } + val = 0 + dig = false + neg = false + state = 3 + + case '-': + if state != 3 && state != 4 && state != 5 { + return false, false + } + if dig || neg { + return false, false + } + neg = true // stay in state + + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + if state != 3 && state != 4 && state != 5 { + return false, false + } + val *= 10 + val += int(b[i] - '0') + dig = true // stay in state + + case ';': + if neg { + val = -val + } + switch state { + case 3: + btn, val = val, 0 + neg, dig, state = false, false, 4 + case 4: + x, val = val-1, 0 + neg, dig, state = false, false, 5 + default: + return false, false + } + + case 'm', 'M': + if state != 5 { + return false, false + } + if neg { + val = -val + } + y = val - 1 + + motion = (btn & 32) != 0 + scroll = (btn & 0x42) == 0x40 + btn &^= 32 + if b[i] == 'm' { + // mouse release, clear all buttons + btn |= 3 + btn &^= 0x40 + t.buttondn = false + } else if motion { + /* + * Some broken terminals appear to send + * mouse button one motion events, instead of + * encoding 35 (no buttons) into these events. + * We resolve these by looking for a non-motion + * event first. + */ + if !t.buttondn { + btn |= 3 + btn &^= 0x40 + } + } else if !scroll { + t.buttondn = true + } + // consume the event bytes + for i >= 0 { + _, _ = buf.ReadByte() + i-- + } + *evs = append(*evs, t.buildMouseEvent(x, y, btn)) + return true, true + } + } + + // incomplete & inconclusive at this point + return true, false +} + +func (t *tScreen) parseFocus(buf *bytes.Buffer, evs *[]Event) (bool, bool) { + state := 0 + b := buf.Bytes() + for i := range b { + switch state { + case 0: + if b[i] != '\x1b' { + return false, false + } + state = 1 + case 1: + if b[i] != '[' { + return false, false + } + state = 2 + case 2: + if b[i] != 'I' && b[i] != 'O' { + return false, false + } + *evs = append(*evs, NewEventFocus(b[i] == 'I')) + _, _ = buf.ReadByte() + _, _ = buf.ReadByte() + _, _ = buf.ReadByte() + return true, true + } + } + return true, false +} + +func (t *tScreen) parseClipboard(buf *bytes.Buffer, evs *[]Event) (bool, bool) { + b := buf.Bytes() + state := 0 + prefix := []byte("\x1b]52;c;") + + if len(prefix) >= len(b) { + if bytes.HasPrefix(prefix, b) { + // inconclusive so far + return true, false + } + // definitely not a match + return false, false + } + b = b[len(prefix):] + + for _, c := range b { + // valid base64 digits + if state == 0 { + if (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c == '+') || (c == '/') || (c == '=') { + continue + } + if c == '\x1b' { + state = 1 + continue + } + if c == '\a' { + // matched with BEL instead of ST + b = b[:len(b)-1] // drop the trailing BEL + decoded := make([]byte, base64.StdEncoding.DecodedLen(len(b))) + if num, err := base64.StdEncoding.Decode(decoded, b); err == nil { + *evs = append(*evs, NewEventClipboard(decoded[:num])) + } + _, _ = buf.ReadBytes('\a') + return true, true + } + return false, false + } + if state == 1 { + if c == '\\' { + b = b[:len(b)-2] // drop the trailing ST (\x1b\\) + // now decode the data + decoded := make([]byte, base64.StdEncoding.DecodedLen(len(b))) + if num, err := base64.StdEncoding.Decode(decoded, b); err == nil { + *evs = append(*evs, NewEventClipboard(decoded[:num])) + } + _, _ = buf.ReadBytes('\\') + return true, true + } + return false, false + } + } + // not enough data yet (not terminated) + return true, false +} + +// parseXtermMouse is like parseSgrMouse, but it parses a legacy +// X11 mouse record. +func (t *tScreen) parseXtermMouse(buf *bytes.Buffer, evs *[]Event) (bool, bool) { + + b := buf.Bytes() + + state := 0 + btn := 0 + x := 0 + y := 0 + + for i := range b { + switch state { + case 0: + switch b[i] { + case '\x1b': + state = 1 + case '\x9b': + state = 2 + default: + return false, false + } + case 1: + if b[i] != '[' { + return false, false + } + state = 2 + case 2: + if b[i] != 'M' { + return false, false + } + state++ + case 3: + btn = int(b[i]) + state++ + case 4: + x = int(b[i]) - 32 - 1 + state++ + case 5: + y = int(b[i]) - 32 - 1 + for i >= 0 { + _, _ = buf.ReadByte() + i-- + } + *evs = append(*evs, t.buildMouseEvent(x, y, btn)) + return true, true + } + } + return true, false +} + +func (t *tScreen) parseFunctionKey(buf *bytes.Buffer, evs *[]Event) (bool, bool) { + b := buf.Bytes() + partial := false + for e, k := range t.keycodes { + esc := []byte(e) + if (len(esc) == 1) && (esc[0] == '\x1b') { + continue + } + if bytes.HasPrefix(b, esc) { + // matched + var r rune + if len(esc) == 1 { + r = rune(b[0]) + } + mod := k.mod + if t.escaped { + mod |= ModAlt + t.escaped = false + } + switch k.key { + case keyPasteStart: + *evs = append(*evs, NewEventPaste(true)) + case keyPasteEnd: + *evs = append(*evs, NewEventPaste(false)) + default: + *evs = append(*evs, NewEventKey(k.key, r, mod)) + } + for i := 0; i < len(esc); i++ { + _, _ = buf.ReadByte() + } + return true, true + } + if bytes.HasPrefix(esc, b) { + partial = true + } + } + return partial, false +} + +func (t *tScreen) parseRune(buf *bytes.Buffer, evs *[]Event) (bool, bool) { + b := buf.Bytes() + if b[0] >= ' ' && b[0] <= 0x7F { + // printable ASCII easy to deal with -- no encodings + mod := ModNone + if t.escaped { + mod = ModAlt + t.escaped = false + } + *evs = append(*evs, NewEventKey(KeyRune, rune(b[0]), mod)) + _, _ = buf.ReadByte() + return true, true + } + + if b[0] < 0x80 { + // Low numbered values are control keys, not runes. + return false, false + } + + utf := make([]byte, 12) + for l := 1; l <= len(b); l++ { + t.decoder.Reset() + nOut, nIn, e := t.decoder.Transform(utf, b[:l], true) + if e == transform.ErrShortSrc { + continue + } + if nOut != 0 { + r, _ := utf8.DecodeRune(utf[:nOut]) + if r != utf8.RuneError { + mod := ModNone + if t.escaped { + mod = ModAlt + t.escaped = false + } + *evs = append(*evs, NewEventKey(KeyRune, r, mod)) + } + for nIn > 0 { + _, _ = buf.ReadByte() + nIn-- + } + return true, true + } + } + // Looks like potential escape + return true, false +} + +func (t *tScreen) scanInput(buf *bytes.Buffer, expire bool) { + evs := t.collectEventsFromInput(buf, expire) + + for _, ev := range evs { + select { + case t.eventQ <- ev: + case <-t.quit: + return + } + } +} + +// Return an array of Events extracted from the supplied buffer. This is done +// while holding the screen's lock - the events can then be queued for +// application processing with the lock released. +func (t *tScreen) collectEventsFromInput(buf *bytes.Buffer, expire bool) []Event { + + res := make([]Event, 0, 20) + + t.Lock() + defer t.Unlock() + + for { + b := buf.Bytes() + if len(b) == 0 { + buf.Reset() + return res + } + + partials := 0 + + if part, comp := t.parseRune(buf, &res); comp { + continue + } else if part { + partials++ + } + + if part, comp := t.parseFunctionKey(buf, &res); comp { + continue + } else if part { + partials++ + } + + if part, comp := t.parseFocus(buf, &res); comp { + continue + } else if part { + partials++ + } + + // Only parse mouse records if this term claims to have + // mouse support + + if t.ti.Mouse != "" { + if part, comp := t.parseXtermMouse(buf, &res); comp { + continue + } else if part { + partials++ + } + + if part, comp := t.parseSgrMouse(buf, &res); comp { + continue + } else if part { + partials++ + } + } + + if t.setClipboard != "" { + if part, comp := t.parseClipboard(buf, &res); comp { + continue + } else if part { + partials++ + } + } + + if partials == 0 || expire { + if b[0] == '\x1b' { + if len(b) == 1 { + res = append(res, NewEventKey(KeyEsc, 0, ModNone)) + t.escaped = false + } else { + t.escaped = true + } + _, _ = buf.ReadByte() + continue + } + // Nothing was going to match, or we timed-out + // waiting for more data -- just deliver the characters + // to the app & let them sort it out. Possibly we + // should only do this for control characters like ESC. + by, _ := buf.ReadByte() + mod := ModNone + if t.escaped { + t.escaped = false + mod = ModAlt + } + res = append(res, NewEventKey(KeyRune, rune(by), mod)) + continue + } + + // well we have some partial data, wait until we get + // some more + break + } + + return res +} + +func (t *tScreen) mainLoop(stopQ chan struct{}) { + defer t.wg.Done() + buf := &bytes.Buffer{} + for { + select { + case <-stopQ: + return + case <-t.quit: + return + case <-t.resizeQ: + t.Lock() + t.cx = -1 + t.cy = -1 + t.resize() + t.cells.Invalidate() + t.draw() + t.Unlock() + continue + case <-t.keytimer.C: + // If the timer fired, and the current time + // is after the expiration of the escape sequence, + // then we assume the escape sequence reached its + // conclusion, and process the chunk independently. + // This lets us detect conflicts such as a lone ESC. + if buf.Len() > 0 { + if time.Now().After(t.keyexpire) { + t.scanInput(buf, true) + } + } + if buf.Len() > 0 { + if !t.keytimer.Stop() { + select { + case <-t.keytimer.C: + default: + } + } + t.keytimer.Reset(time.Millisecond * 50) + } + case chunk := <-t.keychan: + buf.Write(chunk) + t.keyexpire = time.Now().Add(time.Millisecond * 50) + t.scanInput(buf, false) + if !t.keytimer.Stop() { + select { + case <-t.keytimer.C: + default: + } + } + if buf.Len() > 0 { + t.keytimer.Reset(time.Millisecond * 50) + } + } + } +} + +func (t *tScreen) inputLoop(stopQ chan struct{}) { + + defer t.wg.Done() + for { + select { + case <-stopQ: + return + default: + } + chunk := make([]byte, 128) + n, e := t.tty.Read(chunk) + switch e { + case nil: + default: + t.Lock() + running := t.running + t.Unlock() + if running { + select { + case t.eventQ <- NewEventError(e): + case <-t.quit: + } + } + return + } + if n > 0 { + t.keychan <- chunk[:n] + } + } +} + +func (t *tScreen) Sync() { + t.Lock() + t.cx = -1 + t.cy = -1 + if !t.fini { + t.resize() + t.clear = true + t.cells.Invalidate() + t.draw() + } + t.Unlock() +} + +func (t *tScreen) CharacterSet() string { + return t.charset +} + +func (t *tScreen) RegisterRuneFallback(orig rune, fallback string) { + t.Lock() + t.fallback[orig] = fallback + t.Unlock() +} + +func (t *tScreen) UnregisterRuneFallback(orig rune) { + t.Lock() + delete(t.fallback, orig) + t.Unlock() +} + +func (t *tScreen) CanDisplay(r rune, checkFallbacks bool) bool { + + if enc := t.encoder; enc != nil { + nb := make([]byte, 6) + ob := make([]byte, 6) + num := utf8.EncodeRune(ob, r) + + enc.Reset() + dst, _, err := enc.Transform(nb, ob[:num], true) + if dst != 0 && err == nil && nb[0] != '\x1A' { + return true + } + } + // Terminal fallbacks always permitted, since we assume they are + // basically nearly perfect renditions. + if _, ok := t.acs[r]; ok { + return true + } + if !checkFallbacks { + return false + } + if _, ok := t.fallback[r]; ok { + return true + } + return false +} + +func (t *tScreen) HasMouse() bool { + return len(t.mouse) != 0 +} + +func (t *tScreen) HasKey(k Key) bool { + if k == KeyRune { + return true + } + return t.keyexist[k] +} + +func (t *tScreen) SetSize(w, h int) { + if t.setWinSize != "" { + t.TPuts(t.ti.TParm(t.setWinSize, w, h)) + } + t.cells.Invalidate() + t.resize() +} + +func (t *tScreen) Resize(int, int, int, int) {} + +func (t *tScreen) Suspend() error { + t.disengage() + return nil +} + +func (t *tScreen) Resume() error { + return t.engage() +} + +func (t *tScreen) Tty() (Tty, bool) { + return t.tty, true +} + +// engage is used to place the terminal in raw mode and establish screen size, etc. +// Think of this is as tcell "engaging" the clutch, as it's going to be driving the +// terminal interface. +func (t *tScreen) engage() error { + t.Lock() + defer t.Unlock() + if t.tty == nil { + return ErrNoScreen + } + t.tty.NotifyResize(func() { + select { + case t.resizeQ <- true: + default: + } + }) + if t.running { + return errors.New("already engaged") + } + if err := t.tty.Start(); err != nil { + return err + } + t.running = true + if ws, err := t.tty.WindowSize(); err == nil && ws.Width != 0 && ws.Height != 0 { + t.cells.Resize(ws.Width, ws.Height) + } + stopQ := make(chan struct{}) + t.stopQ = stopQ + t.enableMouse(t.mouseFlags) + t.enablePasting(t.pasteEnabled) + if t.focusEnabled { + t.enableFocusReporting() + } + + ti := t.ti + if os.Getenv("TCELL_ALTSCREEN") != "disable" { + // Technically this may not be right, but every terminal we know about + // (even Wyse 60) uses this to enter the alternate screen buffer, and + // possibly save and restore the window title and/or icon. + // (In theory there could be terminals that don't support X,Y cursor + // positions without a setup command, but we don't support them.) + t.TPuts(ti.EnterCA) + if t.saveTitle != "" { + t.TPuts(t.saveTitle) + } + } + t.TPuts(ti.EnterKeypad) + t.TPuts(ti.HideCursor) + t.TPuts(ti.EnableAcs) + t.TPuts(ti.DisableAutoMargin) + t.TPuts(ti.Clear) + if t.title != "" && t.setTitle != "" { + t.TPuts(t.ti.TParm(t.setTitle, t.title)) + } + + t.wg.Add(2) + go t.inputLoop(stopQ) + go t.mainLoop(stopQ) + return nil +} + +// disengage is used to release the terminal back to support from the caller. +// Think of this as tcell disengaging the clutch, so that another application +// can take over the terminal interface. This restores the TTY mode that was +// present when the application was first started. +func (t *tScreen) disengage() { + + t.Lock() + if !t.running { + t.Unlock() + return + } + t.running = false + stopQ := t.stopQ + close(stopQ) + _ = t.tty.Drain() + t.Unlock() + + t.tty.NotifyResize(nil) + // wait for everything to shut down + t.wg.Wait() + + // shutdown the screen and disable special modes (e.g. mouse and bracketed paste) + ti := t.ti + t.cells.Resize(0, 0) + t.TPuts(ti.ShowCursor) + if t.cursorStyles != nil && t.cursorStyle != CursorStyleDefault { + t.TPuts(t.cursorStyles[CursorStyleDefault]) + } + if t.cursorFg != "" && t.cursorColor.Valid() { + t.TPuts(t.cursorFg) + } + t.TPuts(ti.ResetFgBg) + t.TPuts(ti.AttrOff) + t.TPuts(ti.ExitKeypad) + t.TPuts(ti.EnableAutoMargin) + if os.Getenv("TCELL_ALTSCREEN") != "disable" { + if t.restoreTitle != "" { + t.TPuts(t.restoreTitle) + } + t.TPuts(ti.Clear) // only needed if ExitCA is empty + t.TPuts(ti.ExitCA) + } + t.enableMouse(0) + t.enablePasting(false) + t.disableFocusReporting() + + _ = t.tty.Stop() +} + +// Beep emits a beep to the terminal. +func (t *tScreen) Beep() error { + t.writeString(string(byte(7))) + return nil +} + +// finalize is used to at application shutdown, and restores the terminal +// to it's initial state. It should not be called more than once. +func (t *tScreen) finalize() { + t.disengage() + _ = t.tty.Close() +} + +func (t *tScreen) StopQ() <-chan struct{} { + return t.quit +} + +func (t *tScreen) EventQ() chan Event { + return t.eventQ +} + +func (t *tScreen) GetCells() *CellBuffer { + return &t.cells +} + +func (t *tScreen) SetTitle(title string) { + t.Lock() + t.title = title + if t.setTitle != "" && t.running { + t.TPuts(t.ti.TParm(t.setTitle, title)) + } + t.Unlock() +} + +func (t *tScreen) SetClipboard(data []byte) { + // Post binary data to the system clipboard. It might be UTF-8, it might not be. + t.Lock() + if t.setClipboard != "" { + encoded := base64.StdEncoding.EncodeToString(data) + t.TPuts(t.ti.TParm(t.setClipboard, encoded)) + } + t.Unlock() +} + +func (t *tScreen) GetClipboard() { + t.Lock() + if t.setClipboard != "" { + t.TPuts(t.ti.TParm(t.setClipboard, "?")) + } + t.Unlock() +} diff --git a/vendor/github.com/gdamore/tcell/v2/tscreen_plan9.go b/vendor/github.com/gdamore/tcell/v2/tscreen_plan9.go new file mode 100644 index 00000000..fdd55b8c --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/tscreen_plan9.go @@ -0,0 +1,36 @@ +//go:build plan9 +// +build plan9 + +// Copyright 2025 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import "os" + +// initialize on Plan 9: if no TTY was provided, use the Plan 9 TTY. +func (t *tScreen) initialize() error { + if os.Getenv("TERM") == "" { + // TERM should be "vt100" in a vt(1) window; color/mouse support will be limited. + _ = os.Setenv("TERM", "vt100") + } + if t.tty == nil { + tty, err := NewDevTty() + if err != nil { + return err + } + t.tty = tty + } + return nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/tscreen_stub.go b/vendor/github.com/gdamore/tcell/v2/tscreen_stub.go new file mode 100644 index 00000000..5d0649dd --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/tscreen_stub.go @@ -0,0 +1,32 @@ +//go:build windows +// +build windows + +// Copyright 2022 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +// NB: We might someday wish to move Windows to this model. However, +// that would probably mean sacrificing some of the richer key reporting +// that we can obtain with the console API present on Windows. + +func (t *tScreen) initialize() error { + if t.tty == nil { + return ErrNoScreen + } + // If a tty was supplied (custom), it should work. + // Custom screen implementations will need to provide a TTY + // implementation that we can use. + return nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/tscreen_unix.go b/vendor/github.com/gdamore/tcell/v2/tscreen_unix.go new file mode 100644 index 00000000..27f4c813 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/tscreen_unix.go @@ -0,0 +1,37 @@ +// Copyright 2024 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos + +package tcell + +import ( + // import the stock terminals + _ "github.com/gdamore/tcell/v2/terminfo/base" +) + +// initialize is used at application startup, and sets up the initial values +// including file descriptors used for terminals and saving the initial state +// so that it can be restored when the application terminates. +func (t *tScreen) initialize() error { + var err error + if t.tty == nil { + t.tty, err = NewDevTty() + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/tty.go b/vendor/github.com/gdamore/tcell/v2/tty.go new file mode 100644 index 00000000..8bb1ac50 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/tty.go @@ -0,0 +1,56 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import "io" + +// Tty is an abstraction of a tty (traditionally "teletype"). This allows applications to +// provide for alternate backends, as there are situations where the traditional /dev/tty +// does not work, or where more flexible handling is required. This interface is for use +// with the terminfo-style based API. It extends the io.ReadWriter API. It is reasonable +// that the implementation might choose to use different underlying files for the Reader +// and Writer sides of this API, as part of it's internal implementation. +type Tty interface { + // Start is used to activate the Tty for use. Upon return the terminal should be + // in raw mode, non-blocking, etc. The implementation should take care of saving + // any state that is required so that it may be restored when Stop is called. + Start() error + + // Stop is used to stop using this Tty instance. This may be a suspend, so that other + // terminal based applications can run in the foreground. Implementations should + // restore any state collected at Start(), and return to ordinary blocking mode, etc. + // Drain is called first to drain the input. Once this is called, no more Read + // or Write calls will be made until Start is called again. + Stop() error + + // Drain is called before Stop, and ensures that the reader will wake up appropriately + // if it was blocked. This workaround is required for /dev/tty on certain UNIX systems + // to ensure that Read() does not block forever. This typically arranges for the tty driver + // to send data immediately (e.g. VMIN and VTIME both set zero) and sets a deadline on input. + // Implementations may reasonably make this a no-op. There will still be control sequences + // emitted between the time this is called, and when Stop is called. + Drain() error + + // NotifyResize is used register a callback when the tty thinks the dimensions have + // changed. The standard UNIX implementation links this to a handler for SIGWINCH. + // If the supplied callback is nil, then any handler should be unregistered. + NotifyResize(cb func()) + + // WindowSize is called to determine the terminal dimensions. This might be determined + // by an ioctl or other means. + WindowSize() (WindowSize, error) + + io.ReadWriteCloser +} diff --git a/vendor/github.com/gdamore/tcell/v2/tty_plan9.go b/vendor/github.com/gdamore/tcell/v2/tty_plan9.go new file mode 100644 index 00000000..6c99ee6d --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/tty_plan9.go @@ -0,0 +1,270 @@ +//go:build plan9 +// +build plan9 + +// Copyright 2025 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tcell + +import ( + "bufio" + "errors" + "fmt" + "io" + "os" + "strconv" + "strings" + "sync" + "sync/atomic" +) + +// p9Tty implements tcell.Tty using Plan 9's /dev/cons and /dev/consctl. +// Raw mode is enabled by writing "rawon" to /dev/consctl while the fd stays open. +// Resize notifications are read from /dev/wctl: the first read returns geometry, +// subsequent reads block until the window changes (rio(4)). +// +// References: +// - kbdfs(8): cons/consctl rawon|rawoff semantics +// - rio(4): wctl geometry and blocking-on-change behavior +// - vt(1): VT100 emulator typically used for TUI programs on Plan 9 +// +// Limitations: +// - We assume VT100-level capabilities (often no colors, no mouse). +// - Window size is conservative: we return 80x24 unless overridden. +// Set LINES/COLUMNS (or TCELL_LINES/TCELL_COLS) to refine. +// - Mouse and bracketed paste are not wired; terminfo/xterm queries +// are not attempted because vt(1) may not support them. +type p9Tty struct { + cons *os.File // /dev/cons (read+write) + consctl *os.File // /dev/consctl (write "rawon"/"rawoff") + wctl *os.File // /dev/wctl (resize notifications) + + // protect close/stop; Read/Write are serialized by os.File + mu sync.Mutex + closed atomic.Bool + + // resize callback + onResize atomic.Value // func() + wg sync.WaitGroup + stopCh chan struct{} +} + +func NewDevTty() (Tty, error) { // tcell signature + return newPlan9TTY() +} + +func NewStdIoTty() (Tty, error) { // also required by tcell + // On Plan 9 there is no POSIX tty discipline on stdin/stdout; + // use /dev/cons explicitly for robustness. + return newPlan9TTY() +} + +func NewDevTtyFromDev(_ string) (Tty, error) { // required by tcell + // Plan 9 does not have multiple "ttys" in the POSIX sense; + // always bind to /dev/cons and /dev/consctl. + return newPlan9TTY() +} + +func newPlan9TTY() (Tty, error) { + cons, err := os.OpenFile("/dev/cons", os.O_RDWR, 0) + if err != nil { + return nil, fmt.Errorf("open /dev/cons: %w", err) + } + consctl, err := os.OpenFile("/dev/consctl", os.O_WRONLY, 0) + if err != nil { + _ = cons.Close() + return nil, fmt.Errorf("open /dev/consctl: %w", err) + } + // /dev/wctl may not exist (console without rio); best-effort. + wctl, _ := os.OpenFile("/dev/wctl", os.O_RDWR, 0) + + t := &p9Tty{ + cons: cons, + consctl: consctl, + wctl: wctl, + stopCh: make(chan struct{}), + } + return t, nil +} + +func (t *p9Tty) Start() error { + t.mu.Lock() + defer t.mu.Unlock() + + if t.closed.Load() { + return errors.New("tty closed") + } + + // Recreate stop channel if absent or closed (supports resume). + if t.stopCh == nil || isClosed(t.stopCh) { + t.stopCh = make(chan struct{}) + } + + // Put console into raw mode; remains active while consctl is open. + if _, err := t.consctl.Write([]byte("rawon")); err != nil { + return fmt.Errorf("enable raw mode: %w", err) + } + + // Reopen /dev/wctl on resume; best-effort (system console may lack it). + if t.wctl == nil { + if f, err := os.OpenFile("/dev/wctl", os.O_RDWR, 0); err == nil { + t.wctl = f + } + } + + if t.wctl != nil { + t.wg.Add(1) + go t.watchResize() + } + return nil +} + +func (t *p9Tty) Drain() error { + // Per tcell docs, this may reasonably be a no-op on non-POSIX ttys. + // Read deadlines are not available on plan9 os.File; we rely on Stop(). + return nil +} + +func (t *p9Tty) Stop() error { + t.mu.Lock() + defer t.mu.Unlock() + + // Signal watcher to stop (if not already). + if t.stopCh != nil && !isClosed(t.stopCh) { + close(t.stopCh) + } + + // Exit raw mode first. + _, _ = t.consctl.Write([]byte("rawoff")) + + // Closing wctl unblocks watchResize; nil it so Start() can reopen later. + if t.wctl != nil { + _ = t.wctl.Close() + t.wctl = nil + } + + // Ensure watcher goroutine has exited before returning. + t.wg.Wait() + return nil +} + +func (t *p9Tty) Close() error { + t.mu.Lock() + defer t.mu.Unlock() + + if t.closed.Swap(true) { + return nil + } + + if t.stopCh != nil && !isClosed(t.stopCh) { + close(t.stopCh) + } + _, _ = t.consctl.Write([]byte("rawoff")) + + _ = t.cons.Close() + _ = t.consctl.Close() + if t.wctl != nil { + _ = t.wctl.Close() + t.wctl = nil + } + + t.wg.Wait() + return nil +} + +func (t *p9Tty) Read(p []byte) (int, error) { + return t.cons.Read(p) +} + +func (t *p9Tty) Write(p []byte) (int, error) { + return t.cons.Write(p) +} + +func (t *p9Tty) NotifyResize(cb func()) { + if cb == nil { + t.onResize.Store((func())(nil)) + return + } + t.onResize.Store(cb) +} + +func (t *p9Tty) WindowSize() (WindowSize, error) { + // Strategy: + // 1) honor explicit overrides (TCELL_LINES/TCELL_COLS, LINES/COLUMNS), + // 2) otherwise return conservative 80x24. + // Reading /dev/wctl gives pixel geometry, but char cell metrics are + // not generally available to non-draw clients; vt(1) is fixed-cell. + lines, cols := envInt("TCELL_LINES"), envInt("TCELL_COLS") + if lines == 0 { + lines = envInt("LINES") + } + if cols == 0 { + cols = envInt("COLUMNS") + } + if lines <= 0 { + lines = 24 + } + if cols <= 0 { + cols = 80 + } + return WindowSize{Width: cols, Height: lines}, nil +} + +// watchResize blocks on /dev/wctl reads; each read returns when the window +// changes size/position/state, per rio(4). We ignore the parsed geometry and +// just notify tcell to re-query WindowSize(). +func (t *p9Tty) watchResize() { + defer t.wg.Done() + + r := bufio.NewReader(t.wctl) + for { + select { + case <-t.stopCh: + return + default: + } + // Each read delivers something like: + // " minx miny maxx maxy visible current\n" + // We don't need to parse here; just signal. + _, err := r.ReadString('\n') + if err != nil { + if errors.Is(err, io.EOF) { + return + } + // transient errors: continue + } + if cb, _ := t.onResize.Load().(func()); cb != nil { + cb() + } + } +} + +func envInt(name string) int { + if s := strings.TrimSpace(os.Getenv(name)); s != "" { + if v, err := strconv.Atoi(s); err == nil { + return v + } + } + return 0 +} + +// helper: safe check if a channel is closed +func isClosed(ch <-chan struct{}) bool { + select { + case <-ch: + return true + default: + return false + } +} diff --git a/vendor/github.com/gdamore/tcell/v2/tty_unix.go b/vendor/github.com/gdamore/tcell/v2/tty_unix.go new file mode 100644 index 00000000..ca82d83d --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/tty_unix.go @@ -0,0 +1,198 @@ +// Copyright 2021 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos + +package tcell + +import ( + "errors" + "fmt" + "os" + "os/signal" + "strconv" + "sync" + "syscall" + "time" + + "golang.org/x/sys/unix" + "golang.org/x/term" +) + +// devTty is an implementation of the Tty API based upon /dev/tty. +type devTty struct { + fd int + f *os.File + of *os.File // the first open of /dev/tty + saved *term.State + sig chan os.Signal + cb func() + stopQ chan struct{} + dev string + wg sync.WaitGroup + l sync.Mutex +} + +func (tty *devTty) Read(b []byte) (int, error) { + return tty.f.Read(b) +} + +func (tty *devTty) Write(b []byte) (int, error) { + return tty.f.Write(b) +} + +func (tty *devTty) Close() error { + return tty.f.Close() +} + +func (tty *devTty) Start() error { + tty.l.Lock() + defer tty.l.Unlock() + + // We open another copy of /dev/tty. This is a workaround for unusual behavior + // observed in macOS, apparently caused when a subshell (for example) closes our + // own tty device (when it exits for example). Getting a fresh new one seems to + // resolve the problem. (We believe this is a bug in the macOS tty driver that + // fails to account for dup() references to the same file before applying close() + // related behaviors to the tty.) We're also holding the original copy we opened + // since closing that might have deleterious effects as well. The upshot is that + // we will have up to two separate file handles open on /dev/tty. (Note that when + // using stdin/stdout instead of /dev/tty this problem is not observed.) + var err error + if tty.f, err = os.OpenFile(tty.dev, os.O_RDWR, 0); err != nil { + return err + } + + if !term.IsTerminal(tty.fd) { + return errors.New("device is not a terminal") + } + + _ = tty.f.SetReadDeadline(time.Time{}) + saved, err := term.MakeRaw(tty.fd) // also sets vMin and vTime + if err != nil { + return err + } + tty.saved = saved + + tty.stopQ = make(chan struct{}) + tty.wg.Add(1) + go func(stopQ chan struct{}) { + defer tty.wg.Done() + for { + select { + case <-tty.sig: + tty.l.Lock() + cb := tty.cb + tty.l.Unlock() + if cb != nil { + cb() + } + case <-stopQ: + return + } + } + }(tty.stopQ) + + signal.Notify(tty.sig, syscall.SIGWINCH) + return nil +} + +func (tty *devTty) Drain() error { + _ = tty.f.SetReadDeadline(time.Now()) + if err := tcSetBufParams(tty.fd, 0, 0); err != nil { + return err + } + return nil +} + +func (tty *devTty) Stop() error { + tty.l.Lock() + if err := term.Restore(tty.fd, tty.saved); err != nil { + tty.l.Unlock() + return err + } + _ = tty.f.SetReadDeadline(time.Now()) + + signal.Stop(tty.sig) + close(tty.stopQ) + tty.l.Unlock() + + tty.wg.Wait() + + // close our tty device -- we'll get another one if we Start again later. + _ = tty.f.Close() + + return nil +} + +func (tty *devTty) WindowSize() (WindowSize, error) { + size := WindowSize{} + ws, err := unix.IoctlGetWinsize(tty.fd, unix.TIOCGWINSZ) + if err != nil { + return size, err + } + w := int(ws.Col) + h := int(ws.Row) + if w == 0 { + w, _ = strconv.Atoi(os.Getenv("COLUMNS")) + } + if w == 0 { + w = 80 // default + } + if h == 0 { + h, _ = strconv.Atoi(os.Getenv("LINES")) + } + if h == 0 { + h = 25 // default + } + size.Width = w + size.Height = h + size.PixelWidth = int(ws.Xpixel) + size.PixelHeight = int(ws.Ypixel) + return size, nil +} + +func (tty *devTty) NotifyResize(cb func()) { + tty.l.Lock() + tty.cb = cb + tty.l.Unlock() +} + +// NewDevTty opens a /dev/tty based Tty. +func NewDevTty() (Tty, error) { + return NewDevTtyFromDev("/dev/tty") +} + +// NewDevTtyFromDev opens a tty device given a path. This can be useful to bind to other nodes. +func NewDevTtyFromDev(dev string) (Tty, error) { + tty := &devTty{ + dev: dev, + sig: make(chan os.Signal), + } + var err error + if tty.of, err = os.OpenFile(dev, os.O_RDWR, 0); err != nil { + return nil, err + } + tty.fd = int(tty.of.Fd()) + if !term.IsTerminal(tty.fd) { + _ = tty.f.Close() + return nil, errors.New("not a terminal") + } + if tty.saved, err = term.GetState(tty.fd); err != nil { + _ = tty.f.Close() + return nil, fmt.Errorf("failed to get state: %w", err) + } + return tty, nil +} diff --git a/vendor/github.com/gdamore/tcell/v2/wscreen.go b/vendor/github.com/gdamore/tcell/v2/wscreen.go new file mode 100644 index 00000000..44734c27 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/wscreen.go @@ -0,0 +1,676 @@ +// Copyright 2025 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build js && wasm +// +build js,wasm + +package tcell + +import ( + "errors" + "fmt" + "strings" + "sync" + "syscall/js" + "unicode/utf8" + + "github.com/gdamore/tcell/v2/terminfo" +) + +func NewTerminfoScreen() (Screen, error) { + t := &wScreen{} + t.fallback = make(map[rune]string) + + return &baseScreen{screenImpl: t}, nil +} + +type wScreen struct { + w, h int + style Style + cells CellBuffer + + running bool + clear bool + flagsPresent bool + pasteEnabled bool + mouseFlags MouseFlags + + cursorStyle CursorStyle + + quit chan struct{} + evch chan Event + fallback map[rune]string + finiOnce sync.Once + + sync.Mutex +} + +func (t *wScreen) Init() error { + t.w, t.h = 80, 24 // default for html as of now + t.evch = make(chan Event, 10) + t.quit = make(chan struct{}) + + t.Lock() + t.running = true + t.style = StyleDefault + t.cells.Resize(t.w, t.h) + t.Unlock() + + js.Global().Set("onKeyEvent", js.FuncOf(t.onKeyEvent)) + js.Global().Set("onMouseClick", js.FuncOf(t.unset)) + js.Global().Set("onMouseMove", js.FuncOf(t.unset)) + js.Global().Set("onFocus", js.FuncOf(t.unset)) + + return nil +} + +func (t *wScreen) Fini() { + t.finiOnce.Do(func() { + close(t.quit) + }) +} + +func (t *wScreen) SetStyle(style Style) { + t.Lock() + t.style = style + t.Unlock() +} + +// paletteColor gives a more natural palette color actually matching +// typical XTerm. We might in the future want to permit styling these +// via CSS. + +var palette = map[Color]int32{ + ColorBlack: 0x000000, + ColorMaroon: 0xcd0000, + ColorGreen: 0x00cd00, + ColorOlive: 0xcdcd00, + ColorNavy: 0x0000ee, + ColorPurple: 0xcd00cd, + ColorTeal: 0x00cdcd, + ColorSilver: 0xe5e5e5, + ColorGray: 0x7f7f7f, + ColorRed: 0xff0000, + ColorLime: 0x00ff00, + ColorYellow: 0xffff00, + ColorBlue: 0x5c5cff, + ColorFuchsia: 0xff00ff, + ColorAqua: 0x00ffff, + ColorWhite: 0xffffff, +} + +func paletteColor(c Color) int32 { + if c.IsRGB() { + return int32(c & 0xffffff) + } + if c >= ColorBlack && c <= ColorWhite { + return palette[c] + } + return c.Hex() +} + +func (t *wScreen) drawCell(x, y int) int { + mainc, combc, style, width := t.cells.GetContent(x, y) + + if !t.cells.Dirty(x, y) { + return width + } + + if style == StyleDefault { + style = t.style + } + + fg, bg := paletteColor(style.fg), paletteColor(style.bg) + if fg == -1 { + fg = 0xe5e5e5 + } + if bg == -1 { + bg = 0x000000 + } + us, uc := style.ulStyle, paletteColor(style.ulColor) + if uc == -1 { + uc = 0x000000 + } + + s := "" + if len(combc) > 0 { + b := make([]rune, 0, 1+len(combc)) + b = append(b, mainc) + b = append(b, combc...) + s = string(b) + } else { + s = string(mainc) + } + + t.cells.SetDirty(x, y, false) + js.Global().Call("drawCell", x, y, s, fg, bg, int(style.attrs), int(us), int(uc)) + + return width +} + +func (t *wScreen) ShowCursor(x, y int) { + t.Lock() + js.Global().Call("showCursor", x, y) + t.Unlock() +} + +func (t *wScreen) SetCursor(cs CursorStyle, cc Color) { + if !cc.Valid() { + cc = ColorLightGray + } + t.Lock() + js.Global().Call("setCursorStyle", curStyleClasses[cs], fmt.Sprintf("#%06x", cc.Hex())) + t.Unlock() +} + +func (t *wScreen) HideCursor() { + t.ShowCursor(-1, -1) +} + +func (t *wScreen) Show() { + t.Lock() + t.resize() + t.draw() + t.Unlock() +} + +func (t *wScreen) clearScreen() { + js.Global().Call("clearScreen", t.style.fg.Hex(), t.style.bg.Hex()) + t.clear = false +} + +func (t *wScreen) draw() { + if t.clear { + t.clearScreen() + } + + for y := 0; y < t.h; y++ { + for x := 0; x < t.w; x++ { + width := t.drawCell(x, y) + x += width - 1 + } + } + + js.Global().Call("show") +} + +func (t *wScreen) EnableMouse(flags ...MouseFlags) { + var f MouseFlags + flagsPresent := false + for _, flag := range flags { + f |= flag + flagsPresent = true + } + if !flagsPresent { + f = MouseMotionEvents | MouseDragEvents | MouseButtonEvents + } + + t.Lock() + t.mouseFlags = f + t.enableMouse(f) + t.Unlock() +} + +func (t *wScreen) enableMouse(f MouseFlags) { + if f&MouseButtonEvents != 0 { + js.Global().Set("onMouseClick", js.FuncOf(t.onMouseEvent)) + } else { + js.Global().Set("onMouseClick", js.FuncOf(t.unset)) + } + + if f&MouseDragEvents != 0 || f&MouseMotionEvents != 0 { + js.Global().Set("onMouseMove", js.FuncOf(t.onMouseEvent)) + } else { + js.Global().Set("onMouseMove", js.FuncOf(t.unset)) + } +} + +func (t *wScreen) DisableMouse() { + t.Lock() + t.mouseFlags = 0 + t.enableMouse(0) + t.Unlock() +} + +func (t *wScreen) EnablePaste() { + t.Lock() + t.pasteEnabled = true + t.enablePasting(true) + t.Unlock() +} + +func (t *wScreen) DisablePaste() { + t.Lock() + t.pasteEnabled = false + t.enablePasting(false) + t.Unlock() +} + +func (t *wScreen) enablePasting(on bool) { + if on { + js.Global().Set("onPaste", js.FuncOf(t.onPaste)) + } else { + js.Global().Set("onPaste", js.FuncOf(t.unset)) + } +} + +func (t *wScreen) EnableFocus() { + t.Lock() + js.Global().Set("onFocus", js.FuncOf(t.onFocus)) + t.Unlock() +} + +func (t *wScreen) DisableFocus() { + t.Lock() + js.Global().Set("onFocus", js.FuncOf(t.unset)) + t.Unlock() +} + +func (s *wScreen) GetClipboard() { +} + +func (s *wScreen) SetClipboard(_ []byte) { +} + +func (t *wScreen) Size() (int, int) { + t.Lock() + w, h := t.w, t.h + t.Unlock() + return w, h +} + +// resize does nothing, as asking the web window to resize +// without a specified width or height will cause no change. +func (t *wScreen) resize() {} + +func (t *wScreen) Colors() int { + return 16777216 // 256 ^ 3 +} + +func (t *wScreen) clip(x, y int) (int, int) { + w, h := t.cells.Size() + if x < 0 { + x = 0 + } + if y < 0 { + y = 0 + } + if x > w-1 { + x = w - 1 + } + if y > h-1 { + y = h - 1 + } + return x, y +} + +func (t *wScreen) postEvent(ev Event) { + select { + case t.evch <- ev: + case <-t.quit: + } +} + +func (t *wScreen) onMouseEvent(this js.Value, args []js.Value) interface{} { + mod := ModNone + button := ButtonNone + + switch args[2].Int() { + case 0: + if t.mouseFlags&MouseMotionEvents == 0 { + // don't want this event! is a mouse motion event, but user has asked not. + return nil + } + button = ButtonNone + case 1: + button = Button1 + case 2: + button = Button3 // Note we prefer to treat right as button 2 + case 3: + button = Button2 // And the middle button as button 3 + } + + if args[3].Bool() { // mod shift + mod |= ModShift + } + + if args[4].Bool() { // mod alt + mod |= ModAlt + } + + if args[5].Bool() { // mod ctrl + mod |= ModCtrl + } + + t.postEvent(NewEventMouse(args[0].Int(), args[1].Int(), button, mod)) + return nil +} + +func (t *wScreen) onKeyEvent(this js.Value, args []js.Value) interface{} { + key := args[0].String() + + // don't accept any modifier keys as their own + if key == "Control" || key == "Alt" || key == "Meta" || key == "Shift" { + return nil + } + + mod := ModNone + if args[1].Bool() { // mod shift + mod |= ModShift + } + + if args[2].Bool() { // mod alt + mod |= ModAlt + } + + if args[3].Bool() { // mod ctrl + mod |= ModCtrl + } + + if args[4].Bool() { // mod meta + mod |= ModMeta + } + + // check for special case of Ctrl + key + if mod == ModCtrl { + if k, ok := WebKeyNames["Ctrl-"+strings.ToLower(key)]; ok { + t.postEvent(NewEventKey(k, 0, mod)) + return nil + } + } + + // next try function keys + if k, ok := WebKeyNames[key]; ok { + t.postEvent(NewEventKey(k, 0, mod)) + return nil + } + + // finally try normal, printable chars + r, _ := utf8.DecodeRuneInString(key) + t.postEvent(NewEventKey(KeyRune, r, mod)) + return nil +} + +func (t *wScreen) onPaste(this js.Value, args []js.Value) interface{} { + t.postEvent(NewEventPaste(args[0].Bool())) + return nil +} + +func (t *wScreen) onFocus(this js.Value, args []js.Value) interface{} { + t.postEvent(NewEventFocus(args[0].Bool())) + return nil +} + +// unset is a dummy function for js when we want nothing to +// happen when javascript calls a function (for example, when +// mouse input is disabled, when onMouseEvent() is called from +// js, it redirects here and does nothing). +func (t *wScreen) unset(this js.Value, args []js.Value) interface{} { + return nil +} + +func (t *wScreen) Sync() { + t.Lock() + t.resize() + t.clear = true + t.cells.Invalidate() + t.draw() + t.Unlock() +} + +func (t *wScreen) CharacterSet() string { + return "UTF-8" +} + +func (t *wScreen) RegisterRuneFallback(orig rune, fallback string) { + t.Lock() + t.fallback[orig] = fallback + t.Unlock() +} + +func (t *wScreen) UnregisterRuneFallback(orig rune) { + t.Lock() + delete(t.fallback, orig) + t.Unlock() +} + +func (t *wScreen) CanDisplay(r rune, checkFallbacks bool) bool { + if utf8.ValidRune(r) { + return true + } + if !checkFallbacks { + return false + } + if _, ok := t.fallback[r]; ok { + return true + } + return false +} + +func (t *wScreen) HasMouse() bool { + return true +} + +func (t *wScreen) HasKey(k Key) bool { + return true +} + +func (t *wScreen) SetSize(w, h int) { + if w == t.w && h == t.h { + return + } + + t.cells.Invalidate() + t.cells.Resize(w, h) + js.Global().Call("resize", w, h) + t.w, t.h = w, h + t.postEvent(NewEventResize(w, h)) +} + +func (t *wScreen) Resize(int, int, int, int) {} + +// Suspend simply pauses all input and output, and clears the screen. +// There isn't a "default terminal" to go back to. +func (t *wScreen) Suspend() error { + t.Lock() + if !t.running { + t.Unlock() + return nil + } + t.running = false + t.clearScreen() + t.enableMouse(0) + t.enablePasting(false) + js.Global().Set("onKeyEvent", js.FuncOf(t.unset)) // stop keypresses + return nil +} + +func (t *wScreen) Resume() error { + t.Lock() + + if t.running { + return errors.New("already engaged") + } + t.running = true + + t.enableMouse(t.mouseFlags) + t.enablePasting(t.pasteEnabled) + + js.Global().Set("onKeyEvent", js.FuncOf(t.onKeyEvent)) + + t.Unlock() + return nil +} + +func (t *wScreen) Beep() error { + js.Global().Call("beep") + return nil +} + +func (t *wScreen) Tty() (Tty, bool) { + return nil, false +} + +func (t *wScreen) GetCells() *CellBuffer { + return &t.cells +} + +func (t *wScreen) EventQ() chan Event { + return t.evch +} + +func (t *wScreen) StopQ() <-chan struct{} { + return t.quit +} + +func (t *wScreen) SetTitle(title string) { + js.Global().Call("setTitle", title) +} + +// WebKeyNames maps string names reported from HTML +// (KeyboardEvent.key) to tcell accepted keys. +var WebKeyNames = map[string]Key{ + "Enter": KeyEnter, + "Backspace": KeyBackspace, + "Tab": KeyTab, + "Backtab": KeyBacktab, + "Escape": KeyEsc, + "Backspace2": KeyBackspace2, + "Delete": KeyDelete, + "Insert": KeyInsert, + "ArrowUp": KeyUp, + "ArrowDown": KeyDown, + "ArrowLeft": KeyLeft, + "ArrowRight": KeyRight, + "Home": KeyHome, + "End": KeyEnd, + "UpLeft": KeyUpLeft, // not supported by HTML + "UpRight": KeyUpRight, // not supported by HTML + "DownLeft": KeyDownLeft, // not supported by HTML + "DownRight": KeyDownRight, // not supported by HTML + "Center": KeyCenter, + "PgDn": KeyPgDn, + "PgUp": KeyPgUp, + "Clear": KeyClear, + "Exit": KeyExit, + "Cancel": KeyCancel, + "Pause": KeyPause, + "Print": KeyPrint, + "F1": KeyF1, + "F2": KeyF2, + "F3": KeyF3, + "F4": KeyF4, + "F5": KeyF5, + "F6": KeyF6, + "F7": KeyF7, + "F8": KeyF8, + "F9": KeyF9, + "F10": KeyF10, + "F11": KeyF11, + "F12": KeyF12, + "F13": KeyF13, + "F14": KeyF14, + "F15": KeyF15, + "F16": KeyF16, + "F17": KeyF17, + "F18": KeyF18, + "F19": KeyF19, + "F20": KeyF20, + "F21": KeyF21, + "F22": KeyF22, + "F23": KeyF23, + "F24": KeyF24, + "F25": KeyF25, + "F26": KeyF26, + "F27": KeyF27, + "F28": KeyF28, + "F29": KeyF29, + "F30": KeyF30, + "F31": KeyF31, + "F32": KeyF32, + "F33": KeyF33, + "F34": KeyF34, + "F35": KeyF35, + "F36": KeyF36, + "F37": KeyF37, + "F38": KeyF38, + "F39": KeyF39, + "F40": KeyF40, + "F41": KeyF41, + "F42": KeyF42, + "F43": KeyF43, + "F44": KeyF44, + "F45": KeyF45, + "F46": KeyF46, + "F47": KeyF47, + "F48": KeyF48, + "F49": KeyF49, + "F50": KeyF50, + "F51": KeyF51, + "F52": KeyF52, + "F53": KeyF53, + "F54": KeyF54, + "F55": KeyF55, + "F56": KeyF56, + "F57": KeyF57, + "F58": KeyF58, + "F59": KeyF59, + "F60": KeyF60, + "F61": KeyF61, + "F62": KeyF62, + "F63": KeyF63, + "F64": KeyF64, + "Ctrl-a": KeyCtrlA, // not reported by HTML- need to do special check + "Ctrl-b": KeyCtrlB, // not reported by HTML- need to do special check + "Ctrl-c": KeyCtrlC, // not reported by HTML- need to do special check + "Ctrl-d": KeyCtrlD, // not reported by HTML- need to do special check + "Ctrl-e": KeyCtrlE, // not reported by HTML- need to do special check + "Ctrl-f": KeyCtrlF, // not reported by HTML- need to do special check + "Ctrl-g": KeyCtrlG, // not reported by HTML- need to do special check + "Ctrl-j": KeyCtrlJ, // not reported by HTML- need to do special check + "Ctrl-k": KeyCtrlK, // not reported by HTML- need to do special check + "Ctrl-l": KeyCtrlL, // not reported by HTML- need to do special check + "Ctrl-n": KeyCtrlN, // not reported by HTML- need to do special check + "Ctrl-o": KeyCtrlO, // not reported by HTML- need to do special check + "Ctrl-p": KeyCtrlP, // not reported by HTML- need to do special check + "Ctrl-q": KeyCtrlQ, // not reported by HTML- need to do special check + "Ctrl-r": KeyCtrlR, // not reported by HTML- need to do special check + "Ctrl-s": KeyCtrlS, // not reported by HTML- need to do special check + "Ctrl-t": KeyCtrlT, // not reported by HTML- need to do special check + "Ctrl-u": KeyCtrlU, // not reported by HTML- need to do special check + "Ctrl-v": KeyCtrlV, // not reported by HTML- need to do special check + "Ctrl-w": KeyCtrlW, // not reported by HTML- need to do special check + "Ctrl-x": KeyCtrlX, // not reported by HTML- need to do special check + "Ctrl-y": KeyCtrlY, // not reported by HTML- need to do special check + "Ctrl-z": KeyCtrlZ, // not reported by HTML- need to do special check + "Ctrl- ": KeyCtrlSpace, // not reported by HTML- need to do special check + "Ctrl-_": KeyCtrlUnderscore, // not reported by HTML- need to do special check + "Ctrl-]": KeyCtrlRightSq, // not reported by HTML- need to do special check + "Ctrl-\\": KeyCtrlBackslash, // not reported by HTML- need to do special check + "Ctrl-^": KeyCtrlCarat, // not reported by HTML- need to do special check +} + +var curStyleClasses = map[CursorStyle]string{ + CursorStyleDefault: "cursor-blinking-block", + CursorStyleBlinkingBlock: "cursor-blinking-block", + CursorStyleSteadyBlock: "cursor-steady-block", + CursorStyleBlinkingUnderline: "cursor-blinking-underline", + CursorStyleSteadyUnderline: "cursor-steady-underline", + CursorStyleBlinkingBar: "cursor-blinking-bar", + CursorStyleSteadyBar: "cursor-steady-bar", +} + +func LookupTerminfo(name string) (ti *terminfo.Terminfo, e error) { + return nil, errors.New("LookupTermInfo not supported") +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/.gitignore b/vendor/github.com/lucasb-eyer/go-colorful/.gitignore new file mode 100644 index 00000000..0aa2c922 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/.gitignore @@ -0,0 +1,101 @@ +# Created by https://www.toptal.com/developers/gitignore/api/code,go,linux,macos,windows +# Edit at https://www.toptal.com/developers/gitignore?templates=code,go,linux,macos,windows + +### Code ### +.vscode/* +!.vscode/tasks.json +!.vscode/launch.json +*.code-workspace + +### Go ### +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +### Go Patch ### +/vendor/ +/Godeps/ + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/code,go,linux,macos,windows diff --git a/vendor/github.com/lucasb-eyer/go-colorful/CHANGELOG.md b/vendor/github.com/lucasb-eyer/go-colorful/CHANGELOG.md new file mode 100644 index 00000000..84f9c7b2 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/CHANGELOG.md @@ -0,0 +1,42 @@ +# Changelog +All notable changes to this project will be documented in this file. + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +The format of this file is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +but only releases after v1.0.3 properly adhere to it. + + +## [1.2.0] - 2021-01-27 +### Added +- HSLuv and HPLuv color spaces (#41, #51) +- CIE LCh(uv) color space, called `LuvLCh` in code (#51) +- JSON and envconfig serialization support for `HexColor` (#42) +- `DistanceLinearRGB` (#53) + +### Fixed +- RGB to/from XYZ conversion is more accurate (#51) +- A bug in `XYZToLuvWhiteRef` that only applied to very small values was fixed (#51) +- `BlendHCL` output is clamped so that it's not invalid (#46) +- Properly documented `DistanceCIE76` (#40) +- Some small godoc fixes + + +## [1.0.3] - 2019-11-11 +- Remove SQLMock dependency + + +## [1.0.2] - 2019-04-07 +- Fixes SQLMock dependency + + +## [1.0.1] - 2019-03-24 +- Adds support for Go Modules + + +## [1.0.0] - 2018-05-26 +- API Breaking change in `MakeColor`: instead of `panic`ing when alpha is zero, it now returns a secondary, boolean return value indicating success. See [the color.Color interface](#the-colorcolor-interface) section and [this FAQ entry](#q-why-would-makecolor-ever-fail) for details. + + +## [0.9.0] - 2018-05-26 +- Initial version number after having ignored versioning for a long time :) diff --git a/vendor/github.com/lucasb-eyer/go-colorful/LICENSE b/vendor/github.com/lucasb-eyer/go-colorful/LICENSE new file mode 100644 index 00000000..4e402a00 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2013 Lucas Beyer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/lucasb-eyer/go-colorful/README.md b/vendor/github.com/lucasb-eyer/go-colorful/README.md new file mode 100644 index 00000000..8b9bd499 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/README.md @@ -0,0 +1,482 @@ +go-colorful +=========== + +[![go reportcard](https://goreportcard.com/badge/github.com/lucasb-eyer/go-colorful)](https://goreportcard.com/report/github.com/lucasb-eyer/go-colorful) + +A library for playing with colors in Go. Supports Go 1.13 onwards. + +Why? +==== +I love games. I make games. I love detail and I get lost in detail. +One such detail popped up during the development of [Memory Which Does Not Suck](https://github.com/lucasb-eyer/mwdns/), +when we wanted the server to assign the players random colors. Sometimes +two players got very similar colors, which bugged me. The very same evening, +[I want hue](http://tools.medialab.sciences-po.fr/iwanthue/) was the top post +on HackerNews' frontpage and showed me how to Do It Right™. Last but not +least, there was no library for handling color spaces available in go. Colorful +does just that and implements Go's `color.Color` interface. + +What? +===== +Go-Colorful stores colors in RGB and provides methods from converting these to various color-spaces. Currently supported colorspaces are: + +- **RGB:** All three of Red, Green and Blue in [0..1]. +- **HSL:** Hue in [0..360], Saturation and Luminance in [0..1]. For legacy reasons; please forget that it exists. +- **HSV:** Hue in [0..360], Saturation and Value in [0..1]. You're better off using HCL, see below. +- **Hex RGB:** The "internet" color format, as in #FF00FF. +- **Linear RGB:** See [gamma correct rendering](http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/). +- **CIE-XYZ:** CIE's standard color space, almost in [0..1]. +- **CIE-xyY:** encodes chromacity in x and y and luminance in Y, all in [0..1] +- **CIE-L\*a\*b\*:** A *perceptually uniform* color space, i.e. distances are meaningful. L\* in [0..1] and a\*, b\* almost in [-1..1]. +- **CIE-L\*u\*v\*:** Very similar to CIE-L\*a\*b\*, there is [no consensus](http://en.wikipedia.org/wiki/CIELUV#Historical_background) on which one is "better". +- **CIE-L\*C\*h° (HCL):** This is generally the [most useful](http://vis4.net/blog/posts/avoid-equidistant-hsv-colors/) one; CIE-L\*a\*b\* space in polar coordinates, i.e. a *better* HSV. H° is in [0..360], C\* almost in [-1..1] and L\* as in CIE-L\*a\*b\*. +- **CIE LCh(uv):** Called `LuvLCh` in code, this is a cylindrical transformation of the CIE-L\*u\*v\* color space. Like HCL above: H° is in [0..360], C\* almost in [-1..1] and L\* as in CIE-L\*u\*v\*. +- **HSLuv:** The better alternative to HSL, see [here](https://www.hsluv.org/) and [here](https://www.kuon.ch/post/2020-03-08-hsluv/). Hue in [0..360], Saturation and Luminance in [0..1]. +- **HPLuv:** A variant of HSLuv. The color space is smoother, but only pastel colors can be included. Because the valid colors are limited, it's easy to get invalid Saturation values way above 1.0, indicating the color can't be represented in HPLuv beccause it's not pastel. + +For the colorspaces where it makes sense (XYZ, Lab, Luv, HCl), the +[D65](http://en.wikipedia.org/wiki/Illuminant_D65) is used as reference white +by default but methods for using your own reference white are provided. + +A coordinate being *almost in* a range means that generally it is, but for very +bright colors and depending on the reference white, it might overflow this +range slightly. For example, C\* of #0000ff is 1.338. + +Unit-tests are provided. + +Nice, but what's it useful for? +------------------------------- + +- Converting color spaces. Some people like to do that. +- Blending (interpolating) between colors in a "natural" look by using the right colorspace. +- Generating random colors under some constraints (e.g. colors of the same shade, or shades of one color.) +- Generating gorgeous random palettes with distinct colors of a same temperature. + +What not (yet)? +=============== +There are a few features which are currently missing and might be useful. +I just haven't implemented them yet because I didn't have the need for it. +Pull requests welcome. + +- Sorting colors (potentially using above mentioned distances) + +So which colorspace should I use? +================================= +It depends on what you want to do. I think the folks from *I want hue* are +on-spot when they say that RGB fits to how *screens produce* color, CIE L\*a\*b\* +fits how *humans perceive* color and HCL fits how *humans think* colors. + +Whenever you'd use HSV, rather go for CIE-L\*C\*h°. for fixed lightness L\* and +chroma C\* values, the hue angle h° rotates through colors of the same +perceived brightness and intensity. + +How? +==== + +### Installing +Installing the library is as easy as + +```bash +$ go get github.com/lucasb-eyer/go-colorful +``` + +The package can then be used through an + +```go +import "github.com/lucasb-eyer/go-colorful" +``` + +### Basic usage + +Create a beautiful blue color using different source space: + +```go +// Any of the following should be the same +c := colorful.Color{0.313725, 0.478431, 0.721569} +c, err := colorful.Hex("#517AB8") +if err != nil { + log.Fatal(err) +} +c = colorful.Hsv(216.0, 0.56, 0.722) +c = colorful.Xyz(0.189165, 0.190837, 0.480248) +c = colorful.Xyy(0.219895, 0.221839, 0.190837) +c = colorful.Lab(0.507850, 0.040585,-0.370945) +c = colorful.Luv(0.507849,-0.194172,-0.567924) +c = colorful.Hcl(276.2440, 0.373160, 0.507849) +fmt.Printf("RGB values: %v, %v, %v", c.R, c.G, c.B) +``` + +And then converting this color back into various color spaces: + +```go +hex := c.Hex() +h, s, v := c.Hsv() +x, y, z := c.Xyz() +x, y, Y := c.Xyy() +l, a, b := c.Lab() +l, u, v := c.Luv() +h, c, l := c.Hcl() +``` + +Note that, because of Go's unfortunate choice of requiring an initial uppercase, +the name of the functions relating to the xyY space are just off. If you have +any good suggestion, please open an issue. (I don't consider XyY good.) + +### The `color.Color` interface +Because a `colorful.Color` implements Go's `color.Color` interface (found in the +`image/color` package), it can be used anywhere that expects a `color.Color`. + +Furthermore, you can convert anything that implements the `color.Color` interface +into a `colorful.Color` using the `MakeColor` function: + +```go +c, ok := colorful.MakeColor(color.Gray16{12345}) +``` + +**Caveat:** Be aware that this latter conversion (using `MakeColor`) hits a +corner-case when alpha is exactly zero. Because `color.Color` uses pre-multiplied +alpha colors, this means the RGB values are lost (set to 0) and it's impossible +to recover them. In such a case `MakeColor` will return `false` as its second value. + +### Comparing colors +In the RGB color space, the Euclidian distance between colors *doesn't* correspond +to visual/perceptual distance. This means that two pairs of colors which have the +same distance in RGB space can look much further apart. This is fixed by the +CIE-L\*a\*b\*, CIE-L\*u\*v\* and CIE-L\*C\*h° color spaces. +Thus you should only compare colors in any of these space. +(Note that the distance in CIE-L\*a\*b\* and CIE-L\*C\*h° are the same, since it's the same space but in cylindrical coordinates) + +![Color distance comparison](doc/colordist/colordist.png) + +The two colors shown on the top look much more different than the two shown on +the bottom. Still, in RGB space, their distance is the same. +Here is a little example program which shows the distances between the top two +and bottom two colors in RGB, CIE-L\*a\*b\* and CIE-L\*u\*v\* space. You can find it in `doc/colordist/colordist.go`. + +```go +package main + +import "fmt" +import "github.com/lucasb-eyer/go-colorful" + +func main() { + c1a := colorful.Color{150.0 / 255.0, 10.0 / 255.0, 150.0 / 255.0} + c1b := colorful.Color{53.0 / 255.0, 10.0 / 255.0, 150.0 / 255.0} + c2a := colorful.Color{10.0 / 255.0, 150.0 / 255.0, 50.0 / 255.0} + c2b := colorful.Color{99.9 / 255.0, 150.0 / 255.0, 10.0 / 255.0} + + fmt.Printf("DistanceRgb: c1: %v\tand c2: %v\n", c1a.DistanceRgb(c1b), c2a.DistanceRgb(c2b)) + fmt.Printf("DistanceLab: c1: %v\tand c2: %v\n", c1a.DistanceLab(c1b), c2a.DistanceLab(c2b)) + fmt.Printf("DistanceLuv: c1: %v\tand c2: %v\n", c1a.DistanceLuv(c1b), c2a.DistanceLuv(c2b)) + fmt.Printf("DistanceCIE76: c1: %v\tand c2: %v\n", c1a.DistanceCIE76(c1b), c2a.DistanceCIE76(c2b)) + fmt.Printf("DistanceCIE94: c1: %v\tand c2: %v\n", c1a.DistanceCIE94(c1b), c2a.DistanceCIE94(c2b)) + fmt.Printf("DistanceCIEDE2000: c1: %v\tand c2: %v\n", c1a.DistanceCIEDE2000(c1b), c2a.DistanceCIEDE2000(c2b)) +} +``` + +Running the above program shows that you should always prefer any of the CIE distances: + +```bash +$ go run colordist.go +DistanceRgb: c1: 0.3803921568627451 and c2: 0.3858713931171159 +DistanceLab: c1: 0.32048458312798056 and c2: 0.24397151758565272 +DistanceLuv: c1: 0.5134369614199698 and c2: 0.2568692839860636 +DistanceCIE76: c1: 0.32048458312798056 and c2: 0.24397151758565272 +DistanceCIE94: c1: 0.19799168128511324 and c2: 0.12207136371167401 +DistanceCIEDE2000: c1: 0.17274551120971166 and c2: 0.10665210031428465 +``` + +It also shows that `DistanceLab` is more formally known as `DistanceCIE76` and +has been superseded by the slightly more accurate, but much more expensive +`DistanceCIE94` and `DistanceCIEDE2000`. + +Note that `AlmostEqualRgb` is provided mainly for (unit-)testing purposes. Use +it only if you really know what you're doing. It will eat your cat. + +### Blending colors +Blending is highly connected to distance, since it basically "walks through" the +colorspace thus, if the colorspace maps distances well, the walk is "smooth". + +Colorful comes with blending functions in RGB, HSV and any of the LAB spaces. +Of course, you'd rather want to use the blending functions of the LAB spaces since +these spaces map distances well but, just in case, here is an example showing +you how the blendings (`#fdffcc` to `#242a42`) are done in the various spaces: + +![Blending colors in different spaces.](doc/colorblend/colorblend.png) + +What you see is that HSV is really bad: it adds some green, which is not present +in the original colors at all! RGB is much better, but it stays light a little +too long. LUV and LAB both hit the right lightness but LAB has a little more +color. HCL works in the same vein as HSV (both cylindrical interpolations) but +it does it right in that there is no green appearing and the lighthness changes +in a linear manner. + +While this seems all good, you need to know one thing: When interpolating in any +of the CIE color spaces, you might get invalid RGB colors! This is important if +the starting and ending colors are user-input or random. An example of where this +happens is when blending between `#eeef61` and `#1e3140`: + +![Invalid RGB colors may crop up when blending in CIE spaces.](doc/colorblend/invalid.png) + +You can test whether a color is a valid RGB color by calling the `IsValid` method +and indeed, calling IsValid will return false for the redish colors on the bottom. +One way to "fix" this is to get a valid color close to the invalid one by calling +`Clamped`, which always returns a nearby valid color. Doing this, we get the +following result, which is satisfactory: + +![Fixing invalid RGB colors by clamping them to the valid range.](doc/colorblend/clamped.png) + +The following is the code creating the above three images; it can be found in `doc/colorblend/colorblend.go` + +```go +package main + +import "fmt" +import "github.com/lucasb-eyer/go-colorful" +import "image" +import "image/draw" +import "image/png" +import "os" + +func main() { + blocks := 10 + blockw := 40 + img := image.NewRGBA(image.Rect(0,0,blocks*blockw,200)) + + c1, _ := colorful.Hex("#fdffcc") + c2, _ := colorful.Hex("#242a42") + + // Use these colors to get invalid RGB in the gradient. + //c1, _ := colorful.Hex("#EEEF61") + //c2, _ := colorful.Hex("#1E3140") + + for i := 0 ; i < blocks ; i++ { + draw.Draw(img, image.Rect(i*blockw, 0,(i+1)*blockw, 40), &image.Uniform{c1.BlendHsv(c2, float64(i)/float64(blocks-1))}, image.Point{}, draw.Src) + draw.Draw(img, image.Rect(i*blockw, 40,(i+1)*blockw, 80), &image.Uniform{c1.BlendLuv(c2, float64(i)/float64(blocks-1))}, image.Point{}, draw.Src) + draw.Draw(img, image.Rect(i*blockw, 80,(i+1)*blockw,120), &image.Uniform{c1.BlendRgb(c2, float64(i)/float64(blocks-1))}, image.Point{}, draw.Src) + draw.Draw(img, image.Rect(i*blockw,120,(i+1)*blockw,160), &image.Uniform{c1.BlendLab(c2, float64(i)/float64(blocks-1))}, image.Point{}, draw.Src) + draw.Draw(img, image.Rect(i*blockw,160,(i+1)*blockw,200), &image.Uniform{c1.BlendHcl(c2, float64(i)/float64(blocks-1))}, image.Point{}, draw.Src) + + // This can be used to "fix" invalid colors in the gradient. + //draw.Draw(img, image.Rect(i*blockw,160,(i+1)*blockw,200), &image.Uniform{c1.BlendHcl(c2, float64(i)/float64(blocks-1)).Clamped()}, image.Point{}, draw.Src) + } + + toimg, err := os.Create("colorblend.png") + if err != nil { + fmt.Printf("Error: %v", err) + return + } + defer toimg.Close() + + png.Encode(toimg, img) +} +``` + +#### Generating color gradients +A very common reason to blend colors is creating gradients. There is an example +program in [doc/gradientgen.go](doc/gradientgen/gradientgen.go); it doesn't use any API +which hasn't been used in the previous example code, so I won't bother pasting +the code in here. Just look at that gorgeous gradient it generated in HCL space: + +!["Spectral" colorbrewer gradient in HCL space.](doc/gradientgen/gradientgen.png) + +### Getting random colors +It is sometimes necessary to generate random colors. You could simply do this +on your own by generating colors with random values. By restricting the random +values to a range smaller than [0..1] and using a space such as CIE-H\*C\*l° or +HSV, you can generate both random shades of a color or random colors of a +lightness: + +```go +random_blue := colorful.Hcl(180.0+rand.Float64()*50.0, 0.2+rand.Float64()*0.8, 0.3+rand.Float64()*0.7) +random_dark := colorful.Hcl(rand.Float64()*360.0, rand.Float64(), rand.Float64()*0.4) +random_light := colorful.Hcl(rand.Float64()*360.0, rand.Float64(), 0.6+rand.Float64()*0.4) +``` + +Since getting random "warm" and "happy" colors is quite a common task, there +are some helper functions: + +```go +colorful.WarmColor() +colorful.HappyColor() +colorful.FastWarmColor() +colorful.FastHappyColor() +``` + +The ones prefixed by `Fast` are faster but less coherent since they use the HSV +space as opposed to the regular ones which use CIE-L\*C\*h° space. The +following picture shows the warm colors in the top two rows and happy colors +in the bottom two rows. Within these, the first is the regular one and the +second is the fast one. + +![Warm, fast warm, happy and fast happy random colors, respectively.](doc/colorgens/colorgens.png) + +Don't forget to initialize the random seed! You can see the code used for +generating this picture in `doc/colorgens/colorgens.go`. + +### Getting random palettes +As soon as you need to generate more than one random color, you probably want +them to be distinguishible. Playing against an opponent which has almost the +same blue as I do is not fun. This is where random palettes can help. + +These palettes are generated using an algorithm which ensures that all colors +on the palette are as distinguishible as possible. Again, there is a `Fast` +method which works in HSV and is less perceptually uniform and a non-`Fast` +method which works in CIE spaces. For more theory on `SoftPalette`, check out +[I want hue](http://tools.medialab.sciences-po.fr/iwanthue/theory.php). Yet +again, there is a `Happy` and a `Warm` version, which do what you expect, but +now there is an additional `Soft` version, which is more configurable: you can +give a constraint on the color space in order to get colors within a certain *feel*. + +Let's start with the simple methods first, all they take is the amount of +colors to generate, which could, for example, be the player count. They return +an array of `colorful.Color` objects: + +```go +pal1, err1 := colorful.WarmPalette(10) +pal2 := colorful.FastWarmPalette(10) +pal3, err3 := colorful.HappyPalette(10) +pal4 := colorful.FastHappyPalette(10) +pal5, err5 := colorful.SoftPalette(10) +``` + +Note that the non-fast methods *may* fail if you ask for way too many colors. +Let's move on to the advanced one, namely `SoftPaletteEx`. Besides the color +count, this function takes a `SoftPaletteSettings` object as argument. The +interesting part here is its `CheckColor` member, which is a boolean function +taking three floating points as arguments: `l`, `a` and `b`. This function +should return `true` for colors which lie within the region you want and `false` +otherwise. The other members are `Iteration`, which should be within [5..100] +where higher means slower but more exact palette, and `ManySamples` which you +should set to `true` in case your `CheckColor` constraint rejects a large part +of the color space. + +For example, to create a palette of 10 brownish colors, you'd call it like this: + +```go +func isbrowny(l, a, b float64) bool { + h, c, L := colorful.LabToHcl(l, a, b) + return 10.0 < h && h < 50.0 && 0.1 < c && c < 0.5 && L < 0.5 +} +// Since the above function is pretty restrictive, we set ManySamples to true. +brownies := colorful.SoftPaletteEx(10, colorful.SoftPaletteSettings{isbrowny, 50, true}) +``` + +The following picture shows the palettes generated by all of these methods +(sourcecode in `doc/palettegens/palettegens.go`), in the order they were presented, i.e. +from top to bottom: `Warm`, `FastWarm`, `Happy`, `FastHappy`, `Soft`, +`SoftEx(isbrowny)`. All of them contain some randomness, so YMMV. + +![All example palettes](doc/palettegens/palettegens.png) + +Again, the code used for generating the above image is available as [doc/palettegens/palettegens.go](https://github.com/lucasb-eyer/go-colorful/blob/master/doc/palettegens/palettegens.go). + +### Sorting colors +TODO: Sort using dist fn. + +### Using linear RGB for computations +There are two methods for transforming RGB<->Linear RGB: a fast and almost precise one, +and a slow and precise one. + +```go +r, g, b := colorful.Hex("#FF0000").FastLinearRgb() +``` + +TODO: describe some more. + +### Want to use some other reference point? + +```go +c := colorful.LabWhiteRef(0.507850, 0.040585,-0.370945, colorful.D50) +l, a, b := c.LabWhiteRef(colorful.D50) +``` + +### Reading and writing colors from databases + +The type `HexColor` makes it easy to store colors as strings in a database. It +implements the [https://godoc.org/database/sql#Scanner](database/sql.Scanner) +and [database/sql/driver.Value](https://godoc.org/database/sql/driver.Value) +interfaces which provide automatic type conversion. + +Example: + +```go +var hc HexColor +_, err := db.QueryRow("SELECT '#ff0000';").Scan(&hc) +// hc == HexColor{R: 1, G: 0, B: 0}; err == nil +``` + +FAQ +=== + +### Q: I get all f!@#ed up values! Your library sucks! +A: You probably provided values in the wrong range. For example, RGB values are +expected to reside between 0 and 1, *not* between 0 and 255. Normalize your colors. + +### Q: Lab/Luv/HCl seem broken! Your library sucks! +They look like this: + + + +A: You're likely trying to generate and display colors that can't be represented by RGB, +and thus monitors. When you're trying to convert, say, `HCL(190.0, 1.0, 1.0).RGB255()`, +you're asking for RGB values of `(-2105.254 300.680 286.185)`, which clearly don't exist, +and the `RGB255` function just casts these numbers to `uint8`, creating wrap-around and +what looks like a completely broken gradient. What you want to do, is either use more +reasonable values of colors which actually exist in RGB, or just `Clamp()` the resulting +color to its nearest existing one, living with the consequences: +`HCL(190.0, 1.0, 1.0).Clamp().RGB255()`. It will look something like this: + + + +[Here's an issue going in-depth about this](https://github.com/lucasb-eyer/go-colorful/issues/14), +as well as [my answer](https://github.com/lucasb-eyer/go-colorful/issues/14#issuecomment-324205385), +both with code and pretty pictures. Also note that this was somewhat covered above in the +["Blending colors" section](https://github.com/lucasb-eyer/go-colorful#blending-colors). + +### Q: In a tight loop, conversion to Lab/Luv/HCl/... are slooooow! +A: Yes, they are. +This library aims for correctness, readability, and modularity; it wasn't written with speed in mind. +A large part of the slowness comes from these conversions going through `LinearRgb` which uses powers. +I implemented a fast approximation to `LinearRgb` called `FastLinearRgb` by using Taylor approximations. +The approximation is roughly 5x faster and precise up to roughly 0.5%, +the major caveat being that if the input values are outside the range 0-1, accuracy drops dramatically. +You can use these in your conversions as follows: + +```go +col := // Get your color somehow +l, a, b := XyzToLab(LinearRgbToXyz(col.LinearRgb())) +``` + +If you need faster versions of `Distance*` and `Blend*` that make use of this fast approximation, +feel free to implement them and open a pull-request, I'll happily accept. + +The derivation of these functions can be followed in [this Jupyter notebook](doc/LinearRGB Approximations.ipynb). +Here's the main figure showing the approximation quality: + +![approximation quality](doc/approx-quality.png) + +More speed could be gained by using SIMD instructions in many places. +You can also get more speed for specific conversions by approximating the full conversion function, +but that is outside the scope of this library. +Thanks to [@ZirconiumX](https://github.com/ZirconiumX) for starting this investigation, +see [issue #18](https://github.com/lucasb-eyer/go-colorful/issues/18) for details. + +### Q: Why would `MakeColor` ever fail!? +A: `MakeColor` fails when the alpha channel is zero. In that case, the +conversion is undefined. See [issue 21](https://github.com/lucasb-eyer/go-colorful/issues/21) +as well as the short caveat note in the ["The `color.Color` interface"](README.md#the-colorcolor-interface) +section above. + +Who? +==== + +This library was developed by Lucas Beyer with contributions from +Bastien Dejean (@baskerville), Phil Kulak (@pkulak) and Christian Muehlhaeuser (@muesli). + +It is now maintained by makeworld (@makeworld-the-better-one). + + +## License + +This repo is under the MIT license, see [LICENSE](LICENSE) for details. diff --git a/vendor/github.com/lucasb-eyer/go-colorful/colorgens.go b/vendor/github.com/lucasb-eyer/go-colorful/colorgens.go new file mode 100644 index 00000000..2e2e49e1 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/colorgens.go @@ -0,0 +1,55 @@ +// Various ways to generate single random colors + +package colorful + +import ( + "math/rand" +) + +// Creates a random dark, "warm" color through a restricted HSV space. +func FastWarmColor() Color { + return Hsv( + rand.Float64()*360.0, + 0.5+rand.Float64()*0.3, + 0.3+rand.Float64()*0.3) +} + +// Creates a random dark, "warm" color through restricted HCL space. +// This is slower than FastWarmColor but will likely give you colors which have +// the same "warmness" if you run it many times. +func WarmColor() (c Color) { + for c = randomWarm(); !c.IsValid(); c = randomWarm() { + } + return +} + +func randomWarm() Color { + return Hcl( + rand.Float64()*360.0, + 0.1+rand.Float64()*0.3, + 0.2+rand.Float64()*0.3) +} + +// Creates a random bright, "pimpy" color through a restricted HSV space. +func FastHappyColor() Color { + return Hsv( + rand.Float64()*360.0, + 0.7+rand.Float64()*0.3, + 0.6+rand.Float64()*0.3) +} + +// Creates a random bright, "pimpy" color through restricted HCL space. +// This is slower than FastHappyColor but will likely give you colors which +// have the same "brightness" if you run it many times. +func HappyColor() (c Color) { + for c = randomPimp(); !c.IsValid(); c = randomPimp() { + } + return +} + +func randomPimp() Color { + return Hcl( + rand.Float64()*360.0, + 0.5+rand.Float64()*0.3, + 0.5+rand.Float64()*0.3) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/colors.go b/vendor/github.com/lucasb-eyer/go-colorful/colors.go new file mode 100644 index 00000000..0d5bffe5 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/colors.go @@ -0,0 +1,979 @@ +// The colorful package provides all kinds of functions for working with colors. +package colorful + +import ( + "fmt" + "image/color" + "math" +) + +// A color is stored internally using sRGB (standard RGB) values in the range 0-1 +type Color struct { + R, G, B float64 +} + +// Implement the Go color.Color interface. +func (col Color) RGBA() (r, g, b, a uint32) { + r = uint32(col.R*65535.0 + 0.5) + g = uint32(col.G*65535.0 + 0.5) + b = uint32(col.B*65535.0 + 0.5) + a = 0xFFFF + return +} + +// Constructs a colorful.Color from something implementing color.Color +func MakeColor(col color.Color) (Color, bool) { + r, g, b, a := col.RGBA() + if a == 0 { + return Color{0, 0, 0}, false + } + + // Since color.Color is alpha pre-multiplied, we need to divide the + // RGB values by alpha again in order to get back the original RGB. + r *= 0xffff + r /= a + g *= 0xffff + g /= a + b *= 0xffff + b /= a + + return Color{float64(r) / 65535.0, float64(g) / 65535.0, float64(b) / 65535.0}, true +} + +// Might come in handy sometimes to reduce boilerplate code. +func (col Color) RGB255() (r, g, b uint8) { + r = uint8(col.R*255.0 + 0.5) + g = uint8(col.G*255.0 + 0.5) + b = uint8(col.B*255.0 + 0.5) + return +} + +// Used to simplify HSLuv testing. +func (col Color) values() (float64, float64, float64) { + return col.R, col.G, col.B +} + +// This is the tolerance used when comparing colors using AlmostEqualRgb. +const Delta = 1.0 / 255.0 + +// This is the default reference white point. +var D65 = [3]float64{0.95047, 1.00000, 1.08883} + +// And another one. +var D50 = [3]float64{0.96422, 1.00000, 0.82521} + +// Checks whether the color exists in RGB space, i.e. all values are in [0..1] +func (c Color) IsValid() bool { + return 0.0 <= c.R && c.R <= 1.0 && + 0.0 <= c.G && c.G <= 1.0 && + 0.0 <= c.B && c.B <= 1.0 +} + +// clamp01 clamps from 0 to 1. +func clamp01(v float64) float64 { + return math.Max(0.0, math.Min(v, 1.0)) +} + +// Returns Clamps the color into valid range, clamping each value to [0..1] +// If the color is valid already, this is a no-op. +func (c Color) Clamped() Color { + return Color{clamp01(c.R), clamp01(c.G), clamp01(c.B)} +} + +func sq(v float64) float64 { + return v * v +} + +func cub(v float64) float64 { + return v * v * v +} + +// DistanceRgb computes the distance between two colors in RGB space. +// This is not a good measure! Rather do it in Lab space. +func (c1 Color) DistanceRgb(c2 Color) float64 { + return math.Sqrt(sq(c1.R-c2.R) + sq(c1.G-c2.G) + sq(c1.B-c2.B)) +} + +// DistanceLinearRGB computes the distance between two colors in linear RGB +// space. This is not useful for measuring how humans perceive color, but +// might be useful for other things, like dithering. +func (c1 Color) DistanceLinearRGB(c2 Color) float64 { + r1, g1, b1 := c1.LinearRgb() + r2, g2, b2 := c2.LinearRgb() + return math.Sqrt(sq(r1-r2) + sq(g1-g2) + sq(b1-b2)) +} + +// Check for equality between colors within the tolerance Delta (1/255). +func (c1 Color) AlmostEqualRgb(c2 Color) bool { + return math.Abs(c1.R-c2.R)+ + math.Abs(c1.G-c2.G)+ + math.Abs(c1.B-c2.B) < 3.0*Delta +} + +// You don't really want to use this, do you? Go for BlendLab, BlendLuv or BlendHcl. +func (c1 Color) BlendRgb(c2 Color, t float64) Color { + return Color{c1.R + t*(c2.R-c1.R), + c1.G + t*(c2.G-c1.G), + c1.B + t*(c2.B-c1.B)} +} + +// Utility used by Hxx color-spaces for interpolating between two angles in [0,360]. +func interp_angle(a0, a1, t float64) float64 { + // Based on the answer here: http://stackoverflow.com/a/14498790/2366315 + // With potential proof that it works here: http://math.stackexchange.com/a/2144499 + delta := math.Mod(math.Mod(a1-a0, 360.0)+540, 360.0) - 180.0 + return math.Mod(a0+t*delta+360.0, 360.0) +} + +/// HSV /// +/////////// +// From http://en.wikipedia.org/wiki/HSL_and_HSV +// Note that h is in [0..360] and s,v in [0..1] + +// Hsv returns the Hue [0..360], Saturation and Value [0..1] of the color. +func (col Color) Hsv() (h, s, v float64) { + min := math.Min(math.Min(col.R, col.G), col.B) + v = math.Max(math.Max(col.R, col.G), col.B) + C := v - min + + s = 0.0 + if v != 0.0 { + s = C / v + } + + h = 0.0 // We use 0 instead of undefined as in wp. + if min != v { + if v == col.R { + h = math.Mod((col.G-col.B)/C, 6.0) + } + if v == col.G { + h = (col.B-col.R)/C + 2.0 + } + if v == col.B { + h = (col.R-col.G)/C + 4.0 + } + h *= 60.0 + if h < 0.0 { + h += 360.0 + } + } + return +} + +// Hsv creates a new Color given a Hue in [0..360], a Saturation and a Value in [0..1] +func Hsv(H, S, V float64) Color { + Hp := H / 60.0 + C := V * S + X := C * (1.0 - math.Abs(math.Mod(Hp, 2.0)-1.0)) + + m := V - C + r, g, b := 0.0, 0.0, 0.0 + + switch { + case 0.0 <= Hp && Hp < 1.0: + r = C + g = X + case 1.0 <= Hp && Hp < 2.0: + r = X + g = C + case 2.0 <= Hp && Hp < 3.0: + g = C + b = X + case 3.0 <= Hp && Hp < 4.0: + g = X + b = C + case 4.0 <= Hp && Hp < 5.0: + r = X + b = C + case 5.0 <= Hp && Hp < 6.0: + r = C + b = X + } + + return Color{m + r, m + g, m + b} +} + +// You don't really want to use this, do you? Go for BlendLab, BlendLuv or BlendHcl. +func (c1 Color) BlendHsv(c2 Color, t float64) Color { + h1, s1, v1 := c1.Hsv() + h2, s2, v2 := c2.Hsv() + + // We know that h are both in [0..360] + return Hsv(interp_angle(h1, h2, t), s1+t*(s2-s1), v1+t*(v2-v1)) +} + +/// HSL /// +/////////// + +// Hsl returns the Hue [0..360], Saturation [0..1], and Luminance (lightness) [0..1] of the color. +func (col Color) Hsl() (h, s, l float64) { + min := math.Min(math.Min(col.R, col.G), col.B) + max := math.Max(math.Max(col.R, col.G), col.B) + + l = (max + min) / 2 + + if min == max { + s = 0 + h = 0 + } else { + if l < 0.5 { + s = (max - min) / (max + min) + } else { + s = (max - min) / (2.0 - max - min) + } + + if max == col.R { + h = (col.G - col.B) / (max - min) + } else if max == col.G { + h = 2.0 + (col.B-col.R)/(max-min) + } else { + h = 4.0 + (col.R-col.G)/(max-min) + } + + h *= 60 + + if h < 0 { + h += 360 + } + } + + return +} + +// Hsl creates a new Color given a Hue in [0..360], a Saturation [0..1], and a Luminance (lightness) in [0..1] +func Hsl(h, s, l float64) Color { + if s == 0 { + return Color{l, l, l} + } + + var r, g, b float64 + var t1 float64 + var t2 float64 + var tr float64 + var tg float64 + var tb float64 + + if l < 0.5 { + t1 = l * (1.0 + s) + } else { + t1 = l + s - l*s + } + + t2 = 2*l - t1 + h /= 360 + tr = h + 1.0/3.0 + tg = h + tb = h - 1.0/3.0 + + if tr < 0 { + tr++ + } + if tr > 1 { + tr-- + } + if tg < 0 { + tg++ + } + if tg > 1 { + tg-- + } + if tb < 0 { + tb++ + } + if tb > 1 { + tb-- + } + + // Red + if 6*tr < 1 { + r = t2 + (t1-t2)*6*tr + } else if 2*tr < 1 { + r = t1 + } else if 3*tr < 2 { + r = t2 + (t1-t2)*(2.0/3.0-tr)*6 + } else { + r = t2 + } + + // Green + if 6*tg < 1 { + g = t2 + (t1-t2)*6*tg + } else if 2*tg < 1 { + g = t1 + } else if 3*tg < 2 { + g = t2 + (t1-t2)*(2.0/3.0-tg)*6 + } else { + g = t2 + } + + // Blue + if 6*tb < 1 { + b = t2 + (t1-t2)*6*tb + } else if 2*tb < 1 { + b = t1 + } else if 3*tb < 2 { + b = t2 + (t1-t2)*(2.0/3.0-tb)*6 + } else { + b = t2 + } + + return Color{r, g, b} +} + +/// Hex /// +/////////// + +// Hex returns the hex "html" representation of the color, as in #ff0080. +func (col Color) Hex() string { + // Add 0.5 for rounding + return fmt.Sprintf("#%02x%02x%02x", uint8(col.R*255.0+0.5), uint8(col.G*255.0+0.5), uint8(col.B*255.0+0.5)) +} + +// Hex parses a "html" hex color-string, either in the 3 "#f0c" or 6 "#ff1034" digits form. +func Hex(scol string) (Color, error) { + format := "#%02x%02x%02x" + factor := 1.0 / 255.0 + if len(scol) == 4 { + format = "#%1x%1x%1x" + factor = 1.0 / 15.0 + } + + var r, g, b uint8 + n, err := fmt.Sscanf(scol, format, &r, &g, &b) + if err != nil { + return Color{}, err + } + if n != 3 { + return Color{}, fmt.Errorf("color: %v is not a hex-color", scol) + } + + return Color{float64(r) * factor, float64(g) * factor, float64(b) * factor}, nil +} + +/// Linear /// +////////////// +// http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/ +// http://www.brucelindbloom.com/Eqn_RGB_to_XYZ.html + +func linearize(v float64) float64 { + if v <= 0.04045 { + return v / 12.92 + } + return math.Pow((v+0.055)/1.055, 2.4) +} + +// LinearRgb converts the color into the linear RGB space (see http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/). +func (col Color) LinearRgb() (r, g, b float64) { + r = linearize(col.R) + g = linearize(col.G) + b = linearize(col.B) + return +} + +// A much faster and still quite precise linearization using a 6th-order Taylor approximation. +// See the accompanying Jupyter notebook for derivation of the constants. +func linearize_fast(v float64) float64 { + v1 := v - 0.5 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + //v5 := v3*v2 + return -0.248750514614486 + 0.925583310193438*v + 1.16740237321695*v2 + 0.280457026598666*v3 - 0.0757991963780179*v4 //+ 0.0437040411548932*v5 +} + +// FastLinearRgb is much faster than and almost as accurate as LinearRgb. +// BUT it is important to NOTE that they only produce good results for valid colors r,g,b in [0,1]. +func (col Color) FastLinearRgb() (r, g, b float64) { + r = linearize_fast(col.R) + g = linearize_fast(col.G) + b = linearize_fast(col.B) + return +} + +func delinearize(v float64) float64 { + if v <= 0.0031308 { + return 12.92 * v + } + return 1.055*math.Pow(v, 1.0/2.4) - 0.055 +} + +// LinearRgb creates an sRGB color out of the given linear RGB color (see http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/). +func LinearRgb(r, g, b float64) Color { + return Color{delinearize(r), delinearize(g), delinearize(b)} +} + +func delinearize_fast(v float64) float64 { + // This function (fractional root) is much harder to linearize, so we need to split. + if v > 0.2 { + v1 := v - 0.6 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + v5 := v3 * v2 + return 0.442430344268235 + 0.592178981271708*v - 0.287864782562636*v2 + 0.253214392068985*v3 - 0.272557158129811*v4 + 0.325554383321718*v5 + } else if v > 0.03 { + v1 := v - 0.115 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + v5 := v3 * v2 + return 0.194915592891669 + 1.55227076330229*v - 3.93691860257828*v2 + 18.0679839248761*v3 - 101.468750302746*v4 + 632.341487393927*v5 + } else { + v1 := v - 0.015 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + v5 := v3 * v2 + // You can clearly see from the involved constants that the low-end is highly nonlinear. + return 0.0519565234928877 + 5.09316778537561*v - 99.0338180489702*v2 + 3484.52322764895*v3 - 150028.083412663*v4 + 7168008.42971613*v5 + } +} + +// FastLinearRgb is much faster than and almost as accurate as LinearRgb. +// BUT it is important to NOTE that they only produce good results for valid inputs r,g,b in [0,1]. +func FastLinearRgb(r, g, b float64) Color { + return Color{delinearize_fast(r), delinearize_fast(g), delinearize_fast(b)} +} + +// XyzToLinearRgb converts from CIE XYZ-space to Linear RGB space. +func XyzToLinearRgb(x, y, z float64) (r, g, b float64) { + r = 3.2409699419045214*x - 1.5373831775700935*y - 0.49861076029300328*z + g = -0.96924363628087983*x + 1.8759675015077207*y + 0.041555057407175613*z + b = 0.055630079696993609*x - 0.20397695888897657*y + 1.0569715142428786*z + return +} + +func LinearRgbToXyz(r, g, b float64) (x, y, z float64) { + x = 0.41239079926595948*r + 0.35758433938387796*g + 0.18048078840183429*b + y = 0.21263900587151036*r + 0.71516867876775593*g + 0.072192315360733715*b + z = 0.019330818715591851*r + 0.11919477979462599*g + 0.95053215224966058*b + return +} + +/// XYZ /// +/////////// +// http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/ + +func (col Color) Xyz() (x, y, z float64) { + return LinearRgbToXyz(col.LinearRgb()) +} + +func Xyz(x, y, z float64) Color { + return LinearRgb(XyzToLinearRgb(x, y, z)) +} + +/// xyY /// +/////////// +// http://www.brucelindbloom.com/Eqn_XYZ_to_xyY.html + +// Well, the name is bad, since it's xyY but Golang needs me to start with a +// capital letter to make the method public. +func XyzToXyy(X, Y, Z float64) (x, y, Yout float64) { + return XyzToXyyWhiteRef(X, Y, Z, D65) +} + +func XyzToXyyWhiteRef(X, Y, Z float64, wref [3]float64) (x, y, Yout float64) { + Yout = Y + N := X + Y + Z + if math.Abs(N) < 1e-14 { + // When we have black, Bruce Lindbloom recommends to use + // the reference white's chromacity for x and y. + x = wref[0] / (wref[0] + wref[1] + wref[2]) + y = wref[1] / (wref[0] + wref[1] + wref[2]) + } else { + x = X / N + y = Y / N + } + return +} + +func XyyToXyz(x, y, Y float64) (X, Yout, Z float64) { + Yout = Y + + if -1e-14 < y && y < 1e-14 { + X = 0.0 + Z = 0.0 + } else { + X = Y / y * x + Z = Y / y * (1.0 - x - y) + } + + return +} + +// Converts the given color to CIE xyY space using D65 as reference white. +// (Note that the reference white is only used for black input.) +// x, y and Y are in [0..1] +func (col Color) Xyy() (x, y, Y float64) { + return XyzToXyy(col.Xyz()) +} + +// Converts the given color to CIE xyY space, taking into account +// a given reference white. (i.e. the monitor's white) +// (Note that the reference white is only used for black input.) +// x, y and Y are in [0..1] +func (col Color) XyyWhiteRef(wref [3]float64) (x, y, Y float64) { + X, Y2, Z := col.Xyz() + return XyzToXyyWhiteRef(X, Y2, Z, wref) +} + +// Generates a color by using data given in CIE xyY space. +// x, y and Y are in [0..1] +func Xyy(x, y, Y float64) Color { + return Xyz(XyyToXyz(x, y, Y)) +} + +/// L*a*b* /// +////////////// +// http://en.wikipedia.org/wiki/Lab_color_space#CIELAB-CIEXYZ_conversions +// For L*a*b*, we need to L*a*b*<->XYZ->RGB and the first one is device dependent. + +func lab_f(t float64) float64 { + if t > 6.0/29.0*6.0/29.0*6.0/29.0 { + return math.Cbrt(t) + } + return t/3.0*29.0/6.0*29.0/6.0 + 4.0/29.0 +} + +func XyzToLab(x, y, z float64) (l, a, b float64) { + // Use D65 white as reference point by default. + // http://www.fredmiranda.com/forum/topic/1035332 + // http://en.wikipedia.org/wiki/Standard_illuminant + return XyzToLabWhiteRef(x, y, z, D65) +} + +func XyzToLabWhiteRef(x, y, z float64, wref [3]float64) (l, a, b float64) { + fy := lab_f(y / wref[1]) + l = 1.16*fy - 0.16 + a = 5.0 * (lab_f(x/wref[0]) - fy) + b = 2.0 * (fy - lab_f(z/wref[2])) + return +} + +func lab_finv(t float64) float64 { + if t > 6.0/29.0 { + return t * t * t + } + return 3.0 * 6.0 / 29.0 * 6.0 / 29.0 * (t - 4.0/29.0) +} + +func LabToXyz(l, a, b float64) (x, y, z float64) { + // D65 white (see above). + return LabToXyzWhiteRef(l, a, b, D65) +} + +func LabToXyzWhiteRef(l, a, b float64, wref [3]float64) (x, y, z float64) { + l2 := (l + 0.16) / 1.16 + x = wref[0] * lab_finv(l2+a/5.0) + y = wref[1] * lab_finv(l2) + z = wref[2] * lab_finv(l2-b/2.0) + return +} + +// Converts the given color to CIE L*a*b* space using D65 as reference white. +func (col Color) Lab() (l, a, b float64) { + return XyzToLab(col.Xyz()) +} + +// Converts the given color to CIE L*a*b* space, taking into account +// a given reference white. (i.e. the monitor's white) +func (col Color) LabWhiteRef(wref [3]float64) (l, a, b float64) { + x, y, z := col.Xyz() + return XyzToLabWhiteRef(x, y, z, wref) +} + +// Generates a color by using data given in CIE L*a*b* space using D65 as reference white. +// WARNING: many combinations of `l`, `a`, and `b` values do not have corresponding +// valid RGB values, check the FAQ in the README if you're unsure. +func Lab(l, a, b float64) Color { + return Xyz(LabToXyz(l, a, b)) +} + +// Generates a color by using data given in CIE L*a*b* space, taking +// into account a given reference white. (i.e. the monitor's white) +func LabWhiteRef(l, a, b float64, wref [3]float64) Color { + return Xyz(LabToXyzWhiteRef(l, a, b, wref)) +} + +// DistanceLab is a good measure of visual similarity between two colors! +// A result of 0 would mean identical colors, while a result of 1 or higher +// means the colors differ a lot. +func (c1 Color) DistanceLab(c2 Color) float64 { + l1, a1, b1 := c1.Lab() + l2, a2, b2 := c2.Lab() + return math.Sqrt(sq(l1-l2) + sq(a1-a2) + sq(b1-b2)) +} + +// DistanceCIE76 is the same as DistanceLab. +func (c1 Color) DistanceCIE76(c2 Color) float64 { + return c1.DistanceLab(c2) +} + +// Uses the CIE94 formula to calculate color distance. More accurate than +// DistanceLab, but also more work. +func (cl Color) DistanceCIE94(cr Color) float64 { + l1, a1, b1 := cl.Lab() + l2, a2, b2 := cr.Lab() + + // NOTE: Since all those formulas expect L,a,b values 100x larger than we + // have them in this library, we either need to adjust all constants + // in the formula, or convert the ranges of L,a,b before, and then + // scale the distances down again. The latter is less error-prone. + l1, a1, b1 = l1*100.0, a1*100.0, b1*100.0 + l2, a2, b2 = l2*100.0, a2*100.0, b2*100.0 + + kl := 1.0 // 2.0 for textiles + kc := 1.0 + kh := 1.0 + k1 := 0.045 // 0.048 for textiles + k2 := 0.015 // 0.014 for textiles. + + deltaL := l1 - l2 + c1 := math.Sqrt(sq(a1) + sq(b1)) + c2 := math.Sqrt(sq(a2) + sq(b2)) + deltaCab := c1 - c2 + + // Not taking Sqrt here for stability, and it's unnecessary. + deltaHab2 := sq(a1-a2) + sq(b1-b2) - sq(deltaCab) + sl := 1.0 + sc := 1.0 + k1*c1 + sh := 1.0 + k2*c1 + + vL2 := sq(deltaL / (kl * sl)) + vC2 := sq(deltaCab / (kc * sc)) + vH2 := deltaHab2 / sq(kh*sh) + + return math.Sqrt(vL2+vC2+vH2) * 0.01 // See above. +} + +// DistanceCIEDE2000 uses the Delta E 2000 formula to calculate color +// distance. It is more expensive but more accurate than both DistanceLab +// and DistanceCIE94. +func (cl Color) DistanceCIEDE2000(cr Color) float64 { + return cl.DistanceCIEDE2000klch(cr, 1.0, 1.0, 1.0) +} + +// DistanceCIEDE2000klch uses the Delta E 2000 formula with custom values +// for the weighting factors kL, kC, and kH. +func (cl Color) DistanceCIEDE2000klch(cr Color, kl, kc, kh float64) float64 { + l1, a1, b1 := cl.Lab() + l2, a2, b2 := cr.Lab() + + // As with CIE94, we scale up the ranges of L,a,b beforehand and scale + // them down again afterwards. + l1, a1, b1 = l1*100.0, a1*100.0, b1*100.0 + l2, a2, b2 = l2*100.0, a2*100.0, b2*100.0 + + cab1 := math.Sqrt(sq(a1) + sq(b1)) + cab2 := math.Sqrt(sq(a2) + sq(b2)) + cabmean := (cab1 + cab2) / 2 + + g := 0.5 * (1 - math.Sqrt(math.Pow(cabmean, 7)/(math.Pow(cabmean, 7)+math.Pow(25, 7)))) + ap1 := (1 + g) * a1 + ap2 := (1 + g) * a2 + cp1 := math.Sqrt(sq(ap1) + sq(b1)) + cp2 := math.Sqrt(sq(ap2) + sq(b2)) + + hp1 := 0.0 + if b1 != ap1 || ap1 != 0 { + hp1 = math.Atan2(b1, ap1) + if hp1 < 0 { + hp1 += math.Pi * 2 + } + hp1 *= 180 / math.Pi + } + hp2 := 0.0 + if b2 != ap2 || ap2 != 0 { + hp2 = math.Atan2(b2, ap2) + if hp2 < 0 { + hp2 += math.Pi * 2 + } + hp2 *= 180 / math.Pi + } + + deltaLp := l2 - l1 + deltaCp := cp2 - cp1 + dhp := 0.0 + cpProduct := cp1 * cp2 + if cpProduct != 0 { + dhp = hp2 - hp1 + if dhp > 180 { + dhp -= 360 + } else if dhp < -180 { + dhp += 360 + } + } + deltaHp := 2 * math.Sqrt(cpProduct) * math.Sin(dhp/2*math.Pi/180) + + lpmean := (l1 + l2) / 2 + cpmean := (cp1 + cp2) / 2 + hpmean := hp1 + hp2 + if cpProduct != 0 { + hpmean /= 2 + if math.Abs(hp1-hp2) > 180 { + if hp1+hp2 < 360 { + hpmean += 180 + } else { + hpmean -= 180 + } + } + } + + t := 1 - 0.17*math.Cos((hpmean-30)*math.Pi/180) + 0.24*math.Cos(2*hpmean*math.Pi/180) + 0.32*math.Cos((3*hpmean+6)*math.Pi/180) - 0.2*math.Cos((4*hpmean-63)*math.Pi/180) + deltaTheta := 30 * math.Exp(-sq((hpmean-275)/25)) + rc := 2 * math.Sqrt(math.Pow(cpmean, 7)/(math.Pow(cpmean, 7)+math.Pow(25, 7))) + sl := 1 + (0.015*sq(lpmean-50))/math.Sqrt(20+sq(lpmean-50)) + sc := 1 + 0.045*cpmean + sh := 1 + 0.015*cpmean*t + rt := -math.Sin(2*deltaTheta*math.Pi/180) * rc + + return math.Sqrt(sq(deltaLp/(kl*sl))+sq(deltaCp/(kc*sc))+sq(deltaHp/(kh*sh))+rt*(deltaCp/(kc*sc))*(deltaHp/(kh*sh))) * 0.01 +} + +// BlendLab blends two colors in the L*a*b* color-space, which should result in a smoother blend. +// t == 0 results in c1, t == 1 results in c2 +func (c1 Color) BlendLab(c2 Color, t float64) Color { + l1, a1, b1 := c1.Lab() + l2, a2, b2 := c2.Lab() + return Lab(l1+t*(l2-l1), + a1+t*(a2-a1), + b1+t*(b2-b1)) +} + +/// L*u*v* /// +////////////// +// http://en.wikipedia.org/wiki/CIELUV#XYZ_.E2.86.92_CIELUV_and_CIELUV_.E2.86.92_XYZ_conversions +// For L*u*v*, we need to L*u*v*<->XYZ<->RGB and the first one is device dependent. + +func XyzToLuv(x, y, z float64) (l, a, b float64) { + // Use D65 white as reference point by default. + // http://www.fredmiranda.com/forum/topic/1035332 + // http://en.wikipedia.org/wiki/Standard_illuminant + return XyzToLuvWhiteRef(x, y, z, D65) +} + +func XyzToLuvWhiteRef(x, y, z float64, wref [3]float64) (l, u, v float64) { + if y/wref[1] <= 6.0/29.0*6.0/29.0*6.0/29.0 { + l = y / wref[1] * (29.0 / 3.0 * 29.0 / 3.0 * 29.0 / 3.0) / 100.0 + } else { + l = 1.16*math.Cbrt(y/wref[1]) - 0.16 + } + ubis, vbis := xyz_to_uv(x, y, z) + un, vn := xyz_to_uv(wref[0], wref[1], wref[2]) + u = 13.0 * l * (ubis - un) + v = 13.0 * l * (vbis - vn) + return +} + +// For this part, we do as R's graphics.hcl does, not as wikipedia does. +// Or is it the same? +func xyz_to_uv(x, y, z float64) (u, v float64) { + denom := x + 15.0*y + 3.0*z + if denom == 0.0 { + u, v = 0.0, 0.0 + } else { + u = 4.0 * x / denom + v = 9.0 * y / denom + } + return +} + +func LuvToXyz(l, u, v float64) (x, y, z float64) { + // D65 white (see above). + return LuvToXyzWhiteRef(l, u, v, D65) +} + +func LuvToXyzWhiteRef(l, u, v float64, wref [3]float64) (x, y, z float64) { + //y = wref[1] * lab_finv((l + 0.16) / 1.16) + if l <= 0.08 { + y = wref[1] * l * 100.0 * 3.0 / 29.0 * 3.0 / 29.0 * 3.0 / 29.0 + } else { + y = wref[1] * cub((l+0.16)/1.16) + } + un, vn := xyz_to_uv(wref[0], wref[1], wref[2]) + if l != 0.0 { + ubis := u/(13.0*l) + un + vbis := v/(13.0*l) + vn + x = y * 9.0 * ubis / (4.0 * vbis) + z = y * (12.0 - 3.0*ubis - 20.0*vbis) / (4.0 * vbis) + } else { + x, y = 0.0, 0.0 + } + return +} + +// Converts the given color to CIE L*u*v* space using D65 as reference white. +// L* is in [0..1] and both u* and v* are in about [-1..1] +func (col Color) Luv() (l, u, v float64) { + return XyzToLuv(col.Xyz()) +} + +// Converts the given color to CIE L*u*v* space, taking into account +// a given reference white. (i.e. the monitor's white) +// L* is in [0..1] and both u* and v* are in about [-1..1] +func (col Color) LuvWhiteRef(wref [3]float64) (l, u, v float64) { + x, y, z := col.Xyz() + return XyzToLuvWhiteRef(x, y, z, wref) +} + +// Generates a color by using data given in CIE L*u*v* space using D65 as reference white. +// L* is in [0..1] and both u* and v* are in about [-1..1] +// WARNING: many combinations of `l`, `u`, and `v` values do not have corresponding +// valid RGB values, check the FAQ in the README if you're unsure. +func Luv(l, u, v float64) Color { + return Xyz(LuvToXyz(l, u, v)) +} + +// Generates a color by using data given in CIE L*u*v* space, taking +// into account a given reference white. (i.e. the monitor's white) +// L* is in [0..1] and both u* and v* are in about [-1..1] +func LuvWhiteRef(l, u, v float64, wref [3]float64) Color { + return Xyz(LuvToXyzWhiteRef(l, u, v, wref)) +} + +// DistanceLuv is a good measure of visual similarity between two colors! +// A result of 0 would mean identical colors, while a result of 1 or higher +// means the colors differ a lot. +func (c1 Color) DistanceLuv(c2 Color) float64 { + l1, u1, v1 := c1.Luv() + l2, u2, v2 := c2.Luv() + return math.Sqrt(sq(l1-l2) + sq(u1-u2) + sq(v1-v2)) +} + +// BlendLuv blends two colors in the CIE-L*u*v* color-space, which should result in a smoother blend. +// t == 0 results in c1, t == 1 results in c2 +func (c1 Color) BlendLuv(c2 Color, t float64) Color { + l1, u1, v1 := c1.Luv() + l2, u2, v2 := c2.Luv() + return Luv(l1+t*(l2-l1), + u1+t*(u2-u1), + v1+t*(v2-v1)) +} + +/// HCL /// +/////////// +// HCL is nothing else than L*a*b* in cylindrical coordinates! +// (this was wrong on English wikipedia, I fixed it, let's hope the fix stays.) +// But it is widely popular since it is a "correct HSV" +// http://www.hunterlab.com/appnotes/an09_96a.pdf + +// Converts the given color to HCL space using D65 as reference white. +// H values are in [0..360], C and L values are in [0..1] although C can overshoot 1.0 +func (col Color) Hcl() (h, c, l float64) { + return col.HclWhiteRef(D65) +} + +func LabToHcl(L, a, b float64) (h, c, l float64) { + // Oops, floating point workaround necessary if a ~= b and both are very small (i.e. almost zero). + if math.Abs(b-a) > 1e-4 && math.Abs(a) > 1e-4 { + h = math.Mod(57.29577951308232087721*math.Atan2(b, a)+360.0, 360.0) // Rad2Deg + } else { + h = 0.0 + } + c = math.Sqrt(sq(a) + sq(b)) + l = L + return +} + +// Converts the given color to HCL space, taking into account +// a given reference white. (i.e. the monitor's white) +// H values are in [0..360], C and L values are in [0..1] +func (col Color) HclWhiteRef(wref [3]float64) (h, c, l float64) { + L, a, b := col.LabWhiteRef(wref) + return LabToHcl(L, a, b) +} + +// Generates a color by using data given in HCL space using D65 as reference white. +// H values are in [0..360], C and L values are in [0..1] +// WARNING: many combinations of `h`, `c`, and `l` values do not have corresponding +// valid RGB values, check the FAQ in the README if you're unsure. +func Hcl(h, c, l float64) Color { + return HclWhiteRef(h, c, l, D65) +} + +func HclToLab(h, c, l float64) (L, a, b float64) { + H := 0.01745329251994329576 * h // Deg2Rad + a = c * math.Cos(H) + b = c * math.Sin(H) + L = l + return +} + +// Generates a color by using data given in HCL space, taking +// into account a given reference white. (i.e. the monitor's white) +// H values are in [0..360], C and L values are in [0..1] +func HclWhiteRef(h, c, l float64, wref [3]float64) Color { + L, a, b := HclToLab(h, c, l) + return LabWhiteRef(L, a, b, wref) +} + +// BlendHcl blends two colors in the CIE-L*C*h° color-space, which should result in a smoother blend. +// t == 0 results in c1, t == 1 results in c2 +func (col1 Color) BlendHcl(col2 Color, t float64) Color { + h1, c1, l1 := col1.Hcl() + h2, c2, l2 := col2.Hcl() + + // We know that h are both in [0..360] + return Hcl(interp_angle(h1, h2, t), c1+t*(c2-c1), l1+t*(l2-l1)).Clamped() +} + +// LuvLch + +// Converts the given color to LuvLCh space using D65 as reference white. +// h values are in [0..360], C and L values are in [0..1] although C can overshoot 1.0 +func (col Color) LuvLCh() (l, c, h float64) { + return col.LuvLChWhiteRef(D65) +} + +func LuvToLuvLCh(L, u, v float64) (l, c, h float64) { + // Oops, floating point workaround necessary if u ~= v and both are very small (i.e. almost zero). + if math.Abs(v-u) > 1e-4 && math.Abs(u) > 1e-4 { + h = math.Mod(57.29577951308232087721*math.Atan2(v, u)+360.0, 360.0) // Rad2Deg + } else { + h = 0.0 + } + l = L + c = math.Sqrt(sq(u) + sq(v)) + return +} + +// Converts the given color to LuvLCh space, taking into account +// a given reference white. (i.e. the monitor's white) +// h values are in [0..360], c and l values are in [0..1] +func (col Color) LuvLChWhiteRef(wref [3]float64) (l, c, h float64) { + return LuvToLuvLCh(col.LuvWhiteRef(wref)) +} + +// Generates a color by using data given in LuvLCh space using D65 as reference white. +// h values are in [0..360], C and L values are in [0..1] +// WARNING: many combinations of `l`, `c`, and `h` values do not have corresponding +// valid RGB values, check the FAQ in the README if you're unsure. +func LuvLCh(l, c, h float64) Color { + return LuvLChWhiteRef(l, c, h, D65) +} + +func LuvLChToLuv(l, c, h float64) (L, u, v float64) { + H := 0.01745329251994329576 * h // Deg2Rad + u = c * math.Cos(H) + v = c * math.Sin(H) + L = l + return +} + +// Generates a color by using data given in LuvLCh space, taking +// into account a given reference white. (i.e. the monitor's white) +// h values are in [0..360], C and L values are in [0..1] +func LuvLChWhiteRef(l, c, h float64, wref [3]float64) Color { + L, u, v := LuvLChToLuv(l, c, h) + return LuvWhiteRef(L, u, v, wref) +} + +// BlendLuvLCh blends two colors in the cylindrical CIELUV color space. +// t == 0 results in c1, t == 1 results in c2 +func (col1 Color) BlendLuvLCh(col2 Color, t float64) Color { + l1, c1, h1 := col1.LuvLCh() + l2, c2, h2 := col2.LuvLCh() + + // We know that h are both in [0..360] + return LuvLCh(l1+t*(l2-l1), c1+t*(c2-c1), interp_angle(h1, h2, t)) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/happy_palettegen.go b/vendor/github.com/lucasb-eyer/go-colorful/happy_palettegen.go new file mode 100644 index 00000000..bb66dfa4 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/happy_palettegen.go @@ -0,0 +1,25 @@ +package colorful + +import ( + "math/rand" +) + +// Uses the HSV color space to generate colors with similar S,V but distributed +// evenly along their Hue. This is fast but not always pretty. +// If you've got time to spare, use Lab (the non-fast below). +func FastHappyPalette(colorsCount int) (colors []Color) { + colors = make([]Color, colorsCount) + + for i := 0; i < colorsCount; i++ { + colors[i] = Hsv(float64(i)*(360.0/float64(colorsCount)), 0.8+rand.Float64()*0.2, 0.65+rand.Float64()*0.2) + } + return +} + +func HappyPalette(colorsCount int) ([]Color, error) { + pimpy := func(l, a, b float64) bool { + _, c, _ := LabToHcl(l, a, b) + return 0.3 <= c && 0.4 <= l && l <= 0.8 + } + return SoftPaletteEx(colorsCount, SoftPaletteSettings{pimpy, 50, true}) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/hexcolor.go b/vendor/github.com/lucasb-eyer/go-colorful/hexcolor.go new file mode 100644 index 00000000..76f31d8f --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/hexcolor.go @@ -0,0 +1,67 @@ +package colorful + +import ( + "database/sql/driver" + "encoding/json" + "fmt" + "reflect" +) + +// A HexColor is a Color stored as a hex string "#rrggbb". It implements the +// database/sql.Scanner, database/sql/driver.Value, +// encoding/json.Unmarshaler and encoding/json.Marshaler interfaces. +type HexColor Color + +type errUnsupportedType struct { + got interface{} + want reflect.Type +} + +func (hc *HexColor) Scan(value interface{}) error { + s, ok := value.(string) + if !ok { + return errUnsupportedType{got: reflect.TypeOf(value), want: reflect.TypeOf("")} + } + c, err := Hex(s) + if err != nil { + return err + } + *hc = HexColor(c) + return nil +} + +func (hc *HexColor) Value() (driver.Value, error) { + return Color(*hc).Hex(), nil +} + +func (e errUnsupportedType) Error() string { + return fmt.Sprintf("unsupported type: got %v, want a %s", e.got, e.want) +} + +func (hc *HexColor) UnmarshalJSON(data []byte) error { + var hexCode string + if err := json.Unmarshal(data, &hexCode); err != nil { + return err + } + + var col, err = Hex(hexCode) + if err != nil { + return err + } + *hc = HexColor(col) + return nil +} + +func (hc HexColor) MarshalJSON() ([]byte, error) { + return json.Marshal(Color(hc).Hex()) +} + +// Decode - deserialize function for https://github.com/kelseyhightower/envconfig +func (hc *HexColor) Decode(hexCode string) error { + var col, err = Hex(hexCode) + if err != nil { + return err + } + *hc = HexColor(col) + return nil +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/hsluv-snapshot-rev4.json b/vendor/github.com/lucasb-eyer/go-colorful/hsluv-snapshot-rev4.json new file mode 100644 index 00000000..16354abf --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/hsluv-snapshot-rev4.json @@ -0,0 +1 @@ +{"#11ee00":{"lch":[82.5213119008325577,127.202882727266427,127.478988192005161],"luv":[82.5213119008325577,-77.3991947082883627,100.945222931227221],"rgb":[0.0666666666666666657,0.933333333333333348,0],"xyz":[0.308043578886299796,0.612655858810891907,0.102019012460713238],"hpluv":[127.478988192005161,308.195222762673438,82.5213119008325577],"hsluv":[127.478988192005161,100.000000000002416,82.5213119008325577]},"#11ee11":{"lch":[82.5429986110943759,126.352581314528209,127.715012949240403],"luv":[82.5429986110943759,-77.2942129186682,99.9528861720763473],"rgb":[0.0666666666666666657,0.933333333333333348,0.0666666666666666657],"xyz":[0.3090552443859369,0.613060525010746815,0.107347117425468874],"hpluv":[127.715012949240403,306.573296560288782,82.5429986110943759],"hsluv":[127.715012949240403,98.9038130800949205,82.5429986110943759]},"#11ee22":{"lch":[82.5831747617793184,124.791738379333623,128.158354445562821],"luv":[82.5831747617793184,-77.1009570540098,98.1245147202868253],"rgb":[0.0666666666666666657,0.933333333333333348,0.133333333333333331],"xyz":[0.310930602524413957,0.613810668266137616,0.117224003621448067],"hpluv":[128.158354445562821,303.59085997924285,82.5831747617793184],"hsluv":[128.158354445562821,98.9085620232469864,82.5831747617793184]},"#11ee33":{"lch":[82.6492529720821381,122.265269823008623,128.905098358231896],"luv":[82.6492529720821381,-76.7865393115689301,95.1452762119380537],"rgb":[0.0666666666666666657,0.933333333333333348,0.2],"xyz":[0.314018353256871663,0.615045768559120742,0.133486157479059203],"hpluv":[128.905098358231896,298.749143147736106,82.6492529720821381],"hsluv":[128.905098358231896,98.916292078887,82.6492529720821381]},"#11ee44":{"lch":[82.7444986901015511,118.712635154498344,130.021230388522838],"luv":[82.7444986901015511,-76.3407023620842,90.9108734321077],"rgb":[0.0666666666666666657,0.933333333333333348,0.266666666666666663],"xyz":[0.318476348501090578,0.616828966656808308,0.156964932431945842],"hpluv":[130.021230388522838,291.911386756693616,82.7444986901015511],"hsluv":[130.021230388522838,98.9272612770947148,82.7444986901015511]},"#11ee55":{"lch":[82.8716000285422894,114.135934527262179,131.587310643629934],"luv":[82.8716000285422894,-75.758934185545,85.3674144008224],"rgb":[0.0666666666666666657,0.933333333333333348,0.333333333333333315],"xyz":[0.324438762540452563,0.619213932272553058,0.188366979705919757],"hpluv":[131.587310643629934,283.052591495130912,82.8716000285422894],"hsluv":[131.587310643629934,98.941589727101146,82.8716000285422894]},"#11ee66":{"lch":[83.0328193013522622,108.602333046050703,133.707640253052432],"luv":[83.0328193013522622,-75.0419109433949103,78.5059128028513697],"rgb":[0.0666666666666666657,0.933333333333333348,0.4],"xyz":[0.332023758313960748,0.622247930581956377,0.228314624113063719],"hpluv":[133.707640253052432,272.269449526145593,83.0328193013522622],"hsluv":[133.707640253052432,98.9592735060659,83.0328193013522622]},"#11ee77":{"lch":[83.2300736177455747,102.250357200027821,136.520544097163679],"luv":[83.2300736177455747,-74.1950209885278866,70.3579022430685228],"rgb":[0.0666666666666666657,0.933333333333333348,0.466666666666666674],"xyz":[0.341337771334162654,0.625973535790037228,0.277368426019461656],"hpluv":[136.520544097163679,259.803949175129901,83.2300736177455747],"hsluv":[136.520544097163679,98.9801962733070155,83.2300736177455747]},"#11ee88":{"lch":[83.4649827070576151,95.3003261118453651,140.209511574476238],"luv":[83.4649827070576151,-73.2277962837693082,60.990507527375577],"rgb":[0.0666666666666666657,0.933333333333333348,0.533333333333333326],"xyz":[0.352478188436106454,0.63042970263081477,0.336041289423033795],"hpluv":[140.209511574476238,246.084644167270028,83.4649827070576151],"hsluv":[140.209511574476238,99.0041428894333109,83.4649827070576151]},"#11ee99":{"lch":[83.7388997377875626,88.07037792773761,145.011549795441141],"luv":[83.7388997377875626,-72.1532115864445416,50.5005497603372433],"rgb":[0.0666666666666666657,0.933333333333333348,0.6],"xyz":[0.365535152545179209,0.635652488274444,0.404807967064151675],"hpluv":[145.011549795441141,231.793725377578141,83.7388997377875626],"hsluv":[145.011549795441141,99.0308160530368582,83.7388997377875626]},"#11eeaa":{"lch":[84.0529327571252907,80.9984265129003802,151.210882439188083],"luv":[84.0529327571252907,-70.9868724309634729,39.0078074241021824],"rgb":[0.0666666666666666657,0.933333333333333348,0.66666666666666663],"xyz":[0.38059284551043171,0.641675565460545,0.484111816681150331],"hpluv":[151.210882439188083,217.967504021816438,84.0529327571252907],"hsluv":[151.210882439188083,99.0598554997167895,84.0529327571252907]},"#11eebb":{"lch":[84.4079608499599914,74.6634505604909435,159.089705667287262],"luv":[84.4079608499599914,-69.7461428935043273,26.6478216947980826],"rgb":[0.0666666666666666657,0.933333333333333348,0.733333333333333282],"xyz":[0.397730437617768384,0.648530602303479808,0.574369801779792],"hpluv":[159.089705667287262,206.122134265545043,84.4079608499599914],"hsluv":[159.089705667287262,99.0908585861444209,84.4079608499599914]},"#11eecc":{"lch":[84.8046473826435,69.7804076798411,168.790807110150524],"luv":[84.8046473826435,-68.449275126866155,13.5647348138992196],"rgb":[0.0666666666666666657,0.933333333333333348,0.8],"xyz":[0.417022813061490139,0.656247552480968666,0.675976312450062178],"hpluv":[168.790807110150524,198.342538571842852,84.8046473826435],"hsluv":[168.790807110150524,99.123400814408285,84.8046473826435]},"#11eedd":{"lch":[85.2434517572140749,67.1146678094459,180.081412911690762],"luv":[85.2434517572140749,-67.114600056421537,-0.0953647673755886743],"rgb":[0.0666666666666666657,0.933333333333333348,0.866666666666666696],"xyz":[0.438541138612123627,0.664854882701222172,0.789306160350068176],"hpluv":[180.081412911690762,197.173954094180345,85.2434517572140749],"hsluv":[180.081412911690762,99.1570549081779546,85.2434517572140749]},"#11eeee":{"lch":[85.7246405502341275,67.2734484234975,192.17705063006116],"luv":[85.7246405502341275,-65.759826803247222,-14.1902093570146306],"rgb":[0.0666666666666666657,0.933333333333333348,0.933333333333333348],"xyz":[0.462353318878298392,0.674379754807692189,0.914716976418591399],"hpluv":[192.17705063006116,205.138082793863816,85.7246405502341275],"hsluv":[192.17705063006116,99.1914073274009098,85.7246405502341275]},"#11eeff":{"lch":[86.2482985645723517,70.4606934075819282,203.935071880927921],"luv":[86.2482985645723517,-64.401481656171029,-28.585983907627277],"rgb":[0.0666666666666666657,0.933333333333333348,1],"xyz":[0.488524367288129757,0.684848174171624913,1.05255116471037335],"hpluv":[203.935071880927921,224.026806300523,86.2482985645723517],"hsluv":[203.935071880927921,99.9999999999942304,86.2482985645723517]},"#11ff00":{"lch":[87.7931168603164,135.408535196841626,127.513270797457935],"luv":[87.7931168603164,-82.4563732780469,107.407718111808407],"rgb":[0.0666666666666666657,1,0],"xyz":[0.359895951315973628,0.716360603670241,0.119303136603937349],"hpluv":[127.513270797457935,491.310985978769054,87.7931168603164],"hsluv":[127.513270797457935,100.000000000002373,87.7931168603164]},"#11ff11":{"lch":[87.8126571401035108,134.634318462908169,127.715012949240432],"luv":[87.8126571401035108,-82.3604359259359313,106.50426424355777],"rgb":[0.0666666666666666657,1,0.0666666666666666657],"xyz":[0.360907616815610732,0.716765269870095922,0.124631241568692985],"hpluv":[127.715012949240432,489.364334505449051,87.8126571401035108],"hsluv":[127.715012949240432,99.999999999991914,87.8126571401035108]},"#11ff22":{"lch":[87.848860165327963,133.211117719966126,128.093229681784152],"luv":[87.848860165327963,-82.1836510367646,104.838205757586152],"rgb":[0.0666666666666666657,1,0.133333333333333331],"xyz":[0.362782974954087789,0.717515413125486723,0.134508127764672164],"hpluv":[128.093229681784152,485.7796458877379,87.848860165327963],"hsluv":[128.093229681784152,99.9999999999918572,87.848860165327963]},"#11ff33":{"lch":[87.9084130007832698,130.901693692038833,128.728166832562891],"luv":[87.9084130007832698,-81.8955348861488659,102.119414300885666],"rgb":[0.0666666666666666657,1,0.2],"xyz":[0.365870725686545495,0.71875051341846985,0.150770281622283314],"hpluv":[128.728166832562891,479.945632467831388,87.9084130007832698],"hsluv":[128.728166832562891,99.9999999999919567,87.9084130007832698]},"#11ff44":{"lch":[87.9942732352876,127.641489512823171,129.672386074694657],"luv":[87.9942732352876,-81.4859348177847806,98.2465891108891185],"rgb":[0.0666666666666666657,1,0.266666666666666663],"xyz":[0.37032872093076441,0.720533711516157416,0.174249056575169953],"hpluv":[129.672386074694657,471.674193406224788,87.9942732352876],"hsluv":[129.672386074694657,99.9999999999918856,87.9942732352876]},"#11ff55":{"lch":[88.1088871723243727,123.41738800901625,130.987994113812931],"luv":[88.1088871723243727,-80.9495722978130772,93.1612494966077662],"rgb":[0.0666666666666666657,1,0.333333333333333315],"xyz":[0.376291134970126395,0.722918677131902165,0.205651103849143868],"hpluv":[130.987994113812931,460.897243009671797,88.1088871723243727],"hsluv":[130.987994113812931,99.9999999999917,88.1088871723243727]},"#11ff66":{"lch":[88.2543278429396,118.268592142924746,132.753132104158254],"luv":[88.2543278429396,-80.2855559529031382,86.8429006471038],"rgb":[0.0666666666666666657,1,0.4],"xyz":[0.38387613074363458,0.725952675441305484,0.24559874825628783],"hpluv":[132.753132104158254,447.675525940365219,88.2543278429396],"hsluv":[132.753132104158254,99.9999999999916724,88.2543278429396]},"#11ff77":{"lch":[88.4323687925046613,112.290518027227137,135.069051083024959],"luv":[88.4323687925046613,-79.4970211443964558,79.3056370505300521],"rgb":[0.0666666666666666657,1,0.466666666666666674],"xyz":[0.393190143763836486,0.729678280649386335,0.294652550162685767],"hpluv":[135.069051083024959,432.222948715922314,88.4323687925046613],"hsluv":[135.069051083024959,99.999999999991644,88.4323687925046613]},"#11ff88":{"lch":[88.6445280109338825,105.641380676940045,138.068036362648229],"luv":[88.6445280109338825,-78.5907289650887577,70.5946076698930369],"rgb":[0.0666666666666666657,1,0.533333333333333326],"xyz":[0.404330560865780286,0.734134447490163877,0.353325413566257907],"hpluv":[138.068036362648229,414.95023459347243,88.6445280109338825],"hsluv":[138.068036362648229,99.9999999999915,88.6445280109338825]},"#11ff99":{"lch":[88.8920961876840465,98.552301258979881,141.921030988541872],"luv":[88.8920961876840465,-77.5765731609304225,60.7818342932124338],"rgb":[0.0666666666666666657,1,0.6],"xyz":[0.417387524974853,0.73935723313379309,0.422092091207375786],"hpluv":[141.921030988541872,396.537381185702543,88.8920961876840465],"hsluv":[141.921030988541872,99.9999999999913456,88.8920961876840465]},"#11ffaa":{"lch":[89.1761561490339147,91.3418654410923523,146.840553381528281],"luv":[89.1761561490339147,-76.4669946123218,49.9613362233014158],"rgb":[0.0666666666666666657,1,0.66666666666666663],"xyz":[0.432445217940105542,0.745380310319894157,0.501395940824374442],"hpluv":[146.840553381528281,378.048392077141443,89.1761561490339147],"hsluv":[146.840553381528281,99.9999999999913,89.1761561490339147]},"#11ffbb":{"lch":[89.4975971674113,84.4340589142561413,153.067388238784645],"luv":[89.4975971674113,-75.2763296710648859,38.2437510711127],"rgb":[0.0666666666666666657,1,0.733333333333333282],"xyz":[0.449582810047442216,0.752235347162828916,0.591653925923016133],"hpluv":[153.067388238784645,361.099415032935838,89.4975971674113],"hsluv":[153.067388238784645,99.9999999999909335,89.4975971674113]},"#11ffcc":{"lch":[89.8571262823018628,78.3714319324892159,160.817799258328876],"luv":[89.8571262823018628,-74.0201316086282901,25.7507564896672143],"rgb":[0.0666666666666666657,1,0.8],"xyz":[0.468875185491163915,0.759952297340317773,0.693260436593286289],"hpluv":[160.817799258328876,348.067615225706845,89.8571262823018628],"hsluv":[160.817799258328876,99.999999999991,89.8571262823018628]},"#11ffdd":{"lch":[90.2552779380141317,73.7997451229305,170.162013498752287],"luv":[90.2552779380141317,-72.7145076797264238,12.6096293801408788],"rgb":[0.0666666666666666657,1,0.866666666666666696],"xyz":[0.490393511041797514,0.768559627560571279,0.806590284493292287],"hpluv":[170.162013498752287,342.256686666565315,90.2552779380141317],"hsluv":[170.162013498752287,99.999999999990834,90.2552779380141317]},"#11ffee":{"lch":[90.6924227584195819,71.3832589696730793,180.844217403257659],"luv":[90.6924227584195819,-71.3755103944163665,-1.05174952720347981],"rgb":[0.0666666666666666657,1,0.933333333333333348],"xyz":[0.514205691307972224,0.778084499667041296,0.93200110056181551],"hpluv":[180.844217403257659,347.82122947809512,90.6924227584195819],"hsluv":[180.844217403257659,99.9999999999901803,90.6924227584195819]},"#11ffff":{"lch":[91.1687759776689859,71.6302608322469467,192.17705063006116],"luv":[91.1687759776689859,-70.0186129384549361,-15.1092061032524665],"rgb":[0.0666666666666666657,1,1],"xyz":[0.540376739717803645,0.788552919030974,1.06983528885359735],"hpluv":[192.17705063006116,369.258709956275879,91.1687759776689859],"hsluv":[192.17705063006116,99.9999999999898108,91.1687759776689859]},"#00aa00":{"lch":[60.5587499434736287,93.727653253516209,127.71501294924046],"luv":[60.5587499434736287,-57.3364240886418415,74.1445038903004559],"rgb":[0,0.66666666666666663,0],"xyz":[0.143740958848290495,0.287481917696585,0.0479136529494288144],"hpluv":[127.71501294924046,196.394882900214554,60.5587499434736287],"hsluv":[127.71501294924046,100.000000000002359,60.5587499434736287]},"#00aa11":{"lch":[60.5946550577951939,92.4075267438518182,128.220974416403209],"luv":[60.5946550577951939,-57.1721703645967665,72.5981675713458543],"rgb":[0,0.66666666666666663,0.0666666666666666657],"xyz":[0.144752624347927628,0.28788658389643984,0.0532417579141844441],"hpluv":[128.220974416403209,193.513984665985475,60.5946550577951939],"hsluv":[128.220974416403209,99.9999999999907772,60.5946550577951939]},"#00aa22":{"lch":[60.661124672570665,90.0113827545795715,129.185497299711983],"luv":[60.661124672570665,-56.8721735728637725,69.7682226983709199],"rgb":[0,0.66666666666666663,0.133333333333333331],"xyz":[0.146627982486404629,0.288636727151830641,0.0631186441101636436],"hpluv":[129.185497299711983,188.289586599726533,60.661124672570665],"hsluv":[129.185497299711983,99.9999999999908624,60.661124672570665]},"#00aa33":{"lch":[60.7703154938824355,86.2098857925288513,130.852037745481823],"luv":[60.7703154938824355,-56.3905639077229353,65.2092685937350751],"rgb":[0,0.66666666666666663,0.2],"xyz":[0.14971573321886239,0.289871827444813768,0.0793807979677747799],"hpluv":[130.852037745481823,180.013429236819462,60.7703154938824355],"hsluv":[130.852037745481823,99.9999999999908,60.7703154938824355]},"#00aa44":{"lch":[60.9274158721733841,81.0355822964375108,133.441426631804489],"luv":[60.9274158721733841,-55.7210928860807044,58.8381288426430444],"rgb":[0,0.66666666666666663,0.266666666666666663],"xyz":[0.15417372846308125,0.291655025542501334,0.102859572920661418],"hpluv":[133.441426631804489,168.77274926729055,60.9274158721733841],"hsluv":[133.441426631804489,99.9999999999908908,60.9274158721733841]},"#00aa55":{"lch":[61.1365343944832915,74.6960845180523592,137.272019015051796],"luv":[61.1365343944832915,-54.8704978500827636,50.6826746335676717],"rgb":[0,0.66666666666666663,0.333333333333333315],"xyz":[0.160136142502443235,0.294039991158246194,0.134261620194635334],"hpluv":[137.272019015051796,155.037353806827582,61.1365343944832915],"hsluv":[137.272019015051796,99.9999999999910614,61.1365343944832915]},"#00aa66":{"lch":[61.4009335299549264,67.6053275851037512,142.80970662058607],"luv":[61.4009335299549264,-53.8565898531593703,40.8649978254956139],"rgb":[0,0.66666666666666663,0.4],"xyz":[0.16772113827595142,0.297073989467649513,0.174209264601779296],"hpluv":[142.80970662058607,139.715720243970395,61.4009335299549264],"hsluv":[142.80970662058607,99.9999999999911893,61.4009335299549264]},"#00aa77":{"lch":[61.7231520087844814,60.4394033477847188,150.696962972825474],"luv":[61.7231520087844814,-52.7057786154446859,29.5807771631501382],"rgb":[0,0.66666666666666663,0.466666666666666674],"xyz":[0.177035151296153326,0.300799594675730309,0.223263066508177205],"hpluv":[150.696962972825474,124.254291935777843,61.7231520087844814],"hsluv":[150.696962972825474,99.9999999999911893,61.7231520087844814]},"#00aa88":{"lch":[62.1050795642419615,54.2095218153359397,161.640221068188367],"luv":[62.1050795642419615,-51.4501140589855126,17.0750700954568337],"rgb":[0,0.66666666666666663,0.533333333333333326],"xyz":[0.188175568398097182,0.305255761516507906,0.281935929911749372],"hpluv":[161.640221068188367,110.761232665855573,62.1050795642419615],"hsluv":[161.640221068188367,99.9999999999911466,62.1050795642419615]},"#00aa99":{"lch":[62.5480102999456307,50.2545412813378576,175.872445658321794],"luv":[62.5480102999456307,-50.1241952468173793,3.61717711159146882],"rgb":[0,0.66666666666666663,0.6],"xyz":[0.201232532507169881,0.310478547160137064,0.350702607552867307],"hpluv":[175.872445658321794,101.95326553071466,62.5480102999456307],"hsluv":[175.872445658321794,99.9999999999913314,62.5480102999456307]},"#00aaaa":{"lch":[63.0526871437625829,49.8847230087107931,192.17705063006116],"luv":[63.0526871437625829,-48.762339705407328,-10.5223484123201398],"rgb":[0,0.66666666666666663,0.66666666666666663],"xyz":[0.216290225472422437,0.316501624346238186,0.430006457169865852],"hpluv":[192.17705063006116,100.392967527320806,63.0526871437625829],"hsluv":[192.17705063006116,99.9999999999914451,63.0526871437625829]},"#00aabb":{"lch":[63.6193436646561565,53.6276681768737,207.895374658889665],"luv":[63.6193436646561565,-47.3963155750249143,-25.0901587081772526],"rgb":[0,0.66666666666666663,0.733333333333333282],"xyz":[0.233427817579759056,0.323356661189172945,0.520264442268507654],"hpluv":[207.895374658889665,106.964349821245364,63.6193436646561565],"hsluv":[207.895374658889665,99.9999999999916,63.6193436646561565]},"#00aacc":{"lch":[64.2477463386430259,60.9097449106327886,220.878520684721707],"luv":[64.2477463386430259,-46.0537892020538,-39.8628338833449],"rgb":[0,0.66666666666666663,0.8],"xyz":[0.25272019302348081,0.331073611366661746,0.62187095293877781],"hpluv":[220.878520684721707,120.300715116377788,64.2477463386430259],"hsluv":[220.878520684721707,99.9999999999916298,64.2477463386430259]},"#00aadd":{"lch":[64.9372385342214926,70.6418801813473465,230.685034316882962],"luv":[64.9372385342214926,-44.7574928469198525,-54.6538385624811625],"rgb":[0,0.66666666666666663,0.866666666666666696],"xyz":[0.274238518574114354,0.339680941586915253,0.735200800838783808],"hpluv":[230.685034316882962,138.04089297290011,64.9372385342214926],"hsluv":[230.685034316882962,99.9999999999918145,64.9372385342214926]},"#00aaee":{"lch":[65.6867863979168618,81.8478503674051,237.87423205753521],"luv":[65.6867863979168618,-43.5250094774703129,-69.3155405356638283],"rgb":[0,0.66666666666666663,0.933333333333333348],"xyz":[0.298050698840289119,0.34920581369338527,0.860611616907307],"hpluv":[237.87423205753521,158.11336767521891,65.6867863979168618],"hsluv":[237.87423205753521,99.999999999991843,65.6867863979168618]},"#00aaff":{"lch":[66.4950261675888,93.8462134827344,243.161780722675303],"luv":[66.4950261675888,-42.369016683119284,-83.7375555551541],"rgb":[0,0.66666666666666663,1],"xyz":[0.324221747250120484,0.359674233057318,0.998445805199088876],"hpluv":[243.161780722675303,179.088178632175044,66.4950261675888],"hsluv":[243.161780722675303,99.9999999999982805,66.4950261675888]},"#00bb00":{"lch":[66.1662429166961772,102.406451239047826,127.71501294924046],"luv":[66.1662429166961772,-62.6455428450044352,81.0099822060849135],"rgb":[0,0.733333333333333282,0],"xyz":[0.177695456756889275,0.355390913513783546,0.0592318189189614333],"hpluv":[127.71501294924046,196.39488290021464,66.1662429166961772],"hsluv":[127.71501294924046,100.000000000002373,66.1662429166961772]},"#00bb11":{"lch":[66.1974173108447559,101.237205455569821,128.123527834983577],"luv":[66.1974173108447559,-62.4996967519340956,79.6414444518024425],"rgb":[0,0.733333333333333282,0.0666666666666666657],"xyz":[0.178707122256526407,0.355795579713638399,0.064559923883717063],"hpluv":[128.123527834983577,194.061073356438868,66.1974173108447559],"hsluv":[128.123527834983577,99.9999999999909335,66.1974173108447559]},"#00bb22":{"lch":[66.2551438620851911,99.1062916374383747,128.898124119483072],"luv":[66.2551438620851911,-62.232564676438038,77.1308299962987718],"rgb":[0,0.733333333333333282,0.133333333333333331],"xyz":[0.180582480395003409,0.3565457229690292,0.0744368100796962556],"hpluv":[128.898124119483072,189.810813804630897,66.2551438620851911],"hsluv":[128.898124119483072,99.9999999999908624,66.2551438620851911]},"#00bb33":{"lch":[66.3500136661217255,95.7008075372637137,130.224174268563928],"luv":[66.3500136661217255,-61.8016571104716235,73.0698278476423155],"rgb":[0,0.733333333333333282,0.2],"xyz":[0.18367023112746117,0.357780823262012326,0.0906989639373074],"hpluv":[130.224174268563928,183.02647365261987,66.3500136661217255],"hsluv":[130.224174268563928,99.9999999999909335,66.3500136661217255]},"#00bb44":{"lch":[66.4865992404304,91.0092453899789859,132.255785626190885],"luv":[66.4865992404304,-61.1983980271068,67.3605138443080875],"rgb":[0,0.733333333333333282,0.266666666666666663],"xyz":[0.18812822637168003,0.359564021359699892,0.114177738890194044],"hpluv":[132.255785626190885,173.696361176634838,66.4865992404304],"hsluv":[132.255785626190885,99.9999999999909619,66.4865992404304]},"#00bb55":{"lch":[66.6685736373934219,85.1496193371524,135.204737263674588],"luv":[66.6685736373934219,-60.4246386982598,59.9943389949978751],"rgb":[0,0.733333333333333282,0.333333333333333315],"xyz":[0.194090640411042015,0.361948986975444753,0.145579786164167946],"hpluv":[135.204737263674588,162.069343805127659,66.6685736373934219],"hsluv":[135.204737263674588,99.9999999999909477,66.6685736373934219]},"#00bb66":{"lch":[66.8989180170192412,78.3861452968700689,139.371990675590268],"luv":[66.8989180170192412,-59.4914065933894,51.0407711152765629],"rgb":[0,0.733333333333333282,0.4],"xyz":[0.2016756361845502,0.364982985284848072,0.185527430571311908],"hpluv":[139.371990675590268,148.682392510907704,66.8989180170192412],"hsluv":[139.371990675590268,99.9999999999911182,66.8989180170192412]},"#00bb77":{"lch":[67.1800303821267448,71.1598447269708316,145.178146497089472],"luv":[67.1800303821267448,-58.4173559625633061,40.6341731047866617],"rgb":[0,0.733333333333333282,0.466666666666666674],"xyz":[0.210989649204752105,0.368708590492928867,0.234581232477709817],"hpluv":[145.178146497089472,134.410786503463328,67.1800303821267448],"hsluv":[145.178146497089472,99.9999999999910898,67.1800303821267448]},"#00bb88":{"lch":[67.5137905946342,64.1363411600919,153.159702568813543],"luv":[67.5137905946342,-57.2268359754185525,28.9578918715820954],"rgb":[0,0.733333333333333282,0.533333333333333326],"xyz":[0.222130066306695961,0.373164757333706465,0.293254095881282],"hpluv":[153.159702568813543,120.545503395456095,67.5137905946342],"hsluv":[153.159702568813543,99.9999999999911608,67.5137905946342]},"#00bb99":{"lch":[67.9016044714860811,58.2533417764790187,163.826150797364875],"luv":[67.9016044714860811,-55.9477282230567141,16.2266304205851419],"rgb":[0,0.733333333333333282,0.6],"xyz":[0.235187030415768661,0.378387542977335622,0.362020773522399919],"hpluv":[163.826150797364875,108.862958898475256,67.9016044714860811],"hsluv":[163.826150797364875,99.9999999999912461,67.9016044714860811]},"#00bbaa":{"lch":[68.3444379186728384,54.6744668749029543,177.202021912208522],"luv":[68.3444379186728384,-54.6092872876890922,2.66890801368250408],"rgb":[0,0.733333333333333282,0.66666666666666663],"xyz":[0.250244723381021217,0.384410620163436745,0.44132462313939852],"hpluv":[177.202021912208522,101.512776720033713,68.3444379186728384],"hsluv":[177.202021912208522,99.9999999999913598,68.3444379186728384]},"#00bbbb":{"lch":[68.8428468315880338,54.4656619866929645,192.177050630061132],"luv":[68.8428468315880338,-53.2402096652165113,-11.4886209116881091],"rgb":[0,0.733333333333333282,0.733333333333333282],"xyz":[0.267382315488357836,0.391265657006371503,0.531582608238040266],"hpluv":[192.177050630061132,100.392967527320806,68.8428468315880338],"hsluv":[192.177050630061132,99.9999999999914451,68.8428468315880338]},"#00bbcc":{"lch":[69.3970058395379397,58.0340346662075675,206.653495587531239],"luv":[69.3970058395379397,-51.8670935918889384,-26.0337047299998297],"rgb":[0,0.733333333333333282,0.8],"xyz":[0.28667469093207959,0.398982607183860305,0.633189118908310422],"hpluv":[206.653495587531239,106.116119046155191,69.3970058395379397],"hsluv":[206.653495587531239,99.9999999999915161,69.3970058395379397]},"#00bbdd":{"lch":[70.0067374807312461,64.9183055759271923,218.91244904401708],"luv":[70.0067374807312461,-50.5133677649133119,-40.7772740125682844],"rgb":[0,0.733333333333333282,0.866666666666666696],"xyz":[0.308193016482713134,0.407589937404113811,0.74651896680831642],"hpluv":[218.91244904401708,117.670246608059514,70.0067374807312461],"hsluv":[218.91244904401708,99.999999999991644,70.0067374807312461]},"#00bbee":{"lch":[70.6715424904064236,74.2108860535778,228.474155043258463],"luv":[70.6715424904064236,-49.1986871961444336,-55.5584807840624819],"rgb":[0,0.733333333333333282,0.933333333333333348],"xyz":[0.332005196748887843,0.417114809510583828,0.871929782876839643],"hpluv":[228.474155043258463,133.248513578578667,70.6715424904064236],"hsluv":[228.474155043258463,99.9999999999918288,70.6715424904064236]},"#00bbff":{"lch":[71.3906313155650167,85.0452269855302,235.688960914523477],"luv":[71.3906313155650167,-47.9387359102869155,-70.246481992653],"rgb":[0,0.733333333333333282,1],"xyz":[0.358176245158719264,0.427583228874516552,1.00976397116862149],"hpluv":[235.688960914523477,151.163886263776277,71.3906313155650167],"hsluv":[235.688960914523477,99.9999999999978,71.3906313155650167]},"#00cc00":{"lch":[71.6795694698327139,110.939506494120423,127.71501294924046],"luv":[71.6795694698327139,-67.8655057683618566,87.7601688009055181],"rgb":[0,0.8,0],"xyz":[0.215919200066506195,0.431838400133018441,0.0719730666888333814],"hpluv":[127.71501294924046,196.394882900214611,71.6795694698327139],"hsluv":[127.71501294924046,100.000000000002359,71.6795694698327139]},"#00cc11":{"lch":[71.7069484470386698,109.895339051400697,128.05073784188761],"luv":[71.7069484470386698,-67.7349868616780668,86.5387606802328548],"rgb":[0,0.8,0.0666666666666666657],"xyz":[0.216930865566143327,0.432243066332873294,0.0773011716535890181],"hpluv":[128.05073784188761,194.472124503698296,71.7069484470386698],"hsluv":[128.05073784188761,99.9999999999908766,71.7069484470386698]},"#00cc22":{"lch":[71.7576566073484,107.986601617430239,128.68476606632143],"luv":[71.7576566073484,-67.4954197535952289,84.2939763041676287],"rgb":[0,0.8,0.133333333333333331],"xyz":[0.218806223704620328,0.432993209588264094,0.0871780578495682107],"hpluv":[128.68476606632143,190.959361108477,71.7576566073484],"hsluv":[128.68476606632143,99.9999999999909193,71.7576566073484]},"#00cc33":{"lch":[71.8410194320707,104.91966800737103,129.762682813168567],"luv":[71.8410194320707,-67.1075822658835364,80.6517770244687853],"rgb":[0,0.8,0.2],"xyz":[0.22189397443707809,0.434228309881247221,0.103440211707179347],"hpluv":[129.762682813168567,185.320621425294917,71.8410194320707],"hsluv":[129.762682813168567,99.9999999999909761,71.8410194320707]},"#00cc44":{"lch":[71.9610975929873717,100.65733905537941,131.396818004218431],"luv":[71.9610975929873717,-66.561699323308261,75.5078809721416491],"rgb":[0,0.8,0.266666666666666663],"xyz":[0.226351969681296949,0.436011507978934787,0.126918986660065986],"hpluv":[131.396818004218431,177.495355343216744,71.9610975929873717],"hsluv":[131.396818004218431,99.9999999999909903,71.9610975929873717]},"#00cc55":{"lch":[72.1211872877728837,95.2615727691762828,133.734892870047815],"luv":[72.1211872877728837,-65.8564749898269639,68.8308938513177],"rgb":[0,0.8,0.333333333333333315],"xyz":[0.232314383720658935,0.438396473594679648,0.158321033934039901],"hpluv":[133.734892870047815,167.607792551030144,72.1211872877728837],"hsluv":[133.734892870047815,99.999999999991033,72.1211872877728837]},"#00cc66":{"lch":[72.3240060759138,88.9026050634798821,136.980115521422647],"luv":[72.3240060759138,-64.9982032665013207,60.6539921126355495],"rgb":[0,0.8,0.4],"xyz":[0.23989937949416712,0.441430471904082966,0.198268678341183863],"hpluv":[136.980115521422647,155.980870440536961,72.3240060759138],"hsluv":[136.980115521422647,99.9999999999910614,72.3240060759138]},"#00cc77":{"lch":[72.5717906268391459,81.8763194870781206,141.413175407098493],"luv":[72.5717906268391459,-63.9997644777707464,51.066249515114805],"rgb":[0,0.8,0.466666666666666674],"xyz":[0.249213392514369025,0.445156077112163762,0.247322480247581772],"hpluv":[141.413175407098493,143.162673336571032,72.5717906268391459],"hsluv":[141.413175407098493,99.9999999999910756,72.5717906268391459]},"#00cc88":{"lch":[72.8663546950801,74.6325704710961162,147.40707881161012],"luv":[72.8663546950801,-62.8793552775828672,40.2020802322297683],"rgb":[0,0.8,0.533333333333333326],"xyz":[0.260353809616312881,0.449612243952941359,0.305995343651153939],"hpluv":[147.40707881161012,129.969270924532168,72.8663546950801],"hsluv":[147.40707881161012,99.9999999999911608,72.8663546950801]},"#00cc99":{"lch":[73.2091273059676695,67.813783770663278,155.40051707617576],"luv":[73.2091273059676695,-61.6589956558222809,28.2290191825639418],"rgb":[0,0.8,0.6],"xyz":[0.273410773725385581,0.454835029596570517,0.374762021292271874],"hpluv":[155.40051707617576,117.541728748843539,73.2091273059676695],"hsluv":[155.40051707617576,99.9999999999911893,73.2091273059676695]},"#00ccaa":{"lch":[73.6011808048110368,62.2803364521242102,165.745935171574274],"luv":[73.6011808048110368,-60.3629393869259374,15.3347923742089414],"rgb":[0,0.8,0.66666666666666663],"xyz":[0.288468466690638137,0.460858106782671639,0.454065870909270419],"hpluv":[165.745935171574274,107.375573062224,73.6011808048110368],"hsluv":[165.745935171574274,99.9999999999912887,73.6011808048110368]},"#00ccbb":{"lch":[74.043253901593,59.041045922693165,178.335616576813749],"luv":[74.043253901593,-59.0161369965186395,1.7148404163965667],"rgb":[0,0.8,0.733333333333333282],"xyz":[0.305606058797974756,0.467713143625606398,0.544323856007912221],"hpluv":[178.335616576813749,101.183074845522739,74.043253901593],"hsluv":[178.335616576813749,99.9999999999913882,74.043253901593]},"#00cccc":{"lch":[74.5357725840108714,58.9696734274942429,192.177050630061132],"luv":[74.5357725840108714,-57.64288292201784,-12.4386668330598962],"rgb":[0,0.8,0.8],"xyz":[0.32489843424169651,0.4754300938030952,0.645930366678182377],"hpluv":[192.177050630061132,100.392967527320835,74.5357725840108714],"hsluv":[192.177050630061132,99.9999999999914877,74.5357725840108714]},"#00ccdd":{"lch":[75.0788705190671,62.3850861111967063,205.58971515357635],"luv":[75.0788705190671,-56.2657375800620656,-26.9456071312750254],"rgb":[0,0.8,0.866666666666666696],"xyz":[0.346416759792330053,0.484037424023348706,0.759260214578188375],"hpluv":[205.58971515357635,105.439266222061761,75.0788705190671],"hsluv":[205.58971515357635,99.9999999999915588,75.0788705190671]},"#00ccee":{"lch":[75.672409810316779,68.9113069897593,217.179575991302841],"luv":[75.672409810316779,-54.9047659259632326,-41.6441461630807765],"rgb":[0,0.8,0.933333333333333348],"xyz":[0.370228940058504818,0.493562296129818723,0.884671030646711598],"hpluv":[217.179575991302841,115.555933163518176,75.672409810316779],"hsluv":[217.179575991302841,99.9999999999916,75.672409810316779]},"#00ccff":{"lch":[76.3160024985922263,77.7871508482342193,226.46755023570978],"luv":[76.3160024985922263,-53.5770891110031471,-56.3944710009551713],"rgb":[0,0.8,1],"xyz":[0.396399988468336184,0.504030715493751447,1.02250521893849333],"hpluv":[226.46755023570978,131.600547876461974,76.3160024985922263],"hsluv":[226.46755023570978,99.9999999999969731,76.3160024985922263]},"#00dd00":{"lch":[77.1074905447145369,119.34037845513086,127.715012949240503],"luv":[77.1074905447145369,-73.004607631587163,94.4057900468603],"rgb":[0,0.866666666666666696,0],"xyz":[0.258553190613681372,0.51710638122737,0.0861843968712247],"hpluv":[127.715012949240503,210.385995725156505,77.1074905447145369],"hsluv":[127.715012949240503,100.000000000002203,77.1074905447145369]},"#00dd11":{"lch":[77.1317715771024268,118.40111864948102,127.995077421524911],"luv":[77.1317715771024268,-72.8869911141770359,93.3076171797906255],"rgb":[0,0.866666666666666696,0.0666666666666666657],"xyz":[0.259564856113318476,0.517511047427224868,0.0915125018359803366],"hpluv":[127.995077421524911,208.997725019578468,77.1317715771024268],"hsluv":[127.995077421524911,99.9999999999909193,77.1317715771024268]},"#00dd22":{"lch":[77.1767486793617081,116.680170458435171,128.522366120948305],"luv":[77.1767486793617081,-72.6707542705971434,91.2864921658838568],"rgb":[0,0.866666666666666696,0.133333333333333331],"xyz":[0.261440214251795533,0.518261190682615669,0.101389388031959529],"hpluv":[128.522366120948305,206.449864525990506,77.1767486793617081],"hsluv":[128.522366120948305,99.9999999999909335,77.1767486793617081]},"#00dd33":{"lch":[77.2507083817471312,113.903613467858165,129.414072915332611],"luv":[77.2507083817471312,-72.3197155087496668,87.9993858488157485],"rgb":[0,0.866666666666666696,0.2],"xyz":[0.264527964984253239,0.519496290975598796,0.117651541889570666],"hpluv":[129.414072915332611,202.327676795977681,77.2507083817471312],"hsluv":[129.414072915332611,99.9999999999909335,77.2507083817471312]},"#00dd44":{"lch":[77.3572825066044,110.019432359123073,130.755032484191332],"luv":[77.3572825066044,-71.8235777962907633,83.3405613681826907],"rgb":[0,0.866666666666666696,0.266666666666666663],"xyz":[0.268985960228472154,0.521279489073286362,0.141130316842457304],"hpluv":[130.755032484191332,196.537344059934071,77.3572825066044],"hsluv":[130.755032484191332,99.9999999999909193,77.3572825066044]},"#00dd55":{"lch":[77.499442461574418,105.05363654061,132.652443872197409],"luv":[77.499442461574418,-71.1790335676869717,77.2645567564888],"rgb":[0,0.866666666666666696,0.333333333333333315],"xyz":[0.274948374267834139,0.523664454689031111,0.172532364116431219],"hpluv":[132.652443872197409,189.094972829508237,77.499442461574418],"hsluv":[132.652443872197409,99.9999999999909477,77.499442461574418]},"#00dd66":{"lch":[77.6796666807438,99.1151742217995,135.249123061333165],"luv":[77.6796666807438,-70.3890792332532413,69.7796194150732276],"rgb":[0,0.866666666666666696,0.4],"xyz":[0.282533370041342324,0.52669845299843443,0.212480008523575181],"hpluv":[135.249123061333165,180.139247328423863,77.6796666807438],"hsluv":[135.249123061333165,99.9999999999909903,77.6796666807438]},"#00dd77":{"lch":[77.9000291762011301,92.4061998396230138,138.73841210181584],"luv":[77.9000291762011301,-69.4623356452591878,60.9416909472136155],"rgb":[0,0.866666666666666696,0.466666666666666674],"xyz":[0.29184738306154423,0.530424058206515281,0.26153381042997309],"hpluv":[138.73841210181584,169.957910917592017,77.9000291762011301],"hsluv":[138.73841210181584,99.9999999999910187,77.9000291762011301]},"#00dd88":{"lch":[78.1622519856154,85.2389230174627386,143.3784757437721],"luv":[78.1622519856154,-68.4122000424903,50.8472701580255091],"rgb":[0,0.866666666666666696,0.533333333333333326],"xyz":[0.30298780016348803,0.534880225047292823,0.320206673833545286],"hpluv":[143.3784757437721,159.033158409305884,78.1622519856154],"hsluv":[143.3784757437721,99.9999999999911608,78.1622519856154]},"#00dd99":{"lch":[78.4677391993035798,78.0607504013048583,149.494791226300919],"luv":[78.4677391993035798,-67.2558167964087801,39.6249398770864545],"rgb":[0,0.866666666666666696,0.6],"xyz":[0.316044764272560785,0.540103010690922,0.388973351474663165],"hpluv":[149.494791226300919,148.113090063328627,78.4677391993035798],"hsluv":[149.494791226300919,99.9999999999911466,78.4677391993035798]},"#00ddaa":{"lch":[78.8176011215583401,71.4835041270533225,157.438879868811341],"luv":[78.8176011215583401,-66.0129273361177,27.4259874352573583],"rgb":[0,0.866666666666666696,0.66666666666666663],"xyz":[0.331102457237813286,0.546126087877023103,0.468277201091661766],"hpluv":[157.438879868811341,138.307036304413771,78.8176011215583401],"hsluv":[157.438879868811341,99.9999999999912319,78.8176011215583401]},"#00ddbb":{"lch":[79.21267314937,66.2909050184163675,167.440816272526462],"luv":[79.21267314937,-64.7046905962200896,14.4148223370296193],"rgb":[0,0.866666666666666696,0.733333333333333282],"xyz":[0.34824004934514996,0.552981124719957862,0.558535186190303512],"hpluv":[167.440816272526462,131.160951364069831,79.21267314937],"hsluv":[167.440816272526462,99.9999999999912319,79.21267314937]},"#00ddcc":{"lch":[79.6535319864315738,63.3571261830985,179.312753048293331],"luv":[79.6535319864315738,-63.3525685364998381,0.759932897798095253],"rgb":[0,0.866666666666666696,0.8],"xyz":[0.367532424788871714,0.560698074897446719,0.660141696860573668],"hpluv":[179.312753048293331,128.577362979680402,79.6535319864315738],"hsluv":[179.312753048293331,99.9999999999913314,79.6535319864315738]},"#00dddd":{"lch":[80.1405107346531338,63.4039144225475795,192.177050630061245],"luv":[80.1405107346531338,-61.9773555359817649,-13.3739958452306631],"rgb":[0,0.866666666666666696,0.866666666666666696],"xyz":[0.389050750339505202,0.569305405117700225,0.773471544760579666],"hpluv":[192.177050630061245,132.399857962191078,80.1405107346531338],"hsluv":[192.177050630061245,99.9999999999915,80.1405107346531338]},"#00ddee":{"lch":[80.6737137665329,66.6843941199945078,204.668960845135786],"luv":[80.6737137665329,-60.59840405426975,-27.8323884211582282],"rgb":[0,0.866666666666666696,0.933333333333333348],"xyz":[0.412862930605679967,0.578830277224170242,0.898882360829102889],"hpluv":[204.668960845135786,143.769811077134563,80.6737137665329],"hsluv":[204.668960845135786,99.9999999999914735,80.6737137665329]},"#00ddff":{"lch":[81.2530318771427,72.8883394631876627,215.643856178856652],"luv":[81.2530318771427,-59.2330695533496296,-42.475328144570291],"rgb":[0,0.866666666666666696,1],"xyz":[0.439033979015511333,0.589298696588103,1.03671654912088473],"hpluv":[215.643856178856652,162.831862460855405,81.2530318771427],"hsluv":[215.643856178856652,99.9999999999960636,81.2530318771427]},"#00ee00":{"lch":[82.4573791946470749,127.620478503329409,127.715012949240503],"luv":[82.4573791946470749,-78.0698291684561241,100.955873068518613],"rgb":[0,0.933333333333333348,0],"xyz":[0.305731966954196188,0.611463933908400925,0.101910655651395884],"hpluv":[127.715012949240503,307.908475174189959,82.4573791946470749],"hsluv":[127.715012949240503,100.000000000002217,82.4573791946470749]},"#00ee11":{"lch":[82.4790940690076582,126.770138643430457,127.951660682688043],"luv":[82.4790940690076582,-77.963182339567652,99.9620440525398],"rgb":[0,0.933333333333333348,0.0666666666666666657],"xyz":[0.306743632453833293,0.611868600108255833,0.107238760616151521],"hpluv":[127.951660682688043,306.293921948395678,82.4790940690076582],"hsluv":[127.951660682688043,99.9999999999909193,82.4790940690076582]},"#00ee22":{"lch":[82.5193223464761729,125.209295581045268,128.396138884075839],"luv":[82.5193223464761729,-77.7668632323815814,98.1309466116455],"rgb":[0,0.933333333333333348,0.133333333333333331],"xyz":[0.308618990592310349,0.612618743363646634,0.117115646812130714],"hpluv":[128.396138884075839,303.325246698320768,82.5193223464761729],"hsluv":[128.396138884075839,99.9999999999907914,82.5193223464761729]},"#00ee33":{"lch":[82.5854861516441616,122.683025615083068,129.144698003447559],"luv":[82.5854861516441616,-77.4474668310457304,95.1473313105795881],"rgb":[0,0.933333333333333348,0.2],"xyz":[0.311706741324768055,0.613853843656629761,0.133377800669741864],"hpluv":[129.144698003447559,298.506449004286878,82.5854861516441616],"hsluv":[129.144698003447559,99.9999999999910187,82.5854861516441616]},"#00ee44":{"lch":[82.680854944152216,119.131104912681948,130.263308305441626],"luv":[82.680854944152216,-76.994580956063885,90.9068460629701889],"rgb":[0,0.933333333333333348,0.266666666666666663],"xyz":[0.31616473656898697,0.615637041754317327,0.156856575622628502],"hpluv":[130.263308305441626,291.702339981024693,82.680854944152216],"hsluv":[130.263308305441626,99.9999999999908624,82.680854944152216]},"#00ee55":{"lch":[82.8081199656530913,114.556122924925475,131.832385242542614],"luv":[82.8081199656530913,-76.4036333062175572,85.3556683366704192],"rgb":[0,0.933333333333333348,0.333333333333333315],"xyz":[0.322127150608348956,0.618022007370062076,0.18825862289660239],"hpluv":[131.832385242542614,282.889526663711365,82.8081199656530913],"hsluv":[131.832385242542614,99.9999999999908908,82.8081199656530913]},"#00ee66":{"lch":[82.9695459516691756,109.025909834785097,133.955863991345211],"luv":[82.9695459516691756,-75.6753248662734137,78.4849936082476347],"rgb":[0,0.933333333333333348,0.4],"xyz":[0.329712146381857141,0.621056005679465395,0.22820626730374638],"hpluv":[133.955863991345211,272.166364406401044,82.9695459516691756],"hsluv":[133.955863991345211,99.9999999999909193,82.9695459516691756]},"#00ee77":{"lch":[83.167051813506589,102.679799146220446,136.771308753659213],"luv":[83.167051813506589,-74.8151450958190338,70.3266323450776127],"rgb":[0,0.933333333333333348,0.466666666666666674],"xyz":[0.339026159402059046,0.624781610887546246,0.277260069210144289],"hpluv":[136.771308753659213,259.776444306911685,83.167051813506589],"hsluv":[136.771308753659213,99.9999999999910898,83.167051813506589]},"#00ee88":{"lch":[83.4022585136551839,95.7389522528198427,140.46074817536558],"luv":[83.4022585136551839,-73.8327925713246742,60.9480575538504],"rgb":[0,0.933333333333333348,0.533333333333333326],"xyz":[0.350166576504002847,0.629237777728323788,0.335932932613716428],"hpluv":[140.46074817536558,246.149488794882956,83.4022585136551839],"hsluv":[140.46074817536558,99.999999999991033,83.4022585136551839]},"#00ee99":{"lch":[83.6765199188301096,88.5221307628359142,145.258543938418427],"luv":[83.6765199188301096,-72.7414610621927,50.4464813176313],"rgb":[0,0.933333333333333348,0.6],"xyz":[0.363223540613075602,0.634460563371953,0.404699610254834363],"hpluv":[145.258543938418427,231.96752956627526,83.6765199188301096],"hsluv":[145.258543938418427,99.9999999999911,83.6765199188301096]},"#00eeaa":{"lch":[83.9909442670452364,81.4671227341597159,151.444498676017645],"luv":[83.9909442670452364,-71.557012704351564,38.9420854527837363],"rgb":[0,0.933333333333333348,0.66666666666666663],"xyz":[0.378281233578328102,0.640483640558054068,0.484003459871832964],"hpluv":[151.444498676017645,218.263507316576721,83.9909442670452364],"hsluv":[151.444498676017645,99.9999999999911893,83.9909442670452364]},"#00eebb":{"lch":[84.3464103530465366,75.1511025294100392,159.294479220170871],"luv":[84.3464103530465366,-70.2970903476626319,26.5707978811035801],"rgb":[0,0.933333333333333348,0.733333333333333282],"xyz":[0.395418825685664777,0.647338677400988827,0.57426144497047471],"hpluv":[159.294479220170871,206.543608310772072,84.3464103530465366],"hsluv":[159.294479220170871,99.9999999999912,84.3464103530465366]},"#00eecc":{"lch":[84.743580800257746,70.2844566194431195,168.945018717488722],"luv":[84.743580800257746,-68.9802322625990456,13.4771064879770393],"rgb":[0,0.933333333333333348,0.8],"xyz":[0.414711201129386531,0.655055627578477684,0.675867955640744866],"hpluv":[168.945018717488722,198.871854707918374,84.743580800257746],"hsluv":[168.945018717488722,99.9999999999913,84.743580800257746]},"#00eedd":{"lch":[85.1829138464002114,67.6253239558150625,180.163192871920216],"luv":[85.1829138464002114,-67.6250496492668418,-0.192613766721418916],"rgb":[0,0.933333333333333348,0.866666666666666696],"xyz":[0.43622952668002,0.66366295779873119,0.789197803540750864],"hpluv":[180.163192871920216,197.760624486431198,85.1829138464002114],"hsluv":[180.163192871920216,99.9999999999913882,85.1829138464002114]},"#00eeee":{"lch":[85.6646745174910507,67.7744082531008303,192.177050630061217],"luv":[85.6646745174910507,-66.2495152673009358,-14.2958784586901881],"rgb":[0,0.933333333333333348,0.933333333333333348],"xyz":[0.460041706946194784,0.673187829905201207,0.914608619609274087],"hpluv":[192.177050630061217,205.696714727687493,85.6646745174910507],"hsluv":[192.177050630061217,99.9999999999914309,85.6646745174910507]},"#00eeff":{"lch":[86.1889457184888,70.9350767712842867,203.864647638418489],"luv":[86.1889457184888,-64.8703943995767247,-28.6987290135183635],"rgb":[0,0.933333333333333348,1],"xyz":[0.486212755356026149,0.683656249269133931,1.05244280790105593],"hpluv":[203.864647638418489,224.453619733699583,86.1889457184888],"hsluv":[203.864647638418489,99.9999999999939888,86.1889457184888]},"#00ff00":{"lch":[87.7355191096597338,135.789531996666284,127.715012949240474],"luv":[87.7355191096597338,-83.0671197143942663,107.418111239344327],"rgb":[0,1,0],"xyz":[0.35758433938387,0.71516867876775,0.11919477979462],"hpluv":[127.715012949240474,490.145375063702204,87.7355191096597338],"hsluv":[127.715012949240474,100.000000000002217,87.7355191096597338]},"#00ff11":{"lch":[87.7550810882892165,135.01527678270574,127.917210072153054],"luv":[87.7550810882892165,-82.9698837721702915,106.513489059100834],"rgb":[0,1,0.0666666666666666657],"xyz":[0.358596004883507125,0.715573344967604941,0.124522884759375632],"hpluv":[127.917210072153054,488.208403570135204,87.7550810882892165],"hsluv":[127.917210072153054,99.9999999999917719,87.7550810882892165]},"#00ff22":{"lch":[87.7913242833811864,133.592052176160422,128.296258949772664],"luv":[87.7913242833811864,-82.7907071985999892,104.845291769319132],"rgb":[0,1,0.133333333333333331],"xyz":[0.360471363021984181,0.716323488222995741,0.134399770955354825],"hpluv":[128.296258949772664,484.641757887342919,87.7913242833811864],"hsluv":[128.296258949772664,99.9999999999919,87.7913242833811864]},"#00ff33":{"lch":[87.850943105558116,131.282721750620482,128.932531697131338],"luv":[87.850943105558116,-82.4986966230128616,102.123053644879462],"rgb":[0,1,0.2],"xyz":[0.363559113754441887,0.717558588515978868,0.150661924812965975],"hpluv":[128.932531697131338,478.837727878060548,87.850943105558116],"hsluv":[128.932531697131338,99.999999999991843,87.850943105558116]},"#00ff44":{"lch":[87.9368982766027756,128.022939247233296,129.878593634905172],"luv":[87.9368982766027756,-82.0835673214571528,98.245411848516369],"rgb":[0,1,0.266666666666666663],"xyz":[0.368017108998660802,0.719341786613666434,0.174140699765852613],"hpluv":[129.878593634905172,470.610169071279643,87.9368982766027756],"hsluv":[129.878593634905172,99.9999999999916724,87.9368982766027756]},"#00ff55":{"lch":[88.0516385770734189,123.799916713223595,131.196479790431113],"luv":[88.0516385770734189,-81.5399771501718362,93.1539129857171133],"rgb":[0,1,0.333333333333333315],"xyz":[0.373979523038022788,0.721726752229411184,0.205542747039826501],"hpluv":[131.196479790431113,459.892953467552729,88.0516385770734189],"hsluv":[131.196479790431113,99.9999999999917719,88.0516385770734189]},"#00ff66":{"lch":[88.197238997611,118.653311588493224,132.964137709394919],"luv":[88.197238997611,-80.8670327043222557,86.8281715373192498],"rgb":[0,1,0.4],"xyz":[0.381564518811531,0.724760750538814502,0.245490391446970491],"hpluv":[132.964137709394919,446.748834194207859,88.197238997611],"hsluv":[132.964137709394919,99.9999999999917719,88.197238997611]},"#00ff77":{"lch":[88.3754745956423164,112.679107800887323,135.2824164931273],"luv":[88.3754745956423164,-80.0679233099649537,79.2824633297525452],"rgb":[0,1,0.466666666666666674],"xyz":[0.390878531831732878,0.728486355746895353,0.2945441933533684],"hpluv":[135.2824164931273,431.3936933951166,88.3754745956423164],"hsluv":[135.2824164931273,99.9999999999915445,88.3754745956423164]},"#00ff88":{"lch":[88.587864465470858,106.036155512425779,138.2828406903445],"luv":[88.587864465470858,-79.1495135423216425,70.5621767086956311],"rgb":[0,1,0.533333333333333326],"xyz":[0.402018948933676679,0.732942522587672896,0.353217056756940539],"hpluv":[138.2828406903445,414.239888157084465,88.587864465470858],"hsluv":[138.2828406903445,99.9999999999914,88.587864465470858]},"#00ff99":{"lch":[88.8357000190422,98.9561663203651278,142.1349886621461],"luv":[88.8357000190422,-78.1218422027535695,60.739613298668921],"rgb":[0,1,0.6],"xyz":[0.415075913042749378,0.738165308231302109,0.421983734398058474],"hpluv":[142.1349886621461,395.967958147281365,88.8357000190422],"hsluv":[142.1349886621461,99.9999999999915303,88.8357000190422]},"#00ffaa":{"lch":[89.1200644426462674,91.7580340339716258,147.049061977519528],"luv":[89.1200644426462674,-76.997527549554917,49.9090929694682828],"rgb":[0,1,0.66666666666666663],"xyz":[0.430133606008001934,0.744188385417403175,0.501287584015057],"hpluv":[147.049061977519528,377.639750156066668,89.1200644426462674],"hsluv":[147.049061977519528,99.9999999999913,89.1200644426462674]},"#00ffbb":{"lch":[89.4418470234824241,84.8653215767476468,153.262243037154207],"luv":[89.4418470234824241,-75.791105608661141,38.1815546689964407],"rgb":[0,1,0.733333333333333282],"xyz":[0.447271198115338608,0.751043422260337934,0.591545569113698821],"hpluv":[153.262243037154207,360.863433446149145,89.4418470234824241],"hsluv":[153.262243037154207,99.9999999999912,89.4418470234824241]},"#00ffcc":{"lch":[89.801754487955634,78.8187300060100569,160.986090443114392],"luv":[89.801754487955634,-74.5183415032407197,25.6789598575702236],"rgb":[0,1,0.8],"xyz":[0.466563573559060307,0.758760372437826791,0.693152079783969],"hpluv":[160.986090443114392,347.997153451554084,89.801754487955634],"hsluv":[160.986090443114392,99.9999999999912461,89.801754487955634]},"#00ffdd":{"lch":[90.2003206582774339,74.260092310928,170.286849800478649],"luv":[90.2003206582774339,-73.1955569867131572,12.5288366352336915],"rgb":[0,1,0.866666666666666696],"xyz":[0.488081899109693906,0.767367702658080297,0.806481927683975],"hpluv":[170.286849800478649,342.308208972166483,90.2003206582774339],"hsluv":[170.286849800478649,99.9999999999913314,90.2003206582774339]},"#00ffee":{"lch":[90.6379152481429458,71.8480695265374294,180.909719109957],"luv":[90.6379152481429458,-71.8390133400929898,-1.14072652818200426],"rgb":[0,1,0.933333333333333348],"xyz":[0.511894079375868616,0.776892574764550314,0.931892743752498198],"hpluv":[180.909719109957,347.895283980605143,90.6379152481429458],"hsluv":[180.909719109957,99.999999999991374,90.6379152481429458]},"#00ffff":{"lch":[91.114752316705065,72.0862882649682,192.17705063006116],"luv":[91.114752316705065,-70.4643799638718207,-15.205397466925735],"rgb":[0,1,1],"xyz":[0.5380651277857,0.787360994128483,1.06972693204428],"hpluv":[192.17705063006116,369.190533917051368,91.114752316705065],"hsluv":[192.17705063006116,99.9999999999914877,91.114752316705065]},"#ff0000":{"lch":[53.23711559542933,179.038096923620287,12.1770506300617765],"luv":[53.23711559542933,175.009822162883836,37.7650936255616],"rgb":[1,0,0],"xyz":[0.41239079926595,0.21263900587151,0.019330818715591],"hpluv":[12.1770506300617765,426.746789183125202,53.23711559542933],"hsluv":[12.1770506300617765,100.000000000002203,53.23711559542933]},"#ff0011":{"lch":[53.2810087118185294,177.689248384364731,11.7592124156573554],"luv":[53.2810087118185294,173.960033822228979,36.2129206771479346],"rgb":[1,0,0.0666666666666666657],"xyz":[0.413402464765587119,0.213043672071364848,0.0246589236803466325],"hpluv":[11.7592124156573554,423.182830024727082,53.2810087118185294],"hsluv":[11.7592124156573554,99.9999999999986073,53.2810087118185294]},"#ff0022":{"lch":[53.362228057366309,175.255817292919801,10.9800713678561319],"luv":[53.362228057366309,172.047495148921342,33.3805468497921751],"rgb":[1,0,0.133333333333333331],"xyz":[0.415277822904064176,0.213793815326755676,0.0345358098763258251],"hpluv":[10.9800713678561319,416.75211680728853,53.362228057366309],"hsluv":[10.9800713678561319,99.9999999999986215,53.362228057366309]},"#ff0033":{"lch":[53.4955416476677499,171.43316235878109,9.68478250033725],"luv":[53.4955416476677499,168.989928530586468,28.8397852204116347],"rgb":[1,0,0.2],"xyz":[0.418365573636521881,0.215028915619738775,0.0507979637339369683],"hpluv":[9.68478250033725,406.646064741178918,53.4955416476677499],"hsluv":[9.68478250033725,99.9999999999986215,53.4955416476677499]},"#ff0044":{"lch":[53.6871179383659722,166.29954793496961,7.78930386328567259],"luv":[53.6871179383659722,164.765128442936401,22.5386799204815809],"rgb":[1,0,0.266666666666666663],"xyz":[0.422823568880740797,0.216812113717426369,0.0742767386868236],"hpluv":[7.78930386328567259,393.061316669856922,53.6871179383659722],"hsluv":[7.78930386328567259,99.9999999999987637,53.6871179383659722]},"#ff0055":{"lch":[53.9417095924386558,160.100368719231,5.2128969892355661],"luv":[53.9417095924386558,159.438189183864722,14.5461986032050437],"rgb":[1,0,0.333333333333333315],"xyz":[0.428785982920102782,0.219197079333171202,0.105678785960797522],"hpluv":[5.2128969892355661,376.623098544524225,53.9417095924386558],"hsluv":[5.2128969892355661,99.9999999999988,53.9417095924386558]},"#ff0066":{"lch":[54.2629295430466669,153.227313284557312,1.88082466234467849],"luv":[54.2629295430466669,153.144763004983872,5.02902580538230204],"rgb":[1,0,0.4],"xyz":[0.436370978693610967,0.222231077642574493,0.145626430367941484],"hpluv":[1.88082466234467849,358.321012364802243,54.2629295430466669],"hsluv":[1.88082466234467849,99.99999999999892,54.2629295430466669]},"#ff0077":{"lch":[54.6533978532017244,146.184101175375929,357.735148851436577],"luv":[54.6533978532017244,146.06990602550718,-5.77702260269427281],"rgb":[1,0,0.466666666666666674],"xyz":[0.445684991713812872,0.225956682850655316,0.194680232274339393],"hpluv":[357.735148851436577,339.408176675868503,54.6533978532017244],"hsluv":[357.735148851436577,99.9999999999990479,54.6533978532017244]},"#ff0088":{"lch":[55.1148373309560782,139.538803635294983,352.754628092234327],"luv":[55.1148373309560782,138.424605854630585,-17.5984719211521572],"rgb":[1,0,0.533333333333333326],"xyz":[0.456825408815756673,0.230412849691432914,0.253353095677911533],"hpluv":[352.754628092234327,321.26675874055752,55.1148373309560782],"hsluv":[352.754628092234327,99.9999999999991616,55.1148373309560782]},"#ff0099":{"lch":[55.6481496721619493,133.863929319774144,346.981903482220218],"luv":[55.6481496721619493,130.423488026195145,-30.1540269949209758],"rgb":[1,0,0.6],"xyz":[0.469882372924829372,0.235635635335062071,0.322119773319029468],"hpluv":[346.981903482220218,305.247535929832054,55.6481496721619493],"hsluv":[346.981903482220218,99.9999999999993463,55.6481496721619493]},"#ff00aa":{"lch":[56.2534865150640258,129.667114810270476,340.549180922221581],"luv":[56.2534865150640258,122.266710865918853,-43.1788383036143273],"rgb":[1,0,0.66666666666666663],"xyz":[0.484940065890081928,0.241658712521163166,0.401423622936028068],"hpluv":[340.549180922221581,292.495864077812769,56.2534865150640258],"hsluv":[340.549180922221581,99.9999999999994742,56.2534865150640258]},"#ff00bb":{"lch":[56.9303217870161689,127.321325924901956,333.685619315648239],"luv":[56.9303217870161689,114.127678427447606,-56.4410582115202928],"rgb":[1,0,0.733333333333333282],"xyz":[0.502077657997418547,0.248513749364097924,0.491681608034669815],"hpluv":[333.685619315648239,283.789838362024682,56.9303217870161689],"hsluv":[333.685619315648239,99.9999999999995879,56.9303217870161689]},"#ff00cc":{"lch":[57.6775275187384153,127.012826563172382,326.690520651062286],"luv":[57.6775275187384153,106.146716951325558,-69.7505024499586312],"rgb":[1,0,0.8],"xyz":[0.521370033441140301,0.256230699541586726,0.593288118704939915],"hpluv":[326.690520651062286,279.434659423159303,57.6775275187384153],"hsluv":[326.690520651062286,99.9999999999997726,57.6775275187384153]},"#ff00dd":{"lch":[58.4934529509690151,128.727977043064641,319.874434183361473],"luv":[58.4934529509690151,98.4297766537384149,-82.9606602040687],"rgb":[1,0,0.866666666666666696],"xyz":[0.542888358991773901,0.264838029761840288,0.706617966604945913],"hpluv":[319.874434183361473,279.257606739571429,58.4934529509690151],"hsluv":[319.874434183361473,99.9999999999999716,58.4934529509690151]},"#ff00ee":{"lch":[59.3760054748790367,132.286429048213932,313.494468670954461],"luv":[59.3760054748790367,91.0507046157626,-95.9659757377649214],"rgb":[1,0,0.933333333333333348],"xyz":[0.56670053925794861,0.274362901868310305,0.832028782673469136],"hpluv":[313.494468670954461,282.711609251625362,59.3760054748790367],"hsluv":[313.494468670954461,100.000000000000156,59.3760054748790367]},"#ff00ff":{"lch":[60.3227313545512942,137.405400537897037,307.715012949243601],"luv":[60.3227313545512942,84.0556019897527875,-108.696365491768773],"rgb":[1,0,1],"xyz":[0.59287158766778,0.284831321232243,0.969862970965251],"hpluv":[307.715012949243601,289.042783730483336,60.3227313545512942],"hsluv":[307.715012949243601,100.000000000000384,60.3227313545512942]},"#ff1100":{"lch":[53.6695097624616864,176.771562285449363,12.5954542867932275],"luv":[53.6695097624616864,172.517389506501019,38.5478345786208934],"rgb":[1,0.0666666666666666657,0],"xyz":[0.414395199526878422,0.216647806393366865,0.019998952135900451],"hpluv":[12.5954542867932275,417.949777534481484,53.6695097624616864],"hsluv":[12.5954542867932275,100.000000000002245,53.6695097624616864]},"#ff1111":{"lch":[53.7128602445647658,175.445128796306847,12.1770506300617765],"luv":[53.7128602445647658,171.497694164414924,37.0072170615611569],"rgb":[1,0.0666666666666666657,0.0666666666666666657],"xyz":[0.415406865026515526,0.217052472593221718,0.0253270571006560807],"hpluv":[12.1770506300617765,414.478837946685644,53.7128602445647658],"hsluv":[12.1770506300617765,99.9999999999986215,53.7128602445647658]},"#ff1122":{"lch":[53.7930781791116743,173.051572118951754,11.3967197916969329],"luv":[53.7930781791116743,169.639425839354459,34.1952016185739538],"rgb":[1,0.0666666666666666657,0.133333333333333331],"xyz":[0.417282223164992583,0.217802615848612546,0.0352039432966352803],"hpluv":[11.3967197916969329,408.214548988049671,53.7930781791116743],"hsluv":[11.3967197916969329,99.9999999999987,53.7930781791116743]},"#ff1133":{"lch":[53.9247555399676912,169.290109899416,10.0990648343251674],"luv":[53.9247555399676912,166.667136068812482,29.6851320424264138],"rgb":[1,0.0666666666666666657,0.2],"xyz":[0.420369973897450289,0.219037716141595645,0.0514660971542464235],"hpluv":[10.0990648343251674,398.366425235699353,53.9247555399676912],"hsluv":[10.0990648343251674,99.9999999999987,53.9247555399676912]},"#ff1144":{"lch":[54.1139966850166445,164.235972949617775,8.19925898659400154],"luv":[54.1139966850166445,162.55716522781,23.4226993279181244],"rgb":[1,0.0666666666666666657,0.266666666666666663],"xyz":[0.424827969141669204,0.220820914239283239,0.074944872107133062],"hpluv":[8.19925898659400154,385.121711929848118,54.1139966850166445],"hsluv":[8.19925898659400154,99.9999999999988489,54.1139966850166445]},"#ff1155":{"lch":[54.365514290002,158.12888296709221,5.61535385404219856],"luv":[54.365514290002,157.370056367003059,15.4728467796533362],"rgb":[1,0.0666666666666666657,0.333333333333333315],"xyz":[0.430790383181031189,0.223205879855028072,0.106346919381106964],"hpluv":[5.61535385404219856,369.085538340858477,54.365514290002],"hsluv":[5.61535385404219856,99.9999999999988916,54.365514290002]},"#ff1166":{"lch":[54.6829025612910442,151.353597545298243,2.27091305216541839],"luv":[54.6829025612910442,151.234730451097789,5.99731567352495443],"rgb":[1,0.0666666666666666657,0.4],"xyz":[0.438375378954539374,0.226239878164431363,0.146294563788250925],"hpluv":[2.27091305216541839,351.221033033747858,54.6829025612910442],"hsluv":[2.27091305216541839,99.999999999999,54.6829025612910442]},"#ff1177":{"lch":[55.0687823252034292,144.407362773795285,358.105880212246802],"luv":[55.0687823252034292,144.328460520523464,-4.77303960367160496],"rgb":[1,0.0666666666666666657,0.466666666666666674],"xyz":[0.44768939197474128,0.229965483372512186,0.195348365694648834],"hpluv":[358.105880212246802,332.753927221166919,55.0687823252034292],"hsluv":[358.105880212246802,99.9999999999990905,55.0687823252034292]},"#ff1188":{"lch":[55.5248949860500716,137.85386672349216,353.096828842063303],"luv":[55.5248949860500716,136.85452147125136,-16.5689023019976744],"rgb":[1,0.0666666666666666657,0.533333333333333326],"xyz":[0.45882980907668508,0.234421650213289784,0.254021229098221],"hpluv":[353.096828842063303,315.043506786171235,55.5248949860500716],"hsluv":[353.096828842063303,99.9999999999992,55.5248949860500716]},"#ff1199":{"lch":[56.0521767726019249,132.264360312052816,347.28491936957397],"luv":[56.0521767726019249,129.020794472918823,-29.1117777254046715],"rgb":[1,0.0666666666666666657,0.6],"xyz":[0.47188677318575778,0.239644435856918941,0.322787906739338937],"hpluv":[347.28491936957397,299.426117704125659,56.0521767726019249],"hsluv":[347.28491936957397,99.9999999999993605,56.0521767726019249]},"#ff11aa":{"lch":[56.6508275614924912,128.148315107741439,340.802676353967],"luv":[56.6508275614924912,121.022209124101792,-42.1380536294115586],"rgb":[1,0.0666666666666666657,0.66666666666666663],"xyz":[0.486944466151010336,0.245667513043020036,0.402091756356337537],"hpluv":[340.802676353967,287.042344439162662,56.6508275614924912],"hsluv":[340.802676353967,99.9999999999995168,56.6508275614924912]},"#ff11bb":{"lch":[57.3203806938084455,125.882364893771992,333.882217516525884],"luv":[57.3203806938084455,113.02864145467457,-55.4156656746030762],"rgb":[1,0.0666666666666666657,0.733333333333333282],"xyz":[0.504082058258347,0.252522549885954795,0.492349741454979284],"hpluv":[333.882217516525884,278.673167271969135,57.3203806938084455],"hsluv":[333.882217516525884,99.9999999999996163,57.3203806938084455]},"#ff11cc":{"lch":[58.0597760671947754,125.656277294901628,326.828156543045054],"luv":[58.0597760671947754,105.178488239830273,-68.7530772780178694],"rgb":[1,0.0666666666666666657,0.8],"xyz":[0.523374433702068709,0.260239500063443596,0.593956252125249384],"hpluv":[326.828156543045054,274.630115267561905,58.0597760671947754],"hsluv":[326.828156543045054,99.9999999999997868,58.0597760671947754]},"#ff11dd":{"lch":[58.8674364673636177,127.458097444326981,319.957026901825429],"luv":[58.8674364673636177,97.5770916499376568,-82.0016938195011846],"rgb":[1,0.0666666666666666657,0.866666666666666696],"xyz":[0.544892759252702308,0.268846830283697158,0.707286100025255382],"hpluv":[319.957026901825429,274.746161939823423,58.8674364673636177],"hsluv":[319.957026901825429,100.000000000000028,58.8674364673636177]},"#ff11ee":{"lch":[59.7413458233107519,131.106916258937218,313.5305052972667],"luv":[59.7413458233107519,90.2986667085849319,-95.0535337669245877],"rgb":[1,0.0666666666666666657,0.933333333333333348],"xyz":[0.568704939518877,0.278371702390167175,0.832696916093778605],"hpluv":[313.5305052972667,278.477381794919836,59.7413458233107519],"hsluv":[313.5305052972667,100.000000000000199,59.7413458233107519]},"#ff11ff":{"lch":[60.6791274610807534,136.317870534400242,307.715012949243601],"luv":[60.6791274610807534,83.3903225409976,-107.83606045076894],"rgb":[1,0.0666666666666666657,1],"xyz":[0.594875987928708438,0.288840121754099899,0.97053110438556045],"hpluv":[307.715012949243601,285.070838096226908,60.6791274610807534],"hsluv":[307.715012949243601,100.000000000000398,60.6791274610807534]},"#ff2200":{"lch":[54.4571507543770679,172.725520469573979,13.3786813235288875],"luv":[54.4571507543770679,168.038102184023103,39.9662562154253393],"rgb":[1,0.133333333333333331,0],"xyz":[0.418110823261646336,0.224079053862902833,0.0212374933808230602],"hpluv":[13.3786813235288875,402.476865089738737,54.4571507543770679],"hsluv":[13.3786813235288875,100.00000000000216,54.4571507543770679]},"#ff2211":{"lch":[54.4995382972682876,171.437527349711331,12.9593558016228254],"luv":[54.4995382972682876,167.070909686171433,38.446546274251638],"rgb":[1,0.133333333333333331,0.0666666666666666657],"xyz":[0.41912248876128344,0.224483720062757686,0.0265655983455786934],"hpluv":[12.9593558016228254,399.164948195999784,54.4995382972682876],"hsluv":[12.9593558016228254,99.999999999998721,54.4995382972682876]},"#ff2222":{"lch":[54.5779789595956117,169.112342257331477,12.1770506300617924],"luv":[54.5779789595956117,165.307392407273255,35.6714216042562171],"rgb":[1,0.133333333333333331,0.133333333333333331],"xyz":[0.420997846899760497,0.225233863318148514,0.036442484541557886],"hpluv":[12.1770506300617924,393.185217729465933,54.5779789595956117],"hsluv":[12.1770506300617924,99.9999999999987494,54.5779789595956117]},"#ff2233":{"lch":[54.7067518227456,165.455769736233549,10.8753803895539445],"luv":[54.7067518227456,162.484163442906947,31.2171166072114978],"rgb":[1,0.133333333333333331,0.2],"xyz":[0.424085597632218203,0.226468963611131613,0.0527046383991690293],"hpluv":[10.8753803895539445,383.778210348001721,54.7067518227456],"hsluv":[10.8753803895539445,99.9999999999987779,54.7067518227456]},"#ff2244":{"lch":[54.8918465894738148,160.537768894747074,8.96806115251763103],"luv":[54.8918465894738148,158.575257224785304,25.0252480066910863],"rgb":[1,0.133333333333333331,0.266666666666666663],"xyz":[0.428543592876437118,0.228252161708819207,0.0761834133520556678],"hpluv":[8.96806115251763103,371.115171122776133,54.8918465894738148],"hsluv":[8.96806115251763103,99.9999999999988347,54.8918465894738148]},"#ff2255":{"lch":[55.1379036013317432,154.588213330392733,6.3708707633682522],"luv":[55.1379036013317432,153.633547891150499,17.1536778289841081],"rgb":[1,0.133333333333333331,0.333333333333333315],"xyz":[0.434506006915799103,0.23063712732456404,0.107585460626029583],"hpluv":[6.3708707633682522,355.76683037739258,55.1379036013317432],"hsluv":[6.3708707633682522,99.9999999999989342,55.1379036013317432]},"#ff2266":{"lch":[55.4484819892530254,147.979820726080618,3.00414546296194196],"luv":[55.4484819892530254,147.776458796099433,7.75535736170059753],"rgb":[1,0.133333333333333331,0.4],"xyz":[0.442091002689307289,0.23367112563396733,0.147533105033173545],"hpluv":[3.00414546296194196,338.650844053811227,55.4484819892530254],"hsluv":[3.00414546296194196,99.9999999999990763,55.4484819892530254]},"#ff2277":{"lch":[55.8262016697843961,141.198613687408425,358.803757025958646],"luv":[55.8262016697843961,141.167840095073672,-2.94778393674187145],"rgb":[1,0.133333333333333331,0.466666666666666674],"xyz":[0.451405015709509194,0.237396730842048154,0.196586906939571454],"hpluv":[358.803757025958646,320.945787006908631,55.8262016697843961],"hsluv":[358.803757025958646,99.9999999999991616,55.8262016697843961]},"#ff2288":{"lch":[56.2728344602164299,134.800794021339357,353.742009538390391],"luv":[56.2728344602164299,133.997535770156077,-14.694028593592142],"rgb":[1,0.133333333333333331,0.533333333333333326],"xyz":[0.462545432811453,0.241852897682825752,0.255259770343143622],"hpluv":[353.742009538390391,303.971583410200083,56.2728344602164299],"hsluv":[353.742009538390391,99.9999999999992752,56.2728344602164299]},"#ff2299":{"lch":[56.7893750973531866,129.355771045476672,347.857065824102108],"luv":[56.7893750973531866,126.461550291410035,-27.2101415039127161],"rgb":[1,0.133333333333333331,0.6],"xyz":[0.47560239692052575,0.247075683326454909,0.324026447984261501],"hpluv":[347.857065824102108,289.040064659782502,56.7893750973531866],"hsluv":[347.857065824102108,99.9999999999994316,56.7893750973531866]},"#ff22aa":{"lch":[57.3761062638205743,125.376808270539939,341.281866819384959],"luv":[57.3761062638205743,118.745473604842076,-40.2350164715945766],"rgb":[1,0.133333333333333331,0.66666666666666663],"xyz":[0.49066008988577825,0.253098760512556031,0.403330297601260102],"hpluv":[341.281866819384959,277.284417349873706,57.3761062638205743],"hsluv":[341.281866819384959,99.999999999999531,57.3761062638205743]},"#ff22bb":{"lch":[58.0326640845464112,123.247659375493754,334.254064951888324],"luv":[58.0326640845464112,111.01274832153284,-53.5364852379920606],"rgb":[1,0.133333333333333331,0.733333333333333282],"xyz":[0.507797681993114924,0.25995379735549079,0.493588282699901848],"hpluv":[334.254064951888324,269.491764983662165,58.0326640845464112],"hsluv":[334.254064951888324,99.9999999999997726,58.0326640845464112]},"#ff22cc":{"lch":[58.7581065478829316,123.164795236141373,327.088444575119183],"luv":[58.7581065478829316,103.398114188518221,-66.9208246199849128],"rgb":[1,0.133333333333333331,0.8],"xyz":[0.527090057436836679,0.267670747532979592,0.595194793370172],"hpluv":[327.088444575119183,265.985598747154427,58.7581065478829316],"hsluv":[327.088444575119183,99.9999999999998721,58.7581065478829316]},"#ff22dd":{"lch":[59.550985046801415,125.119413407905796,320.113090366201448],"luv":[59.550985046801415,96.0055877759378,-80.2358693312108358],"rgb":[1,0.133333333333333331,0.866666666666666696],"xyz":[0.548608382987470167,0.276278077753233098,0.708524641270178],"hpluv":[320.113090366201448,266.609166102550091,59.550985046801415],"hsluv":[320.113090366201448,100.000000000000028,59.550985046801415]},"#ff22ee":{"lch":[60.4094179672163705,128.929416765847606,313.598505937960113],"luv":[60.4094179672163705,88.9098108664153273,-93.3693742041783281],"rgb":[1,0.133333333333333331,0.933333333333333348],"xyz":[0.572420563253645,0.285802949859703115,0.833935457338701225],"hpluv":[313.598505937960113,270.823716236275,60.4094179672163705],"hsluv":[313.598505937960113,100.000000000000227,60.4094179672163705]},"#ff22ff":{"lch":[61.3311646171935223,134.305840538380238,307.715012949243601],"luv":[61.3311646171935223,82.1594946996257249,-106.244417422389745],"rgb":[1,0.133333333333333331,1],"xyz":[0.598591611663476297,0.296271369223635839,0.97176964563048307],"hpluv":[307.715012949243601,277.877263991976,61.3311646171935223],"hsluv":[307.715012949243601,100.000000000000398,61.3311646171935223]},"#ff3300":{"lch":[55.7168894472394811,166.476173059961667,14.689559134518138],"luv":[55.7168894472394811,161.034729269155179,42.2153072463082495],"rgb":[1,0.2,0],"xyz":[0.424228545350657182,0.236314498040924637,0.0232767340771599419],"hpluv":[14.689559134518138,379.144314271077917,55.7168894472394811],"hsluv":[14.689559134518138,100.000000000002203,55.7168894472394811]},"#ff3311":{"lch":[55.7578022303213,165.243627812887922,14.2690908575150317],"luv":[55.7578022303213,160.145669888681539,40.7286256663500339],"rgb":[1,0.2,0.0666666666666666657],"xyz":[0.425240210850294287,0.236719164240779489,0.0286048390419155751],"hpluv":[14.2690908575150317,376.06108995847427,55.7578022303213],"hsluv":[14.2690908575150317,99.9999999999988,55.7578022303213]},"#ff3322":{"lch":[55.8335204651182835,163.01701714894287,13.4842232594842422],"luv":[55.8335204651182835,158.523316810386802,38.0119179675594552],"rgb":[1,0.2,0.133333333333333331],"xyz":[0.427115568988771344,0.237469307496170318,0.0384817252378947677],"hpluv":[13.4842232594842422,370.490653647292163,55.8335204651182835],"hsluv":[13.4842232594842422,99.9999999999987494,55.8335204651182835]},"#ff3333":{"lch":[55.9578428172660267,159.511521097175432,12.1770506300617853],"luv":[55.9578428172660267,155.922585303490365,33.6462888742638455],"rgb":[1,0.2,0.2],"xyz":[0.430203319721229049,0.238704407789153417,0.0547438790955059179],"hpluv":[12.1770506300617853,361.718248261175631,55.9578428172660267],"hsluv":[12.1770506300617853,99.9999999999988773,55.9578428172660267]},"#ff3344":{"lch":[56.1365811585215368,154.789240798906889,10.2588910791084782],"luv":[56.1365811585215368,152.31463646984821,27.5673826135157078],"rgb":[1,0.2,0.266666666666666663],"xyz":[0.434661314965447965,0.240487605886841,0.0782226540483925564],"hpluv":[10.2588910791084782,349.892100101075414,56.1365811585215368],"hsluv":[10.2588910791084782,99.9999999999989626,56.1365811585215368]},"#ff3355":{"lch":[56.3742616664660403,149.065442517766684,7.64169944339336649],"luv":[56.3742616664660403,147.741595680550319,19.8223878173745902],"rgb":[1,0.2,0.333333333333333315],"xyz":[0.44062372900480995,0.242872571502585843,0.109624701322366458],"hpluv":[7.64169944339336649,335.533149366899124,56.3742616664660403],"hsluv":[7.64169944339336649,99.9999999999990195,56.3742616664660403]},"#ff3366":{"lch":[56.674385203130754,142.694983818340035,4.24028319431916056],"luv":[56.674385203130754,142.304390380845462,10.550776523662277],"rgb":[1,0.2,0.4],"xyz":[0.448208724778318135,0.245906569811989134,0.14957234572951042],"hpluv":[4.24028319431916056,319.492902958598108,56.674385203130754],"hsluv":[4.24028319431916056,99.9999999999991758,56.674385203130754]},"#ff3377":{"lch":[57.0395646827704468,136.14730874514737,359.983392279567909],"luv":[57.0395646827704468,136.147303025702882,-0.0394635770517579934],"rgb":[1,0.2,0.466666666666666674],"xyz":[0.457522737798520041,0.249632175020069957,0.198626147635908329],"hpluv":[359.983392279567909,302.881107814185,57.0395646827704468],"hsluv":[359.983392279567909,99.9999999999992895,57.0395646827704468]},"#ff3388":{"lch":[57.4716120619286954,129.967879448766553,354.83565117969431],"luv":[57.4716120619286954,129.440287861866665,-11.6987848363070146],"rgb":[1,0.2,0.533333333333333326],"xyz":[0.468663154900463841,0.254088341860847555,0.257299011039480496],"hpluv":[354.83565117969431,286.960407533356261,57.4716120619286954],"hsluv":[354.83565117969431,99.9999999999993889,57.4716120619286954]},"#ff3399":{"lch":[57.9716047421228353,124.724336507791776,348.82951213288959],"luv":[57.9716047421228353,122.361442957788952,-24.1627273832372573],"rgb":[1,0.2,0.6],"xyz":[0.481720119009536596,0.259311127504476713,0.326065688680598431],"hpluv":[348.82951213288959,273.007894976207297,57.9716047421228353],"hsluv":[348.82951213288959,99.9999999999995737,57.9716047421228353]},"#ff33aa":{"lch":[58.5399451724763935,120.937271340322638,342.098036856126953],"luv":[58.5399451724763935,115.081956962752116,-37.174813797329108],"rgb":[1,0.2,0.66666666666666663],"xyz":[0.496777811974789096,0.265334204690577835,0.405369538297597032],"hpluv":[342.098036856126953,262.148381504719794,58.5399451724763935],"hsluv":[342.098036856126953,99.9999999999996732,58.5399451724763935]},"#ff33bb":{"lch":[59.1764201449825862,119.003132790944747,334.888094830460091],"luv":[59.1764201449825862,107.755032536641394,-50.5034511403585498],"rgb":[1,0.2,0.733333333333333282],"xyz":[0.513915404082125771,0.272189241533512594,0.495627523396238778],"hpluv":[334.888094830460091,255.181409444549388,59.1764201449825862],"hsluv":[334.888094830460091,99.9999999999998295,59.1764201449825862]},"#ff33cc":{"lch":[59.8802624584280494,119.13012657470172,327.532171012183937],"luv":[59.8802624584280494,100.509254029343069,-63.9521454852723039],"rgb":[1,0.2,0.8],"xyz":[0.533207779525847525,0.279906191711001395,0.597234034066508879],"hpluv":[327.532171012183937,252.451080902073329,59.8802624584280494],"hsluv":[327.532171012183937,100.000000000000043,59.8802624584280494]},"#ff33dd":{"lch":[60.650215463767978,121.314823858854638,320.378757122173454],"luv":[60.650215463767978,93.4460015542912146,-77.3636302238999747],"rgb":[1,0.2,0.866666666666666696],"xyz":[0.554726105076481,0.288513521931254902,0.710563881966514876],"hpluv":[320.378757122173454,253.817084039055629,60.650215463767978],"hsluv":[320.378757122173454,100.000000000000171,60.650215463767978]},"#ff33ee":{"lch":[61.484599762034378,125.372817174433621,313.71398784253438],"luv":[61.484599762034378,86.6400000332951805,-90.6192787462169775],"rgb":[1,0.2,0.933333333333333348],"xyz":[0.578538285342655723,0.298038394037724919,0.8359746980350381],"hpluv":[313.71398784253438,258.747618308410438,61.484599762034378],"hsluv":[313.71398784253438,100.000000000000242,61.484599762034378]},"#ff33ff":{"lch":[62.3813806681475,131.007738376122177,307.715012949243658],"luv":[62.3813806681475,80.141932350642,-103.635409940481253],"rgb":[1,0.2,1],"xyz":[0.604709333752487144,0.308506813401657642,0.97380888632682],"hpluv":[307.715012949243658,266.490230971107223,62.3813806681475],"hsluv":[307.715012949243658,100.000000000000597,62.3813806681475]},"#ff4400":{"lch":[57.461133143380664,158.273971604467,16.6278363926044079],"luv":[57.461133143380664,151.655533944896689,45.2907177172089845],"rgb":[1,0.266666666666666663,0],"xyz":[0.433061115833623222,0.253979639006856939,0.0262209242381485352],"hpluv":[16.6278363926044079,349.522099776260404,57.461133143380664],"hsluv":[16.6278363926044079,100.000000000002203,57.461133143380664]},"#ff4411":{"lch":[57.500127691013958,157.107055615985729,16.2066010587584444],"luv":[57.500127691013958,150.863862649088418,43.84885256105823],"rgb":[1,0.266666666666666663,0.0666666666666666657],"xyz":[0.434072781333260327,0.254384305206711792,0.031549029202904165],"hpluv":[16.2066010587584444,346.709871357654038,57.500127691013958],"hsluv":[16.2066010587584444,99.9999999999990195,57.500127691013958]},"#ff4422":{"lch":[57.5723039440668174,154.996970095022306,15.4196600073807488],"luv":[57.5723039440668174,149.417734299680745,41.2116660108183908],"rgb":[1,0.266666666666666663,0.133333333333333331],"xyz":[0.435948139471737384,0.255134448462102592,0.0414259153988833645],"hpluv":[15.4196600073807488,341.624434338608523,57.5723039440668174],"hsluv":[15.4196600073807488,99.9999999999990195,57.5723039440668174]},"#ff4433":{"lch":[57.6908335218327437,151.669616752661852,14.1071803519879388],"luv":[57.6908335218327437,147.095485225188412,36.9674298845038223],"rgb":[1,0.266666666666666663,0.2],"xyz":[0.439035890204195089,0.256369548755085719,0.0576880692564945077],"hpluv":[14.1071803519879388,333.603886972203838,57.6908335218327437],"hsluv":[14.1071803519879388,99.9999999999991189,57.6908335218327437]},"#ff4444":{"lch":[57.8612930010941682,147.177084719743902,12.177050630061812],"luv":[57.8612930010941682,143.865668066403089,31.0445457111261],"rgb":[1,0.266666666666666663,0.266666666666666663],"xyz":[0.443493885448414,0.258152746852773285,0.0811668442093811393],"hpluv":[12.177050630061812,322.76868159643891,57.8612930010941682],"hsluv":[12.177050630061812,99.9999999999991616,57.8612930010941682]},"#ff4455":{"lch":[58.088054010202,141.716285969530816,9.53556562214303405],"luv":[58.088054010202,139.758186425649882,23.4766913344092778],"rgb":[1,0.266666666666666663,0.333333333333333315],"xyz":[0.449456299487776,0.260537712468518146,0.112568891483355055],"hpluv":[9.53556562214303405,309.579547415252762,58.088054010202],"hsluv":[9.53556562214303405,99.9999999999992184,58.088054010202]},"#ff4466":{"lch":[58.3745334436288772,135.619673907166316,6.08910281061040859],"luv":[58.3745334436288772,134.854526247228307,14.3858507333331573],"rgb":[1,0.266666666666666663,0.4],"xyz":[0.457041295261284175,0.263571710777921464,0.152516535890499016],"hpluv":[6.08910281061040859,294.807548797669426,58.3745334436288772],"hsluv":[6.08910281061040859,99.9999999999992468,58.3745334436288772]},"#ff4477":{"lch":[58.7233249761193292,129.336052383116169,1.75519751784143763],"luv":[58.7233249761193292,129.275370036155351,3.96145782045869943],"rgb":[1,0.266666666666666663,0.466666666666666674],"xyz":[0.466355308281486081,0.26729731598600226,0.201570337796896926],"hpluv":[1.75519751784143763,279.478426792191101,58.7233249761193292],"hsluv":[1.75519751784143763,99.99999999999946,58.7233249761193292]},"#ff4488":{"lch":[59.1362810655005831,123.398173767481396,356.485857706034096],"luv":[59.1362810655005831,123.16614811103635,-7.56367957014252212],"rgb":[1,0.266666666666666663,0.533333333333333326],"xyz":[0.477495725383429881,0.271753482826779857,0.260243201200469065],"hpluv":[356.485857706034096,264.785408966002421,59.1362810655005831],"hsluv":[356.485857706034096,99.9999999999995595,59.1362810655005831]},"#ff4499":{"lch":[59.6145739069951901,118.37348532064955,350.303370213710309],"luv":[59.6145739069951901,116.682328099077466,-19.9378117238896806],"rgb":[1,0.266666666666666663,0.6],"xyz":[0.490552689492502636,0.276976268470409,0.329009878841587],"hpluv":[350.303370213710309,251.965637795338,59.6145739069951901],"hsluv":[350.303370213710309,99.9999999999997158,59.6145739069951901]},"#ff44aa":{"lch":[60.1587486598557177,114.795436800176844,343.339450530546515],"luv":[60.1587486598557177,109.976338996192666,-32.9119609129858475],"rgb":[1,0.266666666666666663,0.66666666666666663],"xyz":[0.505610382457755136,0.282999345656510137,0.408313728458585601],"hpluv":[343.339450530546515,242.139230170638513,60.1587486598557177],"hsluv":[343.339450530546515,99.9999999999997726,60.1587486598557177]},"#ff44bb":{"lch":[60.768775409955694,113.081121999454581,335.854341209703],"luv":[60.768775409955694,103.187483930843442,-46.2567110015126133],"rgb":[1,0.266666666666666663,0.733333333333333282],"xyz":[0.522747974565091811,0.289854382499444896,0.498571713557227347],"hpluv":[335.854341209703,236.128794952899398,60.768775409955694],"hsluv":[335.854341209703,99.9999999999999716,60.768775409955694]},"#ff44cc":{"lch":[61.4441027606342232,113.457557937670586,328.208302422827],"luv":[61.4441027606342232,96.4354118722023088,-59.7731443895883743],"rgb":[1,0.266666666666666663,0.8],"xyz":[0.542040350008813565,0.297571332676933697,0.600178224227497559],"hpluv":[328.208302422827,234.310931883055929,61.4441027606342232],"hsluv":[328.208302422827,100.000000000000128,61.4441027606342232]},"#ff44dd":{"lch":[62.1837139115479403,115.929787300919912,320.782684481283354],"luv":[62.1837139115479403,89.8170022013310358,-73.2981698216444357],"rgb":[1,0.266666666666666663,0.866666666666666696],"xyz":[0.563558675559447,0.306178662897187204,0.713508072127503556],"hpluv":[320.782684481283354,236.568931830040128,62.1837139115479403],"hsluv":[320.782684481283354,100.000000000000384,62.1837139115479403]},"#ff44ee":{"lch":[62.986184892514558,120.309477517885213,313.888915695758442],"luv":[62.986184892514558,83.4060394378513195,-86.7052649261745643],"rgb":[1,0.266666666666666663,0.933333333333333348],"xyz":[0.587370855825621874,0.315703535003657221,0.83891888819602678],"hpluv":[313.888915695758442,242.378371703623515,62.986184892514558],"hsluv":[313.888915695758442,100.000000000000512,62.986184892514558]},"#ff44ff":{"lch":[63.8497439492436,126.288239910703226,307.715012949243771],"luv":[63.8497439492436,77.2548530724802447,-99.9019880507531468],"rgb":[1,0.266666666666666663,1],"xyz":[0.613541904235453184,0.326171954367589945,0.976753076487808514],"hpluv":[307.715012949243771,250.982289693600563,63.8497439492436],"hsluv":[307.715012949243771,100.000000000000711,63.8497439492436]},"#ff5500":{"lch":[59.6718499915998279,148.630700843778015,19.3008598736449528],"luv":[59.6718499915998279,140.27705963161867,49.1266910591374923],"rgb":[1,0.333333333333333315,0],"xyz":[0.444874372547969188,0.277606152435549203,0.030158676476263746],"hpluv":[19.3008598736449528,316.066414507984518,59.6718499915998279],"hsluv":[19.3008598736449528,100.00000000000226,59.6718499915998279]},"#ff5511":{"lch":[59.7086010657385486,147.530698996531413,18.8803784611224046],"luv":[59.7086010657385486,139.59299153240957,47.7399608445355526],"rgb":[1,0.333333333333333315,0.0666666666666666657],"xyz":[0.445886038047606292,0.278010818635404056,0.0354867814410193758],"hpluv":[18.8803784611224046,313.53413530658878,59.7086010657385486],"hsluv":[18.8803784611224046,99.9999999999992184,59.7086010657385486]},"#ff5522":{"lch":[59.7766335415963255,145.539064184811622,18.0939597274483681],"luv":[59.7766335415963255,138.341936048844929,45.2009727113036],"rgb":[1,0.333333333333333315,0.133333333333333331],"xyz":[0.447761396186083349,0.278760961890794856,0.0453636676369985753],"hpluv":[18.0939597274483681,308.949467849715688,59.7766335415963255],"hsluv":[18.0939597274483681,99.9999999999993,59.7766335415963255]},"#ff5533":{"lch":[59.8883826376776085,142.391759670631302,16.7797766500676033],"luv":[59.8883826376776085,136.328925827546385,41.1076295206398825],"rgb":[1,0.333333333333333315,0.2],"xyz":[0.450849146918541055,0.279996062183778,0.0616258214946097185],"hpluv":[16.7797766500676033,301.704368813615531,59.8883826376776085],"hsluv":[16.7797766500676033,99.9999999999992752,59.8883826376776085]},"#ff5544":{"lch":[60.0491441299879654,138.129067713899872,14.841281480974498],"luv":[60.0491441299879654,133.520956258941027,35.3806951204903228],"rgb":[1,0.333333333333333315,0.266666666666666663],"xyz":[0.45530714216275997,0.281779260281465549,0.0851045964474963501],"hpluv":[14.841281480974498,291.888903616465711,60.0491441299879654],"hsluv":[14.841281480974498,99.9999999999994458,60.0491441299879654]},"#ff5555":{"lch":[60.2631003442631936,132.926854505406169,12.1770506300618191],"luv":[60.2631003442631936,129.936061471805857,28.0386978637829927],"rgb":[1,0.333333333333333315,0.333333333333333315],"xyz":[0.461269556202121955,0.28416422589721041,0.116506643721470265],"hpluv":[12.1770506300618191,279.898508055628838,60.2631003442631936],"hsluv":[12.1770506300618191,99.99999999999946,60.2631003442631936]},"#ff5566":{"lch":[60.5335583680784168,127.091978224389294,8.68145952340772098],"luv":[60.5335583680784168,125.635857711143842,19.1833830742614],"rgb":[1,0.333333333333333315,0.4],"xyz":[0.468854551975630141,0.287198224206613728,0.156454288128614227],"hpluv":[8.68145952340772098,266.416588145649541,60.5335583680784168],"hsluv":[8.68145952340772098,99.9999999999995737,60.5335583680784168]},"#ff5577":{"lch":[60.8630749033481351,121.049870295691591,4.25532383082281918],"luv":[60.8630749033481351,120.716171483201308,8.98203991541407],"rgb":[1,0.333333333333333315,0.466666666666666674],"xyz":[0.478168564995832046,0.290923829414694524,0.205508090035012136],"hpluv":[4.25532383082281918,252.376995060411161,60.8630749033481351],"hsluv":[4.25532383082281918,99.9999999999997158,60.8630749033481351]},"#ff5588":{"lch":[61.2535329118914404,115.319895978664789,358.830706871579594],"luv":[61.2535329118914404,115.295882188952703,-2.35328680810625102],"rgb":[1,0.333333333333333315,0.533333333333333326],"xyz":[0.489308982097775846,0.295379996255472121,0.264180953438584276],"hpluv":[358.830706871579594,238.897951612134108,61.2535329118914404],"hsluv":[358.830706871579594,99.9999999999997868,61.2535329118914404]},"#ff5599":{"lch":[61.7061969251912075,110.472562823261683,352.412124726619879],"luv":[61.7061969251912075,109.505210454219565,-14.5875296097928366],"rgb":[1,0.333333333333333315,0.6],"xyz":[0.502365946206848601,0.300602781899101279,0.332947631079702211],"hpluv":[352.412124726619879,227.177321581811952,61.7061969251912075],"hsluv":[352.412124726619879,99.9999999999998721,61.7061969251912075]},"#ff55aa":{"lch":[62.2217597266614177,107.062368992166355,345.125792918237266],"luv":[62.2217597266614177,103.474894783269619,-27.4826673342684735],"rgb":[1,0.333333333333333315,0.66666666666666663],"xyz":[0.517423639172101102,0.306625859085202401,0.412251480696700812],"hpluv":[345.125792918237266,218.340291577764589,62.2217597266614177],"hsluv":[345.125792918237266,100.000000000000071,62.2217597266614177]},"#ff55bb":{"lch":[62.8003867495987862,105.538663220643826,337.249357740418191],"luv":[62.8003867495987862,97.3274002701012,-40.8140489422941855],"rgb":[1,0.333333333333333315,0.733333333333333282],"xyz":[0.534561231279437776,0.31348089592813716,0.502509465795342614],"hpluv":[337.249357740418191,213.249782655969199,62.8003867495987862],"hsluv":[337.249357740418191,100.000000000000284,62.8003867495987862]},"#ff55cc":{"lch":[63.441761241476712,106.157882562261193,329.184616986090759],"luv":[63.441761241476712,91.1707664760994447,-54.3818661895983837],"rgb":[1,0.333333333333333315,0.8],"xyz":[0.553853606723159531,0.321197846105625961,0.60411597646561277],"hpluv":[329.184616986090759,212.332436268611161,63.441761241476712],"hsluv":[329.184616986090759,100.000000000000441,63.441761241476712]},"#ff55dd":{"lch":[64.1451313698934769,108.938462409011748,321.364198961949114],"luv":[64.1451313698934769,85.0951546537234549,-68.0176686346904518],"rgb":[1,0.333333333333333315,0.866666666666666696],"xyz":[0.575371932273793,0.329805176325879468,0.717445824365618767],"hpluv":[321.364198961949114,215.504760823814451,64.1451313698934769],"hsluv":[321.364198961949114,100.000000000000597,64.1451313698934769]},"#ff55ee":{"lch":[64.9093593252901258,113.686114680552976,314.13939983200612],"luv":[64.9093593252901258,79.1717442713053288,-81.5865649491316418],"rgb":[1,0.333333333333333315,0.933333333333333348],"xyz":[0.599184112539967728,0.339330048432349485,0.842856640434142],"hpluv":[314.13939983200612,222.248801840624651,64.9093593252901258],"hsluv":[314.13939983200612,100.000000000000753,64.9093593252901258]},"#ff55ff":{"lch":[65.7329718140353378,120.074032289562709,307.715012949243885],"luv":[65.7329718140353378,73.4534088756767147,-94.9861566483116633],"rgb":[1,0.333333333333333315,1],"xyz":[0.625355160949799149,0.349798467796282209,0.980690828725923724],"hpluv":[307.715012949243885,231.795582155087629,65.7329718140353378],"hsluv":[307.715012949243885,100.000000000000981,65.7329718140353378]},"#ff6600":{"lch":[62.3097916023938438,138.227046243322206,22.8239093069931798],"luv":[62.3097916023938438,127.404056867086908,53.6183047751569717],"rgb":[1,0.4,0],"xyz":[0.459902430253815608,0.307662267847242543,0.03516802904487909],"hpluv":[22.8239093069931798,281.498480884542573,62.3097916023938438],"hsluv":[22.8239093069931798,100.000000000002359,62.3097916023938438]},"#ff6611":{"lch":[62.344110015411573,137.186959502953613,22.4076195476895244],"luv":[62.344110015411573,126.828705913080029,52.2947532174930245],"rgb":[1,0.4,0.0666666666666666657],"xyz":[0.460914095753452713,0.308066934047097396,0.0404961340096347197],"hpluv":[22.4076195476895244,279.226561167599414,62.344110015411573],"hsluv":[22.4076195476895244,99.9999999999995737,62.344110015411573]},"#ff6622":{"lch":[62.4076477973658257,135.300699513710725,21.6278909170268392],"luv":[62.4076477973658257,125.775148313603225,49.8687412673566115],"rgb":[1,0.4,0.133333333333333331],"xyz":[0.46278945389192977,0.308817077302488197,0.0503730202056139192],"hpluv":[21.6278909170268392,275.106945224361368,62.4076477973658257],"hsluv":[21.6278909170268392,99.9999999999996163,62.4076477973658257]},"#ff6633":{"lch":[62.5120380635233346,132.311574345484274,20.3215228987586443],"luv":[62.5120380635233346,124.076309265494103,45.9502141979128851],"rgb":[1,0.4,0.2],"xyz":[0.465877204624387475,0.310052177595471323,0.0666351740632250555],"hpluv":[20.3215228987586443,268.579898420339646,62.5120380635233346],"hsluv":[20.3215228987586443,99.9999999999995879,62.5120380635233346]},"#ff6644":{"lch":[62.6622654373265675,128.246261163642686,18.3868048135947362],"luv":[62.6622654373265675,121.699120282046835,40.4527826611364603],"rgb":[1,0.4,0.266666666666666663],"xyz":[0.470335199868606391,0.311835375693158889,0.0901139490161117],"hpluv":[18.3868048135947362,259.703586528718,62.6622654373265675],"hsluv":[18.3868048135947362,99.9999999999997726,62.6622654373265675]},"#ff6655":{"lch":[62.8622967709428764,123.257362768531593,15.7125644918265355],"luv":[62.8622967709428764,118.651528823693667,33.3795174388964284],"rgb":[1,0.4,0.333333333333333315],"xyz":[0.476297613907968376,0.31422034130890375,0.121515996290085609],"hpluv":[15.7125644918265355,248.806632458920831,62.8622967709428764],"hsluv":[15.7125644918265355,99.9999999999997158,62.8622967709428764]},"#ff6666":{"lch":[63.1153061541487119,117.623502253606588,12.1770506300618742],"luv":[63.1153061541487119,114.97702760078576,24.8107115273291683],"rgb":[1,0.4,0.4],"xyz":[0.483882609681476561,0.317254339618307069,0.161463640697229571],"hpluv":[12.1770506300618742,236.482353971627703,63.1153061541487119],"hsluv":[12.1770506300618742,99.9999999999999,63.1153061541487119]},"#ff6677":{"lch":[63.4237926928396121,111.744324598031497,7.65713975886231157],"luv":[63.4237926928396121,110.747917341816802,14.8893547314965815],"rgb":[1,0.4,0.466666666666666674],"xyz":[0.493196622701678467,0.320979944826387864,0.21051744260362748],"hpluv":[7.65713975886231157,223.569519019308729,63.4237926928396121],"hsluv":[7.65713975886231157,100.000000000000071,63.4237926928396121]},"#ff6688":{"lch":[63.7896518301749751,106.125321016318935,2.05404070639815961],"luv":[63.7896518301749751,106.057131857198982,3.80375380925921824],"rgb":[1,0.4,0.533333333333333326],"xyz":[0.504337039803622322,0.325436111667165462,0.26919030600719962],"hpluv":[2.05404070639815961,211.109662635719985,63.7896518301749751],"hsluv":[2.05404070639815961,100.000000000000128,63.7896518301749751]},"#ff6699":{"lch":[64.2142253202301276,101.344202045456129,355.341285926877504],"luv":[64.2142253202301276,101.009378125853075,-8.23121004826552394],"rgb":[1,0.4,0.6],"xyz":[0.517394003912695,0.330658897310794619,0.337956983648317555],"hpluv":[355.341285926877504,200.265890662959123,64.2142253202301276],"hsluv":[355.341285926877504,100.000000000000199,64.2142253202301276]},"#ff66aa":{"lch":[64.6983418323177233,97.9876087444390436,347.629516841099075],"luv":[64.6983418323177233,95.7126081968365838,-20.9920961224008664],"rgb":[1,0.4,0.66666666666666663],"xyz":[0.532451696877947578,0.336681974496895742,0.417260833265316156],"hpluv":[347.629516841099075,192.184047560801417,64.6983418323177233],"hsluv":[347.629516841099075,100.000000000000441,64.6983418323177233]},"#ff66bb":{"lch":[65.2423543089962408,96.5541832870936787,339.215698562051898],"luv":[65.2423543089962408,90.270720679111,-34.2623306024503123],"rgb":[1,0.4,0.733333333333333282],"xyz":[0.549589288985284141,0.3435370113398305,0.507518818363957847],"hpluv":[339.215698562051898,187.793604034801348,65.2423543089962408],"hsluv":[339.215698562051898,100.000000000000597,65.2423543089962408]},"#ff66cc":{"lch":[65.8461771980182533,97.3465701370285,330.562118792095362],"luv":[65.8461771980182533,84.7780628468697159,-47.8438583036069218],"rgb":[1,0.4,0.8],"xyz":[0.568881664429005895,0.351253961517319302,0.609125329034228],"hpluv":[330.562118792095362,187.598522894675455,65.8461771980182533],"hsluv":[330.562118792095362,100.000000000000711,65.8461771980182533]},"#ff66dd":{"lch":[66.5093249736543157,100.405273498350255,322.181562409870594],"luv":[66.5093249736543157,79.3159229397089831,-61.5646271368605298],"rgb":[1,0.4,0.866666666666666696],"xyz":[0.590399989979639495,0.359861291737572808,0.722455176934234],"hpluv":[322.181562409870594,191.563741116159406,66.5093249736543157],"hsluv":[322.181562409870594,100.000000000000952,66.5093249736543157]},"#ff66ee":{"lch":[67.2309523334132706,105.527911758853008,314.488878023448478],"luv":[67.2309523334132706,73.9508789773533408,-75.2821868615750702],"rgb":[1,0.4,0.933333333333333348],"xyz":[0.614212170245814204,0.369386163844042825,0.847865993002757223],"hpluv":[314.488878023448478,199.176184031939982,67.2309523334132706],"hsluv":[314.488878023448478,100.000000000001066,67.2309523334132706]},"#ff66ff":{"lch":[68.0098958254125137,112.360313920932768,307.715012949244056],"luv":[68.0098958254125137,68.7346624616611592,-88.8841173702707437],"rgb":[1,0.4,1],"xyz":[0.640383218655645625,0.379854583207975549,0.985700181294539179],"hpluv":[307.715012949244056,209.642901019847784,68.0098958254125137],"hsluv":[307.715012949244056,100.000000000001421,68.0098958254125137]},"#ff7700":{"lch":[65.3236824647912755,127.817378582796977,27.3102887077963814],"luv":[65.3236824647912755,113.570196302134065,58.6437786953806466],"rgb":[1,0.466666666666666674,0],"xyz":[0.478356168307233265,0.344569743954078356,0.0413192750626848],"hpluv":[27.3102887077963814,248.289625700463205,65.3236824647912755],"hsluv":[27.3102887077963814,100.00000000000226,65.3236824647912755]},"#ff7711":{"lch":[65.3555057958206476,126.824695098806032,26.9045059733925385],"luv":[65.3555057958206476,113.097436843789765,57.3887886809793],"rgb":[1,0.466666666666666674,0.0666666666666666657],"xyz":[0.479367833806870369,0.344974410153933209,0.0466473800274404271],"hpluv":[26.9045059733925385,246.24134425049084,65.3555057958206476],"hsluv":[26.9045059733925385,99.9999999999999716,65.3555057958206476]},"#ff7722":{"lch":[65.4144320044565291,125.020679344179442,26.1430666348463],"luv":[65.4144320044565291,112.230643754756542,55.0858681158159058],"rgb":[1,0.466666666666666674,0.133333333333333331],"xyz":[0.481243191945347426,0.345724553409324,0.0565242662234196266],"hpluv":[26.1430666348463,242.520026060215031,65.4144320044565291],"hsluv":[26.1430666348463,100.000000000000156,65.4144320044565291]},"#ff7733":{"lch":[65.511267747206432,122.151716277204869,24.8632302030062533],"luv":[65.511267747206432,110.829965834679456,51.3591322215488688],"rgb":[1,0.466666666666666674,0.2],"xyz":[0.484330942677805132,0.346959653702307136,0.0727864200810307699],"hpluv":[24.8632302030062533,236.604443239770575,65.511267747206432],"hsluv":[24.8632302030062533,100.000000000000128,65.511267747206432]},"#ff7744":{"lch":[65.6506715027637853,118.22870540382597,22.9581907744090898],"luv":[65.6506715027637853,108.863777518532288,46.1162089276663139],"rgb":[1,0.466666666666666674,0.266666666666666663],"xyz":[0.488788937922024047,0.348742851799994702,0.0962651950339174084],"hpluv":[22.9581907744090898,228.519406804146513,65.6506715027637853],"hsluv":[22.9581907744090898,100.000000000000199,65.6506715027637853]},"#ff7755":{"lch":[65.8363783536997857,113.378413750733145,20.3056908730066645],"luv":[65.8363783536997857,106.332452226692425,39.3455754576116092],"rgb":[1,0.466666666666666674,0.333333333333333315],"xyz":[0.494751351961386032,0.351127817415739563,0.12766724230789131],"hpluv":[20.3056908730066645,218.526329281612362,65.8363783536997857],"hsluv":[20.3056908730066645,100.000000000000171,65.8363783536997857]},"#ff7766":{"lch":[66.0714111968285351,107.847817312906827,16.7638759706376135],"luv":[66.0714111968285351,103.264450834403533,31.1063481146080676],"rgb":[1,0.466666666666666674,0.4],"xyz":[0.502336347734894217,0.354161815725142881,0.167614886715035272],"hpluv":[16.7638759706376135,207.127185394700234,66.0714111968285351],"hsluv":[16.7638759706376135,100.000000000000426,66.0714111968285351]},"#ff7777":{"lch":[66.3581913431115851,102.006782949974053,12.1770506300619488],"luv":[66.3581913431115851,99.7116772923406671,21.5166256497442419],"rgb":[1,0.466666666666666674,0.466666666666666674],"xyz":[0.511650360755096067,0.357887420933223677,0.216668688621433181],"hpluv":[12.1770506300619488,195.062523033846361,66.3581913431115851],"hsluv":[12.1770506300619488,100.000000000000355,66.3581913431115851]},"#ff7788":{"lch":[66.6986047917809,96.3441833198397291,6.39999172914420456],"luv":[66.6986047917809,95.7437601312525,10.7393694179903871],"rgb":[1,0.466666666666666674,0.533333333333333326],"xyz":[0.52279077785704,0.362343587774001274,0.275341552025005376],"hpluv":[6.39999172914420456,183.293927388427107,66.6986047917809],"hsluv":[6.39999172914420456,100.000000000000639,66.6986047917809]},"#ff7799":{"lch":[67.0940474565320244,91.4474963932601,359.352586865695173],"luv":[67.0940474565320244,91.4416585161261679,-1.0332881570442134],"rgb":[1,0.466666666666666674,0.6],"xyz":[0.535847741966112623,0.367566373417630432,0.344108229666123255],"hpluv":[359.352586865695173,172.952623850798517,67.0940474565320244],"hsluv":[359.352586865695173,100.000000000000782,67.0940474565320244]},"#ff77aa":{"lch":[67.5454605183692,87.9484746627524,351.107126776790835],"luv":[67.5454605183692,86.8912550098467449,-13.5957345634056814],"rgb":[1,0.466666666666666674,0.66666666666666663],"xyz":[0.550905434931365234,0.373589450603731554,0.423412079283121856],"hpluv":[351.107126776790835,165.223368139110704,67.5454605183692],"hsluv":[351.107126776790835,100.000000000000938,67.5454605183692]},"#ff77bb":{"lch":[68.0533617234635244,86.4195813509952,341.973592157308417],"luv":[68.0533617234635244,82.1775887588569,-26.7429980866295693],"rgb":[1,0.466666666666666674,0.733333333333333282],"xyz":[0.568043027038701798,0.380444487446666313,0.513670064381763658],"hpluv":[341.973592157308417,161.139458954487083,68.0533617234635244],"hsluv":[341.973592157308417,100.000000000001037,68.0533617234635244]},"#ff77cc":{"lch":[68.6178757233526682,87.2373067072756214,332.49967924393593],"luv":[68.6178757233526682,77.3802105983984347,-40.2821385887937],"rgb":[1,0.466666666666666674,0.8],"xyz":[0.587335402482423552,0.388161437624155115,0.615276575052033814],"hpluv":[332.49967924393593,161.325977991170333,68.6178757233526682],"hsluv":[332.49967924393593,100.000000000001265,68.6178757233526682]},"#ff77dd":{"lch":[69.238765020261809,90.480647802514838,323.326201907778],"luv":[69.238765020261809,72.5699004301545756,-54.0403291840472],"rgb":[1,0.466666666666666674,0.866666666666666696],"xyz":[0.608853728033057151,0.396768767844408621,0.728606422952039812],"hpluv":[323.326201907778,165.823361543811586,69.238765020261809],"hsluv":[323.326201907778,100.00000000000145,69.238765020261809]},"#ff77ee":{"lch":[69.9154621504300593,95.9376886025569604,314.973456368277198],"luv":[69.9154621504300593,67.8067552495039791,-67.8696105553513149],"rgb":[1,0.466666666666666674,0.933333333333333348],"xyz":[0.632665908299231861,0.406293639950878638,0.854017239020563],"hpluv":[314.973456368277198,174.122680701596721,69.9154621504300593],"hsluv":[314.973456368277198,100.000000000001535,69.9154621504300593]},"#ff77ff":{"lch":[70.6471031550122,103.213892868752552,307.715012949244283],"luv":[70.6471031550122,63.1394826173239494,-81.6487196221654],"rgb":[1,0.466666666666666674,1],"xyz":[0.658836956709063282,0.416762059314811362,0.99185142731234488],"hpluv":[307.715012949244283,185.388643374650655,70.6471031550122],"hsluv":[307.715012949244283,100.000000000001975,70.6471031550122]},"#ff8800":{"lch":[68.6580440198892603,118.150361410828182,32.8458067740872153],"luv":[68.6580440198892603,99.2620471866307383,64.0823992202883375],"rgb":[1,0.533333333333333326,0],"xyz":[0.500428538032203774,0.388714483404019873,0.0486767316376747472],"hpluv":[32.8458067740872153,218.364961888913399,68.6580440198892603],"hsluv":[32.8458067740872153,100.000000000002245,68.6580440198892603]},"#ff8811":{"lch":[68.6874112197728408,117.19102013872596,32.4606037779481582],"luv":[68.6874112197728408,98.8811760474647485,62.89871401408422],"rgb":[1,0.533333333333333326,0.0666666666666666657],"xyz":[0.501440203531840933,0.389119149603874726,0.0540048366024303769],"hpluv":[32.4606037779481582,216.499308154785638,68.6874112197728408],"hsluv":[32.4606037779481582,100.000000000000739,68.6874112197728408]},"#ff8822":{"lch":[68.7417963707939492,115.443262249268372,31.7362513605757321],"luv":[68.7417963707939492,98.1820090833864754,60.724294076614548],"rgb":[1,0.533333333333333326,0.133333333333333331],"xyz":[0.503315561670317879,0.389869292859265526,0.0638817227984095765],"hpluv":[31.7362513605757321,213.101761826290613,68.7417963707939492],"hsluv":[31.7362513605757321,100.000000000000668,68.7417963707939492]},"#ff8833":{"lch":[68.8311889682804292,112.651741292777714,30.5141745142023382],"luv":[68.8311889682804292,97.0498776480180823,57.1990914683060439],"rgb":[1,0.533333333333333326,0.2],"xyz":[0.506403312402775696,0.391104393152248653,0.0801438766560207128],"hpluv":[30.5141745142023382,207.678703624478942,68.8311889682804292],"hsluv":[30.5141745142023382,100.000000000000824,68.8311889682804292]},"#ff8844":{"lch":[68.9599197258043688,108.808998086617962,28.6842020071901302],"luv":[68.9599197258043688,95.4557990826346554,52.2263198599069725],"rgb":[1,0.533333333333333326,0.266666666666666663],"xyz":[0.510861307646994556,0.392887591249936219,0.103622651608907351],"hpluv":[28.6842020071901302,200.2199693629492,68.9599197258043688],"hsluv":[28.6842020071901302,100.000000000000838,68.9599197258043688]},"#ff8855":{"lch":[69.1314852187197602,104.012526361958052,26.1137258191789492],"luv":[69.1314852187197602,93.395152113439849,45.7815596272609682],"rgb":[1,0.533333333333333326,0.333333333333333315],"xyz":[0.516823721686356485,0.39527255686568108,0.135024698882881267],"hpluv":[26.1137258191789492,190.918970683811096,69.1314852187197602],"hsluv":[26.1137258191789492,100.000000000000867,69.1314852187197602]},"#ff8866":{"lch":[69.3487452092138881,98.4723154092605171,22.6389332988698087],"luv":[69.3487452092138881,90.8849122177262529,37.9042165627661802],"rgb":[1,0.533333333333333326,0.4],"xyz":[0.524408717459864726,0.398306555175084398,0.174972343290025228],"hpluv":[22.6389332988698087,180.183437843423292,69.3487452092138881],"hsluv":[22.6389332988698087,100.000000000001066,69.3487452092138881]},"#ff8877":{"lch":[69.6140261744794344,92.5206854303452246,18.0637242730473773],"luv":[69.6140261744794344,87.9605480867009248,28.6883114314535526],"rgb":[1,0.533333333333333326,0.466666666666666674],"xyz":[0.533722730480066576,0.402032160383165194,0.224026145196423138],"hpluv":[18.0637242730473773,168.648085666048672,69.6140261744794344],"hsluv":[18.0637242730473773,100.000000000001108,69.6140261744794344]},"#ff8888":{"lch":[69.9291829132988596,86.6211090413054,12.1770506300619186],"luv":[69.9291829132988596,84.672173963834382,18.2712749359175248],"rgb":[1,0.533333333333333326,0.533333333333333326],"xyz":[0.544863147582010487,0.406488327223942791,0.282699008599995305],"hpluv":[12.1770506300619186,157.182652238587849,69.9291829132988596],"hsluv":[12.1770506300619186,100.000000000001251,69.9291829132988596]},"#ff8899":{"lch":[70.29563969089034,81.3665448969888274,4.80888772903122597],"luv":[70.29563969089034,81.0801238487794791,6.82115423812421362],"rgb":[1,0.533333333333333326,0.6],"xyz":[0.557920111691083132,0.411711112867571949,0.351465686241113184],"hpluv":[4.80888772903122597,146.878021536398364,70.29563969089034],"hsluv":[4.80888772903122597,100.00000000000135,70.29563969089034]},"#ff88aa":{"lch":[70.7144212664750427,77.4442353273614827,355.944797831634332],"luv":[70.7144212664750427,77.2503443699940533,-5.47666688388778589],"rgb":[1,0.533333333333333326,0.66666666666666663],"xyz":[0.572977804656335743,0.417734190053673071,0.430769535858111841],"hpluv":[355.944797831634332,138.969799542374091,70.7144212664750427],"hsluv":[355.944797831634332,100.000000000001648,70.7144212664750427]},"#ff88bb":{"lch":[71.1861792611668847,75.5334875912487718,345.875835641341098],"luv":[71.1861792611668847,73.2500487000805,-18.431986141845023],"rgb":[1,0.533333333333333326,0.733333333333333282],"xyz":[0.590115396763672306,0.42458922689660783,0.521027520956753532],"hpluv":[345.875835641341098,134.642814203514433,71.1861792611668847],"hsluv":[345.875835641341098,100.000000000001776,71.1861792611668847]},"#ff88cc":{"lch":[71.711216864189268,76.1313589407537563,335.260476444218114],"luv":[71.711216864189268,69.1440007334156377,-31.8604924121286039],"rgb":[1,0.533333333333333326,0.8],"xyz":[0.609407772207394061,0.432306177074096631,0.622634031627023687],"hpluv":[335.260476444218114,134.714956877670915,71.711216864189268],"hsluv":[335.260476444218114,100.000000000001933,71.711216864189268]},"#ff88dd":{"lch":[72.2895135005839649,79.3885839073469413,324.950129439258774],"luv":[72.2895135005839649,64.9916618916399784,-45.5920074067441803],"rgb":[1,0.533333333333333326,0.866666666666666696],"xyz":[0.63092609775802766,0.440913507294350138,0.735963879527029685],"hpluv":[324.950129439258774,139.354847315526115,72.2895135005839649],"hsluv":[324.950129439258774,100.000000000002245,72.2895135005839649]},"#ff88ee":{"lch":[72.9207502525545124,85.0855243828499,315.651995307064169],"luv":[72.9207502525545124,60.845281511842515,-59.4760302748021203],"rgb":[1,0.533333333333333326,0.933333333333333348],"xyz":[0.654738278024202369,0.450438379400820155,0.861374695595552908],"hpluv":[315.651995307064169,148.062090862911901,72.9207502525545124],"hsluv":[315.651995307064169,100.000000000002444,72.9207502525545124]},"#ff88ff":{"lch":[73.6043362991539709,92.7672005781522842,307.715012949244624],"luv":[73.6043362991539709,56.7488822053271349,-73.3847250560567375],"rgb":[1,0.533333333333333326,1],"xyz":[0.68090932643403379,0.460906798764752879,0.999208883887334753],"hpluv":[307.715012949244624,159.930161835956909,73.6043362991539709],"hsluv":[307.715012949244624,100.000000000002771,73.6043362991539709]},"#ff9900":{"lch":[72.2588108283115389,109.907462524380705,39.4434130396340095],"luv":[72.2588108283115389,84.8763034831777077,69.8259509464759418],"rgb":[1,0.6,0],"xyz":[0.526298138484671219,0.440453684308955595,0.057299931788497],"hpluv":[39.4434130396340095,193.008172097547572,72.2588108283115389],"hsluv":[39.4434130396340095,100.000000000002288,72.2588108283115389]},"#ff9911":{"lch":[72.2858317740783889,108.970035258541955,39.0927051304156805],"luv":[72.2858317740783889,84.5745536570817791,68.7139975401902348],"rgb":[1,0.6,0.0666666666666666657],"xyz":[0.527309803984308378,0.440858350508810448,0.0626280367532526389],"hpluv":[39.0927051304156805,191.2904264008464,72.2858317740783889],"hsluv":[39.0927051304156805,100.000000000001506,72.2858317740783889]},"#ff9922":{"lch":[72.3358777005795304,107.257428554778556,38.4317580680427469],"luv":[72.3358777005795304,84.0200042697796,66.6692947517044274],"rgb":[1,0.6,0.133333333333333331],"xyz":[0.529185162122785324,0.441608493764201249,0.0725049229492318315],"hpluv":[38.4317580680427469,188.15378179700545,72.3358777005795304],"hsluv":[38.4317580680427469,100.00000000000145,72.3358777005795304]},"#ff9933":{"lch":[72.418154282067718,104.508625212907305,37.3122251519614778],"luv":[72.418154282067718,83.1203251002183237,63.3487513620113845],"rgb":[1,0.6,0.2],"xyz":[0.532272912855243141,0.442843594057184375,0.0887670768068429816],"hpluv":[37.3122251519614778,183.123470124205028,72.418154282067718],"hsluv":[37.3122251519614778,100.00000000000162,72.418154282067718]},"#ff9944":{"lch":[72.5366731246789556,100.695423976150749,35.6250099256014607],"luv":[72.5366731246789556,81.8499313718691326,58.6528528219818952],"rgb":[1,0.6,0.266666666666666663],"xyz":[0.536730908099462,0.444626792154871942,0.11224585175972962],"hpluv":[35.6250099256014607,176.153561585765658,72.5366731246789556],"hsluv":[35.6250099256014607,100.000000000001748,72.5366731246789556]},"#ff9955":{"lch":[72.6946936633514582,95.8821930466240673,33.2320443565807508],"luv":[72.6946936633514582,80.201421842029859,52.5464259293328269],"rgb":[1,0.6,0.333333333333333315],"xyz":[0.54269332213882393,0.447011757770616802,0.143647899033703508],"hpluv":[33.2320443565807508,167.368827825995851,72.6946936633514582],"hsluv":[33.2320443565807508,100.000000000001705,72.6946936633514582]},"#ff9966":{"lch":[72.8949069034106,90.2347392462793749,29.9516480142673025],"luv":[72.8949069034106,78.1836232693519406,45.0514064077924345],"rgb":[1,0.6,0.4],"xyz":[0.550278317912332171,0.450045756080020121,0.183595543440847497],"hpluv":[29.9516480142673025,157.078197331028889,72.8949069034106],"hsluv":[29.9516480142673025,100.000000000001819,72.8949069034106]},"#ff9977":{"lch":[73.1395321193821,84.0351966301436,25.5464816978182121],"luv":[73.1395321193821,75.8195571045914,36.2396058633438045],"rgb":[1,0.6,0.466666666666666674],"xyz":[0.559592330932534,0.453771361288100916,0.232649345347245406],"hpluv":[25.5464816978182121,145.796926659053128,73.1395321193821],"hsluv":[25.5464816978182121,100.000000000002018,73.1395321193821]},"#ff9988":{"lch":[73.430374185650777,77.702838567593929,19.7240568661095921],"luv":[73.430374185650777,73.1439295084068419,26.2239718107454713],"rgb":[1,0.6,0.533333333333333326],"xyz":[0.570732748034477932,0.458227528128878514,0.291322208750817546],"hpluv":[19.7240568661095921,134.276641294628575,73.430374185650777],"hsluv":[19.7240568661095921,100.000000000002203,73.430374185650777]},"#ff9999":{"lch":[73.76886125649402,71.8160022700114098,12.1770506300620251],"luv":[73.76886125649402,70.2001752793754,15.1483851545719261],"rgb":[1,0.6,0.6],"xyz":[0.583789712143550577,0.463450313772507672,0.360088886391935481],"hpluv":[12.1770506300620251,123.534275619879125,73.76886125649402],"hsluv":[12.1770506300620251,100.000000000002331,73.76886125649402]},"#ff99aa":{"lch":[74.1560723225582592,67.1124973440613,2.7130535693684088],"luv":[74.1560723225582592,67.0372720786985923,3.17670458229478481],"rgb":[1,0.6,0.66666666666666663],"xyz":[0.598847405108803188,0.469473390958608794,0.439392736008934082],"hpluv":[2.7130535693684088,114.840746523486033,74.1560723225582592],"hsluv":[2.7130535693684088,100.00000000000253,74.1560723225582592]},"#ff99bb":{"lch":[74.5927597146433925,64.4136927281220864,351.502648062184],"luv":[74.5927597146433925,63.7066038913843187,-9.51800564715024322],"rgb":[1,0.6,0.733333333333333282],"xyz":[0.615984997216139751,0.476328427801543552,0.529650721107575828],"hpluv":[351.502648062184,109.577363966618833,74.5927597146433925],"hsluv":[351.502648062184,100.000000000002615,74.5927597146433925]},"#ff99cc":{"lch":[75.0793694015197,64.4152606478183145,339.305696269483292],"luv":[75.0793694015197,60.259134450288677,-22.7631834247409977],"rgb":[1,0.6,0.8],"xyz":[0.635277372659861506,0.484045377979032354,0.631257231777846],"hpluv":[339.305696269483292,108.869813431806975,75.0793694015197],"hsluv":[339.305696269483292,100.000000000002871,75.0793694015197]},"#ff99dd":{"lch":[75.6160606971696296,67.4118390527965232,327.324068761847229],"luv":[75.6160606971696296,56.7430830794555,-36.3947601601954887],"rgb":[1,0.6,0.866666666666666696],"xyz":[0.656795698210495105,0.49265270819928586,0.744587079677852],"hpluv":[327.324068761847229,113.125745227459021,75.6160606971696296],"hsluv":[327.324068761847229,100.00000000000324,75.6160606971696296]},"#ff99ee":{"lch":[76.202726253448489,73.1905233351813393,316.627151984536795],"luv":[76.202726253448489,53.2022056350908201,-50.2630880631028845],"rgb":[1,0.6,0.933333333333333348],"xyz":[0.680607878476669814,0.502177580305755877,0.869997895746375205],"hpluv":[316.627151984536795,123.107716827744753,76.202726253448489],"hsluv":[316.627151984536795,100.000000000003524,76.202726253448489]},"#ff99ff":{"lch":[76.8390127436129,81.2030526869262275,307.715012949245],"luv":[76.8390127436129,49.6746958291708154,-64.2367524082209229],"rgb":[1,0.6,1],"xyz":[0.706778926886501235,0.512645999669688601,1.00783208403815694],"hpluv":[307.715012949245,141.150312559224801,76.8390127436129],"hsluv":[307.715012949245,100.000000000003752,76.8390127436129]},"#ee0000":{"lch":[49.7142799595632,167.190689697178925,12.1770506300617765],"luv":[49.7142799595632,163.428976145092918,35.2660811203203934],"rgb":[0.933333333333333348,0,0],"xyz":[0.352591085030832,0.181804778219026603,0.0165277071108199],"hpluv":[12.1770506300617765,426.746789183125202,49.7142799595632],"hsluv":[12.1770506300617765,100.000000000002217,49.7142799595632]},"#ee0011":{"lch":[49.7630000621001756,165.722449822455,11.6881730851639158],"luv":[49.7630000621001756,162.286136628676445,33.5729092170260728],"rgb":[0.933333333333333348,0,0.0666666666666666657],"xyz":[0.353602750530469079,0.182209444418881455,0.0218558120755755342],"hpluv":[11.6881730851639158,422.585038037937124,49.7630000621001756],"hsluv":[11.6881730851639158,99.9999999999963762,49.7630000621001756]},"#ee0022":{"lch":[49.8531236873270558,163.0858535413212,10.7756858750078184],"luv":[49.8531236873270558,160.210108449799208,30.4912573667411486],"rgb":[0.933333333333333348,0,0.133333333333333331],"xyz":[0.355478108668946136,0.182959587674272284,0.0317326982715547268],"hpluv":[10.7756858750078184,415.110044299310516,49.8531236873270558],"hsluv":[10.7756858750078184,99.9999999999964473,49.8531236873270558]},"#ee0033":{"lch":[50.000975779064234,158.977402767524836,9.25647316775448559],"luv":[50.000975779064234,156.907230803998146,25.5721628363475],"rgb":[0.933333333333333348,0,0.2],"xyz":[0.358565859401403841,0.184194687967255383,0.047994852129165877],"hpluv":[9.25647316775448559,403.456061197389261,50.000975779064234],"hsluv":[9.25647316775448559,99.9999999999965183,50.000975779064234]},"#ee0044":{"lch":[50.2132784041556164,153.529579514286212,7.02933300215353],"luv":[50.2132784041556164,152.375594335021788,18.7885613308314312],"rgb":[0.933333333333333348,0,0.266666666666666663],"xyz":[0.363023854645622757,0.185977886064942977,0.0714736270820525155],"hpluv":[7.02933300215353,387.983100931209492,50.2132784041556164],"hsluv":[7.02933300215353,99.9999999999966462,50.2132784041556164]},"#ee0055":{"lch":[50.4951150037793326,147.071833727726926,3.99754465361350508],"luv":[50.4951150037793326,146.714013644902735,10.2529252527975352],"rgb":[0.933333333333333348,0,0.333333333333333315],"xyz":[0.368986268684984742,0.188362851680687809,0.102875674356026417],"hpluv":[3.99754465361350508,369.589367027053072,50.4951150037793326],"hsluv":[3.99754465361350508,99.999999999996831,50.4951150037793326]},"#ee0066":{"lch":[50.8502318550204109,140.098840030056522,0.0757634158231174915],"luv":[50.8502318550204109,140.0987175463531,0.185255592479522613],"rgb":[0.933333333333333348,0,0.4],"xyz":[0.376571264458492927,0.1913968499900911,0.142823318763170393],"hpluv":[0.0757634158231174915,349.60765112382461,50.8502318550204109],"hsluv":[0.0757634158231174915,99.9999999999970584,50.8502318550204109]},"#ee0077":{"lch":[51.2812017254514956,133.219993530026585,355.209470699020642],"luv":[51.2812017254514956,132.754613083251769,-11.1256182415379214],"rgb":[0.933333333333333348,0,0.466666666666666674],"xyz":[0.385885277478694833,0.195122455198171924,0.191877120669568302],"hpluv":[355.209470699020642,329.648072606093592,51.2812017254514956],"hsluv":[355.209470699020642,99.9999999999973284,51.2812017254514956]},"#ee0088":{"lch":[51.7895361854883163,127.090944021268115,349.407446028193533],"luv":[51.7895361854883163,124.925218603260163,-23.3623160055840167],"rgb":[0.933333333333333348,0,0.533333333333333326],"xyz":[0.397025694580638633,0.199578622038949521,0.250549984073140442],"hpluv":[349.407446028193533,311.395197619459395,51.7895361854883163],"hsluv":[349.407446028193533,99.9999999999974705,51.7895361854883163]},"#ee0099":{"lch":[52.3757812732210652,122.329563392952366,342.780178840499048],"luv":[52.3757812732210652,116.846263825073436,-36.2142611415956637],"rgb":[0.933333333333333348,0,0.6],"xyz":[0.410082658689711388,0.204801407682578679,0.319316661714258376],"hpluv":[342.780178840499048,296.374093031221,52.3757812732210652],"hsluv":[342.780178840499048,99.9999999999978,52.3757812732210652]},"#ee00aa":{"lch":[53.0396114453995722,119.424239873739239,335.563712743666827],"luv":[53.0396114453995722,108.726436909364494,-49.403552366347],"rgb":[0.933333333333333348,0,0.66666666666666663],"xyz":[0.425140351654963888,0.210824484868679773,0.398620511331257],"hpluv":[335.563712743666827,285.713971708863653,53.0396114453995722],"hsluv":[335.563712743666827,99.999999999998,53.0396114453995722]},"#ee00bb":{"lch":[53.779927529436435,118.655378520732356,328.101249142938343],"luv":[53.779927529436435,100.736423933687789,-62.6998544252744381],"rgb":[0.933333333333333348,0,0.733333333333333282],"xyz":[0.442277943762300563,0.217679521711614532,0.488878496429898723],"hpluv":[328.101249142938343,279.966806180862307,53.779927529436435],"hsluv":[328.101249142938343,99.9999999999982094,53.779927529436435]},"#ee00cc":{"lch":[54.5949595671901,120.061129768120921,320.773339602207614],"luv":[54.5949595671901,93.0053918954961,-75.9254368414351575],"rgb":[0.933333333333333348,0,0.8],"xyz":[0.461570319206022317,0.225396471889103334,0.590485007100168824],"hpluv":[320.773339602207614,279.054611328209262,54.5949595671901],"hsluv":[320.773339602207614,99.9999999999984,54.5949595671901]},"#ee00dd":{"lch":[55.4823728661035744,123.466264594666441,313.907226483092529],"luv":[55.4823728661035744,85.6229535549924634,-88.9529556421808252],"rgb":[0.933333333333333348,0,0.866666666666666696],"xyz":[0.483088644756655805,0.234003802109356868,0.703814855000174822],"hpluv":[313.907226483092529,282.379138449157608,55.4823728661035744],"hsluv":[313.907226483092529,99.9999999999986215,55.4823728661035744]},"#ee00ee":{"lch":[56.4393743497109597,128.559742977308588,307.715012949243601],"luv":[56.4393743497109597,78.644409501394918,-101.698890694877051],"rgb":[0.933333333333333348,0,0.933333333333333348],"xyz":[0.506900825022830626,0.243528674215826912,0.829225671068698],"hpluv":[307.715012949243601,289.042783730483393,56.4393743497109597],"hsluv":[307.715012949243601,99.9999999999988489,56.4393743497109597]},"#ee00ff":{"lch":[57.4628159598150745,134.982567880189606,302.284502363601803],"luv":[57.4628159598150745,72.0973885084188879,-114.115118199983058],"rgb":[0.933333333333333348,0,1],"xyz":[0.533071873432661936,0.253997093579759636,0.96705985936047989],"hpluv":[302.284502363601803,298.078126285043766,57.4628159598150745],"hsluv":[302.284502363601803,99.9999999999989484,57.4628159598150745]},"#ee1100":{"lch":[50.1937733395544683,164.746074066243921,12.6667024036514828],"luv":[50.1937733395544683,160.736507742479517,36.1253927174799117],"rgb":[0.933333333333333348,0.0666666666666666657,0],"xyz":[0.354595485291760382,0.185813578740883473,0.0171958405311293527],"hpluv":[12.6667024036514828,416.489977947977081,50.1937733395544683],"hsluv":[12.6667024036514828,100.000000000002245,50.1937733395544683]},"#ee1111":{"lch":[50.2417909300708345,163.305921695383518,12.1770506300617907],"luv":[50.2417909300708345,159.631613634988071,34.4466542507197317],"rgb":[0.933333333333333348,0.0666666666666666657,0.0666666666666666657],"xyz":[0.355607150791397486,0.186218244940738326,0.0225239454958849825],"hpluv":[12.1770506300617907,412.454596338970589,50.2417909300708345],"hsluv":[12.1770506300617907,96.6508962208003197,50.2417909300708345]},"#ee1122":{"lch":[50.3306190654122219,160.718934991358793,11.2629010575952293],"luv":[50.3306190654122219,157.623701713525833,31.390201064696047],"rgb":[0.933333333333333348,0.0666666666666666657,0.133333333333333331],"xyz":[0.357482508929874543,0.186968388196129154,0.032400831691864182],"hpluv":[11.2629010575952293,405.204351077732667,50.3306190654122219],"hsluv":[11.2629010575952293,96.6948337079543592,50.3306190654122219]},"#ee1133":{"lch":[50.4763571232054318,156.685700791802191,9.74029685215880647],"luv":[50.4763571232054318,154.427033260746356,26.5084935615454427],"rgb":[0.933333333333333348,0.0666666666666666657,0.2],"xyz":[0.360570259662332249,0.188203488489112253,0.0486629855494753252],"hpluv":[9.74029685215880647,393.895198182016713,50.4763571232054318],"hsluv":[9.74029685215880647,96.7647175585846,50.4763571232054318]},"#ee1144":{"lch":[50.6856484752898382,151.333831494518165,7.50679337730589413],"luv":[50.6856484752898382,150.036806479185287,19.7708183022028514],"rgb":[0.933333333333333348,0.0666666666666666657,0.266666666666666663],"xyz":[0.365028254906551164,0.189986686586799847,0.0721417605023619568],"hpluv":[7.50679337730589413,378.870112575267399,50.6856484752898382],"hsluv":[7.50679337730589413,96.8605546889772455,50.6856484752898382]},"#ee1155":{"lch":[50.9635312364098496,144.984673036864649,4.46374659640210858],"luv":[50.9635312364098496,144.544902405536135,11.283909082431693],"rgb":[0.933333333333333348,0.0666666666666666657,0.333333333333333315],"xyz":[0.370990668945913149,0.19237165220254468,0.103543807776335872],"hpluv":[4.46374659640210858,360.995599227985224,50.9635312364098496],"hsluv":[4.46374659640210858,96.9801964566503,50.9635312364098496]},"#ee1166":{"lch":[51.3137360134299598,138.123816003378664,0.523151936541392],"luv":[51.3137360134299598,138.118058344046318,1.26115288756691357],"rgb":[0.933333333333333348,0.0666666666666666657,0.4],"xyz":[0.378575664719421334,0.19540565051194797,0.143491452183479834],"hpluv":[0.523151936541392,341.565705345826359,51.3137360134299598],"hsluv":[0.523151936541392,97.1198273857598764,51.3137360134299598]},"#ee1177":{"lch":[51.7388469835676119,131.353183798903302,355.627348241097309],"luv":[51.7388469835676119,130.970848560864681,-10.014775152519368],"rgb":[0.933333333333333348,0.0666666666666666657,0.466666666666666674],"xyz":[0.38788967773962324,0.199131255720028794,0.192545254089877743],"hpluv":[355.627348241097309,322.153744971780554,51.7388469835676119],"hsluv":[355.627348241097309,97.2745732157476,51.7388469835676119]},"#ee1188":{"lch":[52.2404115410600411,125.324707533591734,349.782339698165117],"luv":[52.2404115410600411,123.337180279157977,-22.2311106147846438],"rgb":[0.933333333333333348,0.0666666666666666657,0.533333333333333326],"xyz":[0.39903009484156704,0.203587422560806391,0.251218117493449911],"hpluv":[349.782339698165117,304.417375015566734,52.2404115410600411],"hsluv":[349.782339698165117,97.4391430985313605,52.2404115410600411]},"#ee1199":{"lch":[52.819032808459994,120.657103381490217,343.097768544337384],"luv":[52.819032808459994,115.44498939014953,-35.079780802050081],"rgb":[0.933333333333333348,0.0666666666666666657,0.6],"xyz":[0.412087058950639795,0.208810208204435549,0.31998479513456779],"hpluv":[343.097768544337384,289.869003225703352,52.819032808459994],"hsluv":[343.097768544337384,97.6083995478766298,52.819032808459994]},"#ee11aa":{"lch":[53.4744599034404615,117.843047501566133,335.812437212199143],"luv":[53.4744599034404615,107.497497568615216,-48.2832461723726496],"rgb":[0.933333333333333348,0.0666666666666666657,0.66666666666666663],"xyz":[0.427144751915892296,0.214833285390536644,0.399288644751566446],"hpluv":[335.812437212199143,279.638449078323276,53.4744599034404615],"hsluv":[335.812437212199143,97.7777799659692,53.4744599034404615]},"#ee11bb":{"lch":[54.205681814132376,117.167943285093472,328.276238054291071],"luv":[54.205681814132376,99.6622453247977376,-61.6097702517929662],"rgb":[0.933333333333333348,0.0666666666666666657,0.733333333333333282],"xyz":[0.44428234402322897,0.221688322233471402,0.489546629850208137],"hpluv":[328.276238054291071,274.285798241860448,54.205681814132376],"hsluv":[328.276238054291071,97.9435422525978652,54.205681814132376]},"#ee11cc":{"lch":[55.0110259993956703,118.672848043699901,320.878255441103249],"luv":[55.0110259993956703,92.0672263164348266,-74.8790404666182781],"rgb":[0.933333333333333348,0.0666666666666666657,0.8],"xyz":[0.463574719466950724,0.229405272410960204,0.591153140520478293],"hpluv":[320.878255441103249,273.741691636115945,55.0110259993956703],"hsluv":[320.878255441103249,98.102849778989,55.0110259993956703]},"#ee11dd":{"lch":[55.8882602794840864,122.182226882396691,313.952719233652829],"luv":[55.8882602794840864,84.8023500190691522,-87.9605479586430334],"rgb":[0.933333333333333348,0.0666666666666666657,0.866666666666666696],"xyz":[0.485093045017584212,0.238012602631213738,0.704482988420484291],"hpluv":[313.952719233652829,277.412976370396279,55.8882602794840864],"hsluv":[313.952719233652829,98.2537358693348608,55.8882602794840864]},"#ee11ee":{"lch":[56.83469533821048,127.382376320214306,307.715012949243601],"luv":[56.83469533821048,77.9241738866570302,-100.767519176899128],"rgb":[0.933333333333333348,0.0666666666666666657,0.933333333333333348],"xyz":[0.508905225283758922,0.247537474737683783,0.829893804489007514],"hpluv":[307.715012949243601,284.403630900032795,56.83469533821048],"hsluv":[307.715012949243601,98.3949944120453495,56.83469533821048]},"#ee11ff":{"lch":[57.8472847680859275,133.910906422249354,302.2526850652647],"luv":[57.8472847680859275,71.4621107907268254,-113.248830369952643],"rgb":[0.933333333333333348,0.0666666666666666657,1],"xyz":[0.535076273693590343,0.258005894101616451,0.967727992780789359],"hpluv":[302.2526850652647,293.746227206253536,57.8472847680859275],"hsluv":[302.2526850652647,99.99999999999892,57.8472847680859275]},"#ee2200":{"lch":[51.0646940471157222,160.407609402057773,13.5847947923325787],"luv":[51.0646940471157222,155.919944837816502,37.677207378671163],"rgb":[0.933333333333333348,0.133333333333333331,0],"xyz":[0.358311109026528296,0.19324482621041944,0.018434381776051962],"hpluv":[13.5847947923325787,398.605749597291435,51.0646940471157222],"hsluv":[13.5847947923325787,100.000000000002203,51.0646940471157222]},"#ee2211":{"lch":[51.1114738997186322,159.015005648229618,13.0939108674416342],"luv":[51.1114738997186322,154.880623331235768,36.0244991337056817],"rgb":[0.933333333333333348,0.133333333333333331,0.0666666666666666657],"xyz":[0.3593227745261654,0.193649492410274293,0.0237624867408075952],"hpluv":[13.0939108674416342,394.783534202752207,51.1114738997186322],"hsluv":[13.0939108674416342,96.7702863870018462,51.1114738997186322]},"#ee2222":{"lch":[51.1980191888258105,156.511980987808,12.1770506300618031],"luv":[51.1980191888258105,152.990533465747774,33.0135860305098348],"rgb":[0.933333333333333348,0.133333333333333331,0.133333333333333331],"xyz":[0.361198132664642457,0.194399635665665121,0.0336393729367867877],"hpluv":[12.1770506300618031,387.912483642854795,51.1980191888258105],"hsluv":[12.1770506300618031,90.899918517349,51.1980191888258105]},"#ee2233":{"lch":[51.340031013958,152.605977320930094,10.6487510890373542],"luv":[51.340031013958,149.977869701108148,28.1996970549978769],"rgb":[0.933333333333333348,0.133333333333333331,0.2],"xyz":[0.364285883397100163,0.19563473595864822,0.0499015267943979379],"hpluv":[10.6487510890373542,377.185287566809563,51.340031013958],"hsluv":[10.6487510890373542,91.0856949770771,51.340031013958]},"#ee2244":{"lch":[51.5440125284501391,147.416232714385046,8.4042516634418849],"luv":[51.5440125284501391,145.833202035739902,21.5458314229178391],"rgb":[0.933333333333333348,0.133333333333333331,0.266666666666666663],"xyz":[0.368743878641319078,0.197417934056335814,0.0733803017472845764],"hpluv":[8.4042516634418849,362.916246958463432,51.5440125284501391],"hsluv":[8.4042516634418849,91.3409150161676848,51.5440125284501391]},"#ee2255":{"lch":[51.8149196409757,141.25016266814734,5.34127242035781613],"luv":[51.8149196409757,140.636840571385164,13.1486701942394504],"rgb":[0.933333333333333348,0.133333333333333331,0.333333333333333315],"xyz":[0.374706292680681063,0.199802899672080647,0.104782349021258478],"hpluv":[5.34127242035781613,345.918233291596209,51.8149196409757],"hsluv":[5.34127242035781613,91.6602615743055082,51.8149196409757]},"#ee2266":{"lch":[52.1564522427987924,134.577740656965489,1.36671179444129165],"luv":[52.1564522427987924,134.539455426625494,3.20986196595936],"rgb":[0.933333333333333348,0.133333333333333331,0.4],"xyz":[0.382291288454189249,0.202836897981483938,0.144729993428402454],"hpluv":[1.36671179444129165,327.419481975304109,52.1564522427987924],"hsluv":[1.36671179444129165,92.0339967122243365,52.1564522427987924]},"#ee2277":{"lch":[52.5712108639856694,127.988129961564283,356.416786702014292],"luv":[52.5712108639856694,127.737923683219179,-7.99901644943552803],"rgb":[0.933333333333333348,0.133333333333333331,0.466666666666666674],"xyz":[0.391605301474391154,0.206562503189564761,0.193783795334800363],"hpluv":[356.416786702014292,308.930679724572485,52.5712108639856694],"hsluv":[356.416786702014292,92.4494947830095,52.5712108639856694]},"#ee2288":{"lch":[53.0608018273771194,122.127216672078461,350.491948161024197],"luv":[53.0608018273771194,120.449481512132621,-20.1737318195523763],"rgb":[0.933333333333333348,0.133333333333333331,0.533333333333333326],"xyz":[0.402745718576334955,0.211018670030342359,0.25245665873837253],"hpluv":[350.491948161024197,292.063965437042782,53.0608018273771194],"hsluv":[350.491948161024197,92.892885362452958,53.0608018273771194]},"#ee2299":{"lch":[53.6259244704506557,117.615935516390621,343.699890485995525],"luv":[53.6259244704506557,112.888334232708232,-33.0110933105844282],"rgb":[0.933333333333333348,0.133333333333333331,0.6],"xyz":[0.415802682685407654,0.216241455673971517,0.32122333637949041],"hpluv":[343.699890485995525,278.311211390643507,53.6259244704506557],"hsluv":[343.699890485995525,93.3505397228777412,53.6259244704506557]},"#ee22aa":{"lch":[54.266455218013121,114.955451111725907,336.284451026203612],"luv":[54.266455218013121,105.247863162980167,-46.2346519390706305],"rgb":[0.933333333333333348,0.133333333333333331,0.66666666666666663],"xyz":[0.43086037565066021,0.222264532860072611,0.400527185996489],"hpluv":[336.284451026203612,268.805062052359688,54.266455218013121],"hsluv":[336.284451026203612,93.8102001508292,54.266455218013121]},"#ee22bb":{"lch":[54.981534566577821,114.440827463928798,328.608334651454868],"luv":[54.981534566577821,97.6897319326175,-59.6105633722921],"rgb":[0.933333333333333348,0.133333333333333331,0.733333333333333282],"xyz":[0.447997967757996884,0.22911956970300737,0.490785171095130757],"hpluv":[328.608334651454868,264.121319791368,54.981534566577821],"hsluv":[328.608334651454868,94.2616688954678636,54.981534566577821]},"#ee22cc":{"lch":[55.7696584616915629,116.118636638570607,321.077185717181408],"luv":[55.7696584616915629,90.3394913251054419,-72.9541916679335856],"rgb":[0.933333333333333348,0.133333333333333331,0.8],"xyz":[0.467290343201718583,0.236836519880496171,0.592391681765400913],"hpluv":[321.077185717181408,264.206361207665168,55.7696584616915629],"hsluv":[321.077185717181408,94.6970823725699518,55.7696584616915629]},"#ee22dd":{"lch":[56.6287730491083749,119.812596042269817,314.038835862099],"luv":[56.6287730491083749,83.2872216309056,-86.1295354880806201],"rgb":[0.933333333333333348,0.133333333333333331,0.866666666666666696],"xyz":[0.488808668752352182,0.245443850100749705,0.70572152966540691],"hpluv":[314.038835862099,268.475495638829329,56.6287730491083749],"hsluv":[314.038835862099,95.1108639535381,56.6287730491083749]},"#ee22ee":{"lch":[57.5563705104872128,125.203701850491953,307.715012949243658],"luv":[57.5563705104872128,76.5914038981754,-99.0440498261932163],"rgb":[0.933333333333333348,0.133333333333333331,0.933333333333333348],"xyz":[0.512620849018526892,0.254968722207219722,0.831132345733930133],"hpluv":[307.715012949243658,276.03432908057755,57.5563705104872128],"hsluv":[307.715012949243658,95.4994708803944263,57.5563705104872128]},"#ee22ff":{"lch":[58.5495832280214046,131.922896299071255,302.192710378625122],"luv":[58.5495832280214046,70.2843784028787582,-111.641196341030223],"rgb":[0.933333333333333348,0.133333333333333331,1],"xyz":[0.538791897428358313,0.265437141571152446,0.968966534025712],"hpluv":[302.192710378625122,285.914180736870946,58.5495832280214046],"hsluv":[302.192710378625122,99.9999999999989,58.5495832280214046]},"#ee3300":{"lch":[52.4512471844783761,153.77210005382733,15.1254552240259841],"luv":[52.4512471844783761,148.444942331914945,40.1242800687903269],"rgb":[0.933333333333333348,0.2,0],"xyz":[0.364428831115539142,0.205480270388441244,0.0204736224723888437],"hpluv":[15.1254552240259841,372.015515114283232,52.4512471844783761],"hsluv":[15.1254552240259841,100.000000000002174,52.4512471844783761]},"#ee3311":{"lch":[52.4961529429458693,152.446596739109111,14.6331501802662043],"luv":[52.4961529429458693,147.501711829562538,38.5124637576621893],"rgb":[0.933333333333333348,0.2,0.0666666666666666657],"xyz":[0.365440496615176247,0.205884936588296097,0.0258017274371444769],"hpluv":[14.6331501802662043,368.493287978140756,52.4961529429458693],"hsluv":[14.6331501802662043,96.9493433827183395,52.4961529429458693]},"#ee3322":{"lch":[52.5792408568970302,150.061966488521733,13.7129404445972121],"luv":[52.5792408568970302,145.784540850223095,35.5733247742160685],"rgb":[0.933333333333333348,0.2,0.133333333333333331],"xyz":[0.367315854753653304,0.206635079843686925,0.0356786136331236695],"hpluv":[13.7129404445972121,362.155969729293304,52.5792408568970302],"hsluv":[13.7129404445972121,91.3983957113456,52.5792408568970302]},"#ee3333":{"lch":[52.7156069212027916,146.335083442311,12.177050630061796],"luv":[52.7156069212027916,143.042611430097821,30.8669396171076365],"rgb":[0.933333333333333348,0.2,0.2],"xyz":[0.370403605486111,0.207870180136670024,0.0519407674907348127],"hpluv":[12.177050630061796,352.248031751653059,52.7156069212027916],"hsluv":[12.177050630061796,82.5426319963487316,52.7156069212027916]},"#ee3344":{"lch":[52.9115382124740705,141.372894204534333,9.91688783885485314],"luv":[52.9115382124740705,139.260586308771792,24.3471623953096028],"rgb":[0.933333333333333348,0.2,0.266666666666666663],"xyz":[0.374861600730329925,0.209653378234357618,0.0754195424436214512],"hpluv":[9.91688783885485314,339.043238938553714,52.9115382124740705],"hsluv":[9.91688783885485314,83.0163224279527867,52.9115382124740705]},"#ee3355":{"lch":[53.1718605143623222,135.462446214194244,6.82400118051175664],"luv":[53.1718605143623222,134.502806079917804,16.0956357737583851],"rgb":[0.933333333333333348,0.2,0.333333333333333315],"xyz":[0.38082401476969191,0.212038343850102451,0.106821589717595367],"hpluv":[6.82400118051175664,323.278173463789,53.1718605143623222],"hsluv":[6.82400118051175664,83.6110915378108,53.1718605143623222]},"#ee3366":{"lch":[53.5002196972096158,129.050901787066266,2.79642975700151464],"luv":[53.5002196972096158,128.89722530875369,6.29607494868134765],"rgb":[0.933333333333333348,0.2,0.4],"xyz":[0.388409010543200095,0.215072342159505742,0.146769234124739328],"hpluv":[2.79642975700151464,306.086943567777439,53.5002196972096158],"hsluv":[2.79642975700151464,84.310080928774866,53.5002196972096158]},"#ee3377":{"lch":[53.8992319384372252,122.709031404530748,357.759441587930837],"luv":[53.8992319384372252,122.615219389586755,-4.79732866099687261],"rgb":[0.933333333333333348,0.2,0.466666666666666674],"xyz":[0.397723023563402,0.218797947367586565,0.195823036031137238],"hpluv":[357.759441587930837,288.89051161323988,53.8992319384372252],"hsluv":[357.759441587930837,85.0909052409050872,53.8992319384372252]},"#ee3388":{"lch":[54.3705825415329,117.074862235921088,351.703100554939169],"luv":[54.3705825415329,115.849509832295894,-16.8942131860788436],"rgb":[0.933333333333333348,0.2,0.533333333333333326],"xyz":[0.408863440665345801,0.223254114208364163,0.254495899434709405],"hpluv":[351.703100554939169,273.2366774905733,54.3705825415329],"hsluv":[351.703100554939169,85.9285066952877,54.3705825415329]},"#ee3399":{"lch":[54.9151057717267292,112.774715889061866,344.730687431692274],"luv":[54.9151057717267292,108.793611621096844,-29.6999430015709507],"rgb":[0.933333333333333348,0.2,0.6],"xyz":[0.4219204047744185,0.22847689985199332,0.323262577075827284],"hpluv":[344.730687431692274,260.590898768244074,54.9151057717267292],"hsluv":[344.730687431692274,86.7978129198036896,54.9151057717267292]},"#ee33aa":{"lch":[55.5328602544255,110.325325240584178,337.093995035693695],"luv":[55.5328602544255,101.625579555338021,-42.9408776049389047],"rgb":[0.933333333333333348,0.2,0.66666666666666663],"xyz":[0.436978097739671056,0.234499977038094415,0.402566426692825885],"hpluv":[337.093995035693695,252.095155701888757,55.5328602544255],"hsluv":[337.093995035693695,87.6758366884225779,55.5328602544255]},"#ee33bb":{"lch":[56.2232062298057826,110.03895679054483,329.178007243031175],"luv":[56.2232062298057826,94.4974163460242664,-56.3809392922602726],"rgb":[0.933333333333333348,0.2,0.733333333333333282],"xyz":[0.454115689847007731,0.241355013881029173,0.492824411791467631],"hpluv":[329.178007243031175,248.353441541401367,56.2232062298057826],"hsluv":[329.178007243031175,88.5430404155392665,56.2232062298057826]},"#ee33cc":{"lch":[56.9848866198670123,111.971807156825847,321.417898872172259],"luv":[56.9848866198670123,87.5300782585605788,-69.8295854062993726],"rgb":[0.933333333333333348,0.2,0.8],"xyz":[0.47340806529072943,0.249071964058517975,0.594430922461737787],"hpluv":[321.417898872172259,249.337916143678171,56.9848866198670123],"hsluv":[321.417898872172259,89.3839737673679764,56.9848866198670123]},"#ee33dd":{"lch":[57.8161114567543848,115.945977330727956,314.185904182223908],"luv":[57.8161114567543848,80.813036999634221,-83.1427850752753557],"rgb":[0.933333333333333348,0.2,0.866666666666666696],"xyz":[0.494926390841363029,0.257679294278771509,0.707760770361743785],"hpluv":[314.185904182223908,254.475591939392586,57.8161114567543848],"hsluv":[314.185904182223908,90.1873197259471482,57.8161114567543848]},"#ee33ee":{"lch":[58.7146439354817886,121.632779311923699,307.715012949243715],"luv":[58.7146439354817886,74.4069479563921448,-96.2192241652253415],"rgb":[0.933333333333333348,0.2,0.933333333333333348],"xyz":[0.518738571107537738,0.267204166385241526,0.833171586430267],"hpluv":[307.715012949243715,262.87151341613469,58.7146439354817886],"hsluv":[307.715012949243715,90.9455375510239747,58.7146439354817886]},"#ee33ff":{"lch":[59.6778857977730581,128.651158016084139,302.091050100274117],"luv":[59.6778857977730581,68.3480180420837229,-108.993893813362092],"rgb":[0.933333333333333348,0.2,1],"xyz":[0.544909619517369159,0.27767258574917425,0.971005774722048853],"hpluv":[302.091050100274117,273.551812848380507,59.6778857977730581],"hsluv":[302.091050100274117,99.9999999999986784,59.6778857977730581]},"#ee4400":{"lch":[54.3591594970822598,145.188828472067655,17.4116852889838647],"luv":[54.3591594970822598,138.536177662057611,43.4456372018905412],"rgb":[0.933333333333333348,0.266666666666666663,0],"xyz":[0.373261401598505183,0.223145411354373546,0.023417812633377437],"hpluv":[17.4116852889838647,338.922026437804789,54.3591594970822598],"hsluv":[17.4116852889838647,100.000000000002217,54.3591594970822598]},"#ee4411":{"lch":[54.4016650840252112,143.940172045268554,16.9187727396215735],"luv":[54.4016650840252112,137.710194578710485,41.8888462184768713],"rgb":[0.933333333333333348,0.266666666666666663,0.0666666666666666657],"xyz":[0.374273067098142287,0.223550077554228399,0.0287459175981330667],"hpluv":[16.9187727396215735,335.744689025208913,54.4016650840252112],"hsluv":[16.9187727396215735,97.1754310281257574,54.4016650840252112]},"#ee4422":{"lch":[54.4803236312215944,141.690847159829417,15.9963876830432117],"luv":[54.4803236312215944,136.204446081142294,39.0467032744039173],"rgb":[0.933333333333333348,0.266666666666666663,0.133333333333333331],"xyz":[0.376148425236619344,0.224300220809619227,0.0386228037941122662],"hpluv":[15.9963876830432117,330.020900264600868,54.4803236312215944],"hsluv":[15.9963876830432117,92.0288025918740118,54.4803236312215944]},"#ee4433":{"lch":[54.6094526105793534,138.167821982121467,14.4538486850626899],"luv":[54.6094526105793534,133.794673004457735,34.4867004352900608],"rgb":[0.933333333333333348,0.266666666666666663,0.2],"xyz":[0.37923617596907705,0.225535321102602326,0.0548849576517234095],"hpluv":[14.4538486850626899,321.054243711338643,54.6094526105793534],"hsluv":[14.4538486850626899,83.7991355104008591,54.6094526105793534]},"#ee4444":{"lch":[54.7950558424119549,133.462657054844783,12.1770506300618084],"luv":[54.7950558424119549,130.459808710538397,28.151716454753565],"rgb":[0.933333333333333348,0.266666666666666663,0.266666666666666663],"xyz":[0.383694171213295965,0.22731851920028992,0.078363732604610048],"hpluv":[12.1770506300618084,309.070617226475065,54.7950558424119549],"hsluv":[12.1770506300618084,79.6495466444067546,54.7950558424119549]},"#ee4455":{"lch":[55.04178262974213,127.837203216659944,9.0482956458548145],"luv":[55.04178262974213,126.246413461005446,20.1045670057943724],"rgb":[0.933333333333333348,0.266666666666666663,0.333333333333333315],"xyz":[0.38965658525265795,0.229703484816034753,0.109765779878583963],"hpluv":[9.0482956458548145,294.716259365516066,55.04178262974213],"hsluv":[9.0482956458548145,80.0457187830871106,55.04178262974213]},"#ee4466":{"lch":[55.3531965298607105,121.710491561886229,4.95183922571805102],"luv":[55.3531965298607105,121.256220070521849,10.5058483924504795],"rgb":[0.933333333333333348,0.266666666666666663,0.4],"xyz":[0.397241581026166135,0.232737483125438044,0.149713424285727925],"hpluv":[4.95183922571805102,279.013127650855779,55.3531965298607105],"hsluv":[4.95183922571805102,80.511500113091131,55.3531965298607105]},"#ee4477":{"lch":[55.7319177265462855,115.631099927359429,359.795147057523252],"luv":[55.7319177265462855,115.63036086114974,-0.41342173536332294],"rgb":[0.933333333333333348,0.266666666666666663,0.466666666666666674],"xyz":[0.406555594046368041,0.236463088333518867,0.198767226192125834],"hpluv":[359.795147057523252,263.275227085929203,55.7319177265462855],"hsluv":[359.795147057523252,81.0316034214938412,55.7319177265462855]},"#ee4488":{"lch":[56.1797144871475069,110.229334232011354,353.550243523911263],"luv":[56.1797144871475069,109.531664472369371,-12.3822697089333467],"rgb":[0.933333333333333348,0.266666666666666663,0.533333333333333326],"xyz":[0.417696011148311841,0.240919255174296465,0.257440089595698],"hpluv":[353.550243523911263,248.975712077739217,56.1797144871475069],"hsluv":[353.550243523911263,81.5885451367485217,56.1797144871475069]},"#ee4499":{"lch":[56.6975745677487,106.142668326601637,346.310852745323245],"luv":[56.6975745677487,103.127575819694869,-25.1190992084518889],"rgb":[0.933333333333333348,0.266666666666666663,0.6],"xyz":[0.430752975257384541,0.246142040817925623,0.326206767236815909],"hpluv":[346.310852745323245,237.55536706581762,56.6975745677487],"hsluv":[346.310852745323245,82.1643886194057,56.6975745677487]},"#ee44aa":{"lch":[57.2857706939250164,103.913945498461985,338.339047623856459],"luv":[57.2857706939250164,96.5759938315173798,-38.356035828954532],"rgb":[0.933333333333333348,0.266666666666666663,0.66666666666666663],"xyz":[0.445810668222637096,0.252165118004026745,0.405510616853814509],"hpluv":[338.339047623856459,230.179372132151769,57.2857706939250164],"hsluv":[338.339047623856459,82.742186475039972,57.2857706939250164]},"#ee44bb":{"lch":[57.9439265752057224,103.883653730246948,330.054621671216069],"luv":[57.9439265752057224,90.015359877018625,-51.8560362788815183],"rgb":[0.933333333333333348,0.266666666666666663,0.733333333333333282],"xyz":[0.462948260329973771,0.259020154846961503,0.495768601952456256],"hpluv":[330.054621671216069,227.498543532010189,57.9439265752057224],"hsluv":[330.054621671216069,83.3069826860278,57.9439265752057224]},"#ee44cc":{"lch":[58.6710858878032866,106.123661593235155,321.940977409416575],"luv":[58.6710858878032866,83.5592367986741493,-65.4223623509468837],"rgb":[0.933333333333333348,0.266666666666666663,0.8],"xyz":[0.48224063577369547,0.266737105024450305,0.597375112622726356],"hpluv":[321.940977409416575,229.523641905846944,58.6710858878032866],"hsluv":[321.940977409416575,83.8463488142865288,58.6710858878032866]},"#ee44dd":{"lch":[59.4657843936948041,110.45324904546132,314.41066654104867],"luv":[59.4657843936948041,77.2947793232282407,-78.9014405069524116],"rgb":[0.933333333333333348,0.266666666666666663,0.866666666666666696],"xyz":[0.503758961324329069,0.275344435244703811,0.710704960522732354],"hpluv":[314.41066654104867,235.695163072106425,59.4657843936948041],"hsluv":[314.41066654104867,84.3505154479208699,59.4657843936948041]},"#ee44ee":{"lch":[60.3261240941145189,116.527805305600168,307.715012949243771],"luv":[60.3261240941145189,71.28406005268711,-92.180866733529669],"rgb":[0.933333333333333348,0.266666666666666663,0.933333333333333348],"xyz":[0.527571141590503778,0.284869307351173828,0.836115776591255577],"hpluv":[307.715012949243771,245.111377339321677,60.3261240941145189],"hsluv":[307.715012949243771,84.8122051950840898,60.3261240941145189]},"#ee44ff":{"lch":[61.2498476847862321,123.946828366557639,301.937515996566106],"luv":[61.2498476847862321,65.5671420475233617,-105.184438705774298],"rgb":[0.933333333333333348,0.266666666666666663,1],"xyz":[0.553742190000335199,0.295337726715106552,0.973949964883037422],"hpluv":[301.937515996566106,256.785047727470896,61.2498476847862321],"hsluv":[301.937515996566106,99.9999999999986073,61.2498476847862321]},"#ee5500":{"lch":[56.7595334156469136,135.29504726150742,20.5772435658132551],"luv":[56.7595334156469136,126.663115619922038,47.5521288161507414],"rgb":[0.933333333333333348,0.333333333333333315,0],"xyz":[0.385074658312851148,0.24677192478306581,0.0273555648714926478],"hpluv":[20.5772435658132551,302.470071141489655,56.7595334156469136],"hsluv":[20.5772435658132551,100.000000000002331,56.7595334156469136]},"#ee5511":{"lch":[56.7992830001534799,134.121232245619609,20.0864579205919],"luv":[56.7992830001534799,125.963368804879124,46.0622910677426],"rgb":[0.933333333333333348,0.333333333333333315,0.0666666666666666657],"xyz":[0.386086323812488252,0.247176590982920663,0.0326836698362482775],"hpluv":[20.0864579205919,299.636011805134103,56.7992830001534799],"hsluv":[20.0864579205919,97.4301566790671245,56.7992830001534799]},"#ee5522":{"lch":[56.8728535321199331,132.003018379302972,19.1666168944474329],"luv":[56.8728535321199331,124.685803630375247,43.3387498007741385],"rgb":[0.933333333333333348,0.333333333333333315,0.133333333333333331],"xyz":[0.387961681950965309,0.247926734238311491,0.042560556032227477],"hpluv":[19.1666168944474329,294.522290528054612,56.8728535321199331],"hsluv":[19.1666168944474329,92.7404035063857748,56.8728535321199331]},"#ee5533":{"lch":[56.9936637318031813,128.675597773649343,17.6241311186411558],"luv":[56.9936637318031813,122.635981466153211,38.9592801812266671],"rgb":[0.933333333333333348,0.333333333333333315,0.2],"xyz":[0.391049432683423,0.24916183453129459,0.0588227098898386203],"hpluv":[17.6241311186411558,286.489655583397507,56.9936637318031813],"hsluv":[17.6241311186411558,85.2217597168545353,56.9936637318031813]},"#ee5544":{"lch":[57.1673833238913431,124.212647444540593,15.3377586553938237],"luv":[57.1673833238913431,119.788604494467549,32.8553194848226298],"rgb":[0.933333333333333348,0.333333333333333315,0.266666666666666663],"xyz":[0.39550742792764193,0.250945032628982156,0.0823014848427252588],"hpluv":[15.3377586553938237,275.712737821839653,57.1673833238913431],"hsluv":[15.3377586553938237,78.8138286806830308,57.1673833238913431]},"#ee5555":{"lch":[57.3984455800741813,118.847398490007407,12.1770506300618084],"luv":[57.3984455800741813,116.173386735287238,25.068871978930396],"rgb":[0.933333333333333348,0.333333333333333315,0.333333333333333315],"xyz":[0.401469841967003915,0.253329998244727,0.113703532116699174],"hpluv":[12.1770506300618084,262.741620924066638,57.3984455800741813],"hsluv":[12.1770506300618084,79.1862648733910817,57.3984455800741813]},"#ee5566":{"lch":[57.6903015433249777,112.967028718059339,8.00617638558467881],"luv":[57.6903015433249777,111.865945908872092,15.7340307391382019],"rgb":[0.933333333333333348,0.333333333333333315,0.4],"xyz":[0.409054837740512101,0.256363996554130336,0.153651176523843136],"hpluv":[8.00617638558467881,248.478160638648092,57.6903015433249777],"hsluv":[8.00617638558467881,79.626682914648967,57.6903015433249777]},"#ee5577":{"lch":[58.0455538260385,107.095574323644513,2.70497781295448236],"luv":[58.0455538260385,106.976246145051803,5.05418642558356],"rgb":[0.933333333333333348,0.333333333333333315,0.466666666666666674],"xyz":[0.418368850760714,0.260089601762211131,0.202704978430241045],"hpluv":[2.70497781295448236,234.121819944652458,58.0455538260385],"hsluv":[2.70497781295448236,80.121743738144815,58.0455538260385]},"#ee5588":{"lch":[58.4660405277881523,101.857434077675435,356.214905006905212],"luv":[58.4660405277881523,101.63524992227579,-6.72405012805051783],"rgb":[0.933333333333333348,0.333333333333333315,0.533333333333333326],"xyz":[0.429509267862657806,0.264545768602988729,0.261377841833813185],"hpluv":[356.214905006905212,221.069268787819283,58.4660405277881523],"hsluv":[356.214905006905212,80.6557447307456385,58.4660405277881523]},"#ee5599":{"lch":[58.9528982622070714,97.9100075268454475,348.609359498013816],"luv":[58.9528982622070714,95.9815181358717808,-19.3369529719717974],"rgb":[0.933333333333333348,0.333333333333333315,0.6],"xyz":[0.442566231971730506,0.269768554246617887,0.33014451947493112],"hpluv":[348.609359498013816,210.746926462762332,58.9528982622070714],"hsluv":[348.609359498013816,81.2121283261168685,58.9528982622070714]},"#ee55aa":{"lch":[59.5066178042993812,95.8379147411847327,340.160257686713578],"luv":[59.5066178042993812,90.1495111294489817,-32.5264745255299346],"rgb":[0.933333333333333348,0.333333333333333315,0.66666666666666663],"xyz":[0.457623924936983062,0.275791631432719,0.40944836909192972],"hpluv":[340.160257686713578,204.36730380296666,59.5066178042993812],"hsluv":[340.160257686713578,81.7747968800248515,59.5066178042993812]},"#ee55bb":{"lch":[60.1270988419473156,96.02691270708236,331.338718337462637],"luv":[60.1270988419473156,84.2607812264238305,-46.0574501157669],"rgb":[0.933333333333333348,0.333333333333333315,0.733333333333333282],"xyz":[0.474761517044319736,0.282646668275653767,0.499706354190571467],"hpluv":[331.338718337462637,202.657202566236862,60.1270988419473156],"hsluv":[331.338718337462637,82.3290961128101202,60.1270988419473156]},"#ee55cc":{"lch":[60.8137066481247359,98.5745380895967855,322.704854800823],"luv":[60.8137066481247359,78.4184921400445774,-59.728382282288],"rgb":[0.933333333333333348,0.333333333333333315,0.8],"xyz":[0.494053892488041435,0.290363618453142569,0.601312864860841567],"hpluv":[322.704854800823,205.68499115665557,60.8137066481247359],"hsluv":[322.704854800823,82.862416210457269,60.8137066481247359]},"#ee55dd":{"lch":[61.5653314057239669,103.296154527471415,314.73674606959],"luv":[61.5653314057239669,72.7050419742243577,-73.3762387404091925],"rgb":[0.933333333333333348,0.333333333333333315,0.866666666666666696],"xyz":[0.515572218038675,0.298970948673396075,0.714642712760847565],"hpluv":[314.73674606959,212.905685416828703,61.5653314057239669],"hsluv":[314.73674606959,83.3644351442966496,61.5653314057239669]},"#ee55ee":{"lch":[62.3804497031794796,109.822432229930158,307.715012949243942],"luv":[62.3804497031794796,67.1821530808003473,-86.8764923804219364],"rgb":[0.933333333333333348,0.333333333333333315,0.933333333333333348],"xyz":[0.539384398304849744,0.308495820779866092,0.840053528829370788],"hpluv":[307.715012949243942,223.399338603574023,62.3804497031794796],"hsluv":[307.715012949243942,83.8270760150894318,62.3804497031794796]},"#ee55ff":{"lch":[63.2571870514493355,117.722992850638121,301.718618818209791],"luv":[63.2571870514493355,61.8926401270512301,-100.139922827085911],"rgb":[0.933333333333333348,0.333333333333333315,1],"xyz":[0.565555446714681165,0.318964240143798816,0.977887717121152633],"hpluv":[301.718618818209791,236.15152010236153,63.2571870514493355],"hsluv":[301.718618818209791,99.9999999999986358,63.2571870514493355]},"#ee6600":{"lch":[59.6010827175637274,124.896403377083828,24.7633991985742],"luv":[59.6010827175637274,113.411584725929117,52.315619335764687],"rgb":[0.933333333333333348,0.4,0],"xyz":[0.400102716018697624,0.276828040194759151,0.032364917440108],"hpluv":[24.7633991985742,265.910269095548301,59.6010827175637274],"hsluv":[24.7633991985742,100.000000000002458,59.6010827175637274]},"#ee6611":{"lch":[59.6379025762155521,123.785593795891074,24.2806773941880323],"luv":[59.6379025762155521,112.835768380983566,50.9014990474188],"rgb":[0.933333333333333348,0.4,0.0666666666666666657],"xyz":[0.401114381518334728,0.277232706394614,0.0376930224048636284],"hpluv":[24.2806773941880323,263.38259338209491,59.6379025762155521],"hsluv":[24.2806773941880323,97.6946368166697425,59.6379025762155521]},"#ee6622":{"lch":[59.7060621192549235,121.776511986799889,23.3741045361832462],"luv":[59.7060621192549235,111.782804083827386,48.312768320888857],"rgb":[0.933333333333333348,0.4,0.133333333333333331],"xyz":[0.402989739656811785,0.277982849650004804,0.0475699086008428279],"hpluv":[23.3741045361832462,258.812011755725052,59.7060621192549235],"hsluv":[23.3741045361832462,93.4807634058905847,59.7060621192549235]},"#ee6633":{"lch":[59.818019190990654,118.60827278102343,21.848413141726418],"luv":[59.818019190990654,110.088842330137865,44.1403349161252621],"rgb":[0.933333333333333348,0.4,0.2],"xyz":[0.406077490389269491,0.279217949942987931,0.0638320624584539642],"hpluv":[21.848413141726418,251.606745577849637,59.818019190990654],"hsluv":[21.848413141726418,86.7067277856042722,59.818019190990654]},"#ee6644":{"lch":[59.9790782653121,114.334087778781978,19.5741908506499591],"luv":[59.9790782653121,107.726545105393242,38.3050271878496318],"rgb":[0.933333333333333348,0.4,0.266666666666666663],"xyz":[0.410535485633488406,0.281001148040675497,0.0873108374113406],"hpluv":[19.5741908506499591,241.888527179759762,59.9790782653121],"hsluv":[19.5741908506499591,77.7164494297015551,59.9790782653121]},"#ee6655":{"lch":[60.1934276072459227,109.155383321287928,16.4048569251700904],"luv":[60.1934276072459227,104.711671726378157,30.827966398783424],"rgb":[0.933333333333333348,0.4,0.333333333333333315],"xyz":[0.416497899672850391,0.283386113656420358,0.118712884685314518],"hpluv":[16.4048569251700904,230.109957101660228,60.1934276072459227],"hsluv":[16.4048569251700904,78.0627041699660822,60.1934276072459227]},"#ee6666":{"lch":[60.4643778553048179,103.423697151150392,12.1770506300619203],"luv":[60.4643778553048179,101.096711576265875,21.8155000143976636],"rgb":[0.933333333333333348,0.4,0.4],"xyz":[0.424082895446358576,0.286420111965823676,0.15866052909245848],"hpluv":[12.1770506300619203,217.050003231938149,60.4643778553048179],"hsluv":[12.1770506300619203,78.4746058088251601,60.4643778553048179]},"#ee6677":{"lch":[60.7944870758990845,97.6355083856116,6.72933164538236728],"luv":[60.7944870758990845,96.9628770314166388,11.4408468002682859],"rgb":[0.933333333333333348,0.4,0.466666666666666674],"xyz":[0.433396908466560482,0.290145717173904472,0.207714330998856389],"hpluv":[6.72933164538236728,203.79002370037793,60.7944870758990845],"hsluv":[6.72933164538236728,78.9407958828298177,60.7944870758990845]},"#ee6688":{"lch":[61.1856375663111294,92.4106294683140419,359.951978350089689],"luv":[61.1856375663111294,92.4105970103857,-0.0774526573243247418],"rgb":[0.933333333333333348,0.4,0.533333333333333326],"xyz":[0.444537325568504282,0.294601884014682069,0.266387194402428529],"hpluv":[359.951978350089689,191.6512981090967,61.1856375663111294],"hsluv":[359.951978350089689,79.4474583444281706,61.1856375663111294]},"#ee6699":{"lch":[61.6390913266860281,88.437141466109523,351.875732288608958],"luv":[61.6390913266860281,87.5495765855601746,-12.4979850530316181],"rgb":[0.933333333333333348,0.4,0.6],"xyz":[0.457594289677577,0.299824669658311227,0.335153872043546464],"hpluv":[351.875732288608958,182.061365307506776,61.6390913266860281],"hsluv":[351.875732288608958,79.9795786975914353,61.6390913266860281]},"#ee66aa":{"lch":[62.1555369290736337,86.3639450462453624,342.77320214224],"luv":[62.1555369290736337,82.489654306882187,-25.5770978862333536],"rgb":[0.933333333333333348,0.4,0.66666666666666663],"xyz":[0.472651982642829538,0.305847746844412349,0.414457721660545064],"hpluv":[342.77320214224,176.316102232879075,62.1555369290736337],"hsluv":[342.77320214224,80.5221008496243,62.1555369290736337]},"#ee66bb":{"lch":[62.735134131647655,86.6495273870251168,333.187217955259598],"luv":[62.735134131647655,77.3334216921159765,-39.0855790002422907],"rgb":[0.933333333333333348,0.4,0.733333333333333282],"xyz":[0.489789574750166212,0.312702783687347108,0.504715706759186755],"hpluv":[333.187217955259598,175.264796900814019,62.735134131647655],"hsluv":[333.187217955259598,81.0608551813628679,62.735134131647655]},"#ee66cc":{"lch":[63.3775592853136516,89.4351699392481549,323.800511847500275],"luv":[63.3775592853136516,72.1711045195964545,-52.8202735176909144],"rgb":[0.933333333333333348,0.4,0.8],"xyz":[0.509081950193887911,0.320419733864835909,0.606322217429456911],"hpluv":[323.800511847500275,179.065596131410075,63.3775592853136516],"hsluv":[323.800511847500275,81.5831918811758072,63.3775592853136516]},"#ee66dd":{"lch":[64.0820526997291751,94.5324861988586918,315.200217206616742],"luv":[64.0820526997291751,67.0777383779463179,-66.6105694393704795],"rgb":[0.933333333333333348,0.4,0.866666666666666696],"xyz":[0.53060027574452151,0.329027064085089416,0.719652065329462909],"hpluv":[315.200217206616742,187.190580763285084,64.0820526997291751],"hsluv":[315.200217206616742,82.0783141076240241,64.0820526997291751]},"#ee66ee":{"lch":[64.8474680131467,101.534802649490857,307.715012949244169],"luv":[64.8474680131467,62.1123254704966499,-80.32045302236628],"rgb":[0.933333333333333348,0.4,0.933333333333333348],"xyz":[0.55441245601069622,0.338551936191559433,0.845062881397986132],"hpluv":[307.715012949244169,198.683239249207219,64.8474680131467],"hsluv":[307.715012949244169,82.5373501246235,64.8474680131467]},"#ee66ff":{"lch":[65.6723229483953759,109.966867844968618,301.415067453827589],"luv":[65.6723229483953759,57.3184789471434897,-93.8472375449520797],"rgb":[0.933333333333333348,0.4,1],"xyz":[0.580583504420527641,0.349020355555492157,0.982897069689768088],"hpluv":[301.415067453827589,212.480364902930489,65.6723229483953759],"hsluv":[301.415067453827589,99.9999999999984794,65.6723229483953759]},"#ee7700":{"lch":[62.8217158048736763,114.851740825540901,30.0981414692213356],"luv":[62.8217158048736763,99.3660150566978,57.5961580525066097],"rgb":[0.933333333333333348,0.466666666666666674,0],"xyz":[0.418556454072115225,0.313735516301594908,0.0385161634579137],"hpluv":[30.0981414692213356,231.988851559171735,62.8217158048736763],"hsluv":[30.0981414692213356,100.000000000002203,62.8217158048736763]},"#ee7711":{"lch":[62.8555901763931075,113.786950077776382,29.6341042910547],"luv":[62.8555901763931075,98.9037041004629458,56.2630191441096059],"rgb":[0.933333333333333348,0.466666666666666674,0.0666666666666666657],"xyz":[0.419568119571752329,0.314140182501449761,0.0438442684226693288],"hpluv":[29.6341042910547,229.71421718860654,62.8555901763931075],"hsluv":[29.6341042910547,97.9532933827149463,62.8555901763931075]},"#ee7722":{"lch":[62.9183073649527955,111.855609649988921,28.7604537228304977],"luv":[62.9183073649527955,98.0569879769147406,53.8191835600085398],"rgb":[0.933333333333333348,0.466666666666666674,0.133333333333333331],"xyz":[0.421443477710229386,0.314890325756840561,0.0537211546186485284],"hpluv":[28.7604537228304977,225.59011469442973,62.9183073649527955],"hsluv":[28.7604537228304977,94.206312745702121,62.9183073649527955]},"#ee7733":{"lch":[63.0213536795682501,108.794922632811733,27.2836719807386174],"luv":[63.0213536795682501,96.6912591797812411,49.8711899688373208],"rgb":[0.933333333333333348,0.466666666666666674,0.2],"xyz":[0.424531228442687092,0.316125426049823688,0.0699833084762596647],"hpluv":[27.2836719807386174,219.058559128587405,63.0213536795682501],"hsluv":[27.2836719807386174,88.1668112455654,63.0213536795682501]},"#ee7744":{"lch":[63.1696562136619235,104.634411539935968,25.0668522383795889],"luv":[63.1696562136619235,94.7793214210065571,44.3310309972846497],"rgb":[0.933333333333333348,0.466666666666666674,0.266666666666666663],"xyz":[0.428989223686906,0.317908624147511254,0.0934620834291463],"hpluv":[25.0668522383795889,210.186756956079222,63.1696562136619235],"hsluv":[25.0668522383795889,79.7210233436604199,63.1696562136619235]},"#ee7755":{"lch":[63.3671413614491286,99.5393983003294096,21.9455950678528],"luv":[63.3671413614491286,92.3266881357997278,37.2004633286522051],"rgb":[0.933333333333333348,0.466666666666666674,0.333333333333333315],"xyz":[0.434951637726268,0.320293589763256115,0.124864130703120219],"hpluv":[21.9455950678528,199.328877993420377,63.3671413614491286],"hsluv":[21.9455950678528,76.6090179557391,63.3671413614491286]},"#ee7766":{"lch":[63.6169573916324822,93.8195852400781263,17.7221756586824775],"luv":[63.6169573916324822,89.367258373090749,28.5588463614608763],"rgb":[0.933333333333333348,0.466666666666666674,0.4],"xyz":[0.442536633499776177,0.323327588072659433,0.16481177511026418],"hpluv":[17.7221756586824775,187.13711975631665,63.6169573916324822],"hsluv":[17.7221756586824775,76.9903860669667,63.6169573916324822]},"#ee7777":{"lch":[63.9215909451051232,87.936547917610838,12.1770506300618937],"luv":[63.9215909451051232,85.9580160709841863,18.5487447771187846],"rgb":[0.933333333333333348,0.466666666666666674,0.466666666666666674],"xyz":[0.451850646519978083,0.327053193280740229,0.21386557701666209],"hpluv":[12.1770506300618937,174.56660414904394,63.9215909451051232],"hsluv":[12.1770506300618937,77.4248320836617268,63.9215909451051232]},"#ee7788":{"lch":[64.2829374304473,82.5014209284754543,5.11726519711922112],"luv":[64.2829374304473,82.1725895095950847,7.35866757674724514],"rgb":[0.933333333333333348,0.466666666666666674,0.533333333333333326],"xyz":[0.462991063621921883,0.331509360121517827,0.272538440420234229],"hpluv":[5.11726519711922112,162.85647909200884,64.2829374304473],"hsluv":[5.11726519711922112,77.9003779592442669,64.2829374304473]},"#ee7799":{"lch":[64.7023501026032477,78.2413537817778177,356.48599323172067],"luv":[64.7023501026032477,78.0942478632934893,-4.79561177242263259],"rgb":[0.933333333333333348,0.466666666666666674,0.6],"xyz":[0.476048027730994638,0.336732145765147,0.341305118061352164],"hpluv":[356.48599323172067,153.446019679421255,64.7023501026032477],"hsluv":[356.48599323172067,78.4035888028378167,64.7023501026032477]},"#ee77aa":{"lch":[65.1806796634753596,75.8992199041959,346.522692233148291],"luv":[65.1806796634753596,73.8091300431969302,-17.6890899803221124],"rgb":[0.933333333333333348,0.466666666666666674,0.66666666666666663],"xyz":[0.491105720696247139,0.342755222951248106,0.420608967678350765],"hpluv":[346.522692233148291,147.76029654451807,65.1806796634753596],"hsluv":[346.522692233148291,78.9205551316135256,65.1806796634753596]},"#ee77bb":{"lch":[65.7183104585581646,76.0514193956389875,335.85959217762661],"luv":[65.7183104585581646,69.4004166910179094,-31.1030634376174824],"rgb":[0.933333333333333348,0.466666666666666674,0.733333333333333282],"xyz":[0.508243312803583813,0.349610259794182865,0.510866952776992456],"hpluv":[335.85959217762661,146.845370988132231,65.7183104585581646],"hsluv":[335.85959217762661,79.4377328719524627,65.7183104585581646]},"#ee77cc":{"lch":[66.3151963922866,78.9180750862202416,325.378996221060731],"luv":[66.3151963922866,64.9439055461397459,-44.8369457894756067],"rgb":[0.933333333333333348,0.466666666666666674,0.8],"xyz":[0.527535688247305568,0.357327209971671667,0.612473463447262612],"hpluv":[325.378996221060731,151.008971652655617,66.3151963922866],"hsluv":[325.378996221060731,79.9425706591808307,66.3151963922866]},"#ee77dd":{"lch":[66.9708980107196652,84.3115421117289543,315.859798591258766],"luv":[66.9708980107196652,60.5051526262217152,-58.7159487612646842],"rgb":[0.933333333333333348,0.466666666666666674,0.866666666666666696],"xyz":[0.549054013797939056,0.365934540191925173,0.725803311347268609],"hpluv":[315.859798591258766,159.749768323538632,66.9708980107196652],"hsluv":[315.859798591258766,80.4238985377879345,66.9708980107196652]},"#ee77ee":{"lch":[67.6846211881785251,91.7687338274624409,307.715012949244453],"luv":[67.6846211881785251,56.1380858067324056,-72.5948746830766112],"rgb":[0.933333333333333348,0.466666666666666674,0.933333333333333348],"xyz":[0.572866194064113765,0.37545941229839519,0.851214127415791832],"hpluv":[307.715012949244453,172.045795420537047,67.6846211881785251],"hsluv":[307.715012949244453,80.8720902094370757,67.6846211881785251]},"#ee77ff":{"lch":[68.4552572311626761,100.746525491660947,300.997699928034137],"luv":[68.4552572311626761,51.8848298156272918,-86.3587102361150585],"rgb":[0.933333333333333348,0.466666666666666674,1],"xyz":[0.599037242473945186,0.385927831662327914,0.989048315707573789],"hpluv":[300.997699928034137,186.750854251257437,68.4552572311626761],"hsluv":[300.997699928034137,99.9999999999982,68.4552572311626761]},"#ee8800":{"lch":[66.3576417146455,105.981377873447272,36.6492300119340797],"luv":[66.3576417146455,85.0293774107247771,63.2618165491550428],"rgb":[0.933333333333333348,0.533333333333333326,0],"xyz":[0.440628823797085678,0.35788025575153648,0.045873620032903642],"hpluv":[36.6492300119340797,202.664622836431278,66.3576417146455],"hsluv":[36.6492300119340797,100.000000000002288,66.3576417146455]},"#ee8811":{"lch":[66.3886714607036907,104.946342152180421,36.2201184819273792],"luv":[66.3886714607036907,84.6657638625926552,62.0116373004794923],"rgb":[0.933333333333333348,0.533333333333333326,0.0666666666666666657],"xyz":[0.441640489296722782,0.358284921951391333,0.0512017249976592717],"hpluv":[36.2201184819273792,200.591559481147556,66.3886714607036907],"hsluv":[36.2201184819273792,98.1954604930108701,66.3886714607036907]},"#ee8822":{"lch":[66.4461305943750773,103.062674429887437,35.4099902294173745],"luv":[66.4461305943750773,83.9988395226221201,59.7169140151578],"rgb":[0.933333333333333348,0.533333333333333326,0.133333333333333331],"xyz":[0.443515847435199839,0.359035065206782134,0.0610786111936384712],"hpluv":[35.4099902294173745,196.820821024497235,66.4461305943750773],"hsluv":[35.4099902294173745,94.8869488142181581,66.4461305943750773]},"#ee8833":{"lch":[66.5405621290638578,100.059958052790449,34.0337853874148877],"luv":[66.5405621290638578,82.920456825626232,56.0017235927220369],"rgb":[0.933333333333333348,0.533333333333333326,0.2],"xyz":[0.446603598167657545,0.36027016549976526,0.0773407650512496214],"hpluv":[34.0337853874148877,190.815292572549708,66.5405621290638578],"hsluv":[34.0337853874148877,89.5408718212573689,66.5405621290638578]},"#ee8844":{"lch":[66.6765193585480347,95.9403990837829639,31.9512880443390657],"luv":[66.6765193585480347,81.4052672986078107,50.7714745934935223],"rgb":[0.933333333333333348,0.533333333333333326,0.266666666666666663],"xyz":[0.45106159341187646,0.362053363597452826,0.10081954000413626],"hpluv":[31.9512880443390657,182.586190035925256,66.6765193585480347],"hsluv":[31.9512880443390657,82.0371002457568608,66.6765193585480347]},"#ee8855":{"lch":[66.8576614114874559,90.8274017958005,28.983496619036984],"luv":[66.8576614114874559,79.4521157428502391,44.0111147434430805],"rgb":[0.933333333333333348,0.533333333333333326,0.333333333333333315],"xyz":[0.457024007451238445,0.364438329213197687,0.132221587278110175],"hpluv":[28.983496619036984,172.387208051834335,66.8576614114874559],"hsluv":[28.983496619036984,74.7174368883009663,66.8576614114874559]},"#ee8866":{"lch":[67.0869600103699213,84.978663004295683,24.8971939400565283],"luv":[67.0869600103699213,77.081139807049837,35.7752854921339249],"rgb":[0.933333333333333348,0.533333333333333326,0.4],"xyz":[0.464609003224746631,0.367472327522601,0.172169231685254109],"hpluv":[24.8971939400565283,160.735241770302764,67.0869600103699213],"hsluv":[24.8971939400565283,75.0669061044520447,67.0869600103699213]},"#ee8877":{"lch":[67.3668077908477727,78.8051510957513841,19.4009345351312952],"luv":[67.3668077908477727,74.3303771171996743,26.1772205713113095],"rgb":[0.933333333333333348,0.533333333333333326,0.466666666666666674],"xyz":[0.473923016244948536,0.371197932730681801,0.221223033591652019],"hpluv":[19.4009345351312952,148.438980876884,67.3668077908477727],"hsluv":[19.4009345351312952,75.4672397967126329,67.3668077908477727]},"#ee8888":{"lch":[67.6990830402889117,72.8916076032019191,12.177050630062066],"luv":[67.6990830402889117,71.2515799877231757,15.3752661190709663],"rgb":[0.933333333333333348,0.533333333333333326,0.533333333333333326],"xyz":[0.485063433346892336,0.375654099571459399,0.279895896995224214],"hpluv":[12.177050630062066,136.626224949154164,67.6990830402889117],"hsluv":[12.177050630062066,75.9081099773692927,67.6990830402889117]},"#ee8899":{"lch":[68.0851935471165319,67.9986383575237312,2.99916583787236446],"luv":[68.0851935471165319,67.9055003914663615,3.55778513430191889],"rgb":[0.933333333333333348,0.533333333333333326,0.6],"xyz":[0.498120397455965036,0.380876885215088556,0.348662574636342093],"hpluv":[2.99916583787236446,126.732168582193651,68.0851935471165319],"hsluv":[2.99916583787236446,76.3775584855855385,68.0851935471165319]},"#ee88aa":{"lch":[68.5261104708773274,64.9933943358063573,351.976176804910949],"luv":[68.5261104708773274,64.3571165389368,-9.07209226602857832],"rgb":[0.933333333333333348,0.533333333333333326,0.66666666666666663],"xyz":[0.513178090421217648,0.386899962401189679,0.427966424253340694],"hpluv":[351.976176804910949,120.351764916629207,68.5261104708773274],"hsluv":[351.976176804910949,76.8628030471707859,68.5261104708773274]},"#ee88bb":{"lch":[69.0223979406526098,64.6433047463018,339.810246341231903],"luv":[69.0223979406526098,60.6712812589502875,-22.3103670727442456],"rgb":[0.933333333333333348,0.533333333333333326,0.733333333333333282],"xyz":[0.530315682528554211,0.393754999244124437,0.51822440935198244],"hpluv":[339.810246341231903,118.842788638920595,69.0223979406526098],"hsluv":[339.810246341231903,77.3509666785266887,69.0223979406526098]},"#ee88cc":{"lch":[69.5742414545850778,67.3203562589766307,327.709288072293873],"luv":[69.5742414545850778,56.9091584539883399,-35.9635656031820687],"rgb":[0.933333333333333348,0.533333333333333326,0.8],"xyz":[0.549608057972276,0.401471949421613239,0.619830920022252596],"hpluv":[327.709288072293873,122.782720563937247,69.5742414545850778],"hsluv":[327.709288072293873,77.8296635442389686,69.5742414545850778]},"#ee88dd":{"lch":[70.1814766713242,72.856404222049747,316.817937357318669],"luv":[70.1814766713242,53.1256441200966663,-49.8570112721525547],"rgb":[0.933333333333333348,0.533333333333333326,0.866666666666666696],"xyz":[0.571126383522909564,0.410079279641866745,0.733160767922258594],"hpluv":[316.817937357318669,131.729959343498166,70.1814766713242],"hsluv":[316.817937357318669,78.2874043120714163,70.1814766713242]},"#ee88ee":{"lch":[70.8436192863675558,80.7013698438951224,307.715012949244851],"luv":[70.8436192863675558,49.367799206375345,-63.839889537812887],"rgb":[0.933333333333333348,0.533333333333333326,0.933333333333333348],"xyz":[0.594938563789084274,0.419604151748336762,0.858571583990781817],"hpluv":[307.715012949244851,144.550464850223619,70.8436192863675558],"hsluv":[307.715012949244851,78.7138135635212848,70.8436192863675558]},"#ee88ff":{"lch":[71.5598961203093182,90.2054153167292583,300.42003582834775],"luv":[71.5598961203093182,45.674190228859068,-77.7874366424399426],"rgb":[0.933333333333333348,0.533333333333333326,1],"xyz":[0.621109612198915695,0.430072571112269486,0.996405772282563662],"hpluv":[300.42003582834775,159.956626210428567,71.5598961203093182],"hsluv":[300.42003582834775,99.99999999999784,71.5598961203093182]},"#ee9900":{"lch":[70.1492527845175715,98.9919938823364731,44.3502140795235036],"luv":[70.1492527845175715,70.7872313214223112,69.1995862317686772],"rgb":[0.933333333333333348,0.6,0],"xyz":[0.466498424249553179,0.409619456656472147,0.0544968201837259],"hpluv":[44.3502140795235036,179.06732625175573,70.1492527845175715],"hsluv":[44.3502140795235036,100.000000000002217,70.1492527845175715]},"#ee9911":{"lch":[70.1776126165771785,97.9766822185852533,43.9766782844564119],"luv":[70.1776126165771785,70.5062245085518526,68.0316291449155273],"rgb":[0.933333333333333348,0.6,0.0666666666666666657],"xyz":[0.467510089749190283,0.410024122856327,0.0598249251484815267],"hpluv":[43.9766782844564119,177.15910010767405,70.1776126165771785],"hsluv":[43.9766782844564119,98.4152296143538337,70.1776126165771785]},"#ee9922":{"lch":[70.2301348691785,96.1222676294158447,43.2696050504519505],"luv":[70.2301348691785,69.9901292501651824,65.8852953379296622],"rgb":[0.933333333333333348,0.6,0.133333333333333331],"xyz":[0.46938544788766734,0.410774266111717801,0.0697018113444607262],"hpluv":[43.2696050504519505,173.676009463775955,70.2301348691785],"hsluv":[43.2696050504519505,95.5057584668238,70.2301348691785]},"#ee9933":{"lch":[70.3164728806357573,93.1473438817036339,42.0626701373461103],"luv":[70.3164728806357573,69.1537511222041417,62.4034163964169508],"rgb":[0.933333333333333348,0.6,0.2],"xyz":[0.472473198620125046,0.412009366404700927,0.0859639652020718625],"hpluv":[42.0626701373461103,168.094198140054317,70.3164728806357573],"hsluv":[42.0626701373461103,90.7937976503380213,70.3164728806357573]},"#ee9944":{"lch":[70.4408210614760719,89.024296887742608,40.221678197216157],"luv":[70.4408210614760719,67.9746586813449483,57.4871395488729533],"rgb":[0.933333333333333348,0.6,0.266666666666666663],"xyz":[0.476931193864343961,0.413792564502388494,0.109442740154958501],"hpluv":[40.221678197216157,160.370125602871781,70.4408210614760719],"hsluv":[40.221678197216157,84.1577311163605657,70.4408210614760719]},"#ee9955":{"lch":[70.6065752665828654,83.8291063606938138,37.5652459120346904],"luv":[70.6065752665828654,66.4479455240540631,51.1076276974862154],"rgb":[0.933333333333333348,0.6,0.333333333333333315],"xyz":[0.482893607903705946,0.416177530118133354,0.140844787428932416],"hpluv":[37.5652459120346904,150.656896294971034,70.6065752665828654],"hsluv":[37.5652459120346904,75.5772228053980797,70.6065752665828654]},"#ee9966":{"lch":[70.8165243284349373,77.7550236522342,33.8383101580563],"luv":[70.8165243284349373,64.5842808158336652,43.297971946282189],"rgb":[0.933333333333333348,0.6,0.4],"xyz":[0.490478603677214131,0.419211528427536673,0.180792431836076378],"hpluv":[33.8383101580563,139.326323276972687,70.8165243284349373],"hsluv":[33.8383101580563,72.525293376848623,70.8165243284349373]},"#ee9977":{"lch":[71.0729506656700778,71.1378337295946,28.6840524218341386],"luv":[71.0729506656700778,62.4077841236731601,34.1446901949989154],"rgb":[0.933333333333333348,0.6,0.466666666666666674],"xyz":[0.499792616697416037,0.422937133635617468,0.229846233742474287],"hpluv":[28.6840524218341386,127.009327518651787,71.0729506656700778],"hsluv":[28.6840524218341386,72.8885787597460677,71.0729506656700778]},"#ee9988":{"lch":[71.3776900371935312,64.4963091800695878,21.6331741754282376],"luv":[71.3776900371935312,59.9533946760230378,23.7773918811996943],"rgb":[0.933333333333333348,0.6,0.533333333333333326],"xyz":[0.510933033799359837,0.427393300476395066,0.288519097146046455],"hpluv":[21.6331741754282376,114.659937381049531,71.3776900371935312],"hsluv":[21.6331741754282376,73.2902809537896189,71.3776900371935312]},"#ee9999":{"lch":[71.732171153908709,58.5818834203282179,12.1770506300621602],"luv":[71.732171153908709,57.263818011494017,12.3568690136061505],"rgb":[0.933333333333333348,0.6,0.6],"xyz":[0.523989997908432592,0.432616086120024224,0.35728577478716439],"hpluv":[12.1770506300621602,103.630759412975706,71.732171153908709],"hsluv":[12.1770506300621602,73.7196701825771186,71.732171153908709]},"#ee99aa":{"lch":[72.1374451439022408,54.3863410009709725,0.0659165211073427237],"luv":[72.1374451439022408,54.3863050092105,0.0625693137293968082],"rgb":[0.933333333333333348,0.6,0.66666666666666663],"xyz":[0.539047690873685093,0.438639163306125346,0.436589624404162935],"hpluv":[0.0659165211073427237,95.6683780017161,72.1374451439022408],"hsluv":[0.0659165211073427237,74.1649147609968082,72.1374451439022408]},"#ee99bb":{"lch":[72.5942101669252366,52.9692652640659247,345.882936464906891],"luv":[72.5942101669252366,51.3695627363271683,-12.9194073739288822],"rgb":[0.933333333333333348,0.6,0.733333333333333282],"xyz":[0.556185282981021767,0.445494200149060104,0.526847609502804737],"hpluv":[345.882936464906891,92.5894045166522091,72.5942101669252366],"hsluv":[345.882936464906891,74.6136876066909878,72.5942101669252366]},"#ee99cc":{"lch":[73.1028341171650737,55.013164482536844,331.314039518972208],"luv":[73.1028341171650737,48.2610582375421515,-26.4067893575727517],"rgb":[0.933333333333333348,0.6,0.8],"xyz":[0.575477658424743521,0.453211150326548906,0.628454120173074893],"hpluv":[331.314039518972208,95.4930444317639342,73.1028341171650737],"hsluv":[331.314039518972208,75.0536815693659491,73.1028341171650737]},"#ee99dd":{"lch":[73.6633770412179274,60.4388711558699896,318.269971219550712],"luv":[73.6633770412179274,45.1048908137830935,-40.2294167403973049],"rgb":[0.933333333333333348,0.6,0.866666666666666696],"xyz":[0.596995983975377,0.461818480546802412,0.74178396807308089],"hpluv":[318.269971219550712,104.112780668711437,73.6633770412179274],"hsluv":[318.269971219550712,75.472992612571872,73.6633770412179274]},"#ee99ee":{"lch":[74.2756141069900337,68.5596754700476083,307.71501294924542],"luv":[74.2756141069900337,41.9403078139404499,-54.2350410807456953],"rgb":[0.933333333333333348,0.6,0.933333333333333348],"xyz":[0.620808164241551719,0.471343352653272429,0.867194784141604114],"hpluv":[307.71501294924542,117.128296895720368,74.2756141069900337],"hsluv":[307.71501294924542,75.8603506282489235,74.2756141069900337]},"#ee99ff":{"lch":[74.9390594560707,78.5455210447045857,299.603294913962486],"luv":[74.9390594560707,38.8008486558083519,-68.2927010724659],"rgb":[0.933333333333333348,0.6,1],"xyz":[0.64697921265138314,0.481811772017205153,1.00502897243338585],"hpluv":[299.603294913962486,133.000267199001968,74.9390594560707],"hsluv":[299.603294913962486,99.9999999999973284,74.9390594560707]},"#dd0000":{"lch":[46.1435564305616239,155.182233977468201,12.1770506300617765],"luv":[46.1435564305616239,151.69070515099267,32.7330981276182555],"rgb":[0.866666666666666696,0,0],"xyz":[0.298181282529475455,0.153749723804264049,0.0139772476185688679],"hpluv":[12.1770506300617765,426.746789183125316,46.1435564305616239],"hsluv":[12.1770506300617765,100.000000000002217,46.1435564305616239]},"#dd0011":{"lch":[46.1980288678146636,153.577384001942391,11.5987087531524224],"luv":[46.1980288678146636,150.441300178721519,30.8776306962803169],"rgb":[0.866666666666666696,0,0.0666666666666666657],"xyz":[0.29919294802911256,0.154154390004118902,0.0193053525833244977],"hpluv":[11.5987087531524224,421.835520233675084,46.1980288678146636],"hsluv":[11.5987087531524224,99.9999999999964473,46.1980288678146636]},"#dd0022":{"lch":[46.2987546285526292,150.712226421231577,10.5179424282654246],"luv":[46.2987546285526292,148.17992816752087,27.5115263319381462],"rgb":[0.866666666666666696,0,0.133333333333333331],"xyz":[0.301068306167589617,0.15490453325950973,0.0291822387793036972],"hpluv":[10.5179424282654246,413.065099977246746,46.2987546285526292],"hsluv":[10.5179424282654246,99.9999999999964615,46.2987546285526292]},"#dd0033":{"lch":[46.4638920568500637,146.293058552209629,8.71533624525386585],"luv":[46.4638920568500637,144.603865814948932,22.1671146505918131],"rgb":[0.866666666666666696,0,0.2],"xyz":[0.304156056900047322,0.156139633552492829,0.0454443926369148404],"hpluv":[8.71533624525386585,399.528220173505417,46.4638920568500637],"hsluv":[8.71533624525386585,99.9999999999966,46.4638920568500637]},"#dd0044":{"lch":[46.7007828741672242,140.527307525302433,6.06736355557067153],"luv":[46.7007828741672242,139.740117429456177,14.853408400522655],"rgb":[0.866666666666666696,0,0.266666666666666663],"xyz":[0.308614052144266238,0.157922831650180423,0.0689231675898014789],"hpluv":[6.06736355557067153,381.835137536210595,46.7007828741672242],"hsluv":[6.06736355557067153,99.9999999999967315,46.7007828741672242]},"#dd0055":{"lch":[47.0148448700731194,133.854751810486647,2.4577968894866693],"luv":[47.0148448700731194,133.731616129679537,5.74015936982693],"rgb":[0.866666666666666696,0,0.333333333333333315],"xyz":[0.314576466183628223,0.160307797265925256,0.10032521486377538],"hpluv":[2.4577968894866693,361.275168455412427,47.0148448700731194],"hsluv":[2.4577968894866693,99.9999999999969873,47.0148448700731194]},"#dd0066":{"lch":[47.4099042919878073,126.898325188331157,357.792852491951692],"luv":[47.4099042919878073,126.80418183984473,-4.88716722969802841],"rgb":[0.866666666666666696,0,0.4],"xyz":[0.322161461957136408,0.163341795575328547,0.140272859270919342],"hpluv":[357.792852491951692,339.645713706877359,47.4099042919878073],"hsluv":[357.792852491951692,99.9999999999972857,47.4099042919878073]},"#dd0077":{"lch":[47.8883827301537,120.388643903007392,352.036106438093952],"luv":[47.8883827301537,119.227564738695264,-16.6797298325047478],"rgb":[0.866666666666666696,0,0.466666666666666674],"xyz":[0.331475474977338314,0.16706740078340937,0.189326661177317251],"hpluv":[352.036106438093952,319.002934776287759,47.8883827301537],"hsluv":[352.036106438093952,99.9999999999974136,47.8883827301537]},"#dd0088":{"lch":[48.4514347566520058,115.064311489444805,345.260130057314882],"luv":[48.4514347566520058,111.277652945923506,-29.2759241252361342],"rgb":[0.866666666666666696,0,0.533333333333333326],"xyz":[0.342615892079282114,0.171523567624186968,0.247999524580889419],"hpluv":[345.260130057314882,301.351479235409442,48.4514347566520058],"hsluv":[345.260130057314882,99.9999999999976836,48.4514347566520058]},"#dd0099":{"lch":[49.0990738312553816,111.554442433955828,337.69359677942],"luv":[49.0990738312553816,103.206522936464793,-42.3415546492536166],"rgb":[0.866666666666666696,0,0.6],"xyz":[0.355672856188354869,0.176746353267816125,0.316766202222007354],"hpluv":[337.69359677942,288.305479360883112,49.0990738312553816],"hsluv":[337.69359677942,99.9999999999979252,49.0990738312553816]},"#dd00aa":{"lch":[49.8303011832281442,110.265023964610052,329.72204926251294],"luv":[49.8303011832281442,95.2237329190616606,-55.5951094870335041],"rgb":[0.866666666666666696,0,0.66666666666666663],"xyz":[0.370730549153607369,0.18276943045391722,0.396070051839005954],"hpluv":[329.72204926251294,280.791263168904948,49.8303011832281442],"hsluv":[329.72204926251294,99.9999999999981526,49.8303011832281442]},"#dd00bb":{"lch":[50.6432416523731064,111.311454300018838,321.811503537589374],"luv":[50.6432416523731064,87.4886923962170613,-68.8183737179635244],"rgb":[0.866666666666666696,0,0.733333333333333282],"xyz":[0.387868141260944044,0.189624467296851978,0.486328036937647701],"hpluv":[321.811503537589374,278.905890401213071,50.6432416523731064],"hsluv":[321.811503537589374,99.9999999999984,50.6432416523731064]},"#dd00cc":{"lch":[51.5352850119508901,114.534817141075266,314.3830496716472],"luv":[51.5352850119508901,80.1116001600253753,-81.8557014345352201],"rgb":[0.866666666666666696,0,0.8],"xyz":[0.407160516704665798,0.19734141747434078,0.587934547607917857],"hpluv":[314.3830496716472,282.014975724645751,51.5352850119508901],"hsluv":[314.3830496716472,99.9999999999986215,51.5352850119508901]},"#dd00dd":{"lch":[52.5032286812834883,119.593841400887641,307.715012949243601],"luv":[52.5032286812834883,73.1596596193909647,-94.6062952735996419],"rgb":[0.866666666666666696,0,0.866666666666666696],"xyz":[0.428678842255299286,0.205948747694594314,0.701264395507923854],"hpluv":[307.715012949243601,289.042783730483222,52.5032286812834883],"hsluv":[307.715012949243601,99.9999999999987779,52.5032286812834883]},"#dd00ee":{"lch":[53.5434168792756111,126.080010820296707,301.921476351261958],"luv":[53.5434168792756111,66.6656277920787659,-107.01337860068783],"rgb":[0.866666666666666696,0,0.933333333333333348],"xyz":[0.452491022521474051,0.215473619801064359,0.826675211576447078],"hpluv":[301.921476351261958,298.799235277631283,53.5434168792756111],"hsluv":[301.921476351261958,99.999999999998991,53.5434168792756111]},"#dd00ff":{"lch":[54.6518715304170399,133.605457484958208,296.990855958497434],"luv":[54.6518715304170399,60.6366090811706258,-119.053013019000375],"rgb":[0.866666666666666696,0,1],"xyz":[0.478662070931305417,0.225942039164997055,0.964509399868228923],"hpluv":[296.990855958497434,310.211923209940835,54.6518715304170399],"hsluv":[296.990855958497434,99.99999999999919,54.6518715304170399]},"#dd1100":{"lch":[46.6790301132195,152.538998994032681,12.7564763340959253],"luv":[46.6790301132195,148.773935032481603,33.6817824506429915],"rgb":[0.866666666666666696,0.0666666666666666657,0],"xyz":[0.300185682790403863,0.157758524326120919,0.0146453810388783197],"hpluv":[12.7564763340959253,414.665968881342394,46.6790301132195],"hsluv":[12.7564763340959253,100.000000000002373,46.6790301132195]},"#dd1111":{"lch":[46.7325769897078942,150.969760125239,12.1770506300617818],"luv":[46.7325769897078942,147.573010021229663,31.8445471870185592],"rgb":[0.866666666666666696,0.0666666666666666657,0.0666666666666666657],"xyz":[0.301197348290040967,0.158163190525975772,0.0199734860036339529],"hpluv":[12.1770506300617818,409.92986676092562,46.7325769897078942],"hsluv":[12.1770506300617818,96.0592738250283,46.7325769897078942]},"#dd1122":{"lch":[46.8315975390355774,148.166934443607602,11.093898425687982],"luv":[46.8315975390355774,145.398162733087418,28.509905932130728],"rgb":[0.866666666666666696,0.0666666666666666657,0.133333333333333331],"xyz":[0.303072706428518,0.1589133337813666,0.0298503721996131455],"hpluv":[11.093898425687982,401.468660625611221,46.8315975390355774],"hsluv":[11.093898425687982,96.1199649520447821,46.8315975390355774]},"#dd1133":{"lch":[46.9939567691892393,143.840838530693645,9.28627571582045697],"luv":[46.9939567691892393,141.955717705878527,23.2112265902085468],"rgb":[0.866666666666666696,0.0666666666666666657,0.2],"xyz":[0.30616045716097573,0.160148434074349699,0.0461125260572242957],"hpluv":[9.28627571582045697,388.400266865181436,46.9939567691892393],"hsluv":[9.28627571582045697,96.2159198798013477,46.9939567691892393]},"#dd1144":{"lch":[47.2268997120704555,138.191174032002039,6.62861883301083665],"luv":[47.2268997120704555,137.267398010546174,15.951865839373701],"rgb":[0.866666666666666696,0.0666666666666666657,0.266666666666666663],"xyz":[0.310618452405194645,0.161931632172037293,0.0695913010101109342],"hpluv":[6.62861883301083665,371.304486157060069,47.2268997120704555],"hsluv":[6.62861883301083665,96.346372634165391,47.2268997120704555]},"#dd1155":{"lch":[47.5357948285950442,131.646215003298352,3.00154982487266553],"luv":[47.5357948285950442,131.465612026054913,6.89338663571585908],"rgb":[0.866666666666666696,0.0666666666666666657,0.333333333333333315],"xyz":[0.31658086644455663,0.164316597787782126,0.100993348284084836],"hpluv":[3.00154982487266553,351.420379681935685,47.5357948285950442],"hsluv":[3.00154982487266553,96.5074087268808114,47.5357948285950442]},"#dd1166":{"lch":[47.9244613368761776,124.817323026056556,358.307054390798669],"luv":[47.9244613368761776,124.762840903711279,-3.68750010524401839],"rgb":[0.866666666666666696,0.0666666666666666657,0.4],"xyz":[0.324165862218064815,0.167350596097185417,0.140940992691228811],"hpluv":[358.307054390798669,330.488955339688346,47.9244613368761776],"hsluv":[358.307054390798669,96.6928417837132912,47.9244613368761776]},"#dd1177":{"lch":[48.3953520744879313,118.427317384197096,352.504166614065639],"luv":[48.3953520744879313,117.415279069986227,-15.4493282615978131],"rgb":[0.866666666666666696,0.0666666666666666657,0.466666666666666674],"xyz":[0.333479875238266721,0.17107620130526624,0.189994794597626721],"hpluv":[352.504166614065639,310.51856077863863,48.3953520744879313],"hsluv":[352.504166614065639,96.8952584834877229,48.3953520744879313]},"#dd1188":{"lch":[48.949686611979061,113.213254375126112,345.662599129740954],"luv":[48.949686611979061,109.687147393784173,-28.0351683216148473],"rgb":[0.866666666666666696,0.0666666666666666657,0.533333333333333326],"xyz":[0.344620292340210521,0.175532368146043838,0.248667658001198888],"hpluv":[345.662599129740954,293.48552443008623,48.949686611979061],"hsluv":[345.662599129740954,97.1070447043031209,48.949686611979061]},"#dd1199":{"lch":[49.5875717372425,109.808639676001164,338.012756373247385],"luv":[49.5875717372425,101.821953610845213,-41.1123717433662961],"rgb":[0.866666666666666696,0.0666666666666666657,0.6],"xyz":[0.357677256449283276,0.180755153789673,0.317434335642316767],"hpluv":[338.012756373247385,280.997849503034615,49.5875717372425],"hsluv":[338.012756373247385,97.321211179253126,49.5875717372425]},"#dd11aa":{"lch":[50.3081241313593779,108.626384639058173,329.948207544292131],"luv":[50.3081241313593779,94.0240738412992556,-54.3982074892042462],"rgb":[0.866666666666666696,0.0666666666666666657,0.66666666666666663],"xyz":[0.372734949414535777,0.18677823097577409,0.396738185259315368],"hpluv":[329.948207544292131,273.991145484396441,50.3081241313593779],"hsluv":[329.948207544292131,97.5319211216277751,50.3081241313593779]},"#dd11bb":{"lch":[51.1095995740137,109.78676639377484,321.947120969557943],"luv":[51.1095995740137,86.4507346157054855,-67.6712979010019495],"rgb":[0.866666666666666696,0.0666666666666666657,0.733333333333333282],"xyz":[0.389872541521872451,0.193633267818708849,0.486996170357957114],"hpluv":[321.947120969557943,272.57551535007633,51.1095995740137],"hsluv":[321.947120969557943,97.7347175386083791,51.1095995740137]},"#dd11cc":{"lch":[51.9895276454598303,113.13117809908816,314.441471026924035],"luv":[51.9895276454598303,79.2122218564644527,-80.7718228508547469],"rgb":[0.866666666666666696,0.0666666666666666657,0.8],"xyz":[0.409164916965594205,0.20135021799619765,0.588602681028227326],"hpluv":[314.441471026924035,276.12502270002949,51.9895276454598303],"hsluv":[314.441471026924035,97.9265130550616,51.9895276454598303]},"#dd11dd":{"lch":[52.9448482611329325,118.314931067086022,307.715012949243601],"luv":[52.9448482611329325,72.3773062506166553,-93.594596282658145],"rgb":[0.866666666666666696,0.0666666666666666657,0.866666666666666696],"xyz":[0.430683242516227693,0.209957548216451184,0.701932528928233324],"hpluv":[307.715012949243601,283.566663729067216,52.9448482611329325],"hsluv":[307.715012949243601,98.1054292618058525,52.9448482611329325]},"#dd11ee":{"lch":[53.9720454332022257,124.924845967379298,301.881652150577509],"luv":[53.9720454332022257,65.9811112999591103,-106.078791902980541],"rgb":[0.866666666666666696,0.0666666666666666657,0.933333333333333348],"xyz":[0.454495422782402458,0.219482420322921229,0.827343344996756547],"hpluv":[301.881652150577509,293.71036424495378,53.9720454332022257],"hsluv":[301.881652150577509,98.2705657762439841,53.9720454332022257]},"#dd11ff":{"lch":[55.067273793018515,132.56906123155207,296.926443611211937],"luv":[55.067273793018515,60.0334023394080774,-118.197066796810802],"rgb":[0.866666666666666696,0.0666666666666666657,1],"xyz":[0.480666471192233824,0.229950839686853925,0.965177533288538392],"hpluv":[296.926443611211937,305.483621811531123,55.067273793018515],"hsluv":[296.926443611211937,99.9999999999990763,55.067273793018515]},"#dd2200":{"lch":[47.6481385708110494,147.881667770992,13.8451074484812633],"luv":[47.6481385708110494,143.585141583480663,35.3877772568702937],"rgb":[0.866666666666666696,0.133333333333333331,0],"xyz":[0.303901306525171777,0.165189771795656887,0.0158839222838009289],"hpluv":[13.8451074484812633,393.829031299888356,47.6481385708110494],"hsluv":[13.8451074484812633,100.000000000002302,47.6481385708110494]},"#dd2211":{"lch":[47.7000692420668,146.371743885583,13.2640103652051735],"luv":[47.7000692420668,142.467011758872331,33.583298953557744],"rgb":[0.866666666666666696,0.133333333333333331,0.0666666666666666657],"xyz":[0.304912972024808882,0.16559443799551174,0.0212120272485565586],"hpluv":[13.2640103652051735,389.383517616197651,47.7000692420668],"hsluv":[13.2640103652051735,96.2235359913314596,47.7000692420668]},"#dd2222":{"lch":[47.796111526211412,143.672697420673273,12.1770506300617871],"luv":[47.796111526211412,140.440127868319678,30.3053537920670948],"rgb":[0.866666666666666696,0.133333333333333331,0.133333333333333331],"xyz":[0.306788330163285938,0.166344581250902568,0.0310889134445357582],"hpluv":[12.1770506300617871,381.435408792809369,47.796111526211412],"hsluv":[12.1770506300617871,89.3821391188339618,47.796111526211412]},"#dd2233":{"lch":[47.9536166692339805,139.501418135148583,10.3611027729364178],"luv":[47.9536166692339805,137.226679529052944,25.0895214611231978],"rgb":[0.866666666666666696,0.133333333333333331,0.2],"xyz":[0.309876080895743644,0.167579681543885667,0.0473510673021469],"hpluv":[10.3611027729364178,369.144652707036585,47.9536166692339805],"hsluv":[10.3611027729364178,89.634195646670733,47.9536166692339805]},"#dd2244":{"lch":[48.1796580724099073,134.044487106872765,7.68678657448498281],"luv":[48.1796580724099073,132.839973125453383,17.9294747210675],"rgb":[0.866666666666666696,0.133333333333333331,0.266666666666666663],"xyz":[0.314334076139962559,0.169362879641573261,0.0708298422550335399],"hpluv":[7.68678657448498281,353.040533161258963,48.1796580724099073],"hsluv":[7.68678657448498281,89.9776949827144819,48.1796580724099073]},"#dd2255":{"lch":[48.4795139291676236,127.710640494506933,4.02871777991100277],"luv":[48.4795139291676236,127.395062601571667,8.9724979943620351],"rgb":[0.866666666666666696,0.133333333333333331,0.333333333333333315],"xyz":[0.320296490179324544,0.171747845257318094,0.102231889529007441],"hpluv":[4.02871777991100277,334.278275235680212,48.4795139291676236],"hsluv":[4.02871777991100277,90.4030378986951746,48.4795139291676236]},"#dd2266":{"lch":[48.8569858046774499,121.091623353111601,359.280669781128381],"luv":[48.8569858046774499,121.082080247128843,-1.52022673298942879],"rgb":[0.866666666666666696,0.133333333333333331,0.4],"xyz":[0.32788148595283273,0.174781843566721384,0.142179533936151403],"hpluv":[359.280669781128381,314.504423311283745,48.8569858046774499],"hsluv":[359.280669781128381,90.8946273178398627,48.8569858046774499]},"#dd2277":{"lch":[49.3145747506863046,114.897314975199777,353.392641366134796],"luv":[49.3145747506863046,114.134166521370943,-13.2206286152450421],"rgb":[0.866666666666666696,0.133333333333333331,0.466666666666666674],"xyz":[0.337195498973034635,0.178507448774802208,0.191233335842549312],"hpluv":[353.392641366134796,295.64729776044,49.3145747506863046],"hsluv":[353.392641366134796,91.4334620569677128,49.3145747506863046]},"#dd2288":{"lch":[49.8536069462695934,109.863045744465836,346.42832123602642],"luv":[49.8536069462695934,106.795352255968297,-25.780643063628979],"rgb":[0.866666666666666696,0.133333333333333331,0.533333333333333326],"xyz":[0.348335916074978436,0.182963615615579805,0.24990619924612148],"hpluv":[346.42832123602642,279.636833718457694,49.8536069462695934],"hsluv":[346.42832123602642,91.999736258284841,49.8536069462695934]},"#dd2299":{"lch":[50.4743452384724947,106.631383564155598,338.620922954440232],"luv":[50.4743452384724947,99.2939711585852507,-38.8710593162073792],"rgb":[0.866666666666666696,0.133333333333333331,0.6],"xyz":[0.361392880184051135,0.188186401259208963,0.318672876887239387],"hpluv":[338.620922954440232,268.07337181170567,50.4743452384724947],"hsluv":[338.620922954440232,92.5749897333771088,50.4743452384724947]},"#dd22aa":{"lch":[51.176101525576982,105.62881092572934,330.379319008457628],"luv":[51.176101525576982,91.8248770713425699,-52.2076397514415902],"rgb":[0.866666666666666696,0.133333333333333331,0.66666666666666663],"xyz":[0.376450573149303691,0.194209478445310058,0.397976726504238],"hpluv":[330.379319008457628,261.911470041672374,51.176101525576982],"hsluv":[330.379319008457628,93.1435427232804898,51.176101525576982]},"#dd22bb":{"lch":[51.9573548685870321,106.984993341056935,322.205396597718504],"luv":[51.9573548685870321,84.5409044706425306,-65.5638945721781425],"rgb":[0.866666666666666696,0.133333333333333331,0.733333333333333282],"xyz":[0.393588165256640365,0.201064515288244816,0.488234711602879734],"hpluv":[322.205396597718504,261.285408571692301,51.9573548685870321],"hsluv":[322.205396597718504,93.6931794305449301,51.9573548685870321]},"#dd22cc":{"lch":[52.8158750154556174,110.541708291411879,314.55250800555325],"luv":[52.8158750154556174,77.5519304210182838,-78.7728846745956],"rgb":[0.866666666666666696,0.133333333333333331,0.8],"xyz":[0.412880540700362064,0.208781465465733618,0.58984122227315],"hpluv":[314.55250800555325,265.583456637160452,52.8158750154556174],"hsluv":[314.55250800555325,94.2152138812719073,52.8158750154556174]},"#dd22dd":{"lch":[53.7488483860564088,115.947384169062644,307.715012949243658],"luv":[53.7488483860564088,70.9289965118926204,-91.721716891171],"rgb":[0.866666666666666696,0.133333333333333331,0.866666666666666696],"xyz":[0.434398866250995663,0.217388795685987152,0.703171070173155943],"hpluv":[307.715012949243658,273.735496610715643,53.7488483860564088],"hsluv":[307.715012949243658,94.704144859729837,53.7488483860564088]},"#dd22ee":{"lch":[54.7530025006588374,122.779599443276055,301.806367069585178],"luv":[54.7530025006588374,64.7110170709106,-104.342293961267828],"rgb":[0.866666666666666696,0.133333333333333331,0.933333333333333348],"xyz":[0.458211046517170373,0.226913667792457197,0.828581886241679166],"hpluv":[301.806367069585178,284.549350776984397,54.7530025006588374],"hsluv":[301.806367069585178,95.1571011878196629,54.7530025006588374]},"#dd22ff":{"lch":[55.8247247862810525,130.638613434108407,296.804995701950531],"luv":[55.8247247862810525,58.9121835814083425,-116.601037498200881],"rgb":[0.866666666666666696,0.133333333333333331,1],"xyz":[0.484382094927001794,0.237382087156389893,0.966416074533461],"hpluv":[296.804995701950531,296.950662194199822,55.8247247862810525],"hsluv":[296.804995701950531,99.9999999999989768,55.8247247862810525]},"#dd3300":{"lch":[49.1823134049741526,140.84390252957769,15.6779143459349193],"luv":[49.1823134049741526,135.603943521894649,38.06015476941716],"rgb":[0.866666666666666696,0.2,0],"xyz":[0.310019028614182623,0.17742521597367869,0.0179231629801378106],"hpluv":[15.6779143459349193,363.386194305474646,49.1823134049741526],"hsluv":[15.6779143459349193,100.000000000002331,49.1823134049741526]},"#dd3311":{"lch":[49.2318310772226226,139.415415721210906,15.0950854994101622],"luv":[49.2318310772226226,134.60488288385605,36.3067988748864323],"rgb":[0.866666666666666696,0.2,0.0666666666666666657],"xyz":[0.311030694113819728,0.177829882173533543,0.0232512679448934403],"hpluv":[15.0950854994101622,359.338818773581409,49.2318310772226226],"hsluv":[15.0950854994101622,96.4660724045404834,49.2318310772226226]},"#dd3322":{"lch":[49.3234253076193,136.858666305461554,14.0037238091571297],"luv":[49.3234253076193,132.791226888227897,33.117738516222083],"rgb":[0.866666666666666696,0.2,0.133333333333333331],"xyz":[0.312906052252296785,0.178580025428924372,0.0331281541408726399],"hpluv":[14.0037238091571297,352.093818956611813,49.3234253076193],"hsluv":[14.0037238091571297,90.0546185843159321,49.3234253076193]},"#dd3333":{"lch":[49.4736766963079901,132.899088309008249,12.1770506300618315],"luv":[49.4736766963079901,129.908920002044738,28.0328410488111714],"rgb":[0.866666666666666696,0.2,0.2],"xyz":[0.31599380298475449,0.179815125721907471,0.0493903079984837831],"hpluv":[12.1770506300618315,340.868713502871344,49.4736766963079901],"hsluv":[12.1770506300618315,79.876105021286179,49.4736766963079901]},"#dd3344":{"lch":[49.6893958667399289,127.704341644457742,9.47932118493828391],"luv":[49.6893958667399289,125.960552293014786,21.031836364974712],"rgb":[0.866666666666666696,0.2,0.266666666666666663],"xyz":[0.320451798228973406,0.181598323819595064,0.0728690829513704286],"hpluv":[9.47932118493828391,326.122882655454703,49.6893958667399289],"hsluv":[9.47932118493828391,80.502956859434363,49.6893958667399289]},"#dd3355":{"lch":[49.9757165444531495,121.655077778432485,5.77481987360355742],"luv":[49.9757165444531495,121.037681249067731,12.2408197080725127],"rgb":[0.866666666666666696,0.2,0.333333333333333315],"xyz":[0.326414212268335391,0.183983289435339897,0.10427113022534433],"hpluv":[5.77481987360355742,308.89475746512926,49.9757165444531495],"hsluv":[5.77481987360355742,81.2827465905028674,49.9757165444531495]},"#dd3366":{"lch":[50.3364012453720164,115.314978813651479,0.942739432835561],"luv":[50.3364012453720164,115.29936949267524,1.8972963354308543],"rgb":[0.866666666666666696,0.2,0.4],"xyz":[0.333999208041843576,0.187017287744743188,0.144218774632488278],"hpluv":[0.942739432835561,290.698564526315124,50.3364012453720164],"hsluv":[0.942739432835561,82.1889615211792375,50.3364012453720164]},"#dd3377":{"lch":[50.77400791740952,109.376176789803836,354.916348657894],"luv":[50.77400791740952,108.945933542464203,-9.69183231981436],"rgb":[0.866666666666666696,0.2,0.466666666666666674],"xyz":[0.343313221062045482,0.190742892952824,0.193272576538886187],"hpluv":[354.916348657894,273.35096965093777,50.77400791740952],"hsluv":[354.916348657894,83.1884512053650269,50.77400791740952]},"#dd3388":{"lch":[51.2900053848270545,104.574014460431073,347.747121452304157],"luv":[51.2900053848270545,102.191864987712989,-22.1934051173651383],"rgb":[0.866666666666666696,0.2,0.533333333333333326],"xyz":[0.354453638163989282,0.195199059793601609,0.251945439942458382],"hpluv":[347.747121452304157,258.720214242298141,51.2900053848270545],"hsluv":[347.747121452304157,84.245872474104587,51.2900053848270545]},"#dd3399":{"lch":[51.8848727297214509,101.568582070491487,339.671486537323062],"luv":[51.8848727297214509,95.2425012264059347,-35.2851643605103433],"rgb":[0.866666666666666696,0.2,0.6],"xyz":[0.367510602273062,0.200421845437230767,0.320712117583576262],"hpluv":[339.671486537323062,248.403642764366595,51.8848727297214509],"hsluv":[339.671486537323062,85.3275173092541763,51.8848727297214509]},"#dd33aa":{"lch":[52.5581975758694284,100.811065681036794,331.124654782349864],"luv":[52.5581975758694284,88.2774684157494,-48.6822301651504219],"rgb":[0.866666666666666696,0.2,0.66666666666666663],"xyz":[0.382568295238314537,0.206444922623331861,0.400015967200574862],"hpluv":[331.124654782349864,243.392431352391867,52.5581975758694284],"hsluv":[331.124654782349864,86.4040244757801,52.5581975758694284]},"#dd33bb":{"lch":[53.3087788146031301,102.447919096954379,322.651217662355],"luv":[53.3087788146031301,81.4417156804123579,-62.1516136100020091],"rgb":[0.866666666666666696,0.2,0.733333333333333282],"xyz":[0.399705887345651212,0.21329995946626662,0.490273952299216609],"hpluv":[322.651217662355,243.861776984359892,53.3087788146031301],"hsluv":[322.651217662355,87.4518397844355633,53.3087788146031301]},"#dd33cc":{"lch":[54.1347343907921612,106.321268361530926,314.743497623169446],"luv":[54.1347343907921612,74.8431687457043751,-75.5163041872859253],"rgb":[0.866666666666666696,0.2,0.8],"xyz":[0.418998262789372911,0.221016909643755421,0.59188046296948682],"hpluv":[314.743497623169446,249.220329072313831,54.1347343907921612],"hsluv":[314.743497623169446,88.4535853271675734,54.1347343907921612]},"#dd33dd":{"lch":[55.033612168624586,112.066789743934578,307.715012949243715],"luv":[55.033612168624586,68.5551036430149,-88.6519211749340741],"rgb":[0.866666666666666696,0.2,0.866666666666666696],"xyz":[0.44051658834000651,0.229624239864008955,0.705210310869492818],"hpluv":[307.715012949243715,258.397459164480438,55.033612168624586],"hsluv":[307.715012949243715,89.3976510430439077,55.033612168624586]},"#dd33ee":{"lch":[56.0025007026426351,119.245240694744666,301.678101579798295],"luv":[56.0025007026426351,62.6212128139869506,-101.479116738632214],"rgb":[0.866666666666666696,0.2,0.933333333333333348],"xyz":[0.464328768606181219,0.239149111970479,0.830621126938016],"hpluv":[301.678101579798295,270.192295422478139,56.0025007026426351],"hsluv":[301.678101579798295,90.277343199481848,56.0025007026426351]},"#dd33ff":{"lch":[57.0381364623091116,127.442655532056975,296.59904001960814],"luv":[57.0381364623091116,57.0616979163907772,-113.954346472440875],"rgb":[0.866666666666666696,0.2,1],"xyz":[0.49049981701601264,0.249617531334411696,0.968455315229797886],"hpluv":[296.59904001960814,283.523336448078851,57.0381364623091116],"hsluv":[296.59904001960814,99.9999999999989626,57.0381364623091116]},"#dd4400":{"lch":[51.2775121999195278,131.902040393952689,18.409420821930695],"luv":[51.2775121999195278,125.151834557466444,41.6553305951168156],"rgb":[0.866666666666666696,0.266666666666666663,0],"xyz":[0.318851599097148664,0.19509035693961102,0.0208673531411264039],"hpluv":[18.409420821930695,326.410329295551833,51.2775121999195278],"hsluv":[18.409420821930695,100.000000000002245,51.2775121999195278]},"#dd4411":{"lch":[51.3239968707682124,130.563017922041524,17.8265447991253865],"luv":[51.3239968707682124,124.294382399750674,39.9700907276414128],"rgb":[0.866666666666666696,0.266666666666666663,0.0666666666666666657],"xyz":[0.319863264596785768,0.195495023139465873,0.0261954581058820371],"hpluv":[17.8265447991253865,322.804096021626094,51.3239968707682124],"hsluv":[17.8265447991253865,96.7659447415066154,51.3239968707682124]},"#dd4422":{"lch":[51.4099976690743148,128.162025810787327,16.7333496749677373],"luv":[51.4099976690743148,122.735013936090269,36.9001519513490237],"rgb":[0.866666666666666696,0.266666666666666663,0.133333333333333331],"xyz":[0.321738622735262825,0.196245166394856702,0.0360723443018612297],"hpluv":[16.7333496749677373,316.337811591652041,51.4099976690743148],"hsluv":[16.7333496749677373,90.8878404873512551,51.4099976690743148]},"#dd4433":{"lch":[51.551120550377874,124.432504768689228,14.8985084842763058],"luv":[51.551120550377874,120.249428964759446,31.9925472049216744],"rgb":[0.866666666666666696,0.266666666666666663,0.2],"xyz":[0.324826373467720531,0.197480266687839801,0.0523344981594723729],"hpluv":[14.8985084842763058,306.291581325991444,51.551120550377874],"hsluv":[14.8985084842763058,81.5276169642245634,51.551120550377874]},"#dd4444":{"lch":[51.7538349343952575,119.518854000271219,12.1770506300618191],"luv":[51.7538349343952575,116.829734805674121,25.2105042943215345],"rgb":[0.866666666666666696,0.266666666666666663,0.266666666666666663],"xyz":[0.329284368711939446,0.199263464785527394,0.0758132731123590115],"hpluv":[12.1770506300618191,293.044254198223086,51.7538349343952575],"hsluv":[12.1770506300618191,68.6693518559736,51.7538349343952575]},"#dd4455":{"lch":[52.0230766847265045,113.767549619287195,8.41751308754220773],"luv":[52.0230766847265045,112.542004033713866,16.6539086839248256],"rgb":[0.866666666666666696,0.266666666666666663,0.333333333333333315],"xyz":[0.335246782751301431,0.201648430401272227,0.107215320386332927],"hpluv":[8.41751308754220773,277.499175779034886,52.0230766847265045],"hsluv":[8.41751308754220773,69.8262296658756867,52.0230766847265045]},"#dd4466":{"lch":[52.3625377834239316,107.708396397149357,3.47572472865958737],"luv":[52.3625377834239316,107.51027478189765,6.52989056311981209],"rgb":[0.866666666666666696,0.266666666666666663,0.4],"xyz":[0.342831778524809616,0.204682428710675518,0.147162964793476875],"hpluv":[3.47572472865958737,261.016642983210886,52.3625377834239316],"hsluv":[3.47572472865958737,71.1800009153795088,52.3625377834239316]},"#dd4477":{"lch":[52.7748219535637304,102.013560717275851,357.256373562230806],"luv":[52.7748219535637304,101.896624345108023,-4.88308481282748108],"rgb":[0.866666666666666696,0.266666666666666663,0.466666666666666674],"xyz":[0.352145791545011522,0.208408033918756341,0.196216766699874784],"hpluv":[357.256373562230806,245.284698321799027,52.7748219535637304],"hsluv":[357.256373562230806,72.6848757644217898,52.7748219535637304]},"#dd4488":{"lch":[53.2615487789460502,97.4233940898595137,349.787328406912707],"luv":[53.2615487789460502,95.8798587184095368,-17.273401753155067],"rgb":[0.866666666666666696,0.266666666666666663,0.533333333333333326],"xyz":[0.363286208646955322,0.212864200759533939,0.254889630103446951],"hpluv":[349.787328406912707,232.107295472344475,53.2615487789460502],"hsluv":[349.787328406912707,74.290572198007979,53.2615487789460502]},"#dd4499":{"lch":[53.8234397136373133,94.6288173232078123,341.30539151945959],"luv":[53.8234397136373133,89.63624285692255,-30.330793502376995],"rgb":[0.866666666666666696,0.266666666666666663,0.6],"xyz":[0.376343172756028,0.218086986403163097,0.323656307744564886],"hpluv":[341.30539151945959,223.095746339835301,53.8234397136373133],"hsluv":[341.30539151945959,75.9477058190526577,53.8234397136373133]},"#dd44aa":{"lch":[54.4604007326765327,94.1226543521493539,332.285935566136516],"luv":[54.4604007326765327,83.3248558176969425,-43.7726223255380802],"rgb":[0.866666666666666696,0.266666666666666663,0.66666666666666663],"xyz":[0.391400865721280578,0.224110063589264191,0.402960157361563487],"hpluv":[332.285935566136516,219.307083848265933,54.4604007326765327],"hsluv":[332.285935566136516,77.6118806813578175,54.4604007326765327]},"#dd44bb":{"lch":[55.1716077278512387,96.0796222427451596,323.344264550451],"luv":[55.1716077278512387,77.0786382371216,-57.3600674495728526],"rgb":[0.866666666666666696,0.266666666666666663,0.733333333333333282],"xyz":[0.408538457828617252,0.23096510043219895,0.493218142460205233],"hpluv":[323.344264550451,220.981019921853772,55.1716077278512387],"hsluv":[323.344264550451,79.2461809113807334,55.1716077278512387]},"#dd44cc":{"lch":[55.9555962107488511,100.342448880687911,315.038748994660807],"luv":[55.9555962107488511,71.0007950362134,-70.9048246002984],"rgb":[0.866666666666666696,0.266666666666666663,0.8],"xyz":[0.427830833272338951,0.238682050609687751,0.594824653130475389],"hpluv":[315.038748994660807,227.551915064947707,55.9555962107488511],"hsluv":[315.038748994660807,80.8221578956601547,55.9555962107488511]},"#dd44dd":{"lch":[56.8103543983327484,106.525561993860563,307.715012949243828],"luv":[56.8103543983327484,65.1653443433699664,-84.2684594300729515],"rgb":[0.866666666666666696,0.266666666666666663,0.866666666666666696],"xyz":[0.44934915882297255,0.247289380829941285,0.708154501030481387],"hpluv":[307.715012949243828,237.939016458104504,56.8103543983327484],"hsluv":[307.715012949243828,82.3196529548951474,56.8103543983327484]},"#dd44ee":{"lch":[57.7334174818232384,114.162073161526394,301.482814132357476],"luv":[57.7334174818232384,59.6203198077272134,-97.3570563162323452],"rgb":[0.866666666666666696,0.266666666666666663,0.933333333333333348],"xyz":[0.473161339089147259,0.256814252936411302,0.83356531709900461],"hpluv":[301.482814132357476,250.91920763959763,57.7334174818232384],"hsluv":[301.482814132357476,85.8927976857303577,57.7334174818232384]},"#dd44ff":{"lch":[58.721960397178492,122.814959128704743,296.287773174859751],"luv":[58.721960397178492,54.3922733794591196,-110.113554035820684],"rgb":[0.866666666666666696,0.266666666666666663,1],"xyz":[0.49933238749897868,0.267282672300344,0.971399505390786455],"hpluv":[296.287773174859751,265.393357493052918,58.721960397178492],"hsluv":[296.287773174859751,99.9999999999987779,58.721960397178492]},"#dd5500":{"lch":[53.8905970004369834,121.845910621274882,22.2085433527856502],"luv":[53.8905970004369834,112.806678507237621,46.055175814369008],"rgb":[0.866666666666666696,0.333333333333333315,0],"xyz":[0.330664855811494629,0.218716870368303284,0.0248051053792416147],"hpluv":[22.2085433527856502,286.904453583707834,53.8905970004369834],"hsluv":[22.2085433527856502,100.000000000002217,53.8905970004369834]},"#dd5511":{"lch":[53.9336739056601573,120.58904296901602,21.6306448037720749],"luv":[53.9336739056601573,112.097097503939963,44.4517492948856656],"rgb":[0.866666666666666696,0.333333333333333315,0.0666666666666666657],"xyz":[0.331676521311131733,0.219121536568158137,0.0301332103439972479],"hpluv":[21.6306448037720749,283.71818310283129,53.9336739056601573],"hsluv":[21.6306448037720749,97.0955711707227493,53.9336739056601573]},"#dd5522":{"lch":[54.0133869328819856,118.329807147086328,20.5443811064534074],"luv":[54.0133869328819856,110.804107011743554,41.5258128011568957],"rgb":[0.866666666666666696,0.333333333333333315,0.133333333333333331],"xyz":[0.33355187944960879,0.219871679823548966,0.0400100965399764405],"hpluv":[20.5443811064534074,277.99185559962018,54.0133869328819856],"hsluv":[20.5443811064534074,91.805999212684128,54.0133869328819856]},"#dd5533":{"lch":[54.1442392255445526,114.805940194650788,18.7140712474621722],"luv":[54.1442392255445526,108.736323489647134,36.8349814433582736],"rgb":[0.866666666666666696,0.333333333333333315,0.2],"xyz":[0.336639630182066496,0.221106780116532065,0.0562722503975875837],"hpluv":[18.7140712474621722,269.061420184977408,54.1442392255445526],"hsluv":[18.7140712474621722,83.3546452149230674,54.1442392255445526]},"#dd5544":{"lch":[54.3323026853354207,110.135081135525823,15.9827981501284579],"luv":[54.3323026853354207,105.877744255237971,30.3255563535325479],"rgb":[0.866666666666666696,0.333333333333333315,0.266666666666666663],"xyz":[0.341097625426285411,0.222889978214219658,0.0797510253504742223],"hpluv":[15.9827981501284579,257.221277658214035,54.3323026853354207],"hsluv":[15.9827981501284579,71.6878656400709104,54.3323026853354207]},"#dd5555":{"lch":[54.5822696158357132,104.625049281135261,12.1770506300618937],"luv":[54.5822696158357132,102.271033836367579,22.0689051636128752],"rgb":[0.866666666666666696,0.333333333333333315,0.333333333333333315],"xyz":[0.347060039465647396,0.225274943829964491,0.111153072624448138],"hpluv":[12.1770506300618937,243.233512665758,54.5822696158357132],"hsluv":[12.1770506300618937,61.8784513389384,54.5822696158357132]},"#dd5566":{"lch":[54.8977244977922254,98.7674373059184205,7.11744080010036573],"luv":[54.8977244977922254,98.0063618739055897,12.2376347477602359],"rgb":[0.866666666666666696,0.333333333333333315,0.4],"xyz":[0.354645035239155582,0.228308942139367782,0.151100717031592086],"hpluv":[7.11744080010036573,228.296245111676484,54.8977244977922254],"hsluv":[7.11744080010036573,62.7979151590930655,54.8977244977922254]},"#dd5577":{"lch":[55.2812881935381597,93.2135187108595886,0.661514811515945267],"luv":[55.2812881935381597,93.2073060454778783,1.07618316489082022],"rgb":[0.866666666666666696,0.333333333333333315,0.466666666666666674],"xyz":[0.363959048259357487,0.232034547347448605,0.20015451893799],"hpluv":[0.661514811515945267,213.963687644495565,55.2812881935381597],"hsluv":[0.661514811515945267,63.8225359413096456,55.2812881935381597]},"#dd5588":{"lch":[55.7347110848163538,88.7163187329837,352.791835078768599],"luv":[55.7347110848163538,88.0151786426913532,-11.1316457915027787],"rgb":[0.866666666666666696,0.333333333333333315,0.533333333333333326],"xyz":[0.375099465361301287,0.236490714188226203,0.258827382341562162],"hpluv":[352.791835078768599,201.984054112510194,55.7347110848163538],"hsluv":[352.791835078768599,64.9173177009572,55.7347110848163538]},"#dd5599":{"lch":[56.2589463845586408,86.0173277442407169,343.733753082454825],"luv":[56.2589463845586408,82.5740942724548717,-24.0935598727929836],"rgb":[0.866666666666666696,0.333333333333333315,0.6],"xyz":[0.388156429470374,0.241713499831855361,0.327594059982680097],"hpluv":[343.733753082454825,194.014271994181229,56.2589463845586408],"hsluv":[343.733753082454825,66.0466553819121,56.2589463845586408]},"#dd55aa":{"lch":[56.8542178605490278,85.677853149792881,334.018383993549605],"luv":[56.8542178605490278,77.0187914763158545,-37.5339883290498477],"rgb":[0.866666666666666696,0.333333333333333315,0.66666666666666663],"xyz":[0.403214122435626543,0.247736577017956455,0.406897909599678698],"hpluv":[334.018383993549605,191.225239227061849,56.8542178605490278],"hsluv":[334.018383993549605,67.3075554564469485,56.8542178605490278]},"#dd55bb":{"lch":[57.5200884026389332,87.9206422548043633,324.375348896731964],"luv":[57.5200884026389332,71.4663144117056817,-51.2113780219251638],"rgb":[0.866666666666666696,0.333333333333333315,0.733333333333333282],"xyz":[0.420351714542963217,0.254591613860891242,0.497155894698320444],"hpluv":[324.375348896731964,193.959311397505388,57.5200884026389332],"hsluv":[324.375348896731964,69.5366313504716,57.5200884026389332]},"#dd55cc":{"lch":[58.2555317670128829,92.5910381182408315,315.474469199465034],"luv":[58.2555317670128829,66.0116746837007895,-64.9273374262858596],"rgb":[0.866666666666666696,0.333333333333333315,0.8],"xyz":[0.439644089986684916,0.262308564038380043,0.5987624053685906],"hpluv":[315.474469199465034,201.683843426221756,58.2555317670128829],"hsluv":[315.474469199465034,71.7082017587958802,58.2555317670128829]},"#dd55dd":{"lch":[59.0590075291469532,99.2700295618383848,307.715012949244056],"luv":[59.0590075291469532,60.7268860008133231,-78.5288742174016363],"rgb":[0.866666666666666696,0.333333333333333315,0.866666666666666696],"xyz":[0.461162415537318515,0.270915894258633549,0.712092253268596598],"hpluv":[307.715012949244056,213.290412049590259,59.0590075291469532],"hsluv":[307.715012949244056,73.7919865345850923,59.0590075291469532]},"#dd55ee":{"lch":[59.9285380001613674,107.447476486145689,301.201070052482692],"luv":[59.9285380001613674,55.6624113436061592,-91.905691698915],"rgb":[0.866666666666666696,0.333333333333333315,0.933333333333333348],"xyz":[0.484974595803493225,0.280440766365103566,0.837503069337119821],"hpluv":[301.201070052482692,227.510719406260364,59.9285380001613674],"hsluv":[301.201070052482692,84.9240358585231405,59.9285380001613674]},"#dd55ff":{"lch":[60.8617852443614,116.651127585902827,295.843561463814751],"luv":[60.8617852443614,50.8500320114402413,-104.984569397117028],"rgb":[0.866666666666666696,0.333333333333333315,1],"xyz":[0.511145644213324646,0.29090918572903629,0.975337257628901666],"hpluv":[295.843561463814751,243.211205533984923,60.8617852443614],"hsluv":[295.843561463814751,99.9999999999987,60.8617852443614]},"#dd6600":{"lch":[56.9556719941368783,111.624872970007345,27.247071009398578],"luv":[56.9556719941368783,99.2390381331236568,51.1050445257873349],"rgb":[0.866666666666666696,0.4,0],"xyz":[0.345692913517341105,0.248772985779996625,0.0298144579478569621],"hpluv":[27.247071009398578,248.69286407076,56.9556719941368783],"hsluv":[27.247071009398578,100.000000000002402,56.9556719941368783]},"#dd6611":{"lch":[56.9952083090352204,110.431802069127656,26.6846840374429064],"luv":[56.9952083090352204,98.6698726856829325,49.5927326573774181],"rgb":[0.866666666666666696,0.4,0.0666666666666666657],"xyz":[0.346704579016978209,0.249177651979851478,0.0351425629126125919],"hpluv":[26.6846840374429064,245.864111809588593,56.9952083090352204],"hsluv":[26.6846840374429064,97.4289366186781,56.9952083090352204]},"#dd6622":{"lch":[57.0683850250612181,108.280332786330632,25.6245441521289443],"luv":[57.0683850250612181,97.630674939023308,46.8282156319165637],"rgb":[0.866666666666666696,0.4,0.133333333333333331],"xyz":[0.348579937155455266,0.249927795235242306,0.0450194491085917914],"hpluv":[25.6245441521289443,240.764984433182946,57.0683850250612181],"hsluv":[25.6245441521289443,92.7369917538900239,57.0683850250612181]},"#dd6633":{"lch":[57.1885511035567617,104.905985735707603,23.8291565941278485],"luv":[57.1885511035567617,95.9631904105633566,42.3831561992078036],"rgb":[0.866666666666666696,0.4,0.2],"xyz":[0.351667687887912972,0.251162895528225405,0.0612816029662029346],"hpluv":[23.8291565941278485,232.771873337598265,57.1885511035567617],"hsluv":[23.8291565941278485,85.2149281001260306,57.1885511035567617]},"#dd6644":{"lch":[57.3613500282636153,100.395707721520722,21.1283100845564071],"luv":[57.3613500282636153,93.6466609873464222,36.1884099516133162],"rgb":[0.866666666666666696,0.4,0.266666666666666663],"xyz":[0.356125683132131887,0.252946093625912971,0.0847603779190895801],"hpluv":[21.1283100845564071,222.093121414046323,57.3613500282636153],"hsluv":[21.1283100845564071,74.7790089775498785,57.3613500282636153]},"#dd6655":{"lch":[57.5911977652478555,95.0134939889914136,17.3206113628181804],"luv":[57.5911977652478555,90.7049894048208927,28.2872575034667619],"rgb":[0.866666666666666696,0.4,0.333333333333333315],"xyz":[0.362088097171493872,0.255331059241657832,0.116162425193063482],"hpluv":[17.3206113628181804,209.347849744778358,57.5911977652478555],"hsluv":[17.3206113628181804,61.5516693045169205,57.5911977652478555]},"#dd6666":{"lch":[57.8815358558834703,89.2064417623026742,12.1770506300619559],"luv":[57.8815358558834703,87.1993378887650579,18.8166076552624659],"rgb":[0.866666666666666696,0.4,0.4],"xyz":[0.369673092945002058,0.25836505755106115,0.156110069600207457],"hpluv":[12.1770506300619559,195.566965385494854,57.8815358558834703],"hsluv":[12.1770506300619559,60.6635523422702,57.8815358558834703]},"#dd6677":{"lch":[58.2349645673757834,83.6008411979688901,5.48003957367995387],"luv":[58.2349645673757834,83.2187459143753188,7.98379467713524704],"rgb":[0.866666666666666696,0.4,0.466666666666666674],"xyz":[0.378987105965203963,0.262090662759141946,0.205163871506605366],"hpluv":[5.48003957367995387,182.165511808695555,58.2349645673757834],"hsluv":[5.48003957367995387,61.6238417996400329,58.2349645673757834]},"#dd6688":{"lch":[58.6533262634944208,78.9686504698842,357.125632416080862],"luv":[58.6533262634944208,78.8692993006444,-3.95997283577995],"rgb":[0.866666666666666696,0.4,0.533333333333333326],"xyz":[0.390127523067147763,0.266546829599919544,0.263836734910177506],"hpluv":[357.125632416080862,170.8446551494321,58.6533262634944208],"hsluv":[357.125632416080862,62.6596910240402778,58.6533262634944208]},"#dd6699":{"lch":[59.1377678367746853,76.1279623836736192,347.292482429378936],"luv":[59.1377678367746853,74.2632604984211184,-16.746187531306056],"rgb":[0.866666666666666696,0.4,0.6],"xyz":[0.403184487176220463,0.271769615243548701,0.332603412551295441],"hpluv":[347.292482429378936,163.349798950832565,59.1377678367746853],"hsluv":[347.292482429378936,63.7390009960191435,59.1377678367746853]},"#dd66aa":{"lch":[59.6887956605557406,75.751758533498986,336.577260120739709],"luv":[59.6887956605557406,69.5095811529117,-30.1122408476074845],"rgb":[0.866666666666666696,0.4,0.66666666666666663],"xyz":[0.418242180141473,0.277792692429649823,0.411907262168294042],"hpluv":[336.577260120739709,161.042027442088397,59.6887956605557406],"hsluv":[336.577260120739709,64.8305690383666473,59.6887956605557406]},"#dd66bb":{"lch":[60.3063295400458372,78.1477005551706,325.894443158435308],"luv":[60.3063295400458372,64.706761589723726,-43.8189240697585518],"rgb":[0.866666666666666696,0.4,0.733333333333333282],"xyz":[0.435379772248809693,0.284647729272584582,0.502165247266935788],"hpluv":[325.894443158435308,164.434383230317081,60.3063295400458372],"hsluv":[325.894443158435308,65.9059953936301213,60.3063295400458372]},"#dd66cc":{"lch":[60.9897585015337427,83.1712006992562891,316.109248272524042],"luv":[60.9897585015337427,59.9384091909213694,-57.6613885491638314],"rgb":[0.866666666666666696,0.4,0.8],"xyz":[0.454672147692531392,0.292364679450073384,0.603771757937205944],"hpluv":[316.109248272524042,173.043537218511,60.9897585015337427],"hsluv":[316.109248272524042,66.9408479310096709,60.9897585015337427]},"#dd66dd":{"lch":[61.7379991889007158,90.3518241723814555,307.715012949244283],"luv":[61.7379991889007158,55.2713135142553753,-71.4740094977595675],"rgb":[0.866666666666666696,0.4,0.866666666666666696],"xyz":[0.476190473243165,0.30097200967032689,0.717101605837211942],"hpluv":[307.715012949244283,185.705044478150711,61.7379991889007158],"hsluv":[307.715012949244283,67.9151328937623759,61.7379991889007158]},"#dd66ee":{"lch":[62.5495564285741779,99.1126076890086125,300.803780654240427],"luv":[62.5495564285741779,50.7555210146825431,-85.1304063742412183],"rgb":[0.866666666666666696,0.4,0.933333333333333348],"xyz":[0.500002653509339701,0.310496881776796907,0.842512421905735165],"hpluv":[300.803780654240427,201.068480083703747,62.5495564285741779],"hsluv":[300.803780654240427,83.670703518064812,62.5495564285741779]},"#dd66ff":{"lch":[63.4225848554444696,108.928953372808309,295.226788235463459],"luv":[63.4225848554444696,46.4257694276883512,-98.5401685402585628],"rgb":[0.866666666666666696,0.4,1],"xyz":[0.526173701919171122,0.320965301140729631,0.980346610197517],"hpluv":[295.226788235463459,217.940889521273107,63.4225848554444696],"hsluv":[295.226788235463459,99.9999999999986073,63.4225848554444696]},"#dd7700":{"lch":[60.3985006876916088,102.209421710697811,33.6568691403047779],"luv":[60.3985006876916088,85.0762157619203,56.6463008330327753],"rgb":[0.866666666666666696,0.466666666666666674,0],"xyz":[0.364146651570758706,0.285680461886832382,0.0359657039656626626],"hpluv":[33.6568691403047779,214.735624532269611,60.3985006876916088],"hsluv":[33.6568691403047779,100.000000000002245,60.3985006876916088]},"#dd7711":{"lch":[60.4345564785723894,101.058408313912437,33.1281817520222],"luv":[60.4345564785723894,84.6313647704988,55.2298287886556736],"rgb":[0.866666666666666696,0.466666666666666674,0.0666666666666666657],"xyz":[0.36515831707039581,0.286085128086687235,0.0412938089304182923],"hpluv":[33.1281817520222,212.190746676882327,60.4345564785723894],"hsluv":[33.1281817520222,97.7465438968969238,60.4345564785723894]},"#dd7722":{"lch":[60.5013044729937803,98.9745052833742136,32.1281810047412648],"luv":[60.5013044729937803,83.8175940663154364,52.6361436754539582],"rgb":[0.866666666666666696,0.466666666666666674,0.133333333333333331],"xyz":[0.367033675208872867,0.286835271342078035,0.0511706951263974918],"hpluv":[32.1281810047412648,207.585936448863947,60.5013044729937803],"hsluv":[32.1281810047412648,93.6262478826975126,60.5013044729937803]},"#dd7733":{"lch":[60.6109510167574115,95.6833141687104813,30.4242910043150516],"luv":[60.6109510167574115,82.5076313520097813,48.4539717565960331],"rgb":[0.866666666666666696,0.466666666666666674,0.2],"xyz":[0.370121425941330573,0.288070371635061162,0.067432848984008642],"hpluv":[30.4242910043150516,200.320058173129354,60.6109510167574115],"hsluv":[30.4242910043150516,86.9991150080846722,60.6109510167574115]},"#dd7744":{"lch":[60.7687036553482756,91.2360291121886888,27.8356422373186483],"luv":[60.7687036553482756,80.6791699404734857,42.6014617809804932],"rgb":[0.866666666666666696,0.466666666666666674,0.266666666666666663],"xyz":[0.374579421185549488,0.289853569732748728,0.0909116239368952805],"hpluv":[27.8356422373186483,190.513488615549676,60.7687036553482756],"hsluv":[27.8356422373186483,77.760618312285672,60.7687036553482756]},"#dd7755":{"lch":[60.9786842032445122,85.8448802225428125,24.131655223886618],"luv":[60.9786842032445122,78.3427622472179479,35.096368243717265],"rgb":[0.866666666666666696,0.466666666666666674,0.333333333333333315],"xyz":[0.380541835224911473,0.292238535348493589,0.122313671210869182],"hpluv":[24.131655223886618,178.63875223296418,60.9786842032445122],"hsluv":[24.131655223886618,65.9765814384596894,60.9786842032445122]},"#dd7766":{"lch":[61.2441632046235895,79.8999585154359693,19.0216316495787474],"luv":[61.2441632046235895,75.5370685872685073,26.0414024201977448],"rgb":[0.866666666666666696,0.466666666666666674,0.4],"xyz":[0.388126830998419659,0.295272533657896907,0.162261315618013158],"hpluv":[19.0216316495787474,165.546946717194828,61.2441632046235895],"hsluv":[19.0216316495787474,57.9572057581871576,61.2441632046235895]},"#dd7777":{"lch":[61.5676827516498122,73.9875996712566,12.1770506300619097],"luv":[61.5676827516498122,72.3229127387857318,15.6064473244910626],"rgb":[0.866666666666666696,0.466666666666666674,0.466666666666666674],"xyz":[0.397440844018621564,0.298998138865977703,0.211315117524411067],"hpluv":[12.1770506300619097,152.491436777287873,61.5676827516498122],"hsluv":[12.1770506300619097,58.8480912007490744,61.5676827516498122]},"#dd7788":{"lch":[61.9511315612573,68.8928540500868252,3.33484257213660307],"luv":[61.9511315612573,68.7761927043778769,4.00757485979294081],"rgb":[0.866666666666666696,0.466666666666666674,0.533333333333333326],"xyz":[0.408581261120565364,0.303454305706755301,0.269987980927983207],"hpluv":[3.33484257213660307,141.112101622994089,61.9511315612573],"hsluv":[3.33484257213660307,59.8177792812577849,61.9511315612573]},"#dd7799":{"lch":[62.395798681375723,65.5359342889949659,352.534540584191575],"luv":[62.395798681375723,64.9804103256140309,-8.5149842657693231],"rgb":[0.866666666666666696,0.466666666666666674,0.6],"xyz":[0.421638225229638119,0.308677091350384458,0.338754658569101141],"hpluv":[352.534540584191575,133.27953643418,62.395798681375723],"hsluv":[352.534540584191575,60.8378233331756135,62.395798681375723]},"#dd77aa":{"lch":[62.9024183325334576,64.7691926058513587,340.409048511657261],"luv":[62.9024183325334576,61.0197310981447743,-21.7172909803219412],"rgb":[0.866666666666666696,0.466666666666666674,0.66666666666666663],"xyz":[0.43669591819489062,0.314700168536485581,0.418058508186099742],"hpluv":[340.409048511657261,130.659342151792146,62.9024183325334576],"hsluv":[340.409048511657261,61.8795186032410598,62.9024183325334576]},"#dd77bb":{"lch":[63.4712121738611472,67.0588140204747,328.168414880738283],"luv":[63.4712121738611472,56.973307333119962,-35.3684434115847779],"rgb":[0.866666666666666696,0.466666666666666674,0.733333333333333282],"xyz":[0.453833510302227294,0.321555205379420339,0.508316493284741489],"hpluv":[328.168414880738283,134.065922948238125,63.4712121738611472],"hsluv":[328.168414880738283,62.9156692244191049,63.4712121738611472]},"#dd77cc":{"lch":[64.1019320742502856,72.2937871392105649,317.045265551381931],"luv":[64.1019320742502856,52.9112642996390861,-49.2624580095555586],"rgb":[0.866666666666666696,0.466666666666666674,0.8],"xyz":[0.473125885745949049,0.329272155556909141,0.609923003955011644],"hpluv":[317.045265551381931,143.109736775843601,64.1019320742502856],"hsluv":[317.045265551381931,63.9218174738772262,64.1019320742502856]},"#dd77dd":{"lch":[64.7939046430230547,79.9242419089019904,307.715012949244624],"luv":[64.7939046430230547,48.8924033620837761,-63.225132172198613],"rgb":[0.866666666666666696,0.466666666666666674,0.866666666666666696],"xyz":[0.494644211296582537,0.337879485777162647,0.723252851855017642],"hpluv":[307.715012949244624,156.524995415635317,64.7939046430230547],"hsluv":[307.715012949244624,64.8769154463944,64.7939046430230547]},"#dd77ee":{"lch":[65.5460776792256,89.2673698488479772,300.244676230176196],"luv":[65.5460776792256,44.9634126652007424,-77.116501743983946],"rgb":[0.866666666666666696,0.466666666666666674,0.933333333333333348],"xyz":[0.518456391562757357,0.347404357883632664,0.848663667923540865],"hpluv":[300.244676230176196,172.816560464305326,65.5460776792256],"hsluv":[300.244676230176196,82.07388698168063,65.5460776792256]},"#dd77ff":{"lch":[66.3570680439545,99.7204006423648366,294.377473048092611],"luv":[66.3570680439545,41.1592308753033436,-90.8299290874281837],"rgb":[0.866666666666666696,0.466666666666666674,1],"xyz":[0.544627439972588667,0.357872777247565388,0.98649785621532271],"hpluv":[294.377473048092611,190.693615319177383,66.3570680439545],"hsluv":[294.377473048092611,99.9999999999983373,66.3570680439545]},"#dd8800":{"lch":[64.1467534130096766,94.4821411478558701,41.4445641191571781],"luv":[64.1467534130096766,70.8234804869986192,62.5372657508392],"rgb":[0.866666666666666696,0.533333333333333326,0],"xyz":[0.386219021295729159,0.329825201336773954,0.0433231605406526124],"hpluv":[41.4445641191571781,186.902182331454583,64.1467534130096766],"hsluv":[41.4445641191571781,100.000000000002416,64.1467534130096766]},"#dd8811":{"lch":[64.1795176641247593,93.3565504581455,40.9755438084832377],"luv":[64.1795176641247593,70.4832194968749235,61.2173282886440333],"rgb":[0.866666666666666696,0.533333333333333326,0.0666666666666666657],"xyz":[0.387230686795366263,0.330229867536628807,0.0486512655054082421],"hpluv":[40.9755438084832377,184.581288668542754,64.1795176641247593],"hsluv":[40.9755438084832377,98.0366401848460072,64.1795176641247593]},"#dd8822":{"lch":[64.2401831232140665,91.3094921720035444,40.0852847486271529],"luv":[64.2401831232140665,69.8596876954725303,58.7966614341343359],"rgb":[0.866666666666666696,0.533333333333333326,0.133333333333333331],"xyz":[0.38910604493384332,0.330980010792019608,0.0585281517013874417],"hpluv":[40.0852847486271529,180.363429125237786,64.2401831232140665],"hsluv":[40.0852847486271529,94.440421143342,64.2401831232140665]},"#dd8833":{"lch":[64.3398685532121704,88.0506151089842319,38.5586382769189342],"luv":[64.3398685532121704,68.8529964065635,54.8832916916272],"rgb":[0.866666666666666696,0.533333333333333326,0.2],"xyz":[0.392193795666301,0.332215111085002734,0.0747903055589985849],"hpluv":[38.5586382769189342,173.656703033806934,64.3398685532121704],"hsluv":[38.5586382769189342,88.6389494712849171,64.3398685532121704]},"#dd8844":{"lch":[64.4833562447751376,83.590391105324656,36.2144134416389392],"luv":[64.4833562447751376,67.4417066096926305,49.3859260793323571],"rgb":[0.866666666666666696,0.533333333333333326,0.266666666666666663],"xyz":[0.396651790910519941,0.333998309182690301,0.0982690805118852234],"hpluv":[36.2144134416389392,164.493238171948974,64.4833562447751376],"hsluv":[36.2144134416389392,80.515719620269337,64.4833562447751376]},"#dd8855":{"lch":[64.6744699451661234,78.0792033713498768,32.8038905377638059],"luv":[64.6744699451661234,65.6278986079903746,42.3006019272060527],"rgb":[0.866666666666666696,0.533333333333333326,0.333333333333333315],"xyz":[0.402614204949881926,0.336383274798435161,0.129671127785859125],"hpluv":[32.8038905377638059,153.194023310958244,64.6744699451661234],"hsluv":[32.8038905377638059,70.0933757373770874,64.6744699451661234]},"#dd8866":{"lch":[64.9162913059566762,71.8298791231791114,27.9793586637294176],"luv":[64.9162913059566762,63.4341634455056251,33.69923504798588],"rgb":[0.866666666666666696,0.533333333333333326,0.4],"xyz":[0.410199200723390112,0.33941727310783848,0.169618772193003087],"hpluv":[27.9793586637294176,140.40764710249897,64.9162913059566762],"hsluv":[27.9793586637294176,57.516131894534638,64.9162913059566762]},"#dd8877":{"lch":[65.211273186305,65.3549274640793243,21.2774014292581],"luv":[65.211273186305,60.8999714810578325,23.7162395299384023],"rgb":[0.866666666666666696,0.533333333333333326,0.466666666666666674],"xyz":[0.419513213743592,0.343142878315919275,0.218672574099401],"hpluv":[21.2774014292581,127.173019810527066,65.211273186305],"hsluv":[21.2774014292581,55.3192807564291797,65.211273186305]},"#dd8888":{"lch":[65.5613077882642585,59.4140252364257222,12.17705063006205],"luv":[65.5613077882642585,58.0772370198051675,12.5323954190731097],"rgb":[0.866666666666666696,0.533333333333333326,0.533333333333333326],"xyz":[0.430653630845535818,0.347599045156696873,0.277345437502973191],"hpluv":[12.17705063006205,114.995459986814794,65.5613077882642585],"hsluv":[12.17705063006205,56.217054427929,65.5613077882642585]},"#dd8899":{"lch":[65.9677735951440809,55.0265961591163304,0.371909902430330563],"luv":[65.9677735951440809,55.0254369244830599,0.357178006339119947],"rgb":[0.866666666666666696,0.533333333333333326,0.6],"xyz":[0.443710594954608517,0.352821830800326031,0.34611211514409107],"hpluv":[0.371909902430330563,105.847388780281833,65.9677735951440809],"hsluv":[0.371909902430330563,57.1692646853200088,65.9677735951440809]},"#dd88aa":{"lch":[66.4315725960282,53.3143351650078756,346.342357286170909],"luv":[66.4315725960282,51.8068159744011751,-12.5885723051236678],"rgb":[0.866666666666666696,0.533333333333333326,0.66666666666666663],"xyz":[0.458768287919861073,0.358844907986427153,0.425415964761089671],"hpluv":[346.342357286170909,101.837748961685463,66.4315725960282],"hsluv":[346.342357286170909,58.1497775423036174,66.4315725960282]},"#dd88bb":{"lch":[66.9531637379342754,55.0554122119122695,331.715662007953938],"luv":[66.9531637379342754,48.482176665295448,-26.0878699709014299],"rgb":[0.866666666666666696,0.533333333333333326,0.733333333333333282],"xyz":[0.475905880027197747,0.365699944829361911,0.515673949859731473],"hpluv":[331.715662007953938,104.344182679937973,66.9531637379342754],"hsluv":[331.715662007953938,59.1328526037280824,66.9531637379342754]},"#dd88cc":{"lch":[67.5325957217288391,60.2482932018326949,318.477460357427788],"luv":[67.5325957217288391,45.1075955230381,-39.9394749572899741],"rgb":[0.866666666666666696,0.533333333333333326,0.8],"xyz":[0.495198255470919446,0.373416895006850713,0.617280460530001629],"hpluv":[318.477460357427788,113.206309259525241,67.5325957217288391],"hsluv":[318.477460357427788,60.0943355072680134,67.5325957217288391]},"#dd88dd":{"lch":[68.1695406599531566,68.219499196860184,307.715012949245079],"luv":[68.1695406599531566,41.7322103060295,-53.965940125636024],"rgb":[0.866666666666666696,0.533333333333333326,0.866666666666666696],"xyz":[0.516716581021553,0.382024225227104219,0.730610308430007627],"hpluv":[307.715012949245079,126.986480244117786,68.1695406599531566],"hsluv":[307.715012949245079,61.0124281772922785,68.1695406599531566]},"#dd88ee":{"lch":[68.8633291469121,78.1074456653267504,299.445313850889818],"luv":[68.8633291469121,38.3970440138518896,-68.0179393936650456],"rgb":[0.866666666666666696,0.533333333333333326,0.933333333333333348],"xyz":[0.540528761287727755,0.391549097333574236,0.85602112449853085],"hpluv":[299.445313850889818,143.92748858218269,68.8633291469121],"hsluv":[299.445313850889818,80.0342386911036385,68.8633291469121]},"#dd88ff":{"lch":[69.6129866887261244,89.1875622693819281,293.199992160066699],"luv":[69.6129866887261244,35.1347073752451706,-81.975445111391565],"rgb":[0.866666666666666696,0.533333333333333326,1],"xyz":[0.566699809697559176,0.40201751669750696,0.993855312790312695],"hpluv":[293.199992160066699,162.574846632166981,69.6129866887261244],"hsluv":[293.199992160066699,99.9999999999981242,69.6129866887261244]},"#dd9900":{"lch":[68.1357569139589287,89.1370219700488775,50.3810095729648921],"luv":[68.1357569139589287,56.8408371488252229,68.6624199829113735],"rgb":[0.866666666666666696,0.6,0],"xyz":[0.41208862174819666,0.381564402241709621,0.0519463606914748674],"hpluv":[50.3810095729648921,166.005456049637957,68.1357569139589287],"hsluv":[50.3810095729648921,100.000000000002245,68.1357569139589287]},"#dd9911":{"lch":[68.1654896561650077,88.0318570495471278,50.0002977758109424],"luv":[68.1654896561650077,56.5854364905009248,67.4366089951992507],"rgb":[0.866666666666666696,0.6,0.0666666666666666657],"xyz":[0.413100287247833764,0.381969068441564474,0.0572744656562305],"hpluv":[50.0002977758109424,163.875726960716179,68.1654896561650077],"hsluv":[50.0002977758109424,98.2940371374324826,68.1654896561650077]},"#dd9922":{"lch":[68.2205507365204,86.012937831153792,49.27558445879027],"luv":[68.2205507365204,56.1166821435168472,65.1854543556261774],"rgb":[0.866666666666666696,0.6,0.133333333333333331],"xyz":[0.414975645386310821,0.382719211696955275,0.0671513518522096897],"hpluv":[49.27558445879027,159.988175949224541,68.2205507365204],"hsluv":[49.27558445879027,95.1643810214000325,68.2205507365204]},"#dd9933":{"lch":[68.3110514885433133,82.7730333151944677,48.0261582829398179],"luv":[68.3110514885433133,55.3578808500206918,61.5376313485756867],"rgb":[0.866666666666666696,0.6,0.2],"xyz":[0.418063396118768527,0.383954311989938402,0.0834135057098208399],"hpluv":[48.0261582829398179,153.757824966526499,68.3110514885433133],"hsluv":[48.0261582829398179,90.1021642959546512,68.3110514885433133]},"#dd9944":{"lch":[68.4413718194248,78.2806718730308688,46.0898611008159875],"luv":[68.4413718194248,54.2899414547091936,56.3956190296495805],"rgb":[0.866666666666666696,0.6,0.266666666666666663],"xyz":[0.422521391362987442,0.385737510087625968,0.106892280662707478],"hpluv":[46.0898611008159875,145.136005207448051,68.4413718194248],"hsluv":[46.0898611008159875,82.9860784920926449,68.4413718194248]},"#dd9955":{"lch":[68.615044439797245,72.617894762441864,43.2298844404699452],"luv":[68.615044439797245,52.9102318436571935,49.7379734808277689],"rgb":[0.866666666666666696,0.6,0.333333333333333315],"xyz":[0.428483805402349427,0.388122475703370828,0.138294327936681394],"hpluv":[43.2298844404699452,134.296171447129637,68.615044439797245],"hsluv":[43.2298844404699452,73.8078183466747362,68.615044439797245]},"#dd9966":{"lch":[68.8349542760461333,65.9999398631214262,39.0839575312566296],"luv":[68.8349542760461333,51.2306688139135815,41.6102227200810404],"rgb":[0.866666666666666696,0.6,0.4],"xyz":[0.436068801175857612,0.391156474012774147,0.178241972343825356],"hpluv":[39.0839575312566296,121.667290932950721,68.8349542760461333],"hsluv":[39.0839575312566296,62.6592399312796076,68.8349542760461333]},"#dd9977":{"lch":[69.1034430542988929,58.8170492635600723,33.0939178586399834],"luv":[69.1034430542988929,49.2755524050587468,32.1148753578207291],"rgb":[0.866666666666666696,0.6,0.466666666666666674],"xyz":[0.445382814196059518,0.394882079220854942,0.227295774250223265],"hpluv":[33.0939178586399834,108.004754244465147,69.1034430542988929],"hsluv":[33.0939178586399834,50.7393036295826789,69.1034430542988929]},"#dd9988":{"lch":[69.4223715869125328,51.7141196395305656,24.4437159362198635],"luv":[69.4223715869125328,47.0788901370553745,21.3992587150758773],"rgb":[0.866666666666666696,0.6,0.533333333333333326],"xyz":[0.456523231298003318,0.39933824606163254,0.285968637653795432],"hpluv":[24.4437159362198635,94.5255072345235305,69.4223715869125328],"hsluv":[24.4437159362198635,51.5589665528693786,69.4223715869125328]},"#dd9999":{"lch":[69.7931614924381591,45.7097919546320597,12.1770506300622632],"luv":[69.7931614924381591,44.6813426781189875,9.64171649740066705],"rgb":[0.866666666666666696,0.6,0.6],"xyz":[0.469580195407076073,0.404561031705261698,0.354735315294913311],"hpluv":[12.1770506300622632,83.1066353202273689,69.7931614924381591],"hsluv":[12.1770506300622632,52.4335711570844438,69.7931614924381591]},"#dd99aa":{"lch":[70.2168268189972196,42.2311183685245624,355.977290330288042],"luv":[70.2168268189972196,42.1270745474506256,-2.96259155636920823],"rgb":[0.866666666666666696,0.6,0.66666666666666663],"xyz":[0.484637888372328574,0.41058410889136282,0.434039164911911912],"hpluv":[355.977290330288042,76.3186553239153369,70.2168268189972196],"hsluv":[355.977290330288042,53.3392978779897788,70.2168268189972196]},"#dd99bb":{"lch":[70.694001085559151,42.6623948649138427,337.661645838825223],"luv":[70.694001085559151,39.4608168046039651,-16.2149274658665163],"rgb":[0.866666666666666696,0.6,0.733333333333333282],"xyz":[0.501775480479665248,0.417439145734297579,0.524297150010553659],"hpluv":[337.661645838825223,76.5776430619999502,70.694001085559151],"hsluv":[337.661645838825223,54.2517942883204398,70.694001085559151]},"#dd99cc":{"lch":[71.2249627580945912,47.3730793907595,320.82657583403028],"luv":[71.2249627580945912,36.7253906259007294,-29.9241430008982121],"rgb":[0.866666666666666696,0.6,0.8],"xyz":[0.521067855923387,0.42515609591178638,0.625903660680823815],"hpluv":[320.82657583403028,84.3992741769230719,71.2249627580945912],"hsluv":[320.82657583403028,55.1472527266246075,71.2249627580945912]},"#dd99dd":{"lch":[71.8096607795551876,55.5140341348433424,307.715012949246],"luv":[71.8096607795551876,33.9598410238411077,-43.9151133843462844],"rgb":[0.866666666666666696,0.6,0.866666666666666696],"xyz":[0.54258618147402049,0.433763426132039887,0.739233508580829812],"hpluv":[307.715012949246,98.0977936102115677,71.8096607795551876],"hsluv":[307.715012949246,56.0031828352742878,71.8096607795551876]},"#dd99ee":{"lch":[72.447740927007942,65.8885644567307907,298.26171852853804],"luv":[72.447740927007942,31.1982236173053273,-58.0342465212858656],"rgb":[0.866666666666666696,0.6,0.933333333333333348],"xyz":[0.566398361740195311,0.443288298238509904,0.864644324649353],"hpluv":[298.26171852853804,115.404973126410823,72.447740927007942],"hsluv":[298.26171852853804,77.3800261839098908,72.447740927007942]},"#dd99ff":{"lch":[73.1385732331520302,77.5656763031263,291.532620718417377],"luv":[73.1385732331520302,28.4689992262389602,-72.1522710898123592],"rgb":[0.866666666666666696,0.6,1],"xyz":[0.592569410150026621,0.453756717602442627,1.00247851294113488],"hpluv":[291.532620718417377,134.574391894016571,73.1385732331520302],"hsluv":[291.532620718417377,99.9999999999977689,73.1385732331520302]},"#cc0000":{"lch":[42.5207510295766156,142.998625281495549,12.1770506300617818],"luv":[42.5207510295766156,139.781222041964895,30.163169542547891],"rgb":[0.8,0,0],"xyz":[0.249012838889184379,0.128397245052238429,0.0116724768229302719],"hpluv":[12.1770506300617818,426.746789183124861,42.5207510295766156],"hsluv":[12.1770506300617818,100.000000000002174,42.5207510295766156]},"#cc0011":{"lch":[42.5821659889152784,141.236718626044905,11.4841194603559],"luv":[42.5821659889152784,138.409148973409117,28.119711390930437],"rgb":[0.8,0,0.0666666666666666657],"xyz":[0.250024504388821511,0.128801911252093282,0.0170005817876859033],"hpluv":[11.4841194603559,420.880880123779207,42.5821659889152784],"hsluv":[11.4841194603559,99.9999999999964331,42.5821659889152784]},"#cc0022":{"lch":[42.6956735686566518,138.114600243667155,10.1872609469282853],"luv":[42.6956735686566518,135.937217546775798,24.4277646564013864],"rgb":[0.8,0,0.133333333333333331],"xyz":[0.251899862527298513,0.12955205450748411,0.0268774679836651],"hpluv":[10.1872609469282853,410.482879191578036,42.6956735686566518],"hsluv":[10.1872609469282853,99.9999999999964615,42.6956735686566518]},"#cc0033":{"lch":[42.881611378965772,133.362165770655935,8.01952044887972626],"luv":[42.881611378965772,132.057963211529,18.6054188736068511],"rgb":[0.8,0,0.2],"xyz":[0.254987613259756274,0.130787154800467209,0.0431396218412762461],"hpluv":[8.01952044887972626,394.639788400466045,42.881611378965772],"hsluv":[8.01952044887972626,99.9999999999966604,42.881611378965772]},"#cc0044":{"lch":[43.1480085091585153,127.29097956278504,4.82801781999359658],"luv":[43.1480085091585153,126.839328429887985,10.7134607624411853],"rgb":[0.8,0,0.266666666666666663],"xyz":[0.259445608503975134,0.132570352898154803,0.0666183967941628846],"hpluv":[4.82801781999359658,374.34858804079829,43.1480085091585153],"hsluv":[4.82801781999359658,99.9999999999967741,43.1480085091585153]},"#cc0055":{"lch":[43.5005971125795,120.485699890795146,0.473888563816867114],"luv":[43.5005971125795,120.481578818580687,0.996515708296922487],"rgb":[0.8,0,0.333333333333333315],"xyz":[0.265408022543337119,0.134955318513899636,0.0980204440681367861],"hpluv":[0.473888563816867114,351.463000970195878,43.5005971125795],"hsluv":[0.473888563816867114,99.999999999997,43.5005971125795]},"#cc0066":{"lch":[43.9431844272177372,113.726547538665841,354.863826263116096],"luv":[43.9431844272177372,113.269906269789104,-10.1811565500985228],"rgb":[0.8,0,0.4],"xyz":[0.272993018316845304,0.137989316823302927,0.137968088475280748],"hpluv":[354.863826263116096,328.404920869645196,43.9431844272177372],"hsluv":[354.863826263116096,99.9999999999972857,43.9431844272177372]},"#cc0077":{"lch":[44.4778741065655,107.874648109024193,348.012259047653401],"luv":[44.4778741065655,105.522124609829902,-22.4058234053856609],"rgb":[0.8,0,0.466666666666666674],"xyz":[0.28230703133704721,0.14171492203138375,0.187021890381678657],"hpluv":[348.012259047653401,307.761788629886667,44.4778741065655],"hsluv":[348.012259047653401,99.9999999999975273,44.4778741065655]},"#cc0088":{"lch":[45.1052440924579,103.725434836726933,340.1176986346278],"luv":[45.1052440924579,97.5426962017022703,-35.2758876538989838],"rgb":[0.8,0,0.533333333333333326],"xyz":[0.293447448438991065,0.146171088872161348,0.245694753785250825],"hpluv":[340.1176986346278,291.808241377507443,45.1052440924579],"hsluv":[340.1176986346278,99.9999999999978,45.1052440924579]},"#cc0099":{"lch":[45.8245205562958589,101.850048541314862,331.598662995615],"luv":[45.8245205562958589,89.5911194129305102,-48.4444394147173441],"rgb":[0.8,0,0.6],"xyz":[0.306504412548063765,0.151393874515790505,0.314461431426368732],"hpluv":[331.598662995615,282.034759885138044,45.8245205562958589],"hsluv":[331.598662995615,99.9999999999981,45.8245205562958589]},"#cc00aa":{"lch":[46.633760692471931,102.477609530343315,323.022725489580409],"luv":[46.633760692471931,81.8667129915779,-61.640098629123905],"rgb":[0.8,0,0.66666666666666663],"xyz":[0.321562105513316321,0.1574169517018916,0.393765281043367332],"hpluv":[323.022725489580409,278.848217687739293,46.633760692471931],"hsluv":[323.022725489580409,99.9999999999983658,46.633760692471931]},"#cc00bb":{"lch":[47.5300446684938933,105.484027274260768,314.937463984289479],"luv":[47.5300446684938933,74.5070162947061903,-74.6698368342758414],"rgb":[0.8,0,0.733333333333333282],"xyz":[0.33869969762065294,0.164271988544826358,0.484023266142009079],"hpluv":[314.937463984289479,281.616311803476265,47.5300446684938933],"hsluv":[314.937463984289479,99.9999999999986,47.5300446684938933]},"#cc00cc":{"lch":[48.5096711653281147,110.497164945278598,307.715012949243601],"luv":[48.5096711653281147,67.5949102529980621,-87.4102486487325],"rgb":[0.8,0,0.8],"xyz":[0.357992073064374694,0.17198893872231516,0.585629776812279235],"hpluv":[307.715012949243601,289.042783730483393,48.5096711653281147],"hsluv":[307.715012949243601,99.9999999999988,48.5096711653281147]},"#cc00dd":{"lch":[49.5683488162236614,117.049051317219835,301.506761454082039],"luv":[49.5683488162236614,61.1697383356450075,-99.7935044289451],"rgb":[0.8,0,0.866666666666666696],"xyz":[0.379510398615008238,0.180596268942568694,0.698959624712285232],"hpluv":[301.506761454082039,299.64205877637869,49.5683488162236614],"hsluv":[301.506761454082039,99.9999999999990337,49.5683488162236614]},"#cc00ee":{"lch":[50.7013760136427862,124.695255359169607,296.294949026353493],"luv":[50.7013760136427862,55.2390203059142522,-111.792474454818787],"rgb":[0.8,0,0.933333333333333348],"xyz":[0.403322578881182947,0.190121141049038739,0.824370440780808456],"hpluv":[296.294949026353493,312.082566880879938,50.7013760136427862],"hsluv":[296.294949026353493,99.99999999999919,50.7013760136427862]},"#cc00ff":{"lch":[51.9038030272213,133.072735088441448,291.971633700566258],"luv":[51.9038030272213,49.7888328026579075,-123.407556300526],"rgb":[0.8,0,1],"xyz":[0.429493627291014368,0.200589560412971435,0.962204629072590301],"hpluv":[291.971633700566258,325.333832743425603,51.9038030272213],"hsluv":[291.971633700566258,99.9999999999993321,51.9038030272213]},"#cc1100":{"lch":[43.1235624482234172,140.134259476931788,12.8715382160273855],"luv":[43.1235624482234172,136.61296213687416,31.2171307992428524],"rgb":[0.8,0.0666666666666666657,0],"xyz":[0.251017239150112814,0.132406045574095299,0.0123406102432397219],"hpluv":[12.8715382160273855,412.352867097941,43.1235624482234172],"hsluv":[12.8715382160273855,100.000000000002245,43.1235624482234172]},"#cc1111":{"lch":[43.1837333530957892,138.41807101963343,12.1770506300617676],"luv":[43.1837333530957892,135.303728142340162,29.196978192614182],"rgb":[0.8,0.0666666666666666657,0.0666666666666666657],"xyz":[0.252028904649749919,0.132810711773950152,0.0176687152079953516],"hpluv":[12.1770506300617676,406.735363437937394,43.1837333530957892],"hsluv":[12.1770506300617676,95.3107026807431197,43.1837333530957892]},"#cc1122":{"lch":[43.294951674171287,135.375047793376126,10.8766574447476163],"luv":[43.294951674171287,132.943125696930394,25.5446451333550044],"rgb":[0.8,0.0666666666666666657,0.133333333333333331],"xyz":[0.253904262788227,0.13356085502934098,0.0275456014039745511],"hpluv":[10.8766574447476163,396.771701832449367,43.294951674171287],"hsluv":[10.8766574447476163,95.396390587568618,43.294951674171287]},"#cc1133":{"lch":[43.4771672841157724,130.73841758888139,8.7012157385065958],"luv":[43.4771672841157724,129.233706917218683,19.7783424502448213],"rgb":[0.8,0.0666666666666666657,0.2],"xyz":[0.256992013520684681,0.134795955322324079,0.0438077552615856944],"hpluv":[8.7012157385065958,381.576227833431062,43.4771672841157724],"hsluv":[8.7012157385065958,95.5308510527687389,43.4771672841157724]},"#cc1144":{"lch":[43.7382910834512586,124.807582872189826,5.49437317543092796],"luv":[43.7382910834512586,124.234167693991893,11.9500761411646046],"rgb":[0.8,0.0666666666666666657,0.266666666666666663],"xyz":[0.261450008764903596,0.136579153420011673,0.0672865302144723398],"hpluv":[5.49437317543092796,362.091632024479338,43.7382910834512586],"hsluv":[5.49437317543092796,95.7116850897169229,43.7382910834512586]},"#cc1155":{"lch":[44.0840061747103107,118.151091154502552,1.11194247693657511],"luv":[44.0840061747103107,118.128842001262925,2.29282106589917234],"rgb":[0.8,0.0666666666666666657,0.333333333333333315],"xyz":[0.267412422804265582,0.138964119035756506,0.0986885774884462413],"hpluv":[1.11194247693657511,340.091681007194666,44.0840061747103107],"hsluv":[1.11194247693657511,95.9318436200579754,44.0840061747103107]},"#cc1166":{"lch":[44.5181325219627837,111.53522478210337,355.453854482233226],"luv":[44.5181325219627837,111.184314904818763,-8.84050260677650712],"rgb":[0.8,0.0666666666666666657,0.4],"xyz":[0.274997418577773767,0.141998117345159797,0.138636221895590217],"hpluv":[355.453854482233226,317.917500588946211,44.5181325219627837],"hsluv":[355.453854482233226,96.1812476973727115,44.5181325219627837]},"#cc1177":{"lch":[45.0428415016287857,105.814757555455103,348.528515458334311],"luv":[45.0428415016287857,103.700981473984271,-21.0444614531261323],"rgb":[0.8,0.0666666666666666657,0.466666666666666674],"xyz":[0.284311431597975672,0.14572372255324062,0.187690023801988126],"hpluv":[348.528515458334311,298.098498005115459,45.0428415016287857],"hsluv":[348.528515458334311,96.4486017572014589,45.0428415016287857]},"#cc1188":{"lch":[45.6588256994622341,101.788242110562607,340.533613155211185],"luv":[45.6588256994622341,95.9697371205835594,-33.9213176183443323],"rgb":[0.8,0.0666666666666666657,0.533333333333333326],"xyz":[0.295451848699919473,0.150179889394018218,0.246362887205560266],"hpluv":[340.533613155211185,282.886487347344485,45.6588256994622341],"hsluv":[340.533613155211185,96.7230145871901215,45.6588256994622341]},"#cc1199":{"lch":[46.3654632546324876,100.035938879036408,331.896400713626349],"luv":[46.3654632546324876,88.2414291467186,-47.1236591273953138],"rgb":[0.8,0.0666666666666666657,0.6],"xyz":[0.308508812808992228,0.155402675037647375,0.315129564846678201],"hpluv":[331.896400713626349,273.779405248492822,46.3654632546324876],"hsluv":[331.896400713626349,96.9951405388504355,46.3654632546324876]},"#cc11aa":{"lch":[47.1609900317596882,100.794975336059878,323.201580807901109],"luv":[47.1609900317596882,80.7113646178594735,-60.3763420100941488],"rgb":[0.8,0.0666666666666666657,0.66666666666666663],"xyz":[0.323566505774244728,0.16142575222374847,0.394433414463676801],"hpluv":[323.201580807901109,271.203503720358924,47.1609900317596882],"hsluv":[323.201580807901109,97.2577546113476075,47.1609900317596882]},"#cc11bb":{"lch":[48.0426807208370548,103.942897448445919,315.013990059648165],"luv":[48.0426807208370548,73.5166718264647727,-73.4807790754699681],"rgb":[0.8,0.0666666666666666657,0.733333333333333282],"xyz":[0.340704097881581403,0.168280789066683228,0.484691399562318548],"hpluv":[315.013990059648165,274.540811344802705,48.0426807208370548],"hsluv":[315.013990059648165,97.5058443216483,48.0426807208370548]},"#cc11cc":{"lch":[49.0070341259591515,109.103198367120783,307.715012949243601],"luv":[49.0070341259591515,66.7421730285370387,-86.3075328888743769],"rgb":[0.8,0.0666666666666666657,0.8],"xyz":[0.359996473325303157,0.17599773924417203,0.586297910232588704],"hpluv":[307.715012949243601,282.499958642668389,49.0070341259591515],"hsluv":[307.715012949243601,97.7363817897909541,49.0070341259591515]},"#cc11dd":{"lch":[50.0499556366759037,115.801352096543823,301.456118533327128],"luv":[50.0499556366759037,60.4304023076134555,-98.7831950502093292],"rgb":[0.8,0.0666666666666666657,0.866666666666666696],"xyz":[0.381514798875936645,0.184605069464425564,0.699627758132594701],"hpluv":[301.456118533327128,293.595408819402792,50.0499556366759037],"hsluv":[301.456118533327128,97.9479403979501342,50.0499556366759037]},"#cc11ee":{"lch":[51.1669298024285837,123.587345912593733,296.214453457233276],"luv":[51.1669298024285837,54.5925079172689109,-110.876012505059137],"rgb":[0.8,0.0666666666666666657,0.933333333333333348],"xyz":[0.40532697914211141,0.194129941570895609,0.825038574201117925],"hpluv":[296.214453457233276,306.495409047480564,51.1669298024285837],"hsluv":[296.214453457233276,98.1402788193950215,51.1669298024285837]},"#cc11ff":{"lch":[52.3531771468210678,132.094610043027387,291.87590029388349],"luv":[52.3531771468210678,49.2181193296501576,-122.582881072651375],"rgb":[0.8,0.0666666666666666657,1],"xyz":[0.431498027551942775,0.204598360934828305,0.96287276249289977],"hpluv":[291.87590029388349,320.170549145207644,52.3531771468210678],"hsluv":[291.87590029388349,99.9999999999991189,52.3531771468210678]},"#cc2200":{"lch":[44.2095884480383674,135.132222138307952,14.1797238149512133],"luv":[44.2095884480383674,131.015027118873576,33.102569825888537],"rgb":[0.8,0.133333333333333331,0],"xyz":[0.254732862884880729,0.139837293043631267,0.0135791514881623328],"hpluv":[14.1797238149512133,387.866054960954045,44.2095884480383674],"hsluv":[14.1797238149512133,100.00000000000226,44.2095884480383674]},"#cc2211":{"lch":[44.2676114068871129,133.490625771231663,13.482935392010976],"luv":[44.2676114068871129,129.81154471696064,31.1241068464871375],"rgb":[0.8,0.133333333333333331,0.0666666666666666657],"xyz":[0.255744528384517833,0.14024195924348612,0.0189072564529179643],"hpluv":[13.482935392010976,382.652016671578622,44.2676114068871129],"hsluv":[13.482935392010976,95.5414705532830197,44.2676114068871129]},"#cc2222":{"lch":[44.3748759613401162,130.576558981694717,12.1770506300617747],"luv":[44.3748759613401162,127.638646515421286,27.5429423121666019],"rgb":[0.8,0.133333333333333331,0.133333333333333331],"xyz":[0.25761988652299489,0.140992102498876948,0.0287841426488971604],"hpluv":[12.1770506300617747,373.394050741154899,44.3748759613401162],"hsluv":[12.1770506300617747,87.4977996802062847,44.3748759613401162]},"#cc2233":{"lch":[44.5506596541482907,126.128431434884163,9.98899557195718657],"luv":[44.5506596541482907,124.216461430809,21.8781152257824267],"rgb":[0.8,0.133333333333333331,0.2],"xyz":[0.260707637255452596,0.142227202791860047,0.0450462965065083071],"hpluv":[9.98899557195718657,359.251162664680805,44.5506596541482907],"hsluv":[9.98899557195718657,87.8457930667704829,44.5506596541482907]},"#cc2244":{"lch":[44.8026641682027602,120.425301369152351,6.75586226508684629],"luv":[44.8026641682027602,119.589119356054482,14.1667124448306829],"rgb":[0.8,0.133333333333333331,0.266666666666666663],"xyz":[0.265165632499671511,0.144010400889547641,0.0685250714593949456],"hpluv":[6.75586226508684629,341.077623618219945,44.8026641682027602],"hsluv":[6.75586226508684629,88.3153597242729,44.8026641682027602]},"#cc2255":{"lch":[45.136480402373536,114.008772215671115,2.323188749975583],"luv":[45.136480402373536,113.915065115628011,4.62148047999889577],"rgb":[0.8,0.133333333333333331,0.333333333333333315],"xyz":[0.271128046539033496,0.146395366505292474,0.0999271187333688471],"hpluv":[2.323188749975583,320.51614012782295,45.136480402373536],"hsluv":[2.323188749975583,88.8894607126765663,45.136480402373536]},"#cc2266":{"lch":[45.5559407124691731,107.622008592458101,356.577515499379103],"luv":[45.5559407124691731,107.430062323442542,-6.42483016556681452],"rgb":[0.8,0.133333333333333331,0.4],"xyz":[0.278713042312541681,0.149429364814695764,0.139874763140512809],"hpluv":[356.577515499379103,299.774992396016216,45.5559407124691731],"hsluv":[356.577515499379103,89.543058875786258,45.5559407124691731]},"#cc2277":{"lch":[46.0633224094211542,102.110102175352239,349.514816334356908],"luv":[46.0633224094211542,100.405067655344695,-18.5821246198201955],"rgb":[0.8,0.133333333333333331,0.466666666666666674],"xyz":[0.288027055332743587,0.153154970022776588,0.188928565046910718],"hpluv":[349.514816334356908,281.289018816444,46.0633224094211542],"hsluv":[349.514816334356908,90.2475430222303174,46.0633224094211542]},"#cc2288":{"lch":[46.6595045299101443,98.2790088680822294,341.330158110485115],"luv":[46.6595045299101443,93.107459692013677,-31.4605234189234864],"rgb":[0.8,0.133333333333333331,0.533333333333333326],"xyz":[0.299167472434687387,0.157611136863554185,0.247601428450482886],"hpluv":[341.330158110485115,267.276005324070297,46.6595045299101443],"hsluv":[341.330158110485115,90.9748001704168,46.6595045299101443]},"#cc2299":{"lch":[47.3441166442187154,96.727251962869147,332.467163788405],"luv":[47.3441166442187154,85.772509513995189,-44.7128380217581167],"rgb":[0.8,0.133333333333333331,0.6],"xyz":[0.312224436543760087,0.162833922507183343,0.31636810609160082],"hpluv":[332.467163788405,259.252025571181889,47.3441166442187154],"hsluv":[332.467163788405,91.7002075152857259,47.3441166442187154]},"#cc22aa":{"lch":[48.1156936783416285,97.7076198445846131,323.544141865814368],"luv":[48.1156936783416285,78.5876931080813534,-58.0581903579838254],"rgb":[0.8,0.133333333333333331,0.66666666666666663],"xyz":[0.327282129509012643,0.168856999693284437,0.395671955708599421],"hpluv":[323.544141865814368,257.680176436907345,48.1156936783416285],"hsluv":[323.544141865814368,92.4042695013683328,48.1156936783416285]},"#cc22bb":{"lch":[48.9718390817589295,101.100583268181566,315.160199675634601],"luv":[48.9718390817589295,71.6885121422158846,-71.2887450022924867],"rgb":[0.8,0.133333333333333331,0.733333333333333282],"xyz":[0.344419721616349317,0.175712036536219196,0.485929940807241167],"hpluv":[315.160199675634601,261.96699229126267,48.9718390817589295],"hsluv":[315.160199675634601,93.0730408422972602,48.9718390817589295]},"#cc22cc":{"lch":[49.9093929354593513,106.520702596514482,307.715012949243658],"luv":[49.9093929354593513,65.1623716831421405,-84.2646153393173876],"rgb":[0.8,0.133333333333333331,0.8],"xyz":[0.363712097060071,0.183428986713708,0.587536451477511323],"hpluv":[307.715012949243658,270.826440261226253,49.9093929354593513],"hsluv":[307.715012949243658,93.6976999618693327,49.9093929354593513]},"#cc22dd":{"lch":[50.9245991417877377,113.480326695625976,301.360030221234524],"luv":[50.9245991417877377,59.0567580516805819,-96.9024451465042347],"rgb":[0.8,0.133333333333333331,0.866666666666666696],"xyz":[0.385230422610704615,0.192036316933961532,0.700866299377517321],"hpluv":[301.360030221234524,282.769318292038,50.9245991417877377],"hsluv":[301.360030221234524,94.2736696463096848,50.9245991417877377]},"#cc22ee":{"lch":[52.0132654143591964,121.518329969744158,296.062236941936249],"luv":[52.0132654143591964,53.3887372455597244,-109.162022947361166],"rgb":[0.8,0.133333333333333331,0.933333333333333348],"xyz":[0.409042602876879324,0.201561189040431576,0.826277115446040544],"hpluv":[296.062236941936249,296.460610812118318,52.0132654143591964],"hsluv":[296.062236941936249,94.7995997265514,52.0132654143591964]},"#cc22ff":{"lch":[53.170910599170611,130.261070707018604,291.695402941657903],"luv":[53.170910599170611,48.1538976563848422,-121.033667556747687],"rgb":[0.8,0.133333333333333331,1],"xyz":[0.435213651286710745,0.212029608404364273,0.964111303737822389],"hpluv":[291.695402941657903,310.870757963074425,53.170910599170611],"hsluv":[291.695402941657903,99.9999999999990621,53.170910599170611]},"#cc3300":{"lch":[45.9167915379707807,127.686226573765651,16.3911473443809399],"luv":[45.9167915379707807,122.496750231663356,36.0321889333482446],"rgb":[0.8,0.2,0],"xyz":[0.260850584973891519,0.15207273722165307,0.0156183921844992128],"hpluv":[16.3911473443809399,352.867650162608584,45.9167915379707807],"hsluv":[16.3911473443809399,100.000000000002288,45.9167915379707807]},"#cc3311":{"lch":[45.9716631772740811,126.14350976506573,15.6923563051461095],"luv":[45.9716631772740811,121.44186843726601,34.118289029712578],"rgb":[0.8,0.2,0.0666666666666666657],"xyz":[0.261862250473528624,0.152477403421507923,0.020946497149254846],"hpluv":[15.6923563051461095,348.188177538365835,45.9716631772740811],"hsluv":[15.6923563051461095,95.8756509753329595,45.9716631772740811]},"#cc3322":{"lch":[46.0731243265426613,123.399991281457972,14.3806932854006604],"luv":[46.0731243265426613,119.533487768482047,30.6480529588105668],"rgb":[0.8,0.2,0.133333333333333331],"xyz":[0.263737608612005681,0.153227546676898752,0.0308233833452340386],"hpluv":[14.3806932854006604,339.865273437066321,46.0731243265426613],"hsluv":[14.3806932854006604,88.4197842587317524,46.0731243265426613]},"#cc3333":{"lch":[46.2394596481243951,119.199958247304309,12.1770506300617924],"luv":[46.2394596481243951,116.518014060345578,25.1432385661076303],"rgb":[0.8,0.2,0.2],"xyz":[0.266825359344463386,0.154462646969881851,0.0470855372028451818],"hpluv":[12.1770506300617924,327.11667224844831,46.2394596481243951],"hsluv":[12.1770506300617924,76.6535755019082,46.2394596481243951]},"#cc3344":{"lch":[46.4780522046582405,113.793717346871745,8.90746564227168669],"luv":[46.4780522046582405,112.421330819758609,17.6197186224449389],"rgb":[0.8,0.2,0.266666666666666663],"xyz":[0.271283354588682302,0.156245845067569444,0.0705643121557318204],"hpluv":[8.90746564227168669,310.677421508065,46.4780522046582405],"hsluv":[8.90746564227168669,77.4930753906613887,46.4780522046582405]},"#cc3355":{"lch":[46.7943405275181661,107.68493286266704,4.39945159143432907],"luv":[46.7943405275181661,107.367637754253522,8.26045572038872855],"rgb":[0.8,0.2,0.333333333333333315],"xyz":[0.277245768628044287,0.158630810683314277,0.101966359429705736],"hpluv":[4.39945159143432907,292.012160158640199,46.7943405275181661],"hsluv":[4.39945159143432907,78.5258346284665265,46.7943405275181661]},"#cc3366":{"lch":[47.192153202602185,101.584765682520938,358.514989280316684],"luv":[47.192153202602185,101.55064731932022,-2.63261235272558647],"rgb":[0.8,0.2,0.4],"xyz":[0.284830764401552472,0.161664808992717568,0.141914003836849684],"hpluv":[358.514989280316684,273.148057687163259,47.192153202602185],"hsluv":[358.514989280316684,79.7102211537212781,47.192153202602185]},"#cc3377":{"lch":[47.6738975277608859,96.3272258277819589,351.225603296168742],"luv":[47.6738975277608859,95.1998742335289876,-14.6941614798792699],"rgb":[0.8,0.2,0.466666666666666674],"xyz":[0.294144777421754378,0.165390414200798391,0.190967805743247593],"hpluv":[351.225603296168742,256.39391915093114,47.6738975277608859],"hsluv":[351.225603296168742,80.9972134637005894,47.6738975277608859]},"#cc3388":{"lch":[48.2406991607903279,92.7347249941698095,342.718318936463845],"luv":[48.2406991607903279,88.5482927213948301,-27.5486674064369161],"rgb":[0.8,0.2,0.533333333333333326],"xyz":[0.305285194523698178,0.169846581041576,0.24964066914681976],"hpluv":[342.718318936463845,243.93163202064531,48.2406991607903279],"hsluv":[342.718318936463845,82.3372641433758758,48.2406991607903279]},"#cc3399":{"lch":[48.8925304323200436,91.4400639314067405,333.463846826874658],"luv":[48.8925304323200436,81.8070942553503926,-40.8519843003490877],"rgb":[0.8,0.2,0.6],"xyz":[0.318342158632770933,0.175069366685205147,0.318407346787937695],"hpluv":[333.463846826874658,237.319449797121564,48.8925304323200436],"hsluv":[333.463846826874658,83.6856508008112,48.8925304323200436]},"#cc33aa":{"lch":[49.6283419748853873,92.7248127600779242,324.141487451800515],"luv":[49.6283419748853873,75.1503095778714254,-54.3168654447363792],"rgb":[0.8,0.2,0.66666666666666663],"xyz":[0.333399851598023433,0.181092443871306241,0.397711196404936296],"hpluv":[324.141487451800515,237.085790295602294,49.6283419748853873],"hsluv":[324.141487451800515,85.0057245198840263,49.6283419748853873]},"#cc33bb":{"lch":[50.4462014889725054,96.4744776262418355,315.414049480091705],"luv":[50.4462014889725054,68.7089492450233905,-67.7230029377097],"rgb":[0.8,0.2,0.733333333333333282],"xyz":[0.350537443705360108,0.187947480714241,0.487969181503578042],"hpluv":[315.414049480091705,242.674024226837219,50.4462014889725054],"hsluv":[315.414049480091705,86.2701296035756258,50.4462014889725054]},"#cc33cc":{"lch":[51.3434379695087273,102.286811532428814,307.715012949243771],"luv":[51.3434379695087273,62.5723551280607779,-80.915339628518268],"rgb":[0.8,0.2,0.8],"xyz":[0.369829819149081862,0.195664430891729801,0.589575692173848198],"hpluv":[307.715012949243771,252.798225898109365,51.3434379695087273],"hsluv":[307.715012949243771,87.4604868647498,51.3434379695087273]},"#cc33dd":{"lch":[52.3167871114961827,109.649949983538605,301.195256028086874],"luv":[52.3167871114961827,56.7938698017029751,-93.7953510806358],"rgb":[0.8,0.2,0.866666666666666696],"xyz":[0.39134814469971535,0.204271761111983335,0.702905540073854196],"hpluv":[301.195256028086874,265.954105752122757,52.3167871114961827],"hsluv":[301.195256028086874,88.5661577004671,52.3167871114961827]},"#cc33ee":{"lch":[53.3625327970638494,118.082474280319559,295.802769884900215],"luv":[53.3625327970638494,51.3983045372134626,-106.309383512755787],"rgb":[0.8,0.2,0.933333333333333348],"xyz":[0.415160324965890115,0.21379663321845338,0.828316356142377419],"hpluv":[295.802769884900215,280.794331636146467,53.3625327970638494],"hsluv":[295.802769884900215,89.5826266077864375,53.3625327970638494]},"#cc33ff":{"lch":[54.4766398815527566,127.197777570935344,291.389330811727291],"luv":[54.4766398815527566,46.3894624378335,-118.436870921660102],"rgb":[0.8,0.2,1],"xyz":[0.441331373375721481,0.224265052582386076,0.966150544434159264],"hpluv":[291.389330811727291,296.284230666095709,54.4766398815527566],"hsluv":[291.389330811727291,99.9999999999990195,54.4766398815527566]},"#cc4400":{"lch":[48.2269914221542848,118.435883841274119,19.7039935064818295],"luv":[48.2269914221542848,111.501113106022,39.9319465764175447],"rgb":[0.8,0.266666666666666663,0],"xyz":[0.26968315545685756,0.1697378781875854,0.0185625823454878096],"hpluv":[19.7039935064818295,311.625122342549162,48.2269914221542848],"hsluv":[19.7039935064818295,100.000000000002174,48.2269914221542848]},"#cc4411":{"lch":[48.2779913635395,116.996103035931512,19.0066631306561966],"luv":[48.2779913635395,110.617558299276112,38.1030697123021],"rgb":[0.8,0.266666666666666663,0.0666666666666666657],"xyz":[0.270694820956494664,0.170142544387440253,0.0238906873102434428],"hpluv":[19.0066631306561966,307.511619232155283,48.2779913635395],"hsluv":[19.0066631306561966,96.278384876640132,48.2779913635395]},"#cc4422":{"lch":[48.3723181772035389,114.428966114904512,17.6946931608209894],"luv":[48.3723181772035389,109.015290220227484,34.7800917814421453],"rgb":[0.8,0.266666666666666663,0.133333333333333331],"xyz":[0.272570179094971721,0.170892687642831081,0.0337675735062226354],"hpluv":[17.6946931608209894,300.177682052924467,48.3723181772035389],"hsluv":[17.6946931608209894,89.5341066932624869,48.3723181772035389]},"#cc4433":{"lch":[48.5270263662828114,110.48209503335984,15.4815426750504042],"luv":[48.5270263662828114,106.473417017787412,29.4907577304601034],"rgb":[0.8,0.266666666666666663,0.2],"xyz":[0.275657929827429427,0.17212778793581418,0.0500297273638337786],"hpluv":[15.4815426750504042,288.900004133964501,48.5270263662828114],"hsluv":[15.4815426750504042,78.8475327486048,48.5270263662828114]},"#cc4444":{"lch":[48.7490888960709725,105.371058014361893,12.1770506300618457],"luv":[48.7490888960709725,103.000257716521162,22.2262632351064191],"rgb":[0.8,0.266666666666666663,0.266666666666666663],"xyz":[0.280115925071648342,0.173910986033501774,0.0735085023167204171],"hpluv":[12.1770506300618457,274.28001464324592,48.7490888960709725],"hsluv":[12.1770506300618457,64.2723089184284788,48.7490888960709725]},"#cc4455":{"lch":[49.0437296069087,99.5540950311582691,7.58056168126664254],"luv":[49.0437296069087,98.6840273694228074,13.1331861946711772],"rgb":[0.8,0.266666666666666663,0.333333333333333315],"xyz":[0.286078339111010327,0.176295951649246607,0.104910549590694333],"hpluv":[7.58056168126664254,257.581676799067395,49.0437296069087],"hsluv":[7.58056168126664254,65.7689369270132858,49.0437296069087]},"#cc4466":{"lch":[49.4147368002801244,93.7049448509207679,1.51289058041819868],"luv":[49.4147368002801244,93.6722802728102835,2.47398423725391092],"rgb":[0.8,0.266666666666666663,0.4],"xyz":[0.293663334884518512,0.179329949958649898,0.14485819399783828],"hpluv":[1.51289058041819868,240.627550105868352,49.4147368002801244],"hsluv":[1.51289058041819868,67.500804726855,49.4147368002801244]},"#cc4477":{"lch":[49.8646356184384132,88.6490107187132566,353.900159994018],"luv":[49.8646356184384132,88.1471013723349586,-9.41995865499641383],"rgb":[0.8,0.266666666666666663,0.466666666666666674],"xyz":[0.302977347904720418,0.183055555166730721,0.19391199590423619],"hpluv":[353.900159994018,225.590377060975072,49.8646356184384132],"hsluv":[353.900159994018,69.4017616341687784,49.8646356184384132]},"#cc4488":{"lch":[50.3948096201307436,85.2405150759366279,344.907000147604322],"luv":[50.3948096201307436,82.3000967091543743,-22.1954835963269055],"rgb":[0.8,0.266666666666666663,0.533333333333333326],"xyz":[0.314117765006664218,0.187511722007508319,0.252584859307808385],"hpluv":[344.907000147604322,214.634525667930632,50.3948096201307436],"hsluv":[344.907000147604322,71.4025087995354824,50.3948096201307436]},"#cc4499":{"lch":[51.0056074652318046,84.1718897613591679,335.041688295241613],"luv":[51.0056074652318046,76.3115014820887581,-35.5170630478867793],"rgb":[0.8,0.266666666666666663,0.6],"xyz":[0.327174729115737,0.192734507651137477,0.321351536948926264],"hpluv":[335.041688295241613,209.40569084337892,51.0056074652318046],"hsluv":[335.041688295241613,73.4381222823911344,51.0056074652318046]},"#cc44aa":{"lch":[51.6964496814969152,85.7749410926589348,325.085448007895536],"luv":[51.6964496814969152,70.3360122964612913,-49.093644127128691],"rgb":[0.8,0.266666666666666663,0.66666666666666663],"xyz":[0.342232422080989473,0.198757584837238571,0.400655386565924865],"hpluv":[325.085448007895536,210.542141790665795,51.6964496814969152],"hsluv":[325.085448007895536,75.4531429469973602,51.6964496814969152]},"#cc44bb":{"lch":[52.465940673938249,89.9444778306290829,315.812454406659811],"luv":[52.465940673938249,64.4957791941851326,-62.692133145710109],"rgb":[0.8,0.266666666666666663,0.733333333333333282],"xyz":[0.359370014188326148,0.20561262168017333,0.490913371664566611],"hpluv":[315.812454406659811,217.538619181736436,52.465940673938249],"hsluv":[315.812454406659811,77.4040753157756143,52.465940673938249]},"#cc44cc":{"lch":[53.3119860408958175,96.2498903650287758,307.715012949243885],"luv":[53.3119860408958175,58.8793631430003828,-76.1397530279337502],"rgb":[0.8,0.266666666666666663,0.8],"xyz":[0.378662389632047902,0.213329571857662131,0.592519882334836767],"hpluv":[307.715012949243885,229.094523932317799,53.3119860408958175],"hsluv":[307.715012949243885,79.2597279113993,53.3119860408958175]},"#cc44dd":{"lch":[54.2319126329379486,104.138844540210442,300.941773361922515],"luv":[54.2319126329379486,53.5447276840333259,-89.31887303035586],"rgb":[0.8,0.266666666666666663,0.866666666666666696],"xyz":[0.40018071518268139,0.221936902077915665,0.705849730234842765],"hpluv":[300.941773361922515,243.66724889744043,54.2319126329379486],"hsluv":[300.941773361922515,81.0000946003390538,54.2319126329379486]},"#cc44ee":{"lch":[55.2225876682288401,113.096616320403683,295.407423092027],"luv":[55.2225876682288401,48.5243479249087528,-102.157879194837463],"rgb":[0.8,0.266666666666666663,0.933333333333333348],"xyz":[0.423992895448856155,0.23146177418438571,0.831260546303366],"hpluv":[295.407423092027,259.879597148300718,55.2225876682288401],"hsluv":[295.407423092027,86.8652077390175634,55.2225876682288401]},"#cc44ff":{"lch":[56.2805330741479537,122.715491745326418,290.92682559337851],"luv":[56.2805330741479537,43.8309487146615382,-114.62085259266739],"rgb":[0.8,0.266666666666666663,1],"xyz":[0.450163943858687521,0.241930193548318406,0.969094734595147833],"hpluv":[290.92682559337851,276.681751484143376,56.2805330741479537],"hsluv":[290.92682559337851,99.9999999999989768,56.2805330741479537]},"#cc5500":{"lch":[51.07852272981998,108.355754132896138,24.3337665629108457],"luv":[51.07852272981998,98.7294936728878838,44.6481414260866],"rgb":[0.8,0.333333333333333315,0],"xyz":[0.281496412171203525,0.193364391616277664,0.0225003345836030169],"hpluv":[24.3337665629108457,269.186315008697875,51.07852272981998],"hsluv":[24.3337665629108457,100.000000000002217,51.07852272981998]},"#cc5511":{"lch":[51.1252833166066,107.003417336388864,23.6474066829241423],"luv":[51.1252833166066,98.0184651549503201,42.91983003616388],"rgb":[0.8,0.333333333333333315,0.0666666666666666657],"xyz":[0.282508077670840629,0.193769057816132517,0.0278284395483586466],"hpluv":[23.6474066829241423,265.583595811902,51.1252833166066],"hsluv":[23.6474066829241423,96.7082849697218307,51.1252833166066]},"#cc5522":{"lch":[51.2117930688627467,104.583581473170284,22.351909846807331],"luv":[51.2117930688627467,96.7257518395109486,39.7725337995530808],"rgb":[0.8,0.333333333333333315,0.133333333333333331],"xyz":[0.284383435809317686,0.194519201071523345,0.0377053257443378462],"hpluv":[22.351909846807331,259.139045481141636,51.2117930688627467],"hsluv":[22.351909846807331,90.7274756498525079,51.2117930688627467]},"#cc5533":{"lch":[51.3537468781662625,100.840694749975015,20.1540565840537802],"luv":[51.3537468781662625,94.6661789932146718,34.7442120716858369],"rgb":[0.8,0.333333333333333315,0.2],"xyz":[0.287471186541775392,0.195754301364506444,0.0539674796019489894],"hpluv":[20.1540565840537802,249.174169543579183,51.3537468781662625],"hsluv":[20.1540565840537802,81.2092815218714321,51.3537468781662625]},"#cc5544":{"lch":[51.5576456995760424,95.9504499860225764,16.842752904303623],"luv":[51.5576456995760424,91.8345174188591074,27.8012636936791502],"rgb":[0.8,0.333333333333333315,0.266666666666666663],"xyz":[0.291929181785994307,0.197537499462194038,0.0774462545548356279],"hpluv":[16.842752904303623,236.152889903020736,51.5576456995760424],"hsluv":[16.842752904303623,68.1451659970290109,51.5576456995760424]},"#cc5555":{"lch":[51.8284441386287114,90.3192908744292851,12.1770506300618919],"luv":[51.8284441386287114,88.2871484081680364,19.0513445723360242],"rgb":[0.8,0.333333333333333315,0.333333333333333315],"xyz":[0.297891595825356292,0.199922465077938871,0.108848301828809529],"hpluv":[12.1770506300618919,221.132040760117775,51.8284441386287114],"hsluv":[12.1770506300618919,51.8180912815801,51.8284441386287114]},"#cc5566":{"lch":[52.1698415772242612,84.57836719340618,5.91246023067467696],"luv":[52.1698415772242612,84.1284474176031836,8.71232071300305577],"rgb":[0.8,0.333333333333333315,0.4],"xyz":[0.305476591598864478,0.202956463387342162,0.148795946235953491],"hpluv":[5.91246023067467696,205.721226704565879,52.1698415772242612],"hsluv":[5.91246023067467696,54.0130370973951415,52.1698415772242612]},"#cc5577":{"lch":[52.5844387621358607,79.5477054283049654,357.892334615122479],"luv":[52.5844387621358607,79.493890006545314,-2.92555815796844554],"rgb":[0.8,0.333333333333333315,0.466666666666666674],"xyz":[0.314790604619066383,0.206682068595422985,0.1978497481423514],"hpluv":[357.892334615122479,191.959557587962337,52.5844387621358607],"hsluv":[357.892334615122479,56.4492590331968884,52.5844387621358607]},"#cc5588":{"lch":[53.0738428910491962,76.1348505840982,348.222799824086337],"luv":[53.0738428910491962,74.5321119975331072,-15.5396188708133902],"rgb":[0.8,0.333333333333333315,0.533333333333333326],"xyz":[0.325931021721010183,0.211138235436200583,0.256522611545923596],"hpluv":[348.222799824086337,182.029716109510787,53.0738428910491962],"hsluv":[348.222799824086337,59.0443947768825339,53.0738428910491962]},"#cc5599":{"lch":[53.6387547547300443,75.1322702050955655,337.451566852479516],"luv":[53.6387547547300443,69.3888374020903314,-28.8105409556599774],"rgb":[0.8,0.333333333333333315,0.6],"xyz":[0.338987985830082938,0.216361021079829741,0.325289289187041475],"hpluv":[337.451566852479516,177.740808472615271,53.6387547547300443],"hsluv":[337.451566852479516,61.7180151219793274,53.6387547547300443]},"#cc55aa":{"lch":[54.2790527162633651,76.9604755372169507,326.525055670409472],"luv":[54.2790527162633651,64.1948187783047359,-42.449264268479169],"rgb":[0.8,0.333333333333333315,0.66666666666666663],"xyz":[0.354045678795335439,0.222384098265930835,0.404593138804040076],"hpluv":[326.525055670409472,179.918080614224607,54.2790527162633651],"hsluv":[326.525055670409472,64.3982563598392517,54.2790527162633651]},"#cc55bb":{"lch":[54.9938795911038767,81.534325182187132,316.414019967357433],"luv":[54.9938795911038767,59.0586208757266817,-56.2132144888709888],"rgb":[0.8,0.333333333333333315,0.733333333333333282],"xyz":[0.371183270902672113,0.229239135108865594,0.494851123902681822],"hpluv":[316.414019967357433,188.133202867989326,54.9938795911038767],"hsluv":[316.414019967357433,67.0257727218245378,54.9938795911038767]},"#cc55cc":{"lch":[55.7817339145568667,88.3780574248019,307.715012949244169],"luv":[55.7817339145568667,54.0638926159085145,-69.9126351198200382],"rgb":[0.8,0.333333333333333315,0.8],"xyz":[0.390475646346393868,0.236956085286354395,0.596457634572952],"hpluv":[307.715012949244169,201.044301715196383,55.7817339145568667],"hsluv":[307.715012949244169,69.5552053299685156,55.7817339145568667]},"#cc55dd":{"lch":[56.6405645837994882,96.8744721490496232,300.570417552325068],"luv":[56.6405645837994882,49.2700598324241312,-83.4093793183137],"rgb":[0.8,0.333333333333333315,0.866666666666666696],"xyz":[0.411993971897027356,0.245563415506607929,0.709787482472958],"hpluv":[300.570417552325068,217.030665421015726,56.6405645837994882],"hsluv":[300.570417552325068,72.1703256475756234,56.6405645837994882]},"#cc55ee":{"lch":[57.5678665910353118,106.457154357221242,294.836459829444038],"luv":[57.5678665910353118,44.7151619549172707,-96.6109724885468],"rgb":[0.8,0.333333333333333315,0.933333333333333348],"xyz":[0.435806152163202121,0.255088287613077946,0.835198298541481199],"hpluv":[294.836459829444038,234.657286550118499,57.5678665910353118],"hsluv":[294.836459829444038,85.8995510844284809,57.5678665910353118]},"#cc55ff":{"lch":[58.560775097021633,116.686665261471418,290.266986003053091],"luv":[58.560775097021633,40.4196983751927874,-109.462440284789551],"rgb":[0.8,0.333333333333333315,1],"xyz":[0.461977200573033486,0.26555670697701067,0.973032486833263],"hpluv":[290.266986003053091,252.844632524376181,58.560775097021633],"hsluv":[290.266986003053091,99.9999999999988,58.560775097021633]},"#cc6600":{"lch":[54.388060759003551,98.5584029412379579,30.482787603130209],"luv":[54.388060759003551,84.9358174587045482,49.9966569177284157],"rgb":[0.8,0.4,0],"xyz":[0.29652446987705,0.223420507027971,0.0275096871522183678],"hpluv":[30.482787603130209,229.947880001204965,54.388060759003551],"hsluv":[30.482787603130209,100.000000000002359,54.388060759003551]},"#cc6611":{"lch":[54.430531479182676,97.2669366851907711,29.8266301777559697],"luv":[54.430531479182676,84.3824110244092367,48.3783596438383583],"rgb":[0.8,0.4,0.0666666666666666657],"xyz":[0.297536135376687105,0.223825173227825858,0.032837792116974],"hpluv":[29.8266301777559697,226.757672191171366,54.430531479182676],"hsluv":[29.8266301777559697,97.1300271864182463,54.430531479182676]},"#cc6622":{"lch":[54.5091256699603548,94.945229062596681,28.5830621108902889],"luv":[54.5091256699603548,83.3737269438019695,45.4248629854764],"rgb":[0.8,0.4,0.133333333333333331],"xyz":[0.299411493515164162,0.224575316483216686,0.0427146783129532],"hpluv":[28.5830621108902889,221.025945543219876,54.5091256699603548],"hsluv":[28.5830621108902889,91.902111940908739,54.5091256699603548]},"#cc6633":{"lch":[54.6381494647888388,91.324965774397,26.4577509745500876],"luv":[54.6381494647888388,81.7598754062496624,40.688722605278663],"rgb":[0.8,0.4,0.2],"xyz":[0.302499244247621868,0.225810416776199785,0.0589768321705643403],"hpluv":[26.4577509745500876,212.096187894217309,54.6381494647888388],"hsluv":[26.4577509745500876,83.5463344335908289,54.6381494647888388]},"#cc6644":{"lch":[54.8236025158742137,86.5353782352002,23.2174871910251],"luv":[54.8236025158742137,79.5273159773273903,34.1141861950638798],"rgb":[0.8,0.4,0.266666666666666663],"xyz":[0.306957239491840783,0.227593614873887379,0.0824556071234509858],"hpluv":[23.2174871910251,200.292852977212362,54.8236025158742137],"hsluv":[23.2174871910251,72.0055590941951635,54.8236025158742137]},"#cc6655":{"lch":[55.0701314820163077,80.921365039871,18.5706632184066578],"luv":[55.0701314820163077,76.7079190692017505,25.7713498286149552],"rgb":[0.8,0.4,0.333333333333333315],"xyz":[0.312919653531202768,0.229978580489632212,0.113857654397424887],"hpluv":[18.5706632184066578,186.460314881725708,55.0701314820163077],"hsluv":[18.5706632184066578,57.463707489477386,55.0701314820163077]},"#cc6666":{"lch":[55.3812986167643686,75.0592421503045841,12.1770506300619576],"luv":[55.3812986167643686,73.3704437553848834,15.8324923911544637],"rgb":[0.8,0.4,0.4],"xyz":[0.320504649304710953,0.233012578799035502,0.153805298804568835],"hpluv":[12.1770506300619576,171.980959079196282,55.3812986167643686],"hsluv":[12.1770506300619576,45.9214429163451925,55.3812986167643686]},"#cc6677":{"lch":[55.7597240294908403,69.7578535305897702,3.7339069954147126],"luv":[55.7597240294908403,69.6097753289024,4.54283037928401079],"rgb":[0.8,0.4,0.466666666666666674],"xyz":[0.329818662324912859,0.236738184007116326,0.202859100710966744],"hpluv":[3.7339069954147126,158.749300244695775,55.7597240294908403],"hsluv":[3.7339069954147126,47.4001946683844935,55.7597240294908403]},"#cc6688":{"lch":[56.2071770412836855,65.9988703650454198,353.20230012342131],"luv":[56.2071770412836855,65.534915505775615,-7.81189727997758432],"rgb":[0.8,0.4,0.533333333333333326],"xyz":[0.340959079426856659,0.241194350847893924,0.26153196411453894],"hpluv":[353.20230012342131,148.999240608904586,56.2071770412836855],"hsluv":[353.20230012342131,48.9818497710332537,56.2071770412836855]},"#cc6699":{"lch":[56.7246474757154573,64.7364860461136544,341.13073016495332],"luv":[56.7246474757154573,61.2574795353059756,-20.9364234428957907],"rgb":[0.8,0.4,0.6],"xyz":[0.354016043535929414,0.246417136491523081,0.330298641755656819],"hpluv":[341.13073016495332,144.81603174775961,56.7246474757154573],"hsluv":[341.13073016495332,50.615240188358726,56.7246474757154573]},"#cc66aa":{"lch":[57.3124110050500661,66.5536753014576874,328.724652687595039],"luv":[57.3124110050500661,56.882247269492467,-34.5514347271451925],"rgb":[0.8,0.4,0.66666666666666663],"xyz":[0.369073736501181915,0.252440213677624203,0.40960249137265542],"hpluv":[328.724652687595039,147.354258527000582,57.3124110050500661],"hsluv":[328.724652687595039,52.5782983823555057,57.3124110050500661]},"#cc66bb":{"lch":[57.9700950113726634,71.4140361316817831,317.320615294889421],"luv":[57.9700950113726634,52.5006394421278628,-48.4112323204526405],"rgb":[0.8,0.4,0.733333333333333282],"xyz":[0.386211328608518589,0.259295250520558962,0.499860476471297166],"hpluv":[317.320615294889421,156.321564636453559,57.9700950113726634],"hsluv":[317.320615294889421,55.7867325729046044,57.9700950113726634]},"#cc66cc":{"lch":[58.6967474031167882,78.7715159072838844,307.71501294924451],"luv":[58.6967474031167882,48.1872412824568599,-62.3132529717215391],"rgb":[0.8,0.4,0.8],"xyz":[0.405503704052240344,0.267012200698047764,0.601466987141567322],"hpluv":[307.71501294924451,170.292097080892688,58.6967474031167882],"hsluv":[307.71501294924451,58.9158791245518429,58.6967474031167882]},"#cc66dd":{"lch":[59.4909085631812928,87.9045601549668589,300.035118747227784],"luv":[59.4909085631812928,43.9989332886277964,-76.1006278916348151],"rgb":[0.8,0.4,0.866666666666666696],"xyz":[0.427022029602873832,0.27561953091830127,0.71479683504157332],"hpluv":[300.035118747227784,187.499506963343748,59.4909085631812928],"hsluv":[300.035118747227784,69.8010448945604907,59.4909085631812928]},"#cc66ee":{"lch":[60.3506853352839272,98.1678970647401314,294.030303780460372],"luv":[60.3506853352839272,39.9759075841908498,-89.6597057040320919],"rgb":[0.8,0.4,0.933333333333333348],"xyz":[0.450834209869048597,0.285144403024771287,0.840207651110096543],"hpluv":[294.030303780460372,206.408039079415715,60.3506853352839272],"hsluv":[294.030303780460372,84.6650997716967169,60.3506853352839272]},"#cc66ff":{"lch":[61.2738253236974799,109.076950193692937,289.351384827957531],"luv":[61.2738253236974799,36.143813792667018,-102.914555763887847],"rgb":[0.8,0.4,1],"xyz":[0.477005258278879962,0.295612822388704,0.978041839401878388],"hpluv":[289.351384827957531,225.890163025573315,61.2738253236974799],"hsluv":[289.351384827957531,99.9999999999987,61.2738253236974799]},"#cc7700":{"lch":[58.0681687130694684,90.1274111260576,38.2527636780657616],"luv":[58.0681687130694684,70.775890411238,55.8007488550273862],"rgb":[0.8,0.466666666666666674,0],"xyz":[0.314978207930467602,0.260327983134806762,0.0336609331700240683],"hpluv":[38.2527636780657616,196.95095583694345,58.0681687130694684],"hsluv":[38.2527636780657616,100.00000000000226,58.0681687130694684]},"#cc7711":{"lch":[58.1065272060428,88.8714225311590837,37.658223554494576],"luv":[58.1065272060428,70.356768805075,54.2959927252558288],"rgb":[0.8,0.466666666666666674,0.0666666666666666657],"xyz":[0.315989873430104706,0.260732649334661615,0.0389890381347797],"hpluv":[37.658223554494576,194.078102813960953,58.1065272060428],"hsluv":[37.658223554494576,97.5201736027742925,58.1065272060428]},"#cc7722":{"lch":[58.1775287784180364,86.6008188207648573,36.5262538454337786],"luv":[58.1775287784180364,69.5910513475594286,51.5440335321973748],"rgb":[0.8,0.466666666666666674,0.133333333333333331],"xyz":[0.317865231568581763,0.261482792590052415,0.0488659243307589],"hpluv":[36.5262538454337786,188.888733728089306,58.1775287784180364],"hsluv":[36.5262538454337786,92.9922153048462832,58.1775287784180364]},"#cc7733":{"lch":[58.2941365993826111,83.0249283524691606,34.5753600294232513],"luv":[58.2941365993826111,68.3611064237300781,47.1157920070976459],"rgb":[0.8,0.466666666666666674,0.2],"xyz":[0.320952982301039469,0.262717892883035542,0.0651280781883700477],"hpluv":[34.5753600294232513,180.726967614303447,58.2941365993826111],"hsluv":[34.5753600294232513,85.7262720770138458,58.2941365993826111]},"#cc7744":{"lch":[58.4618482438389577,78.2181767747613321,31.5590767862408974],"luv":[58.4618482438389577,66.6497843857434447,40.9376284034837923],"rgb":[0.8,0.466666666666666674,0.266666666666666663],"xyz":[0.325410977545258384,0.264501090980723108,0.0886068531412566862],"hpluv":[31.5590767862408974,169.775287201810244,58.4618482438389577],"hsluv":[31.5590767862408974,75.6318325574838,58.4618482438389577]},"#cc7755":{"lch":[58.6849825995062133,72.4480337937475,27.1381330463907204],"luv":[58.6849825995062133,64.4721877935720187,33.0462494345479811],"rgb":[0.8,0.466666666666666674,0.333333333333333315],"xyz":[0.331373391584620369,0.266886056596467969,0.120008900415230588],"hpluv":[27.1381330463907204,156.653084219512607,58.6849825995062133],"hsluv":[27.1381330463907204,62.8141161752895059,58.6849825995062133]},"#cc7766":{"lch":[58.9669266929607829,66.2083874258113667,20.8554290651987451],"luv":[58.9669266929607829,61.8705265372573407,23.5709251309504673],"rgb":[0.8,0.466666666666666674,0.4],"xyz":[0.338958387358128554,0.269920054905871287,0.159956544822374536],"hpluv":[20.8554290651987451,142.476698671576116,58.9669266929607829],"hsluv":[20.8554290651987451,47.542957476979069,58.9669266929607829]},"#cc7777":{"lch":[59.3102652975897229,60.2635194006596251,12.177050630062082],"luv":[59.3102652975897229,58.907617956407762,12.7115820123061383],"rgb":[0.8,0.466666666666666674,0.466666666666666674],"xyz":[0.34827240037833046,0.273645660113952083,0.209010346728772445],"hpluv":[12.177050630062082,128.932959302114057,59.3102652975897229],"hsluv":[12.177050630062082,43.5373021749198443,59.3102652975897229]},"#cc7788":{"lch":[59.7168613687891963,55.6638868177661834,0.734433949810619269],"luv":[59.7168613687891963,55.6593138534775917,0.713496335773026069],"rgb":[0.8,0.466666666666666674,0.533333333333333326],"xyz":[0.35941281748027426,0.278101826954729681,0.26768321013234464],"hpluv":[0.734433949810619269,118.281243349182901,59.7168613687891963],"hsluv":[0.734433949810619269,45.0130000154657779,59.7168613687891963]},"#cc7799":{"lch":[60.187915321807921,53.6038783156568073,346.890122071781263],"luv":[60.187915321807921,52.2067938730354371,-12.1583898596044406],"rgb":[0.8,0.466666666666666674,0.6],"xyz":[0.37246978158934696,0.283324612598358838,0.336449887773462519],"hpluv":[346.890122071781263,113.012436406344946,60.187915321807921],"hsluv":[346.890122071781263,46.5549497102544,60.187915321807921]},"#cc77aa":{"lch":[60.7240163061688349,54.9761438743297148,332.197464335395125],"luv":[60.7240163061688349,48.6297161920954863,-25.6422912074417866],"rgb":[0.8,0.466666666666666674,0.66666666666666663],"xyz":[0.387527474554599516,0.28934768978445996,0.41575373739046112],"hpluv":[332.197464335395125,114.882297594683308,60.7240163061688349],"hsluv":[332.197464335395125,48.1189262345266471,60.7240163061688349]},"#cc77bb":{"lch":[61.3251919150652043,59.875823087291181,318.726648244723037],"luv":[61.3251919150652043,45.0009333565193046,-39.4972174643062743],"rgb":[0.8,0.466666666666666674,0.733333333333333282],"xyz":[0.40466506666193619,0.296202726627394719,0.506011722489102866],"hpluv":[318.726648244723037,123.894465684476771,61.3251919150652043],"hsluv":[318.726648244723037,49.6642191709372156,61.3251919150652043]},"#cc77cc":{"lch":[61.9909592768387228,67.6487625915650881,307.715012949244965],"luv":[61.9909592768387228,41.3830711255614219,-53.514451360232222],"rgb":[0.8,0.466666666666666674,0.8],"xyz":[0.423957442105657889,0.303919676804883521,0.607618233159373],"hpluv":[307.715012949244965,138.474825543749517,61.9909592768387228],"hsluv":[307.715012949244965,51.1553628289834066,61.9909592768387228]},"#cc77dd":{"lch":[62.7203784873954362,77.3966796673740305,299.257833182927357],"luv":[62.7203784873954362,37.8268934727942252,-67.5231231041040161],"rgb":[0.8,0.466666666666666674,0.866666666666666696],"xyz":[0.445475767656291488,0.312527007025137,0.720948081059379],"hpluv":[299.257833182927357,156.586020071329443,62.7203784873954362],"hsluv":[299.257833182927357,66.8390608629672158,62.7203784873954362]},"#cc77ee":{"lch":[63.5121081687847351,88.3507940057556453,292.894169444170245],"luv":[63.5121081687847351,34.371127600373157,-81.3909601179783],"rgb":[0.8,0.466666666666666674,0.933333333333333348],"xyz":[0.469287947922466198,0.322051879131607044,0.846358897127902243],"hpluv":[292.894169444170245,176.519730115921618,63.5121081687847351],"hsluv":[292.894169444170245,83.1130682001540322,63.5121081687847351]},"#cc77ff":{"lch":[64.3644622692190467,99.9639900757921112,288.092077643344339],"luv":[64.3644622692190467,31.0433170684360782,-95.0216384686225553],"rgb":[0.8,0.466666666666666674,1],"xyz":[0.495458996332297619,0.332520298495539768,0.984193085419684088],"hpluv":[288.092077643344339,197.077372703744913,64.3644622692190467],"hsluv":[288.092077643344339,99.9999999999984794,64.3644622692190467]},"#cc8800":{"lch":[62.03823759594124,83.9779445354575813,47.4964941193052752],"luv":[62.03823759594124,56.738465406715342,61.9115636346826221],"rgb":[0.8,0.533333333333333326,0],"xyz":[0.337050577655438111,0.304472722584748334,0.0410183897450140181],"hpluv":[47.4964941193052752,171.769129739761638,62.03823759594124],"hsluv":[47.4964941193052752,100.000000000002245,62.03823759594124]},"#cc8811":{"lch":[62.0727951053461879,82.7448035916202542,47.0033697453910904],"luv":[62.0727951053461879,56.4282611354359744,60.519037225048919],"rgb":[0.8,0.533333333333333326,0.0666666666666666657],"xyz":[0.338062243155075215,0.304877388784603187,0.0463464947097696478],"hpluv":[47.0033697453910904,169.152629782786704,62.0727951053461879],"hsluv":[47.0033697453910904,97.8669953021426,62.0727951053461879]},"#cc8822":{"lch":[62.1367747194074127,80.5023095814055836,46.0605806208152728],"luv":[62.1367747194074127,55.8603434591127268,57.9676105818622389],"rgb":[0.8,0.533333333333333326,0.133333333333333331],"xyz":[0.339937601293552272,0.305627532039994,0.0562233809057488473],"hpluv":[46.0605806208152728,164.398919884807611,62.1367747194074127],"hsluv":[46.0605806208152728,93.9640765124603,62.1367747194074127]},"#cc8833":{"lch":[62.2418885518498541,76.9329948636363241,44.4230175211057343],"luv":[62.2418885518498541,54.9448944756850963,53.8492736231801246],"rgb":[0.8,0.533333333333333326,0.2],"xyz":[0.34302535202601,0.306862632332977114,0.0724855347633599906],"hpluv":[44.4230175211057343,156.844467463147254,62.2418885518498541],"hsluv":[44.4230175211057343,87.678806867525978,62.2418885518498541]},"#cc8844":{"lch":[62.3931521103864668,72.0506908450526424,41.8566920827827929],"luv":[62.3931521103864668,53.6645163812677168,48.0772475586321661],"rgb":[0.8,0.533333333333333326,0.266666666666666663],"xyz":[0.347483347270228893,0.30864583043066468,0.0959643097162466291],"hpluv":[41.8566920827827929,146.534723453778,62.3931521103864668],"hsluv":[41.8566920827827929,78.900857077449,62.3931521103864668]},"#cc8855":{"lch":[62.5945538889838673,66.028576146577123,38.0101307109045408],"luv":[62.5945538889838673,52.0240395147187513,40.6604498316892062],"rgb":[0.8,0.533333333333333326,0.333333333333333315],"xyz":[0.353445761309590878,0.311030796046409541,0.127366356990220531],"hpluv":[38.0101307109045408,133.855034432196135,62.5945538889838673],"hsluv":[38.0101307109045408,67.6770944211119314,62.5945538889838673]},"#cc8866":{"lch":[62.8492816845599265,59.2369010326618337,32.3420191431213624],"luv":[62.8492816845599265,50.047464385327217,31.6900891849924626],"rgb":[0.8,0.533333333333333326,0.4],"xyz":[0.361030757083099063,0.31406479435581286,0.167314001397364492],"hpluv":[32.3420191431213624,119.60004374597824,62.8492816845599265],"hsluv":[32.3420191431213624,54.1901780257147436,62.8492816845599265]},"#cc8877":{"lch":[63.1598410661450771,52.3169991415742,24.053169540805424],"luv":[63.1598410661450771,47.7741895619322392,21.3235834436907119],"rgb":[0.8,0.533333333333333326,0.466666666666666674],"xyz":[0.370344770103300969,0.317790399563893655,0.216367803303762402],"hpluv":[24.053169540805424,105.109295035123296,63.1598410661450771],"hsluv":[24.053169540805424,38.7316682482548558,63.1598410661450771]},"#cc8888":{"lch":[63.5281271999152182,46.2961098245983322,12.1770506300622312],"luv":[63.5281271999152182,45.2544686659219906,9.76539045078869528],"rgb":[0.8,0.533333333333333326,0.533333333333333326],"xyz":[0.381485187205244769,0.322246566404671253,0.275040666707334569],"hpluv":[12.1770506300622312,92.4736018048895403,63.5281271999152182],"hsluv":[12.1770506300622312,40.0703189706204199,63.5281271999152182]},"#cc8899":{"lch":[63.9554753143552119,42.6335463086933615,356.296984030050055],"luv":[63.9554753143552119,42.5445368433351,-2.7534806412255004],"rgb":[0.8,0.533333333333333326,0.6],"xyz":[0.394542151314317469,0.327469352048300411,0.343807344348452504],"hpluv":[356.296984030050055,84.588837176407921,63.9554753143552119],"hsluv":[356.296984030050055,41.5088242950414781,63.9554753143552119]},"#cc88aa":{"lch":[64.442701858069384,42.8028595258545153,338.056731442080661],"luv":[64.442701858069384,39.701977128446444,-15.9949303118941444],"rgb":[0.8,0.533333333333333326,0.66666666666666663],"xyz":[0.40959984427957,0.333492429234401533,0.423111193965451104],"hpluv":[338.056731442080661,84.28268641071584,64.442701858069384],"hsluv":[338.056731442080661,42.9831867606486924,64.442701858069384]},"#cc88bb":{"lch":[64.9901424985427099,47.2946673003310707,321.051918945199532],"luv":[64.9901424985427099,36.7818149859187784,-29.7301806484697622],"rgb":[0.8,0.533333333333333326,0.733333333333333282],"xyz":[0.426737436386906699,0.340347466077336291,0.513369179064092851],"hpluv":[321.051918945199532,92.3430068912496296,64.9901424985427099],"hsluv":[321.051918945199532,44.4548878388224864,64.9901424985427099]},"#cc88cc":{"lch":[65.5976900795525637,55.3077284551996158,307.715012949245761],"luv":[65.5976900795525637,33.8336367550969399,-43.751912538747959],"rgb":[0.8,0.533333333333333326,0.8],"xyz":[0.446029811830628398,0.348064416254825093,0.614975689734363],"hpluv":[307.715012949245761,106.988377595373095,65.5976900795525637],"hsluv":[307.715012949245761,45.8886814173124122,65.5976900795525637]},"#cc88dd":{"lch":[66.2648339334855905,65.6132669537387727,298.095232643272539],"luv":[66.2648339334855905,30.8998122908772608,-57.8817967994354774],"rgb":[0.8,0.533333333333333326,0.866666666666666696],"xyz":[0.467548137381262,0.356671746475078599,0.728305537634369],"hpluv":[298.095232643272539,125.645770778198369,66.2648339334855905],"hsluv":[298.095232643272539,63.1276078601331037,66.2648339334855905]},"#cc88ee":{"lch":[66.9907009061042,77.2337728548956193,291.267726386147558],"luv":[66.9907009061042,28.0147259973813227,-71.9738202174461463],"rgb":[0.8,0.533333333333333326,0.933333333333333348],"xyz":[0.491360317647436706,0.366196618581548616,0.853716353702892228],"hpluv":[291.267726386147558,146.295866424915545,66.9907009061042],"hsluv":[291.267726386147558,81.1585487563552874,66.9907009061042]},"#cc88ff":{"lch":[67.7740978167257,89.535143384050329,286.350196506734335],"luv":[67.7740978167257,25.2048126805589376,-85.914255618845857],"rgb":[0.8,0.533333333333333326,1],"xyz":[0.517531366057268127,0.37666503794548134,0.991550541994674073],"hpluv":[286.350196506734335,167.63670457649863,67.7740978167257],"hsluv":[286.350196506734335,99.9999999999982379,67.7740978167257]},"#cc9900":{"lch":[66.2294666531998217,80.7116888085701163,57.6888018595631422],"luv":[66.2294666531998217,43.1418134232290527,68.2140795209226383],"rgb":[0.8,0.6,0],"xyz":[0.362920178107905556,0.356211923489684,0.0496415898958362731],"hpluv":[57.6888018595631422,154.64094800189136,66.2294666531998217],"hsluv":[57.6888018595631422,100.000000000002331,66.2294666531998217]},"#cc9911":{"lch":[66.2605931548954459,79.5070460268624,57.3307205104302042],"luv":[66.2605931548954459,42.9170325725223805,66.9290570909725915],"rgb":[0.8,0.6,0.0666666666666666657],"xyz":[0.36393184360754266,0.356616589689538854,0.0549696948605919],"hpluv":[57.3307205104302042,152.261332222626407,66.2605931548954459],"hsluv":[57.3307205104302042,98.1673920986410877,66.2605931548954459]},"#cc9922":{"lch":[66.318231165714252,77.3048675578901339,56.6444543825244],"luv":[66.318231165714252,42.5047546114663533,64.5708013235236535],"rgb":[0.8,0.6,0.133333333333333331],"xyz":[0.365807201746019717,0.357366732944929655,0.0648465810565711],"hpluv":[56.6444543825244,147.915345655385721,66.318231165714252],"hsluv":[56.6444543825244,94.8079930897652901,66.318231165714252]},"#cc9933":{"lch":[66.4129558628457772,73.7662990604099207,55.446788144651876],"luv":[66.4129558628457772,41.8381333944198062,60.7539091017242114],"rgb":[0.8,0.6,0.2],"xyz":[0.368894952478477423,0.358601833237912782,0.0811087349141822456],"hpluv":[55.446788144651876,140.943324602767206,66.4129558628457772],"hsluv":[55.446788144651876,89.3812598244831804,66.4129558628457772]},"#cc9944":{"lch":[66.5493334014023361,68.8491039809152596,53.5533094328142383],"luv":[66.5493334014023361,40.9015039610359423,55.3829043360877122],"rgb":[0.8,0.6,0.266666666666666663],"xyz":[0.373352947722696338,0.360385031335600348,0.104587509867068884],"hpluv":[53.5533094328142383,131.278591794008349,66.5493334014023361],"hsluv":[53.5533094328142383,81.7675495661837459,66.5493334014023361]},"#cc9955":{"lch":[66.7310322275847341,62.6300376921671571,50.6698876242401539],"luv":[66.7310322275847341,39.6941340540006422,48.4447865412296466],"rgb":[0.8,0.6,0.333333333333333315],"xyz":[0.379315361762058323,0.362769996951345208,0.135989557141042799],"hpluv":[50.6698876242401539,119.095172229338388,66.7310322275847341],"hsluv":[50.6698876242401539,71.9728873324543912,66.7310322275847341]},"#cc9966":{"lch":[66.9610303820851,55.3290996264574488,46.2964172073191236],"luv":[66.9610303820851,38.2284030091626121,39.9987308404091877],"rgb":[0.8,0.6,0.4],"xyz":[0.386900357535566508,0.365803995260748527,0.175937201548186761],"hpluv":[46.2964172073191236,104.850571413887963,66.9610303820851],"hsluv":[46.2964172073191236,60.1139469393688586,66.9610303820851]},"#cc9977":{"lch":[67.2417240975963608,47.3725698769106316,39.5497292985384448],"luv":[67.2417240975963608,36.5276723895038842,30.1643751227811094],"rgb":[0.8,0.6,0.466666666666666674],"xyz":[0.396214370555768414,0.369529600468829322,0.22499100345458467],"hpluv":[39.5497292985384448,89.3979234879296598,67.2417240975963608],"hsluv":[39.5497292985384448,46.4000360859745484,67.2417240975963608]},"#cc9988":{"lch":[67.5749927230407508,39.5461637624335367,28.8927829606528306],"luv":[67.5749927230407508,34.6236706423047593,19.1076031876950658],"rgb":[0.8,0.6,0.533333333333333326],"xyz":[0.407354787657712214,0.37398576730960692,0.28366386685815681],"hpluv":[28.8927829606528306,74.2604675709266076,67.5749927230407508],"hsluv":[28.8927829606528306,33.7758353105824227,67.5749927230407508]},"#cc9999":{"lch":[67.962242737641,33.3028609095241,12.177050630062606],"luv":[67.962242737641,32.5535618700051401,7.02468179598591647],"rgb":[0.8,0.6,0.6],"xyz":[0.420411751766784914,0.379208552953236078,0.352430544499274745],"hpluv":[12.177050630062606,62.1803508213615217,67.962242737641],"hsluv":[12.177050630062606,35.0991912912463349,67.962242737641]},"#cc99aa":{"lch":[68.4044417972397838,30.9200145018949506,349.049331623372325],"luv":[68.4044417972397838,30.3569952347367966,-5.87368173427548168],"rgb":[0.8,0.6,0.66666666666666663],"xyz":[0.43546944473203747,0.3852316301393372,0.431734394116273346],"hpluv":[349.049331623372325,57.3580941092039609,68.4044417972397838],"hsluv":[349.049331623372325,36.4663034143199312,68.4044417972397838]},"#cc99bb":{"lch":[68.9021485343020856,34.1112448474386483,325.385883063702067],"luv":[68.9021485343020856,28.0734328763681233,-19.3767745401024669],"rgb":[0.8,0.6,0.733333333333333282],"xyz":[0.452607036839374144,0.392086666982271959,0.521992379214915],"hpluv":[325.385883063702067,62.8208966420876678,68.9021485343020856],"hsluv":[325.385883063702067,37.8410036888738404,68.9021485343020856]},"#cc99cc":{"lch":[69.4555411877739601,42.0770553751994854,307.715012949247],"luv":[69.4555411877739601,25.7399796927440505,-33.285613025220492],"rgb":[0.8,0.6,0.8],"xyz":[0.471899412283095843,0.39980361715976076,0.623598889885185192],"hpluv":[307.715012949247,76.8736967911951581,69.4555411877739601],"hsluv":[307.715012949247,39.1886552488513473,69.4555411877739601]},"#cc99dd":{"lch":[70.0644466506374215,52.8759829560521695,296.254085335195782],"luv":[70.0644466506374215,23.3898305690433475,-47.4213601610093534],"rgb":[0.8,0.6,0.866666666666666696],"xyz":[0.493417737833729442,0.408410947380014266,0.73692873778519119],"hpluv":[296.254085335195782,95.7635162234915498,70.0644466506374215],"hsluv":[296.254085335195782,58.3905887561973813,70.0644466506374215]},"#cc99ee":{"lch":[70.7283706212672,65.1265075826905218,288.858843135035954],"luv":[70.7283706212672,21.0513451251656711,-61.6303728557552191],"rgb":[0.8,0.6,0.933333333333333348],"xyz":[0.517229918099904151,0.417935819486484283,0.862339553853714413],"hpluv":[288.858843135035954,116.843205481858362,70.7283706212672],"hsluv":[288.858843135035954,78.6530020758075494,70.7283706212672]},"#cc99ff":{"lch":[71.4465289765693115,78.0706881495843561,283.894640570210413],"luv":[71.4465289765693115,18.7476796475605703,-75.7862576987549517],"rgb":[0.8,0.6,1],"xyz":[0.543400966509735572,0.428404238850417,1.00017374214549637],"hpluv":[283.894640570210413,138.658404713871533,71.4465289765693115],"hsluv":[283.894640570210413,99.9999999999978,71.4465289765693115]},"#990000":{"lch":[31.2857235930303546,105.214874065330946,12.1770506300617765],"luv":[31.2857235930303546,102.847587834444283,22.1933188419334826],"rgb":[0.6,0,0],"xyz":[0.131365760434599882,0.067735470224092,0.00615777002037173893],"hpluv":[12.1770506300617765,426.746789183125316,31.2857235930303546],"hsluv":[12.1770506300617765,100.000000000002217,31.2857235930303546]},"#990011":{"lch":[31.379701704172021,102.819321078199806,10.8595456684147944],"luv":[31.379701704172021,100.978030711674904,19.3713732237542438],"rgb":[0.6,0,0.0666666666666666657],"xyz":[0.132377425934237014,0.0681401364239468538,0.0114858749851273704],"hpluv":[10.8595456684147944,415.781582167217948,31.379701704172021],"hsluv":[10.8595456684147944,99.9999999999964473,31.379701704172021]},"#990022":{"lch":[31.5529326060038784,98.7447775317108807,8.37468971343924729],"luv":[31.5529326060038784,97.6918390895904309,14.3817824027706251],"rgb":[0.6,0,0.133333333333333331],"xyz":[0.134252784072714015,0.0688902796793376682,0.0213627611811065682],"hpluv":[8.37468971343924729,397.112659756655944,31.5529326060038784],"hsluv":[8.37468971343924729,99.999999999996632,31.5529326060038784]},"#990033":{"lch":[31.8354354483696653,92.9837515463916162,4.18138532137367758],"luv":[31.8354354483696653,92.7362491408617586,6.7798338419980837],"rgb":[0.6,0,0.2],"xyz":[0.137340534805171777,0.070125379972320781,0.0376249150387177114],"hpluv":[4.18138532137367758,370.62575576901952,31.8354354483696653],"hsluv":[4.18138532137367758,99.9999999999969,31.8354354483696653]},"#990044":{"lch":[32.2375108843075537,86.4821897260425771,357.977822115898675],"luv":[32.2375108843075537,86.4283323676992552,-3.05163955108307716],"rgb":[0.6,0,0.266666666666666663],"xyz":[0.141798530049390636,0.071908578070008361,0.0611036899916043499],"hpluv":[357.977822115898675,340.411718586576399,32.2375108843075537],"hsluv":[357.977822115898675,99.9999999999971294,32.2375108843075537]},"#990055":{"lch":[32.7650133258702,80.5606445545256804,349.629319937368109],"luv":[32.7650133258702,79.244583226626645,-14.502188809930411],"rgb":[0.6,0,0.333333333333333315],"xyz":[0.147760944088752622,0.0742935436857532,0.0925057372655782584],"hpluv":[349.629319937368109,311.998071704954214,32.7650133258702],"hsluv":[349.629319937368109,99.9999999999974847,32.7650133258702]},"#990066":{"lch":[33.4199981031921354,76.5714397631706589,339.419101050621862],"luv":[33.4199981031921354,71.6844038684648268,-26.9171252073414813],"rgb":[0.6,0,0.4],"xyz":[0.155345939862260807,0.0773275419951565124,0.13245338167272222],"hpluv":[339.419101050621862,290.7366076723265,33.4199981031921354],"hsluv":[339.419101050621862,99.9999999999978257,33.4199981031921354]},"#990077":{"lch":[34.2012599030024091,75.4745938555541187,328.234093427391315],"luv":[34.2012599030024091,64.1689603650959413,-39.7335984190155429],"rgb":[0.6,0,0.466666666666666674],"xyz":[0.164659952882462712,0.0810531472032373218,0.181507183579120129],"hpluv":[328.234093427391315,280.025774017920355,34.2012599030024091],"hsluv":[328.234093427391315,99.9999999999982094,34.2012599030024091]},"#990088":{"lch":[35.1048906557013396,77.5195253213057214,317.327493504651898],"luv":[35.1048906557013396,56.9954501323273419,-52.5432723595889613],"rgb":[0.6,0,0.533333333333333326],"xyz":[0.175800369984406568,0.0855093140440149196,0.240180046982692297],"hpluv":[317.327493504651898,280.209468657326,35.1048906557013396],"hsluv":[317.327493504651898,99.9999999999985505,35.1048906557013396]},"#990099":{"lch":[36.1248689761228263,82.286593786153162,307.715012949243601],"luv":[36.1248689761228263,50.3375351282041592,-65.0939019735657922],"rgb":[0.6,0,0.6],"xyz":[0.188857334093479268,0.0907320996876440772,0.308946724623810232],"hpluv":[307.715012949243601,289.042783730483336,36.1248689761228263],"hsluv":[307.715012949243601,99.9999999999988205,36.1248689761228263]},"#9900aa":{"lch":[37.2536516336468,89.0432435337247,299.813571633796073],"luv":[37.2536516336468,44.2704748017611038,-77.2581664281054685],"rgb":[0.6,0,0.66666666666666663],"xyz":[0.203915027058731824,0.0967551768737451856,0.388250574240808777],"hpluv":[299.813571633796073,303.299328566743952,37.2536516336468],"hsluv":[299.813571633796073,99.9999999999990905,37.2536516336468]},"#9900bb":{"lch":[38.4827280957899163,97.0854614833978786,293.557760104203282],"luv":[38.4827280957899163,38.802472411223853,-88.9941288300556579],"rgb":[0.6,0,0.733333333333333282],"xyz":[0.221052619166068443,0.103610213716679944,0.478508559339450579],"hpluv":[293.557760104203282,320.130957524774431,38.4827280957899163],"hsluv":[293.557760104203282,99.9999999999993179,38.4827280957899163]},"#9900cc":{"lch":[39.8031058181596933,105.884836559305498,288.673688741635],"luv":[39.8031058181596933,33.9019931565070394,-100.310784431221492],"rgb":[0.6,0,0.8],"xyz":[0.240344994609790197,0.111327163894168746,0.580115070009720735],"hpluv":[288.673688741635,337.564008898092311,39.8031058181596933],"hsluv":[288.673688741635,99.9999999999995879,39.8031058181596933]},"#9900dd":{"lch":[41.2057071388761145,115.092674624289529,284.860629917023232],"luv":[41.2057071388761145,29.5176685469448401,-111.243116621772529],"rgb":[0.6,0,0.866666666666666696],"xyz":[0.26186332016042374,0.11993449411442228,0.693444917909726732],"hpluv":[284.860629917023232,354.429316861661562,41.2057071388761145],"hsluv":[284.860629917023232,99.9999999999996732,41.2057071388761145]},"#9900ee":{"lch":[42.6816722484951754,124.494824438150232,281.862271937449748],"luv":[42.6816722484951754,25.5911328567321625,-121.836181945245357],"rgb":[0.6,0,0.933333333333333348],"xyz":[0.285675500426598505,0.129459366220892297,0.81885573397825],"hpluv":[281.862271937449748,370.125661914021862,42.6816722484951754],"hsluv":[281.862271937449748,99.9999999999998437,42.6816722484951754]},"#9900ff":{"lch":[44.2225734052255817,133.965544030308308,279.479958267333473],"luv":[44.2225734052255817,22.0644732467518,-132.136013288126151],"rgb":[0.6,0,1],"xyz":[0.311846548836429871,0.139927785584825,0.956689922270031801],"hpluv":[279.479958267333473,384.404468177447882,44.2225734052255817],"hsluv":[279.479958267333473,99.9999999999999574,44.2225734052255817]},"#bb0000":{"lch":[38.8409426943877918,130.623313921981463,12.1770506300617818],"luv":[38.8409426943877918,127.684349491075153,27.5528044852332741],"rgb":[0.733333333333333282,0,0],"xyz":[0.20493059501477473,0.105667338054495463,0.00960612164131736251],"hpluv":[12.1770506300617818,426.746789183125145,38.8409426943877918],"hsluv":[12.1770506300617818,100.000000000002217,38.8409426943877918]},"#bb0011":{"lch":[38.9108602521517142,128.680110500437479,11.3344428162225856],"luv":[38.9108602521517142,126.170422440132384,25.2902222149853806],"rgb":[0.733333333333333282,0,0.0666666666666666657],"xyz":[0.205942260514411862,0.106072004254350316,0.014934226606072994],"hpluv":[11.3344428162225856,419.642938315359174,38.9108602521517142],"hsluv":[11.3344428162225856,99.9999999999964189,38.9108602521517142]},"#bb0022":{"lch":[39.0399998564474373,125.270257566289573,9.75441483214293292],"luv":[39.0399998564474373,123.459226352671962,21.2239689767074431],"rgb":[0.733333333333333282,0,0.133333333333333331],"xyz":[0.207817618652888864,0.10682214750974113,0.0248111128020521918],"hpluv":[9.75441483214293292,407.171610230013243,39.0399998564474373],"hsluv":[9.75441483214293292,99.9999999999965326,39.0399998564474373]},"#bb0033":{"lch":[39.2513155564018916,120.169209623826248,7.10634666793171554],"luv":[39.2513155564018916,119.246098647877318,14.866300779810846],"rgb":[0.733333333333333282,0,0.2],"xyz":[0.210905369385346597,0.108057247802724243,0.041073266659663335],"hpluv":[7.10634666793171554,388.488631169232178,39.2513155564018916],"hsluv":[7.10634666793171554,99.9999999999967173,39.2513155564018916]},"#bb0044":{"lch":[39.5535843326651886,113.833969399977519,3.19865110237705785],"luv":[39.5535843326651886,113.656624965458903,6.3517077086437],"rgb":[0.733333333333333282,0,0.266666666666666663],"xyz":[0.215363364629565485,0.109840445900411823,0.0645520416125499735],"hpluv":[3.19865110237705785,365.195452768261646,39.5535843326651886],"hsluv":[3.19865110237705785,99.9999999999968878,39.5535843326651886]},"#bb0055":{"lch":[39.9527871554326666,107.03859947839959,357.869864695501747],"luv":[39.9527871554326666,106.964633924407806,-3.97855095665153691],"rgb":[0.733333333333333282,0,0.333333333333333315],"xyz":[0.221325778668927498,0.112225411516156656,0.095954088886523875],"hpluv":[357.869864695501747,339.963790558847222,39.9527871554326666],"hsluv":[357.869864695501747,99.9999999999971436,39.9527871554326666]},"#bb0066":{"lch":[40.452535568346093,100.749762000256624,351.053086521713055],"luv":[40.452535568346093,99.5239253968718884,-15.6685295004423661],"rgb":[0.733333333333333282,0,0.4],"xyz":[0.228910774442435655,0.115259409825559975,0.135901733293667837],"hpluv":[351.053086521713055,316.036764522848955,40.452535568346093],"hsluv":[351.053086521713055,99.999999999997442,40.452535568346093]},"#bb0077":{"lch":[41.0543478797665813,95.9494038996296581,342.883287985183927],"luv":[41.0543478797665813,91.699536963203,-28.2397420212797314],"rgb":[0.733333333333333282,0,0.466666666666666674],"xyz":[0.238224787462637588,0.118985015033640784,0.184955535200065746],"hpluv":[342.883287985183927,296.56674422547627,41.0543478797665813],"hsluv":[342.883287985183927,99.9999999999977,41.0543478797665813]},"#bb0088":{"lch":[41.7578935904565398,93.4210879643116243,333.788939203308246],"luv":[41.7578935904565398,83.8148890966975699,-41.2621381189091565],"rgb":[0.733333333333333282,0,0.533333333333333326],"xyz":[0.249365204564581389,0.123441181874418382,0.243628398603637913],"hpluv":[333.788939203308246,283.887103643995431,41.7578935904565398],"hsluv":[333.788939203308246,99.9999999999980531,41.7578935904565398]},"#bb0099":{"lch":[42.5612451572515,93.5592166386053918,324.452137443226093],"luv":[42.5612451572515,76.1225984195714318,-54.3937223205229472],"rgb":[0.733333333333333282,0,0.6],"xyz":[0.262422168673654088,0.12866396751804754,0.31239507624475582],"hpluv":[324.452137443226093,278.940502109978524,42.5612451572515],"hsluv":[324.452137443226093,99.9999999999983089,42.5612451572515]},"#bb00aa":{"lch":[43.461144448190268,96.3048592888224562,315.591494301740738],"luv":[43.461144448190268,68.7971872487792,-67.3911934105362747],"rgb":[0.733333333333333282,0,0.66666666666666663],"xyz":[0.277479861638906644,0.134687044704148634,0.391698925861754421],"hpluv":[315.591494301740738,281.181257774391042,43.461144448190268],"hsluv":[315.591494301740738,99.9999999999985647,43.461144448190268]},"#bb00bb":{"lch":[44.4532771259814652,101.257357078489918,307.715012949243601],"luv":[44.4532771259814652,61.9426024872754866,-80.100976021670192],"rgb":[0.733333333333333282,0,0.733333333333333282],"xyz":[0.294617453746243319,0.141542081547083393,0.481956910960396168],"hpluv":[307.715012949243601,289.042783730483507,44.4532771259814652],"hsluv":[307.715012949243601,99.9999999999988205,44.4532771259814652]},"#bb00cc":{"lch":[45.5325428123826796,107.876917991024385,301.028560594476971],"luv":[45.5325428123826796,55.6068066637028551,-92.44085940701639],"rgb":[0.733333333333333282,0,0.8],"xyz":[0.313909829189965,0.149259031724572194,0.583563421630666324],"hpluv":[301.028560594476971,300.639438898355309,45.5325428123826796],"hsluv":[301.028560594476971,99.999999999999,45.5325428123826796]},"#bb00dd":{"lch":[46.6933085129957348,115.650155059812704,295.504945579136574],"luv":[46.6933085129957348,49.7976850024997,-104.379830109799173],"rgb":[0.733333333333333282,0,0.866666666666666696],"xyz":[0.335428154740598616,0.157866361944825728,0.696893269530672321],"hpluv":[295.504945579136574,314.290242754568055,46.6933085129957348],"hsluv":[295.504945579136574,99.9999999999992468,46.6933085129957348]},"#bb00ee":{"lch":[47.929635203682146,124.167261181765113,290.999747870951808],"luv":[47.929635203682146,44.4970566855085821,-115.920320460682433],"rgb":[0.733333333333333282,0,0.933333333333333348],"xyz":[0.359240335006773326,0.167391234051295773,0.822304085599195544],"hpluv":[290.999747870951808,328.732244305823656,47.929635203682146],"hsluv":[290.999747870951808,99.9999999999993889,47.929635203682146]},"#bb00ff":{"lch":[49.2354711183318727,133.13261796854033,287.33664116340708],"luv":[49.2354711183318727,39.6715752597668896,-127.084460433075606],"rgb":[0.733333333333333282,0,1],"xyz":[0.385411383416604747,0.177859653415228469,0.96013827389097739],"hpluv":[287.33664116340708,343.119737385630629,49.2354711183318727],"hsluv":[287.33664116340708,99.9999999999995595,49.2354711183318727]},"#991100":{"lch":[32.2007428060931531,101.551746681272988,13.5001929330929755],"luv":[32.2007428060931531,98.7457840078795,23.707116962774041],"rgb":[0.6,0.0666666666666666657,0],"xyz":[0.133370160695528289,0.071744270745948871,0.00682590344068119],"hpluv":[13.5001929330929755,400.185025755779861,32.2007428060931531],"hsluv":[13.5001929330929755,100.000000000002359,32.2007428060931531]},"#991111":{"lch":[32.2911967351305,99.2607003603350506,12.1770506300617907],"luv":[32.2911967351305,97.0273802968116854,20.9373854328113431],"rgb":[0.6,0.0666666666666666657,0.0666666666666666657],"xyz":[0.134381826195165421,0.0721489369458037239,0.0121540084054368204],"hpluv":[12.1770506300617907,390.060992150638072,32.2911967351305],"hsluv":[12.1770506300617907,91.4033806551417,32.2911967351305]},"#991122":{"lch":[32.4579836187547883,95.3555453821432337,9.67722696349737355],"luv":[32.4579836187547883,93.9986702773161085,16.0290368151797],"rgb":[0.6,0.0666666666666666657,0.133333333333333331],"xyz":[0.136257184333642423,0.0728990802011945382,0.0220308946014160165],"hpluv":[9.67722696349737355,372.789562407290305,32.4579836187547883],"hsluv":[9.67722696349737355,91.6870397393079,32.4579836187547883]},"#991133":{"lch":[32.7301206059751877,89.8170234432985382,5.44607482402752385],"luv":[32.7301206059751877,89.4115862394302,8.52443231910342547],"rgb":[0.6,0.0666666666666666657,0.2],"xyz":[0.139344935066100184,0.0741341804941776511,0.0382930484590271597],"hpluv":[5.44607482402752385,348.217328437078379,32.7301206059751877],"hsluv":[5.44607482402752385,92.1153976677825312,32.7301206059751877]},"#991144":{"lch":[33.1177416447746893,83.547386161100178,359.159050762907725],"luv":[33.1177416447746893,83.5383872622118275,-1.22620878349376072],"rgb":[0.6,0.0666666666666666657,0.266666666666666663],"xyz":[0.143802930310319044,0.0759173785918652311,0.0617718234119138],"hpluv":[359.159050762907725,320.119020896680809,33.1177416447746893],"hsluv":[359.159050762907725,92.6613616101701609,33.1177416447746893]},"#991155":{"lch":[33.6267967661613341,77.8365467514172451,350.652860745276428],"luv":[33.6267967661613341,76.8030661853154,-12.6418762341523276],"rgb":[0.6,0.0666666666666666657,0.333333333333333315],"xyz":[0.149765344349681029,0.078302344207610064,0.0931738706858877136],"hpluv":[350.652860745276428,293.722615948770908,33.6267967661613341],"hsluv":[350.652860745276428,93.2833986807069664,33.6267967661613341]},"#991166":{"lch":[34.2596587707945375,74.039902428482776,340.197584074025258],"luv":[34.2596587707945375,69.661662743272629,-25.0830599301957804],"rgb":[0.6,0.0666666666666666657,0.4],"xyz":[0.157350340123189214,0.0813363425170133825,0.133121515093031662],"hpluv":[340.197584074025258,274.234525914752396,34.2596587707945375],"hsluv":[340.197584074025258,93.9371476037906774,34.2596587707945375]},"#991177":{"lch":[35.0156115165229096,73.1458980715855773,328.71391057162549],"luv":[35.0156115165229096,62.509382661628635,-37.9855167657472848],"rgb":[0.6,0.0666666666666666657,0.466666666666666674],"xyz":[0.16666435314339112,0.0850619477250941919,0.182175316999429571],"hpluv":[328.71391057162549,265.074278305330154,35.0156115165229096],"hsluv":[328.71391057162549,94.5844210689808165,35.0156115165229096]},"#991188":{"lch":[35.8913494409224185,75.4242755669397269,317.528981112118743],"luv":[35.8913494409224185,55.6343762077295239,-50.9277677576239398],"rgb":[0.6,0.0666666666666666657,0.533333333333333326],"xyz":[0.177804770245334975,0.0895181145658717897,0.240848180403001738],"hpluv":[317.528981112118743,266.661726649655066,35.8913494409224185],"hsluv":[317.528981112118743,95.1976582537924116,35.8913494409224185]},"#991199":{"lch":[36.8815072257793,80.448343562419069,307.715012949243601],"luv":[36.8815072257793,49.2130143411107568,-63.6397297401445599],"rgb":[0.6,0.0666666666666666657,0.6],"xyz":[0.190861734354407675,0.0947409002095009473,0.309614858044119645],"hpluv":[307.715012949243601,276.788327826692239,36.8815072257793],"hsluv":[307.715012949243601,95.7603314825458511,36.8815072257793]},"#9911aa":{"lch":[37.9791974354050694,87.4639739592788,299.695850237394552],"luv":[37.9791974354050694,43.3292813921454609,-75.9771025690614152],"rgb":[0.6,0.0666666666666666657,0.66666666666666663],"xyz":[0.205919427319660231,0.100763977395602056,0.388918707661118246],"hpluv":[299.695850237394552,292.228621346341356,37.9791974354050694],"hsluv":[299.695850237394552,96.26500390067784,37.9791974354050694]},"#9911bb":{"lch":[39.176522525078866,95.7489617369993624,293.383950362709356],"luv":[39.176522525078866,38.0018814997404846,-87.8847010360338459],"rgb":[0.6,0.0666666666666666657,0.733333333333333282],"xyz":[0.22305701942699685,0.107619014238536814,0.47917669275976],"hpluv":[293.383950362709356,310.132668732371314,39.176522525078866],"hsluv":[293.383950362709356,96.7106400677762537,39.176522525078866]},"#9911cc":{"lch":[40.465031277763515,104.765415075180798,288.480743990765689],"luv":[40.465031277763515,33.2091620218187842,-99.3626879350770622],"rgb":[0.6,0.0666666666666666657,0.8],"xyz":[0.242349394870718604,0.115335964416025616,0.580783203430030204],"hpluv":[288.480743990765689,328.531778006508034,40.465031277763515],"hsluv":[288.480743990765689,97.1001366995766,40.465031277763515]},"#9911dd":{"lch":[41.8361001822542917,114.161763941518927,284.668123617886636],"luv":[41.8361001822542917,28.9080153835727351,-110.441092863219225],"rgb":[0.6,0.0666666666666666657,0.866666666666666696],"xyz":[0.263867720421352148,0.12394329463627915,0.694113051330036201],"hpluv":[284.668123617886636,346.265164959266087,41.8361001822542917],"hsluv":[284.668123617886636,97.4384492036098,41.8361001822542917]},"#9911ee":{"lch":[43.2812320372341617,123.724619665436521,281.679545129349094],"luv":[43.2812320372341617,25.0465268392882301,-121.162919264293635],"rgb":[0.6,0.0666666666666666657,0.933333333333333348],"xyz":[0.287679900687526913,0.133468166742749167,0.819523867398559425],"hpluv":[281.679545129349094,362.740326129136179,43.2812320372341617],"hsluv":[281.679545129349094,97.7313369542794561,43.2812320372341617]},"#9911ff":{"lch":[44.7922739406791948,133.33068560825987,279.310828677429186],"luv":[44.7922739406791948,21.5716156333953251,-131.574074664174219],"rgb":[0.6,0.0666666666666666657,1],"xyz":[0.313850949097358278,0.143936586106681863,0.95735805569034127],"hpluv":[279.310828677429186,377.716823123197173,44.7922739406791948],"hsluv":[279.310828677429186,99.9999999999993179,44.7922739406791948]},"#bb1100":{"lch":[39.5258701457598747,127.514079962112703,13.0219609303782402],"luv":[39.5258701457598747,124.2348987579322,28.7320469022032583],"rgb":[0.733333333333333282,0.0666666666666666657,0],"xyz":[0.206934995275703137,0.109676138576352333,0.0102742550616268143],"hpluv":[13.0219609303782402,409.370014873310311,39.5258701457598747],"hsluv":[13.0219609303782402,100.000000000002203,39.5258701457598747]},"#bb1111":{"lch":[39.5940766091873897,125.63034182067031,12.177050630061796],"luv":[39.5940766091873897,122.803716963532779,26.4996204863200759],"rgb":[0.733333333333333282,0.0666666666666666657,0.0666666666666666657],"xyz":[0.20794666077534027,0.110080804776207186,0.0156023600263824457],"hpluv":[12.177050630061796,402.627698793753552,39.5940766091873897],"hsluv":[12.177050630061796,94.3481495348726753,39.5940766091873897]},"#bb1122":{"lch":[39.7200723855077413,122.321798686612851,10.5915831721034426],"luv":[39.7200723855077413,120.23772406897838,22.4835972353282152],"rgb":[0.733333333333333282,0.0666666666666666657,0.133333333333333331],"xyz":[0.209822018913817271,0.110830948031598,0.0254792462223616401],"hpluv":[10.5915831721034426,390.780742551338619,39.7200723855077413],"hsluv":[10.5915831721034426,94.4721603032542561,39.7200723855077413]},"#bb1133":{"lch":[39.9262897734852,117.365304386249704,7.93115519261489421],"luv":[39.9262897734852,116.242655940639409,16.194431559742192],"rgb":[0.733333333333333282,0.0666666666666666657,0.2],"xyz":[0.212909769646275,0.112066048324581113,0.0417414000799727902],"hpluv":[7.93115519261489421,373.009679290071517,39.9262897734852],"hsluv":[7.93115519261489421,94.6648992051481173,39.9262897734852]},"#bb1144":{"lch":[40.2213637516280755,111.198866264944101,3.99799547396429888],"luv":[40.2213637516280755,110.928262725239179,7.75295991020434627],"rgb":[0.733333333333333282,0.0666666666666666657,0.266666666666666663],"xyz":[0.217367764890493892,0.113849246422268693,0.0652201750328594287],"hpluv":[3.99799547396429888,350.818828640487084,40.2213637516280755],"hsluv":[3.99799547396429888,94.920595316052,40.2213637516280755]},"#bb1155":{"lch":[40.6112374139617245,104.574630781207446,358.621384873601698],"luv":[40.6112374139617245,104.544360517453882,-2.51596641918957786],"rgb":[0.733333333333333282,0.0666666666666666657,0.333333333333333315],"xyz":[0.223330178929855905,0.116234212038013526,0.0966222223068333302],"hpluv":[358.621384873601698,326.752894857139097,40.6112374139617245],"hsluv":[358.621384873601698,95.2265760165129791,40.6112374139617245]},"#bb1166":{"lch":[41.0995768863194755,98.4443929415329251,351.723860164231496],"luv":[41.0995768863194755,97.4191751888273672,-14.1704907168206535],"rgb":[0.733333333333333282,0.0666666666666666657,0.4],"xyz":[0.230915174703364062,0.119268210347416845,0.136569866713977306],"hpluv":[351.723860164231496,303.943570446579713,41.0995768863194755],"hsluv":[351.723860164231496,95.5663396203906643,41.0995768863194755]},"#bb1177":{"lch":[41.688035181331955,93.7889310063258,343.43446060875408],"luv":[41.688035181331955,89.8961490854954093,-26.7403432832812094],"rgb":[0.733333333333333282,0.0666666666666666657,0.466666666666666674],"xyz":[0.240229187723566,0.122993815555497654,0.185623668620375215],"hpluv":[343.43446060875408,285.48249634694713,41.688035181331955],"hsluv":[343.43446060875408,95.9227087501184883,41.688035181331955]},"#bb1188":{"lch":[42.3764815581906475,91.4027083669889606,334.189166164708297],"luv":[42.3764815581906475,82.2840505377722309,-39.7968607294366805],"rgb":[0.733333333333333282,0.0666666666666666657,0.533333333333333326],"xyz":[0.251369604825509796,0.127449982396275252,0.244296532023947383],"hpluv":[334.189166164708297,273.699179760613617,42.3764815581906475],"hsluv":[334.189166164708297,96.2803174994205,42.3764815581906475]},"#bb1199":{"lch":[43.1632358766101092,91.692942572352564,324.693570122963422],"luv":[43.1632358766101092,74.8281105443768269,-52.9938637007650755],"rgb":[0.733333333333333282,0.0666666666666666657,0.6],"xyz":[0.264426568934582495,0.13267276803990441,0.31306320966506529],"hpluv":[324.693570122963422,269.563595898888195,43.1632358766101092],"hsluv":[324.693570122963422,96.6270445785018239,43.1632358766101092]},"#bb11aa":{"lch":[44.0453166933651,94.6050581990027553,315.694091730478135],"luv":[44.0453166933651,67.7013389352867847,-66.0806003544619784],"rgb":[0.733333333333333282,0.0666666666666666657,0.66666666666666663],"xyz":[0.279484261899835051,0.138695845226005504,0.39236705928206389],"hpluv":[315.694091730478135,272.554870225691275,44.0453166933651],"hsluv":[315.694091730478135,96.9544350138240105,44.0453166933651]},"#bb11bb":{"lch":[45.0186979872658242,99.7328976909900717,307.715012949243601],"luv":[45.0186979872658242,61.0100383302365472,-78.8950321933172205],"rgb":[0.733333333333333282,0.0666666666666666657,0.733333333333333282],"xyz":[0.296621854007171726,0.145550882068940263,0.482625044380705637],"hpluv":[307.715012949243601,281.115526817766181,45.0186979872658242],"hsluv":[307.715012949243601,97.2574105430315115,45.0186979872658242]},"#bb11cc":{"lch":[46.0785638011469771,106.527215460047387,300.962972083371881],"luv":[46.0785638011469771,54.8065495444917161,-91.3470840295328372],"rgb":[0.733333333333333282,0.0666666666666666657,0.8],"xyz":[0.315914229450893425,0.153267832246429064,0.584231555050975793],"hpluv":[300.962972083371881,293.360047474541318,46.0785638011469771],"hsluv":[300.962972083371881,97.5336183018287528,46.0785638011469771]},"#bb11dd":{"lch":[47.2195492447565,114.4666153484132,295.402801066287566],"luv":[47.2195492447565,49.1038079522977853,-103.3993330438134],"rgb":[0.733333333333333282,0.0666666666666666657,0.866666666666666696],"xyz":[0.337432555001527,0.161875162466682598,0.69756140295098179],"hpluv":[295.402801066287566,307.607082675331128,47.2195492447565],"hsluv":[295.402801066287566,97.7826899351839813,47.2195492447565]},"#bb11ee":{"lch":[48.4359581768354701,123.136484869400022,290.880608651701721],"luv":[48.4359581768354701,43.8885280811888,-115.049515465553711],"rgb":[0.733333333333333282,0.0666666666666666657,0.933333333333333348],"xyz":[0.361244735267701733,0.171400034573152643,0.822972219019505],"hpluv":[290.880608651701721,322.595409245987128,48.4359581768354701],"hsluv":[290.880608651701721,98.0055710342431325,48.4359581768354701]},"#bb11ff":{"lch":[49.7219510368964,132.239138283310353,287.21247838519713],"luv":[49.7219510368964,39.1316890181496575,-126.316667975763593],"rgb":[0.733333333333333282,0.0666666666666666657,1],"xyz":[0.387415783677533154,0.181868453937085339,0.960806407311286859],"hpluv":[287.21247838519713,337.482436204013879,49.7219510368964],"hsluv":[287.21247838519713,99.9999999999991758,49.7219510368964]},"#992200":{"lch":[33.8105832897308716,95.4307991554818358,16.0266852535062476],"luv":[33.8105832897308716,91.7217107848809263,26.3470149760569932],"rgb":[0.6,0.133333333333333331,0],"xyz":[0.137085784430296231,0.0791755182154848525,0.0080644446856038],"hpluv":[16.0266852535062476,358.158468302090569,33.8105832897308716],"hsluv":[16.0266852535062476,100.000000000002331,33.8105832897308716]},"#992211":{"lch":[33.8952997814050718,93.2922690289088195,14.6972380002076104],"luv":[33.8952997814050718,90.239744522062125,23.669304365681274],"rgb":[0.6,0.133333333333333331,0.0666666666666666657],"xyz":[0.138097449929933364,0.0795801844153397,0.0133925496503594314],"hpluv":[14.6972380002076104,349.257308780581,33.8952997814050718],"hsluv":[14.6972380002076104,92.1483909924374274,33.8952997814050718]},"#992222":{"lch":[34.0515850466810335,89.6330213591727,12.1770506300618084],"luv":[34.0515850466810335,87.6163196410811338,18.9065874902323579],"rgb":[0.6,0.133333333333333331,0.133333333333333331],"xyz":[0.139972808068410365,0.0803303276707305197,0.0232694358463386292],"hpluv":[12.1770506300618084,334.018122077437397,34.0515850466810335],"hsluv":[12.1770506300618084,78.2707991117683,34.0515850466810335]},"#992233":{"lch":[34.3068003204445446,84.4135643942939282,7.88651435003668233],"luv":[34.3068003204445446,83.6151628365757773,11.58250394183076],"rgb":[0.6,0.133333333333333331,0.2],"xyz":[0.143060558800868098,0.0815654279637136326,0.0395315897039497724],"hpluv":[7.88651435003668233,312.227643050581207,34.3068003204445446],"hsluv":[7.88651435003668233,79.3008398259009226,34.3068003204445446]},"#992244":{"lch":[34.6707661525426,78.4682482149262199,1.45557545410962708],"luv":[34.6707661525426,78.4429281517087134,1.99323879782018309],"rgb":[0.6,0.133333333333333331,0.266666666666666663],"xyz":[0.147518554045086986,0.0833486260614012126,0.0630103646568364],"hpluv":[1.45557545410962708,287.190351340663,34.6707661525426],"hsluv":[1.45557545410962708,80.6267396657693212,34.6707661525426]},"#992255":{"lch":[35.149531709850983,73.0418005898087443,352.659616011821072],"luv":[35.149531709850983,72.4431965063170082,-9.33209051330535821],"rgb":[0.6,0.133333333333333331,0.333333333333333315],"xyz":[0.153480968084449,0.0857335916771460455,0.0944124119308103193],"hpluv":[352.659616011821072,263.688538908073838,35.149531709850983],"hsluv":[352.659616011821072,82.1555178352066804,35.149531709850983]},"#992266":{"lch":[35.7459223236079495,69.5043059181480203,341.734006615383123],"luv":[35.7459223236079495,66.0021002604389793,-21.7846574995905513],"rgb":[0.6,0.133333333333333331,0.4],"xyz":[0.161065963857957156,0.0887675899865493639,0.134360056337954281],"hpluv":[341.734006615383123,246.731460763727796,35.7459223236079495],"hsluv":[341.734006615383123,83.7834402291280753,35.7459223236079495]},"#992277":{"lch":[36.4599553630224946,68.9051746310403104,329.662355423262511],"luv":[36.4599553630224946,59.4695672743266783,-34.8036443370302],"rgb":[0.6,0.133333333333333331,0.466666666666666674],"xyz":[0.17037997687815909,0.0924931951946301734,0.18341385824435219],"hpluv":[329.662355423262511,239.814275331209444,36.4599553630224946],"hsluv":[329.662355423262511,85.4170781092293225,36.4599553630224946]},"#992288":{"lch":[37.2892540647929,71.5563678213307242,317.925484235555643],"luv":[37.2892540647929,53.1144286836587369,-47.9496740488411],"rgb":[0.6,0.133333333333333331,0.533333333333333326],"xyz":[0.18152039398010289,0.0969493620354077712,0.242086721647924358],"hpluv":[317.925484235555643,243.502777039008038,37.2892540647929],"hsluv":[317.925484235555643,86.9852623869732,37.2892540647929]},"#992299":{"lch":[38.2294870734457888,77.015786119064046,307.715012949243771],"luv":[38.2294870734457888,47.1132010795059841,-60.9243596238766827],"rgb":[0.6,0.133333333333333331,0.6],"xyz":[0.194577358089175617,0.102172147679036929,0.310853399289042265],"hpluv":[307.715012949243771,255.635172818446421,38.2294870734457888],"hsluv":[307.715012949243771,88.441984096309227,38.2294870734457888]},"#9922aa":{"lch":[39.2748221448681178,84.484081905089468,299.468150353755561],"luv":[39.2748221448681178,41.5610713460956234,-73.5543162833468],"rgb":[0.6,0.133333333333333331,0.66666666666666663],"xyz":[0.209635051054428145,0.108195224865138023,0.390157248906040865],"hpluv":[299.468150353755561,272.960615272696657,39.2748221448681178],"hsluv":[299.468150353755561,89.7633288768494708,39.2748221448681178]},"#9922bb":{"lch":[40.4183688993281436,93.2013493596814726,293.05045530637],"luv":[40.4183688993281436,36.4922039393154094,-85.7601922462677919],"rgb":[0.6,0.133333333333333331,0.733333333333333282],"xyz":[0.22677264316176482,0.115050261708072782,0.480415234004682612],"hpluv":[293.05045530637,292.605673863240838,40.4183688993281436],"hsluv":[293.05045530637,90.9419133161227222,40.4183688993281436]},"#9922cc":{"lch":[41.6525852773545182,102.609691310931794,288.11294916137831],"luv":[41.6525852773545182,31.900454524651952,-97.5249186210648702],"rgb":[0.6,0.133333333333333331,0.8],"xyz":[0.246065018605486546,0.122767211885561583,0.582021744674952712],"hpluv":[288.11294916137831,312.597676326075884,41.6525852773545182],"hsluv":[288.11294916137831,91.9812251551093851,41.6525852773545182]},"#9922dd":{"lch":[42.969628845807982,112.350489371469905,284.303043907998301],"luv":[42.969628845807982,27.7562437333976213,-108.867917201630149],"rgb":[0.6,0.133333333333333331,0.866666666666666696],"xyz":[0.267583344156120062,0.131374542105815117,0.69535159257495871],"hpluv":[284.303043907998301,331.781902020401162,42.969628845807982],"hsluv":[284.303043907998301,92.8910125551507235,42.969628845807982]},"#9922ee":{"lch":[44.361642902098545,122.210344632057584,281.334390799049743],"luv":[44.361642902098545,24.018574136526297,-119.826860225637532],"rgb":[0.6,0.133333333333333331,0.933333333333333348],"xyz":[0.291395524422294827,0.140899414212285162,0.820762408643481933],"hpluv":[281.334390799049743,349.574442537581717,44.361642902098545],"hsluv":[281.334390799049743,93.6839973987951566,44.361642902098545]},"#9922ff":{"lch":[45.8209755847726612,132.069283427413211,278.992348895848238],"luv":[45.8209755847726612,20.6427685166220094,-130.446049127597433],"rgb":[0.6,0.133333333333333331,1],"xyz":[0.317566572832126193,0.151367833576217858,0.958596596935263889],"hpluv":[278.992348895848238,365.74366826955071,45.8209755847726612],"hsluv":[278.992348895848238,99.9999999999993179,45.8209755847726612]},"#bb2200":{"lch":[40.7526421249889452,122.145166616692975,14.6188079362681389],"luv":[40.7526421249889452,118.190884669319914,30.8278528104570881],"rgb":[0.733333333333333282,0.133333333333333331,0],"xyz":[0.21065061901047108,0.117107386045888315,0.0115127963065494235],"hpluv":[14.6188079362681389,380.329350781024857,40.7526421249889452],"hsluv":[14.6188079362681389,100.000000000002217,40.7526421249889452]},"#bb2211":{"lch":[40.8179368215716849,120.355879944515436,13.7706881972771793],"luv":[40.8179368215716849,116.896392622501153,28.6491052053056343],"rgb":[0.733333333333333282,0.133333333333333331,0.0666666666666666657],"xyz":[0.211662284510108212,0.117512052245743168,0.0168409012713050532],"hpluv":[13.7706881972771793,374.158477594779924,40.8179368215716849],"hsluv":[13.7706881972771793,94.6800257514418,40.8179368215716849]},"#bb2222":{"lch":[40.9385803904414161,117.208042434762348,12.1770506300618102],"luv":[40.9385803904414161,114.570915436608942,24.7230772236478238],"rgb":[0.733333333333333282,0.133333333333333331,0.133333333333333331],"xyz":[0.213537642648585213,0.118262195501133982,0.0267177874672842527],"hpluv":[12.1770506300618102,363.298797482753,40.9385803904414161],"hsluv":[12.1770506300618102,85.1321689328196101,40.9385803904414161]},"#bb2233":{"lch":[41.136111673530813,112.480172956632245,9.49666640172232235],"luv":[41.136111673530813,110.938654987290519,18.5581286223806821],"rgb":[0.733333333333333282,0.133333333333333331,0.2],"xyz":[0.216625393381042974,0.119497295794117095,0.042979941324895396],"hpluv":[9.49666640172232235,346.970109935861444,41.136111673530813],"hsluv":[9.49666640172232235,85.6217357677037398,41.136111673530813]},"#bb2244":{"lch":[41.4189140922405201,106.57909239531196,5.51995404221549],"luv":[41.4189140922405201,106.084859394728952,10.2520994439692306],"rgb":[0.733333333333333282,0.133333333333333331,0.266666666666666663],"xyz":[0.221083388625261834,0.121280493891804675,0.0664587162777820345],"hpluv":[5.51995404221549,326.522141050690152,41.4189140922405201],"hsluv":[5.51995404221549,86.2742612371986297,41.4189140922405201]},"#bb2255":{"lch":[41.7928521194743823,100.22104851316422,0.0579838467833058424],"luv":[41.7928521194743823,100.220997191859041,0.101424589714973798],"rgb":[0.733333333333333282,0.133333333333333331,0.333333333333333315],"xyz":[0.227045802664623819,0.123665459507549508,0.097860763551755936],"hpluv":[0.0579838467833058424,304.296010337655673,41.7928521194743823],"hsluv":[0.0579838467833058424,87.0597094656736772,41.7928521194743823]},"#bb2266":{"lch":[42.2616671880265216,94.3342448936905,353.011685321171171],"luv":[42.2616671880265216,93.6334344607092106,-11.4773564358193614],"rgb":[0.733333333333333282,0.133333333333333331,0.4],"xyz":[0.234630798438132,0.126699457816952826,0.137808407958899898],"hpluv":[353.011685321171171,283.244886623536,42.2616671880265216],"hsluv":[353.011685321171171,87.937804292381287,42.2616671880265216]},"#bb2277":{"lch":[42.8272221099346666,89.9002723684957,344.496654306277264],"luv":[42.8272221099346666,86.6292371691086771,-24.0298614109202155],"rgb":[0.733333333333333282,0.133333333333333331,0.466666666666666674],"xyz":[0.24394481145833391,0.13042506302503365,0.186862209865297807],"hpluv":[344.496654306277264,266.367005402095344,42.8272221099346666],"hsluv":[344.496654306277264,88.8655868844719805,42.8272221099346666]},"#bb2288":{"lch":[43.4897067779173554,87.7363054907772693,334.961981200390596],"luv":[43.4897067779173554,79.4914755013727898,-37.1317199141871441],"rgb":[0.733333333333333282,0.133333333333333331,0.533333333333333326],"xyz":[0.255085228560277766,0.13488122986581122,0.245535073268869974],"hpluv":[334.961981200390596,255.995416581420926,43.4897067779173554],"hsluv":[334.961981200390596,89.8036443318747786,43.4897067779173554]},"#bb2299":{"lch":[44.2478449340908639,88.2751432264235092,325.159464012784042],"luv":[44.2478449340908639,72.4514028672968635,-50.4310929309115],"rgb":[0.733333333333333282,0.133333333333333331,0.6],"xyz":[0.268142192669350465,0.140104015509440405,0.314301750909987909],"hpluv":[325.159464012784042,253.154489640486645,44.2478449340908639],"hsluv":[325.159464012784042,90.7199745934293844,44.2478449340908639]},"#bb22aa":{"lch":[45.0991127685299062,91.4705260319517919,315.891475419905078],"luv":[45.0991127685299062,65.6779186933914758,-63.6652819727222195],"rgb":[0.733333333333333282,0.133333333333333331,0.66666666666666663],"xyz":[0.283199885634603,0.146127092695541499,0.39360560052698651],"hpluv":[315.891475419905078,257.366789521381691,45.0991127685299062],"hsluv":[315.891475419905078,91.5914304646717,45.0991127685299062]},"#bb22bb":{"lch":[46.0399667792549678,96.9048462314552,307.715012949243658],"luv":[46.0399667792549678,59.2800221375787615,-76.6578645574617497],"rgb":[0.733333333333333282,0.133333333333333331,0.733333333333333282],"xyz":[0.30033747774193964,0.152982129538476258,0.483863585625628256],"hpluv":[307.715012949243658,267.0851991180906,46.0399667792549678],"hsluv":[307.715012949243658,92.4033444706684,46.0399667792549678]},"#bb22cc":{"lch":[47.066072507765945,104.009692587178989,300.837938637053412],"luv":[47.066072507765945,53.3165662395356,-89.3048706202785496],"rgb":[0.733333333333333282,0.133333333333333331,0.8],"xyz":[0.319629853185661394,0.16069907971596506,0.585470096295898412],"hpluv":[300.837938637053412,280.417543020287,47.066072507765945],"hsluv":[300.837938637053412,93.1481326309998,47.066072507765945]},"#bb22dd":{"lch":[48.1725242595717589,112.247547842848149,295.20893392435471],"luv":[48.1725242595717589,47.808517424121824,-101.557164486017044],"rgb":[0.733333333333333282,0.133333333333333331,0.866666666666666696],"xyz":[0.341148178736294938,0.169306409936218594,0.69879994419590441],"hpluv":[295.20893392435471,295.676483579310798,48.1725242595717589],"hsluv":[295.20893392435471,93.8235497257627316,48.1725242595717589]},"#bb22ee":{"lch":[49.3540469689012724,121.194036197623419,290.655339197387],"luv":[49.3540469689012724,42.7506603945962169,-113.403595382583688],"rgb":[0.733333333333333282,0.133333333333333331,0.933333333333333348],"xyz":[0.364960359002469703,0.178831282042688611,0.824210760264427633],"hpluv":[290.655339197387,311.600255956968681,49.3540469689012724],"hsluv":[290.655339197387,94.4310255689598,49.3540469689012724]},"#bb22ff":{"lch":[50.6051737457033397,130.547024148317973,286.97844412333734],"luv":[50.6051737457033397,38.1212848334983647,-124.85709093449519],"rgb":[0.733333333333333282,0.133333333333333331,1],"xyz":[0.391131407412301069,0.189299701406621335,0.962044948556209478],"hpluv":[286.97844412333734,327.349274436557835,50.6051737457033397],"hsluv":[286.97844412333734,99.9999999999991616,50.6051737457033397]},"#993300":{"lch":[36.2545465004255476,86.9834057059747749,20.3835344027483316],"luv":[36.2545465004255476,81.5366895093473,30.2965531383769893],"rgb":[0.6,0.2,0],"xyz":[0.14320350651930705,0.0914109623935066423,0.0101036853819406816],"hpluv":[20.3835344027483316,304.448092478673459,36.2545465004255476],"hsluv":[20.3835344027483316,100.00000000000226,36.2545465004255476]},"#993311":{"lch":[36.3315413581227133,85.0112276295678839,19.0571063974297203],"luv":[36.3315413581227133,80.3520694714869279,27.7570487396543],"rgb":[0.6,0.2,0.0666666666666666657],"xyz":[0.144215172018944182,0.0918156285933615,0.0154317903466963131],"hpluv":[19.0571063974297203,296.914762557758195,36.3315413581227133],"hsluv":[19.0571063974297203,93.1288353931581,36.3315413581227133]},"#993322":{"lch":[36.4736730302835852,81.6150828115545863,16.5278497598068661],"luv":[36.4736730302835852,78.2428757472059573,23.217970134019108],"rgb":[0.6,0.2,0.133333333333333331],"xyz":[0.146090530157421183,0.0925657718487523096,0.0253086765426755109],"hpluv":[16.5278497598068661,283.942401799749632,36.4736730302835852],"hsluv":[16.5278497598068661,80.9121244795507124,36.4736730302835852]},"#993333":{"lch":[36.7060271438600836,76.7221326388105638,12.1770506300618369],"luv":[36.7060271438600836,74.9959199734098121,16.1832513417159589],"rgb":[0.6,0.2,0.2],"xyz":[0.149178280889878945,0.0938008721417354224,0.0415708304002866541],"hpluv":[12.1770506300618369,265.229979343802,36.7060271438600836],"hsluv":[12.1770506300618369,62.1516051360361459,36.7060271438600836]},"#993344":{"lch":[37.0379214664673668,71.077614272095758,5.55118145677439934],"luv":[37.0379214664673668,70.7442733159460744,6.87568495580995354],"rgb":[0.6,0.2,0.266666666666666663],"xyz":[0.153636276134097804,0.095584070239423,0.0650496053531732926],"hpluv":[5.55118145677439934,243.514912685509444,37.0379214664673668],"hsluv":[5.55118145677439934,64.3097526797848644,37.0379214664673668]},"#993355":{"lch":[37.4754277574064858,65.8722356173568073,356.298722520573506],"luv":[37.4754277574064858,65.7348379379961614,-4.25235305377523254],"rgb":[0.6,0.2,0.333333333333333315],"xyz":[0.15959869017345979,0.0979690358551678353,0.0964516526271472],"hpluv":[356.298722520573506,223.046355214908289,37.4754277574064858],"hsluv":[356.298722520573506,66.8387430740197885,37.4754277574064858]},"#993366":{"lch":[38.0218512407041942,62.5198646461221941,344.559385799457459],"luv":[38.0218512407041942,60.2633303059628602,-16.6452544529622166],"rgb":[0.6,0.2,0.4],"xyz":[0.167183685946967975,0.101003034164571154,0.136399297034291156],"hpluv":[344.559385799457459,208.652742449272864,38.0218512407041942],"hsluv":[344.559385799457459,69.5808124884664778,38.0218512407041942]},"#993377":{"lch":[38.6780657603296234,62.1964572713534949,331.414072321130675],"luv":[38.6780657603296234,54.6147414507713478,-29.7595247504508862],"rgb":[0.6,0.2,0.466666666666666674],"xyz":[0.17649769896716988,0.104728639372651963,0.185453098940689065],"hpluv":[331.414072321130675,204.051704505442274,38.6780657603296234],"hsluv":[331.414072321130675,72.3848063102254571,38.6780657603296234]},"#993388":{"lch":[39.4428302118465908,65.3028355433768155,318.6521895607018],"luv":[39.4428302118465908,49.0236963230770257,-43.1409031990296086],"rgb":[0.6,0.2,0.533333333333333326],"xyz":[0.187638116069113736,0.109184806213429561,0.244125962344261233],"hpluv":[318.6521895607018,210.08899125401652,39.4428302118465908],"hsluv":[318.6521895607018,75.1271370389489306,39.4428302118465908]},"#993399":{"lch":[40.3131218316236897,71.3679900272828149,307.715012949243942],"luv":[40.3131218316236897,43.6582502656979656,-56.4565955781255226],"rgb":[0.6,0.2,0.6],"xyz":[0.200695080178186436,0.114407591857058719,0.31289263998537914],"hpluv":[307.715012949243942,224.64479534599792,40.3131218316236897],"hsluv":[307.715012949243942,77.7202573427554313,40.3131218316236897]},"#9933aa":{"lch":[41.2844862133256925,79.5040030135899372,299.063916375798101],"luv":[41.2844862133256925,38.6218522191785354,-69.4927264276258825],"rgb":[0.6,0.2,0.66666666666666663],"xyz":[0.215752773143439,0.120430669043159827,0.39219648960237774],"hpluv":[299.063916375798101,244.366370382710016,41.2844862133256925],"hsluv":[299.063916375798101,80.1114582016200814,41.2844862133256925]},"#9933bb":{"lch":[42.3513893410192637,88.8787943355742,292.467029257400327],"luv":[42.3513893410192637,33.9651845170614,-82.1328577566084],"rgb":[0.6,0.2,0.733333333333333282],"xyz":[0.232890365250775611,0.127285705886094586,0.482454474701019487],"hpluv":[292.467029257400327,266.299173904300574,42.3513893410192637],"hsluv":[292.467029257400327,82.2764131802073848,42.3513893410192637]},"#9933cc":{"lch":[43.5075532005759911,98.8962106119506785,287.477062230467],"luv":[43.5075532005759911,29.700902070050418,-94.3308904316533],"rgb":[0.6,0.2,0.8],"xyz":[0.252182740694497365,0.135002656063583387,0.584060985371289698],"hpluv":[287.477062230467,288.439223502221068,43.5075532005759911],"hsluv":[287.477062230467,84.2111914011780129,43.5075532005759911]},"#9933dd":{"lch":[44.7462588110156716,109.182503226938962,283.677602435208257],"luv":[44.7462588110156716,25.8171133061496079,-106.086265234656878],"rgb":[0.6,0.2,0.866666666666666696],"xyz":[0.273701066245130908,0.143609986283836921,0.697390833271295696],"hpluv":[283.677602435208257,309.624731809924413,44.7462588110156716],"hsluv":[283.677602435208257,85.9249592908513478,44.7462588110156716]},"#9933ee":{"lch":[46.0606056636097208,119.52114969179982,280.747238708189116],"luv":[46.0606056636097208,22.2879081330132465,-117.42467532296601],"rgb":[0.6,0.2,0.933333333333333348],"xyz":[0.297513246511305618,0.153134858390306938,0.822801649339818919],"hpluv":[280.747238708189116,329.271729063034456,46.0606056636097208],"hsluv":[280.747238708189116,90.0471632149093324,46.0606056636097208]},"#9933ff":{"lch":[47.4437223771408512,129.794782591236896,278.453521985212944],"luv":[47.4437223771408512,19.0807517890999456,-128.38461940228359],"rgb":[0.6,0.2,1],"xyz":[0.323684294921137039,0.163603277754239662,0.960635837631600764],"hpluv":[278.453521985212944,347.150508646733101,47.4437223771408512],"hsluv":[278.453521985212944,99.999999999999261,47.4437223771408512]},"#bb3300":{"lch":[42.6640590509798585,114.303280915030754,17.3320761189885637],"luv":[42.6640590509798585,109.113245500432,34.0520143942012652],"rgb":[0.733333333333333282,0.2,0],"xyz":[0.216768341099481898,0.129342830223910105,0.0135520370028863052],"hpluv":[17.3320761189885637,339.966286272656077,42.6640590509798585],"hsluv":[17.3320761189885637,100.000000000002302,42.6640590509798585]},"#bb3311":{"lch":[42.7251747888925806,112.6335820513806,16.4819551739351198],"luv":[42.7251747888925806,108.005370801027979,31.9556518296457135],"rgb":[0.733333333333333282,0.2,0.0666666666666666657],"xyz":[0.21778000659911903,0.129747496423764958,0.0188801419676419349],"hpluv":[16.4819551739351198,334.52099084556113,42.7251747888925806],"hsluv":[16.4819551739351198,95.1490253673008368,42.7251747888925806]},"#bb3322":{"lch":[42.8381318005571785,109.688338781622747,14.8808580240480524],"luv":[42.8381318005571785,106.009603708482885,28.1690536980292627],"rgb":[0.733333333333333282,0.2,0.133333333333333331],"xyz":[0.219655364737596032,0.130497639679155786,0.0287570281636211345],"hpluv":[14.8808580240480524,324.914627119009424,42.8381318005571785],"hsluv":[14.8808580240480524,86.4181297836030211,42.8381318005571785]},"#bb3333":{"lch":[43.023174549414108,105.246046554892928,12.1770506300618351],"luv":[43.023174549414108,102.878058957341324,22.1998941575065203],"rgb":[0.733333333333333282,0.2,0.2],"xyz":[0.222743115470053765,0.131732739972138885,0.0450191820212322777],"hpluv":[12.1770506300618351,310.414975564112126,43.023174549414108],"hsluv":[12.1770506300618351,72.7398502888125762,43.023174549414108]},"#bb3344":{"lch":[43.2883038991094082,99.6704509181560496,8.14070356751482116],"luv":[43.2883038991094082,98.6661026897846085,14.1137863891102171],"rgb":[0.733333333333333282,0.2,0.266666666666666663],"xyz":[0.227201110714272653,0.133515938069826479,0.0684979569741189231],"hpluv":[8.14070356751482116,292.169703441320848,43.2883038991094082],"hsluv":[8.14070356751482116,73.8775464962187556,43.2883038991094082]},"#bb3355":{"lch":[43.6392404977582515,93.6285749325397632,2.54995992142812078],"luv":[43.6392404977582515,93.5358645919991289,4.16558266337591299],"rgb":[0.733333333333333282,0.2,0.333333333333333315],"xyz":[0.233163524753634666,0.135900903685571312,0.0999000042480928246],"hpluv":[2.54995992142812078,272.251672456619758,43.6392404977582515],"hsluv":[2.54995992142812078,75.2585830443305781,43.6392404977582515]},"#bb3366":{"lch":[44.0797950159491521,88.0182600678664784,355.263953050872033],"luv":[44.0797950159491521,87.7177339493983794,-7.26727295188107547],"rgb":[0.733333333333333282,0.2,0.4],"xyz":[0.240748520527142823,0.138934901994974602,0.1398476486552368],"hpluv":[355.263953050872033,253.380121177946961,44.0797950159491521],"hsluv":[355.263953050872033,76.8177075569623753,44.0797950159491521]},"#bb3377":{"lch":[44.6120878205181057,83.829516929164356,346.367941021132197],"luv":[44.6120878205181057,81.4679789337245239,-19.757437005625782],"rgb":[0.733333333333333282,0.2,0.466666666666666674],"xyz":[0.250062533547344756,0.142660507203055426,0.188901450561634709],"hpluv":[346.367941021132197,238.442541154787421,44.6120878205181057],"hsluv":[346.367941021132197,78.4827471040858597,44.6120878205181057]},"#bb3388":{"lch":[45.2367248685103078,81.924239827592,336.329010851829594],"luv":[45.2367248685103078,75.03162551729379,-32.8912791414593499],"rgb":[0.733333333333333282,0.2,0.533333333333333326],"xyz":[0.261202950649288557,0.147116674043833023,0.247574313965206849],"hpluv":[336.329010851829594,229.805591899252,45.2367248685103078],"hsluv":[336.329010851829594,80.18501002925629,45.2367248685103078]},"#bb3399":{"lch":[45.9529692994627226,82.7837935230449347,325.982908927834501],"luv":[45.9529692994627226,68.6170634488305495,-46.3125800806357404],"rgb":[0.733333333333333282,0.2,0.6],"xyz":[0.274259914758361312,0.152339459687462181,0.316340991606324784],"hpluv":[325.982908927834501,228.597286714525296,45.9529692994627226],"hsluv":[325.982908927834501,81.8663863744617402,45.9529692994627226]},"#bb33aa":{"lch":[46.7589216358443664,86.3774619636168524,316.238480868355282],"luv":[46.7589216358443664,62.3839556422166126,-59.7436859735489136],"rgb":[0.733333333333333282,0.2,0.66666666666666663],"xyz":[0.289317607723613812,0.158362536873563275,0.395644841223323385],"hpluv":[316.238480868355282,234.409537876970433,46.7589216358443664],"hsluv":[316.238480868355282,83.4827024616804181,46.7589216358443664]},"#bb33bb":{"lch":[47.6517090930198108,92.2657594707273461,307.715012949243828],"luv":[47.6517090930198108,56.4421334605023191,-72.9880534138084585],"rgb":[0.733333333333333282,0.2,0.733333333333333282],"xyz":[0.306455199830950487,0.165217573716498034,0.485902826321965131],"hpluv":[307.715012949243828,245.697877980233102,47.6517090930198108],"hsluv":[307.715012949243828,85.0039827354176,47.6517090930198108]},"#bb33cc":{"lch":[48.6276786348411179,99.8443429984049402,300.621719827817344],"luv":[48.6276786348411179,50.8574804969275078,-85.9209491700817551],"rgb":[0.733333333333333282,0.2,0.8],"xyz":[0.325747575274672241,0.172934523893986836,0.587509336992235287],"hpluv":[300.621719827817344,260.542905615006589,48.6276786348411179],"hsluv":[300.621719827817344,86.4127454729900535,48.6276786348411179]},"#bb33dd":{"lch":[49.6825862492002273,108.545865187730342,294.87630802524211],"luv":[49.6825862492002273,45.6609809337446322,-98.4747666639588459],"rgb":[0.733333333333333282,0.2,0.866666666666666696],"xyz":[0.347265900825305729,0.18154185411424037,0.700839184892241285],"hpluv":[294.87630802524211,277.235228758227834,49.6825862492002273],"hsluv":[294.87630802524211,87.70141038259,49.6825862492002273]},"#bb33ee":{"lch":[50.8117750205940695,117.927813495206621,290.271422146528892],"luv":[50.8117750205940695,40.8581913283156268,-110.623584271795281],"rgb":[0.733333333333333282,0.2,0.933333333333333348],"xyz":[0.371078081091480494,0.191066726220710414,0.826250000960764508],"hpluv":[290.271422146528892,294.504005794210514,50.8117750205940695],"hsluv":[290.271422146528892,88.8695912604113687,50.8117750205940695]},"#bb33ff":{"lch":[52.0103359867018611,127.679308171663493,286.581788346289272],"luv":[52.0103359867018611,36.4375993761859931,-122.36955130625914],"rgb":[0.733333333333333282,0.2,1],"xyz":[0.39724912950131186,0.201535145584643111,0.964084189252546353],"hpluv":[286.581788346289272,311.508705442628695,52.0103359867018611],"hsluv":[286.581788346289272,99.9999999999991616,52.0103359867018611]},"#994400":{"lch":[39.4244247356725168,77.6708634712958315,27.0445710144404678],"luv":[39.4244247356725168,69.1777945884316097,35.3156589667733627],"rgb":[0.6,0.266666666666666663,0],"xyz":[0.152036077002273062,0.109076103359438958,0.0130478755429292749],"hpluv":[27.0445710144404678,249.995444431237956,39.4244247356725168],"hsluv":[27.0445710144404678,100.000000000002302,39.4244247356725168]},"#994411":{"lch":[39.4928806474909351,75.8240556098730849,25.7566327743493559],"luv":[39.4928806474909351,68.2907795083206395,32.9493071744317447],"rgb":[0.6,0.266666666666666663,0.0666666666666666657],"xyz":[0.153047742501910194,0.109480769559293811,0.0183759805076849081],"hpluv":[25.7566327743493559,243.628181561178451,39.4928806474909351],"hsluv":[25.7566327743493559,94.1783894720599,39.4928806474909351]},"#994422":{"lch":[39.6193348047394807,72.6128884539244268,23.2788782073808527],"luv":[39.6193348047394807,66.7016282141236161,28.6971141964989123],"rgb":[0.6,0.266666666666666663,0.133333333333333331],"xyz":[0.154923100640387196,0.110230912814684626,0.0282528667036641],"hpluv":[23.2788782073808527,232.565805292122405,39.6193348047394807],"hsluv":[23.2788782073808527,83.7619004180350402,39.6193348047394807]},"#994433":{"lch":[39.8262957210095,67.9099451463512764,18.9473520481579776],"luv":[39.8262957210095,64.2304033034813671,22.0503047882012062],"rgb":[0.6,0.266666666666666663,0.2],"xyz":[0.158010851372844929,0.111466013107667739,0.0445150205612752509],"hpluv":[18.9473520481579776,216.372863201479333,39.8262957210095],"hsluv":[18.9473520481579776,67.5996848307310358,39.8262957210095]},"#994444":{"lch":[40.1224193460439267,62.3513134554678956,12.1770506300619097],"luv":[40.1224193460439267,60.9484376060972082,13.1519672672071142],"rgb":[0.6,0.266666666666666663,0.266666666666666663],"xyz":[0.162468846617063817,0.113249211205355318,0.0679937955141618894],"hpluv":[12.1770506300619097,197.195872414250289,40.1224193460439267],"hsluv":[12.1770506300619097,46.2091051210312429,40.1224193460439267]},"#994455":{"lch":[40.5136546800823041,57.0624194645929776,2.37288379618767387],"luv":[40.5136546800823041,57.0134905267935324,2.36254377830001205],"rgb":[0.6,0.266666666666666663,0.333333333333333315],"xyz":[0.16843126065642583,0.115634176821100151,0.0993958427881357909],"hpluv":[2.37288379618767387,178.726144329621945,40.5136546800823041],"hsluv":[2.37288379618767387,49.5312591923758063,40.5136546800823041]},"#994466":{"lch":[41.0036603670202382,53.5416261730848646,349.413399835018254],"luv":[41.0036603670202382,52.6302589877717111,-9.83674601372026558],"rgb":[0.6,0.266666666666666663,0.4],"xyz":[0.176016256429934,0.11866817513050347,0.139343487195279753],"hpluv":[349.413399835018254,165.694562401887765,41.0036603670202382],"hsluv":[349.413399835018254,53.2076295784804643,41.0036603670202382]},"#994477":{"lch":[41.594070304433572,53.2098960104776424,334.460192523955527],"luv":[41.594070304433572,48.0105420863306946,-22.9408125841809181],"rgb":[0.6,0.266666666666666663,0.466666666666666674],"xyz":[0.18533026945013592,0.122393780338584279,0.188397289101677662],"hpluv":[334.460192523955527,162.330570569563577,41.594070304433572],"hsluv":[334.460192523955527,57.0495308436177666,41.594070304433572]},"#994488":{"lch":[42.2847251453823887,56.6612659292255287,319.901700116735],"luv":[42.2847251453823887,43.3424978513170416,-36.4955742071691631],"rgb":[0.6,0.266666666666666663,0.533333333333333326],"xyz":[0.196470686552079721,0.126849947179361877,0.247070152505249829],"hpluv":[319.901700116735,170.036472949794188,42.2847251453823887],"hsluv":[319.901700116735,60.8903164523640683,42.2847251453823887]},"#994499":{"lch":[43.0739091348830314,63.3829857303906,307.715012949244226],"luv":[43.0739091348830314,38.7735489334465555,-50.1399519665159232],"rgb":[0.6,0.266666666666666663,0.6],"xyz":[0.209527650661152448,0.132072732822991035,0.315836830146367764],"hpluv":[307.715012949244226,186.722963823125951,43.0739091348830314],"hsluv":[307.715012949244226,64.600458594127474,43.0739091348830314]},"#9944aa":{"lch":[43.9586008361636686,72.3252063731545,298.405725418599673],"luv":[43.9586008361636686,34.4059763632637896,-63.6173267861038099],"rgb":[0.6,0.266666666666666663,0.66666666666666663],"xyz":[0.224585343626404976,0.138095810009092129,0.395140679763366365],"hpluv":[298.405725418599673,208.77819920337123,43.9586008361636686],"hsluv":[298.405725418599673,68.0913106207235,43.9586008361636686]},"#9944bb":{"lch":[44.9347323991438827,82.5300732915554676,291.540124858279853],"luv":[44.9347323991438827,30.3011407548278626,-76.7662286846607316],"rgb":[0.6,0.266666666666666663,0.733333333333333282],"xyz":[0.241722935733741651,0.144950846852026888,0.485398664862008111],"hpluv":[291.540124858279853,233.060888419388505,44.9347323991438827],"hsluv":[291.540124858279853,71.3111773355981882,44.9347323991438827]},"#9944cc":{"lch":[45.9974464532923903,93.3382836250318206,286.486143775676851],"luv":[45.9974464532923903,26.4878609436744341,-89.5009967134190561],"rgb":[0.6,0.266666666666666663,0.8],"xyz":[0.261015311177463349,0.152667797029515689,0.587005175532278267],"hpluv":[286.486143775676851,257.492992496327645,45.9974464532923903],"hsluv":[286.486143775676851,74.2376853125076792,45.9974464532923903]},"#9944dd":{"lch":[47.1413389271288139,104.350309752399141,282.717215233582351],"luv":[47.1413389271288139,22.9716047676972792,-101.790434323753402],"rgb":[0.6,0.266666666666666663,0.866666666666666696],"xyz":[0.282533636728096949,0.161275127249769223,0.700335023432284265],"hpluv":[282.717215233582351,280.886686990529654,47.1413389271288139],"hsluv":[282.717215233582351,78.691216526215527,47.1413389271288139]},"#9944ee":{"lch":[48.3606780479664593,115.341161543855208,279.855683836472622],"luv":[48.3606780479664593,19.7426125181249787,-113.638958096441911],"rgb":[0.6,0.266666666666666663,0.933333333333333348],"xyz":[0.306345816994271658,0.170799999356239268,0.825745839500807488],"hpluv":[279.855683836472622,302.643440789384783,48.3606780479664593],"hsluv":[279.855683836472622,89.2619995530309325,48.3606780479664593]},"#9944ff":{"lch":[49.6495929972458185,126.19285787586071,277.642335930208503],"luv":[49.6495929972458185,16.7822322716138856,-125.071955525044785],"rgb":[0.6,0.266666666666666663,1],"xyz":[0.332516865404103079,0.181268418720171964,0.963580027792589333],"hpluv":[277.642335930208503,322.521305960549284,49.6495929972458185],"hsluv":[277.642335930208503,99.9999999999991616,49.6495929972458185]},"#bb4400":{"lch":[45.2216387767487547,104.837609625168909,21.4216552556228201],"luv":[45.2216387767487547,97.5952013308911,38.2896992558330354],"rgb":[0.733333333333333282,0.266666666666666663,0],"xyz":[0.225600911582447911,0.147007971189842435,0.0164962271638749],"hpluv":[21.4216552556228201,294.177965476355098,45.2216387767487547],"hsluv":[21.4216552556228201,100.000000000002373,45.2216387767487547]},"#bb4411":{"lch":[45.2777618800582076,103.283777149094803,20.576768268141489],"luv":[45.2777618800582076,96.6944911384892123,36.3003306548646947],"rgb":[0.733333333333333282,0.266666666666666663,0.0666666666666666657],"xyz":[0.226612577082085043,0.147412637389697287,0.0218243321286305317],"hpluv":[20.576768268141489,289.458620037032802,45.2777618800582076],"hsluv":[20.576768268141489,95.6967439910137614,45.2777618800582076]},"#bb4422":{"lch":[45.3815280810129238,100.53232916519147,18.9799525675269258],"luv":[45.3815280810129238,95.0666309197234,32.6968636561903381],"rgb":[0.733333333333333282,0.266666666666666663,0.133333333333333331],"xyz":[0.228487935220562044,0.148162780645088116,0.0317012183246097243],"hpluv":[18.9799525675269258,281.103307599105051,45.3815280810129238],"hsluv":[18.9799525675269258,87.925891065222288,45.3815280810129238]},"#bb4433":{"lch":[45.5516172521931111,96.3559005693685862,16.2666991179303722],"luv":[45.5516172521931111,92.4986058403436147,26.9901369416087924],"rgb":[0.733333333333333282,0.266666666666666663,0.2],"xyz":[0.231575685953019805,0.149397880938071215,0.0479633721822208675],"hpluv":[16.2666991179303722,268.419362556396,45.5516172521931111],"hsluv":[16.2666991179303722,75.6846484949249572,45.5516172521931111]},"#bb4444":{"lch":[45.7955406359936816,91.066890863790789,12.177050630061844],"luv":[45.7955406359936816,89.0179277419259734,19.2090382927107299],"rgb":[0.733333333333333282,0.266666666666666663,0.266666666666666663],"xyz":[0.236033681197238665,0.151181079035758809,0.0714421471351075],"hpluv":[12.177050630061844,252.334507458167678,45.7955406359936816],"hsluv":[12.177050630061844,59.1297963696904461,45.7955406359936816]},"#bb4455":{"lch":[46.1187996938414813,85.2741675307746,6.43569277192082279],"luv":[46.1187996938414813,84.7367941199702273,9.55820957796975],"rgb":[0.733333333333333282,0.266666666666666663,0.333333333333333315],"xyz":[0.24199609523660065,0.153566044651503641,0.102844194409081421],"hpluv":[6.43569277192082279,234.627449284537505,46.1187996938414813],"hsluv":[6.43569277192082279,61.0765315010866274,46.1187996938414813]},"#bb4466":{"lch":[46.5252276318027427,79.8426568240615637,358.82639812637143],"luv":[46.5252276318027427,79.8259079304732779,-1.63532009113408461],"rgb":[0.733333333333333282,0.266666666666666663,0.4],"xyz":[0.249581091010108835,0.156600042960906932,0.142791838816225369],"hpluv":[358.82639812637143,217.763856882437722,46.5252276318027427],"hsluv":[358.82639812637143,63.3003300169989842,46.5252276318027427]},"#bb4477":{"lch":[47.0171837667790697,75.785442181693,349.367581794189107],"luv":[47.0171837667790697,74.484290362097866,-13.9829802234512588],"rgb":[0.733333333333333282,0.266666666666666663,0.466666666666666674],"xyz":[0.258895104030310741,0.160325648168987756,0.191845640722623278],"hpluv":[349.367581794189107,204.535408840651428,47.0171837667790697],"hsluv":[349.367581794189107,65.7062458495858266,47.0171837667790697]},"#bb4488":{"lch":[47.5956997014540235,74.0450948660102,338.538246495536782],"luv":[47.5956997014540235,68.9109568360576219,-27.0916241974425098],"rgb":[0.733333333333333282,0.266666666666666663,0.533333333333333326],"xyz":[0.270035521132254597,0.164781815009765353,0.250518504126195474],"hpluv":[338.538246495536782,197.409434601059019,47.5956997014540235],"hsluv":[338.538246495536782,68.1997676790361,47.5956997014540235]},"#bb4499":{"lch":[48.2606154557730633,75.1911240047971,327.313188255720945],"luv":[48.2606154557730633,63.2834900243205496,-40.6067115074158309],"rgb":[0.733333333333333282,0.266666666666666663,0.6],"xyz":[0.283092485241327296,0.170004600653394511,0.319285181767313353],"hpluv":[327.313188255720945,197.702903480158483,48.2606154557730633],"hsluv":[327.313188255720945,70.6969578310621074,48.2606154557730633]},"#bb44aa":{"lch":[49.0107199856960278,79.2228796099941093,316.794363507436401],"luv":[49.0107199856960278,57.7456584584256944,-54.2374739723603838],"rgb":[0.733333333333333282,0.266666666666666663,0.66666666666666663],"xyz":[0.298150178206579852,0.176027677839495605,0.398589031384311954],"hpluv":[316.794363507436401,205.115683333718124,49.0107199856960278],"hsluv":[316.794363507436401,73.1302855273877128,49.0107199856960278]},"#bb44bb":{"lch":[49.8438993628519427,85.6636869410227746,307.715012949243942],"luv":[49.8438993628519427,52.4034189799077268,-67.7653963284049752],"rgb":[0.733333333333333282,0.266666666666666663,0.733333333333333282],"xyz":[0.315287770313916471,0.182882714682430364,0.4888470164829537],"hpluv":[307.715012949243942,218.084137693810391,49.8438993628519427],"hsluv":[307.715012949243942,75.450469608388417,49.8438993628519427]},"#bb44cc":{"lch":[50.757290285110841,93.8478600934752905,300.284565440631638],"luv":[50.757290285110841,47.3270085455435918,-81.0405769121528152],"rgb":[0.733333333333333282,0.266666666666666663,0.8],"xyz":[0.334580145757638225,0.190599664859919166,0.590453527153223856],"hpluv":[300.284565440631638,234.620130462749955,50.757290285110841],"hsluv":[300.284565440631638,77.6254237907312898,50.757290285110841]},"#bb44dd":{"lch":[51.7474340276366291,103.158361374368454,294.364201848969515],"luv":[51.7474340276366291,42.5564715489483518,-93.971241615445],"rgb":[0.733333333333333282,0.266666666666666663,0.866666666666666696],"xyz":[0.356098471308271769,0.1992069950801727,0.703783375053229854],"hpluv":[294.364201848969515,252.961799427415912,51.7474340276366291],"hsluv":[294.364201848969515,79.6375689955678467,51.7474340276366291]},"#bb44ee":{"lch":[52.8104252671910217,113.122924260907325,289.686672533024307],"luv":[52.8104252671910217,38.1084271425454304,-106.510768347901248],"rgb":[0.733333333333333282,0.266666666666666663,0.933333333333333348],"xyz":[0.379910651574446478,0.208731867186642744,0.829194191121753077],"hpluv":[289.686672533024307,271.813038246621943,52.8104252671910217],"hsluv":[289.686672533024307,87.7449679178180872,52.8104252671910217]},"#bb44ff":{"lch":[53.942050711908152,123.415863319803691,285.982908620336502],"luv":[53.942050711908152,33.9826318144238115,-118.645084406973112],"rgb":[0.733333333333333282,0.266666666666666663,1],"xyz":[0.4060816999842779,0.219200286550575441,0.967028379413534922],"hpluv":[285.982908620336502,290.323946696930363,53.942050711908152],"hsluv":[285.982908620336502,99.9999999999990621,53.942050711908152]},"#995500":{"lch":[43.167672396478018,69.2675138179999,36.3951762413548678],"luv":[43.167672396478018,55.7564526526882105,41.099956911356287],"rgb":[0.6,0.333333333333333315,0],"xyz":[0.163849333716619028,0.132702616788131222,0.0169856277810444857],"hpluv":[36.3951762413548678,203.615246511519132,43.167672396478018],"hsluv":[36.3951762413548678,100.000000000002288,43.167672396478018]},"#995511":{"lch":[43.2277537555276865,67.4837391190291385,35.2266717066771307],"luv":[43.2277537555276865,55.1258789529511333,38.9254738590266101],"rgb":[0.6,0.333333333333333315,0.0666666666666666657],"xyz":[0.16486099921625616,0.133107282987986075,0.0223137327458001189],"hpluv":[35.2266717066771307,198.096040704981476,43.2277537555276865],"hsluv":[35.2266717066771307,95.1659583326808303,43.2277537555276865]},"#995522":{"lch":[43.3388072781739,64.3407602415628475,32.9528815923873708],"luv":[43.3388072781739,53.9895016234129059,34.998101990218963],"rgb":[0.6,0.333333333333333315,0.133333333333333331],"xyz":[0.166736357354733161,0.133857426243376904,0.0321906189417793115],"hpluv":[32.9528815923873708,188.385971738918272,43.3388072781739],"hsluv":[32.9528815923873708,86.4646465379692302,43.3388072781739]},"#995533":{"lch":[43.5207548807750584,59.6262244551406582,28.8908620435756234],"luv":[43.5207548807750584,52.2052395636471,28.8079781462883915],"rgb":[0.6,0.333333333333333315,0.2],"xyz":[0.169824108087190895,0.13509252653636,0.0484527727993904617],"hpluv":[28.8908620435756234,173.852210644027934,43.5207548807750584],"hsluv":[28.8908620435756234,72.8304069554253601,43.5207548807750584]},"#995544":{"lch":[43.7814988718974831,53.8284560366537335,22.2989672577237812],"luv":[43.7814988718974831,49.8029788080235036,20.4246415179685634],"rgb":[0.6,0.333333333333333315,0.266666666666666663],"xyz":[0.174282103331409782,0.136875724634047596,0.0719315477522771],"hpluv":[22.2989672577237812,156.01294104827457,43.7814988718974831],"hsluv":[22.2989672577237812,54.5318604429391058,43.7814988718974831]},"#995555":{"lch":[44.1267187000120629,47.9518139182857226,12.1770506300620411],"luv":[44.1267187000120629,46.8729201797035,10.1146335514957979],"rgb":[0.6,0.333333333333333315,0.333333333333333315],"xyz":[0.180244517370771795,0.139260690249792429,0.103333595026251],"hpluv":[12.1770506300620411,137.893162706519348,44.1267187000120629],"hsluv":[12.1770506300620411,32.3126421104369754,44.1267187000120629]},"#995566":{"lch":[44.5602350881765048,43.578232165907,357.727809148728397],"luv":[44.5602350881765048,43.5439690351937116,-1.72773822316436432],"rgb":[0.6,0.333333333333333315,0.4],"xyz":[0.187829513144279953,0.14229468855919572,0.143281239433394963],"hpluv":[357.727809148728397,124.097051059849122,44.5602350881765048],"hsluv":[357.727809148728397,36.5660257696708157,44.5602350881765048]},"#995577":{"lch":[45.0842241078155226,42.5628566452735342,339.858530865537546],"luv":[45.0842241078155226,39.9599368331855729,-14.6560640723873874],"rgb":[0.6,0.333333333333333315,0.466666666666666674],"xyz":[0.197143526164481886,0.146020293767276543,0.192335041339792873],"hpluv":[339.858530865537546,119.796876557388956,45.0842241078155226],"hsluv":[339.858530865537546,41.1101378179314167,45.0842241078155226]},"#995588":{"lch":[45.699386409692309,45.957423726275,322.088602167082399],"luv":[45.699386409692309,36.2586549471185506,-28.2381787122006145],"rgb":[0.6,0.333333333333333315,0.533333333333333326],"xyz":[0.208283943266425686,0.150476460608054141,0.25100790474336504],"hpluv":[322.088602167082399,127.609977655436467,45.699386409692309],"hsluv":[322.088602167082399,45.7577454208568852,45.699386409692309]},"#995599":{"lch":[46.4051108942887964,53.2218555896971921,307.715012949244795],"luv":[46.4051108942887964,32.5576366947089113,-42.1018551285561102],"rgb":[0.6,0.333333333333333315,0.6],"xyz":[0.221340907375498414,0.155699246251683299,0.319774582384483],"hpluv":[307.715012949244795,145.533684272522947,46.4051108942887964],"hsluv":[307.715012949244795,50.3502223422482516,46.4051108942887964]},"#9955aa":{"lch":[47.1996461355186625,63.0010233462712037,297.353030705211779],"luv":[47.1996461355186625,28.9471952899390068,-55.9570266143899246],"rgb":[0.6,0.333333333333333315,0.66666666666666663],"xyz":[0.236398600340750942,0.161722323437784393,0.399078432001481576],"hpluv":[297.353030705211779,169.374563019623821,47.1996461355186625],"hsluv":[297.353030705211779,54.7667714505238337,47.1996461355186625]},"#9955bb":{"lch":[48.0802807126223541,74.1194144420538,290.114722102094788],"luv":[48.0802807126223541,25.4897394646759068,-69.5985688017783701],"rgb":[0.6,0.333333333333333315,0.733333333333333282],"xyz":[0.253536192448087616,0.168577360280719152,0.489336417100123322],"hpluv":[290.114722102094788,195.615971831826613,48.0802807126223541],"hsluv":[290.114722102094788,58.9252289891592866,48.0802807126223541]},"#9955cc":{"lch":[49.0435277691913,85.8237639836856658,285.007043429489613],"luv":[49.0435277691913,22.2230153813451068,-82.8966588692685491],"rgb":[0.6,0.333333333333333315,0.8],"xyz":[0.272828567891809315,0.176294310458207953,0.590942927770393478],"hpluv":[285.007043429489613,222.057364979540267,49.0435277691913],"hsluv":[285.007043429489613,65.256702758776143,49.0435277691913]},"#9955dd":{"lch":[50.0853068419578875,97.6800340866365104,281.315028513382344],"luv":[50.0853068419578875,19.1651498984824649,-95.7814496055220843],"rgb":[0.6,0.333333333333333315,0.866666666666666696],"xyz":[0.294346893442442914,0.184901640678461487,0.704272775670399476],"hpluv":[281.315028513382344,247.476970093373268,50.0853068419578875],"hsluv":[281.315028513382344,76.6956878028438638,50.0853068419578875]},"#9955ee":{"lch":[51.2011159126469266,109.450459224116145,278.575243894560685],"luv":[51.2011159126469266,16.3199513369978568,-108.226901520499666],"rgb":[0.6,0.333333333333333315,0.933333333333333348],"xyz":[0.318159073708617623,0.194426512784931532,0.829683591738922699],"hpluv":[278.575243894560685,271.254835109068836,51.2011159126469266],"hsluv":[278.575243894560685,88.2491190723243335,51.2011159126469266]},"#9955ff":{"lch":[52.3861878346365444,121.012399839465246,276.491711029928183],"luv":[52.3861878346365444,13.6815981187824764,-120.2364952409323],"rgb":[0.6,0.333333333333333315,1],"xyz":[0.344330122118449045,0.204894932148864228,0.967517780030704544],"hpluv":[276.491711029928183,293.124692446110771,52.3861878346365444],"hsluv":[276.491711029928183,99.9999999999991,52.3861878346365444]},"#bb5500":{"lch":[48.3398816318057811,94.9450628471467724,27.1627331553413143],"luv":[48.3398816318057811,84.4739036935134,43.344256295703957],"rgb":[0.733333333333333282,0.333333333333333315,0],"xyz":[0.237414168296793876,0.170634484618534699,0.0204339794019901093],"hpluv":[27.1627331553413143,249.233335779464397,48.3398816318057811],"hsluv":[27.1627331553413143,100.000000000002217,48.3398816318057811]},"#bb5511":{"lch":[48.3907029738951735,93.4795954244126364,26.3417432533787057],"luv":[48.3907029738951735,83.7729911103365907,41.4791600823755289],"rgb":[0.733333333333333282,0.333333333333333315,0.0666666666666666657],"xyz":[0.238425833796431,0.171039150818389551,0.0257620843667457425],"hpluv":[26.3417432533787057,245.128732426237889,48.3907029738951735],"hsluv":[26.3417432533787057,96.2613278044251786,48.3907029738951735]},"#bb5522":{"lch":[48.4847005727335869,90.8707197847641623,24.7826102649670759],"luv":[48.4847005727335869,82.5019575685759321,38.090874386840035],"rgb":[0.733333333333333282,0.333333333333333315,0.133333333333333331],"xyz":[0.240301191934908,0.17178929407378038,0.0356389705627249351],"hpluv":[24.7826102649670759,237.825586669453713,48.4847005727335869],"hsluv":[24.7826102649670759,89.48684037186257,48.4847005727335869]},"#bb5533":{"lch":[48.6388719159228629,86.8743588299812473,22.1104535643633149],"luv":[48.6388719159228629,80.4856161939384407,32.6989267102511363],"rgb":[0.733333333333333282,0.333333333333333315,0.2],"xyz":[0.243388942667365771,0.173024394366763479,0.0519011244203360783],"hpluv":[22.1104535643633149,226.64567974804504,48.6388719159228629],"hsluv":[22.1104535643633149,78.7542493880857393,48.6388719159228629]},"#bb5544":{"lch":[48.8601705631915,81.7431600256382751,18.0266646696809296],"luv":[48.8601705631915,77.730600917119915,25.2962031151029265],"rgb":[0.733333333333333282,0.333333333333333315,0.266666666666666663],"xyz":[0.24784693791158463,0.174807592464451073,0.0753798993732227168],"hpluv":[18.0266646696809296,212.293047020031764,48.8601705631915],"hsluv":[18.0266646696809296,64.1199207289341,48.8601705631915]},"#bb5555":{"lch":[49.1538097277392154,76.0172073873862075,12.1770506300619399],"luv":[49.1538097277392154,74.3068552156307,16.0345591439297159],"rgb":[0.733333333333333282,0.333333333333333315,0.333333333333333315],"xyz":[0.253809351950946616,0.177192558080195905,0.106781946647196632],"hpluv":[12.1770506300619399,196.242945408672853,49.1538097277392154],"hsluv":[12.1770506300619399,45.9858047870319879,49.1538097277392154]},"#bb5566":{"lch":[49.523574907380123,70.5220596563995,4.21567942747197],"luv":[49.523574907380123,70.3312550088346882,5.18415538569556134],"rgb":[0.733333333333333282,0.333333333333333315,0.4],"xyz":[0.261394347724454801,0.180226556389599196,0.14672959105434058],"hpluv":[4.21567942747197,180.697576197923894,49.523574907380123],"hsluv":[4.21567942747197,48.7291682320237527,49.523574907380123]},"#bb5577":{"lch":[49.971995559373525,66.3094111666939341,354.014227306533371],"luv":[49.971995559373525,65.9478803557508257,-6.91484532417379327],"rgb":[0.733333333333333282,0.333333333333333315,0.466666666666666674],"xyz":[0.270708360744656706,0.18395216159768002,0.195783392960738489],"hpluv":[354.014227306533371,168.378953180241098,49.971995559373525],"hsluv":[354.014227306533371,51.7390719561838495,49.971995559373525]},"#bb5588":{"lch":[50.5004659153875508,64.4571905510646275,342.016521446261379],"luv":[50.5004659153875508,61.308172080607541,-19.9006896832966476],"rgb":[0.733333333333333282,0.333333333333333315,0.533333333333333326],"xyz":[0.281848777846600562,0.188408328438457617,0.254456256364310685],"hpluv":[342.016521446261379,161.962814057843559,50.5004659153875508],"hsluv":[342.016521446261379,54.9055054808170055,50.5004659153875508]},"#bb5599":{"lch":[51.1093507584050286,65.6961991151429459,329.411862939203161],"luv":[51.1093507584050286,56.5544024759803,-33.4303774845774342],"rgb":[0.733333333333333282,0.333333333333333315,0.6],"xyz":[0.294905741955673262,0.193631114082086775,0.323222934005428564],"hpluv":[329.411862939203161,163.109481188372769,51.1093507584050286],"hsluv":[329.411862939203161,58.1255686218068561,51.1093507584050286]},"#bb55aa":{"lch":[51.7980911374347386,70.0901192661774246,317.660759061539352],"luv":[51.7980911374347386,51.8085124997667563,-47.2070212077450151],"rgb":[0.733333333333333282,0.333333333333333315,0.66666666666666663],"xyz":[0.309963434920925818,0.199654191268187869,0.402526783622427164],"hpluv":[317.660759061539352,171.704773930815691,51.7980911374347386],"hsluv":[317.660759061539352,61.3115173935257403,51.7980911374347386]},"#bb55bb":{"lch":[52.5653152299933737,77.1031380177621344,307.715012949244226],"luv":[52.5653152299933737,47.1666372355911179,-60.9934605025180332],"rgb":[0.733333333333333282,0.333333333333333315,0.733333333333333282],"xyz":[0.327101027028262437,0.206509228111122628,0.492784768721068911],"hpluv":[307.715012949244226,186.128169856082764,52.5653152299933737],"hsluv":[307.715012949244226,64.3946779967479,52.5653152299933737]},"#bb55cc":{"lch":[53.4089544864585,85.9678373228364308,299.780474196008072],"luv":[53.4089544864585,42.6983512805399883,-74.6144748148057175],"rgb":[0.733333333333333282,0.333333333333333315,0.8],"xyz":[0.346393402471984191,0.21422617828861143,0.594391279391339067],"hpluv":[299.780474196008072,204.249617293250537,53.4089544864585],"hsluv":[299.780474196008072,67.3259326792693855,53.4089544864585]},"#bb55dd":{"lch":[54.3263625650166944,95.9883710948233926,293.613183872979789],"luv":[54.3263625650166944,38.4490902963257213,-87.9513208588848698],"rgb":[0.733333333333333282,0.333333333333333315,0.866666666666666696],"xyz":[0.367911728022617734,0.222833508508864964,0.707721127291345065],"hpluv":[293.613183872979789,224.206046477737118,54.3263625650166944],"hsluv":[293.613183872979789,73.8407928406032283,54.3263625650166944]},"#bb55ee":{"lch":[55.314433433552054,106.647677925948784,288.842761327535072],"luv":[55.314433433552054,34.444226028074695,-100.932266893812525],"rgb":[0.733333333333333282,0.333333333333333315,0.933333333333333348],"xyz":[0.391723908288792444,0.232358380615335,0.833131943359868288],"hpluv":[288.842761327535072,244.653966901481454,55.314433433552054],"hsluv":[288.842761327535072,86.7715876359309135,55.314433433552054]},"#bb55ff":{"lch":[56.3697148536960526,117.598184211748716,285.129655441003138],"luv":[56.3697148536960526,30.6936185759692179,-113.521956944959783],"rgb":[0.733333333333333282,0.333333333333333315,1],"xyz":[0.417894956698623865,0.242826799979267705,0.970966131651650133],"hpluv":[285.129655441003138,264.724480425834031,56.3697148536960526],"hsluv":[285.129655441003138,99.9999999999989,56.3697148536960526]},"#996600":{"lch":[47.3343652017352454,63.4240894393546952,48.3260196362919672],"luv":[47.3343652017352454,42.1701199842588,47.3740023823666476],"rgb":[0.6,0.4,0],"xyz":[0.178877391422465504,0.162758732199824563,0.0219949803496598331],"hpluv":[48.3260196362919672,170.026654750900292,47.3343652017352454],"hsluv":[48.3260196362919672,100.000000000002288,47.3343652017352454]},"#996611":{"lch":[47.3868110627231189,61.667674323653,47.4017350737566616],"luv":[47.3868110627231189,41.7399921999205,45.3946594616449133],"rgb":[0.6,0.4,0.0666666666666666657],"xyz":[0.179889056922102636,0.163163398399679416,0.0273230853144154628],"hpluv":[47.4017350737566616,165.135107398016657,47.3868110627231189],"hsluv":[47.4017350737566616,96.0239926064661,47.3868110627231189]},"#996622":{"lch":[47.4838028017404099,58.5263777304533406,45.5834379771503322],"luv":[47.4838028017404099,40.9608465044279413,41.8036594557031336],"rgb":[0.6,0.4,0.133333333333333331],"xyz":[0.181764415060579637,0.163913541655070244,0.0371999715103946624],"hpluv":[45.5834379771503322,156.40314428015364,47.4838028017404099],"hsluv":[45.5834379771503322,88.8298219708016177,47.4838028017404099]},"#996633":{"lch":[47.642855645786625,53.6803525088045674,42.2629253198225712],"luv":[47.642855645786625,39.7270268335614887,36.1018501525199724],"rgb":[0.6,0.4,0.2],"xyz":[0.184852165793037371,0.165148641948053343,0.0534621253680058056],"hpluv":[42.2629253198225712,142.973945144987511,47.642855645786625],"hsluv":[42.2629253198225712,77.4596172761956865,47.642855645786625]},"#996644":{"lch":[47.8710980897590872,47.4159845831850149,36.6424092143452071],"luv":[47.8710980897590872,38.045445264132745,28.298757722676072],"rgb":[0.6,0.4,0.266666666666666663],"xyz":[0.189310161037256258,0.166931840045740937,0.0769409003208924441],"hpluv":[36.6424092143452071,125.687101185572914,47.8710980897590872],"hsluv":[36.6424092143452071,62.0095295256686185,47.8710980897590872]},"#996655":{"lch":[48.173837669734425,40.4765536471140521,27.3183313201514686],"luv":[48.173837669734425,35.9622216701857838,18.5760600691352664],"rgb":[0.6,0.4,0.333333333333333315],"xyz":[0.195272575076618271,0.16931680566148577,0.108342947594866346],"hpluv":[27.3183313201514686,106.618264590322553,48.173837669734425],"hsluv":[27.3183313201514686,42.9499413016611484,48.173837669734425]},"#996666":{"lch":[48.5548823199147819,34.3240193245421,12.1770506300621335],"luv":[48.5548823199147819,33.551744690774747,7.24007809326721219],"rgb":[0.6,0.4,0.4],"xyz":[0.202857570850126429,0.17235080397088906,0.148290592002010307],"hpluv":[12.1770506300621335,89.702502372613651,48.5548823199147819],"hsluv":[12.1770506300621335,21.0200766933302461,48.5548823199147819]},"#996677":{"lch":[49.0167186013709,31.3606600839303482,350.2076113500313],"luv":[49.0167186013709,30.9037509766054157,-5.33377694282222681],"rgb":[0.6,0.4,0.466666666666666674],"xyz":[0.212171583870328362,0.176076409178969884,0.197344393908408217],"hpluv":[350.2076113500313,81.185839798992177,49.0167186013709],"hsluv":[350.2076113500313,25.8881256225468483,49.0167186013709]},"#996688":{"lch":[49.5606396668562752,33.7929953796712823,326.289263208678278],"luv":[49.5606396668562752,28.1107077320421368,-18.7551232343109682],"rgb":[0.6,0.4,0.533333333333333326],"xyz":[0.223312000972272162,0.180532576019747482,0.256017257311980384],"hpluv":[326.289263208678278,86.5225105267045365,49.5606396668562752],"hsluv":[326.289263208678278,30.9767265160446463,49.5606396668562752]},"#996699":{"lch":[50.1868595811773304,41.2886932006772,307.715012949245818],"luv":[50.1868595811773304,25.2577114783499113,-32.6619686653465351],"rgb":[0.6,0.4,0.6],"xyz":[0.236368965081344889,0.185755361663376639,0.324783934953098319],"hpluv":[307.715012949245818,104.395179003902854,50.1868595811773304],"hsluv":[307.715012949245818,36.1175524455388413,50.1868595811773304]},"#9966aa":{"lch":[50.8946289106688141,51.8448774557822,295.617938374847199],"luv":[50.8946289106688141,22.4160699516755599,-46.7483810021979451],"rgb":[0.6,0.4,0.66666666666666663],"xyz":[0.251426658046597418,0.191778438849477734,0.40408778457009692],"hpluv":[295.617938374847199,129.262701065701,50.8946289106688141],"hsluv":[295.617938374847199,41.1705422178494445,50.8946289106688141]},"#9966bb":{"lch":[51.6823563026294,63.8712345518136,287.908782454232437],"luv":[51.6823563026294,19.6405628457828776,-60.776499523036378],"rgb":[0.6,0.4,0.733333333333333282],"xyz":[0.268564250153934092,0.198633475692412492,0.494345769668738666],"hpluv":[287.908782454232437,156.820318415219759,51.6823563026294],"hsluv":[287.908782454232437,49.349420166275209,51.6823563026294]},"#9966cc":{"lch":[52.5477355185796569,76.4825896496335389,282.819195018988751],"luv":[52.5477355185796569,16.9695880464031816,-74.5762670093482285],"rgb":[0.6,0.4,0.8],"xyz":[0.287856625597655791,0.206350425869901294,0.595952280339008822],"hpluv":[282.819195018988751,184.691924030055,52.5477355185796569],"hsluv":[282.819195018988751,61.7185051859638136,52.5477355185796569]},"#9966dd":{"lch":[53.4878747475352725,89.2117449852098758,279.306611445978092],"luv":[53.4878747475352725,14.4271177471338046,-88.0374563286358],"rgb":[0.6,0.4,0.866666666666666696],"xyz":[0.30937495114828939,0.214957756090154828,0.70928212823901482],"hpluv":[279.306611445978092,211.644028054176175,53.4878747475352725],"hsluv":[279.306611445978092,74.2596178074049362,53.4878747475352725]},"#9966ee":{"lch":[54.4994239962059339,101.810849438236403,276.783380903602506],"luv":[54.4994239962059339,12.0254847729914225,-101.098154183495325],"rgb":[0.6,0.4,0.933333333333333348],"xyz":[0.333187131414464099,0.224482628196624873,0.834692944307538],"hpluv":[276.783380903602506,237.050827216632513,54.4994239962059339],"hsluv":[276.783380903602506,86.9990828065156734,54.4994239962059339]},"#9966ff":{"lch":[55.5786963614876,114.151421142661491,274.908981870437117],"luv":[55.5786963614876,9.76829238934238475,-113.732701597586171],"rgb":[0.6,0.4,1],"xyz":[0.359358179824295521,0.234951047560557569,0.972527132599319888],"hpluv":[274.908981870437117,260.622732185953453,55.5786963614876],"hsluv":[274.908981870437117,99.999999999998991,55.5786963614876]},"#bb6600":{"lch":[51.9152024616159622,85.9194467179265899,34.7713476038742],"luv":[51.9152024616159622,70.5771984524152884,49.0001059480794936],"rgb":[0.733333333333333282,0.4,0],"xyz":[0.252442226002640324,0.200690600030228039,0.0254433319706054567],"hpluv":[34.7713476038742,210.008196913669821,51.9152024616159622],"hsluv":[34.7713476038742,100.000000000002217,51.9152024616159622]},"#bb6611":{"lch":[51.960819173128,84.5067938711160735,34.0102696578751846],"luv":[51.960819173128,70.0508360673827184,47.2681560528436],"rgb":[0.733333333333333282,0.4,0.0666666666666666657],"xyz":[0.253453891502277429,0.201095266230082892,0.0307714369353610864],"hpluv":[34.0102696578751846,206.373990798532162,51.960819173128],"hsluv":[34.0102696578751846,96.7960731817087492,51.960819173128]},"#bb6622":{"lch":[52.0452187907305586,81.9745670334704215,32.5563816919222901],"luv":[52.0452187907305586,69.0932729256005587,44.1129150788451909],"rgb":[0.733333333333333282,0.4,0.133333333333333331],"xyz":[0.255329249640754485,0.20184540948547372,0.040648323131340286],"hpluv":[32.5563816919222901,199.865401092535734,52.0452187907305586],"hsluv":[32.5563816919222901,90.9716633106406221,52.0452187907305586]},"#bb6633":{"lch":[52.1837271506259412,78.04817012610809,30.0375791414029081],"luv":[52.1837271506259412,67.5660884046363,39.0684086920722109],"rgb":[0.733333333333333282,0.4,0.2],"xyz":[0.258417000373212191,0.203080509778456819,0.0569104769889514292],"hpluv":[30.0375791414029081,189.787216830323956,52.1837271506259412],"hsluv":[30.0375791414029081,81.6941023093515639,52.1837271506259412]},"#bb6644":{"lch":[52.3827138306128859,72.9081368603095257,26.1184165145312406],"luv":[52.3827138306128859,65.4632041398932,32.0961886238895318],"rgb":[0.733333333333333282,0.4,0.266666666666666663],"xyz":[0.262874995617431106,0.204863707876144413,0.0803892519418380747],"hpluv":[26.1184165145312406,176.614896915735159,52.3827138306128859],"hsluv":[26.1184165145312406,68.9437006343278824,52.3827138306128859]},"#bb6655":{"lch":[52.6470547760809637,67.004522830646,20.3474245095699864],"luv":[52.6470547760809637,62.823537757634746,23.2982656731697979],"rgb":[0.733333333333333282,0.4,0.333333333333333315],"xyz":[0.268837409656793092,0.207248673491889246,0.111791299215811976],"hpluv":[20.3474245095699864,161.498824171429789,52.6470547760809637],"hsluv":[20.3474245095699864,52.9816895309479534,52.6470547760809637]},"#bb6666":{"lch":[52.9804174131186727,61.0960132663801261,12.1770506300620109],"luv":[52.9804174131186727,59.7213810933874498,12.8871826767560087],"rgb":[0.733333333333333282,0.4,0.4],"xyz":[0.276422405430301277,0.210282671801292537,0.151738943622955924],"hpluv":[12.1770506300620109,146.331162504643544,52.9804174131186727],"hsluv":[12.1770506300620109,34.2899270044314335,52.9804174131186727]},"#bb6677":{"lch":[53.3854132757716826,56.2661599102721226,1.17050216666979279],"luv":[53.3854132757716826,56.2544190111897535,1.14938799445880213],"rgb":[0.733333333333333282,0.4,0.466666666666666674],"xyz":[0.285736418450503182,0.21400827700937336,0.200792745529353833],"hpluv":[1.17050216666979279,133.74082367080041,53.3854132757716826],"hsluv":[1.17050216666979279,37.694842795415525,53.3854132757716826]},"#bb6688":{"lch":[53.8636991644475387,53.7950791600554297,347.554026547444039],"luv":[53.8636991644475387,52.5308766640911458,-11.5938578022448873],"rgb":[0.733333333333333282,0.4,0.533333333333333326],"xyz":[0.296876835552447,0.218464443850150958,0.259465608932926028],"hpluv":[347.554026547444039,126.731828674836166,53.8636991644475387],"hsluv":[347.554026547444039,41.3310399817098855,53.8636991644475387]},"#bb6699":{"lch":[54.4160596975863484,54.7145736516266723,332.78581188167891],"luv":[54.4160596975863484,48.6578429809048814,-25.0219680745716886],"rgb":[0.733333333333333282,0.4,0.6],"xyz":[0.309933799661519682,0.223687229493780115,0.328232286574043908],"hpluv":[332.78581188167891,127.589593839900076,54.4160596975863484],"hsluv":[332.78581188167891,45.0871489409768813,54.4160596975863484]},"#bb66aa":{"lch":[55.0424859024436,59.2427277394444332,319.03138367428437],"luv":[55.0424859024436,44.7323366642012274,-38.8422301956323963],"rgb":[0.733333333333333282,0.4,0.66666666666666663],"xyz":[0.324991492626772238,0.22971030667988121,0.407536136191042508],"hpluv":[319.03138367428437,136.57661144398341,55.0424859024436],"hsluv":[319.03138367428437,48.8627280546895548,55.0424859024436]},"#bb66bb":{"lch":[55.7422560614222,66.7541112543564168,307.715012949244738],"luv":[55.7422560614222,40.8357821803987235,-52.8067255477370452],"rgb":[0.733333333333333282,0.4,0.733333333333333282],"xyz":[0.342129084734108913,0.236565343522815968,0.497794121289684255],"hpluv":[307.715012949244738,151.961230908585406,55.7422560614222],"hsluv":[307.715012949244738,52.5739577191036176,55.7422560614222]},"#bb66cc":{"lch":[56.5140206008290704,76.3075420390205466,299.031845144425],"luv":[56.5140206008290704,37.0317190732607671,-66.7195080506142801],"rgb":[0.733333333333333282,0.4,0.8],"xyz":[0.361421460177830611,0.24428229370030477,0.599400631959954411],"hpluv":[299.031845144425,171.336773989457299,56.5140206008290704],"hsluv":[299.031845144425,57.7422914315118732,56.5140206008290704]},"#bb66dd":{"lch":[57.3558903641351208,87.0819801731049523,292.529347086481266],"luv":[57.3558903641351208,33.3660351201831276,-80.4361794917420809],"rgb":[0.733333333333333282,0.4,0.866666666666666696],"xyz":[0.38293978572846421,0.252889623920558304,0.712730479859960409],"hpluv":[292.529347086481266,192.659130793538424,57.3558903641351208],"hsluv":[292.529347086481266,71.4699790991907,57.3558903641351208]},"#bb66ee":{"lch":[58.2655263288606164,98.4965661150924916,287.652756970849339],"luv":[58.2655263288606164,29.8688319231142287,-93.8585447149780805],"rgb":[0.733333333333333282,0.4,0.933333333333333348],"xyz":[0.40675196599463892,0.262414496027028321,0.838141295928483632],"hpluv":[287.652756970849339,214.510592558062115,58.2655263288606164],"hsluv":[287.652756970849339,85.5420625539119186,58.2655263288606164]},"#bb66ff":{"lch":[59.2402283004695533,110.175409569553764,283.948158265715847],"luv":[59.2402283004695533,26.5571064878979755,-106.926801919861816],"rgb":[0.733333333333333282,0.4,1],"xyz":[0.432923014404470341,0.272882915390961045,0.975975484220265477],"hpluv":[283.948158265715847,235.997431668916079,59.2402283004695533],"hsluv":[283.948158265715847,99.9999999999988205,59.2402283004695533]},"#997700":{"lch":[51.799451349173637,61.2288227532233265,61.7368019650066202],"luv":[51.799451349173637,28.9932293289078338,53.9292257391759406],"rgb":[0.6,0.466666666666666674,0],"xyz":[0.197331129475883132,0.19966620830666032,0.028146226367465537],"hpluv":[61.7368019650066202,149.992683828924328,51.799451349173637],"hsluv":[61.7368019650066202,100.000000000002373,51.799451349173637]},"#997711":{"lch":[51.8452237949875752,59.5195003520895298,61.1595916745536812],"luv":[51.8452237949875752,28.7105152364728049,52.1371003894409952],"rgb":[0.6,0.466666666666666674,0.0666666666666666657],"xyz":[0.198342794975520265,0.200070874506515173,0.0334743313322211702],"hpluv":[61.1595916745536812,145.676617799321178,51.8452237949875752],"hsluv":[61.1595916745536812,96.7355174862457687,51.8452237949875752]},"#997722":{"lch":[51.9299107218419778,56.4237897442973448,60.0184197539949],"luv":[51.9299107218419778,28.1961842142201746,48.8735024820856836],"rgb":[0.6,0.466666666666666674,0.133333333333333331],"xyz":[0.200218153113997266,0.200821017761906,0.0433512175282003628],"hpluv":[60.0184197539949,137.874516690543771,51.9299107218419778],"hsluv":[60.0184197539949,90.8032063934702762,51.9299107218419778]},"#997733":{"lch":[52.0688882655341843,51.532107019520943,57.9108306747127841],"luv":[52.0688882655341843,27.375836028403171,43.6591531710973797],"rgb":[0.6,0.466666666666666674,0.2],"xyz":[0.203305903846455027,0.2020561180548891,0.0596133713858115061],"hpluv":[57.9108306747127841,125.585333003110208,52.0688882655341843],"hsluv":[57.9108306747127841,81.359583819486275,52.0688882655341843]},"#997744":{"lch":[52.2685439893789265,44.9234500117750244,54.2507061045172563],"luv":[52.2685439893789265,26.2460613351246792,36.4590266649196622],"rgb":[0.6,0.466666666666666674,0.266666666666666663],"xyz":[0.207763899090673887,0.203839316152576694,0.0830921463386981446],"hpluv":[54.2507061045172563,109.061640425204757,52.2685439893789265],"hsluv":[54.2507061045172563,68.3925961892813632,52.2685439893789265]},"#997755":{"lch":[52.5337646967731615,36.9638675487782962,47.8040559904272229],"luv":[52.5337646967731615,24.8274523779219614,27.3847605902560787],"rgb":[0.6,0.466666666666666674,0.333333333333333315],"xyz":[0.213726313130035872,0.206224281768321527,0.11449419361267206],"hpluv":[47.8040559904272229,89.2849392346346,52.5337646967731615],"hsluv":[47.8040559904272229,52.1784042692219217,52.5337646967731615]},"#997766":{"lch":[52.8682223623880958,28.5307109293219519,35.7342712802299047],"luv":[52.8682223623880958,23.1593577603421643,16.6627012894371447],"rgb":[0.6,0.466666666666666674,0.4],"xyz":[0.221311308903544057,0.209258280077724818,0.154441838019816],"hpluv":[35.7342712802299047,68.4789688439394695,52.8682223623880958],"hsluv":[35.7342712802299047,33.2180784313787072,52.8682223623880958]},"#997777":{"lch":[53.2745272921510349,21.7835186536615062,12.1770506300626185],"luv":[53.2745272921510349,21.2933995119794766,4.59486911213486],"rgb":[0.6,0.466666666666666674,0.466666666666666674],"xyz":[0.230625321923745963,0.212983885285805641,0.203495639926213917],"hpluv":[12.1770506300626185,51.8857087556556777,53.2745272921510349],"hsluv":[12.1770506300626185,12.1864056638809046,53.2745272921510349]},"#997788":{"lch":[53.7543298043441524,21.0694932264164443,336.259644884191403],"luv":[53.7543298043441524,19.28657717102978,-8.48242216845644492],"rgb":[0.6,0.466666666666666674,0.533333333333333326],"xyz":[0.241765739025689819,0.217440052126583239,0.262168503329786085],"hpluv":[336.259644884191403,49.7370433553737143,53.7543298043441524],"hsluv":[336.259644884191403,17.3594920402921318,53.7543298043441524]},"#997799":{"lch":[54.308403390094881,28.1087123643927,307.715012949247921],"luv":[54.308403390094881,17.1950646022419384,-22.235769923906151],"rgb":[0.6,0.466666666666666674,0.6],"xyz":[0.254822703134762518,0.222662837770212396,0.330935180970904],"hpluv":[307.715012949247921,65.67699031054849,54.308403390094881],"hsluv":[307.715012949247921,22.7222383700086681,54.308403390094881]},"#9977aa":{"lch":[54.9367240193748785,39.361724048309469,292.510155009375],"luv":[54.9367240193748785,15.0695247856183894,-36.3628208860492137],"rgb":[0.6,0.466666666666666674,0.66666666666666663],"xyz":[0.269880396100015074,0.228685914956313491,0.41023903058790262],"hpluv":[292.510155009375,90.9181689788077847,54.9367240193748785],"hsluv":[292.510155009375,30.8964586946041671,54.9367240193748785]},"#9977bb":{"lch":[55.6385517902762388,52.2405182414828104,284.355371582691191],"luv":[55.6385517902762388,12.9522722169503091,-50.6093903397058824],"rgb":[0.6,0.466666666666666674,0.733333333333333282],"xyz":[0.287017988207351693,0.235540951799248249,0.500497015686544366],"hpluv":[284.355371582691191,119.143673365147691,55.6385517902762388],"hsluv":[284.355371582691191,44.025050152294007,55.6385517902762388]},"#9977cc":{"lch":[56.4125166695819615,65.6830300518217172,279.531250686135081],"luv":[56.4125166695819615,10.8761592408186605,-64.7763042860340192],"rgb":[0.6,0.466666666666666674,0.8],"xyz":[0.306310363651073447,0.243257901976737051,0.602103526356814522],"hpluv":[279.531250686135081,147.746441920881637,56.4125166695819615],"hsluv":[279.531250686135081,57.5215558896316352,56.4125166695819615]},"#9977dd":{"lch":[57.256707620000924,79.2159287347205,276.425234899334782],"luv":[57.256707620000924,8.86478593594131858,-78.718351962006011],"rgb":[0.6,0.466666666666666674,0.866666666666666696],"xyz":[0.327828689201707,0.251865232196990585,0.71543337425682052],"hpluv":[276.425234899334782,175.559960004438778,57.256707620000924],"hsluv":[276.425234899334782,71.3413917340773764,57.256707620000924]},"#9977ee":{"lch":[58.1687631275758434,92.5981917117116211,274.294200356840065],"luv":[58.1687631275758434,6.93354781471817905,-92.3382424728774822],"rgb":[0.6,0.466666666666666674,0.933333333333333348],"xyz":[0.351640869467881756,0.261390104303460602,0.840844190325343743],"hpluv":[274.294200356840065,202.000294664132923,58.1687631275758434],"hsluv":[274.294200356840065,85.4864748016987903,58.1687631275758434]},"#9977ff":{"lch":[59.1459606243173,105.700835267318482,272.760722153075335],"luv":[59.1459606243173,5.0910859147335179,-105.578157875659116],"rgb":[0.6,0.466666666666666674,1],"xyz":[0.377811917877713122,0.271858523667393326,0.978678378617125588],"hpluv":[272.760722153075335,226.773684284234889,59.1459606243173],"hsluv":[272.760722153075335,99.9999999999988,59.1459606243173]},"#bb7700":{"lch":[55.8465021194210323,78.9426527823167703,44.2288975260652037],"luv":[55.8465021194210323,56.5670601566064,55.0645996403160751],"rgb":[0.733333333333333282,0.466666666666666674,0],"xyz":[0.270895964056058,0.237598076137063796,0.0315945779884111572],"hpluv":[44.2288975260652037,179.372171604304526,55.8465021194210323],"hsluv":[44.2288975260652037,100.000000000002402,55.8465021194210323]},"#bb7711":{"lch":[55.8872675460691113,77.5581898683241775,43.5811171927028127],"luv":[55.8872675460691113,56.1830827877517081,53.4671303149482782],"rgb":[0.733333333333333282,0.466666666666666674,0.0666666666666666657],"xyz":[0.271907629555695085,0.238002742336918649,0.0369226829531667869],"hpluv":[43.5811171927028127,176.097874689063588,55.8872675460691113],"hsluv":[43.5811171927028127,97.2747266570755613,55.8872675460691113]},"#bb7722":{"lch":[55.9627137258116534,75.0570685818031365,42.3362918908129799],"luv":[55.9627137258116534,55.4825342436315907,50.549499878809371],"rgb":[0.733333333333333282,0.466666666666666674,0.133333333333333331],"xyz":[0.273782987694172142,0.238752885592309477,0.0467995691491459864],"hpluv":[42.3362918908129799,170.189263625481374,55.9627137258116534],"hsluv":[42.3362918908129799,92.3060252972229875,55.9627137258116534]},"#bb7733":{"lch":[56.086591241629975,71.12386069085467,40.1553843778465094],"luv":[56.086591241629975,54.3598535070873652,45.8651271257379562],"rgb":[0.733333333333333282,0.466666666666666674,0.2],"xyz":[0.276870738426629848,0.239987985885292576,0.0630617230067571366],"hpluv":[40.1553843778465094,160.914656808849855,56.086591241629975],"hsluv":[40.1553843778465094,84.3528141134219425,56.086591241629975]},"#bb7744":{"lch":[56.2646940492590346,65.8532423012147632,36.6949041745596887],"luv":[56.2646940492590346,52.8030258036740747,39.3508575199960617],"rgb":[0.733333333333333282,0.466666666666666674,0.266666666666666663],"xyz":[0.281328733670848763,0.24177118398298017,0.0865404979596437751],"hpluv":[36.6949041745596887,148.518490760970963,56.2646940492590346],"hsluv":[36.6949041745596887,73.3442464951488517,56.2646940492590346]},"#bb7755":{"lch":[56.5015366957073866,59.5720019456390375,31.4313823601585],"luv":[56.5015366957073866,50.8307220514796256,31.0654327434279267],"rgb":[0.733333333333333282,0.466666666666666674,0.333333333333333315],"xyz":[0.287291147710210748,0.244156149598725,0.117942545233617677],"hpluv":[31.4313823601585,133.789263155984059,56.5015366957073866],"hsluv":[31.4313823601585,59.433527841274838,56.5015366957073866]},"#bb7766":{"lch":[56.8006139195957758,52.9060784141758376,23.584548946691168],"luv":[56.8006139195957758,48.4868685528452588,21.1678225404983067],"rgb":[0.733333333333333282,0.466666666666666674,0.4],"xyz":[0.294876143483718933,0.247190147908128294,0.157890189640761625],"hpluv":[23.584548946691168,118.193030459121616,56.8006139195957758],"hsluv":[23.584548946691168,42.9582981176577476,56.8006139195957758]},"#bb7777":{"lch":[57.1645375630264851,46.8887603377642677,12.1770506300621175],"luv":[57.1645375630264851,45.8337848153679062,9.89040016939892652],"rgb":[0.733333333333333282,0.466666666666666674,0.466666666666666674],"xyz":[0.304190156503920839,0.250915753116209117,0.206943991547159534],"hpluv":[12.1770506300621175,104.083378979503351,57.1645375630264851],"hsluv":[12.1770506300621175,30.9338815185941769,57.1645375630264851]},"#bb7788":{"lch":[57.5951231639082408,43.0166042307866761,356.679907444569722],"luv":[57.5951231639082408,42.9444038116514264,-2.49126891562360298],"rgb":[0.733333333333333282,0.466666666666666674,0.533333333333333326],"xyz":[0.315330573605864639,0.255371919956986715,0.265616854950731729],"hpluv":[356.679907444569722,94.7741152880685149,57.5951231639082408],"hsluv":[356.679907444569722,32.9204937798227419,57.5951231639082408]},"#bb7799":{"lch":[58.0934559183715322,42.8683503206465062,338.533521874652],"luv":[58.0934559183715322,39.8946515879682408,-15.6879646190414519],"rgb":[0.733333333333333282,0.466666666666666674,0.6],"xyz":[0.328387537714937339,0.260594705600615872,0.334383532591849608],"hpluv":[338.533521874652,93.6373004736019823,58.0934559183715322],"hsluv":[338.533521874652,34.9811369830312131,58.0934559183715322]},"#bb77aa":{"lch":[58.6599497668646706,47.0820583870944276,321.324781752589786],"luv":[58.6599497668646706,36.7569990603765,-29.4218157502430451],"rgb":[0.733333333333333282,0.466666666666666674,0.66666666666666663],"xyz":[0.343445230680189895,0.266617782786717,0.413687382208848209],"hpluv":[321.324781752589786,101.848135129910219,58.6599497668646706],"hsluv":[321.324781752589786,37.0556810629478051,58.6599497668646706]},"#bb77bb":{"lch":[59.2944060970233693,54.9189596898792303,307.71501294924542],"luv":[59.2944060970233693,33.5958135510894706,-43.4443718479046765],"rgb":[0.733333333333333282,0.466666666666666674,0.733333333333333282],"xyz":[0.360582822787526569,0.273472819629651753,0.50394536730749],"hpluv":[307.71501294924542,117.529775077760561,59.2944060970233693],"hsluv":[307.71501294924542,40.6617226560308467,59.2944060970233693]},"#bb77cc":{"lch":[59.9960747587738155,65.1135012197087519,297.896140559284788],"luv":[59.9960747587738155,30.4646722292654815,-57.5471266620014177],"rgb":[0.733333333333333282,0.466666666666666674,0.8],"xyz":[0.379875198231248268,0.281189769807140555,0.605551877977760111],"hpluv":[297.896140559284788,137.716994859863917,59.9960747587738155],"hsluv":[297.896140559284788,53.5682479917909,59.9960747587738155]},"#bb77dd":{"lch":[60.7637179337253599,76.6332290650186394,290.953982706702106],"luv":[60.7637179337253599,27.4054240934965065,-71.5653165100750357],"rgb":[0.733333333333333282,0.466666666666666674,0.866666666666666696],"xyz":[0.401393523781881867,0.289797100027394061,0.718881725877766109],"hpluv":[290.953982706702106,160.033945707839,60.7637179337253599],"hsluv":[290.953982706702106,68.5485010485900119,60.7637179337253599]},"#bb77ee":{"lch":[61.5956761624293563,88.8082274030350902,285.979672103614405],"luv":[61.5956761624293563,24.4485758512518743,-85.3766267389077456],"rgb":[0.733333333333333282,0.466666666666666674,0.933333333333333348],"xyz":[0.425205704048056576,0.299321972133864078,0.844292541946289332],"hpluv":[285.979672103614405,182.954165183101395,61.5956761624293563],"hsluv":[285.979672103614405,84.0163684558434909,61.5956761624293563]},"#bb77ff":{"lch":[62.4899351736807773,101.23109143545085,282.328516880108566],"luv":[62.4899351736807773,21.6145233767131266,-98.8966442929694693],"rgb":[0.733333333333333282,0.466666666666666674,1],"xyz":[0.451376752457888,0.309790391497796802,0.982126730238071177],"hpluv":[282.328516880108566,205.562159598045383,62.4899351736807773],"hsluv":[282.328516880108566,99.9999999999986784,62.4899351736807773]},"#998800":{"lch":[56.4673516485332527,62.834492950420568,74.7562721675545561],"luv":[56.4673516485332527,16.5207966112614884,60.6237311922136897],"rgb":[0.6,0.533333333333333326,0],"xyz":[0.219403499200853586,0.243810947756601892,0.0355036829424554834],"hpluv":[74.7562721675545561,141.201731332299261,56.4673516485332527],"hsluv":[74.7562721675545561,100.000000000002331,56.4673516485332527]},"#998811":{"lch":[56.5074221469723881,61.2259080808398366,74.51872844438833],"luv":[56.5074221469723881,16.3426261455871646,59.0044946676862878],"rgb":[0.6,0.533333333333333326,0.0666666666666666657],"xyz":[0.220415164700490718,0.244215613956456745,0.0408317879072111131],"hpluv":[74.51872844438833,137.489352382480689,56.5074221469723881],"hsluv":[74.51872844438833,97.3110722480099781,56.5074221469723881]},"#998822":{"lch":[56.5815852437789744,58.2905156727598666,74.0508275651119],"luv":[56.5815852437789744,16.0173304476746452,56.0466711119068961],"rgb":[0.6,0.533333333333333326,0.133333333333333331],"xyz":[0.222290522838967719,0.244965757211847573,0.0507086741031903127],"hpluv":[74.0508275651119,130.726042229432494,56.5815852437789744],"hsluv":[74.0508275651119,92.4075523300517574,56.5815852437789744]},"#998833":{"lch":[56.7033645714083,53.5858970619529273,73.1917859227149],"luv":[56.7033645714083,15.4953822971072128,51.2966031175623911],"rgb":[0.6,0.533333333333333326,0.2],"xyz":[0.22537827357142548,0.246200857504830672,0.066970827960801449],"hpluv":[73.1917859227149,119.917068416956084,56.7033645714083],"hsluv":[73.1917859227149,84.5557602276611533,56.7033645714083]},"#998844":{"lch":[56.8784692361674189,47.0662938677721456,71.7105236832421156],"luv":[56.8784692361674189,14.7702533586865563,44.6886521856241927],"rgb":[0.6,0.533333333333333326,0.266666666666666663],"xyz":[0.22983626881564434,0.247984055602518266,0.0904496029136880875],"hpluv":[71.7105236832421156,105.00293267331034,56.8784692361674189],"hsluv":[71.7105236832421156,73.6816499137771075,56.8784692361674189]},"#998855":{"lch":[57.1113583918905761,38.8337969655052433,69.1066660847648393],"luv":[57.1113583918905761,13.8492700909341142,36.2803184206870242],"rgb":[0.6,0.533333333333333326,0.333333333333333315],"xyz":[0.235798682855006325,0.250369021218263099,0.121851650187662],"hpluv":[69.1066660847648393,86.2832891510872599,57.1113583918905761],"hsluv":[69.1066660847648393,59.9309888570698774,57.1113583918905761]},"#998866":{"lch":[57.4054971647218224,29.1657433305745144,64.0747883902216],"luv":[57.4054971647218224,12.7511922431808031,26.2306629806110223],"rgb":[0.6,0.533333333333333326,0.4],"xyz":[0.24338367862851451,0.253403019527666418,0.161799294594805965],"hpluv":[64.0747883902216,64.4701815948561574,57.4054971647218224],"hsluv":[64.0747883902216,43.6310875702010321,57.4054971647218224]},"#998877":{"lch":[57.7634914296009612,18.7238256654584347,52.0945218145914097],"luv":[57.7634914296009612,11.5031815844705712,14.773573060880608],"rgb":[0.6,0.533333333333333326,0.466666666666666674],"xyz":[0.252697691648716416,0.257128624735747213,0.210853096501203874],"hpluv":[52.0945218145914097,41.1320618043462858,57.7634914296009612],"hsluv":[52.0945218145914097,25.2418236256697028,57.7634914296009612]},"#998888":{"lch":[58.1871725604667489,10.3706980586515272,12.1770506300640946],"luv":[58.1871725604667489,10.1373621264743505,2.18752539195365081],"rgb":[0.6,0.533333333333333326,0.533333333333333326],"xyz":[0.263838108750660272,0.261584791576524811,0.269525959904776],"hpluv":[12.1770506300640946,22.6162221883482317,58.1871725604667489],"hsluv":[12.1770506300640946,7.14421708061451799,58.1871725604667489]},"#998899":{"lch":[58.6776613659523605,14.2013195506443459,307.715012949254117],"luv":[58.6776613659523605,8.6874348403017283,-11.2341422847952668],"rgb":[0.6,0.533333333333333326,0.6],"xyz":[0.276895072859732971,0.266807577220153969,0.338292637545893948],"hpluv":[307.715012949254117,30.7110899398720818,58.6776613659523605],"hsluv":[307.715012949254117,10.6251017733449729,58.6776613659523605]},"#9988aa":{"lch":[59.2354248002074399,26.2127450059066938,285.910383521223935],"luv":[59.2354248002074399,7.18579172527609789,-25.2085778659891844],"rgb":[0.6,0.533333333333333326,0.66666666666666663],"xyz":[0.291952765824985527,0.272830654406255091,0.417596487162892549],"hpluv":[285.910383521223935,56.1526584479988173,59.2354248002074399],"hsluv":[285.910383521223935,23.5088603674401817,59.2354248002074399]},"#9988bb":{"lch":[59.8603319378123189,39.8857557696632696,278.160160819701673],"luv":[59.8603319378123189,5.66141142610705117,-39.4819190767314581],"rgb":[0.6,0.533333333333333326,0.733333333333333282],"xyz":[0.309090357932322146,0.279685691249189849,0.507854472261534351],"hpluv":[278.160160819701673,84.5508603994872,59.8603319378123189],"hsluv":[278.160160819701673,37.7262541103550291,59.8603319378123189]},"#9988cc":{"lch":[60.55171199345871,53.9990869041691823,274.395593429514747],"luv":[60.55171199345871,4.13861667015410095,-53.8402566723222264],"rgb":[0.6,0.533333333333333326,0.8],"xyz":[0.3283827333760439,0.287402641426678651,0.609460982931804507],"hpluv":[274.395593429514747,113.161661700826286,60.55171199345871],"hsluv":[274.395593429514747,52.5240219153236723,60.55171199345871]},"#9988dd":{"lch":[61.3084150605589855,68.1648195931338563,272.216747448240312],"luv":[61.3084150605589855,2.63660773112319324,-68.1138086575451],"rgb":[0.6,0.533333333333333326,0.866666666666666696],"xyz":[0.349901058926677444,0.296009971646932157,0.722790830831810505],"hpluv":[272.216747448240312,141.084572716849891,61.3084150605589855],"hsluv":[272.216747448240312,67.8395486149695,61.3084150605589855]},"#9988ee":{"lch":[62.128875020953032,82.18421866163294,270.815422264053723],"luv":[62.128875020953032,1.1695901512833331,-82.1758958326656597],"rgb":[0.6,0.533333333333333326,0.933333333333333348],"xyz":[0.373713239192852154,0.305534843753402174,0.848201646900333728],"hpluv":[270.815422264053723,167.854994169255662,62.128875020953032],"hsluv":[270.815422264053723,83.6558877567472905,62.128875020953032]},"#9988ff":{"lch":[63.0111734122257303,95.9388777898474387,269.8490772999765],"luv":[63.0111734122257303,-0.252712116882344406,-95.9385449554102],"rgb":[0.6,0.533333333333333326,1],"xyz":[0.399884287602683575,0.316003263117334898,0.986035835192115462],"hpluv":[269.8490772999765,193.204124490752207,63.0111734122257303],"hsluv":[269.8490772999765,99.9999999999985363,63.0111734122257303]},"#bb8800":{"lch":[60.0458653136574,74.8864062555341832,55.056379834278971],"luv":[60.0458653136574,42.8926945435799,61.3855894869476728],"rgb":[0.733333333333333282,0.533333333333333326,0],"xyz":[0.292968333781028434,0.281742815587005313,0.038952034563401107],"hpluv":[55.056379834278971,158.255644288368103,60.0458653136574],"hsluv":[55.056379834278971,100.000000000002288,60.0458653136574]},"#bb8811":{"lch":[60.0822560315187957,73.5298298886522161,54.5759299869630823],"luv":[60.0822560315187957,42.619621560372849,59.9183089005750773],"rgb":[0.733333333333333282,0.533333333333333326,0.0666666666666666657],"xyz":[0.293979999280665538,0.282147481786860166,0.0442801395281567367],"hpluv":[54.5759299869630823,155.294707870281485,60.0822560315187957],"hsluv":[54.5759299869630823,97.6878818876268866,60.0822560315187957]},"#bb8822":{"lch":[60.1496227929862499,71.0610449842002367,53.6488709316330343],"luv":[60.1496227929862499,42.1201645307819774,57.2325419158225586],"rgb":[0.733333333333333282,0.533333333333333326,0.133333333333333331],"xyz":[0.295855357419142595,0.282897625042250966,0.0541570257241359362],"hpluv":[53.6488709316330343,149.912555699661567,60.1496227929862499],"hsluv":[53.6488709316330343,93.46183514856709,60.1496227929862499]},"#bb8833":{"lch":[60.2602822329103844,67.1261991777524,52.0115270519145412],"luv":[60.2602822329103844,41.3163720666953154,52.9044801061090197],"rgb":[0.733333333333333282,0.533333333333333326,0.2],"xyz":[0.298943108151600301,0.284132725335234093,0.0704191795817470795],"hpluv":[52.0115270519145412,141.351435183858257,60.2602822329103844],"hsluv":[52.0115270519145412,86.668700859176,60.2602822329103844]},"#bb8844":{"lch":[60.4194844691316746,61.7320119628667285,49.374045706205429],"luv":[60.4194844691316746,40.1948297943626258,46.8531424643613406],"rgb":[0.733333333333333282,0.533333333333333326,0.266666666666666663],"xyz":[0.303401103395819216,0.285915923432921659,0.093897954534633718],"hpluv":[49.374045706205429,129.650066203053939,60.4194844691316746],"hsluv":[49.374045706205429,77.207197386412,60.4194844691316746]},"#bb8855":{"lch":[60.6313805732006585,55.0590005000961682,45.2500033552910708],"luv":[60.6313805732006585,38.7623447760430935,39.1020992215604082],"rgb":[0.733333333333333282,0.533333333333333326,0.333333333333333315],"xyz":[0.309363517435181201,0.28830088904866652,0.125300001808607619],"hpluv":[45.2500033552910708,115.231228654446355,60.6313805732006585],"hsluv":[45.2500033552910708,65.1528926573884775,60.6313805732006585]},"#bb8866":{"lch":[60.8992588402534949,47.519038379270981,38.7816256818529581],"luv":[60.8992588402534949,37.0429375720225096,29.7637327048519147],"rgb":[0.733333333333333282,0.533333333333333326,0.4],"xyz":[0.316948513208689386,0.291334887358069838,0.165247646215751581],"hpluv":[38.7816256818529581,99.0136254476035305,60.8992588402534949],"hsluv":[38.7816256818529581,50.7321114426118,60.8992588402534949]},"#bb8877":{"lch":[61.2256685857267087,39.8992767652027354,28.4701407483744688],"luv":[61.2256685857267087,35.0740840991728362,19.0200134329710231],"rgb":[0.733333333333333282,0.533333333333333326,0.466666666666666674],"xyz":[0.326262526228891292,0.295060492566150634,0.21430144812214949],"hpluv":[28.4701407483744688,82.6933933486175761,61.2256685857267087],"hsluv":[28.4701407483744688,34.2887258466009897,61.2256685857267087]},"#bb8888":{"lch":[61.6124959728340684,33.6595928281588499,12.1770506300623627],"luv":[61.6124959728340684,32.9022674846918903,7.09992843085263114],"rgb":[0.733333333333333282,0.533333333333333326,0.533333333333333326],"xyz":[0.337402943330835092,0.299516659406928232,0.272974311525721658],"hpluv":[12.1770506300623627,69.3233245158679,61.6124959728340684],"hsluv":[12.1770506300623627,26.8235367690150284,61.6124959728340684]},"#bb8899":{"lch":[62.0610184830546388,31.1131530731089718,349.361203223606594],"luv":[62.0610184830546388,30.5783355372127765,-5.74401339869088723],"rgb":[0.733333333333333282,0.533333333333333326,0.6],"xyz":[0.350459907439907847,0.304739445050557389,0.341740989166839593],"hpluv":[349.361203223606594,63.6157209963685091,62.0610184830546388],"hsluv":[349.361203223606594,28.7433747177793393,62.0610184830546388]},"#bb88aa":{"lch":[62.5719506337331097,34.1093853871598185,325.627133749050586],"luv":[62.5719506337331097,28.1532372220531357,-19.2573467904743723],"rgb":[0.733333333333333282,0.533333333333333326,0.66666666666666663],"xyz":[0.365517600405160348,0.310762522236658512,0.421044838783838193],"hpluv":[325.627133749050586,69.1725086761469328,62.5719506337331097],"hsluv":[325.627133749050586,30.7007491098828176,62.5719506337331097]},"#bb88bb":{"lch":[63.1454872588298,41.9701566603395477,307.715012949246614],"luv":[63.1454872588298,25.674586077978244,-33.2010493782640808],"rgb":[0.733333333333333282,0.533333333333333326,0.733333333333333282],"xyz":[0.382655192512497,0.31761755907959327,0.51130282388247994],"hpluv":[307.715012949246614,84.3407770596407,63.1454872588298],"hsluv":[307.715012949246614,32.6446535119142354,63.1454872588298]},"#bb88cc":{"lch":[63.7813474201422,52.7335158558763055,296.081540752202443],"luv":[63.7813474201422,23.1842810338905281,-47.3636232510092228],"rgb":[0.733333333333333282,0.533333333333333326,0.8],"xyz":[0.401947567956218776,0.325334509257082072,0.612909334552750096],"hpluv":[296.081540752202443,104.913738848088499,63.7813474201422],"hsluv":[296.081540752202443,48.441096457031712,63.7813474201422]},"#bb88dd":{"lch":[64.4788201663492089,64.9599578897110916,288.597779393076337],"luv":[64.4788201663492089,20.7171971389296665,-61.56779898404492],"rgb":[0.733333333333333282,0.533333333333333326,0.866666666666666696],"xyz":[0.423465893506852264,0.333941839477335578,0.726239182452756094],"hpluv":[288.597779393076337,127.840358269428478,64.4788201663492089],"hsluv":[288.597779393076337,64.9415793589177,64.4788201663492089]},"#bb88ee":{"lch":[65.2368122498474463,77.8541115668441392,283.595470556329246],"luv":[65.2368122498474463,18.300798164755431,-75.6726071600252084],"rgb":[0.733333333333333282,0.533333333333333326,0.933333333333333348],"xyz":[0.44727807377302703,0.343466711583805595,0.851649998521279317],"hpluv":[283.595470556329246,151.435657753316406,65.2368122498474463],"hsluv":[283.595470556329246,82.1213401763518789,65.2368122498474463]},"#bb88ff":{"lch":[66.0538972531437452,90.9819525935223652,280.100148709787334],"luv":[66.0538972531437452,15.9554396417090967,-89.5719802369565201],"rgb":[0.733333333333333282,0.533333333333333326,1],"xyz":[0.473449122182858395,0.353935130947738319,0.989484186813061162],"hpluv":[280.100148709787334,174.781769995450787,66.0538972531437452],"hsluv":[280.100148709787334,99.99999999999838,66.0538972531437452]},"#999900":{"lch":[61.2683639221826866,67.5422828804358772,85.8743202181747449],"luv":[61.2683639221826866,4.85929488236129092,67.3672563635114869],"rgb":[0.6,0.6,0],"xyz":[0.245273099653321058,0.295550148661537559,0.0441268830932777384],"hpluv":[85.8743202181747449,139.887458074797593,61.2683639221826866],"hsluv":[85.8743202181747449,100.000000000002359,61.2683639221826866]},"#999911":{"lch":[61.3036130280217861,66.0751339072958785,85.8743202181746881],"luv":[61.3036130280217861,4.75374160235953358,65.9039093047224185],"rgb":[0.6,0.6,0.0666666666666666657],"xyz":[0.24628476515295819,0.295954814861392412,0.0494549880580333681],"hpluv":[85.8743202181746881,136.770144995815713,61.3036130280217861],"hsluv":[85.8743202181746881,97.7715564197957718,61.3036130280217861]},"#999922":{"lch":[61.3688705786650104,63.38848415762304,85.8743202181745744],"luv":[61.3688705786650104,4.56045196477970372,63.2242216375825663],"rgb":[0.6,0.6,0.133333333333333331],"xyz":[0.248160123291435192,0.296704958116783213,0.0593318742540125676],"hpluv":[85.8743202181745744,131.069475710796667,61.3688705786650104],"hsluv":[85.8743202181745744,93.6963738669960691,61.3688705786650104]},"#999933":{"lch":[61.4760769955270945,59.0559618954583243,85.8743202181743754],"luv":[61.4760769955270945,4.24875087387181871,58.9029265097210484],"rgb":[0.6,0.6,0.2],"xyz":[0.251247874023892925,0.29794005840976634,0.0755940281116237178],"hpluv":[85.8743202181743754,121.898097720990123,61.4760769955270945],"hsluv":[85.8743202181743754,87.1401192062652683,61.4760769955270945]},"#999944":{"lch":[61.6303367515695,52.9921690524208,85.8743202181739775],"luv":[61.6303367515695,3.81249440942850049,52.8548471500809569],"rgb":[0.6,0.6,0.266666666666666663],"xyz":[0.255705869268111841,0.299723256507453906,0.0990728030645103563],"hpluv":[85.8743202181739775,109.10797160418339,61.6303367515695],"hsluv":[85.8743202181739775,77.9969649215058,61.6303367515695]},"#999955":{"lch":[61.8357003743425935,45.2147461889200173,85.8743202181734517],"luv":[61.8357003743425935,3.25295171251598125,45.0975784059909],"rgb":[0.6,0.6,0.333333333333333315],"xyz":[0.261668283307473826,0.302108222123198766,0.130474850338484272],"hpluv":[85.8743202181734517,92.7855058259100218,61.8357003743425935],"hsluv":[85.8743202181734517,66.3286810003367577,61.8357003743425935]},"#999966":{"lch":[62.0953945325949377,35.8293841981041083,85.874320218172457],"luv":[62.0953945325949377,2.57772666020637553,35.7365372872164784],"rgb":[0.6,0.6,0.4],"xyz":[0.269253279080982,0.305142220432602085,0.170422494745628206],"hpluv":[85.874320218172457,73.2182390722606,62.0953945325949377],"hsluv":[85.874320218172457,52.3408174542086542,62.0953945325949377]},"#999977":{"lch":[62.4119425079225749,25.0116267171883422,85.8743202181703],"luv":[62.4119425079225749,1.79944864939855109,24.9468125338318],"rgb":[0.6,0.6,0.466666666666666674],"xyz":[0.278567292101183916,0.30886782564068288,0.219476296652026115],"hpluv":[85.8743202181703,50.8526471570801775,62.4119425079225749],"hsluv":[85.8743202181703,36.3525421484824918,62.4119425079225749]},"#999988":{"lch":[62.7872374999600567,12.9853368609797517,85.8743202181639589],"luv":[62.7872374999600567,0.934223397011331502,12.9516871502363],"rgb":[0.6,0.6,0.533333333333333326],"xyz":[0.289707709203127717,0.313323992481460478,0.27814916005559831],"hpluv":[85.8743202181639589,26.2434647477884546,62.7872374999600567],"hsluv":[85.8743202181639589,18.7604129126121961,62.7872374999600567]},"#999999":{"lch":[63.2225945523589843,3.33307052034688283e-12,0],"luv":[63.2225945523589843,3.14807442966336163e-12,1.09498241031769098e-12],"rgb":[0.6,0.6,0.6],"xyz":[0.302764673312200472,0.318546778125089636,0.346915837696716189],"hpluv":[0,6.68977504875838914e-12,63.2225945523589843],"hsluv":[0,3.10313074237261963e-12,63.2225945523589843]},"#9999aa":{"lch":[63.7187933641432238,13.6904464527836414,265.874320218190064],"luv":[63.7187933641432238,-0.984952144759020598,-13.6549695477167123],"rgb":[0.6,0.6,0.66666666666666663],"xyz":[0.317822366277453,0.324569855311190758,0.42621968731371479],"hpluv":[265.874320218190064,27.2639887848552753,63.7187933641432238],"hsluv":[265.874320218190064,14.5770868731616492,63.7187933641432238]},"#9999bb":{"lch":[64.276118203606174,27.8450519356751158,265.874320218183641],"luv":[64.276118203606174,-2.00329797275791854,-27.7728953213882335],"rgb":[0.6,0.6,0.733333333333333282],"xyz":[0.334959958384789647,0.331424892154125517,0.516477672412356537],"hpluv":[265.874320218183641,54.9715165011475904,64.276118203606174],"hsluv":[265.874320218183641,30.0955931685464577,64.276118203606174]},"#9999cc":{"lch":[64.8943980299807635,42.2483295275786332,265.874320218181538],"luv":[64.8943980299807635,-3.03953438803302189,-42.138848804575062],"rgb":[0.6,0.6,0.8],"xyz":[0.354252333828511401,0.339141842331614318,0.618084183082626692],"hpluv":[265.874320218181538,82.6117192029769,64.8943980299807635],"hsluv":[265.874320218181538,46.4456834766813316,64.8943980299807635]},"#9999dd":{"lch":[65.5730481583578353,56.7175687031348,265.874320218180458],"luv":[65.5730481583578353,-4.08051637559571567,-56.570592941061804],"rgb":[0.6,0.6,0.866666666666666696],"xyz":[0.375770659379144889,0.347749172551867824,0.73141403098263269],"hpluv":[265.874320218180458,109.756831209262941,65.5730481583578353],"hsluv":[265.874320218180458,63.5568222493012627,65.5730481583578353]},"#9999ee":{"lch":[66.311113738117,71.1055788100052695,265.874320218179832],"luv":[66.311113738117,-5.11565437949467672,-70.9213185027987691],"rgb":[0.6,0.6,0.933333333333333348],"xyz":[0.399582839645319654,0.357274044658337842,0.856824847051155913],"hpluv":[265.874320218179832,136.068212717368169,66.311113738117],"hsluv":[265.874320218179832,81.4020980414818922,66.311113738117]},"#9999ff":{"lch":[67.1073146704137145,85.2999068143523829,265.874320218179378],"luv":[67.1073146704137145,-6.13685802391602486,-85.0788638624864149],"rgb":[0.6,0.6,1],"xyz":[0.425753888055151,0.367742464022270565,0.994659035342937758],"hpluv":[265.874320218179378,161.293929533565688,67.1073146704137145],"hsluv":[265.874320218179378,99.9999999999983,67.1073146704137145]},"#bb9900":{"lch":[64.4418646198176219,74.1135014806344117,66.2793330800256228],"luv":[64.4418646198176219,29.8142337654579457,67.8522112145111],"rgb":[0.733333333333333282,0.6,0],"xyz":[0.318837934233495934,0.333482016491941036,0.047575234714223362],"hpluv":[66.2793330800256228,145.938057142603384,64.4418646198176219],"hsluv":[66.2793330800256228,100.000000000002416,64.4418646198176219]},"#bb9911":{"lch":[64.4743890579801331,72.806990252212529,65.9899074816349],"luv":[64.4743890579801331,29.6249863695688624,66.5072778888794147],"rgb":[0.733333333333333282,0.6,0.0666666666666666657],"xyz":[0.319849599733133039,0.333886682691795889,0.0529033396789789917],"hpluv":[65.9899074816349,143.29306400111571,64.4743890579801331],"hsluv":[65.9899074816349,98.0367215419372542,64.4743890579801331]},"#bb9922":{"lch":[64.5346112536789,70.4161712525116599,65.4311312102869636],"luv":[64.5346112536789,29.2781077929992222,64.0408430450799671],"rgb":[0.733333333333333282,0.6,0.133333333333333331],"xyz":[0.321724957871610096,0.334636825947186689,0.0627802258749581843],"hpluv":[65.4311312102869636,138.458312961065701,64.5346112536789],"hsluv":[65.4311312102869636,94.4406497380354892,64.5346112536789]},"#bb9933":{"lch":[64.6335704733000398,66.566957174521292,64.4427367566729146],"luv":[64.6335704733000398,28.7178476591491503,60.0536844273559396],"rgb":[0.733333333333333282,0.6,0.2],"xyz":[0.324812708604067801,0.335871926240169816,0.0790423797325693345],"hpluv":[64.4427367566729146,130.689255588928205,64.6335704733000398],"hsluv":[64.4427367566729146,88.6394107340449153,64.6335704733000398]},"#bb9944":{"lch":[64.7760175449466828,61.1991201001527685,62.8442649593615386],"luv":[64.7760175449466828,27.9319304868930693,54.4530950480162872],"rgb":[0.733333333333333282,0.6,0.266666666666666663],"xyz":[0.329270703848286717,0.337655124337857382,0.102521154685455973],"hpluv":[62.8442649593615386,119.886494259466,64.7760175449466828],"hsluv":[62.8442649593615386,80.5164965868838607,64.7760175449466828]},"#bb9955":{"lch":[64.965753761967747,54.3684881208399204,60.3198292286154],"luv":[64.965753761967747,26.9209928274273445,47.235501963369849],"rgb":[0.733333333333333282,0.6,0.333333333333333315],"xyz":[0.335233117887648702,0.340040089953602243,0.133923201959429888],"hpluv":[60.3198292286154,106.194518749025775,64.965753761967747],"hsluv":[60.3198292286154,70.0945405394646883,64.965753761967747]},"#bb9966":{"lch":[65.2058459998609,46.2670609228556557,56.2614414361724258],"luv":[65.2058459998609,25.6969192719684436,38.4747874116176689],"rgb":[0.733333333333333282,0.6,0.4],"xyz":[0.342818113661156887,0.343074088263005561,0.17387084636657385],"hpluv":[56.2614414361724258,90.0377647384168,65.2058459998609],"hsluv":[56.2614414361724258,57.5177389460533064,65.2058459998609]},"#bb9977":{"lch":[65.4987393303808147,37.2952826673053153,49.3796729345645886],"luv":[65.4987393303808147,24.280853083902965,28.3086255892461871],"rgb":[0.733333333333333282,0.6,0.466666666666666674],"xyz":[0.352132126681358792,0.346799693471086357,0.222924648272971759],"hpluv":[49.3796729345645886,72.2537327682772172,65.4987393303808147],"hsluv":[49.3796729345645886,43.0302399575574199,65.4987393303808147]},"#bb9988":{"lch":[65.8463246780106601,28.3139420599436384,36.7022131699001193],"luv":[65.8463246780106601,22.7007755052872291,16.9220006628175241],"rgb":[0.733333333333333282,0.6,0.533333333333333326],"xyz":[0.363272543783302593,0.351255860311863954,0.281597511676543899],"hpluv":[36.7022131699001193,54.564242001153282,65.8463246780106601],"hsluv":[36.7022131699001193,26.9495650592517677,65.8463246780106601]},"#bb9999":{"lch":[66.2499853133799377,21.4719543680734333,12.1770506300627517],"luv":[66.2499853133799377,20.9888452793887552,4.52914983440691099],"rgb":[0.733333333333333282,0.6,0.6],"xyz":[0.376329507892375292,0.356478645955493112,0.350364189317661834],"hpluv":[12.1770506300627517,41.1268186121042731,66.2499853133799377],"hsluv":[12.1770506300627517,20.948078856310218,66.2499853133799377]},"#bb99aa":{"lch":[66.7106335886793715,21.0368039825091344,335.738246937474969],"luv":[66.7106335886793715,19.1787866223333445,-8.64414631375011489],"rgb":[0.733333333333333282,0.6,0.66666666666666663],"xyz":[0.391387200857627848,0.362501723141594234,0.429668038934660435],"hpluv":[335.738246937474969,40.0151105801343192,66.7106335886793715],"hsluv":[335.738246937474969,22.766845509204984,66.7106335886793715]},"#bb99bb":{"lch":[67.2287438260669887,28.2861274819753,307.715012949249171],"luv":[67.2287438260669887,17.3035955220760833,-22.3761165070024362],"rgb":[0.733333333333333282,0.6,0.733333333333333282],"xyz":[0.408524792964964523,0.369356759984529,0.519926024033302125],"hpluv":[307.715012949249171,53.3897422679679323,67.2287438260669887],"hsluv":[307.715012949249171,24.5905380245485432,67.2287438260669887]},"#bb99cc":{"lch":[67.8043844715017343,39.5775547497090656,292.889275489017223],"luv":[67.8043844715017343,15.393749985076461,-36.4611478338680044],"rgb":[0.733333333333333282,0.6,0.8],"xyz":[0.427817168408686221,0.377073710162017794,0.621532534703572281],"hpluv":[292.889275489017223,74.0679810995506642,67.8043844715017343],"hsluv":[292.889275489017223,42.0187450252511,67.8043844715017343]},"#bb99dd":{"lch":[68.4372510447458353,52.4777928084534082,284.879936967142157],"luv":[68.4372510447458353,13.4760025497769718,-50.718005612655638],"rgb":[0.733333333333333282,0.6,0.866666666666666696],"xyz":[0.449335493959319821,0.385681040382271301,0.734862382603578279],"hpluv":[284.879936967142157,97.3021261982971737,68.4372510447458353],"hsluv":[284.879936967142157,60.4059975969609724,68.4372510447458353]},"#bb99ee":{"lch":[69.1267004581107898,66.0165196934359244,280.096152477623832],"luv":[69.1267004581107898,11.5727364631099334,-64.9942508472035456],"rgb":[0.733333333333333282,0.6,0.933333333333333348],"xyz":[0.47314767422549453,0.395205912488741318,0.860273198672101502],"hpluv":[280.096152477623832,121.184234531677617,69.1267004581107898],"hsluv":[280.096152477623832,79.7264365589122548,69.1267004581107898]},"#bb99ff":{"lch":[69.8717866786541,79.7596884688517207,276.986638727898821],"luv":[69.8717866786541,9.70179942494587877,-79.1674364405365765],"rgb":[0.733333333333333282,0.6,1],"xyz":[0.499318722635325951,0.405674331852674042,0.998107386963883347],"hpluv":[276.986638727898821,144.850809586534439,69.8717866786541],"hsluv":[276.986638727898821,99.9999999999980247,69.8717866786541]},"#880000":{"lch":[27.3946073685119416,92.1289276169810876,12.1770506300617765],"luv":[27.3946073685119416,90.0560691570773,19.4330571920800175],"rgb":[0.533333333333333326,0,0],"xyz":[0.101531161901381561,0.0523520053554009795,0.00475927321412716],"hpluv":[12.1770506300617765,426.746789183125316,27.3946073685119416],"hsluv":[12.1770506300617765,100.000000000002245,27.3946073685119416]},"#880011":{"lch":[27.5061298630582485,89.4551794237446529,10.4692299831444977],"luv":[27.5061298630582485,87.9659862388495242,16.254672889999533],"rgb":[0.533333333333333326,0,0.0666666666666666657],"xyz":[0.10254282740101868,0.0527566715552558324,0.0100873781788827915],"hpluv":[10.4692299831444977,412.68181181873,27.5061298630582485],"hsluv":[10.4692299831444977,99.9999999999965,27.5061298630582485]},"#880022":{"lch":[27.711363673312789,85.0234292319238421,7.23413932290422057],"luv":[27.711363673312789,84.3466296586470463,10.7065206104973338],"rgb":[0.533333333333333326,0,0.133333333333333331],"xyz":[0.104418185539495709,0.0535068148106466537,0.0199642643748619876],"hpluv":[7.23413932290422057,389.331950846774873,27.711363673312789],"hsluv":[7.23413932290422057,99.9999999999967,27.711363673312789]},"#880033":{"lch":[28.0451389930846,79.0521177396887396,1.75350406004841131],"luv":[28.0451389930846,79.0150993176991392,2.41896650323101259],"rgb":[0.533333333333333326,0,0.2],"xyz":[0.107505936271953442,0.0547419151036297666,0.0362264182324731343],"hpluv":[1.75350406004841131,357.680479105960103,28.0451389930846],"hsluv":[1.75350406004841131,99.9999999999969589,28.0451389930846]},"#880044":{"lch":[28.5182895144164306,72.8806899851902585,353.674121255230034],"luv":[28.5182895144164306,72.4369406321056459,-8.0302306678086488],"rgb":[0.533333333333333326,0,0.266666666666666663],"xyz":[0.111963931516172316,0.0565251132013173396,0.0597051931853597728],"hpluv":[353.674121255230034,324.286096087098713,28.5182895144164306],"hsluv":[353.674121255230034,99.9999999999972857,28.5182895144164306]},"#880055":{"lch":[29.1358047874334787,68.1690091719341922,343.056201782139055],"luv":[29.1358047874334787,65.2098664506571453,-19.866734230132252],"rgb":[0.533333333333333326,0,0.333333333333333315],"xyz":[0.117926345555534315,0.0589100788170621725,0.0911072404593336743],"hpluv":[343.056201782139055,296.892542908362316,29.1358047874334787],"hsluv":[343.056201782139055,99.9999999999977405,29.1358047874334787]},"#880066":{"lch":[29.8977347275108087,66.3157421691867768,330.790160549998632],"luv":[29.8977347275108087,57.8829185884671915,-32.3627161272186115],"rgb":[0.533333333333333326,0,0.4],"xyz":[0.125511341329042486,0.0619440771264654841,0.13105488486647765],"hpluv":[330.790160549998632,281.460643767249167,29.8977347275108087],"hsluv":[330.790160549998632,99.9999999999981384,29.8977347275108087]},"#880077":{"lch":[30.8000475559674527,67.8890879971799,318.512376228514142],"luv":[30.8000475559674527,50.8556366042998462,-44.9736866918894549],"rgb":[0.533333333333333326,0,0.466666666666666674],"xyz":[0.13482535434924442,0.0656696823345463,0.180108686772875559],"hpluv":[318.512376228514142,279.697068124812404,30.8000475559674527],"hsluv":[318.512376228514142,99.9999999999984652,30.8000475559674527]},"#880088":{"lch":[31.8355421357531156,72.5162027692933862,307.715012949243601],"luv":[31.8355421357531156,44.3606514294377803,-57.3649045046986288],"rgb":[0.533333333333333326,0,0.533333333333333326],"xyz":[0.14596577145118822,0.0701258491753239,0.238781550176447727],"hpluv":[307.715012949243601,289.042783730483279,31.8355421357531156],"hsluv":[307.715012949243601,99.9999999999987921,31.8355421357531156]},"#880099":{"lch":[32.9947769935272675,79.3376809512942,299.026215263792551],"luv":[32.9947769935272675,38.4954159686478121,-69.3726932454703444],"rgb":[0.533333333333333326,0,0.6],"xyz":[0.159022735560260947,0.0753486348189530558,0.307548227817565634],"hpluv":[299.026215263792551,305.122076286487129,32.9947769935272675],"hsluv":[299.026215263792551,99.9999999999991189,32.9947769935272675]},"#8800aa":{"lch":[34.2669429307518527,87.5167556566874651,292.341813883439613],"luv":[34.2669429307518527,33.2678552259606306,-80.9470958672197298],"rgb":[0.533333333333333326,0,0.66666666666666663],"xyz":[0.174080428525513475,0.0813717120050541642,0.386852077434564234],"hpluv":[292.341813883439613,324.082197305514,34.2669429307518527],"hsluv":[292.341813883439613,99.9999999999993605,34.2669429307518527]},"#8800bb":{"lch":[35.6406160405817047,96.4510237672048589,287.271351738157534],"luv":[35.6406160405817047,28.6360630376966157,-92.1019862947753296],"rgb":[0.533333333333333326,0,0.733333333333333282],"xyz":[0.19121802063285015,0.0882267488479889228,0.477110062533206],"hpluv":[287.271351738157534,343.400533998367337,35.6406160405817047],"hsluv":[287.271351738157534,99.999999999999531,35.6406160405817047]},"#8800cc":{"lch":[37.1043554501127346,105.765919518381835,283.413875530142832],"luv":[37.1043554501127346,24.5359458020369345,-102.880596300606314],"rgb":[0.533333333333333326,0,0.8],"xyz":[0.210510396076571876,0.0959436990254777244,0.578716573203476137],"hpluv":[283.413875530142832,361.709723992276565,37.1043554501127346],"hsluv":[283.413875530142832,99.9999999999998,37.1043554501127346]},"#8800dd":{"lch":[38.6471386159700145,115.245648848701009,280.44740978906907],"luv":[38.6471386159700145,20.8978330626497737,-113.335079087825761],"rgb":[0.533333333333333326,0,0.866666666666666696],"xyz":[0.23202872162720542,0.104551029245731258,0.692046421103482134],"hpluv":[280.44740978906907,378.39598449622531,38.6471386159700145],"hsluv":[280.44740978906907,99.9999999999998863,38.6471386159700145]},"#8800ee":{"lch":[40.258648150966188,124.7713904223,278.13468614008417],"luv":[40.258648150966188,17.6552208530237813,-123.515962711485074],"rgb":[0.533333333333333326,0,0.933333333333333348],"xyz":[0.255840901893380157,0.114075901352201275,0.817457237172005358],"hpluv":[278.13468614008417,393.273926011730225,40.258648150966188],"hsluv":[278.13468614008417,99.9999999999999858,40.258648150966188]},"#8800ff":{"lch":[41.9294357887748674,134.280036872974534,276.305800055850909],"luv":[41.9294357887748674,14.7486383519278057,-133.467621426964229],"rgb":[0.533333333333333326,0,1],"xyz":[0.282011950303211578,0.124544320716133985,0.955291425463787203],"hpluv":[276.305800055850909,406.37947026199555,41.9294357887748674],"hsluv":[276.305800055850909,100.000000000000171,41.9294357887748674]},"#aa0000":{"lch":[35.0982840320529732,118.036634932245676,12.1770506300617765],"luv":[35.0982840320529732,115.380864984340803,24.8978549596859438],"rgb":[0.66666666666666663,0,0],"xyz":[0.165771937912151307,0.08547615548595483,0.00777055958963192815],"hpluv":[12.1770506300617765,426.746789183125145,35.0982840320529732],"hsluv":[12.1770506300617765,100.000000000002217,35.0982840320529732]},"#aa0011":{"lch":[35.178794604810534,115.883637018633408,11.1343823918443601],"luv":[35.178794604810534,113.702354404428164,22.3783808966644813],"rgb":[0.66666666666666663,0,0.0666666666666666657],"xyz":[0.166783603411788439,0.0858808216858096829,0.0130986645543875596],"hpluv":[11.1343823918443601,418.004049663923468,35.178794604810534],"hsluv":[11.1343823918443601,99.9999999999964473,35.178794604810534]},"#aa0022":{"lch":[35.327373324777,112.154849255399441,9.17432067350408431],"luv":[35.327373324777,110.720144559212301,17.8818287736043224],"rgb":[0.66666666666666663,0,0.133333333333333331],"xyz":[0.16865896155026544,0.0866309649412005,0.0229755507503667557],"hpluv":[9.17432067350408431,402.852473647417696,35.327373324777],"hsluv":[9.17432067350408431,99.9999999999965752,35.327373324777]},"#aa0033":{"lch":[35.5701485089931921,106.706281850707128,5.8788523359554592],"luv":[35.5701485089931921,106.14508040487398,10.9294323844098908],"rgb":[0.66666666666666663,0,0.2],"xyz":[0.171746712282723202,0.0878660652341836101,0.0392377046079779],"hpluv":[5.8788523359554592,380.665602767339294,35.5701485089931921],"hsluv":[5.8788523359554592,99.9999999999967741,35.5701485089931921]},"#aa0044":{"lch":[35.9166782648329104,100.198740700315142,1.0062433800652546],"luv":[35.9166782648329104,100.183288799466339,1.75962588401964615],"rgb":[0.66666666666666663,0,0.266666666666666663],"xyz":[0.176204707526942062,0.0896492633318711901,0.0627164795608645409],"hpluv":[1.0062433800652546,354.001763490246503,35.9166782648329104],"hsluv":[1.0062433800652546,99.999999999997,35.9166782648329104]},"#aa0055":{"lch":[36.3730398367095,93.6502679946689369,354.384147096436777],"luv":[36.3730398367095,93.2007806216229113,-9.16445235643848832],"rgb":[0.66666666666666663,0,0.333333333333333315],"xyz":[0.182167121566304047,0.092034228947616023,0.0941185268348384424],"hpluv":[354.384147096436777,326.714758289773386,36.3730398367095],"hsluv":[354.384147096436777,99.9999999999973,36.3730398367095]},"#aa0066":{"lch":[36.9423385777606228,88.2319659172366926,346.039412913085584],"luv":[36.9423385777606228,85.6257622699194,-21.2863488018886251],"rgb":[0.66666666666666663,0,0.4],"xyz":[0.189752117339812232,0.0950682272570193415,0.134066171241982418],"hpluv":[346.039412913085584,303.068568849792825,36.9423385777606228],"hsluv":[346.039412913085584,99.9999999999976126,36.9423385777606228]},"#aa0077":{"lch":[37.6250775946346891,84.9907340508927689,336.365700313169],"luv":[37.6250775946346891,77.8619577045834319,-34.0725757306260348],"rgb":[0.66666666666666663,0,0.466666666666666674],"xyz":[0.199066130360014137,0.0987938324651001509,0.183119973148380327],"hpluv":[336.365700313169,286.637826777930513,37.6250775946346891],"hsluv":[336.365700313169,99.9999999999979536,37.6250775946346891]},"#aa0088":{"lch":[38.4195160158879432,84.5572797483387717,326.161033183527252],"luv":[38.4195160158879432,70.2337789048813761,-47.0866208086656215],"rgb":[0.66666666666666663,0,0.533333333333333326],"xyz":[0.210206547461958,0.103249999305877749,0.241792836551952495],"hpluv":[326.161033183527252,279.279102381419364,38.4195160158879432],"hsluv":[326.161033183527252,99.9999999999982379,38.4195160158879432]},"#aa0099":{"lch":[39.3220484546604681,86.9871636461465272,316.374304421046759],"luv":[39.3220484546604681,62.9667468975572859,-60.0162929906574334],"rgb":[0.66666666666666663,0,0.6],"xyz":[0.223263511571030693,0.108472784949506906,0.310559514193070374],"hpluv":[316.374304421046759,280.710309296009257,39.3220484546604681],"hsluv":[316.374304421046759,99.9999999999986,39.3220484546604681]},"#aa00aa":{"lch":[40.3276007574525863,91.8597353001339627,307.715012949243601],"luv":[40.3276007574525863,56.1937545325413,-72.6668626056414411],"rgb":[0.66666666666666663,0,0.66666666666666663],"xyz":[0.238321204536283249,0.114495862135608,0.389863363810069],"hpluv":[307.715012949243601,289.042783730483393,40.3276007574525863],"hsluv":[307.715012949243601,99.9999999999988205,40.3276007574525863]},"#aa00bb":{"lch":[41.4300227805658849,98.5480850422065089,300.471226581677797],"luv":[41.4300227805658849,49.974285465742625,-84.9370111180893304],"rgb":[0.66666666666666663,0,0.733333333333333282],"xyz":[0.255458796643619868,0.121350898978542759,0.480121348908710721],"hpluv":[300.471226581677797,301.836908489583834,41.4300227805658849],"hsluv":[300.471226581677797,99.9999999999990621,41.4300227805658849]},"#aa00cc":{"lch":[42.6224565622471445,106.453892931925211,294.601049164416338],"luv":[42.6224565622471445,44.3164832708711813,-96.7909119228886681],"rgb":[0.66666666666666663,0,0.8],"xyz":[0.274751172087341622,0.129067849156031561,0.581727859578980877],"hpluv":[294.601049164416338,316.929304470761622,42.6224565622471445],"hsluv":[294.601049164416338,99.9999999999992895,42.6224565622471445]},"#aa00dd":{"lch":[43.8976622887243266,115.112632227118652,289.907671140995035],"luv":[43.8976622887243266,39.1964773946494063,-108.233794436426436],"rgb":[0.66666666666666663,0,0.866666666666666696],"xyz":[0.296269497637975165,0.137675179376285095,0.695057707478986875],"hpluv":[289.907671140995035,332.752186796280228,43.8976622887243266],"hsluv":[289.907671140995035,99.9999999999994174,43.8976622887243266]},"#aa00ee":{"lch":[45.2482911917969233,124.202454763835647,286.162342623679535],"luv":[45.2482911917969233,34.5729825657367655,-119.293581746345012],"rgb":[0.66666666666666663,0,0.933333333333333348],"xyz":[0.320081677904149875,0.14720005148275514,0.820468523547510098],"hpluv":[286.162342623679535,348.311106794177135,45.2482911917969233],"hsluv":[286.162342623679535,99.9999999999996589,45.2482911917969233]},"#aa00ff":{"lch":[46.667101462293175,133.514790614533382,283.159905061129905],"luv":[46.667101462293175,30.397247590160724,-130.008486845225434],"rgb":[0.66666666666666663,0,1],"xyz":[0.346252726313981296,0.157668470846687836,0.958302711839291943],"hpluv":[283.159905061129905,363.042841924949244,46.667101462293175],"hsluv":[283.159905061129905,99.9999999999998153,46.667101462293175]},"#881100":{"lch":[28.4751123640698864,88.1761994811112,13.8943544232398857],"luv":[28.4751123640698864,85.5961768878489124,21.1739617718743069],"rgb":[0.533333333333333326,0.0666666666666666657,0],"xyz":[0.103535562162309969,0.0563608058772578496,0.00542740663443661096],"hpluv":[13.8943544232398857,392.939109149716501,28.4751123640698864],"hsluv":[13.8943544232398857,100.000000000002331,28.4751123640698864]},"#881111":{"lch":[28.5813012406410962,85.6429421929893522,12.1770506300617782],"luv":[28.5813012406410962,83.7160154193071548,18.0649469909557752],"rgb":[0.533333333333333326,0.0666666666666666657,0.0666666666666666657],"xyz":[0.104547227661947087,0.0567654720771127,0.0107555115991922433],"hpluv":[12.1770506300617782,380.232213605760478,28.5813012406410962],"hsluv":[12.1770506300617782,89.1001931926906536,28.5813012406410962]},"#881122":{"lch":[28.776819878520115,81.4294437186752589,8.91447414891876377],"luv":[28.776819878520115,80.445837197505071,12.6183034487767767],"rgb":[0.533333333333333326,0.0666666666666666657,0.133333333333333331],"xyz":[0.106422585800424116,0.0575156153325035238,0.0206323977951714393],"hpluv":[8.91447414891876377,359.069069298387092,28.776819878520115],"hsluv":[8.91447414891876377,89.5522119422979,28.776819878520115]},"#881133":{"lch":[29.0950676619922959,75.7256767264573227,3.35964558590209394],"luv":[29.0950676619922959,75.5955308554484162,4.43777313107212557],"rgb":[0.533333333333333326,0.0666666666666666657,0.2],"xyz":[0.10951033653288185,0.0587507156254866367,0.0368945516527825826],"hpluv":[3.35964558590209394,330.265430862114329,29.0950676619922959],"hsluv":[3.35964558590209394,90.2199940579986475,29.0950676619922959]},"#881144":{"lch":[29.5467689283324617,69.8105982852884779,355.112641815866198],"luv":[29.5467689283324617,69.5567752183087435,-5.94765955478224484],"rgb":[0.533333333333333326,0.0666666666666666657,0.266666666666666663],"xyz":[0.113968331777100723,0.0605339137231742097,0.0603733266056692211],"hpluv":[355.112641815866198,299.81315922456514,29.5467689283324617],"hsluv":[355.112641815866198,91.0462468049379083,29.5467689283324617]},"#881155":{"lch":[30.1372440361953267,65.3247498846549,344.189828060851937],"luv":[30.1372440361953267,62.8534910411243928,-17.7977979378353552],"rgb":[0.533333333333333326,0.0666666666666666657,0.333333333333333315],"xyz":[0.119930745816462722,0.0629188793389190426,0.0917753738796431295],"hpluv":[344.189828060851937,275.05120204756264,30.1372440361953267],"hsluv":[344.189828060851937,91.9552565263170294,30.1372440361953267]},"#881166":{"lch":[30.8672249177773494,63.7021552959616173,331.50461515751158],"luv":[30.8672249177773494,55.9849923977636479,-30.3915319714745138],"rgb":[0.533333333333333326,0.0666666666666666657,0.4],"xyz":[0.127515741589970893,0.0659528776483223611,0.131723018286787091],"hpluv":[331.50461515751158,261.876101180723595,30.8672249177773494],"hsluv":[331.50461515751158,92.8754029221989299,30.8672249177773494]},"#881177":{"lch":[31.7336031237729514,65.5512880923603376,318.81152503011009],"luv":[31.7336031237729514,49.3304506912780525,-43.1680206305895737],"rgb":[0.533333333333333326,0.0666666666666666657,0.466666666666666674],"xyz":[0.136829754610172827,0.0696784828564031705,0.180776820193185],"hpluv":[318.81152503011009,262.120610410187965,31.7336031237729514],"hsluv":[318.81152503011009,93.7528273751248094,31.7336031237729514]},"#881188":{"lch":[32.7302234117729114,70.4946015177073377,307.715012949243658],"luv":[32.7302234117729114,43.1239685223607268,-55.7656900075914663],"rgb":[0.533333333333333326,0.0666666666666666657,0.533333333333333326],"xyz":[0.147970171712116627,0.0741346496971807684,0.239449683596757168],"hpluv":[307.715012949243658,273.304143969878908,32.7302234117729114],"hsluv":[307.715012949243658,94.5549099834012736,32.7302234117729114]},"#881199":{"lch":[33.8487030992268245,77.6382380820710836,298.861624073140206],"luv":[33.8487030992268245,37.4756592651389795,-67.9946393117248249],"rgb":[0.533333333333333326,0.0666666666666666657,0.6],"xyz":[0.161027135821189354,0.0793574353408099259,0.308216361237875103],"hpluv":[298.861624073140206,291.053592363859707,33.8487030992268245],"hsluv":[298.861624073140206,95.267111116431,33.8487030992268245]},"#8811aa":{"lch":[35.0792182273937954,86.1162494337963551,292.107316515455238],"luv":[35.0792182273937954,32.4092110837954692,-79.7850327659882623],"rgb":[0.533333333333333326,0.0666666666666666657,0.66666666666666663],"xyz":[0.176084828786441883,0.0853805125269110343,0.387520210854873703],"hpluv":[292.107316515455238,311.511817997128389,35.0792182273937954],"hsluv":[292.107316515455238,95.8874450484264571,35.0792182273937954]},"#8811bb":{"lch":[36.4111998559147381,95.3124415598142,287.019214731984619],"luv":[36.4111998559147381,27.8972267898096504,-91.1383906678789515],"rgb":[0.533333333333333326,0.0666666666666666657,0.733333333333333282],"xyz":[0.193222420893778557,0.0922355493698457929,0.47777819595351545],"hpluv":[287.019214731984619,332.16504711372977,36.4111998559147381],"hsluv":[287.019214731984619,96.4212920970111753,36.4111998559147381]},"#8811cc":{"lch":[37.8339039869932847,104.849214202707898,283.169050576302368],"luv":[37.8339039869932847,23.8872658659353974,-102.091900993053514],"rgb":[0.533333333333333326,0.0666666666666666657,0.8],"xyz":[0.212514796337500284,0.0999524995473346,0.579384706623785606],"hpluv":[283.169050576302368,351.660305548048939,37.8339039869932847],"hsluv":[283.169050576302368,96.8775739500717776,37.8339039869932847]},"#8811dd":{"lch":[39.3368423655390274,114.513051177954694,280.22024610097435],"luv":[39.3368423655390274,20.3183376083265372,-112.696069349906494],"rgb":[0.533333333333333326,0.0666666666666666657,0.866666666666666696],"xyz":[0.234033121888133827,0.108559829767588129,0.692714554523791604],"hpluv":[280.22024610097435,369.398236331583689,39.3368423655390274],"hsluv":[280.22024610097435,97.2663289333616348,39.3368423655390274]},"#8811ee":{"lch":[40.9100807353410261,124.189527798253138,277.928390028110698],"luv":[40.9100807353410261,17.130123009315259,-123.002429652583771],"rgb":[0.533333333333333326,0.0666666666666666657,0.933333333333333348],"xyz":[0.257845302154308564,0.118084701874058146,0.818125370592314827],"hpluv":[277.928390028110698,385.206818333834917,40.9100807353410261],"hsluv":[277.928390028110698,97.5973562787359867,40.9100807353410261]},"#8811ff":{"lch":[42.5444231432324926,133.820472646418182,276.120297984259253],"luv":[42.5444231432324926,14.2674470621751119,-133.057727523202459],"rgb":[0.533333333333333326,0.0666666666666666657,1],"xyz":[0.28401635056414,0.128553121237990842,0.955959558884096672],"hpluv":[276.120297984259253,399.134479754608662,42.5444231432324926],"hsluv":[276.120297984259253,99.9999999999993605,42.5444231432324926]},"#aa1100":{"lch":[35.8849415951509485,114.659477700983,13.2232466646238507],"luv":[35.8849415951509485,111.619416231509064,26.2278810962561089],"rgb":[0.66666666666666663,0.0666666666666666657,0],"xyz":[0.167776338173079714,0.0894849560078117,0.00843869300994137816],"hpluv":[13.2232466646238507,405.449754626827882,35.8849415951509485],"hsluv":[13.2232466646238507,100.000000000002245,35.8849415951509485]},"#aa1111":{"lch":[35.9630348414680086,112.584844162769954,12.1770506300617871],"luv":[35.9630348414680086,110.051736997450746,23.747890832642895],"rgb":[0.66666666666666663,0.0666666666666666657,0.0666666666666666657],"xyz":[0.168788003672716846,0.089889622207666553,0.0137667979746970096],"hpluv":[12.1770506300617871,397.249101663635656,35.9630348414680086],"hsluv":[12.1770506300617871,93.0877775141683514,35.9630348414680086]},"#aa1122":{"lch":[36.1071812157442409,108.986817867719594,10.2082214608018411],"luv":[36.1071812157442409,107.261576994584843,19.3152936702042],"rgb":[0.66666666666666663,0.0666666666666666657,0.133333333333333331],"xyz":[0.170663361811193848,0.0906397654630573674,0.0236436841706762074],"hpluv":[10.2082214608018411,383.018466712830786,36.1071812157442409],"hsluv":[10.2082214608018411,93.272361347425246,36.1071812157442409]},"#aa1133":{"lch":[36.3427932754706546,103.718469067724868,6.89182233030552727],"luv":[36.3427932754706546,102.969049051934846,12.4457126390109512],"rgb":[0.66666666666666663,0.0666666666666666657,0.2],"xyz":[0.173751112543651609,0.0918748657560404802,0.0399058380282873507],"hpluv":[6.89182233030552727,362.140519718911037,36.3427932754706546],"hsluv":[6.89182233030552727,93.5557024333493388,36.3427932754706546]},"#aa1144":{"lch":[36.6792659124992824,97.4113439982971698,1.97455903872184],"luv":[36.6792659124992824,97.3535035649005778,3.35637947697775552],"rgb":[0.66666666666666663,0.0666666666666666657,0.266666666666666663],"xyz":[0.178209107787870469,0.0936580638537280602,0.0633846129811739822],"hpluv":[1.97455903872184,336.99870087691761,36.6792659124992824],"hsluv":[1.97455903872184,93.9250914747756696,36.6792659124992824]},"#aa1155":{"lch":[37.1226754299384396,91.055498296574811,355.267689161716703],"luv":[37.1226754299384396,90.7450919896636634,-7.51212685096688926],"rgb":[0.66666666666666663,0.0666666666666666657,0.333333333333333315],"xyz":[0.184171521827232454,0.0960430294694729,0.0947866602551479],"hpluv":[355.267689161716703,311.247759321881176,37.1226754299384396],"hsluv":[355.267689161716703,94.3576556410013154,37.1226754299384396]},"#aa1166":{"lch":[37.6762679798416,85.8108023849569577,346.783206271719791],"luv":[37.6762679798416,83.5378398512485205,-19.6194576616503156],"rgb":[0.66666666666666663,0.0666666666666666657,0.4],"xyz":[0.191756517600740639,0.0990770277788762116,0.134734304662291859],"hpluv":[346.783206271719791,289.010360822200312,37.6762679798416],"hsluv":[346.783206271719791,94.8263018378468558,37.6762679798416]},"#aa1177":{"lch":[38.3408051028578285,82.7345113545946163,336.916515476294876],"luv":[38.3408051028578285,76.110335477500783,-32.4378822148708],"rgb":[0.66666666666666663,0.0666666666666666657,0.466666666666666674],"xyz":[0.201070530620942545,0.102802632986957021,0.183788106568689769],"hpluv":[336.916515476294876,273.819772016881302,38.3408051028578285],"hsluv":[336.916515476294876,95.3051408978498387,38.3408051028578285]},"#aa1188":{"lch":[39.1148927869010379,82.477083595297529,326.495944929629673],"luv":[39.1148927869010379,68.7732486834780445,-45.5270203714912753],"rgb":[0.66666666666666663,0.0666666666666666657,0.533333333333333326],"xyz":[0.212210947722886401,0.107258799827734619,0.242460969972261936],"hpluv":[326.495944929629673,267.565723971153261,39.1148927869010379],"hsluv":[326.495944929629673,95.7730681487448,39.1148927869010379]},"#aa1199":{"lch":[39.9953287808464424,85.1038505069809617,316.515705271857257],"luv":[39.9953287808464424,61.7482074461545665,-58.5647013848890552],"rgb":[0.66666666666666663,0.0666666666666666657,0.6],"xyz":[0.2252679118319591,0.112481585471363776,0.311227647613379843],"hpluv":[316.515705271857257,270.00963724100518,39.9953287808464424],"hsluv":[316.515705271857257,96.2151887572794,39.9953287808464424]},"#aa11aa":{"lch":[40.9774666162921406,90.1875437006381588,307.715012949243601],"luv":[40.9774666162921406,55.1708175083225498,-71.3440532505540261],"rgb":[0.66666666666666663,0.0666666666666666657,0.66666666666666663],"xyz":[0.240325604797211656,0.118504662657464871,0.390531497230378444],"hpluv":[307.715012949243601,279.28060733669264,40.9774666162921406],"hsluv":[307.715012949243601,96.6225842874192864,40.9774666162921406]},"#aa11bb":{"lch":[42.0555802442747719,97.087212137786878,300.384453602166161],"luv":[42.0555802442747719,49.106684193967304,-83.7523750598249705],"rgb":[0.66666666666666663,0.0666666666666666657,0.733333333333333282],"xyz":[0.257463196904548275,0.12535969950039963,0.48078948232902019],"hpluv":[300.384453602166161,292.939359498794147,42.0555802442747719],"hsluv":[300.384453602166161,96.9911870522472697,42.0555802442747719]},"#aa11cc":{"lch":[43.2232098485165395,105.192683835863036,294.469145625450437],"luv":[43.2232098485165395,43.5711419401365,-95.7447456658814247],"rgb":[0.66666666666666663,0.0666666666666666657,0.8],"xyz":[0.276755572348270029,0.133076649677888431,0.582395992999290346],"hpluv":[294.469145625450437,308.821726609797679,43.2232098485165395],"hsluv":[294.469145625450437,97.3204020480748255,43.2232098485165395]},"#aa11dd":{"lch":[44.4734721926781518,114.032755796715193,289.757274940509092],"luv":[44.4734721926781518,38.5472014936014489,-107.320001172218454],"rgb":[0.66666666666666663,0.0666666666666666657,0.866666666666666696],"xyz":[0.298273897898903573,0.141683979898141965,0.695725840899296344],"hpluv":[289.757274940509092,325.362808980276498,44.4734721926781518],"hsluv":[289.757274940509092,97.611854654502622,44.4734721926781518]},"#aa11ee":{"lch":[45.7993244881172,123.283094749558884,286.008743686799619],"luv":[45.7993244881172,33.9995108001485136,-118.502129585840351],"rgb":[0.66666666666666663,0.0666666666666666657,0.933333333333333348],"xyz":[0.322086078165078282,0.151208852004612,0.821136656967819567],"hpluv":[286.008743686799619,341.573194884792258,45.7993244881172],"hsluv":[286.008743686799619,97.8684161167955153,45.7993244881172]},"#aa11ff":{"lch":[47.1937769411101868,132.735165800167636,283.011169167098501],"luv":[47.1937769411101868,29.8841269734434611,-129.327348983241365],"rgb":[0.66666666666666663,0.0666666666666666657,1],"xyz":[0.348257126574909703,0.161677271368544706,0.958970845259601412],"hpluv":[283.011169167098501,356.89510187446183,47.1937769411101868],"hsluv":[283.011169167098501,99.9999999999993321,47.1937769411101868]},"#882200":{"lch":[30.3496916993887922,81.7292062801124786,17.2000641303745212],"luv":[30.3496916993887922,78.0741152618852254,24.1680716080335465],"rgb":[0.533333333333333326,0.133333333333333331,0],"xyz":[0.107251185897077911,0.0637920533467938311,0.00666594787935922105],"hpluv":[17.2000641303745212,341.713647377264522,30.3496916993887922],"hsluv":[17.2000641303745212,100.000000000002359,30.3496916993887922]},"#882211":{"lch":[30.4474919309639347,79.3871193031655338,15.4743840495427136],"luv":[30.4474919309639347,76.5093230935452908,21.181080969170015],"rgb":[0.533333333333333326,0.133333333333333331,0.0666666666666666657],"xyz":[0.108262851396715029,0.064196719546648684,0.0119940528441148525],"hpluv":[15.4743840495427136,330.855109199112462,30.4474919309639347],"hsluv":[15.4743840495427136,90.2707057474005,30.4474919309639347]},"#882222":{"lch":[30.6277058928754826,75.4670009360781648,12.1770506300618102],"luv":[30.6277058928754826,73.7690281561900321,15.9185022906448506],"rgb":[0.533333333333333326,0.133333333333333331,0.133333333333333331],"xyz":[0.110138209535192058,0.0649468628020395,0.0218709390400940486],"hpluv":[12.1770506300618102,312.666930334371557,30.6277058928754826],"hsluv":[12.1770506300618102,73.2675530922876277,30.6277058928754826]},"#882233":{"lch":[30.9214262019897674,70.1124269978110135,6.50693872003014],"luv":[30.9214262019897674,69.6607724946186266,7.94538828354938],"rgb":[0.533333333333333326,0.133333333333333331,0.2],"xyz":[0.113225960267649792,0.0661819630950226112,0.0381330928977051953],"hpluv":[6.50693872003014,287.723152758323693,30.9214262019897674],"hsluv":[6.50693872003014,74.8097141082451458,30.9214262019897674]},"#882244":{"lch":[31.3391119188553589,64.5127804411509,357.965654494967],"luv":[31.3391119188553589,64.472119792654567,-2.29011128326569047],"rgb":[0.533333333333333326,0.133333333333333331,0.266666666666666663],"xyz":[0.117683955511868665,0.0679651611927101912,0.0616118678505918338],"hpluv":[357.965654494967,261.215173773686786,31.3391119188553589],"hsluv":[357.965654494967,76.7464797952550839,31.3391119188553589]},"#882255":{"lch":[31.8864840032734449,60.2907989794282599,346.464164292394514],"luv":[31.8864840032734449,58.6161449596217778,-14.1112717942230379],"rgb":[0.533333333333333326,0.133333333333333331,0.333333333333333315],"xyz":[0.123646369551230664,0.0703501268084550241,0.0930139151245657353],"hpluv":[346.464164292394514,239.929545755427228,31.8864840032734449],"hsluv":[346.464164292394514,78.9147131880069566,31.8864840032734449]},"#882266":{"lch":[32.565220274416383,58.9629659850378189,332.945096803324191],"luv":[32.565220274416383,52.5107124518348698,-26.8189566455043362],"rgb":[0.533333333333333326,0.133333333333333331,0.4],"xyz":[0.131231365324738836,0.0733841251178583426,0.132961559531709711],"hpluv":[332.945096803324191,229.754818264706444,32.565220274416383],"hsluv":[332.945096803324191,81.1505919454384923,32.565220274416383]},"#882277":{"lch":[33.3735533542235316,61.2256527964903086,319.411642653163199],"luv":[33.3735533542235316,46.4949769025583564,-39.8346291960518499],"rgb":[0.533333333333333326,0.133333333333333331,0.466666666666666674],"xyz":[0.140545378344940741,0.077109730325939152,0.18201536143810762],"hpluv":[319.411642653163199,232.79320602780777,33.3735533542235316],"hsluv":[319.411642653163199,83.3222334130424116,33.3735533542235316]},"#882288":{"lch":[34.3068967831130962,66.691064714973308,307.715012949243771],"luv":[34.3068967831130962,40.7972144472485709,-52.7568517461189046],"rgb":[0.533333333333333326,0.133333333333333331,0.533333333333333326],"xyz":[0.151685795446884597,0.0815658971667167498,0.240688224841679788],"hpluv":[307.715012949243771,246.675229855048,34.3068967831130962],"hsluv":[307.715012949243771,85.3421167175917,34.3068967831130962]},"#882299":{"lch":[35.3585028262625087,74.3915148492043699,298.539568373309862],"luv":[35.3585028262625087,35.5417034620318262,-65.3520068289902554],"rgb":[0.533333333333333326,0.133333333333333331,0.6],"xyz":[0.164742759555957297,0.0867886828103459074,0.309454902482797667],"hpluv":[298.539568373309862,266.973934190138948,35.3585028262625087],"hsluv":[298.539568373309862,87.1641407220543556,35.3585028262625087]},"#8822aa":{"lch":[36.5201138266519365,83.3993900511107142,291.653660077047903],"luv":[36.5201138266519365,30.7739719973965897,-77.5140045953036463],"rgb":[0.533333333333333326,0.133333333333333331,0.66666666666666663],"xyz":[0.179800452521209853,0.092811759996447,0.388758752099796268],"hpluv":[291.653660077047903,289.781114528802732,36.5201138266519365],"hsluv":[291.653660077047903,88.7734689989794532,36.5201138266519365]},"#8822bb":{"lch":[37.7825623664262196,93.0686060696910857,286.53575696187113],"luv":[37.7825623664262196,26.4885972028076893,-89.2195026548722],"rgb":[0.533333333333333326,0.133333333333333331,0.733333333333333282],"xyz":[0.196938044628546471,0.0996667968393817605,0.479016737198438],"hpluv":[286.53575696187113,312.57276028475934,37.7825623664262196],"hsluv":[286.53575696187113,90.1753980157506874,37.7825623664262196]},"#8822cc":{"lch":[39.1362858369643476,103.012880313051866,282.702767559286599],"luv":[39.1362858369643476,22.6518448072254479,-100.491529181421669],"rgb":[0.533333333333333326,0.133333333333333331,0.8],"xyz":[0.216230420072268226,0.107383747016870562,0.580623247868708225],"hpluv":[282.702767559286599,334.003678399645651,39.1362858369643476],"hsluv":[282.702767559286599,91.3862929083300628,39.1362858369643476]},"#8822dd":{"lch":[40.5717373677475379,113.020349666590874,279.789793007972776],"luv":[40.5717373677475379,19.2172965257181652,-111.374570495248548],"rgb":[0.533333333333333326,0.133333333333333331,0.866666666666666696],"xyz":[0.237748745622901769,0.115991077237124096,0.693953095768714223],"hpluv":[279.789793007972776,353.486121759760863,40.5717373677475379],"hsluv":[279.789793007972776,92.4273238443811209,40.5717373677475379]},"#8822ee":{"lch":[42.0796906219744145,122.982600065668066,277.538986095624125],"luv":[42.0796906219744145,16.1354126197819454,-121.919515986988074],"rgb":[0.533333333333333326,0.133333333333333331,0.933333333333333348],"xyz":[0.261560925889076534,0.125515949343594141,0.819363911837237446],"hpluv":[277.538986095624125,370.860397035002336,42.0796906219744145],"hsluv":[277.538986095624125,93.320628909539181,42.0796906219744145]},"#8822ff":{"lch":[43.6514473624058752,132.848943476626658,275.771185477405766],"luv":[43.6514473624058752,13.3587518063908028,-132.175585994657865],"rgb":[0.533333333333333326,0.133333333333333331,1],"xyz":[0.2877319742989079,0.135984368707526837,0.957198100129019291],"hpluv":[275.771185477405766,386.188007357759091,43.6514473624058752],"hsluv":[275.771185477405766,99.9999999999994,43.6514473624058752]},"#ffaa00":{"lch":[76.0766826449234799,103.646966048157225,46.9849230608437125],"luv":[76.0766826449234799,70.7070052858721,75.7839889059127785],"rgb":[1,0.66666666666666663,0],"xyz":[0.556131758114240538,0.500120923568095,0.0672444716650198171],"hpluv":[46.9849230608437125,173.218766512771339,76.0766826449234799],"hsluv":[46.9849230608437125,100.0000000000028,76.0766826449234799]},"#ffaa11":{"lch":[76.1015101579349533,102.726050652762069,46.6846637022245687],"luv":[76.1015101579349533,70.4714195905473275,74.7423608377930719],"rgb":[1,0.66666666666666663,0.0666666666666666657],"xyz":[0.557143423613877697,0.500525589767949919,0.0725725766297754538],"hpluv":[46.6846637022245687,171.896872437304751,76.1015101579349533],"hsluv":[46.6846637022245687,100.000000000002771,76.1015101579349533]},"#ffaa22":{"lch":[76.1474983763177,101.038792737361192,46.1176753587789605],"luv":[76.1474983763177,70.0380208569547591,72.8252241483965719],"rgb":[1,0.66666666666666663,0.133333333333333331],"xyz":[0.559018781752354643,0.501275733023340719,0.0824494628257546464],"hpluv":[46.1176753587789605,169.470349592440897,76.1474983763177],"hsluv":[46.1176753587789605,100.0000000000028,76.1474983763177]},"#ffaa33":{"lch":[76.2231174741888395,98.3169656691378577,45.1538509265191337],"luv":[76.2231174741888395,69.3336656617894533,69.7070193329597885],"rgb":[1,0.66666666666666663,0.2],"xyz":[0.56210653248481246,0.502510833316323846,0.0987116166833657827],"hpluv":[45.1538509265191337,165.543337136749699,76.2231174741888395],"hsluv":[45.1538509265191337,100.000000000002927,76.2231174741888395]},"#ffaa44":{"lch":[76.3320756204529118,94.5107446089494516,43.6926927141772694],"luv":[76.3320756204529118,68.3364903114306514,65.2870962629968119],"rgb":[1,0.66666666666666663,0.266666666666666663],"xyz":[0.56656452772903132,0.504294031414011412,0.122190391636252421],"hpluv":[43.6926927141772694,160.025535099593441,76.3320756204529118],"hsluv":[43.6926927141772694,100.000000000003,76.3320756204529118]},"#ffaa55":{"lch":[76.4774026026215,89.6489515946998807,41.6012791226812411],"luv":[76.4774026026215,67.0379860163697288,59.5217855318358247],"rgb":[1,0.66666666666666663,0.333333333333333315],"xyz":[0.572526941768393249,0.506678997029756162,0.153592438910226337],"hpluv":[41.6012791226812411,152.933128718005122,76.4774026026215],"hsluv":[41.6012791226812411,100.000000000003,76.4774026026215]},"#ffaa66":{"lch":[76.6616205587261,83.8466863985853905,38.6944265301345354],"luv":[76.6616205587261,65.4416029270402788,52.418159318716242],"rgb":[1,0.66666666666666663,0.4],"xyz":[0.58011193754190149,0.50971299533915948,0.193540083317370298],"hpluv":[38.6944265301345354,144.405277715469396,76.6616205587261],"hsluv":[38.6944265301345354,100.000000000003197,76.6616205587261]},"#ffaa77":{"lch":[76.8868341725165,77.3210793721064533,34.7099370327462324],"luv":[76.8868341725165,63.5614296008349058,44.0283315873505927],"rgb":[1,0.66666666666666663,0.466666666666666674],"xyz":[0.58942595056210334,0.513438600547240331,0.242593885223768208],"hpluv":[34.7099370327462324,134.738986801151128,76.8868341725165],"hsluv":[34.7099370327462324,100.000000000003354,76.8868341725165]},"#ffaa88":{"lch":[77.1547840912050873,70.4186738688562741,29.282319230158226],"luv":[77.1547840912050873,61.4205932059712723,34.4427112706728948],"rgb":[1,0.66666666666666663,0.533333333333333326],"xyz":[0.600566367664047251,0.517894767388017874,0.301266748627340375],"hpluv":[29.282319230158226,124.451835787871019,77.1547840912050873],"hsluv":[29.282319230158226,100.000000000003638,77.1547840912050873]},"#ffaa99":{"lch":[77.466881654564645,63.658531214354845,21.9370110659791244],"luv":[77.466881654564645,59.0493431107362383,23.7820031654092716],"rgb":[1,0.66666666666666663,0.6],"xyz":[0.613623331773119896,0.523117553031647087,0.370033426268458254],"hpluv":[21.9370110659791244,114.385173247539697,77.466881654564645],"hsluv":[21.9370110659791244,100.000000000003624,77.466881654564645]},"#ffaaaa":{"lch":[77.8242336850598,57.783013099698,12.1770506300621957],"luv":[77.8242336850598,56.482921905318662,12.1883606739193855],"rgb":[1,0.66666666666666663,0.66666666666666663],"xyz":[0.628681024738372507,0.529140630217748154,0.44933727588545691],"hpluv":[12.1770506300621957,105.841692205508735,77.8242336850598],"hsluv":[12.1770506300621957,100.000000000003837,77.8242336850598]},"#ffaabb":{"lch":[78.227662021793833,53.7597014753195,359.804273109779956],"luv":[78.227662021793833,53.7593877986938224,-0.183647012281759531],"rgb":[1,0.66666666666666663,0.733333333333333282],"xyz":[0.64581861684570907,0.535995667060682912,0.539595260984098601],"hpluv":[359.804273109779956,100.661858044669231,78.227662021793833],"hsluv":[359.804273109779956,100.000000000004135,78.227662021793833]},"#ffaacc":{"lch":[78.6777204654413254,52.5946111834740293,345.492217824016791],"luv":[78.6777204654413254,50.9175596191628586,-13.1755549397286202],"rgb":[1,0.66666666666666663,0.8],"xyz":[0.665110992289430825,0.543712617238171769,0.641201771654368757],"hpluv":[345.492217824016791,100.966318741741958,78.6777204654413254],"hsluv":[345.492217824016791,100.000000000004306,78.6777204654413254]},"#ffaadd":{"lch":[79.1747106956411244,54.8892328831665353,330.97422205899818],"luv":[79.1747106956411244,47.9952274547753177,-26.6324243745640352],"rgb":[1,0.66666666666666663,0.866666666666666696],"xyz":[0.686629317840064424,0.552319947458425275,0.754531619554374755],"hpluv":[330.97422205899818,108.36723319715793,79.1747106956411244],"hsluv":[330.97422205899818,100.000000000004704,79.1747106956411244]},"#ffaaee":{"lch":[79.718698064048283,60.5009523664383337,318.094564198374599],"luv":[79.718698064048283,45.0277239197174595,-40.4087777080146822],"rgb":[1,0.66666666666666663,0.933333333333333348],"xyz":[0.710441498106239133,0.561844819564895293,0.879942435622898],"hpluv":[318.094564198374599,123.247069988098687,79.718698064048283],"hsluv":[318.094564198374599,100.000000000004945,79.718698064048283]},"#ffaaff":{"lch":[80.3095277487323074,68.733917080261989,307.715012949245647],"luv":[80.3095277487323074,42.0468973903394,-54.3728772187255203],"rgb":[1,0.66666666666666663,1],"xyz":[0.736612546516070554,0.572313238928828,1.01777662391468],"hpluv":[307.715012949245647,144.979279509576116,80.3095277487323074],"hsluv":[307.715012949245647,100.000000000005301,80.3095277487323074]},"#aa2200":{"lch":[37.2831780533064929,108.910935722579069,15.2092016225530191],"luv":[37.2831780533064929,105.096262108869439,28.5721474641225],"rgb":[0.66666666666666663,0.133333333333333331,0],"xyz":[0.171491961907847656,0.0969162034773476816,0.00967723425486398912],"hpluv":[15.2092016225530191,370.67892165569458,37.2831780533064929],"hsluv":[15.2092016225530191,100.000000000002217,37.2831780533064929]},"#aa2211":{"lch":[37.3572350214345619,106.95640568906397,14.158492547926917],"luv":[37.3572350214345619,103.707370245599336,26.1620732103901794],"rgb":[0.66666666666666663,0.133333333333333331,0.0666666666666666657],"xyz":[0.172503627407484789,0.0973208696772025345,0.0150053392196196206],"hpluv":[14.158492547926917,363.305022455593,37.3572350214345619],"hsluv":[14.158492547926917,93.5777596020973732,37.3572350214345619]},"#aa2222":{"lch":[37.4939757158163331,103.55828406892158,12.1770506300617907],"luv":[37.4939757158163331,101.228270350344232,21.8438888748564],"rgb":[0.66666666666666663,0.133333333333333331,0.133333333333333331],"xyz":[0.17437898554596179,0.0980710129325933488,0.0248822254155988166],"hpluv":[12.1770506300617907,350.479546677114797,37.4939757158163331],"hsluv":[12.1770506300617907,82.128221128038831,37.4939757158163331]},"#aa2233":{"lch":[37.7176061419824791,98.5638584928897359,8.82735266140639],"luv":[37.7176061419824791,97.3963926843060506,15.125372494284127],"rgb":[0.66666666666666663,0.133333333333333331,0.2],"xyz":[0.177466736278419523,0.0993061132255764617,0.0411443792732099634],"hpluv":[8.82735266140639,331.598763076121088,37.7176061419824791],"hsluv":[8.82735266140639,82.8309253801110401,37.7176061419824791]},"#aa2244":{"lch":[38.0372287502177358,92.5577577991589209,3.83362915136278648],"luv":[38.0372287502177358,92.350650343690134,6.18836892123021798],"rgb":[0.66666666666666663,0.133333333333333331,0.266666666666666663],"xyz":[0.181924731522638411,0.101089311323264042,0.0646231542260966],"hpluv":[3.83362915136278648,308.775819843535,38.0372287502177358],"hsluv":[3.83362915136278648,83.7532195801290698,38.0372287502177358]},"#aa2255":{"lch":[38.4588905236098242,86.4856662057644172,356.973865768881865],"luv":[38.4588905236098242,86.3650670431288603,-4.56570407393633459],"rgb":[0.66666666666666663,0.133333333333333331,0.333333333333333315],"xyz":[0.187887145562000424,0.103474276939008875,0.0960252015000705],"hpluv":[356.973865768881865,285.355803984318584,38.4588905236098242],"hsluv":[356.973865768881865,84.8422496447961,38.4588905236098242]},"#aa2266":{"lch":[38.9860395203518237,81.4924101374980268,348.227712846231327],"luv":[38.9860395203518237,79.7783138580272464,-16.6262908668256522],"rgb":[0.66666666666666663,0.133333333333333331,0.4],"xyz":[0.195472141335508581,0.106508275248412193,0.135972845907214479],"hpluv":[348.227712846231327,265.245100213362434,38.9860395203518237],"hsluv":[348.227712846231327,86.0332228090823747,38.9860395203518237]},"#aa2277":{"lch":[39.619833929041036,78.6591168776988354,337.990195281021442],"luv":[39.619833929041036,72.9264197190586572,-29.4787037526953952],"rgb":[0.66666666666666663,0.133333333333333331,0.466666666666666674],"xyz":[0.204786154355710515,0.110233880456493,0.185026647813612388],"hpluv":[337.990195281021442,251.92759566726761,39.619833929041036],"hsluv":[337.990195281021442,87.2621982611374278,39.619833929041036]},"#aa2288":{"lch":[40.3594266716885386,78.6767938432408,327.148786779116733],"luv":[40.3594266716885386,66.0949636498191637,-42.6789605025813046],"rgb":[0.66666666666666663,0.133333333333333331,0.533333333333333326],"xyz":[0.215926571457654315,0.1146900472972706,0.243699511217184556],"hpluv":[327.148786779116733,247.366561360315984,40.3594266716885386],"hsluv":[327.148786779116733,88.4751585260979283,40.3594266716885386]},"#aa2299":{"lch":[41.2022629883412748,81.6302410017403162,316.790315261789033],"luv":[41.2022629883412748,59.4964385039503,-55.8898027492302489],"rgb":[0.66666666666666663,0.133333333333333331,0.6],"xyz":[0.228983535566727042,0.119912832940899758,0.312466188858302463],"hpluv":[316.790315261789033,251.402351399829286,41.2022629883412748],"hsluv":[316.790315261789033,89.6322731802278554,41.2022629883412748]},"#aa22aa":{"lch":[42.1443943233873242,87.0780915666379229,307.715012949243715],"luv":[42.1443943233873242,53.2686588598376076,-68.8842798769212834],"rgb":[0.66666666666666663,0.133333333333333331,0.66666666666666663],"xyz":[0.24404122853197957,0.125935910127000866,0.391770038475301063],"hpluv":[307.715012949243715,262.185344504614818,42.1443943233873242],"hsluv":[307.715012949243715,90.7081440057972515,42.1443943233873242]},"#aa22bb":{"lch":[43.1807973125030387,94.3504956605328573,300.218008125398399],"luv":[43.1807973125030387,47.4858085519839577,-81.5298351375283801],"rgb":[0.66666666666666663,0.133333333333333331,0.733333333333333282],"xyz":[0.261178820639316245,0.132790946969935625,0.48202802357394281],"hpluv":[300.218008125398399,277.263598469343151,43.1807973125030387],"hsluv":[300.218008125398399,91.6896384965505291,43.1807973125030387]},"#aa22cc":{"lch":[44.3056820912093627,102.813108633557576,294.217612554784239],"luv":[44.3056820912093627,42.1742864712375294,-93.764944769021767],"rgb":[0.66666666666666663,0.133333333333333331,0.8],"xyz":[0.280471196083037944,0.140507897147424426,0.583634534244213],"hpluv":[294.217612554784239,294.461411899371626,44.3056820912093627],"hsluv":[294.217612554784239,92.5728114271618097,44.3056820912093627]},"#aa22dd":{"lch":[45.5127751844210451,111.980933923074502,289.471886144522102],"luv":[45.5127751844210451,37.3282042805071441,-105.576203414769125],"rgb":[0.66666666666666663,0.133333333333333331,0.866666666666666696],"xyz":[0.301989521633671543,0.14911522736767796,0.696964382144219],"hpluv":[289.471886144522102,312.212361278410071,45.5127751844210451],"hsluv":[289.471886144522102,93.3598993754704622,45.5127751844210451]},"#aa22ee":{"lch":[46.7955661660676938,121.524022862348417,285.718434714393425],"luv":[46.7955661660676938,32.9220942551774698,-116.979587289842115],"rgb":[0.66666666666666663,0.133333333333333331,0.933333333333333348],"xyz":[0.325801701899846252,0.158640099474147978,0.822375198212742187],"hpluv":[285.718434714393425,329.531365671141714,46.7955661660676938],"hsluv":[285.718434714393425,94.0568560040361348,46.7955661660676938]},"#aa22ff":{"lch":[48.1475121680676921,131.233078667623346,282.730941389390409],"luv":[48.1475121680676921,28.9202258451599548,-128.006802450680539],"rgb":[0.66666666666666663,0.133333333333333331,1],"xyz":[0.351972750309677673,0.169108518838080701,0.960209386504524],"hpluv":[282.730941389390409,345.866733454918517,48.1475121680676921],"hsluv":[282.730941389390409,99.9999999999992,48.1475121680676921]},"#883300":{"lch":[33.1414787667816597,73.2165592554870841,22.9600016117944072],"luv":[33.1414787667816597,67.4161530625393084,28.5609323282788417],"rgb":[0.533333333333333326,0.2,0],"xyz":[0.113368907986088716,0.076027497524815621,0.00870518857569610102],"hpluv":[22.9600016117944072,280.334636286210525,33.1414787667816597],"hsluv":[22.9600016117944072,100.000000000002245,33.1414787667816597]},"#883311":{"lch":[33.2285118286029402,71.0572306739368287,21.2511434941679589],"luv":[33.2285118286029402,66.2253841559006844,25.7551650053430592],"rgb":[0.533333333333333326,0.2,0.0666666666666666657],"xyz":[0.114380573485725834,0.0764321637246704738,0.0140332935404517325],"hpluv":[21.2511434941679589,271.354302974885854,33.2285118286029402],"hsluv":[21.2511434941679589,91.7325092821930355,33.2285118286029402]},"#883322":{"lch":[33.389038834633638,67.403958774683133,17.9527330699243208],"luv":[33.389038834633638,64.1221355411587126,20.7760774002325519],"rgb":[0.533333333333333326,0.2,0.133333333333333331],"xyz":[0.116255931624202863,0.0771823069800612882,0.0239101797364309268],"hpluv":[17.9527330699243208,256.165602847605,33.389038834633638],"hsluv":[17.9527330699243208,77.1564226992543354,33.389038834633638]},"#883333":{"lch":[33.6510932573449324,62.3280121609532785,12.1770506300618564],"luv":[33.6510932573449324,60.9256605799824484,13.1470522486492083],"rgb":[0.533333333333333326,0.2,0.2],"xyz":[0.119343682356660596,0.0784174072730444,0.04017233359404207],"hpluv":[12.1770506300618564,235.030067027939708,33.6510932573449324],"hsluv":[12.1770506300618564,55.0748296144977,33.6510932573449324]},"#883344":{"lch":[34.0246284162643136,56.9037682047597428,3.23132728809417369],"luv":[34.0246284162643136,56.8132965471078748,3.20751794249172528],"rgb":[0.533333333333333326,0.2,0.266666666666666663],"xyz":[0.12380167760087947,0.080200605370731981,0.0636511085469287086],"hpluv":[3.23132728809417369,212.220318588139889,34.0246284162643136],"hsluv":[3.23132728809417369,58.083398150148156,34.0246284162643136]},"#883355":{"lch":[34.5156618951709859,52.7529688087382524,350.767304332875],"luv":[34.5156618951709859,52.0695471674777721,-8.46392201697997137],"rgb":[0.533333333333333326,0.2,0.333333333333333315],"xyz":[0.129764091640241469,0.0825855709864768139,0.0950531558209026239],"hpluv":[350.767304332875,193.941176615342812,34.5156618951709859],"hsluv":[350.767304332875,61.5291535706030714,34.5156618951709859]},"#883366":{"lch":[35.1268460128593318,51.5738240122621576,335.705329263136434],"luv":[35.1268460128593318,47.0065260432940519,-21.2189969741481157],"rgb":[0.533333333333333326,0.2,0.4],"xyz":[0.137349087413749654,0.0856195692958801324,0.135000800228046586],"hpluv":[335.705329263136434,186.307141954737205,35.1268460128593318],"hsluv":[335.705329263136434,65.1713869724459869,35.1268460128593318]},"#883377":{"lch":[35.8579115963162849,54.2604071268956929,320.552373035814298],"luv":[35.8579115963162849,41.9001950458929713,-34.4755773946224],"rgb":[0.533333333333333326,0.2,0.466666666666666674],"xyz":[0.14666310043395156,0.0893451745039609418,0.184054602134444495],"hpluv":[320.552373035814298,192.015984070736607,35.8579115963162849],"hsluv":[320.552373035814298,68.798738775930957,35.8579115963162849]},"#883388":{"lch":[36.7061150242973682,60.4128011412536097,307.715012949244056],"luv":[36.7061150242973682,36.9565850245806402,-47.7903480323547711],"rgb":[0.533333333333333326,0.2,0.533333333333333326],"xyz":[0.157803517535895388,0.0938013413447385397,0.242727465538016662],"hpluv":[307.715012949244056,208.847787272345244,36.7061150242973682],"hsluv":[307.715012949244056,72.2549736675254479,36.7061150242973682]},"#883399":{"lch":[37.6667130487112445,68.9141309342046213,297.955533412138379],"luv":[37.6667130487112445,32.3059919210196611,-60.8726566564636684],"rgb":[0.533333333333333326,0.2,0.6],"xyz":[0.170860481644968087,0.0990241269883677,0.311494143179134542],"hpluv":[297.955533412138379,232.161331922109071,37.6667130487112445],"hsluv":[297.955533412138379,75.4431641885032604,37.6667130487112445]},"#8833aa":{"lch":[38.7334497692602824,78.7159372772915162,290.848124870138179],"luv":[38.7334497692602824,28.0143748789862741,-73.5621749378178436],"rgb":[0.533333333333333326,0.2,0.66666666666666663],"xyz":[0.185918174610220643,0.105047204174468806,0.390797992796133142],"hpluv":[290.848124870138179,257.878905714084965,38.7334497692602824],"hsluv":[290.848124870138179,78.3166072053086282,38.7334497692602824]},"#8833bb":{"lch":[39.8990272727434743,89.1142300257769193,285.691107407551272],"luv":[39.8990272727434743,24.1010351313191435,-85.7932753698447073],"rgb":[0.533333333333333326,0.2,0.733333333333333282],"xyz":[0.20305576671755729,0.111902241017403564,0.481055977894774889],"hpluv":[285.691107407551272,283.415812953045702,39.8990272727434743],"hsluv":[285.691107407551272,80.8649153118493444,39.8990272727434743]},"#8833cc":{"lch":[41.1555326498064318,99.7027359993818578,281.897918690971494],"luv":[41.1555326498064318,20.5555775093346966,-97.560769774639283],"rgb":[0.533333333333333326,0.2,0.8],"xyz":[0.222348142161279017,0.119619191194892366,0.5826624885650451],"hpluv":[281.897918690971494,307.410130900702256,41.1555326498064318],"hsluv":[281.897918690971494,83.1006969987668356,41.1555326498064318]},"#8833dd":{"lch":[42.4948021164729042,110.266949448261684,279.053462184119098],"luv":[42.4948021164729042,17.3511661022166734,-108.893237510502843],"rgb":[0.533333333333333326,0.2,0.866666666666666696],"xyz":[0.24386646771191256,0.1282265214151459,0.695992336465051098],"hpluv":[279.053462184119098,329.267506795456711,42.4948021164729042],"hsluv":[279.053462184119098,85.0491409670088103,42.4948021164729042]},"#8833ee":{"lch":[43.9087129541284185,120.703343561802441,276.877390721452173],"luv":[43.9087129541284185,14.4536316684396038,-119.834843341123431],"rgb":[0.533333333333333326,0.2,0.933333333333333348],"xyz":[0.267678647978087325,0.137751393521615917,0.821403152533574321],"hpluv":[276.877390721452173,348.825254458779511,43.9087129541284185],"hsluv":[276.877390721452173,90.7214777394212177,43.9087129541284185]},"#8833ff":{"lch":[45.3894029264418037,130.969293653816607,275.181129330284705],"luv":[45.3894029264418037,11.8271264623124566,-130.43417864894198],"rgb":[0.533333333333333326,0.2,1],"xyz":[0.293849696387918691,0.148219812885548641,0.959237340825356166],"hpluv":[275.181129330284705,366.146040402293636,45.3894029264418037],"hsluv":[275.181129330284705,99.9999999999993179,45.3894029264418037]},"#ffbb00":{"lch":[80.0686585320779614,99.7432534700870832,55.1804439586775146],"luv":[80.0686585320779614,56.9527800089419642,81.8846595037867928],"rgb":[1,0.733333333333333282,0],"xyz":[0.590086256022839262,0.568029919385293569,0.0785626376345524291],"hpluv":[55.1804439586775146,207.400278899961506,80.0686585320779614],"hsluv":[55.1804439586775146,100.000000000004661,80.0686585320779614]},"#ffbb11":{"lch":[80.0914663159454,98.8408701901197304,54.9443852376931758],"luv":[80.0914663159454,56.7713575947746136,80.9106332739172558],"rgb":[1,0.733333333333333282,0.0666666666666666657],"xyz":[0.591097921522476422,0.568434585585148477,0.0838907425993080658],"hpluv":[54.9443852376931758,205.801067903733326,80.0914663159454],"hsluv":[54.9443852376931758,100.000000000004746,80.0914663159454]},"#ffbb22":{"lch":[80.1337172522408849,97.1832370837577173,54.4980435584705063],"luv":[80.1337172522408849,56.4372945908461148,79.11645435270664],"rgb":[1,0.733333333333333282,0.133333333333333331],"xyz":[0.592973279660953367,0.569184728840539278,0.0937676287952872584],"hpluv":[54.4980435584705063,202.856099527528187,80.1337172522408849],"hsluv":[54.4980435584705063,100.00000000000469,80.1337172522408849]},"#ffbb33":{"lch":[80.2032020182086569,94.4967793168558643,53.7374633716008248],"luv":[80.2032020182086569,55.8935303906135772,76.1941898161015558],"rgb":[1,0.733333333333333282,0.2],"xyz":[0.596061030393411184,0.570419829133522405,0.110029782652898395],"hpluv":[53.7374633716008248,198.062979410590685,80.2032020182086569],"hsluv":[53.7374633716008248,100.000000000004576,80.2032020182086569]},"#ffbb44":{"lch":[80.3033451682561,90.7120739700224874,52.5796541788809932],"luv":[80.3033451682561,55.1219083097901148,72.0434284874749835],"rgb":[1,0.733333333333333282,0.266666666666666663],"xyz":[0.60051902563763,0.57220302723121,0.133508557605785033],"hpluv":[52.5796541788809932,191.266883403483888,80.3033451682561],"hsluv":[52.5796541788809932,100.000000000004732,80.3033451682561]},"#ffbb55":{"lch":[80.4369584648287343,85.824023801574981,50.9113466162360169],"luv":[80.4369584648287343,54.1139445833304435,66.614143116349922],"rgb":[1,0.733333333333333282,0.333333333333333315],"xyz":[0.606481439676992,0.57458799284695472,0.164910604879758949],"hpluv":[50.9113466162360169,182.412290123698938,80.4369584648287343],"hsluv":[50.9113466162360169,100.000000000004846,80.4369584648287343]},"#ffbb66":{"lch":[80.6063993458739532,79.8959983704508545,48.5678239065140147],"luv":[80.6063993458739532,52.8698192869345931,59.9011916757752374],"rgb":[1,0.733333333333333282,0.4],"xyz":[0.614066435450500214,0.577621991156358,0.20485824928690291],"hpluv":[48.5678239065140147,171.553596694327723,80.6063993458739532],"hsluv":[48.5678239065140147,100.000000000004945,80.6063993458739532]},"#ffbb77":{"lch":[80.8136549908608828,73.0715029906331353,45.3006510664637219],"luv":[80.8136549908608828,51.397517928562209,51.9397699272266067],"rgb":[1,0.733333333333333282,0.466666666666666674],"xyz":[0.623380448470702064,0.58134759636443889,0.253912051193300847],"hpluv":[45.3006510664637219,158.885762577352,80.8136549908608828],"hsluv":[45.3006510664637219,100.000000000005144,80.8136549908608828]},"#ffbb88":{"lch":[81.0603921498240823,65.5982066090816,40.7273497798256443],"luv":[81.0603921498240823,49.7118280718431649,42.8002203275083914],"rgb":[1,0.733333333333333282,0.533333333333333326],"xyz":[0.634520865572646,0.585803763205216432,0.312584914596873],"hpluv":[40.7273497798256443,144.809180382553194,81.0603921498240823],"hsluv":[40.7273497798256443,100.0000000000054,81.0603921498240823]},"#ffbb99":{"lch":[81.347989327564818,57.8755898316684423,34.2609783084776538],"luv":[81.347989327564818,47.8331272298795724,32.5818329406692087],"rgb":[1,0.733333333333333282,0.6],"xyz":[0.64757782968171862,0.591026548848845645,0.381351592237990866],"hpluv":[34.2609783084776538,130.060421106466862,81.347989327564818],"hsluv":[34.2609783084776538,100.000000000005514,81.347989327564818]},"#ffbbaa":{"lch":[81.6775593509345725,50.5427251754064883,25.056975338279841],"luv":[81.6775593509345725,45.7860019440054415,21.405819165362459],"rgb":[1,0.733333333333333282,0.66666666666666663],"xyz":[0.662635522646971231,0.597049626034946712,0.460655441854989522],"hpluv":[25.056975338279841,115.96007016550756,81.6775593509345725],"hsluv":[25.056975338279841,100.000000000005954,81.6775593509345725]},"#ffbbbb":{"lch":[82.0499666293022,44.6012959670408264,12.1770506300623094],"luv":[82.0499666293022,43.5977873399533138,9.40789779917804125],"rgb":[1,0.733333333333333282,0.733333333333333282],"xyz":[0.679773114754307795,0.603904662877881471,0.550913426953631213],"hpluv":[12.1770506300623094,104.793068167285782,82.0499666293022],"hsluv":[12.1770506300623094,100.000000000006168,82.0499666293022]},"#ffbbcc":{"lch":[82.4658415859876,41.4263127316455169,355.474040938847054],"luv":[82.4658415859876,41.2971323922898534,-3.26898190783910625],"rgb":[1,0.733333333333333282,0.8],"xyz":[0.699065490198029549,0.611621613055370328,0.652519937623901369],"hpluv":[355.474040938847054,100.004408983591958,82.4658415859876],"hsluv":[355.474040938847054,100.000000000006509,82.4658415859876]},"#ffbbdd":{"lch":[82.9255937413379,42.2590852539423381,337.045135839305544],"luv":[82.9255937413379,38.9126886018087319,-16.4812909773061058],"rgb":[1,0.733333333333333282,0.866666666666666696],"xyz":[0.720583815748663148,0.620228943275623834,0.765849785523907367],"hpluv":[337.045135839305544,105.181583048825317,82.9255937413379],"hsluv":[337.045135839305544,100.000000000006992,82.9255937413379]},"#ffbbee":{"lch":[83.4294243398036315,47.2826492521794748,320.476273654572083],"luv":[83.4294243398036315,36.4719970678196077,-30.0905691237235686],"rgb":[1,0.733333333333333282,0.933333333333333348],"xyz":[0.744395996014837857,0.629753815382093851,0.89126060159243059],"hpluv":[320.476273654572083,121.793886282549721,83.4294243398036315],"hsluv":[320.476273654572083,100.000000000007375,83.4294243398036315]},"#ffbbff":{"lch":[83.9773390427358493,55.5806936350452148,307.715012949246614],"luv":[83.9773390427358493,34.0006189291922496,-43.9678452665650781],"rgb":[1,0.733333333333333282,1],"xyz":[0.770567044424669279,0.640222234746026575,1.02909478988421244],"hpluv":[307.715012949246614,148.765749509941259,83.9773390427358493],"hsluv":[307.715012949246614,100.00000000000793,83.9773390427358493]},"#aa3300":{"lch":[39.4372171279304595,100.717281062042773,18.6056676884160446],"luv":[39.4372171279304595,95.4534790945485838,32.1341568004684959],"rgb":[0.66666666666666663,0.2,0],"xyz":[0.177609683996858475,0.109151647655369471,0.0117164749512008691],"hpluv":[18.6056676884160446,324.068678498457416,39.4372171279304595],"hsluv":[18.6056676884160446,100.00000000000226,39.4372171279304595]},"#aa3311":{"lch":[39.5056415087576553,98.9056898290362199,17.5539290045831464],"luv":[39.5056415087576553,94.2999972712563,29.8302865423477179],"rgb":[0.66666666666666663,0.2,0.0666666666666666657],"xyz":[0.178621349496495607,0.109556313855224324,0.0170445799159565023],"hpluv":[17.5539290045831464,317.688492914835,39.5056415087576553],"hsluv":[17.5539290045831464,94.2489803369173558,39.5056415087576553]},"#aa3322":{"lch":[39.6320377265530155,95.7434230458582789,15.5633947922033684],"luv":[39.6320377265530155,92.2329117474569102,25.688383505468213],"rgb":[0.66666666666666663,0.2,0.133333333333333331],"xyz":[0.180496707634972609,0.110306457110615139,0.0269214661119356949],"hpluv":[15.5633947922033684,306.55039093266322,39.6320377265530155],"hsluv":[15.5633947922033684,83.9544037116345123,39.6320377265530155]},"#aa3333":{"lch":[39.8389046640011415,91.0660982539230162,12.1770506300618351],"luv":[39.8389046640011415,89.0171529654153488,19.2088711049089049],"rgb":[0.66666666666666663,0.2,0.2],"xyz":[0.18358445836743037,0.111541557403598252,0.0431836199695468381],"hpluv":[12.1770506300618351,290.060550373943784,39.8389046640011415],"hsluv":[12.1770506300618351,67.9701775681036366,39.8389046640011415]},"#aa3344":{"lch":[40.1348956250933142,85.3951569144799691,7.07959423789482756],"luv":[40.1348956250933142,84.7440953003879116,10.5247867516366789],"rgb":[0.66666666666666663,0.2,0.266666666666666663],"xyz":[0.18804245361164923,0.113324755501285832,0.0666623949224334766],"hpluv":[7.07959423789482756,269.991710008472637,40.1348956250933142],"hsluv":[7.07959423789482756,69.5294395234689659,40.1348956250933142]},"#aa3355":{"lch":[40.5259588707466,79.61783322386637,359.98582832830067],"luv":[40.5259588707466,79.6178307884273693,-0.0196928603108827253],"rgb":[0.66666666666666663,0.2,0.333333333333333315],"xyz":[0.194004867651011215,0.115709721117030664,0.098064442196407392],"hpluv":[359.98582832830067,249.296614878837403,40.5259588707466],"hsluv":[359.98582832830067,71.3920974276079079,40.5259588707466]},"#aa3366":{"lch":[41.0157539995587683,74.8661602955128558,350.806369630673316],"luv":[41.0157539995587683,73.9044320805857,-11.9614746682639641],"rgb":[0.66666666666666663,0.2,0.4],"xyz":[0.2015898634245194,0.118743719426433983,0.138012086603551354],"hpluv":[350.806369630673316,231.619002340768361,41.0157539995587683],"hsluv":[350.806369630673316,73.4562780141226597,41.0157539995587683]},"#aa3377":{"lch":[41.6059173351841167,72.2728884464882668,339.921631600955322],"luv":[41.6059173351841167,67.8804264173117531,-24.8116527825629412],"rgb":[0.66666666666666663,0.2,0.466666666666666674],"xyz":[0.210903876444721305,0.122469324634514792,0.187065888509949263],"hpluv":[339.921631600955322,220.424384448141751,41.6059173351841167],"hsluv":[339.921631600955322,75.6166865764569138,41.6059173351841167]},"#aa3388":{"lch":[42.296293156356171,72.6091331125239918,328.324027314743319],"luv":[42.296293156356171,61.7926517819245191,-38.1281313089174],"rgb":[0.66666666666666663,0.2,0.533333333333333326],"xyz":[0.222044293546665161,0.12692549147529239,0.24573875191352143],"hpluv":[328.324027314743319,217.83530631356345,42.296293156356171],"hsluv":[328.324027314743319,77.7798333688196237,42.296293156356171]},"#aa3399":{"lch":[43.0851702185186838,75.9982874692542794,317.281450106519685],"luv":[43.0851702185186838,55.835561651799118,-51.5570533805758799],"rgb":[0.66666666666666663,0.2,0.6],"xyz":[0.235101257655737861,0.132148277118921548,0.314505429554639337],"hpluv":[317.281450106519685,223.828466633931441,43.0851702185186838],"hsluv":[317.281450106519685,79.8726039522015441,43.0851702185186838]},"#aa33aa":{"lch":[43.9695321467927229,81.9717995507402861,307.715012949243828],"luv":[43.9695321467927229,50.1449646844158607,-64.8448798162617521],"rgb":[0.66666666666666663,0.2,0.66666666666666663],"xyz":[0.250158950620990417,0.138171354305022642,0.393809279171637938],"hpluv":[307.715012949243828,236.565795567314069,43.9695321467927229],"hsluv":[307.715012949243828,81.8445603498948628,43.9695321467927229]},"#aa33bb":{"lch":[44.9453163823579231,89.8045713491188593,299.92695612823394],"luv":[44.9453163823579231,44.8030997809084,-77.8302208992172],"rgb":[0.66666666666666663,0.2,0.733333333333333282],"xyz":[0.267296542728327036,0.145026391147957401,0.484067264270279685],"hpluv":[299.92695612823394,253.543994890590483,44.9453163823579231],"hsluv":[299.92695612823394,83.6659201788580305,44.9453163823579231]},"#aa33cc":{"lch":[46.0076707905516145,98.8168321279874249,293.782406660809556],"luv":[46.0076707905516145,39.8493034294229815,-90.425656359246986],"rgb":[0.66666666666666663,0.2,0.8],"xyz":[0.28658891817204879,0.152743341325446202,0.585673774940549841],"hpluv":[293.782406660809556,272.546121846523647,46.0076707905516145],"hsluv":[293.782406660809556,85.323407183561244,46.0076707905516145]},"#aa33dd":{"lch":[47.1511962508372804,108.497592079042477,288.982430572084695],"luv":[47.1511962508372804,35.2919015872993782,-102.597315604759743],"rgb":[0.66666666666666663,0.2,0.866666666666666696],"xyz":[0.308107243722682334,0.161350671545699736,0.699003622840555838],"hpluv":[288.982430572084695,291.989148013150611,47.1511962508372804],"hsluv":[288.982430572084695,86.8156421407842771,47.1511962508372804]},"#aa33ee":{"lch":[48.3701654903461247,118.505438755587946,285.224041333998457],"luv":[48.3701654903461247,31.1188262963008349,-114.346655677352729],"rgb":[0.66666666666666663,0.2,0.933333333333333348],"xyz":[0.331919423988857099,0.170875543652169781,0.824414438909079061],"hpluv":[285.224041333998457,310.885191630161273,48.3701654903461247],"hsluv":[285.224041333998457,89.3017266962351215,48.3701654903461247]},"#aa33ff":{"lch":[49.6587116356326135,128.627945638670809,282.256374557143658],"luv":[49.6587116356326135,27.305962831451918,-125.696192436653462],"rgb":[0.66666666666666663,0.2,1],"xyz":[0.358090472398688464,0.181343963016102477,0.962248627200860907],"hpluv":[282.256374557143658,328.684490794403757,49.6587116356326135],"hsluv":[282.256374557143658,99.9999999999991616,49.6587116356326135]},"#884400":{"lch":[36.685747441671559,64.5393704655657814,31.8123524502136021],"luv":[36.685747441671559,54.844205976921188,34.0212200082916922],"rgb":[0.533333333333333326,0.266666666666666663,0],"xyz":[0.122201478469054756,0.093692638490747937,0.0116493787366846978],"hpluv":[31.8123524502136021,223.237258003095718,36.685747441671559],"hsluv":[31.8123524502136021,100.000000000002245,36.685747441671559]},"#884411":{"lch":[36.7614898568215622,62.4864851085245405,30.2058215583615599],"luv":[36.7614898568215622,54.0023006087270119,31.4374354899146],"rgb":[0.533333333333333326,0.266666666666666663,0.0666666666666666657],"xyz":[0.123213143968691874,0.0940973046906027899,0.016977483701440331],"hpluv":[30.2058215583615599,215.691146343233044,36.7614898568215622],"hsluv":[30.2058215583615599,93.206231917801162,36.7614898568215622]},"#884422":{"lch":[36.9013237077522405,58.9550348899468375,27.0578850153250627],"luv":[36.9013237077522405,52.5022536375556825,26.8180816214102],"rgb":[0.533333333333333326,0.266666666666666663,0.133333333333333331],"xyz":[0.125088502107168903,0.0948474479459936,0.0268543698974195236],"hpluv":[27.0578850153250627,202.730122118290922,36.9013237077522405],"hsluv":[27.0578850153250627,81.1214838671569822,36.9013237077522405]},"#884433":{"lch":[37.1299605496210461,53.9021323280231357,21.3870333458705382],"luv":[37.1299605496210461,50.1903435049312,19.6562785990819577],"rgb":[0.533333333333333326,0.266666666666666663,0.2],"xyz":[0.128176252839626637,0.0960825482389767171,0.0431165237550306668],"hpluv":[21.3870333458705382,184.213216030002656,37.1299605496210461],"hsluv":[21.3870333458705382,62.5495295304316272,37.1299605496210461]},"#884444":{"lch":[37.4566279620983806,48.2433933618324389,12.1770506300619505],"luv":[37.4566279620983806,47.157939219998795,10.1761373608750691],"rgb":[0.533333333333333326,0.266666666666666663,0.266666666666666663],"xyz":[0.132634248083845524,0.0978657463366643,0.0665952987079173],"hpluv":[12.1770506300619505,163.436290620587812,37.4566279620983806],"hsluv":[12.1770506300619505,38.2981887065726,37.4566279620983806]},"#884455":{"lch":[37.8873893879065804,43.5926938841600631,358.470393497241901],"luv":[37.8873893879065804,43.5771602849424937,-1.16364151632571566],"rgb":[0.533333333333333326,0.266666666666666663,0.333333333333333315],"xyz":[0.138596662123207509,0.10025071195240913,0.0979973459818912207],"hpluv":[358.470393497241901,146.001848007416612,37.8873893879065804],"hsluv":[358.470393497241901,42.6300163695831245,37.8873893879065804]},"#884466":{"lch":[38.425613648805637,41.9872152878557756,340.815857604715632],"luv":[38.425613648805637,39.6555541095459816,-13.7972198610307206],"rgb":[0.533333333333333326,0.266666666666666663,0.4],"xyz":[0.146181657896715694,0.103284710261812449,0.137944990389035183],"hpluv":[340.815857604715632,138.655016432961,38.425613648805637],"hsluv":[340.815857604715632,47.3337116796912767,38.425613648805637]},"#884477":{"lch":[39.0722986805963117,44.7783217464764363,322.645837420375756],"luv":[39.0722986805963117,35.5943002873345478,-27.1688035343115608],"rgb":[0.533333333333333326,0.266666666666666663,0.466666666666666674],"xyz":[0.1554956709169176,0.107010315469893258,0.186998792295433092],"hpluv":[322.645837420375756,145.424700121889231,39.0722986805963117],"hsluv":[322.645837420375756,52.1510622716411,39.0722986805963117]},"#884488":{"lch":[39.8263740522966856,51.5911203050634839,307.71501294924451],"luv":[39.8263740522966856,31.5600599218946343,-40.8118403414738609],"rgb":[0.533333333333333326,0.266666666666666663,0.533333333333333326],"xyz":[0.166636088018861428,0.111466482310670856,0.245671655699005259],"hpluv":[307.71501294924451,164.377933698467302,39.8263740522966856],"hsluv":[307.71501294924451,56.8697587177058,39.8263740522966856]},"#884499":{"lch":[40.6850187117946192,61.0189075542410393,296.969581150574243],"luv":[40.6850187117946192,27.6731358367265301,-54.3829443123034295],"rgb":[0.533333333333333326,0.266666666666666663,0.6],"xyz":[0.179693052127934128,0.116689267954300013,0.314438333340123166],"hpluv":[296.969581150574243,190.313341437332326,40.6850187117946192],"hsluv":[296.969581150574243,61.3383523001243134,40.6850187117946192]},"#8844aa":{"lch":[41.643995358805,71.7935926347933417,289.536616505740085],"luv":[41.643995358805,24.0084388126510113,-67.6602897510042141],"rgb":[0.533333333333333326,0.266666666666666663,0.66666666666666663],"xyz":[0.194750745093186683,0.122712345140401108,0.393742182957121767],"hpluv":[289.536616505740085,218.762371943685849,41.643995358805],"hsluv":[289.536616505740085,65.4647221474276506,41.643995358805]},"#8844bb":{"lch":[42.6979882651059626,83.1164887776927515,284.352541737053286],"luv":[42.6979882651059626,20.6035404121657031,-80.5223250360828757],"rgb":[0.533333333333333326,0.266666666666666663,0.733333333333333282],"xyz":[0.21188833720052333,0.129567381983335866,0.484000168055763513],"hpluv":[284.352541737053286,247.012596783276,42.6979882651059626],"hsluv":[284.352541737053286,69.2054262339616741,42.6979882651059626]},"#8844cc":{"lch":[43.840927241858644,94.5481620176080924,280.647262826657595],"luv":[43.840927241858644,17.4689172853010533,-92.9203522904814463],"rgb":[0.533333333333333326,0.266666666666666663,0.8],"xyz":[0.231180712644245057,0.137284332160824668,0.585606678726033669],"hpluv":[280.647262826657595,273.660859280114778,43.840927241858644],"hsluv":[280.647262826657595,72.5522514276637764,43.840927241858644]},"#8844dd":{"lch":[45.0662821798681108,105.864396975636453,277.925647559652191],"luv":[45.0662821798681108,14.5974213234566292,-104.853163222292139],"rgb":[0.533333333333333326,0.266666666666666663,0.866666666666666696],"xyz":[0.2526990381948786,0.145891662381078202,0.698936526626039667],"hpluv":[277.925647559652191,298.083215805211921,45.0662821798681108],"hsluv":[277.925647559652191,79.9664783418063649,45.0662821798681108]},"#8844ee":{"lch":[46.3673172023828,116.961454232737537,275.874868362231723],"luv":[46.3673172023828,11.97173240994087,-116.347150370524886],"rgb":[0.533333333333333326,0.266666666666666663,0.933333333333333348],"xyz":[0.276511218461053365,0.155416534487548247,0.82434734269456289],"hpluv":[275.874868362231723,320.088534026972411,46.3673172023828],"hsluv":[275.874868362231723,89.9071832422553,46.3673172023828]},"#8844ff":{"lch":[47.7372988913525091,127.801124524511906,274.29427304351259],"luv":[47.7372988913525091,9.5696272486796623,-127.442338585146516],"rgb":[0.533333333333333326,0.266666666666666663,1],"xyz":[0.302682266870884731,0.165884953851480943,0.962181530986344735],"hpluv":[274.29427304351259,339.716123682654541,47.7372988913525091],"hsluv":[274.29427304351259,99.9999999999992468,47.7372988913525091]},"#ffcc00":{"lch":[84.1983464973243,98.3335943421723613,63.5926937648685069],"luv":[84.1983464973243,43.7338065737115329,88.0729807536005751],"rgb":[1,0.8,0],"xyz":[0.628309999332456237,0.644477406004528408,0.0913038854044243842],"hpluv":[63.5926937648685069,267.385577483165775,84.1983464973243],"hsluv":[63.5926937648685069,100.000000000007688,84.1983464973243]},"#ffcc11":{"lch":[84.2193135631731877,97.4576917861448777,63.4272907637844199],"luv":[84.2193135631731877,43.5960552023901897,87.1629833075564164],"rgb":[1,0.8,0.0666666666666666657],"xyz":[0.629321664832093397,0.644882072204383316,0.0966319903691800208],"hpluv":[63.4272907637844199,265.403720884510847,84.2193135631731877],"hsluv":[63.4272907637844199,100.000000000007645,84.2193135631731877]},"#ffcc22":{"lch":[84.2581577251319516,95.845309095571892,63.1144413478925301],"luv":[84.2581577251319516,43.342199386504106,85.4855369519677168],"rgb":[1,0.8,0.133333333333333331],"xyz":[0.631197022970570343,0.645632215459774117,0.106508876565159213],"hpluv":[63.1144413478925301,261.744085553517664,84.2581577251319516],"hsluv":[63.1144413478925301,100.00000000000766,84.2581577251319516]},"#ffcc33":{"lch":[84.3220485899852719,93.2224175872051148,62.5809741236821822],"luv":[84.3220485899852719,42.9284172035605494,82.7500461462124832],"rgb":[1,0.8,0.2],"xyz":[0.63428477370302816,0.646867315752757244,0.12277103042277035],"hpluv":[62.5809741236821822,255.758846695652977,84.3220485899852719],"hsluv":[62.5809741236821822,100.000000000007859,84.3220485899852719]},"#ffcc44":{"lch":[84.41414885501203,89.5051620308737,61.7678249437873745],"luv":[84.41414885501203,42.3400226901080785,78.8574442191356439],"rgb":[1,0.8,0.266666666666666663],"xyz":[0.638742768947247,0.64865051385044481,0.146249805375657],"hpluv":[61.7678249437873745,247.206609954939694,84.41414885501203],"hsluv":[61.7678249437873745,100.000000000007887,84.41414885501203]},"#ffcc55":{"lch":[84.5370662928161,84.6613331238571476,60.5932597011580469],"luv":[84.5370662928161,41.569242864558305,73.7532329730438221],"rgb":[1,0.8,0.333333333333333315],"xyz":[0.644705182986609,0.651035479466189559,0.177651852649630904],"hpluv":[60.5932597011580469,235.935294148211483,84.5370662928161],"hsluv":[60.5932597011580469,100.000000000008015,84.5370662928161]},"#ffcc66":{"lch":[84.6930007913096,78.7104448491835456,58.9357730127494222],"luv":[84.6930007913096,40.6144802919859131,67.4225342075500151],"rgb":[1,0.8,0.4],"xyz":[0.65229017876011719,0.654069477775592878,0.217599497056774865],"hpluv":[58.9357730127494222,221.881579382217893,84.6930007913096],"hsluv":[58.9357730127494222,100.000000000008285,84.6930007913096]},"#ffcc77":{"lch":[84.8838226897762809,71.7288671198513441,56.6053668146737863],"luv":[84.8838226897762809,39.4797505573258718,59.8863897244492378],"rgb":[1,0.8,0.466666666666666674],"xyz":[0.661604191780319,0.657795082983673729,0.266653298963172802],"hpluv":[56.6053668146737863,205.087229042099608,84.8838226897762809],"hsluv":[56.6053668146737863,100.000000000008399,84.8838226897762809]},"#ffcc88":{"lch":[85.1111193079521371,63.8628893840605159,53.2910582019814285],"luv":[85.1111193079521371,38.1740592359010691,51.1977523133063457],"rgb":[1,0.8,0.533333333333333326],"xyz":[0.672744608882263,0.662251249824451271,0.325326162366744942],"hpluv":[53.2910582019814285,185.743844227516831,85.1111193079521371],"hsluv":[53.2910582019814285,100.000000000008683,85.1111193079521371]},"#ffcc99":{"lch":[85.3762249003348899,55.3594884395636555,48.4608196634464292],"luv":[85.3762249003348899,36.710650975629143,41.436711563970924],"rgb":[1,0.8,0.6],"xyz":[0.685801572991335595,0.667474035468080484,0.394092840007862821],"hpluv":[48.4608196634464292,164.300705026796521,85.3762249003348899],"hsluv":[48.4608196634464292,100.000000000008811,85.3762249003348899]},"#ffccaa":{"lch":[85.6802414041430467,46.6394331206389836,41.1740083194267896],"luv":[85.6802414041430467,35.1061374539925311,30.7049806200222122],"rgb":[1,0.8,0.66666666666666663],"xyz":[0.700859265956588207,0.673497112654181551,0.473396689624861478],"hpluv":[41.1740083194267896,141.724192848301414,85.6802414041430467],"hsluv":[41.1740083194267896,100.000000000009393,85.6802414041430467]},"#ffccbb":{"lch":[86.0240539433014106,38.4677176438646384,29.8042196075727404],"luv":[86.0240539433014106,33.3795484258888635,19.1199123327444944],"rgb":[1,0.8,0.733333333333333282],"xyz":[0.71799685806392477,0.68035214949711631,0.563654674723503168],"hpluv":[29.8042196075727404,120.116808153279436,86.0240539433014106],"hsluv":[29.8042196075727404,100.000000000009621,86.0240539433014106]},"#ffcccc":{"lch":[86.4083433793485,32.2775975377643,12.1770506300627517],"luv":[86.4083433793485,31.5513664521307504,6.80841962670093892],"rgb":[1,0.8,0.8],"xyz":[0.737289233507646524,0.688069099674605167,0.665261185393773324],"hpluv":[12.1770506300627517,103.973607583717524,86.4083433793485],"hsluv":[12.1770506300627517,100.000000000010388,86.4083433793485]},"#ffccdd":{"lch":[86.8335972965778637,30.2635044437543748,348.373924949033096],"luv":[86.8335972965778637,29.6426074465171432,-6.09881340826452867],"rgb":[1,0.8,0.866666666666666696],"xyz":[0.758807559058280123,0.696676429894858673,0.778591033293779322],"hpluv":[348.373924949033096,100.994037434302086,86.8335972965778637],"hsluv":[348.373924949033096,100.000000000011042,86.8335972965778637]},"#ffccee":{"lch":[87.3001202800073344,33.8382691858854301,324.868297683069],"luv":[87.3001202800073344,27.6740002852911822,-19.4724977777928352],"rgb":[1,0.8,0.933333333333333348],"xyz":[0.782619739324454833,0.70620130200132869,0.904001849362302545],"hpluv":[324.868297683069,117.528800717138253,87.3001202800073344],"hsluv":[324.868297683069,100.000000000011482,87.3001202800073344]},"#ffccff":{"lch":[87.8080440143565255,41.9549825399590404,307.715012949248376],"luv":[87.8080440143565255,25.6653035474654807,-33.1890456889728],"rgb":[1,0.8,1],"xyz":[0.808790787734286254,0.716669721365261414,1.0418360376540845],"hpluv":[307.715012949248376,152.433043069806,87.8080440143565255],"hsluv":[307.715012949248376,100.000000000012506,87.8080440143565255]},"#aa4400":{"lch":[42.2796461632011074,91.196234940608619,23.7609213617016479],"luv":[42.2796461632011074,83.4659581293579578,36.7448921741641357],"rgb":[0.66666666666666663,0.266666666666666663,0],"xyz":[0.186442254479824487,0.126816788621301801,0.0146606651121894659],"hpluv":[23.7609213617016479,273.706361359402308,42.2796461632011074],"hsluv":[23.7609213617016479,100.000000000002331,42.2796461632011074]},"#aa4411":{"lch":[42.3415695164373815,89.5099073241138399,22.7237862619920179],"luv":[42.3415695164373815,82.5619515402106572,34.5766925405446202],"rgb":[0.66666666666666663,0.266666666666666663,0.0666666666666666657],"xyz":[0.18745391997946162,0.127221454821156654,0.0199887700769451],"hpluv":[22.7237862619920179,268.252316854423896,42.3415695164373815],"hsluv":[22.7237862619920179,95.0030043013494634,42.3415695164373815]},"#aa4422":{"lch":[42.4560124733741162,86.5487219398638,20.7501492775311753],"luv":[42.4560124733741162,80.9346773489764075,30.663647399501361],"rgb":[0.66666666666666663,0.266666666666666663,0.133333333333333331],"xyz":[0.189329278117938621,0.127971598076547483,0.0298656562729242916],"hpluv":[20.7501492775311753,258.678767688655569,42.4560124733741162],"hsluv":[20.7501492775311753,86.0172479577967692,42.4560124733741162]},"#aa4433":{"lch":[42.643470741830761,82.1252826930209494,17.3597256589108966],"luv":[42.643470741830761,78.3845002494828691,24.5037176372775498],"rgb":[0.66666666666666663,0.266666666666666663,0.2],"xyz":[0.192417028850396354,0.129206698369530582,0.0461278101305354349],"hpluv":[17.3597256589108966,244.378874013338617,42.643470741830761],"hsluv":[17.3597256589108966,71.9602068881057733,42.643470741830761]},"#aa4444":{"lch":[42.9120210749329871,76.685866981555165,12.1770506300619239],"luv":[42.9120210749329871,74.9604702767477704,16.1756017075590073],"rgb":[0.66666666666666663,0.266666666666666663,0.266666666666666663],"xyz":[0.196875024094615242,0.130989896467218175,0.0696065850834220734],"hpluv":[12.1770506300619239,226.764824908056937,42.9120210749329871],"hsluv":[12.1770506300619239,53.1380271992519795,42.9120210749329871]},"#aa4455":{"lch":[43.2674147484635299,71.0489272172787594,4.80785478807657096],"luv":[43.2674147484635299,70.7989329223205,5.9549270177674023],"rgb":[0.66666666666666663,0.266666666666666663,0.333333333333333315],"xyz":[0.202837438133977255,0.133374862082963,0.101008632357395989],"hpluv":[4.80785478807657096,208.370342069187018,43.2674147484635299],"hsluv":[4.80785478807657096,55.6796565441877931,43.2674147484635299]},"#aa4466":{"lch":[43.7134526285125489,66.3411716499448261,355.020980864279068],"luv":[43.7134526285125489,66.0908363196155477,-5.75781299290188],"rgb":[0.66666666666666663,0.266666666666666663,0.4],"xyz":[0.210422433907485412,0.136408860392366299,0.140956276764539951],"hpluv":[355.020980864279068,192.578302395247789,43.7134526285125489],"hsluv":[355.020980864279068,58.5402216503940949,43.7134526285125489]},"#aa4477":{"lch":[44.252209356870793,63.7921835342278598,343.127789968560137],"luv":[44.252209356870793,61.046215168807521,-18.5149208377531842],"rgb":[0.66666666666666663,0.266666666666666663,0.466666666666666674],"xyz":[0.219736446927687346,0.140134465600447122,0.19001007867093786],"hpluv":[343.127789968560137,182.924482874911519,44.252209356870793],"hsluv":[343.127789968560137,61.5848400189491372,44.252209356870793]},"#aa4488":{"lch":[44.8842146397509367,64.3242328637060865,330.281311898752961],"luv":[44.8842146397509367,55.8636578331810938,-31.8882214461946916],"rgb":[0.66666666666666663,0.266666666666666663,0.533333333333333326],"xyz":[0.230876864029631146,0.14459063244122472,0.248682942074510027],"hpluv":[330.281311898752961,181.852933643495049,44.8842146397509367],"hsluv":[330.281311898752961,64.6866121014520274,44.8842146397509367]},"#aa4499":{"lch":[45.6086312393750077,68.1395242873703779,318.091147538790551],"luv":[45.6086312393750077,50.7100032224043318,-45.5136281051387854],"rgb":[0.66666666666666663,0.266666666666666663,0.6],"xyz":[0.243933828138703873,0.149813418084853878,0.317449619715627906],"hpluv":[318.091147538790551,189.579504981677246,45.6086312393750077],"hsluv":[318.091147538790551,67.7395528675925,45.6086312393750077]},"#aa44aa":{"lch":[46.4234422285949293,74.7240378323112822,307.715012949244056],"luv":[46.4234422285949293,45.7112599542092468,-59.1114417296972476],"rgb":[0.66666666666666663,0.266666666666666663,0.66666666666666663],"xyz":[0.258991521103956401,0.155836495270954972,0.396753469332626507],"hpluv":[307.715012949244056,204.25011915803762,46.4234422285949293],"hsluv":[307.715012949244056,70.6643205278868862,46.4234422285949293]},"#aa44bb":{"lch":[47.3256474704596144,83.2556513741305224,299.464802712285689],"luv":[47.3256474704596144,40.9525224701243289,-72.4872015535482177],"rgb":[0.66666666666666663,0.266666666666666663,0.733333333333333282],"xyz":[0.276129113211293076,0.162691532113889731,0.487011454431268254],"hpluv":[299.464802712285689,223.2320179514779,47.3256474704596144],"hsluv":[299.464802712285689,73.4081717041738244,47.3256474704596144]},"#aa44cc":{"lch":[48.311463406953564,92.9774863668884564,293.103270963637385],"luv":[48.311463406953564,36.4834012629607827,-85.5206080625642073],"rgb":[0.66666666666666663,0.266666666666666663,0.8],"xyz":[0.29542148865501483,0.170408482291378532,0.58861796510153841],"hpluv":[293.103270963637385,244.211962975346665,48.311463406953564],"hsluv":[293.103270963637385,75.9413806031634806,48.311463406953564]},"#aa44dd":{"lch":[49.376518181476186,103.335675962773564,288.229438001673088],"luv":[49.376518181476186,32.3257723855767125,-98.1494083851717676],"rgb":[0.66666666666666663,0.266666666666666663,0.866666666666666696],"xyz":[0.316939814205648318,0.179015812511632066,0.701947813001544407],"hpluv":[288.229438001673088,265.563967984367252,49.376518181476186],"hsluv":[288.229438001673088,78.2521754793284572,49.376518181476186]},"#aa44ee":{"lch":[50.5160343838387149,113.969241853628489,284.471970959088878],"luv":[50.5160343838387149,28.4816380653286,-110.35299897060564],"rgb":[0.66666666666666663,0.266666666666666663,0.933333333333333348],"xyz":[0.340751994471823083,0.188540684618102111,0.82735862907006763],"hpluv":[284.471970959088878,286.284434407824506,50.5160343838387149],"hsluv":[284.471970959088878,88.5420288112715355,50.5160343838387149]},"#aa44ff":{"lch":[51.7249932896939271,124.658572052901789,281.540806859048416],"luv":[51.7249932896939271,24.9399169363974949,-122.138282816953421],"rgb":[0.66666666666666663,0.266666666666666663,1],"xyz":[0.366923042881654449,0.199009103982034807,0.965192817361849476],"hpluv":[281.540806859048416,305.816582895375404,51.7249932896939271],"hsluv":[281.540806859048416,99.9999999999991189,51.7249932896939271]},"#885500":{"lch":[40.7868302215615941,57.8204075903908716,44.0255445375638317],"luv":[40.7868302215615941,41.5746091122878738,40.1839695784202107],"rgb":[0.533333333333333326,0.333333333333333315,0],"xyz":[0.134014735183400707,0.117319151919440201,0.0155871309747999068],"hpluv":[44.0255445375638317,179.887306981779091,40.7868302215615941],"hsluv":[44.0255445375638317,100.000000000002402,40.7868302215615941]},"#885511":{"lch":[40.8520464566488215,55.8013246771799061,42.6953812551229817],"luv":[40.8520464566488215,41.012258348334349,37.838901951530346],"rgb":[0.533333333333333326,0.333333333333333315,0.0666666666666666657],"xyz":[0.135026400683037839,0.117723818119295054,0.0209152359395555383],"hpluv":[42.6953812551229817,173.328515822040885,40.8520464566488215],"hsluv":[42.6953812551229817,94.5141207032234121,40.8520464566488215]},"#885522":{"lch":[40.9725457623763205,52.2529579480882163,40.0436802938645613],"luv":[40.9725457623763205,40.0024704692244413,33.6180601862079769],"rgb":[0.533333333333333326,0.333333333333333315,0.133333333333333331],"xyz":[0.136901758821514841,0.118473961374685868,0.0307921221355347344],"hpluv":[40.0436802938645613,161.829338044896133,40.9725457623763205],"hsluv":[40.0436802938645613,84.6783920295854813,40.9725457623763205]},"#885533":{"lch":[41.169842808691,46.965215190705,35.0963808532685348],"luv":[41.169842808691,38.426283274472091,27.0028182162390955],"rgb":[0.533333333333333326,0.333333333333333315,0.2],"xyz":[0.139989509553972602,0.119709061667668981,0.0470542759931458776],"hpluv":[35.0963808532685348,144.75595347357384,41.169842808691],"hsluv":[35.0963808532685348,69.3663942781120113,41.169842808691]},"#885544":{"lch":[41.4523140669009891,40.5881659839312263,26.5063976077417607],"luv":[41.4523140669009891,36.321721997537459,18.1144066718387258],"rgb":[0.533333333333333326,0.333333333333333315,0.266666666666666663],"xyz":[0.144447504798191462,0.121492259765356561,0.0705330509460325161],"hpluv":[26.5063976077417607,124.248162385526584,41.4523140669009891],"hsluv":[26.5063976077417607,49.0053368988820708,41.4523140669009891]},"#885555":{"lch":[41.8258216452066449,34.5587016635497619,12.1770506300621708],"luv":[41.8258216452066449,33.7811467851905647,7.28958040957408926],"rgb":[0.533333333333333326,0.333333333333333315,0.333333333333333315],"xyz":[0.150409918837553447,0.123877225381101394,0.101935098220006432],"hpluv":[12.1770506300621708,104.846095879990827,41.8258216452066449],"hsluv":[12.1770506300621708,24.5686900376428454,41.8258216452066449]},"#885566":{"lch":[42.2941086985740071,31.3312262907584227,350.801819307985852],"luv":[42.2941086985740071,30.9283487442626033,-5.00829160852097477],"rgb":[0.533333333333333326,0.333333333333333315,0.4],"xyz":[0.157994914611061632,0.126911223690504699,0.141882742627150393],"hpluv":[350.801819307985852,94.0019456509277092,42.2941086985740071],"hsluv":[350.801819307985852,29.8132814869556348,42.2941086985740071]},"#885577":{"lch":[42.8590433503379202,33.3514130793808121,326.760730108285],"luv":[42.8590433503379202,27.8947491372056646,-18.2811302977648822],"rgb":[0.533333333333333326,0.333333333333333315,0.466666666666666674],"xyz":[0.167308927631263538,0.130636828898585522,0.190936544533548302],"hpluv":[326.760730108285,98.7440857113442263,42.8590433503379202],"hsluv":[326.760730108285,35.3342565461126838,42.8590433503379202]},"#885588":{"lch":[43.5208237898043535,40.5407907233736822,307.71501294924542],"luv":[43.5208237898043535,24.8001938501248809,-32.0703304858651137],"rgb":[0.533333333333333326,0.333333333333333315,0.533333333333333326],"xyz":[0.178449344733207393,0.13509299573936312,0.24960940793712047],"hpluv":[307.71501294924542,118.204615389413121,43.5208237898043535],"hsluv":[307.71501294924542,40.8951968507306276,43.5208237898043535]},"#885599":{"lch":[44.278184332936334,50.8805981998246,295.296495298175159],"luv":[44.278184332936334,21.7414099229374891,-46.0015909261276477],"rgb":[0.533333333333333326,0.333333333333333315,0.6],"xyz":[0.191506308842280093,0.140315781382992277,0.318376085578238377],"hpluv":[295.296495298175159,145.814841874582299,44.278184332936334],"hsluv":[295.296495298175159,46.3068912836000735,44.278184332936334]},"#8855aa":{"lch":[45.1286132569148819,62.6826496939872868,287.441560465434577],"luv":[45.1286132569148819,18.7880516159354372,-59.8006997378464717],"rgb":[0.533333333333333326,0.333333333333333315,0.66666666666666663],"xyz":[0.206564001807532649,0.146338858569093372,0.397679935195237],"hpluv":[287.441560465434577,176.252255995348207,45.1286132569148819],"hsluv":[287.441560465434577,51.4349240401982044,45.1286132569148819]},"#8855bb":{"lch":[46.0685799041538857,75.0110486022347374,282.303621490188448],"luv":[46.0685799041538857,15.9842650126874819,-73.2882029006783284],"rgb":[0.533333333333333326,0.333333333333333315,0.733333333333333282],"xyz":[0.223701593914869268,0.15319389541202813,0.487937920293878724],"hpluv":[282.303621490188448,206.613996430434867,46.0685799041538857],"hsluv":[282.303621490188448,56.1963190544194191,46.0685799041538857]},"#8855cc":{"lch":[47.0937627302438173,87.3889723072186229,278.789341148015808],"luv":[47.0937627302438173,13.3532090014702405,-86.3627482788434406],"rgb":[0.533333333333333326,0.333333333333333315,0.8],"xyz":[0.242993969358591022,0.160910845589516932,0.58954443096414888],"hpluv":[278.789341148015808,235.468364438494291,47.0937627302438173],"hsluv":[278.789341148015808,67.0071532265272083,47.0937627302438173]},"#8855dd":{"lch":[48.1992684502362323,99.579643468316263,276.285619014825784],"luv":[48.1992684502362323,10.9024601244232162,-98.9810171523426163],"rgb":[0.533333333333333326,0.333333333333333315,0.866666666666666696],"xyz":[0.264512294909224566,0.169518175809770466,0.702874278864154878],"hpluv":[276.285619014825784,262.161822059859048,48.1992684502362323],"hsluv":[276.285619014825784,77.9008511174594673,48.1992684502362323]},"#8855ee":{"lch":[49.3798334670730128,111.473561000814087,274.439637972028379],"luv":[49.3798334670730128,8.62903279282213198,-111.139077714648238],"rgb":[0.533333333333333326,0.333333333333333315,0.933333333333333348],"xyz":[0.288324475175399275,0.179043047916240511,0.828285094932678101],"hpluv":[274.439637972028379,286.45841220928196,49.3798334670730128],"hsluv":[274.439637972028379,88.8665998649397295,49.3798334670730128]},"#8855ff":{"lch":[50.6300011250937416,123.030386306339324,273.039422554437692],"luv":[50.6300011250937416,6.52344684402536235,-122.857318039912712],"rgb":[0.533333333333333326,0.333333333333333315,1],"xyz":[0.314495523585230696,0.189511467280173207,0.96611928322446],"hpluv":[273.039422554437692,308.349875308867752,50.6300011250937416],"hsluv":[273.039422554437692,99.9999999999992,50.6300011250937416]},"#ffdd00":{"lch":[88.435570144315335,99.3071523162376195,71.7429005549186911],"luv":[88.435570144315335,31.1110916577435432,94.3080615696447211],"rgb":[1,0.866666666666666696,0],"xyz":[0.670943989879631442,0.729745387098879927,0.105515215586815703],"hpluv":[71.7429005549186911,382.363935262913174,88.435570144315335],"hsluv":[71.7429005549186911,100.000000000012946,88.435570144315335]},"#ffdd11":{"lch":[88.454870819445,98.4678340856778,71.6448189166009826],"luv":[88.454870819445,31.0081800872079896,93.4580500395971683],"rgb":[1,0.866666666666666696,0.0666666666666666657],"xyz":[0.671955655379268602,0.730150053298734836,0.110843320551571339],"hpluv":[71.6448189166009826,379.826472639876158,88.454870819445],"hsluv":[71.6448189166009826,100.00000000001296,88.454870819445]},"#ffdd22":{"lch":[88.4906302718539735,96.9204819130462,71.4594307996413],"luv":[88.4906302718539735,30.8183922605744947,91.8901872494037093],"rgb":[1,0.866666666666666696,0.133333333333333331],"xyz":[0.673831013517745547,0.730900196554125636,0.120720206747550532],"hpluv":[71.4594307996413,375.129750349680876,88.4906302718539735],"hsluv":[71.4594307996413,100.00000000001296,88.4906302718539735]},"#ffdd33":{"lch":[88.5494544369894641,94.3967280931520776,71.1436744567929793],"luv":[88.5494544369894641,30.5086598694284135,89.330643945199526],"rgb":[1,0.866666666666666696,0.2],"xyz":[0.676918764250203364,0.732135296847108763,0.136982360605161668],"hpluv":[71.1436744567929793,367.416320973762822,88.5494544369894641],"hsluv":[71.1436744567929793,100.000000000013216,88.5494544369894641]},"#ffdd44":{"lch":[88.6342662809689301,90.8049878425315455,70.6631891871382152],"luv":[88.6342662809689301,30.0674100616276441,85.6825342136204284],"rgb":[1,0.866666666666666696,0.266666666666666663],"xyz":[0.681376759494422224,0.733918494944796329,0.160461135558048307],"hpluv":[70.6631891871382152,356.322085242203968,88.6342662809689301],"hsluv":[70.6631891871382152,100.000000000013173,88.6342662809689301]},"#ffdd55":{"lch":[88.7474847112806486,86.0957791731635353,69.970644696948483],"luv":[88.7474847112806486,29.4879375414461293,80.8884709398435433],"rgb":[1,0.866666666666666696,0.333333333333333315],"xyz":[0.687339173533784153,0.736303460560541079,0.191863182832022222],"hpluv":[69.970644696948483,341.559684906391112,88.7474847112806486],"hsluv":[69.970644696948483,100.000000000013429,88.7474847112806486]},"#ffdd66":{"lch":[88.8911610589964454,80.258955992054581,68.9956984045855819],"luv":[88.8911610589964454,28.7678627944319345,74.9260307715235427],"rgb":[1,0.866666666666666696,0.4],"xyz":[0.694924169307292394,0.739337458869944397,0.231810827239166184],"hpluv":[68.9956984045855819,322.902183683526573,88.8911610589964454],"hsluv":[68.9956984045855819,100.000000000013586,88.8911610589964454]},"#ffdd77":{"lch":[89.0670520916409885,73.323747836811151,67.6276760217336346],"luv":[89.0670520916409885,27.9087592291374555,67.8046691248198812],"rgb":[1,0.866666666666666696,0.466666666666666674],"xyz":[0.704238182327494244,0.743063064078025248,0.280864629145564093],"hpluv":[67.6276760217336346,300.178104609939055,89.0670520916409885],"hsluv":[67.6276760217336346,100.000000000014367,89.0670520916409885]},"#ffdd88":{"lch":[89.2766635023192379,65.3617696880632622,65.6822421460803554],"luv":[89.2766635023192379,26.9157684368328205,59.5625918359016637],"rgb":[1,0.866666666666666696,0.533333333333333326],"xyz":[0.715378599429438156,0.747519230918802791,0.339537492549136233],"hpluv":[65.6822421460803554,273.280966903928913,89.2766635023192379],"hsluv":[65.6822421460803554,100.00000000001468,89.2766635023192379]},"#ffdd99":{"lch":[89.5212778802452362,56.4966374008110606,62.8311838382076928],"luv":[89.5212778802452362,25.7971434460875209,50.2630821540094814],"rgb":[1,0.866666666666666696,0.6],"xyz":[0.7284355635385108,0.752742016562432,0.408304170190254168],"hpluv":[62.8311838382076928,242.212083001239,89.5212778802452362],"hsluv":[62.8311838382076928,100.000000000014893,89.5212778802452362]},"#ffddaa":{"lch":[89.8019739344538408,46.9317870748453103,58.439957868293348],"luv":[89.8019739344538408,24.5637119196041205,39.9902074859498],"rgb":[1,0.866666666666666696,0.66666666666666663],"xyz":[0.743493256503763411,0.75876509374853307,0.487608019807252768],"hpluv":[58.439957868293348,207.216087370130765,89.8019739344538408],"hsluv":[58.439957868293348,100.000000000015916,89.8019739344538408]},"#ffddbb":{"lch":[90.1196406145249114,37.0342016806554142,51.1553076529108282],"luv":[90.1196406145249114,23.228278171915747,28.8440494260352231],"rgb":[1,0.866666666666666696,0.733333333333333282],"xyz":[0.7606308486111,0.765620130591467829,0.57786600490589457],"hpluv":[51.1553076529108282,169.207898233907059,90.1196406145249114],"hsluv":[51.1553076529108282,100.00000000001647,90.1196406145249114]},"#ffddcc":{"lch":[90.4749882420216665,27.6093496047032829,37.8361109659034085],"luv":[90.4749882420216665,21.8049964890922183,16.9357111957368183],"rgb":[1,0.866666666666666696,0.8],"xyz":[0.779923224054821729,0.773337080768956686,0.679472515576164726],"hpluv":[37.8361109659034085,131.228146902908946,90.4749882420216665],"hsluv":[37.8361109659034085,100.000000000017565,90.4749882420216665]},"#ffdddd":{"lch":[90.8685579434819743,20.7762078419716971,12.1770506300632935],"luv":[90.8685579434819743,20.3087527298379129,4.38239373528981613],"rgb":[1,0.866666666666666696,0.866666666666666696],"xyz":[0.801441549605455328,0.781944410989210192,0.792802363476170724],"hpluv":[12.1770506300632935,103.332662997484363,90.8685579434819743],"hsluv":[12.1770506300632935,100.000000000018645,90.8685579434819743]},"#ffddee":{"lch":[91.3007301977477255,20.6730653908416642,335.121130580225611],"luv":[91.3007301977477255,18.7545890012647547,-8.69718483462634318],"rgb":[1,0.866666666666666696,0.933333333333333348],"xyz":[0.82525372987163,0.791469283095680209,0.918213179544694],"hpluv":[335.121130580225611,108.301670079840079,91.3007301977477255],"hsluv":[335.121130580225611,100.000000000019696,91.3007301977477255]},"#ffddff":{"lch":[91.7717330140538081,28.0468143452174594,307.715012949251673],"luv":[91.7717330140538081,17.1571994583452359,-22.1868046744377736],"rgb":[1,0.866666666666666696,1],"xyz":[0.851424778281461458,0.801937702459612933,1.05604736783647568],"hpluv":[307.715012949251673,155.925616416863875,91.7717330140538081],"hsluv":[307.715012949251673,100.000000000021274,91.7717330140538081]},"#aa5500":{"lch":[45.6948541105979729,81.8101604081173406,31.0178153240564285],"luv":[45.6948541105979729,70.1118895783240674,42.1571498770823254],"rgb":[0.66666666666666663,0.333333333333333315,0],"xyz":[0.198255511194170453,0.150443302049994065,0.0185984173503046732],"hpluv":[31.0178153240564285,227.184802334875343,45.6948541105979729],"hsluv":[31.0178153240564285,100.000000000002132,45.6948541105979729]},"#aa5511":{"lch":[45.7501207141343542,80.2053049231342357,30.0334267749456458],"luv":[45.7501207141343542,69.4364235827854088,40.1431690060082786],"rgb":[0.66666666666666663,0.333333333333333315,0.0666666666666666657],"xyz":[0.199267176693807585,0.150847968249848918,0.0239265223150603029],"hpluv":[30.0334267749456458,222.459100300712947,45.7501207141343542],"hsluv":[30.0334267749456458,95.7485290168496874,45.7501207141343542]},"#aa5522":{"lch":[45.8523093955831129,77.3637164970789826,28.1463245173948593],"luv":[45.8523093955831129,68.2151287979892231,36.4943945464800308],"rgb":[0.66666666666666663,0.333333333333333315,0.133333333333333331],"xyz":[0.201142534832284586,0.151598111505239747,0.0338034085110395],"hpluv":[28.1463245173948593,214.099393521154866,45.8523093955831129],"hsluv":[28.1463245173948593,88.0687786146531835,45.8523093955831129]},"#aa5533":{"lch":[46.0198296754266707,73.057054041475979,24.8605966968797674],"luv":[46.0198296754266707,66.2871018342682845,30.7140566456547255],"rgb":[0.66666666666666663,0.333333333333333315,0.2],"xyz":[0.20423028556474232,0.152833211798222846,0.0500655623686506457],"hpluv":[24.8605966968797674,201.444992058953261,46.0198296754266707],"hsluv":[24.8605966968797674,75.9647480733224683,46.0198296754266707]},"#aa5544":{"lch":[46.260105303202792,67.6400753638857,19.7251402693972757],"luv":[46.260105303202792,63.6711277752059743,22.829088529013422],"rgb":[0.66666666666666663,0.333333333333333315,0.266666666666666663],"xyz":[0.208688280808961207,0.154616409895910439,0.0735443373215372842],"hpluv":[19.7251402693972757,185.539675327038225,46.260105303202792],"hsluv":[19.7251402693972757,59.5831884891410581,46.260105303202792]},"#aa5555":{"lch":[46.5785950143652201,61.8404850960729462,12.1770506300619488],"luv":[46.5785950143652201,60.4491026496292108,13.0442165641410206],"rgb":[0.66666666666666663,0.333333333333333315,0.333333333333333315],"xyz":[0.21465069484832322,0.157001375511655272,0.1049463845955112],"hpluv":[12.1770506300619488,168.471262237657498,46.5785950143652201],"hsluv":[12.1770506300619488,39.4780386186733381,46.5785950143652201]},"#aa5566":{"lch":[46.9791292969753727,56.7719582569154682,1.70455911852653919],"luv":[46.9791292969753727,56.7468364589401801,1.68872621441415594],"rgb":[0.66666666666666663,0.333333333333333315,0.4],"xyz":[0.222235690621831378,0.160035373821058563,0.144894029002655161],"hpluv":[1.70455911852653919,153.34451205140752,46.9791292969753727],"hsluv":[1.70455911852653919,42.9013314457092818,46.9791292969753727]},"#aa5577":{"lch":[47.4641008255870247,53.815805251865207,348.374645401059922],"luv":[47.4641008255870247,52.7118371029350072,-10.8444974129891012],"rgb":[0.66666666666666663,0.333333333333333315,0.466666666666666674],"xyz":[0.231549703642033311,0.163760979029139386,0.193947830909053071],"hpluv":[348.374645401059922,143.874527939012694,47.4641008255870247],"hsluv":[348.374645401059922,46.6096363259647291,47.4641008255870247]},"#aa5588":{"lch":[48.0346061313586716,54.1759936988691209,333.519859036575326],"luv":[48.0346061313586716,48.4923339918738,-24.1564036495598238],"rgb":[0.66666666666666663,0.333333333333333315,0.533333333333333326],"xyz":[0.242690120743977111,0.168217145869916984,0.252620694312625238],"hpluv":[333.519859036575326,143.117248614217317,48.0346061313586716],"hsluv":[333.519859036575326,50.4580944804944309,48.0346061313586716]},"#aa5599":{"lch":[48.6905763376225,58.2309730669685877,319.412334073918828],"luv":[48.6905763376225,44.2212637341432782,-37.885697275903027],"rgb":[0.66666666666666663,0.333333333333333315,0.6],"xyz":[0.255747084853049866,0.173439931513546142,0.321387371953743117],"hpluv":[319.412334073918828,151.756904292295189,48.6905763376225],"hsluv":[319.412334073918828,54.3174516364451492,48.6905763376225]},"#aa55aa":{"lch":[49.4309115490906095,65.3990862514302904,307.715012949244453],"luv":[49.4309115490906095,40.0068668547544135,-51.7348150377284242],"rgb":[0.66666666666666663,0.333333333333333315,0.66666666666666663],"xyz":[0.270804777818302367,0.179463008699647236,0.400691221570741718],"hpluv":[307.715012949244453,167.885190443837445,49.4309115490906095],"hsluv":[307.715012949244453,58.0831627335764651,49.4309115490906095]},"#aa55bb":{"lch":[50.2536225490081137,74.6889496830887651,298.754319252296796],"luv":[50.2536225490081137,35.9294822147829578,-65.4790921786531896],"rgb":[0.66666666666666663,0.333333333333333315,0.733333333333333282],"xyz":[0.287942369925639041,0.186318045542582,0.490949206669383464],"hpluv":[298.754319252296796,188.594188212432869,50.2536225490081137],"hsluv":[298.754319252296796,61.6784311565058445,50.2536225490081137]},"#aa55cc":{"lch":[51.1559779262539394,85.2173265065914194,292.086991032215337],"luv":[51.1559779262539394,32.0428980728004476,-78.9635702082114],"rgb":[0.66666666666666663,0.333333333333333315,0.8],"xyz":[0.307234745369360795,0.194034995720070796,0.59255571733965362],"hpluv":[292.086991032215337,211.383381159177,51.1559779262539394],"hsluv":[292.086991032215337,65.0527897247966536,51.1559779262539394]},"#aa55dd":{"lch":[52.1346521614624407,96.3659410029227,287.126655540846059],"luv":[52.1346521614624407,28.3783197098194826,-92.0927008824589137],"rgb":[0.66666666666666663,0.333333333333333315,0.866666666666666696],"xyz":[0.328753070919994284,0.20264232594032433,0.705885565239659618],"hpluv":[287.126655540846059,234.550526854663673,52.1346521614624407],"hsluv":[287.126655540846059,75.3446722268955256,52.1346521614624407]},"#aa55ee":{"lch":[53.1858694266106227,107.745747725204239,283.388779775386126],"luv":[53.1858694266106227,24.9493252566021582,-104.817352199450397],"rgb":[0.66666666666666663,0.333333333333333315,0.933333333333333348],"xyz":[0.352565251186169049,0.212167198046794375,0.831296381308182841],"hpluv":[283.388779775386126,257.065149407391289,53.1858694266106227],"hsluv":[283.388779775386126,87.5522298773574335,53.1858694266106227]},"#aa55ff":{"lch":[54.3055382240479361,119.125691570750178,280.523377624217346],"luv":[54.3055382240479361,21.7567225446561139,-117.12205350114192],"rgb":[0.66666666666666663,0.333333333333333315,1],"xyz":[0.378736299596000414,0.222635617410727071,0.969130569599964686],"hpluv":[280.523377624217346,278.356033354379861,54.3055382240479361],"hsluv":[280.523377624217346,99.999999999999,54.3055382240479361]},"#886600":{"lch":[45.272583339231268,54.7393681124008964,58.6614018365849361],"luv":[45.272583339231268,28.4696504737342408,46.7533680417607513],"rgb":[0.533333333333333326,0.4,0],"xyz":[0.149042792889247183,0.147375267331133541,0.020596483543415256],"hpluv":[58.6614018365849361,153.427719347991228,45.272583339231268],"hsluv":[58.6614018365849361,100.000000000002288,45.272583339231268]},"#886611":{"lch":[45.3286132830504442,52.7569286908504935,57.8019218571504112],"luv":[45.3286132830504442,28.1114182485843394,44.6434954830448234],"rgb":[0.533333333333333326,0.4,0.0666666666666666657],"xyz":[0.150054458388884315,0.147779933530988394,0.0259245885081708857],"hpluv":[57.8019218571504112,147.688404254652824,45.3286132830504442],"hsluv":[57.8019218571504112,95.5933263309827765,45.3286132830504442]},"#886622":{"lch":[45.4322079122274616,49.2027541487777427,56.0700181971155658],"luv":[45.4322079122274616,27.4639619392241023,40.8245246197174367],"rgb":[0.533333333333333326,0.4,0.133333333333333331],"xyz":[0.151929816527361317,0.148530076786379223,0.0358014747041500853],"hpluv":[56.0700181971155658,137.424731357888106,45.4322079122274616],"hsluv":[56.0700181971155658,87.640709221506242,45.4322079122274616]},"#886633":{"lch":[45.6020177209920377,43.6934420281053448,52.7580970187872822],"luv":[45.6020177209920377,26.4424624059276816,34.7838045385277539],"rgb":[0.533333333333333326,0.4,0.2],"xyz":[0.155017567259819078,0.149765177079362322,0.0520636285617612285],"hpluv":[52.7580970187872822,121.582627853675135,45.6020177209920377],"hsluv":[52.7580970187872822,75.126145239043538,45.6020177209920377]},"#886644":{"lch":[45.8455444844743383,36.5157977851307862,46.6690567683987183],"luv":[45.8455444844743383,25.057552877875338,26.56167411246971],"rgb":[0.533333333333333326,0.4,0.266666666666666663],"xyz":[0.159475562504037938,0.151548375177049915,0.0755424035146478601],"hpluv":[46.6690567683987183,101.07016738030697,45.8455444844743383],"hsluv":[46.6690567683987183,58.2269221932267413,45.8455444844743383]},"#886655":{"lch":[46.1682850891648,28.5288655346450497,35.057100942904512],"luv":[46.1682850891648,23.3531590809093643,16.3867669061227161],"rgb":[0.533333333333333326,0.4,0.333333333333333315],"xyz":[0.165437976543399923,0.153933340792794748,0.106944450788621775],"hpluv":[35.057100942904512,78.4115584201214517,46.1682850891648],"hsluv":[35.057100942904512,37.5458750067509825,46.1682850891648]},"#886666":{"lch":[46.5740725388720946,21.8884171395184417,12.1770506300623786],"luv":[46.5740725388720946,21.3959378301945833,4.61699569417310141],"rgb":[0.533333333333333326,0.4,0.4],"xyz":[0.173022972316908108,0.156967339102198039,0.146892095195765737],"hpluv":[12.1770506300623786,59.6361320849851921,46.5740725388720946],"hsluv":[12.1770506300623786,13.9745942082290213,46.5740725388720946]},"#886677":{"lch":[47.0652698878111053,20.9860757761626395,336.621799391030947],"luv":[47.0652698878111053,19.2632377900225293,-8.32724722389627559],"rgb":[0.533333333333333326,0.4,0.466666666666666674],"xyz":[0.18233698533711,0.160692944310278862,0.195945897102163646],"hpluv":[336.621799391030947,56.5809206524471051,47.0652698878111053],"hsluv":[336.621799391030947,19.7183189325496855,47.0652698878111053]},"#886688":{"lch":[47.6429159175320649,27.8420771343032278,307.715012949247239],"luv":[47.6429159175320649,17.0319546757823481,-22.0248445868429776],"rgb":[0.533333333333333326,0.4,0.533333333333333326],"xyz":[0.193477402439053869,0.16514911115105646,0.254618760505735842],"hpluv":[307.715012949247239,74.1553731862279335,47.6429159175320649],"hsluv":[307.715012949247239,25.6555006249089494,47.6429159175320649]},"#886699":{"lch":[48.306860672000596,39.0046617113806562,292.251886736336132],"luv":[48.306860672000596,14.770249996667463,-36.0999078981538304],"rgb":[0.533333333333333326,0.4,0.6],"xyz":[0.206534366548126569,0.170371896794685618,0.323385438146853721],"hpluv":[292.251886736336132,102.458272059709785,48.306860672000596],"hsluv":[292.251886736336132,31.5854767603208231,48.306860672000596]},"#8866aa":{"lch":[49.0559053000777112,51.7871044207240132,284.005102499462396],"luv":[49.0559053000777112,12.5329093477081912,-50.2476901714407305],"rgb":[0.533333333333333326,0.4,0.66666666666666663],"xyz":[0.221592059513379125,0.176394973980786712,0.402689287763852322],"hpluv":[284.005102499462396,133.958310232957899,49.0559053000777112],"hsluv":[284.005102499462396,39.6059098285329867,49.0559053000777112]},"#8866bb":{"lch":[49.8879495217490074,65.0723394771694501,279.16089377463328],"luv":[49.8879495217490074,10.3599978518109275,-64.242352148271],"rgb":[0.533333333333333326,0.4,0.733333333333333282],"xyz":[0.238729651620715744,0.183250010823721471,0.492947272862494068],"hpluv":[279.16089377463328,165.516042277675325,49.8879495217490074],"hsluv":[279.16089377463328,51.4342030459355897,49.8879495217490074]},"#8866cc":{"lch":[50.800144438276476,78.3702679805165161,276.063171305995638],"luv":[50.800144438276476,8.2778522611756955,-77.9318680982312912],"rgb":[0.533333333333333326,0.4,0.8],"xyz":[0.258022027064437498,0.190966961001210273,0.594553783532764224],"hpluv":[276.063171305995638,195.760791019658512,50.800144438276476],"hsluv":[276.063171305995638,63.370404435102877,50.800144438276476]},"#8866dd":{"lch":[51.7890458420015278,91.4433004674113903,273.951375062119212],"luv":[51.7890458420015278,6.3013441888180548,-91.225929766636682],"rgb":[0.533333333333333326,0.4,0.866666666666666696],"xyz":[0.279540352615071042,0.199574291221463807,0.707883631432770222],"hpluv":[273.951375062119212,224.054313572832513,51.7890458420015278],"hsluv":[273.951375062119212,75.4110532620532,51.7890458420015278]},"#8866ee":{"lch":[52.8507624936088831,104.176067138923727,272.440799986921],"luv":[52.8507624936088831,4.4365578942807,-104.081554170680207],"rgb":[0.533333333333333326,0.4,0.933333333333333348],"xyz":[0.303352532881245751,0.209099163327933851,0.833294447501293445],"hpluv":[272.440799986921,250.124381092910085,52.8507624936088831],"hsluv":[272.440799986921,87.5962217171162365,52.8507624936088831]},"#8866ff":{"lch":[53.9810943197935273,116.520298408763196,271.319576027424205],"luv":[53.9810943197935273,2.6833355157121912,-116.48939716462327],"rgb":[0.533333333333333326,0.4,1],"xyz":[0.329523581291077172,0.219567582691866547,0.97112863579307529],"hpluv":[271.319576027424205,273.904539658900717,53.9810943197935273],"hsluv":[271.319576027424205,99.9999999999990621,53.9810943197935273]},"#ffee00":{"lch":[92.75564548426334,102.358730475882979,79.2433869538170228],"luv":[92.75564548426334,19.1039702538988,100.560171167180329],"rgb":[1,0.933333333333333348,0],"xyz":[0.718122766220146147,0.824102939779910892,0.121241474366986887],"hpluv":[79.2433869538170228,651.393632104361359,92.75564548426334],"hsluv":[79.2433869538170228,100.000000000024428,92.75564548426334]},"#ffee11":{"lch":[92.7734436379168,101.564402459740549,79.2015044483446218],"luv":[92.7734436379168,19.0286516433192254,99.765917344759373],"rgb":[1,0.933333333333333348,0.0666666666666666657],"xyz":[0.719134431719783307,0.824507605979765801,0.12656957933174251],"hpluv":[79.2015044483446218,648.021125158270593,92.7734436379168],"hsluv":[79.2015044483446218,100.000000000024428,92.7734436379168]},"#ffee22":{"lch":[92.8064212727168183,100.098587827824673,79.1224559985664797],"luv":[92.8064212727168183,18.8896613956421291,98.3000914418838079],"rgb":[1,0.933333333333333348,0.133333333333333331],"xyz":[0.721009789858260253,0.825257749235156601,0.136446465527721716],"hpluv":[79.1224559985664797,641.762708667564539,92.8064212727168183],"hsluv":[79.1224559985664797,100.000000000024357,92.8064212727168183]},"#ffee33":{"lch":[92.8606749716073665,97.7038183815635506,78.9881622996309147],"luv":[92.8606749716073665,18.6625824309063972,95.9048702796014396],"rgb":[1,0.933333333333333348,0.2],"xyz":[0.72409754059071807,0.826492849528139728,0.152708619385332867],"hpluv":[78.9881622996309147,631.438241912838748,92.8606749716073665],"hsluv":[78.9881622996309147,100.000000000024599,92.8606749716073665]},"#ffee44":{"lch":[92.9389094487226828,94.2867391890675606,78.7846200921967181],"luv":[92.9389094487226828,18.3385503337116411,92.4861436030564192],"rgb":[1,0.933333333333333348,0.266666666666666663],"xyz":[0.728555535834936929,0.828276047625827294,0.176187394338219505],"hpluv":[78.7846200921967181,616.484076987319668,92.9389094487226828],"hsluv":[78.7846200921967181,100.000000000025381,92.9389094487226828]},"#ffee55":{"lch":[93.0433700241155179,89.7896797607108,78.4929149488566082],"luv":[93.0433700241155179,17.9120631143144244,87.984911129805738],"rgb":[1,0.933333333333333348,0.333333333333333315],"xyz":[0.734517949874298859,0.830661013241572,0.207589441612193393],"hpluv":[78.4929149488566082,596.384103057951847,93.0433700241155179],"hsluv":[78.4929149488566082,100.000000000025906,93.0433700241155179]},"#ffee66":{"lch":[93.1759694096933,84.1867368500463,78.0854442567743661],"luv":[93.1759694096933,17.3805845725397461,82.3730656305550895],"rgb":[1,0.933333333333333348,0.4],"xyz":[0.7421029456478071,0.833695011550975362,0.247537086019337382],"hpluv":[78.0854442567743661,570.62648367707834,93.1759694096933],"hsluv":[78.0854442567743661,100.000000000026517,93.1759694096933]},"#ffee77":{"lch":[93.3383558005883742,77.4816602435733586,77.5195453952684659],"luv":[93.3383558005883742,16.7442947506152713,75.6507519288807515],"rgb":[1,0.933333333333333348,0.466666666666666674],"xyz":[0.751416958668009,0.837420616759056213,0.296590887925735291],"hpluv":[77.5195453952684659,538.663675570032183,93.3383558005883742],"hsluv":[77.5195453952684659,100.00000000002693,93.3383558005883742]},"#ffee88":{"lch":[93.5319535615141433,69.7063855050026433,76.7254067288761235],"luv":[93.5319535615141433,16.0058531534094222,67.8438858336072599],"rgb":[1,0.933333333333333348,0.533333333333333326],"xyz":[0.762557375769952861,0.841876783599833756,0.355263751329307431],"hpluv":[76.7254067288761235,499.867858345774721,93.5319535615141433],"hsluv":[76.7254067288761235,100.000000000028109,93.5319535615141433]},"#ffee99":{"lch":[93.7579894103796647,60.9203426164438397,75.5807218945013517],"luv":[93.7579894103796647,15.1701259512809905,59.0013171304435744],"rgb":[1,0.933333333333333348,0.6],"xyz":[0.775614339879025505,0.847099569243463,0.424030428970425366],"hpluv":[75.5807218945013517,453.479030486808085,93.7579894103796647],"hsluv":[75.5807218945013517,100.000000000029459,93.7579894103796647]},"#ffeeaa":{"lch":[94.0175103342715204,51.2122166590618946,73.8511258956299],"luv":[94.0175103342715204,14.2438643230739057,49.191497886124175],"rgb":[1,0.933333333333333348,0.66666666666666663],"xyz":[0.790672032844278116,0.853122646429564,0.503334278587424],"hpluv":[73.8511258956299,398.552269307706354,94.0175103342715204],"hsluv":[73.8511258956299,100.00000000003169,94.0175103342715204]},"#ffeebb":{"lch":[94.3113965930375855,40.7102572776027571,71.0277189369888],"luv":[94.3113965930375855,13.2353397134719373,38.4987120599845625],"rgb":[1,0.933333333333333348,0.733333333333333282],"xyz":[0.80780962495161468,0.859977683272498794,0.593592263686065658],"hpluv":[71.0277189369888,333.94796839081863,94.3113965930375855],"hsluv":[71.0277189369888,100.000000000032855,94.3113965930375855]},"#ffeecc":{"lch":[94.6403717602024841,29.6267857036886042,65.7803861656043125],"luv":[94.6403717602024841,12.1539519061426287,27.0190281874729799],"rgb":[1,0.933333333333333348,0.8],"xyz":[0.827102000395336434,0.867694633449987651,0.695198774356335814],"hpluv":[65.7803861656043125,258.601677072085806,94.6403717602024841],"hsluv":[65.7803861656043125,100.000000000035726,94.6403717602024841]},"#ffeedd":{"lch":[95.0050109981125814,18.4911495042727,53.4580761074439366],"luv":[95.0050109981125814,11.0098304435300403,14.8561853648264481],"rgb":[1,0.933333333333333348,0.866666666666666696],"xyz":[0.84862032594597,0.876301963670241157,0.808528622256341811],"hpluv":[53.4580761074439366,173.670551799097524,95.0050109981125814],"hsluv":[53.4580761074439366,100.000000000039279,95.0050109981125814]},"#ffeeee":{"lch":[95.4057483293867,10.0393308083340358,12.1770506300655121],"luv":[95.4057483293867,9.81345048674430487,2.11762900985580904],"rgb":[1,0.933333333333333348,0.933333333333333348],"xyz":[0.872432506212144743,0.885826835776711174,0.933939438324865],"hpluv":[12.1770506300655121,102.829227108855335,95.4057483293867],"hsluv":[12.1770506300655121,100.000000000042746,95.4057483293867]},"#ffeeff":{"lch":[95.8428833991312104,14.017983351086059,307.715012949261848],"luv":[95.8428833991312104,8.57528179129596,-11.0891117512266888],"rgb":[1,0.933333333333333348,1],"xyz":[0.898603554621976164,0.896295255140643898,1.07177362661664688],"hpluv":[307.715012949261848,159.207478793902965,95.8428833991312104],"hsluv":[307.715012949261848,100.000000000047876,95.8428833991312104]},"#aa6600":{"lch":[49.5566255632669623,74.0434564420528574,40.5370999312324685],"luv":[49.5566255632669623,56.2719368465296,48.1238253407432595],"rgb":[0.66666666666666663,0.4,0],"xyz":[0.213283568900016929,0.180499417461687406,0.0236077699189200241],"hpluv":[40.5370999312324685,189.593866720893345,49.5566255632669623],"hsluv":[40.5370999312324685,100.000000000002302,49.5566255632669623]},"#aa6611":{"lch":[49.6055800152373934,72.4782904829715449,39.6736286483530876],"luv":[49.6055800152373934,55.7860674256664097,46.2711278500211662],"rgb":[0.66666666666666663,0.4,0.0666666666666666657],"xyz":[0.214295234399654061,0.180904083661542259,0.0289358748836756538],"hpluv":[39.6736286483530876,185.402990863318706,49.6055800152373934],"hsluv":[39.6736286483530876,96.4267217319678878,49.6055800152373934]},"#aa6622":{"lch":[49.6961357673044404,69.6784302133091,38.0044715349972151],"luv":[49.6961357673044404,54.9040042209680124,42.902610147809348],"rgb":[0.66666666666666663,0.4,0.133333333333333331],"xyz":[0.216170592538131062,0.181654226916933087,0.0388127610796548533],"hpluv":[38.0044715349972151,177.916023719914563,49.6961357673044404],"hsluv":[38.0044715349972151,89.9454244119252593,49.6961357673044404]},"#aa6633":{"lch":[49.8446929303716502,65.3554895773238798,35.0519229290669685],"luv":[49.8446929303716502,53.5020897896209959,37.5348692023167061],"rgb":[0.66666666666666663,0.4,0.2],"xyz":[0.219258343270588796,0.182889327209916186,0.055074914937266],"hpluv":[35.0519229290669685,166.380518722129068,49.8446929303716502],"hsluv":[35.0519229290669685,79.6601301034586,49.8446929303716502]},"#aa6644":{"lch":[50.0579996788189163,59.7471791719702878,30.3078082111971625],"luv":[50.0579996788189163,51.5813401714318687,30.1511320703974341],"rgb":[0.66666666666666663,0.4,0.266666666666666663],"xyz":[0.223716338514807683,0.18467252530760378,0.0785536898901526282],"hpluv":[30.3078082111971625,151.454869534606559,50.0579996788189163],"hsluv":[30.3078082111971625,65.6016329960131,50.0579996788189163]},"#aa6655":{"lch":[50.3411543587309183,53.4384070136854916,23.0123473649378063],"luv":[50.3411543587309183,49.1858121787411307,20.8906492114991877],"rgb":[0.66666666666666663,0.4,0.333333333333333315],"xyz":[0.229678752554169696,0.187057490923348613,0.109955737164126544],"hpluv":[23.0123473649378063,134.70064023894011,50.3411543587309183],"hsluv":[23.0123473649378063,48.1262851503794238,50.3411543587309183]},"#aa6666":{"lch":[50.6979081899742283,47.4599132867605107,12.1770506300620198],"luv":[50.6979081899742283,46.3920870859415544,10.0108753362152232],"rgb":[0.66666666666666663,0.4,0.4],"xyz":[0.237263748327677854,0.190091489232751903,0.149903381571270505],"hpluv":[12.1770506300620198,118.788999996072334,50.6979081899742283],"hsluv":[12.1770506300620198,27.8359446414257086,50.6979081899742283]},"#aa6677":{"lch":[51.1308297914663399,43.3502150416948382,357.146673366158041],"luv":[51.1308297914663399,43.29647113668576,-2.15794607701909591],"rgb":[0.66666666666666663,0.4,0.466666666666666674],"xyz":[0.246577761347879787,0.193817094440832727,0.198957183477668414],"hpluv":[357.146673366158041,107.584013476394517,51.1308297914663399],"hsluv":[357.146673366158041,31.9217683762365354,51.1308297914663399]},"#aa6688":{"lch":[51.6414184020027,42.8134625942885876,339.120025752150127],"luv":[51.6414184020027,40.0018640870324234,-15.2592086582212207],"rgb":[0.66666666666666663,0.4,0.533333333333333326],"xyz":[0.257718178449823587,0.198273261281610325,0.257630046881240582],"hpluv":[339.120025752150127,105.201399585535427,51.6414184020027],"hsluv":[339.120025752150127,36.2396804223311,51.6414184020027]},"#aa6699":{"lch":[52.2302006219705675,46.6703467022409342,321.661853982703349],"luv":[52.2302006219705675,36.6065194780657563,-28.949680361091449],"rgb":[0.66666666666666663,0.4,0.6],"xyz":[0.270775142558896342,0.203496046925239482,0.326396724522358461],"hpluv":[321.661853982703349,113.385797667979,52.2302006219705675],"hsluv":[321.661853982703349,40.6514838109423,52.2302006219705675]},"#aa66aa":{"lch":[52.8968256208086274,54.2656136904176165,307.715012949245079],"luv":[52.8968256208086274,33.1961393674155048,-42.9275338250028753],"rgb":[0.66666666666666663,0.4,0.66666666666666663],"xyz":[0.285832835524148843,0.209519124111340577,0.405700574139357117],"hpluv":[307.715012949245079,130.177052782763241,52.8968256208086274],"hsluv":[307.715012949245079,45.0372955528084091,52.8968256208086274]},"#aa66bb":{"lch":[53.6401644756464293,64.2916348467718848,297.653919381785329],"luv":[53.6401644756464293,29.8396642728746109,-56.9474209016772193],"rgb":[0.66666666666666663,0.4,0.733333333333333282],"xyz":[0.302970427631485517,0.216374160954275335,0.495958559237998808],"hpluv":[297.653919381785329,152.091062924306783,53.6401644756464293],"hsluv":[297.653919381785329,49.3013965401631964,53.6401644756464293]},"#aa66cc":{"lch":[54.4584144535918853,75.6506824974921699,290.576693925999962],"luv":[54.4584144535918853,26.5882539678026326,-70.824363839571447],"rgb":[0.66666666666666663,0.4,0.8],"xyz":[0.322262803075207271,0.224091111131764137,0.597565069908269],"hpluv":[290.576693925999962,176.273563499159138,54.4584144535918853],"hsluv":[290.576693925999962,59.8478295858589107,54.4584144535918853]},"#aa66dd":{"lch":[55.3492064676394619,87.6329338161637423,285.539109011475546],"luv":[55.3492064676394619,23.4765185392287,-84.4297587732275],"rgb":[0.66666666666666663,0.4,0.866666666666666696],"xyz":[0.343781128625840759,0.232698441352017671,0.710894917808275],"hpluv":[285.539109011475546,200.907097340780666,55.3492064676394619],"hsluv":[285.539109011475546,72.9499123576365,55.3492064676394619]},"#aa66ee":{"lch":[56.3097127205812171,99.8160041995885337,281.866291349003632],"luv":[56.3097127205812171,20.525011879724925,-97.6829492885499775],"rgb":[0.66666666666666663,0.4,0.933333333333333348],"xyz":[0.367593308892015525,0.242223313458487716,0.836305733876798185],"hpluv":[281.866291349003632,224.934563930918017,56.3097127205812171],"hsluv":[281.866291349003632,86.3166325899195215,56.3097127205812171]},"#aa66ff":{"lch":[57.3367512293125543,111.956114799504135,279.118878442970129],"luv":[57.3367512293125543,17.7431860168323468,-110.541173283857603],"rgb":[0.66666666666666663,0.4,1],"xyz":[0.39376435730184689,0.252691732822420412,0.97413992216858],"hpluv":[279.118878442970129,247.773048158040382,57.3367512293125543],"hsluv":[279.118878442970129,99.9999999999988631,57.3367512293125543]},"#887700":{"lch":[50.0114915023736586,55.8665567864094825,73.357205010908],"luv":[50.0114915023736586,16.0004093344436384,53.5262465366231766],"rgb":[0.533333333333333326,0.466666666666666674,0],"xyz":[0.167496530942664812,0.184282743437969299,0.0267477295612209565],"hpluv":[73.357205010908,141.749463920516746,50.0114915023736586],"hsluv":[73.357205010908,100.000000000002359,50.0114915023736586]},"#887711":{"lch":[50.0597743565714524,53.993823922257576,73.0031869817398302],"luv":[50.0597743565714524,15.783394234863108,51.6354286142242103],"rgb":[0.533333333333333326,0.466666666666666674,0.0666666666666666657],"xyz":[0.168508196442301944,0.184687409637824151,0.0320758345259765862],"hpluv":[73.0031869817398302,136.865669051735267,50.0597743565714524],"hsluv":[73.0031869817398302,96.4507191106164328,50.0597743565714524]},"#887722":{"lch":[50.1490916772086592,50.5946145563497751,72.2920831328592755],"luv":[50.1490916772086592,15.3890953737340599,48.1974145124374616],"rgb":[0.533333333333333326,0.466666666666666674,0.133333333333333331],"xyz":[0.170383554580778945,0.18543755289321498,0.0419527207219557857],"hpluv":[72.2920831328592755,128.020802989304741,50.1490916772086592],"hsluv":[72.2920831328592755,90.012010730737714,50.1490916772086592]},"#887733":{"lch":[50.2956280558193356,45.1970113165044083,70.9372107781068735],"luv":[50.2956280558193356,14.7615306672340392,42.718462569532349],"rgb":[0.533333333333333326,0.466666666666666674,0.2],"xyz":[0.173471305313236679,0.186672653186198079,0.058214874579566929],"hpluv":[70.9372107781068735,114.029917097227894,50.2956280558193356],"hsluv":[70.9372107781068735,79.7918184760720237,50.2956280558193356]},"#887744":{"lch":[50.5060566549544916,37.8272673959478567,68.4411772520018076],"luv":[50.5060566549544916,13.89986571870684,35.1809023711225777],"rgb":[0.533333333333333326,0.466666666666666674,0.266666666666666663],"xyz":[0.177929300557455566,0.188455851283885673,0.0816936495324535605],"hpluv":[68.4411772520018076,95.0387759917387598,50.5060566549544916],"hsluv":[68.4411772520018076,65.8173762074568316,50.5060566549544916]},"#887755":{"lch":[50.7854328179731453,28.7445471843262688,63.5083223958924279],"luv":[50.7854328179731453,12.8220173934607509,25.7263456945161408],"rgb":[0.533333333333333326,0.466666666666666674,0.333333333333333315],"xyz":[0.183891714596817579,0.190840816899630505,0.113095696806427476],"hpluv":[63.5083223958924279,71.82169329487634,50.7854328179731453],"hsluv":[63.5083223958924279,48.4385690265679756,50.7854328179731453]},"#887766":{"lch":[51.1374932189691549,18.6360854649452037,51.6613245975388082],"luv":[51.1374932189691549,11.5601245482137447,14.6173596072111405],"rgb":[0.533333333333333326,0.466666666666666674,0.4],"xyz":[0.191476710370325737,0.193874815209033796,0.153043341213571438],"hpluv":[51.6613245975388082,46.2439140208651,51.1374932189691549],"hsluv":[51.6613245975388082,28.2492665088726049,51.1374932189691549]},"#887777":{"lch":[51.5648179079599629,10.388802862097231,12.1770506300635812],"luv":[51.5648179079599629,10.1550595801770775,2.19134429758843829],"rgb":[0.533333333333333326,0.466666666666666674,0.466666666666666674],"xyz":[0.20079072339052767,0.197600420417114619,0.202097143119969347],"hpluv":[12.1770506300635812,25.5653264810281158,51.5648179079599629],"hsluv":[12.1770506300635812,5.9907484084339373,51.5648179079599629]},"#887788":{"lch":[52.0689409540354262,14.1414171783799034,307.715012949252923],"luv":[52.0689409540354262,8.65079050214889378,-11.1867557182995974],"rgb":[0.533333333333333326,0.466666666666666674,0.533333333333333326],"xyz":[0.21193114049247147,0.202056587257892217,0.260770006523541542],"hpluv":[307.715012949252923,34.4630346227371902,52.0689409540354262],"hsluv":[307.715012949252923,11.9231603633022036,52.0689409540354262]},"#887799":{"lch":[52.6504441343355154,26.1446518461971777,285.73365348909897],"luv":[52.6504441343355154,7.08953673880610147,-25.1650807467009763],"rgb":[0.533333333333333326,0.466666666666666674,0.6],"xyz":[0.224988104601544198,0.207279372901521375,0.329536684164659421],"hpluv":[285.73365348909897,63.0115482025775862,52.6504441343355154],"hsluv":[285.73365348909897,20.7849368541844512,52.6504441343355154]},"#8877aa":{"lch":[53.3090485775123142,39.8165287152511951,277.951975125090712],"luv":[53.3090485775123142,5.50833871717125412,-39.4336678931764482],"rgb":[0.533333333333333326,0.466666666666666674,0.66666666666666663],"xyz":[0.240045797566796726,0.213302450087622469,0.408840533781658],"hpluv":[277.951975125090712,94.7767450693341118,53.3090485775123142],"hsluv":[277.951975125090712,33.2193336653547036,53.3090485775123142]},"#8877bb":{"lch":[54.043710164283695,53.8841311835491,274.190220195010625],"luv":[54.043710164283695,3.93720379281895738,-53.7400969453883732],"rgb":[0.533333333333333326,0.466666666666666674,0.733333333333333282],"xyz":[0.2571833896741334,0.220157486930557228,0.499098518880299769],"hpluv":[274.190220195010625,126.518797380186697,54.043710164283695],"hsluv":[274.190220195010625,46.027457746288988,54.043710164283695]},"#8877cc":{"lch":[54.8527197178713095,67.9360625264533695,272.023364737824068],"luv":[54.8527197178713095,2.39862107173988059,-67.8937052203839215],"rgb":[0.533333333333333326,0.466666666666666674,0.8],"xyz":[0.276475765117855099,0.22787443710804603,0.600705029550569924],"hpluv":[272.023364737824068,157.159823716941304,54.8527197178713095],"hsluv":[272.023364737824068,59.1220253911564413,54.8527197178713095]},"#8877dd":{"lch":[55.7338064566187228,81.7667290312133,270.636302714775695],"luv":[55.7338064566187228,0.90804807322034331,-81.7616867803042595],"rgb":[0.533333333333333326,0.466666666666666674,0.866666666666666696],"xyz":[0.297994090668488698,0.236481767328299564,0.714034877450575922],"hpluv":[270.636302714775695,186.164661983392193,55.7338064566187228],"hsluv":[270.636302714775695,72.4679508704990809,55.7338064566187228]},"#8877ee":{"lch":[56.6842419440431939,95.2620356561917419,269.684203716511661],"luv":[56.6842419440431939,-0.525051666249150784,-95.2605886928551229],"rgb":[0.533333333333333326,0.466666666666666674,0.933333333333333348],"xyz":[0.321806270934663408,0.246006639434769608,0.839445693519099145],"hpluv":[269.684203716511661,213.253830698535069,56.6842419440431939],"hsluv":[269.684203716511661,86.076772525698,56.6842419440431939]},"#8877ff":{"lch":[57.7009414002340577,108.362660778640901,268.997474997449615],"luv":[57.7009414002340577,-1.89596396936046907,-108.346073171359961],"rgb":[0.533333333333333326,0.466666666666666674,1],"xyz":[0.347977319344494829,0.256475058798702304,0.977279881810881],"hpluv":[268.997474997449615,238.306609639193027,57.7009414002340577],"hsluv":[268.997474997449615,99.9999999999988631,57.7009414002340577]},"#ffff00":{"lch":[97.1385593417967357,107.085608846920664,85.8743202181747307],"luv":[97.1385593417967357,7.70421917727499928,106.808111250898],"rgb":[1,1,0],"xyz":[0.76997513864982,0.92780768463926,0.138525598510210984],"hpluv":[85.8743202181747307,1784.23591835690763,97.1385593417967357],"hsluv":[85.8743202181747307,100.000000000072717,97.1385593417967357]},"#ffff11":{"lch":[97.1550055288865337,106.340968495662651,85.8743202181747307],"luv":[97.1550055288865337,7.65064640931757278,106.065400532478591],"rgb":[1,1,0.0666666666666666657],"xyz":[0.770986804149457194,0.928212350839114908,0.143853703474966621],"hpluv":[85.8743202181747307,1782.29032599077573,97.1550055288865337],"hsluv":[85.8743202181747307,100.000000000072447,97.1550055288865337]},"#ffff22":{"lch":[97.1854797367251564,104.966044999604463,85.8743202181747],"luv":[97.1854797367251564,7.5517282439387623,104.694039961158666],"rgb":[1,1,0.133333333333333331],"xyz":[0.77286216228793414,0.928962494094505709,0.1537305896709458],"hpluv":[85.8743202181747,1778.69938503976459,97.1854797367251564],"hsluv":[85.8743202181747,100.00000000007401,97.1854797367251564]},"#ffff33":{"lch":[97.2356193677236291,102.717517786777336,85.8743202181746312],"luv":[97.2356193677236291,7.38995910744871409,102.451339496695468],"rgb":[1,1,0.2],"xyz":[0.775949913020392,0.930197594387488835,0.16999274352855695],"hpluv":[85.8743202181746312,1772.83090468185333,97.2356193677236291],"hsluv":[85.8743202181746312,100.000000000075445,97.2356193677236291]},"#ffff44":{"lch":[97.3079311184623776,99.5042093292491,85.874320218174546],"luv":[97.3079311184623776,7.15877927938833114,99.2463578851537704],"rgb":[1,1,0.266666666666666663],"xyz":[0.780407908264610817,0.931980792485176401,0.193471518481443588],"hpluv":[85.874320218174546,1764.45330998562531,97.3079311184623776],"hsluv":[85.874320218174546,100.000000000077918,97.3079311184623776]},"#ffff55":{"lch":[97.4045015397841212,95.2663481722239283,85.8743202181744323],"luv":[97.4045015397841212,6.8538885331141568,95.0194785612246875],"rgb":[1,1,0.333333333333333315],"xyz":[0.786370322303972746,0.934365758100921151,0.224873565755417504],"hpluv":[85.8743202181744323,1753.42077174454698,97.4045015397841212],"hsluv":[85.8743202181744323,100.000000000080163,97.4045015397841212]},"#ffff66":{"lch":[97.5271149532436539,89.9715947326486258,85.8743202181742333],"luv":[97.5271149532436539,6.47296021391862286,89.7384457454272706],"rgb":[1,1,0.4],"xyz":[0.793955318077481,0.93739975641032447,0.264821210162561438],"hpluv":[85.8743202181742333,1739.66322518688298,97.5271149532436539],"hsluv":[85.8743202181742333,100.000000000084981,97.5271149532436539]},"#ffff77":{"lch":[97.6773170086398608,83.6127156419164663,85.8743202181740202],"luv":[97.6773170086398608,6.01547392080898469,83.3960448134325389],"rgb":[1,1,0.466666666666666674],"xyz":[0.803269331097682837,0.941125361618405321,0.313875012068959403],"hpluv":[85.8743202181740202,1723.18045161093028,97.6773170086398608],"hsluv":[85.8743202181740202,100.00000000009112,97.6773170086398608]},"#ffff88":{"lch":[97.8564527859654589,76.2055692953657342,85.8743202181736791],"luv":[97.8564527859654589,5.48257057790026181,76.0080930657330214],"rgb":[1,1,0.533333333333333326],"xyz":[0.814409748199626748,0.945581528459182863,0.372547875472531542],"hpluv":[85.8743202181736791,1704.03672017478311,97.8564527859654589],"hsluv":[85.8743202181736791,100.000000000099803,97.8564527859654589]},"#ffff99":{"lch":[98.0656913545514612,67.7868897983338741,85.8743202181732102],"luv":[98.0656913545514612,4.87689300155069283,67.6112294162950889],"rgb":[1,1,0.6],"xyz":[0.827466712308699393,0.950804314102812076,0.441314553113649422],"hpluv":[85.8743202181732102,1682.35465810463256,98.0656913545514612],"hsluv":[85.8743202181732102,100.000000000112891,98.0656913545514612]},"#ffffaa":{"lch":[98.3060425431328611,58.4116937234916094,85.8743202181725707],"luv":[98.3060425431328611,4.20239933084915052,58.260327869924204],"rgb":[1,1,0.66666666666666663],"xyz":[0.842524405273952,0.956827391288913143,0.520618402730648078],"hpluv":[85.8743202181725707,1658.30791632356272,98.3060425431328611],"hsluv":[85.8743202181725707,100.000000000127613,98.3060425431328611]},"#ffffbb":{"lch":[98.5783690162300559,48.1503065934375414,85.8743202181715759],"luv":[98.5783690162300559,3.46414909943131732,48.0255317103199246],"rgb":[1,1,0.733333333333333282],"xyz":[0.859661997381288567,0.963682428131847901,0.610876387829289769],"hpluv":[85.8743202181715759,1632.1126639545671,98.5783690162300559],"hsluv":[85.8743202181715759,100.000000000152809,98.5783690162300559]},"#ffffcc":{"lch":[98.8833954570195317,37.0851031688938804,85.8743202181698706],"luv":[98.8833954570195317,2.66806871718659799,36.9890022353654899],"rgb":[1,1,0.8],"xyz":[0.878954372825010322,0.971399378309336758,0.712482898499559925],"hpluv":[85.8743202181698706,1604.018210645404,98.8833954570195317],"hsluv":[85.8743202181698706,100.00000000019709,98.8833954570195317]},"#ffffdd":{"lch":[99.2217159651800245,25.3071072074552177,85.8743202181663889],"luv":[99.2217159651800245,1.82070684164607655,25.2415273271332552],"rgb":[1,1,0.866666666666666696],"xyz":[0.900472698375643921,0.980006708529590265,0.825812746399565922],"hpluv":[85.8743202181663889,1574.29719653830034,99.2217159651800245],"hsluv":[85.8743202181663889,100.000000000286278,99.2217159651800245]},"#ffffee":{"lch":[99.5938003805277248,12.9126149352850259,85.8743202181558161],"luv":[99.5938003805277248,0.928991455386458775,12.8791536733888243],"rgb":[1,1,0.933333333333333348],"xyz":[0.92428487864181863,0.989531580636060282,0.951223562468089145],"hpluv":[85.8743202181558161,1543.23583838085528,99.5938003805277248],"hsluv":[85.8743202181558161,100.000000000556355,99.5938003805277248]},"#ffffff":{"lch":[99.99999999999973,5.29610712429325706e-12,0],"luv":[99.99999999999973,4.97935026544381416e-12,1.80411241501587473e-12],"rgb":[1,1,1],"xyz":[0.95045592705165,0.999999999999993,1.0890577507598711],"hpluv":[0,0,100],"hsluv":[0,0,100]},"#aa7700":{"lch":[53.7507838912622304,69.116848270999057,51.9676330333141223],"luv":[53.7507838912622304,42.5833417137676875,54.4407726194696622],"rgb":[0.66666666666666663,0.466666666666666674,0],"xyz":[0.231737306953434558,0.217406893568523163,0.0297590159367257245],"hpluv":[51.9676330333141223,163.169299961930307,53.7507838912622304],"hsluv":[51.9676330333141223,100.000000000002359,53.7507838912622304]},"#aa7711":{"lch":[53.7940335015026,67.5786316453491906,51.3090056740019378],"luv":[53.7940335015026,42.244752971039,52.7470596476588653],"rgb":[0.66666666666666663,0.466666666666666674,0.0666666666666666657],"xyz":[0.23274897245307169,0.217811559768378016,0.0350871209014813543],"hpluv":[51.3090056740019378,159.40965108533166,53.7940335015026],"hsluv":[51.3090056740019378,97.0120153186068,53.7940335015026]},"#aa7722":{"lch":[53.874065271669366,64.7981771198060272,50.0272013346139],"luv":[53.874065271669366,41.6278947732915157,49.6580520640260588],"rgb":[0.66666666666666663,0.466666666666666674,0.133333333333333331],"xyz":[0.234624330591548691,0.218561703023768844,0.0449640070974605538],"hpluv":[50.0272013346139,152.623836787181489,53.874065271669366],"hsluv":[50.0272013346139,91.5730337049880632,53.874065271669366]},"#aa7733":{"lch":[54.0054384284815,60.4215101577181812,47.7291529037971785],"luv":[54.0054384284815,40.6416884431496115,44.7103125713654705],"rgb":[0.66666666666666663,0.466666666666666674,0.2],"xyz":[0.237712081324006452,0.219796803316751943,0.0612261609550717],"hpluv":[47.7291529037971785,141.968961696257139,54.0054384284815],"hsluv":[47.7291529037971785,82.890357503842381,54.0054384284815]},"#aa7744":{"lch":[54.1942453736720324,54.5501661616690754,43.9413891432679051],"luv":[54.1942453736720324,39.2788485799816911,37.8535689532252277],"rgb":[0.66666666666666663,0.466666666666666674,0.266666666666666663],"xyz":[0.242170076568225312,0.221580001414439537,0.0847049359079583286],"hpluv":[43.9413891432679051,127.726858599491337,54.1942453736720324],"hsluv":[43.9413891432679051,70.9191698542686453,54.1942453736720324]},"#aa7755":{"lch":[54.4451912879813307,47.55778496198932,37.8352816528713],"luv":[54.4451912879813307,37.5600659479400178,29.1716361638701045],"rgb":[0.66666666666666663,0.466666666666666674,0.333333333333333315],"xyz":[0.248132490607587297,0.22396496703018437,0.116106983181932244],"hpluv":[37.8352816528713,110.841250641501858,54.4451912879813307],"hsluv":[37.8352816528713,55.8697139193963039,54.4451912879813307]},"#aa7766":{"lch":[54.7618668139504621,40.2221891209492881,27.9562221290694595],"luv":[54.7618668139504621,35.5285027246357359,18.8560333004309904],"rgb":[0.66666666666666663,0.466666666666666674,0.4],"xyz":[0.255717486381095482,0.226998965339587661,0.156054627589076206],"hpluv":[27.9562221290694595,93.2023334238246264,54.7618668139504621],"hsluv":[27.9562221290694595,38.157009054435612,54.7618668139504621]},"#aa7777":{"lch":[55.1468928183874851,34.0080558607991321,12.1770506300622881],"luv":[55.1468928183874851,33.2428902595124569,7.17343088244713467],"rgb":[0.66666666666666663,0.466666666666666674,0.466666666666666674],"xyz":[0.265031499401297388,0.230724570547668484,0.205108429495474115],"hpluv":[12.1770506300622881,78.2528356679829074,55.1468928183874851],"hsluv":[12.1770506300622881,20.6006796366476941,55.1468928183874851]},"#aa7788":{"lch":[55.6020140468043849,31.2700131437067519,349.739442339375785],"luv":[55.6020140468043849,30.7699397165362107,-5.56996695217490778],"rgb":[0.66666666666666663,0.466666666666666674,0.533333333333333326],"xyz":[0.276171916503241244,0.235180737388446082,0.263781292899046282],"hpluv":[349.739442339375785,71.363619208349732,55.6020140468043849],"hsluv":[349.739442339375785,23.0952607722130772,55.6020140468043849]},"#aa7799":{"lch":[56.1281730235999845,34.0192547961324365,325.92167501088062],"luv":[56.1281730235999845,28.1772086346441704,-19.0618627223027133],"rgb":[0.66666666666666663,0.466666666666666674,0.6],"xyz":[0.289228880612313943,0.240403523032075239,0.332547970540164162],"hpluv":[325.92167501088062,76.9100717288581706,56.1281730235999845],"hsluv":[325.92167501088062,27.5449434619861648,56.1281730235999845]},"#aa77aa":{"lch":[56.7255784680210127,41.7295245342496131,307.715012949246272],"luv":[56.7255784680210127,25.5273831431779215,-33.0106941416859],"rgb":[0.66666666666666663,0.466666666666666674,0.66666666666666663],"xyz":[0.304286573577566499,0.246426600218176334,0.411851820157162818],"hpluv":[307.715012949246272,93.3477446513022642,56.7255784680210127],"hsluv":[307.715012949246272,32.2954766233998285,56.7255784680210127]},"#aa77bb":{"lch":[57.3937746480490176,52.417961949749369,295.873528074876958],"luv":[57.3937746480490176,22.8744713506946127,-47.1635589771554891],"rgb":[0.66666666666666663,0.466666666666666674,0.733333333333333282],"xyz":[0.321424165684903118,0.25328163706111112,0.502109805255804509],"hpluv":[295.873528074876958,115.892323381948941,57.3937746480490176],"hsluv":[295.873528074876958,41.7229864085831679,57.3937746480490176]},"#aa77cc":{"lch":[58.1317139736185,64.5762938068646548,288.286403622885132],"luv":[58.1317139736185,20.2619194712353625,-61.3151885031081],"rgb":[0.66666666666666663,0.466666666666666674,0.8],"xyz":[0.340716541128624872,0.260998587238599922,0.603716315926074665],"hpluv":[288.286403622885132,140.961111207958226,58.1317139736185],"hsluv":[288.286403622885132,55.678510160825347,58.1317139736185]},"#aa77dd":{"lch":[58.9378328182195759,77.3666791836153,283.242275299631103],"luv":[58.9378328182195759,17.7223199365118553,-75.3095108466943088],"rgb":[0.66666666666666663,0.466666666666666674,0.866666666666666696],"xyz":[0.362234866679258416,0.269605917458853428,0.717046163826080662],"hpluv":[283.242275299631103,166.570895286205939,58.9378328182195759],"hsluv":[283.242275299631103,70.0408478070886105,58.9378328182195759]},"#aa77ee":{"lch":[59.8101292792768646,90.3373867943789151,279.736895248195651],"luv":[59.8101292792768646,15.2782276108220607,-89.0360556960445138],"rgb":[0.66666666666666663,0.466666666666666674,0.933333333333333348],"xyz":[0.386047046945433125,0.279130789565323445,0.842456979894603886],"hpluv":[279.736895248195651,191.660275847677298,59.8101292792768646],"hsluv":[279.736895248195651,84.8029379630096685,59.8101292792768646]},"#aa77ff":{"lch":[60.7462409754246551,103.238062985892157,277.202485092995744],"luv":[60.7462409754246551,12.9436026905507742,-102.423438716283115],"rgb":[0.66666666666666663,0.466666666666666674,1],"xyz":[0.412218095355264547,0.289599208929256169,0.980291168186385731],"hpluv":[277.202485092995744,215.655115976047284,60.7462409754246551],"hsluv":[277.202485092995744,99.999999999998721,60.7462409754246551]},"#888800":{"lch":[54.9099926918455452,60.532810441385358,85.8743202181747449],"luv":[54.9099926918455452,4.35500198466006783,60.375948006191166],"rgb":[0.533333333333333326,0.533333333333333326,0],"xyz":[0.189568900667635265,0.228427482887910871,0.0341051861362109063],"hpluv":[85.8743202181747449,139.887458074797593,54.9099926918455452],"hsluv":[85.8743202181747449,100.000000000002331,54.9099926918455452]},"#888811":{"lch":[54.9518410557904673,58.8347385736240369,85.8743202181746739],"luv":[54.9518410557904673,4.23283507550337568,58.6822764576347353],"rgb":[0.533333333333333326,0.533333333333333326,0.0666666666666666657],"xyz":[0.190580566167272397,0.228832149087765724,0.039433291100966536],"hpluv":[85.8743202181746739,135.85978011465275,54.9518410557904673],"hsluv":[85.8743202181746739,97.1207726442580395,54.9518410557904673]},"#888822":{"lch":[55.0292864560463215,55.7361292450240882,85.8743202181745602],"luv":[55.0292864560463215,4.00990721741558787,55.5916967480373643],"rgb":[0.533333333333333326,0.533333333333333326,0.133333333333333331],"xyz":[0.192455924305749398,0.229582292343156552,0.0493101772969457355],"hpluv":[85.8743202181745602,128.523412903997382,55.0292864560463215],"hsluv":[85.8743202181745602,91.8762944675706,55.0292864560463215]},"#888833":{"lch":[55.1564325013520573,50.7686053645684225,85.8743202181742902],"luv":[55.1564325013520573,3.65252126093227947,50.6370455210582335],"rgb":[0.533333333333333326,0.533333333333333326,0.2],"xyz":[0.195543675038207132,0.230817392636139651,0.0655723311545568788],"hpluv":[85.8743202181742902,116.798802852822334,55.1564325013520573],"hsluv":[85.8743202181742902,83.4948353914423,55.1564325013520573]},"#888844":{"lch":[55.3392041906722767,43.8756115710196184,85.8743202181737786],"luv":[55.3392041906722767,3.15660835961073616,43.7619139708837039],"rgb":[0.533333333333333326,0.533333333333333326,0.266666666666666663],"xyz":[0.20000167028242602,0.232600590733827245,0.0890511061074435173],"hpluv":[85.8743202181737786,100.607324583255647,55.3392041906722767],"hsluv":[85.8743202181737786,71.9201892491773833,55.3392041906722767]},"#888855":{"lch":[55.5822005995452173,35.1333862553221152,85.8743202181729],"luv":[55.5822005995452173,2.5276534453655044,35.0423429271758167],"rgb":[0.533333333333333326,0.533333333333333326,0.333333333333333315],"xyz":[0.205964084321788032,0.234985556349572078,0.120453153381417433],"hpluv":[85.8743202181729,80.2090919262666233,55.5822005995452173],"hsluv":[85.8743202181729,57.3383011101545321,55.5822005995452173]},"#888866":{"lch":[55.8889601924437187,24.7258905438507242,85.874320218171],"luv":[55.8889601924437187,1.778891507033598,24.6618168064052092],"rgb":[0.533333333333333326,0.533333333333333326,0.4],"xyz":[0.21354908009529619,0.238019554658975369,0.160400797788561394],"hpluv":[85.874320218171,56.1390732800859524,55.8889601924437187],"hsluv":[85.874320218171,40.1315986813270698,55.8889601924437187]},"#888877":{"lch":[56.2621011123828509,12.9137749110131566,85.8743202181651668],"luv":[56.2621011123828509,0.929074909242871283,12.8803106431998842],"rgb":[0.533333333333333326,0.533333333333333326,0.466666666666666674],"xyz":[0.222863093115498123,0.241745159867056192,0.209454599694959304],"hpluv":[85.8743202181651668,29.1257147579972724,56.2621011123828509],"hsluv":[85.8743202181651668,20.8208192205656601,56.2621011123828509]},"#888888":{"lch":[56.703410756754252,2.95076376078202623e-12,0],"luv":[56.703410756754252,2.78254170310414444e-12,9.82073542272051e-13],"rgb":[0.533333333333333326,0.533333333333333326,0.533333333333333326],"xyz":[0.234003510217441923,0.24620132670783379,0.268127463098531471],"hpluv":[0,6.60335407213460764e-12,56.703410756754252],"hsluv":[0,2.14018342731852893e-12,56.703410756754252]},"#888899":{"lch":[57.2139150634865246,13.7029898302256612,265.874320218188814],"luv":[57.2139150634865246,-0.985854571612734376,-13.6674804207248872],"rgb":[0.533333333333333326,0.533333333333333326,0.6],"xyz":[0.247060474326514651,0.251424112351462947,0.33689414073964935],"hpluv":[265.874320218188814,30.3915601408835876,57.2139150634865246],"hsluv":[265.874320218188814,12.5386286039598396,57.2139150634865246]},"#8888aa":{"lch":[57.7939415002624486,27.9001972781706051,265.874320218182902],"luv":[57.7939415002624486,-2.00726537612613365,-27.8278977623291475],"rgb":[0.533333333333333326,0.533333333333333326,0.66666666666666663],"xyz":[0.262118167291767179,0.25744718953756407,0.416197990356647951],"hpluv":[265.874320218182902,61.2582077856443377,57.7939415002624486],"hsluv":[265.874320218182902,25.8334660761224093,57.7939415002624486]},"#8888bb":{"lch":[58.4431822360017605,42.3326731508362428,265.874320218181083],"luv":[58.4431822360017605,-3.04560244672749647,-42.2229738629578222],"rgb":[0.533333333333333326,0.533333333333333326,0.733333333333333282],"xyz":[0.279255759399103853,0.264302226380498828,0.506455975455289753],"hpluv":[265.874320218181083,91.9138937804104756,58.4431822360017605],"hsluv":[265.874320218181083,39.7348050695490116,58.4431822360017605]},"#8888cc":{"lch":[59.1607600358786812,56.7874726838639603,265.874320218180117],"luv":[59.1607600358786812,-4.0855455816182138,-56.6403157752595448],"rgb":[0.533333333333333326,0.533333333333333326,0.8],"xyz":[0.298548134842825608,0.27201917655798763,0.608062486125559909],"hpluv":[265.874320218180117,121.803038601679276,59.1607600358786812],"hsluv":[265.874320218180117,54.1372084350884322,59.1607600358786812]},"#8888dd":{"lch":[59.9452971965242654,71.1002375720468649,265.874320218179605],"luv":[59.9452971965242654,-5.11527010687093497,-70.9159911059223447],"rgb":[0.533333333333333326,0.533333333333333326,0.866666666666666696],"xyz":[0.320066460393459096,0.280626506778241136,0.721392334025565907],"hpluv":[265.874320218179605,150.506501481916018,59.9452971965242654],"hsluv":[265.874320218179605,68.9826297466640881,59.9452971965242654]},"#8888ee":{"lch":[60.7949865781877747,85.1524606014505,265.874320218179207],"luv":[60.7949865781877747,-6.12625008179143,-84.9317997361231676],"rgb":[0.533333333333333326,0.533333333333333326,0.933333333333333348],"xyz":[0.343878640659633861,0.290151378884711153,0.84680315009408913],"hpluv":[265.874320218179207,177.733282428962553,60.7949865781877747],"hsluv":[265.874320218179207,84.2595641984559194,60.7949865781877747]},"#8888ff":{"lch":[61.7076631467729726,98.8655769196339,265.874320218179],"luv":[61.7076631467729726,-7.11283319838656247,-98.6093804034077408],"rgb":[0.533333333333333326,0.533333333333333326,1],"xyz":[0.370049689069465226,0.300619798248643877,0.984637338385871],"hpluv":[265.874320218179,203.303722842755434,61.7076631467729726],"hsluv":[265.874320218179,99.9999999999986073,61.7076631467729726]},"#aa8800":{"lch":[58.1840377660698493,67.6904417424552634,64.2288134226940173],"luv":[58.1840377660698493,29.4303340948507071,60.9577832467208225],"rgb":[0.66666666666666663,0.533333333333333326,0],"xyz":[0.253809676678405038,0.261551633018464735,0.0371164725117156744],"hpluv":[64.2288134226940173,147.625988392398114,58.1840377660698493],"hsluv":[64.2288134226940173,100.000000000002373,58.1840377660698493]},"#aa8811":{"lch":[58.2222766199063955,66.2027965316335809,63.8264905250604926],"luv":[58.2222766199063955,29.2014551434886229,59.4145208354969085],"rgb":[0.66666666666666663,0.533333333333333326,0.0666666666666666657],"xyz":[0.254821342178042143,0.261956299218319588,0.0424445774764713041],"hpluv":[63.8264905250604926,144.286759049554206,58.2222766199063955],"hsluv":[63.8264905250604926,97.5015111084285877,58.2222766199063955]},"#aa8822":{"lch":[58.2930572278629,63.4916551128893474,63.0419050459203],"luv":[58.2930572278629,28.7832252220538578,56.5925455761676304],"rgb":[0.66666666666666663,0.533333333333333326,0.133333333333333331],"xyz":[0.2566967003165192,0.262706442473710389,0.0523214636724505036],"hpluv":[63.0419050459203,138.209896631886636,58.2930572278629],"hsluv":[63.0419050459203,92.9399945222758106,58.2930572278629]},"#aa8833":{"lch":[58.4093035212624585,59.1585039849960737,61.628621374019076],"luv":[58.4093035212624585,28.1112178941065629,52.0527426967384628],"rgb":[0.66666666666666663,0.533333333333333326,0.2],"xyz":[0.259784451048976905,0.263941542766693515,0.0685836175300616468],"hpluv":[61.628621374019076,128.521114132395894,58.4093035212624585],"hsluv":[61.628621374019076,85.621599137751673,58.4093035212624585]},"#aa8844":{"lch":[58.5764981609594315,53.1878639814319953,59.2736460930020499],"luv":[58.5764981609594315,27.1757201885359478,45.7212106919940453],"rgb":[0.66666666666666663,0.533333333333333326,0.266666666666666663],"xyz":[0.264242446293195821,0.265724740864381082,0.0920623924829482854],"hpluv":[59.2736460930020499,115.22015920662389,58.5764981609594315],"hsluv":[59.2736460930020499,75.4571473133808581,58.5764981609594315]},"#aa8855":{"lch":[58.7989500318507083,45.736161182952344,55.3795129841665315],"luv":[58.7989500318507083,25.9844527075537677,37.6378088793954433],"rgb":[0.66666666666666663,0.533333333333333326,0.333333333333333315],"xyz":[0.270204860332557806,0.268109706480125942,0.123464439756922201],"hpluv":[55.3795129841665315,98.7027982667044483,58.7989500318507083],"hsluv":[55.3795129841665315,62.5553187882680319,58.7989500318507083]},"#aa8866":{"lch":[59.0800404303715112,37.1980666756204,48.681601920545944],"luv":[59.0800404303715112,24.5597583059268025,27.9376884576795419],"rgb":[0.66666666666666663,0.533333333333333326,0.4],"xyz":[0.277789856106066,0.271143704789529261,0.163412084164066163],"hpluv":[48.681601920545944,79.8948730878687883,59.0800404303715112],"hsluv":[48.681601920545944,47.1909371341698645,59.0800404303715112]},"#aa8877":{"lch":[59.4223523155875881,28.4467220316745042,36.2691810942760355],"luv":[59.4223523155875881,22.9350730451589406,16.8285001934390941],"rgb":[0.66666666666666663,0.533333333333333326,0.466666666666666674],"xyz":[0.287103869126267897,0.274869309997610056,0.212465886070464072],"hpluv":[36.2691810942760355,60.7465636644032,59.4223523155875881],"hsluv":[36.2691810942760355,29.7643761063162415,59.4223523155875881]},"#aa8888":{"lch":[59.8277504540149323,21.6376696880998622,12.1770506300627677],"luv":[59.8277504540149323,21.1508320810015036,4.56410471095846049],"rgb":[0.66666666666666663,0.533333333333333326,0.533333333333333326],"xyz":[0.298244286228211697,0.279325476838387654,0.271138749474036211],"hpluv":[12.1770506300627677,45.8930730764781174,59.8277504540149323],"hsluv":[12.1770506300627677,15.9793094134510145,59.8277504540149323]},"#aa8899":{"lch":[60.2974403890441693,21.076671863141442,335.972081494736813],"luv":[60.2974403890441693,19.2503183610400761,-8.58203587880762697],"rgb":[0.66666666666666663,0.533333333333333326,0.6],"xyz":[0.311301250337284396,0.284548262482016812,0.339905427115154146],"hpluv":[335.972081494736813,44.3549898137704872,60.2974403890441693],"hsluv":[335.972081494736813,18.3674189175529285,60.2974403890441693]},"#aa88aa":{"lch":[60.8320193568852119,28.2409959286201691,307.715012949248376],"luv":[60.8320193568852119,17.2759870010776844,-22.3404145928166677],"rgb":[0.66666666666666663,0.533333333333333326,0.66666666666666663],"xyz":[0.326358943302536952,0.290571339668117934,0.419209276732152747],"hpluv":[307.715012949248376,58.9097393716334068,60.8320193568852119],"hsluv":[307.715012949248376,20.7885743891348937,60.8320193568852119]},"#aa88bb":{"lch":[61.4315255818646904,39.5305448534603343,292.718173175904553],"luv":[61.4315255818646904,15.2666424694527869,-36.4635928581008],"rgb":[0.66666666666666663,0.533333333333333326,0.733333333333333282],"xyz":[0.343496535409873627,0.297426376511052692,0.509467261830794493],"hpluv":[292.718173175904553,81.6546320542196185,61.4315255818646904],"hsluv":[292.718173175904553,35.3775178816614826,61.4315255818646904]},"#aa88cc":{"lch":[62.0954889075932783,52.4408733717370339,284.64164926901276],"luv":[62.0954889075932783,13.2556230251873277,-50.737891739849438],"rgb":[0.66666666666666663,0.533333333333333326,0.8],"xyz":[0.362788910853595326,0.305143326688541494,0.611073772501064649],"hpluv":[284.64164926901276,107.164068097081099,62.0954889075932783],"hsluv":[284.64164926901276,50.6369924233865092,62.0954889075932783]},"#aa88dd":{"lch":[62.8229837406334894,65.9589053782665644,279.83800714750987],"luv":[62.8229837406334894,11.2699451472508105,-64.988964717689413],"rgb":[0.66666666666666663,0.533333333333333326,0.866666666666666696],"xyz":[0.384307236404228925,0.313750656908795,0.724403620401070647],"hpluv":[279.83800714750987,133.227600809414753,62.8229837406334894],"hsluv":[279.83800714750987,66.50088929558828,62.8229837406334894]},"#aa88ee":{"lch":[63.6126841134072,79.6308922643202237,276.728713669089302],"luv":[63.6126841134072,9.33022805769535,-79.0823990986816767],"rgb":[0.66666666666666663,0.533333333333333326,0.933333333333333348],"xyz":[0.408119416670403634,0.323275529015265,0.84981443646959387],"hpluv":[276.728713669089302,158.846330872338797,63.6126841134072],"hsluv":[276.728713669089302,82.9476730407324112,63.6126841134072]},"#aa88ff":{"lch":[64.4629200033750323,93.219110130063271,274.584640952303687],"luv":[64.4629200033750323,7.4511637136690565,-92.9208407880221756],"rgb":[0.66666666666666663,0.533333333333333326,1],"xyz":[0.434290465080235055,0.333743948379197741,0.987648624761375715],"hpluv":[274.584640952303687,183.499254977583263,64.4629200033750323],"hsluv":[274.584640952303687,99.999999999998451,64.4629200033750323]},"#889900":{"lch":[59.9037942457991477,67.5360782410098892,95.4734085527772578],"luv":[59.9037942457991477,-6.44184579214223074,67.2281524881211396],"rgb":[0.533333333333333326,0.6,0],"xyz":[0.215438501120102766,0.280166683792846538,0.0427283862870331613],"hpluv":[95.4734085527772578,143.060860652479761,59.9037942457991477],"hsluv":[95.4734085527772578,100.000000000002359,59.9037942457991477]},"#889911":{"lch":[59.9403212197486,66.0293008977046867,95.6505578181906628],"luv":[59.9403212197486,-6.50131434341495318,65.7084582747741166],"rgb":[0.533333333333333326,0.6,0.0666666666666666657],"xyz":[0.216450166619739898,0.280571349992701391,0.048056491251788791],"hpluv":[95.6505578181906628,139.783837686775883,59.9403212197486],"hsluv":[95.6505578181906628,97.642419329775592,59.9403212197486]},"#889922":{"lch":[60.0079397017320275,63.2737960078627495,95.9966659299995655],"luv":[60.0079397017320275,-6.6102508868722456,62.9275602932231308],"rgb":[0.533333333333333326,0.6,0.133333333333333331],"xyz":[0.218325524758216899,0.281321493248092191,0.0579333774477679905],"hpluv":[95.9966659299995655,133.799503075015934,60.0079397017320275],"hsluv":[95.9966659299995655,93.3344688530494864,60.0079397017320275]},"#889933":{"lch":[60.1190111745068521,58.8410136656902196,96.6225595920901696],"luv":[60.1190111745068521,-6.78603238946032139,58.4483930798370039],"rgb":[0.533333333333333326,0.6,0.2],"xyz":[0.221413275490674633,0.282556593541075318,0.0741955313053791338],"hpluv":[96.6225595920901696,124.196009967059197,60.1190111745068521],"hsluv":[96.6225595920901696,86.4129060235578,60.1190111745068521]},"#889944":{"lch":[60.2788030378330859,52.6619605596060651,97.6740140778758104],"luv":[60.2788030378330859,-7.03230554676784081,52.1903129773946],"rgb":[0.533333333333333326,0.6,0.266666666666666663],"xyz":[0.22587127073489352,0.284339791638762884,0.0976743062582657723],"hpluv":[97.6740140778758104,110.859197411007315,60.2788030378330859],"hsluv":[97.6740140778758104,76.7791514013919,60.2788030378330859]},"#889955":{"lch":[60.491478208304315,44.7890969420590679,99.4433583384469557],"luv":[60.491478208304315,-7.34865909500015935,44.1821277711999301],"rgb":[0.533333333333333326,0.6,0.333333333333333315],"xyz":[0.231833684774255533,0.286724757254507745,0.129076353532239674],"hpluv":[99.4433583384469557,93.954467458231008,60.491478208304315],"hsluv":[99.4433583384469557,64.5165507795669555,60.491478208304315]},"#889966":{"lch":[60.7603321241253269,35.3998784596055387,102.614945913325585],"luv":[60.7603321241253269,-7.73125582812020351,34.5453191948634597],"rgb":[0.533333333333333326,0.6,0.4],"xyz":[0.23941868054776369,0.289758755563911063,0.169023997939383636],"hpluv":[102.614945913325585,73.9300429237522394,60.7603321241253269],"hsluv":[102.614945913325585,49.862982431557576,60.7603321241253269]},"#889977":{"lch":[61.0879169406466644,24.8557994274465628,109.198389045907604],"luv":[61.0879169406466644,-8.17358342252196,23.4734594640953418],"rgb":[0.533333333333333326,0.6,0.466666666666666674],"xyz":[0.248732693567965624,0.293484360771991859,0.218077799845781545],"hpluv":[109.198389045907604,51.6311437806165543,61.0879169406466644],"hsluv":[109.198389045907604,33.1759220302134779,61.0879169406466644]},"#889988":{"lch":[61.4761176658877702,14.1684419896747276,127.715012949229816],"luv":[61.4761176658877702,-8.66732250724137,11.2081340539023326],"rgb":[0.533333333333333326,0.6,0.533333333333333326],"xyz":[0.259873110669909424,0.297940527612769457,0.276750663249353712],"hpluv":[127.715012949229816,29.2452265306994263,61.4761176658877702],"hsluv":[127.715012949229816,14.8910328511789984,61.4761176658877702]},"#889999":{"lch":[61.9262069462763094,9.41507553536713537,192.177050630058915],"luv":[61.9262069462763094,-9.20324067004397861,-1.98595279549067061],"rgb":[0.533333333333333326,0.6,0.6],"xyz":[0.272930074778982124,0.303163313256398614,0.345517340890471647],"hpluv":[192.177050630058915,19.2925065058214678,61.9262069462763094],"hsluv":[192.177050630058915,19.2169899754877207,61.9262069462763094]},"#8899aa":{"lch":[62.4388911462841207,18.6148502867865133,238.334617604481764],"luv":[62.4388911462841207,-9.77200531832159669,-15.8436284751369474],"rgb":[0.533333333333333326,0.6,0.66666666666666663],"xyz":[0.28798776774423468,0.309186390442499737,0.424821190507470248],"hpluv":[238.334617604481764,37.8306403353000036,62.4388911462841207],"hsluv":[238.334617604481764,23.6900457250072343,62.4388911462841207]},"#8899bb":{"lch":[63.0143540484962,31.8509402607766567,251.009167860858838],"luv":[63.0143540484962,-10.3648329189902189,-30.1173145226625429],"rgb":[0.533333333333333326,0.6,0.733333333333333282],"xyz":[0.305125359851571354,0.316041427285434495,0.515079175606111939],"hpluv":[251.009167860858838,64.1389868285616132,63.0143540484962],"hsluv":[251.009167860858838,32.2218698989210282,63.0143540484962]},"#8899cc":{"lch":[63.6523012354060143,45.9199042321153357,256.173658840600297],"luv":[63.6523012354060143,-10.9739341944061159,-44.5893526863026821],"rgb":[0.533333333333333326,0.6,0.8],"xyz":[0.324417735295293053,0.323758377462923297,0.616685686276382095],"hpluv":[256.173658840600297,91.543221315317254,63.6523012354060143],"hsluv":[256.173658840600297,48.1563502503440546,63.6523012354060143]},"#8899dd":{"lch":[64.3520063546654,60.2052734177332738,258.898139298145679],"luv":[64.3520063546654,-11.5927562398827622,-59.0786166905309358],"rgb":[0.533333333333333326,0.6,0.866666666666666696],"xyz":[0.345936060845926652,0.332365707683176803,0.730015534176388092],"hpluv":[258.898139298145679,118.716686841439611,64.3520063546654],"hsluv":[258.898139298145679,64.7736147673059435,64.3520063546654]},"#8899ee":{"lch":[65.1123593572591091,74.4513212160393465,260.556144021857],"luv":[65.1123593572591091,-12.2160522582942246,-73.442271874149526],"rgb":[0.533333333333333326,0.6,0.933333333333333348],"xyz":[0.369748241112101361,0.34189057978964682,0.855426350244911315],"hpluv":[260.556144021857,145.093615685215838,65.1123593572591091],"hsluv":[260.556144021857,82.0482136329290626,65.1123593572591091]},"#8899ff":{"lch":[65.9319161385595862,88.5102230179824829,261.65889869963604],"luv":[65.9319161385595862,-12.8398242875011679,-87.5739601191992],"rgb":[0.533333333333333326,0.6,1],"xyz":[0.395919289521932782,0.352358999153579544,0.993260538536693161],"hpluv":[261.65889869963604,170.348009793708229,65.9319161385595862],"hsluv":[261.65889869963604,99.9999999999983373,65.9319161385595862]},"#aa9900":{"lch":[62.7844580943873609,69.6780489210530618,75.8779002673010297],"luv":[62.7844580943873609,17.0006834702273615,67.5722373685362072],"rgb":[0.66666666666666663,0.6,0],"xyz":[0.279679277130872483,0.313290833923400402,0.0457396726625379293],"hpluv":[75.8779002673010297,140.82610179048271,62.7844580943873609],"hsluv":[75.8779002673010297,100.000000000002217,62.7844580943873609]},"#aa9911":{"lch":[62.8183644916567232,68.2796688580209548,75.7117398414304],"luv":[62.8183644916567232,16.8514534980901978,66.1675274916835576],"rgb":[0.66666666666666663,0.6,0.0666666666666666657],"xyz":[0.280690942630509588,0.313695500123255255,0.0510677776272935591],"hpluv":[75.7117398414304,137.925354096716262,62.8183644916567232],"hsluv":[75.7117398414304,97.9039601429264792,62.8183644916567232]},"#aa9922":{"lch":[62.8811408657966098,65.7186920323652259,75.3888160486312415],"luv":[62.8811408657966098,16.5780820569936154,63.5933461751813311],"rgb":[0.66666666666666663,0.6,0.133333333333333331],"xyz":[0.282566300768986645,0.314445643378646056,0.0609446638232727586],"hpluv":[75.3888160486312415,132.619634057532949,62.8811408657966098],"hsluv":[75.3888160486312415,94.0678156084237287,62.8811408657966098]},"#aa9933":{"lch":[62.984284118013818,61.5887344728930373,74.8105333616033477],"luv":[62.984284118013818,16.1369729495721401,59.4371122952427768],"rgb":[0.66666666666666663,0.6,0.2],"xyz":[0.28565405150144435,0.315680743671629183,0.0772068176808839],"hpluv":[74.8105333616033477,124.08189266143988,62.984284118013818],"hsluv":[74.8105333616033477,87.8877322232676335,62.984284118013818]},"#aa9944":{"lch":[63.1327254984845325,55.810649390305,73.8551623649617284],"luv":[63.1327254984845325,15.5190685808424753,53.6095802609072862],"rgb":[0.66666666666666663,0.6,0.266666666666666663],"xyz":[0.290112046745663266,0.317463941769316749,0.10068559263377054],"hpluv":[73.8551623649617284,112.176494362550613,63.1327254984845325],"hsluv":[73.8551623649617284,79.2518346201028407,63.1327254984845325]},"#aa9955":{"lch":[63.330394330910508,48.4114193249398497,72.2912631539462893],"luv":[63.330394330910508,14.725704471349518,46.1174495053405593],"rgb":[0.66666666666666663,0.6,0.333333333333333315],"xyz":[0.296074460785025251,0.319848907385061609,0.132087639907744442],"hpluv":[72.2912631539462893,97.0007181904759,63.330394330910508],"hsluv":[72.2912631539462893,68.2014618333714253,63.330394330910508]},"#aa9966":{"lch":[63.5804407621292285,39.5252766283835086,69.6158026784446662],"luv":[63.5804407621292285,13.7671883687516523,37.0501284339143524],"rgb":[0.66666666666666663,0.6,0.4],"xyz":[0.303659456558533436,0.322882905694464928,0.172035284314888404],"hpluv":[69.6158026784446662,78.8843243984218105,63.5804407621292285],"hsluv":[69.6158026784446662,54.9106459007729129,63.5804407621292285]},"#aa9977":{"lch":[63.8853523521207762,29.4269320044373437,64.5162682653354835],"luv":[63.8853523521207762,12.6610788645847681,26.563911782313685],"rgb":[0.66666666666666663,0.6,0.466666666666666674],"xyz":[0.312973469578735342,0.326608510902545723,0.221089086221286313],"hpluv":[64.5162682653354835,58.4497984351079,63.8853523521207762],"hsluv":[64.5162682653354835,39.6604297676390303,63.8853523521207762]},"#aa9988":{"lch":[64.2470245358341288,18.7498828458428441,52.4386898809200943],"luv":[64.2470245358341288,11.4301164327749429,14.8630597477787205],"rgb":[0.66666666666666663,0.6,0.533333333333333326],"xyz":[0.324113886680679142,0.331064677743323321,0.279761949624858508],"hpluv":[52.4386898809200943,37.0326564248891472,64.2470245358341288],"hsluv":[52.4386898809200943,22.8076315183033955,64.2470245358341288]},"#aa9999":{"lch":[64.6668097656484,10.3324715423982241,12.1770506300641514],"luv":[64.6668097656484,10.0999956892392,2.17946214737001709],"rgb":[0.66666666666666663,0.6,0.6],"xyz":[0.337170850789751841,0.336287463386952479,0.348528627265976387],"hpluv":[12.1770506300641514,20.2750581327120152,64.6668097656484],"hsluv":[12.1770506300641514,9.39861318597140283,64.6668097656484]},"#aa99aa":{"lch":[65.1455571833188,14.2173372068657535,307.715012949255367],"luv":[65.1455571833188,8.69723339065650514,-11.2468132643064216],"rgb":[0.66666666666666663,0.6,0.66666666666666663],"xyz":[0.352228543755004397,0.342310540573053601,0.427832476882975],"hpluv":[307.715012949255367,27.6931773999722353,65.1455571833188],"hsluv":[307.715012949255367,11.6506794595111955,65.1455571833188]},"#aa99bb":{"lch":[65.6836488991384186,26.2061362707181722,286.054514249721478],"luv":[65.6836488991384186,7.24735484809431529,-25.1840708771488],"rgb":[0.66666666666666663,0.6,0.733333333333333282],"xyz":[0.369366135862341072,0.34916557741598836,0.51809046198161679],"hpluv":[286.054514249721478,50.6273330900370553,65.6836488991384186],"hsluv":[286.054514249721478,27.5721610485895,65.6836488991384186]},"#aa99cc":{"lch":[66.2810360009151651,39.8419200501833544,278.33213307587846],"luv":[66.2810360009151651,5.77353773601307907,-39.4213756139487757],"rgb":[0.66666666666666663,0.6,0.8],"xyz":[0.388658511306062771,0.356882527593477161,0.619696972651887],"hpluv":[278.33213307587846,76.2764194246967,66.2810360009151651],"hsluv":[278.33213307587846,44.416066179202609,66.2810360009151651]},"#aa99dd":{"lch":[66.937275739096421,53.9476968390211695,274.567192844176702],"luv":[66.937275739096421,4.29575598209881182,-53.7763932853180151],"rgb":[0.66666666666666663,0.6,0.866666666666666696],"xyz":[0.41017683685669637,0.365489857813730668,0.733026820551892944],"hpluv":[274.567192844176702,102.269045280662851,66.937275739096421],"hsluv":[274.567192844176702,62.1125641321495365,66.937275739096421]},"#aa99ee":{"lch":[67.6515703211096309,68.1578213039093299,272.380002942583644],"luv":[67.6515703211096309,2.83038594926376286,-68.0990273078393358],"rgb":[0.66666666666666663,0.6,0.933333333333333348],"xyz":[0.433989017122871079,0.375014729920200685,0.858437636620416167],"hpluv":[272.380002942583644,127.843056183363871,67.6515703211096309],"hsluv":[272.380002942583644,80.63443597048024,67.6515703211096309]},"#aa99ff":{"lch":[68.4228071241374778,82.2834014236355387,270.968064044661787],"luv":[68.4228071241374778,1.39018638405132466,-82.2716569157370543],"rgb":[0.66666666666666663,0.6,1],"xyz":[0.4601600655327025,0.385483149284133408,0.996271824912198],"hpluv":[270.968064044661787,152.598644218259693,68.4228071241374778],"hsluv":[270.968064044661787,99.9999999999981668,68.4228071241374778]},"#770000":{"lch":[23.4140868272264697,78.7423116347599432,12.177050630061796],"luv":[23.4140868272264697,76.9706458719381317,16.6093743302492847],"rgb":[0.466666666666666674,0,0],"xyz":[0.0760757904266185919,0.0392265794387260461,0.00356605267624767169],"hpluv":[12.177050630061796,426.746789183125429,23.4140868272264697],"hsluv":[12.177050630061796,100.000000000002359,23.4140868272264697]},"#770011":{"lch":[23.5491569362977273,75.7570426868466456,9.89164947332394462],"luv":[23.5491569362977273,74.6308667748156864,13.0139633123970793],"rgb":[0.466666666666666674,0,0.0666666666666666657],"xyz":[0.0770874559262557102,0.0396312456385809,0.00889415764100330228],"hpluv":[9.89164947332394462,408.213135586655085,23.5491569362977273],"hsluv":[9.89164947332394462,99.9999999999965183,23.5491569362977273]},"#770022":{"lch":[23.7971287372198219,70.9964864167640854,5.53723409440817704],"luv":[23.7971287372198219,70.6651956613751224,6.85063542055327357],"rgb":[0.466666666666666674,0,0.133333333333333331],"xyz":[0.0789628140647327392,0.0403813888939717203,0.0187710438369825],"hpluv":[5.53723409440817704,378.574731225432288,23.7971287372198219],"hsluv":[5.53723409440817704,99.9999999999967741,23.7971287372198219]},"#770033":{"lch":[24.198804347572846,65.0463245726941182,358.140059561726389],"luv":[24.198804347572846,65.0120550988218895,-2.11116845467566527],"rgb":[0.466666666666666674,0,0.2],"xyz":[0.0820505647971904728,0.0416164891869548331,0.0350331976945936416],"hpluv":[358.140059561726389,341.089366306392606,24.198804347572846],"hsluv":[358.140059561726389,99.9999999999971578,24.198804347572846]},"#770044":{"lch":[24.764944554878376,59.7650645123016702,347.391874641304071],"luv":[24.764944554878376,58.3238787679626398,-13.0456161839744915],"rgb":[0.466666666666666674,0,0.266666666666666663],"xyz":[0.0865085600414093464,0.0433996872846424062,0.0585119726474802801],"hpluv":[347.391874641304071,306.231145677972847,24.764944554878376],"hsluv":[347.391874641304071,99.9999999999975557,24.764944554878376]},"#770055":{"lch":[25.4983947844981387,57.0853266397623571,333.997796644431901],"luv":[25.4983947844981387,51.3069893372134587,-25.0265331742018731],"rgb":[0.466666666666666674,0,0.333333333333333315],"xyz":[0.0924709740807713454,0.0457846529003872391,0.0899140199214541885],"hpluv":[333.997796644431901,284.086748448009075,25.4983947844981387],"hsluv":[333.997796644431901,99.999999999998,25.4983947844981387]},"#770066":{"lch":[26.3955149445472088,58.0812929265372375,320.022905340944305],"luv":[26.3955149445472088,44.5077732621065394,-37.3161453966930949],"rgb":[0.466666666666666674,0,0.4],"xyz":[0.100055969854279517,0.0488186512097905506,0.129861664328598164],"hpluv":[320.022905340944305,279.219318659546161,26.3955149445472088],"hsluv":[320.022905340944305,99.9999999999984,26.3955149445472088]},"#770077":{"lch":[27.4476614837194361,62.5213221502200156,307.715012949243601],"luv":[27.4476614837194361,38.2464397320582776,-49.4583215569799322],"rgb":[0.466666666666666674,0,0.466666666666666674],"xyz":[0.109369982874481436,0.052544256417871367,0.178915466234996073],"hpluv":[307.715012949243601,289.04278373048345,27.4476614837194361],"hsluv":[307.715012949243601,99.9999999999988631,27.4476614837194361]},"#770088":{"lch":[28.6427236217895711,69.3985842918787341,298.067280282401043],"luv":[28.6427236217895711,32.6525926425722872,-61.2370124633397808],"rgb":[0.466666666666666674,0,0.533333333333333326],"xyz":[0.120510399976425264,0.0570004232586489579,0.237588329638568241],"hpluv":[298.067280282401043,307.450798390810235,28.6427236217895711],"hsluv":[298.067280282401043,99.9999999999991473,28.6427236217895711]},"#770099":{"lch":[29.9665727349335924,77.70857748467688,290.909274437861086],"luv":[29.9665727349335924,27.7333531267432782,-72.5912125469701],"rgb":[0.466666666666666674,0,0.6],"xyz":[0.133567364085497964,0.0622232089022781223,0.30635500727968612],"hpluv":[290.909274437861086,329.057057444315717,29.9665727349335924],"hsluv":[290.909274437861086,99.9999999999993605,29.9665727349335924]},"#7700aa":{"lch":[31.4042918618800115,86.7647813143177,285.668616902051383],"luv":[31.4042918618800115,23.4328336498598695,-83.5405864455078415],"rgb":[0.466666666666666674,0,0.66666666666666663],"xyz":[0.14862505705075052,0.0682462860883792238,0.385658856896684721],"hpluv":[285.668616902051383,350.585377409449279,31.4042918618800115],"hsluv":[285.668616902051383,99.9999999999996447,31.4042918618800115]},"#7700bb":{"lch":[32.9411141237069387,96.170393631615,281.802895608829544],"luv":[32.9411141237069387,19.6712233173334745,-94.1370680681067853],"rgb":[0.466666666666666674,0,0.733333333333333282],"xyz":[0.165762649158087166,0.0751013229313139824,0.475916841995326467],"hpluv":[281.802895608829544,370.460950364720645,32.9411141237069387],"hsluv":[281.802895608829544,99.9999999999998295,32.9411141237069387]},"#7700cc":{"lch":[34.5630635499026226,105.713400517707811,278.906152205018032],"luv":[34.5630635499026226,16.3661753747823724,-104.438840249301762],"rgb":[0.466666666666666674,0,0.8],"xyz":[0.185055024601808893,0.082818273108802784,0.577523352665596623],"hpluv":[278.906152205018032,388.112061604616713,34.5630635499026226],"hsluv":[278.906152205018032,99.9999999999998721,34.5630635499026226]},"#7700dd":{"lch":[36.2573361534597964,115.285120662302717,276.696107756350386],"luv":[36.2573361534597964,13.4426218553338188,-114.498711624961956],"rgb":[0.466666666666666674,0,0.866666666666666696],"xyz":[0.206573350152442436,0.091425603329056318,0.690853200565602621],"hpluv":[276.696107756350386,403.475057258468723,36.2573361534597964],"hsluv":[276.696107756350386,100.000000000000156,36.2573361534597964]},"#7700ee":{"lch":[38.012479203832,124.831519574090535,274.979891409884715],"luv":[38.012479203832,10.8361388436516783,-124.360308676593633],"rgb":[0.466666666666666674,0,0.933333333333333348],"xyz":[0.230385530418617201,0.100950475435526349,0.816264016634125844],"hpluv":[274.979891409884715,416.713325299391272,38.012479203832],"hsluv":[274.979891409884715,100.000000000000156,38.012479203832]},"#7700ff":{"lch":[39.8184284160989037,134.326708962856742,273.625091115001112],"luv":[39.8184284160989037,8.49315165227522861,-134.057939398617776],"rgb":[0.466666666666666674,0,1],"xyz":[0.256556578828448567,0.111418894799459045,0.954098204925907689],"hpluv":[273.625091115001112,428.072753406140123,39.8184284160989037],"hsluv":[273.625091115001112,100.000000000000313,39.8184284160989037]},"#771100":{"lch":[24.7134353555624457,74.5310598854495794,14.479461840222152],"luv":[24.7134353555624457,72.1637543524892351,18.6352205622059],"rgb":[0.466666666666666674,0.0666666666666666657,0],"xyz":[0.078080190687547,0.0432353799605829231,0.00423418609655712257],"hpluv":[14.479461840222152,382.686818993669249,24.7134353555624457],"hsluv":[14.479461840222152,100.000000000002174,24.7134353555624457]},"#771111":{"lch":[24.8400617115613187,71.7342088143168723,12.1770506300618244],"luv":[24.8400617115613187,70.1202221387804912,15.1311321924069837],"rgb":[0.466666666666666674,0.0666666666666666657,0.0666666666666666657],"xyz":[0.0790918561871841175,0.043640046160437776,0.00956229106131275403],"hpluv":[12.1770506300618244,366.448517223619376,24.8400617115613187],"hsluv":[12.1770506300618244,85.8702458957174173,24.8400617115613187]},"#771122":{"lch":[25.0727380413203562,67.2476760425649616,7.76714475492354417],"luv":[25.0727380413203562,66.6307123231625,9.0883501491595],"rgb":[0.466666666666666674,0.0666666666666666657,0.133333333333333331],"xyz":[0.0809672143256611465,0.0443901894158286,0.0194391772572919501],"hpluv":[7.76714475492354417,340.341449223453765,25.0727380413203562],"hsluv":[7.76714475492354417,86.6206298981217,25.0727380413203562]},"#771133":{"lch":[25.4501908259833556,61.6001849310061189,0.209311103178295294],"luv":[25.4501908259833556,61.599773884646936,0.225035318388215971],"rgb":[0.466666666666666674,0.0666666666666666657,0.2],"xyz":[0.0840549650581188801,0.0456252897088117101,0.0357013311149031],"hpluv":[0.209311103178295294,307.135699817562568,25.4501908259833556],"hsluv":[0.209311103178295294,87.6964449022470802,25.4501908259833556]},"#771144":{"lch":[25.9833113937366775,56.5829308746863688,349.098656617234155],"luv":[25.9833113937366775,55.5618510799655,-10.7008771106518541],"rgb":[0.466666666666666674,0.0666666666666666657,0.266666666666666663],"xyz":[0.0885129603023377537,0.0474084878064992832,0.0591801060677897353],"hpluv":[349.098656617234155,276.331419289390624,25.9833113937366775],"hsluv":[349.098656617234155,88.9762099121112442,25.9833113937366775]},"#771155":{"lch":[26.6758393728738312,54.157242934368746,335.112354986374442],"luv":[26.6758393728738312,49.127918835603694,-22.7915456504066185],"rgb":[0.466666666666666674,0.0666666666666666657,0.333333333333333315],"xyz":[0.0944753743416997527,0.0497934534222441161,0.0905821533417636438],"hpluv":[335.112354986374442,257.618934567198892,26.6758393728738312],"hsluv":[335.112354986374442,90.3225181656420375,26.6758393728738312]},"#771166":{"lch":[27.5255776115618076,55.4731266930874796,320.490705765847224],"luv":[27.5255776115618076,42.7987039146097388,-35.2921907557026557],"rgb":[0.466666666666666674,0.0666666666666666657,0.4],"xyz":[0.102060370115207924,0.0528274517316474276,0.130529797748907606],"hpluv":[320.490705765847224,255.732268141411282,27.5255776115618076],"hsluv":[320.490705765847224,91.6238582413064364,27.5255776115618076]},"#771177":{"lch":[28.525624322061,60.3055315504910538,307.715012949243658],"luv":[28.525624322061,36.8909645322892956,-47.7054909990940672],"rgb":[0.466666666666666674,0.0666666666666666657,0.466666666666666674],"xyz":[0.111374383135409843,0.056553056939728244,0.179583599655305515],"hpluv":[307.715012949243658,268.263334170626,28.525624322061],"hsluv":[307.715012949243658,92.8109433172232201,28.525624322061]},"#771188":{"lch":[29.665668786552871,67.5901402176946,297.828537901307072],"luv":[29.665668786552871,31.5529142063876336,-59.77324367751811],"rgb":[0.466666666666666674,0.0666666666666666657,0.533333333333333326],"xyz":[0.122514800237353672,0.0610092237805058418,0.238256463058877682],"hpluv":[297.828537901307072,289.113605882780575,29.665668786552871],"hsluv":[297.828537901307072,93.8529472884676892,29.665668786552871]},"#771199":{"lch":[30.9332504381216253,76.2730393291315494,290.583951381139741],"luv":[30.9332504381216253,26.816032696200331,-71.4036197887723461],"rgb":[0.466666666666666674,0.0666666666666666657,0.6],"xyz":[0.135571764346426371,0.066232009424135,0.307023140699995589],"hpluv":[290.583951381139741,312.885056330098905,30.9332504381216253],"hsluv":[290.583951381139741,94.745562802664864,30.9332504381216253]},"#7711aa":{"lch":[32.3148680584756391,85.6471240548678452,285.332056603477554],"luv":[32.3148680584756391,22.6461849228904,-82.5989114172104166],"rgb":[0.466666666666666674,0.0666666666666666657,0.66666666666666663],"xyz":[0.150629457311678927,0.0722550866102361078,0.38632699031699419],"hpluv":[285.332056603477554,336.317699636744408,32.3148680584756391],"hsluv":[285.332056603477554,95.4992611083078771,32.3148680584756391]},"#7711bb":{"lch":[33.796865882550442,95.3131880713117,281.486339493443666],"luv":[33.796865882550442,18.9801244444786903,-93.4042755787407],"rgb":[0.466666666666666674,0.0666666666666666657,0.733333333333333282],"xyz":[0.167767049419015574,0.0791101234531708664,0.476584975415635936],"hpluv":[281.486339493443666,357.862255189103962,33.796865882550442],"hsluv":[281.486339493443666,96.130904738193,33.796865882550442]},"#7711cc":{"lch":[35.36607449089243,105.064609202725904,278.619980375929231],"luv":[35.36607449089243,15.7470979978009513,-103.877817707002151],"rgb":[0.466666666666666674,0.0666666666666666657,0.8],"xyz":[0.1870594248627373,0.086827073630659668,0.578191486085906092],"hpluv":[278.619980375929231,376.971848031202455,35.36607449089243],"hsluv":[278.619980375929231,96.6587778670915441,35.36607449089243]},"#7711dd":{"lch":[37.0102245888209,114.800572621107989,276.441726024966442],"luv":[37.0102245888209,12.8797770828984923,-114.075776641796878],"rgb":[0.466666666666666674,0.0666666666666666657,0.866666666666666696],"xyz":[0.208577750413370844,0.0954344038509132,0.69152133398591209],"hpluv":[276.441726024966442,393.605954910771402,37.0102245888209],"hsluv":[276.441726024966442,97.1000737310191084,37.0102245888209]},"#7711ee":{"lch":[38.7181742300654648,124.475046910670883,274.755182332196796],"luv":[38.7181742300654648,10.3187754184265525,-124.046604859938796],"rgb":[0.466666666666666674,0.0666666666666666657,0.933333333333333348],"xyz":[0.232389930679545609,0.104959275957383219,0.816932150054435313],"hpluv":[274.755182332196796,407.949828918098,38.7181742300654648],"hsluv":[274.755182332196796,97.4698666617264706,38.7181742300654648]},"#7711ff":{"lch":[40.4799968781786,134.069342311184641,273.42679883886251],"luv":[40.4799968781786,8.01376323316973682,-133.829623576382744],"rgb":[0.466666666666666674,0.0666666666666666657,1],"xyz":[0.258560979089377,0.115427695321315929,0.954766338346217158],"hpluv":[273.42679883886251,420.269946860795244,40.4799968781786],"hsluv":[273.42679883886251,99.99999999999946,40.4799968781786]},"#772200":{"lch":[26.9238486490213944,67.8779226750429814,18.9619118830866213],"luv":[26.9238486490213944,64.1945131058521241,22.0562207502031953],"rgb":[0.466666666666666674,0.133333333333333331,0],"xyz":[0.0817958144223149414,0.0506666274301188907,0.00547272734147973266],"hpluv":[18.9619118830866213,319.912145739235086,26.9238486490213944],"hsluv":[18.9619118830866213,100.000000000002203,26.9238486490213944]},"#772211":{"lch":[27.0378210495853537,65.3114997865878451,16.6506371445360628],"luv":[27.0378210495853537,62.5729698674152957,18.7140440938083152],"rgb":[0.466666666666666674,0.133333333333333331,0.0666666666666666657],"xyz":[0.0828074799219520596,0.0510712936299737436,0.0108008323062353633],"hpluv":[16.6506371445360628,306.518925183772069,27.0378210495853537],"hsluv":[16.6506371445360628,87.77659617077137,27.0378210495853537]},"#772222":{"lch":[27.2475131582451553,61.1491638550902934,12.1770506300618262],"luv":[27.2475131582451553,59.7733358183195094,12.8983939049434628],"rgb":[0.466666666666666674,0.133333333333333331,0.133333333333333331],"xyz":[0.0846828380604290887,0.0518214368853645649,0.0206777185022145593],"hpluv":[12.1770506300618262,284.775733052529233,27.2475131582451553],"hsluv":[12.1770506300618262,66.7317810633447,27.2475131582451553]},"#772233":{"lch":[27.5884028886125066,55.830319472153235,4.36926883706767555],"luv":[27.5884028886125066,55.668063043001986,4.25339034219168255],"rgb":[0.466666666666666674,0.133333333333333331,0.2],"xyz":[0.0877705887928868222,0.0530565371783476777,0.0369398723598257],"hpluv":[4.36926883706767555,256.792821962959806,27.5884028886125066],"hsluv":[4.36926883706767555,69.0869865520346,27.5884028886125066]},"#772244":{"lch":[28.0713586292933357,51.0577981227000137,352.597218961633928],"luv":[28.0713586292933357,50.6322267647614197,-6.57847717790113862],"rgb":[0.466666666666666674,0.133333333333333331,0.266666666666666663],"xyz":[0.0922285840371057,0.0548397352760352508,0.0604186473127123411],"hpluv":[352.597218961633928,230.801153887638264,28.0713586292933357],"hsluv":[352.597218961633928,71.9536276136468871,28.0713586292933357]},"#772255":{"lch":[28.7011983995690869,48.8793621784160877,337.425357822166575],"luv":[28.7011983995690869,45.134235573623549,-18.7641367015226166],"rgb":[0.466666666666666674,0.133333333333333331,0.333333333333333315],"xyz":[0.0981909980764677,0.0572247008917800837,0.0918206945866862495],"hpluv":[337.425357822166575,216.105005327694982,28.7011983995690869],"hsluv":[337.425357822166575,75.0482997779786416,28.7011983995690869]},"#772266":{"lch":[29.4776386596593341,50.6214045611569148,321.457127980188602],"luv":[29.4776386596593341,39.5931335065919541,-31.5421999688275427],"rgb":[0.466666666666666674,0.133333333333333331,0.4],"xyz":[0.105775993849975866,0.0602586992011833952,0.131768338993830225],"hpluv":[321.457127980188602,217.911839443782668,29.4776386596593341],"hsluv":[321.457127980188602,78.1196257410634871,29.4776386596593341]},"#772277":{"lch":[30.3962065887853328,56.0773495547330114,307.715012949243828],"luv":[30.3962065887853328,34.3044404103525125,-44.3607315225559375],"rgb":[0.466666666666666674,0.133333333333333331,0.466666666666666674],"xyz":[0.115090006870177786,0.0639843044092642116,0.180822140900228134],"hpluv":[307.715012949243828,234.103236488433623,30.3962065887853328],"hsluv":[307.715012949243828,80.9925899090149,30.3962065887853328]},"#772288":{"lch":[31.4492100235983827,64.0564791390884,297.353574907339521],"luv":[31.4492100235983827,29.432687880373738,-56.8941948166328118],"rgb":[0.466666666666666674,0.133333333333333331,0.533333333333333326],"xyz":[0.126230423972121614,0.0684404712500418094,0.239495004303800302],"hpluv":[297.353574907339521,258.459589193709576,31.4492100235983827],"hsluv":[297.353574907339521,83.5725358287189692,31.4492100235983827]},"#772299":{"lch":[32.6267183371791276,73.3979299617999885,289.947447059718741],"luv":[32.6267183371791276,25.040297814612174,-68.9944896932561136],"rgb":[0.466666666666666674,0.133333333333333331,0.6],"xyz":[0.139287388081194341,0.073663256893670967,0.308261681944918209],"hpluv":[289.947447059718741,285.462946683821,32.6267183371791276],"hsluv":[289.947447059718741,85.8272099061853169,32.6267183371791276]},"#7722aa":{"lch":[33.91747454857272,83.3484305918169213,284.681710760769079],"luv":[33.91747454857272,21.1245907707188039,-80.6269963900962],"rgb":[0.466666666666666674,0.133333333333333331,0.66666666666666663],"xyz":[0.154345081046446869,0.0796863340797720754,0.38756553156191681],"hpluv":[284.681710760769079,311.826661765562392,33.91747454857272],"hsluv":[284.681710760769079,87.7639475735253,33.91747454857272]},"#7722bb":{"lch":[35.3096729107126137,93.4985765466947,280.880145280973409],"luv":[35.3096729107126137,17.6483381470917493,-91.8178630599952186],"rgb":[0.466666666666666674,0.133333333333333331,0.733333333333333282],"xyz":[0.171482673153783516,0.086541370922706834,0.477823516660558556],"hpluv":[280.880145280973409,336.008784107710085,35.3096729107126137],"hsluv":[280.880145280973409,89.410850129911168,35.3096729107126137]},"#7722cc":{"lch":[36.7915673195940158,103.646851370476796,278.075561058441508],"luv":[36.7915673195940158,14.5601992392030191,-102.619054746808203],"rgb":[0.466666666666666674,0.133333333333333331,0.8],"xyz":[0.19077504859750527,0.0942583211001956356,0.579430027330828712],"hpluv":[278.075561058441508,357.476214898523438,36.7915673195940158],"hsluv":[278.075561058441508,90.8041771911133395,36.7915673195940158]},"#7722dd":{"lch":[38.351906528896663,113.703099806952181,275.960131804992216],"luv":[38.351906528896663,11.8065226659589069,-113.088465053903391],"rgb":[0.466666666666666674,0.133333333333333331,0.866666666666666696],"xyz":[0.212293374148138814,0.10286565132044917,0.69275987523083471],"hpluv":[275.960131804992216,376.205095027198126,38.351906528896663],"hsluv":[275.960131804992216,91.9810564333708101,38.351906528896663]},"#7722ee":{"lch":[39.9802139341708269,123.633267676123751,274.331320845995606],"luv":[39.9802139341708269,9.33725773346982812,-123.280170726255989],"rgb":[0.466666666666666674,0.133333333333333331,0.933333333333333348],"xyz":[0.236105554414313523,0.112390523426919187,0.818170691299357933],"hpluv":[274.331320845995606,392.400507860275241,39.9802139341708269],"hsluv":[274.331320845995606,92.975835565241681,39.9802139341708269]},"#7722ff":{"lch":[41.6669409214524222,133.430100966175758,273.053819065229],"luv":[41.6669409214524222,7.10835060884393233,-133.240621416539511],"rgb":[0.466666666666666674,0.133333333333333331,1],"xyz":[0.262276602824144944,0.122858942790851897,0.956004879591139778],"hpluv":[273.053819065229,406.351179140502,41.6669409214524222],"hsluv":[273.053819065229,99.9999999999994,41.6669409214524222]},"#eeaa00":{"lch":[74.1441199778221716,94.3993067628715323,52.9277228913731435],"luv":[74.1441199778221716,56.9059790518510553,75.3189130661151438],"rgb":[0.933333333333333348,0.66666666666666663,0],"xyz":[0.496332043879122442,0.469286695915611562,0.0644413600602487119],"hpluv":[52.9277228913731435,161.559096825574699,74.1441199778221716],"hsluv":[52.9277228913731435,100.00000000000226,74.1441199778221716]},"#eeaa11":{"lch":[74.170022976797469,93.4032488378738748,52.6298301838218165],"luv":[74.170022976797469,56.6922374254564474,74.2304325001913412],"rgb":[0.933333333333333348,0.66666666666666663,0.0666666666666666657],"xyz":[0.497343709378759546,0.469691362115466415,0.0697694650250043485],"hpluv":[52.6298301838218165,159.798572537124,74.170022976797469],"hsluv":[52.6298301838218165,98.6103970010943698,74.170022976797469]},"#eeaa22":{"lch":[74.2180009061856794,91.5777923210439866,52.06484069365154],"luv":[74.2180009061856794,56.2992155036066038,72.2280442769616],"rgb":[0.933333333333333348,0.66666666666666663,0.133333333333333331],"xyz":[0.499219067517236603,0.470441505370857216,0.0796463512209835411],"hpluv":[52.06484069365154,156.574215350823607,74.2180009061856794],"hsluv":[52.06484069365154,96.0561964998804427,74.2180009061856794]},"#eeaa33":{"lch":[74.296884894391,88.6315089581908353,51.0969321655322659],"luv":[74.296884894391,55.6610065739707096,68.9738843866158646],"rgb":[0.933333333333333348,0.66666666666666663,0.2],"xyz":[0.502306818249694365,0.471676605663840343,0.0959085050785946913],"hpluv":[51.0969321655322659,151.375944062314744,74.296884894391],"hsluv":[51.0969321655322659,91.9112466174575786,74.296884894391]},"#eeaa44":{"lch":[74.4105324975616,84.5080331915566,49.6113532778883268],"luv":[74.4105324975616,54.7585847399730952,64.3669563610119582],"rgb":[0.933333333333333348,0.66666666666666663,0.266666666666666663],"xyz":[0.506764813493913224,0.473459803761527909,0.11938728003148133],"hpluv":[49.6113532778883268,144.112916810009352,74.4105324975616],"hsluv":[49.6113532778883268,86.056132752536,74.4105324975616]},"#eeaa55":{"lch":[74.5620870475656545,79.2349762990306203,47.4460085751506284],"luv":[74.5620870475656545,53.5853993814341081,58.3676832008958897],"rgb":[0.933333333333333348,0.66666666666666663,0.333333333333333315],"xyz":[0.512727227533275154,0.475844769377272769,0.150789327305455245],"hpluv":[47.4460085751506284,134.846041865267,74.5620870475656545],"hsluv":[47.4460085751506284,78.4547380743125302,74.5620870475656545]},"#eeaa66":{"lch":[74.7541548019056705,72.9335579755352512,44.3584242628533616],"luv":[74.7541548019056705,52.1460491859645643,50.9911113162453518],"rgb":[0.933333333333333348,0.66666666666666663,0.4],"xyz":[0.520312223306783395,0.478878767686676088,0.190736971712599179],"hpluv":[44.3584242628533616,123.803063546095515,74.7541548019056705],"hsluv":[44.3584242628533616,69.1456590086766,74.7541548019056705]},"#eeaa77":{"lch":[74.988898345165353,65.8409092602829702,39.9757578623994689],"luv":[74.988898345165353,50.4549646902964213,42.3003767160737851],"rgb":[0.933333333333333348,0.66666666666666663,0.466666666666666674],"xyz":[0.529626236326985245,0.482604372894756883,0.239790773618997088],"hpluv":[39.9757578623994689,111.41359114675457,74.988898345165353],"hsluv":[39.9757578623994689,69.3768546233612398,74.988898345165353]},"#eeaa88":{"lch":[75.268091919562039,58.355059996267,33.7246537035848917],"luv":[75.268091919562039,48.5347963512250544,32.3988668060016],"rgb":[0.933333333333333348,0.66666666666666663,0.533333333333333326],"xyz":[0.540766653428929156,0.487060539735534481,0.298463637022569284],"hpluv":[33.7246537035848917,98.3800275430836706,75.268091919562039],"hsluv":[33.7246537035848917,69.7313730072723388,75.268091919562039]},"#eeaa99":{"lch":[75.5931575717450102,51.1191249468368198,24.7740386445795764],"luv":[75.5931575717450102,46.4145012045046172,21.4209946843594],"rgb":[0.933333333333333348,0.66666666666666663,0.6],"xyz":[0.5538236175380018,0.492283325379163639,0.367230314663687163],"hpluv":[24.7740386445795764,85.8104641434512274,75.5931575717450102],"hsluv":[24.7740386445795764,70.1099573125584925,75.5931575717450102]},"#eeaaaa":{"lch":[75.9651912478537,45.142946910964838,12.1770506300622827],"luv":[75.9651912478537,44.1272513869876164,9.52215001119964199],"rgb":[0.933333333333333348,0.66666666666666663,0.66666666666666663],"xyz":[0.568881310503254412,0.498306402565264761,0.446534164280685764],"hpluv":[12.1770506300622827,75.4075094474617771,75.9651912478537],"hsluv":[12.1770506300622827,70.5013292017584661,75.9651912478537]},"#eeaabb":{"lch":[76.3849837125259512,41.8257198613105743,355.706426922992932],"luv":[76.3849837125259512,41.7083375548448743,-3.13136077895000353],"rgb":[0.933333333333333348,0.66666666666666663,0.733333333333333282],"xyz":[0.586018902610591,0.505161439408199464,0.53679214937932751],"hpluv":[355.706426922992932,71.0120800923082243,76.3849837125259512],"hsluv":[355.706426922992932,70.8933377227291857,76.3849837125259512]},"#eeaacc":{"lch":[76.8530390510081,42.4751513806234229,337.329003704434115],"luv":[76.8530390510081,39.1932374848878169,-16.3715796507258275],"rgb":[0.933333333333333348,0.66666666666666663,0.8],"xyz":[0.605311278054312729,0.512878389585688321,0.638398660049597666],"hpluv":[337.329003704434115,73.8860979443606283,76.8530390510081],"hsluv":[337.329003704434115,71.273377003825658,76.8530390510081]},"#eeaadd":{"lch":[77.3695923472492666,47.3596417233686893,320.637369166639587],"luv":[77.3695923472492666,36.6159833837478814,-30.0367345929437413],"rgb":[0.933333333333333348,0.66666666666666663,0.866666666666666696],"xyz":[0.626829603604946328,0.521485719805941828,0.751728507949603664],"hpluv":[320.637369166639587,84.6581146126829,77.3695923472492666],"hsluv":[320.637369166639587,71.6287050870027144,77.3695923472492666]},"#eeaaee":{"lch":[77.9346274334411078,55.5926087174301244,307.715012949246329],"luv":[77.9346274334411078,34.00790779424905,-43.9772708506012506],"rgb":[0.933333333333333348,0.66666666666666663,0.933333333333333348],"xyz":[0.650641783871121,0.531010591912411845,0.877139324018126887],"hpluv":[307.715012949246329,102.440850498764817,77.9346274334411078],"hsluv":[307.715012949246329,71.9466349992656,77.9346274334411078]},"#eeaaff":{"lch":[78.5478951631237123,66.0054362136172,298.40296943037481],"luv":[78.5478951631237123,31.3967924706888546,-58.0599606639755166],"rgb":[0.933333333333333348,0.66666666666666663,1],"xyz":[0.676812832280952459,0.541479011276344568,1.01497351230990884],"hpluv":[298.40296943037481,125.797711632464541,78.5478951631237123],"hsluv":[298.40296943037481,99.9999999999967457,78.5478951631237123]},"#773300":{"lch":[30.1331354048611715,59.6402239078303253,26.8671398719653283],"luv":[30.1331354048611715,53.2024709950710601,26.952799257122777],"rgb":[0.466666666666666674,0.2,0],"xyz":[0.0879135365113257461,0.0629020716081407,0.0075119680378166135],"hpluv":[26.8671398719653283,251.150628123644026,30.1331354048611715],"hsluv":[26.8671398719653283,100.000000000002174,30.1331354048611715]},"#773311":{"lch":[30.23185303241101,57.2493346092074376,24.6191658238461528],"luv":[30.23185303241101,52.0451874365790204,23.8492091669378929],"rgb":[0.466666666666666674,0.2,0.0666666666666666657],"xyz":[0.0889252020109628644,0.0633067378079955473,0.012840073002572245],"hpluv":[24.6191658238461528,240.295148301589592,30.23185303241101],"hsluv":[24.6191658238461528,89.9983576544591131,30.23185303241101]},"#773322":{"lch":[30.4137421865898716,53.2944669038914185,20.1857997859538507],"luv":[30.4137421865898716,50.0210446853216055,18.3900867632275506],"rgb":[0.466666666666666674,0.2,0.133333333333333331],"xyz":[0.0908005601494399,0.0640568810633863617,0.022716959198551441],"hpluv":[20.1857997859538507,222.35740076876786,30.4137421865898716],"hsluv":[20.1857997859538507,72.5478159849102,30.4137421865898716]},"#773333":{"lch":[30.7101510688592612,48.0738359215612618,12.1770506300619186],"luv":[30.7101510688592612,46.9921967440780932,10.1403720532853221],"rgb":[0.466666666666666674,0.2,0.2],"xyz":[0.093888310881897627,0.0652919813563694745,0.0389791130561625843],"hpluv":[12.1770506300619186,198.639745699191,30.7101510688592612],"hsluv":[12.1770506300619186,46.5474493854848177,30.7101510688592612]},"#773344":{"lch":[31.1315732769052218,43.177963340605487,359.450637080068248],"luv":[31.1315732769052218,43.1759786068728815,-0.413992248148033204],"rgb":[0.466666666666666674,0.2,0.266666666666666663],"xyz":[0.0983463061261165,0.0670751794540570545,0.0624578880090492228],"hpluv":[359.450637080068248,175.995032884643848,31.1315732769052218],"hsluv":[359.450637080068248,50.753084379908266,31.1315732769052218]},"#773355":{"lch":[31.6836931484193158,40.8566925980369149,342.103665666318761],"luv":[31.6836931484193158,38.8798033655970627,-12.5550874271345432],"rgb":[0.466666666666666674,0.2,0.333333333333333315],"xyz":[0.1043087201654785,0.0694601450698018874,0.0938599352830231382],"hpluv":[342.103665666318761,163.631433468067485,31.6836931484193158],"hsluv":[342.103665666318761,55.4419897041632623,31.6836931484193158]},"#773366":{"lch":[32.368092831934419,42.8604868736005429,323.403106692152903],"luv":[32.368092831934419,34.4105334223914952,-25.55262265656037],"rgb":[0.466666666666666674,0.2,0.4],"xyz":[0.111893715938986671,0.0724941433792052,0.1338075796901671],"hpluv":[323.403106692152903,168.027093700417197,32.368092831934419],"hsluv":[323.403106692152903,60.2559031079253913,32.368092831934419]},"#773377":{"lch":[33.18286532501061,49.0630735877418189,307.715012949244226],"luv":[33.18286532501061,30.0135669321659,-38.8119954380674201],"rgb":[0.466666666666666674,0.2,0.466666666666666674],"xyz":[0.12120772895918859,0.0762197485872860153,0.182861381596565],"hpluv":[307.715012949244226,187.620458725202155,33.18286532501061],"hsluv":[307.715012949244226,64.9109644958811458,33.18286532501061]},"#773388":{"lch":[34.1232577260479,58.0074356166469371,296.464975996700218],"luv":[34.1232577260479,25.8510525803809479,-51.9286594021626868],"rgb":[0.466666666666666674,0.2,0.533333333333333326],"xyz":[0.132348146061132432,0.0806759154280636132,0.241534245000137177],"hpluv":[296.464975996700218,215.711106662248483,34.1232577260479],"hsluv":[296.464975996700218,69.2226633917654226,34.1232577260479]},"#773399":{"lch":[35.1823459678372572,68.3160830057283,288.793689920994325],"luv":[35.1823459678372572,22.0088074868374761,-64.6737936899706369],"rgb":[0.466666666666666674,0.2,0.6],"xyz":[0.145405110170205132,0.0858987010716927707,0.310300922641255084],"hpluv":[288.793689920994325,246.398176299420243,35.1823459678372572],"hsluv":[288.793689920994325,73.0971646513407,35.1823459678372572]},"#7733aa":{"lch":[36.3517007299652,79.1457370086552316,283.529620316849901],"luv":[36.3517007299652,18.5159885211015585,-76.9493720294691741],"rgb":[0.466666666666666674,0.2,0.66666666666666663],"xyz":[0.160462803135457688,0.0919217782577938791,0.389604772258253684],"hpluv":[283.529620316849901,276.275338575971432,36.3517007299652],"hsluv":[283.529620316849901,76.5077273075914093,36.3517007299652]},"#7733bb":{"lch":[37.6219984216960484,90.0609255961329183,279.823655256592],"luv":[37.6219984216960484,15.3658639022925581,-88.7404110074345596],"rgb":[0.466666666666666674,0.2,0.733333333333333282],"xyz":[0.177600395242794307,0.0987768151007286377,0.479862757356895431],"hpluv":[279.823655256592,303.762299466947354,37.6219984216960484],"hsluv":[279.823655256592,79.4699002038008615,37.6219984216960484]},"#7733cc":{"lch":[38.9835424310364687,100.85881095677091,277.137789072490136],"luv":[38.9835424310364687,12.5323059717609908,-100.077175492935524],"rgb":[0.466666666666666674,0.2,0.8],"xyz":[0.196892770686516061,0.106493765278217439,0.581469268027165587],"hpluv":[277.137789072490136,328.300745951509327,38.9835424310364687],"hsluv":[277.137789072490136,82.0218198813884,38.9835424310364687]},"#7733dd":{"lch":[40.4266769703902469,111.457640409912926,275.137669231249674],"luv":[40.4266769703902469,9.98093438608736,-111.009848907770674],"rgb":[0.466666666666666674,0.2,0.866666666666666696],"xyz":[0.218411096237149605,0.115101095498470973,0.694799115927171584],"hpluv":[275.137669231249674,349.849394775278881,40.4266769703902469],"hsluv":[275.137669231249674,84.2108753320266459,40.4266769703902469]},"#7733ee":{"lch":[41.9420918590451066,121.83559331992231,273.612094072304103],"luv":[41.9420918590451066,7.67578650940870766,-121.593561100411392],"rgb":[0.466666666666666674,0.2,0.933333333333333348],"xyz":[0.242223276503324342,0.12462596760494099,0.820209931995694808],"hpluv":[273.612094072304103,368.606867281158145,41.9420918590451066],"hsluv":[273.612094072304103,91.3228806729277665,41.9420918590451066]},"#7733ff":{"lch":[43.521028110395612,131.998699032970592,272.424037139620168],"luv":[43.521028110395612,5.58285979872954208,-131.88058319125102],"rgb":[0.466666666666666674,0.2,1],"xyz":[0.268394324913155735,0.135094386968873714,0.958044120287476653],"hpluv":[272.424037139620168,384.866252510120546,43.521028110395612],"hsluv":[272.424037139620168,99.9999999999993605,43.521028110395612]},"#eebb00":{"lch":[78.2979307719844115,92.4506686575273307,61.8965912674010781],"luv":[78.2979307719844115,43.5502151824584587,81.5506277890334275],"rgb":[0.933333333333333348,0.733333333333333282,0],"xyz":[0.530286541787721277,0.537195691732810121,0.0757595260297813378],"hpluv":[61.8965912674010781,173.778692590363192,78.2979307719844115],"hsluv":[61.8965912674010781,100.000000000002373,78.2979307719844115]},"#eebb11":{"lch":[78.3216028454340858,91.4822746680663528,61.6861071172261504],"luv":[78.3216028454340858,43.3901974999079059,80.5375523551748],"rgb":[0.933333333333333348,0.733333333333333282,0.0666666666666666657],"xyz":[0.531298207287358437,0.537600357932665,0.0810876309945369744],"hpluv":[61.6861071172261504,172.182825477748111,78.3216028454340858],"hsluv":[61.6861071172261504,98.7812238781787642,78.3216028454340858]},"#eebb22":{"lch":[78.3654531575016335,89.702527227679937,61.2866058237147371],"luv":[78.3654531575016335,43.0956539167563477,78.672155204492924],"rgb":[0.933333333333333348,0.733333333333333282,0.133333333333333331],"xyz":[0.533173565425835383,0.53835050118805583,0.090964517190516167],"hpluv":[61.2866058237147371,169.241982225815036,78.3654531575016335],"hsluv":[61.2866058237147371,96.5386826089343,78.3654531575016335]},"#eebb33":{"lch":[78.4375634156200192,86.8156112143301897,60.6012126372659665],"luv":[78.4375634156200192,42.6165086308843897,75.6358614853528906],"rgb":[0.933333333333333348,0.733333333333333282,0.2],"xyz":[0.5362613161582932,0.539585601481039,0.107226671048127303],"hpluv":[60.6012126372659665,164.44952499458185,78.4375634156200192],"hsluv":[60.6012126372659665,92.89304460263088,78.4375634156200192]},"#eebb44":{"lch":[78.5414800230656,82.7424491039972878,59.5464137785053],"luv":[78.5414800230656,41.9372005918819397,71.3273025583039839],"rgb":[0.933333333333333348,0.733333333333333282,0.266666666666666663],"xyz":[0.540719311402512059,0.541368799578726523,0.130705446001013942],"hpluv":[59.5464137785053,157.640041580932575,78.5414800230656],"hsluv":[59.5464137785053,87.729612164687,78.5414800230656]},"#eebb55":{"lch":[78.6801087960333,77.4695312482544,58.0014729567720551],"luv":[78.6801087960333,41.0509080282697809,65.6989438414256455],"rgb":[0.933333333333333348,0.733333333333333282,0.333333333333333315],"xyz":[0.546681725441874,0.543753765194471272,0.162107493274987857],"hpluv":[58.0014729567720551,148.738759066450825,78.6801087960333],"hsluv":[58.0014729567720551,81.0022494643358613,78.6801087960333]},"#eebb66":{"lch":[78.8558787138066748,71.0520814803831229,55.7790951769469174],"luv":[78.8558787138066748,39.9586324736418845,58.7512210386423703],"rgb":[0.933333333333333348,0.733333333333333282,0.4],"xyz":[0.55426672121538223,0.546787763503874591,0.202055137682131819],"hpluv":[55.7790951769469174,137.768430134850121,78.8558787138066748],"hsluv":[55.7790951769469174,72.7264864885570574,78.8558787138066748]},"#eebb77":{"lch":[79.0708286262536,63.6259938562226566,52.5733668905169],"luv":[79.0708286262536,38.6683825737350801,50.5274507898760348],"rgb":[0.933333333333333348,0.733333333333333282,0.466666666666666674],"xyz":[0.56358073423558408,0.550513368711955442,0.251108939588529756],"hpluv":[52.5733668905169,124.876553308513152,79.0708286262536],"hsluv":[52.5733668905169,64.3532422469102841,79.0708286262536]},"#eebb88":{"lch":[79.3266586201773833,55.4370708593257149,47.8613800964459557],"luv":[79.3266586201773833,37.1942049853437169,41.1079060640423961],"rgb":[0.933333333333333348,0.733333333333333282,0.533333333333333326],"xyz":[0.574721151337528,0.554969535552733,0.309781802992101896],"hpluv":[47.8613800964459557,110.403075040931697,79.3266586201773833],"hsluv":[47.8613800964459557,64.6428486235092379,79.3266586201773833]},"#eebb99":{"lch":[79.6247632766216071,46.9114913521919519,40.7190885070752131],"luv":[79.6247632766216071,35.5550187983100727,30.6027557441907163],"rgb":[0.933333333333333348,0.733333333333333282,0.6],"xyz":[0.587778115446600635,0.560192321196362197,0.378548480633219775],"hpluv":[40.7190885070752131,95.0436922052712845,79.6247632766216071],"hsluv":[40.7190885070752131,64.94797236425741,79.6247632766216071]},"#eebbaa":{"lch":[79.9662551563314,38.821829319770238,29.5464132636418633],"luv":[79.9662551563314,33.7733033676501,19.1441482278540249],"rgb":[0.933333333333333348,0.733333333333333282,0.66666666666666663],"xyz":[0.602835808411853247,0.566215398382463264,0.457852330250218431],"hpluv":[29.5464132636418633,80.2381481795300573,79.9662551563314],"hsluv":[29.5464132636418633,65.2570717669902081,79.9662551563314]},"#eebbbb":{"lch":[80.3519829843595,32.6073830473385868,12.1770506300627979],"luv":[80.3519829843595,31.8737319395561,6.87798236703069765],"rgb":[0.933333333333333348,0.733333333333333282,0.733333333333333282],"xyz":[0.61997340051918981,0.573070435225398,0.548110315348860122],"hpluv":[12.1770506300627979,68.9527679352530498,80.3519829843595],"hsluv":[12.1770506300627979,65.5572779496269646,80.3519829843595]},"#eebbcc":{"lch":[80.7825470949933,30.4869713003172755,348.56539147946927],"luv":[80.7825470949933,29.8818538307637169,-6.04402437976891349],"rgb":[0.933333333333333348,0.733333333333333282,0.8],"xyz":[0.639265775962911564,0.58078738540288688,0.649716826019130278],"hpluv":[348.56539147946927,66.1649916626687542,80.7825470949933],"hsluv":[348.56539147946927,65.8346704867411,80.7825470949933]},"#eebbdd":{"lch":[81.2583136554081165,33.9595526191752555,325.014354592586812],"luv":[81.2583136554081165,27.8229160969035512,-19.4714291709468021],"rgb":[0.933333333333333348,0.733333333333333282,0.866666666666666696],"xyz":[0.660784101513545163,0.589394715623140386,0.763046673919136276],"hpluv":[325.014354592586812,75.8902298772919721,81.2583136554081165],"hsluv":[325.014354592586812,66.0744631525984119,81.2583136554081165]},"#eebbee":{"lch":[81.7794285687783429,42.0458499431423576,307.715012949247921],"luv":[81.7794285687783429,25.7208902583653902,-33.2609275540891716],"rgb":[0.933333333333333348,0.733333333333333282,0.933333333333333348],"xyz":[0.684596281779719873,0.598919587729610403,0.888457489987659499],"hpluv":[307.715012949247921,97.0917602325266245,81.7794285687783429],"hsluv":[307.715012949247921,66.2610602343042103,81.7794285687783429]},"#eebbff":{"lch":[82.3458315671937697,52.842459086223478,296.523687653639684],"luv":[82.3458315671937697,23.5977388768935938,-47.2807804734349446],"rgb":[0.933333333333333348,0.733333333333333282,1],"xyz":[0.710767330189551294,0.609388007093543127,1.02629167827944134],"hpluv":[296.523687653639684,126.563624284615543,82.3458315671937697],"hsluv":[296.523687653639684,99.9999999999958504,82.3458315671937697]},"#774400":{"lch":[34.1007355557283631,52.2824067620925845,38.9690248280103901],"luv":[34.1007355557283631,40.6488429776156863,32.8804139483986475],"rgb":[0.466666666666666674,0.266666666666666663,0],"xyz":[0.0967461069942917862,0.0805672125740730105,0.0104561581988052085],"hpluv":[38.9690248280103901,194.549962435525771,34.1007355557283631],"hsluv":[38.9690248280103901,100.000000000002302,34.1007355557283631]},"#774411":{"lch":[34.1844760931178726,49.9480603042207,37.0032460066389604],"luv":[34.1844760931178726,39.8885915773263164,30.0617529450848728],"rgb":[0.466666666666666674,0.266666666666666663,0.0666666666666666657],"xyz":[0.0977577724939289,0.0809718787739278634,0.0157842631635608383],"hpluv":[37.0032460066389604,185.408237524396696,34.1844760931178726],"hsluv":[37.0032460066389604,92.0774266797174477,34.1844760931178726]},"#774422":{"lch":[34.3389737161705639,45.9687551907429608,33.0232295817012798],"luv":[34.3389737161705639,38.542488289151045,25.0520069109664867],"rgb":[0.466666666666666674,0.266666666666666663,0.133333333333333331],"xyz":[0.0996331306324059335,0.0817220220293186778,0.0256611493595400378],"hpluv":[33.0232295817012798,169.869245826721482,34.3389737161705639],"hsluv":[33.0232295817012798,78.0803941927279794,34.3389737161705639]},"#774433":{"lch":[34.5913049894652787,40.4066166426811861,25.4401077009201266],"luv":[34.5913049894652787,36.4885814660887746,17.357364174931714],"rgb":[0.466666666666666674,0.266666666666666663,0.2],"xyz":[0.102720881364863667,0.0829571223223017906,0.041923303217151181],"hpluv":[25.4401077009201266,148.226163260119392,34.5913049894652787],"hsluv":[25.4401077009201266,56.8050953227402715,34.5913049894652787]},"#774444":{"lch":[34.9512320153617324,34.6101233100924119,12.1770506300620909],"luv":[34.9512320153617324,33.8314114683579277,7.30042694631360689],"rgb":[0.466666666666666674,0.266666666666666663,0.266666666666666663],"xyz":[0.107178876609082541,0.0847403204199893706,0.0654020781700378195],"hpluv":[12.1770506300620909,125.655060642768362,34.9512320153617324],"hsluv":[12.1770506300620909,29.4448754689639038,34.9512320153617324]},"#774455":{"lch":[35.4248138391838907,31.0799263948782318,351.580242092888511],"luv":[35.4248138391838907,30.7449438027498871,-4.55085214842230634],"rgb":[0.466666666666666674,0.266666666666666663,0.333333333333333315],"xyz":[0.11314129064844454,0.0871252860357342,0.0968041254440117349],"hpluv":[351.580242092888511,111.329877567225012,35.4248138391838907],"hsluv":[351.580242092888511,35.0525071981411855,35.4248138391838907]},"#774466":{"lch":[36.0149447056398699,32.55773059028094,327.386935336661793],"luv":[36.0149447056398699,27.4243377055297302,-17.5474078599198116],"rgb":[0.466666666666666674,0.266666666666666663,0.4],"xyz":[0.120726286421952711,0.090159284345137522,0.136751769851155697],"hpluv":[327.386935336661793,114.712488009680612,36.0149447056398699],"hsluv":[327.386935336661793,41.0162201785438469,36.0149447056398699]},"#774477":{"lch":[36.7217587051522898,39.3078830273429531,307.715012949244965],"luv":[36.7217587051522898,24.0459818745983789,-31.0950224919964064],"rgb":[0.466666666666666674,0.266666666666666663,0.466666666666666674],"xyz":[0.130040299442154617,0.0938848895532183314,0.185805571757553606],"hpluv":[307.715012949244965,135.82994003022975,36.7217587051522898],"hsluv":[307.715012949244965,46.9930223744603381,36.7217587051522898]},"#774488":{"lch":[37.5430301686231331,49.3077922843884906,294.880307130505798],"luv":[37.5430301686231331,20.7449732069104158,-44.731470651041306],"rgb":[0.466666666666666674,0.266666666666666663,0.533333333333333326],"xyz":[0.141180716544098472,0.0983410563939959292,0.244478435161125773],"hpluv":[294.880307130505798,166.657768282509579,37.5430301686231331],"hsluv":[294.880307130505798,52.7229750286883814,37.5430301686231331]},"#774499":{"lch":[38.4745988052595678,60.7540316024919775,286.849160899925266],"luv":[38.4745988052595678,17.609743748149274,-58.1459309073396042],"rgb":[0.466666666666666674,0.266666666666666663,0.6],"xyz":[0.154237680653171172,0.103563842037625087,0.313245112802243653],"hpluv":[286.849160899925266,200.373520820200838,38.4745988052595678],"hsluv":[286.849160899925266,58.0391908614757739,38.4745988052595678]},"#7744aa":{"lch":[39.5108096650206306,72.6607854160185695,281.662296555210446],"luv":[39.5108096650206306,14.6878600390207232,-71.1607792589909423],"rgb":[0.466666666666666674,0.266666666666666663,0.66666666666666663],"xyz":[0.169295373618423728,0.109586919223726181,0.392548962419242253],"hpluv":[281.662296555210446,233.358425064810547,39.5108096650206306],"hsluv":[281.662296555210446,62.855979622580108,39.5108096650206306]},"#7744bb":{"lch":[40.6449442050895,84.5532389367896684,278.156646558388104],"luv":[40.6449442050895,11.9964108827533504,-83.6978873128468],"rgb":[0.466666666666666674,0.266666666666666663,0.733333333333333282],"xyz":[0.186432965725760347,0.11644195606666094,0.482806947517884],"hpluv":[278.156646558388104,263.975148792079324,40.6449442050895],"hsluv":[278.156646558388104,67.1480450168623832,40.6449442050895]},"#7744cc":{"lch":[41.8696179576200223,96.2178725735773099,275.685728840067554],"luv":[41.8696179576200223,9.53248740063005151,-95.7445073439828747],"rgb":[0.466666666666666674,0.266666666666666663,0.8],"xyz":[0.205725341169482101,0.124158906244149742,0.584413458188154156],"hpluv":[275.685728840067554,291.605746800226,41.8696179576200223],"hsluv":[275.685728840067554,71.7563947172966721,41.8696179576200223]},"#7744dd":{"lch":[43.1771261833787037,107.572507589609089,273.881356516641858],"luv":[43.1771261833787037,7.28165300546471084,-107.325774717094461],"rgb":[0.466666666666666674,0.266666666666666663,0.866666666666666696],"xyz":[0.227243666720115645,0.132766236464403276,0.697743306088160153],"hpluv":[273.881356516641858,316.145413845169799,43.1771261833787037],"hsluv":[273.881356516641858,81.1040313116107683,43.1771261833787037]},"#7744ee":{"lch":[44.5597272061305958,118.600491111934247,272.524492751992966],"luv":[44.5597272061305958,5.22393127379498168,-118.485387428318177],"rgb":[0.466666666666666674,0.266666666666666663,0.933333333333333348],"xyz":[0.251055846986290354,0.14229110857087332,0.823154122156683377],"hpluv":[272.524492751992966,337.740615485066769,44.5597272061305958],"hsluv":[272.524492751992966,90.4775463334620866,44.5597272061305958]},"#7744ff":{"lch":[46.0098610845945188,129.316457315512423,271.478956563127554],"luv":[46.0098610845945188,3.33763127257498882,-129.273378350389976],"rgb":[0.466666666666666674,0.266666666666666663,1],"xyz":[0.277226895396121775,0.152759527934806016,0.960988310448465222],"hpluv":[271.478956563127554,356.649979093308843,46.0098610845945188],"hsluv":[271.478956563127554,99.9999999999992752,46.0098610845945188]},"#eecc00":{"lch":[82.5742071813858161,93.0890420253441278,70.6743105766144737],"luv":[82.5742071813858161,30.8066573410433797,87.8437226480516529],"rgb":[0.933333333333333348,0.8,0],"xyz":[0.568510285097338142,0.613643178352045071,0.088500773799653279],"hpluv":[70.6743105766144737,226.330948640265689,82.5742071813858161],"hsluv":[70.6743105766144737,100.000000000002331,82.5742071813858161]},"#eecc11":{"lch":[82.5958706312260773,92.1609271203023,70.5494354113464226],"luv":[82.5958706312260773,30.6889817522442812,86.9012248859824297],"rgb":[0.933333333333333348,0.8,0.0666666666666666657],"xyz":[0.569521950596975302,0.6140478445519,0.0938288787644089156],"hpluv":[70.5494354113464226,224.395635781555484,82.5958706312260773],"hsluv":[70.5494354113464226,98.9293851282895389,82.5958706312260773]},"#eecc22":{"lch":[82.636003730849751,90.4517890224530277,70.3125751850760849],"luv":[82.636003730849751,30.4721781878481224,85.1643851257694848],"rgb":[0.933333333333333348,0.8,0.133333333333333331],"xyz":[0.571397308735452247,0.61479798780729078,0.103705764960388108],"hpluv":[70.3125751850760849,220.820363432361461,82.636003730849751],"hsluv":[70.3125751850760849,96.9576791715233668,82.636003730849751]},"#eecc33":{"lch":[82.7020112487531,87.6695564091762236,69.9066450473675332],"luv":[82.7020112487531,30.1189443150749909,82.3334701948554084],"rgb":[0.933333333333333348,0.8,0.2],"xyz":[0.574485059467910064,0.616033088100273907,0.119967918817999258],"hpluv":[69.9066450473675332,214.968262161852493,82.7020112487531],"hsluv":[69.9066450473675332,93.7473974454290726,82.7020112487531]},"#eecc44":{"lch":[82.7971553193909102,83.7217279628800242,69.2828434677537786],"luv":[82.7971553193909102,29.6169744667019792,78.3081257375581],"rgb":[0.933333333333333348,0.8,0.266666666666666663],"xyz":[0.578943054712128924,0.617816286197961473,0.143446693770885897],"hpluv":[69.2828434677537786,206.594355258371763,82.7971553193909102],"hsluv":[69.2828434677537786,89.1900904304584685,82.7971553193909102]},"#eecc55":{"lch":[82.9241214704336471,78.5673404382155098,68.3706518767947387],"luv":[82.9241214704336471,28.9599810639926183,73.0352413585910085],"rgb":[0.933333333333333348,0.8,0.333333333333333315],"xyz":[0.584905468751490853,0.620201251813706222,0.174848741044859812],"hpluv":[68.3706518767947387,195.532369916851508,82.9241214704336471],"hsluv":[68.3706518767947387,83.2339277722755497,82.9241214704336471]},"#eecc66":{"lch":[83.0851700146488241,72.2150018940459688,67.0599726095305186],"luv":[83.0851700146488241,28.1470538355007811,66.503758231685552],"rgb":[0.933333333333333348,0.8,0.4],"xyz":[0.592490464524999094,0.623235250123109541,0.214796385452003746],"hpluv":[67.0599726095305186,181.688085793908328,83.0851700146488241],"hsluv":[67.0599726095305186,75.8779818086204898,83.0851700146488241]},"#eecc77":{"lch":[83.2822165713090925,64.7250307453925586,65.1677162202921778],"luv":[83.2822165713090925,27.1821511319325673,58.740618526133936],"rgb":[0.933333333333333348,0.8,0.466666666666666674],"xyz":[0.601804477545200944,0.626960855331190392,0.263850187358401655],"hpluv":[65.1677162202921778,165.044758034407693,83.2822165713090925],"hsluv":[65.1677162202921778,67.1675472191497533,83.2822165713090925]},"#eecc88":{"lch":[83.5168798492942699,56.2182636624862511,62.3679934299132839],"luv":[83.5168798492942699,26.0735255024375405,49.8062690541919793],"rgb":[0.933333333333333348,0.8,0.533333333333333326],"xyz":[0.612944894647144856,0.631417022171967934,0.322523050761973851],"hpluv":[62.3679934299132839,145.689263900370548,83.5168798492942699],"hsluv":[62.3679934299132839,57.1887031148042198,83.5168798492942699]},"#eecc99":{"lch":[83.79051243806407,46.9027423702446598,58.0311593919332083],"luv":[83.79051243806407,24.8330316313984234,39.7892923013655633],"rgb":[0.933333333333333348,0.8,0.6],"xyz":[0.6260018587562175,0.636639807815597147,0.39128972840309173],"hpluv":[58.0311593919332083,123.89218615802821,83.79051243806407],"hsluv":[58.0311593919332083,56.9799526918745158,83.79051243806407]},"#eeccaa":{"lch":[84.1042222244633,37.1556922719042646,50.8162292091241454],"luv":[84.1042222244633,23.475329457535171,28.8002495660129298],"rgb":[0.933333333333333348,0.8,0.66666666666666663],"xyz":[0.641059551721470111,0.642662885001698214,0.470593578020090331],"hpluv":[50.8162292091241454,100.353156070069275,84.1042222244633],"hsluv":[50.8162292091241454,57.1375361174420533,84.1042222244633]},"#eeccbb":{"lch":[84.4588885299527,27.7950211383377486,37.6158086991229084],"luv":[84.4588885299527,22.0170273242058485,16.9650731765535063],"rgb":[0.933333333333333348,0.8,0.733333333333333282],"xyz":[0.658197143828806674,0.649517921844633,0.560851563118732077],"hpluv":[37.6158086991229084,77.0182985337263517,84.4588885299527],"hsluv":[37.6158086991229084,57.2612530554736736,84.4588885299527]},"#eecccc":{"lch":[84.8551753311588897,20.9471233587290264,12.1770506300631585],"luv":[84.8551753311588897,20.4758227261490333,4.41844550641173317],"rgb":[0.933333333333333348,0.8,0.8],"xyz":[0.677489519272528429,0.65723487202212183,0.662458073789002233],"hpluv":[12.1770506300631585,59.764130158742411,84.8551753311588897],"hsluv":[12.1770506300631585,57.3329985994000637,84.8551753311588897]},"#eeccdd":{"lch":[85.2935429882433596,20.7797326136980232,335.241604291037675],"luv":[85.2935429882433596,18.8696973425293919,-8.70240252448279],"rgb":[0.933333333333333348,0.8,0.866666666666666696],"xyz":[0.699007844823162,0.665842202242375336,0.775787921689008231],"hpluv":[335.241604291037675,61.2821093808529582,85.2935429882433596],"hsluv":[335.241604291037675,57.3323512744098664,85.2935429882433596]},"#eeccee":{"lch":[85.7742593547863805,28.14328338963319,307.715012949251047],"luv":[85.7742593547863805,17.2162128855465397,-22.2631177921859056],"rgb":[0.933333333333333348,0.8,0.933333333333333348],"xyz":[0.722820025089336737,0.675367074348845353,0.901198737757531454],"hpluv":[307.715012949251047,86.153290074940827,85.7742593547863805],"hsluv":[307.715012949251047,57.2362127773837557,85.7742593547863805]},"#eeccff":{"lch":[86.2974107975625344,39.333162863939684,293.258584701896098],"luv":[86.2974107975625344,15.5319389668875889,-36.1366375415599919],"rgb":[0.933333333333333348,0.8,1],"xyz":[0.748991073499168158,0.685835493712778077,1.03903292604931341],"hpluv":[293.258584701896098,125.558261528980708,86.2974107975625344],"hsluv":[293.258584701896098,99.9999999999940314,86.2974107975625344]},"#775500":{"lch":[38.5848153490983421,48.2339285723334328,54.8056311564330656],"luv":[38.5848153490983421,27.7997213245256276,39.4168410682499868],"rgb":[0.466666666666666674,0.333333333333333315,0],"xyz":[0.108559363708637752,0.104193726002765275,0.0143939104369204193],"hpluv":[54.8056311564330656,158.626424871442595,38.5848153490983421],"hsluv":[54.8056311564330656,100.000000000002302,38.5848153490983421]},"#775511":{"lch":[38.6553893217116595,45.9150245993572952,53.4685955296553956],"luv":[38.6553893217116595,27.3315290852913257,36.8941323494598521],"rgb":[0.466666666666666674,0.333333333333333315,0.0666666666666666657],"xyz":[0.10957102920827487,0.104598392202620127,0.0197220154016760491],"hpluv":[53.4685955296553956,150.724584795248319,38.6553893217116595],"hsluv":[53.4685955296553956,93.8009130268131344,38.6553893217116595]},"#775522":{"lch":[38.7857346943923531,41.8305053308362176,50.7011784026830412],"luv":[38.7857346943923531,26.4939762066725,32.3706719268134577],"rgb":[0.466666666666666674,0.333333333333333315,0.133333333333333331],"xyz":[0.111446387346751899,0.105348535458010942,0.0295989015976552486],"hpluv":[50.7011784026830412,136.854920013655288,38.7857346943923531],"hsluv":[50.7011784026830412,82.7342982429400138,38.7857346943923531]},"#775533":{"lch":[38.9990050188249739,35.7224202133018096,45.1472123185964946],"luv":[38.9990050188249739,25.1945818654867857,25.3243825298663161],"rgb":[0.466666666666666674,0.333333333333333315,0.2],"xyz":[0.114534138079209633,0.106583635750994055,0.0458610554552663918],"hpluv":[45.1472123185964946,116.232257903435652,38.9990050188249739],"hsluv":[45.1472123185964946,65.6272728324870656,38.9990050188249739]},"#775544":{"lch":[39.3040305977305735,28.372964966311546,34.1730058033032336],"luv":[39.3040305977305735,23.4742392428959334,15.9369141601135258],"rgb":[0.466666666666666674,0.333333333333333315,0.266666666666666663],"xyz":[0.118992133323428506,0.108366833848681635,0.0693398304081530303],"hpluv":[34.1730058033032336,91.6024225041024,39.3040305977305735],"hsluv":[34.1730058033032336,43.1049791856067799,39.3040305977305735]},"#775555":{"lch":[39.7068052905653701,21.9117916496410494,12.1770506300624941],"luv":[39.7068052905653701,21.4187864245998618,4.62192615633957704],"rgb":[0.466666666666666674,0.333333333333333315,0.333333333333333315],"xyz":[0.124954547362790505,0.110751799464426468,0.100741877682126946],"hpluv":[12.1770506300624941,70.0248633547080601,39.7068052905653701],"hsluv":[12.1770506300624941,16.4089959502104463,39.7068052905653701]},"#775566":{"lch":[40.21091767922141,20.7753835118276839,337.09176723456028],"luv":[40.21091767922141,19.1368182791551824,-8.08694912894311],"rgb":[0.466666666666666674,0.333333333333333315,0.4],"xyz":[0.132539543136298676,0.113785797773829786,0.140689522089270908],"hpluv":[337.09176723456028,65.5608222190156482,40.21091767922141],"hsluv":[337.09176723456028,22.8015335286909036,40.21091767922141]},"#775577":{"lch":[40.8178321801082404,27.3616881241227183,307.715012949246557],"luv":[40.8178321801082404,16.7380842217685313,-21.6448264854847388],"rgb":[0.466666666666666674,0.333333333333333315,0.466666666666666674],"xyz":[0.141853556156500582,0.117511402981910595,0.189743323995668817],"hpluv":[307.715012949246557,85.0613515767839,40.8178321801082404],"hsluv":[307.715012949246557,29.4286369924042717,40.8178321801082404]},"#775588":{"lch":[41.5271394874135922,38.3484586217177892,291.922773984013077],"luv":[41.5271394874135922,14.317648223710199,-35.5754020076188269],"rgb":[0.466666666666666674,0.333333333333333315,0.533333333333333326],"xyz":[0.152993973258444438,0.121967569822688193,0.248416187399240984],"hpluv":[291.922773984013077,117.180466459805771,41.5271394874135922],"hsluv":[291.922773984013077,36.0000576829853429,41.5271394874135922]},"#775599":{"lch":[42.336815252734,50.9328741768069335,283.566916489070877],"luv":[42.336815252734,11.9478768110398388,-49.5116744982298442],"rgb":[0.466666666666666674,0.333333333333333315,0.6],"xyz":[0.166050937367517137,0.127190355466317351,0.317182865040358863],"hpluv":[283.566916489070877,152.657914615048412,42.336815252734],"hsluv":[283.566916489070877,42.2975255710275704,42.336815252734]},"#7755aa":{"lch":[43.2434937800222059,63.9392804809027098,278.705184193400783],"luv":[43.2434937800222059,9.67722671121172517,-63.202712533524668],"rgb":[0.466666666666666674,0.333333333333333315,0.66666666666666663],"xyz":[0.181108630332769693,0.133213432652418445,0.396486714657357464],"hpluv":[278.705184193400783,187.623095354238075,43.2434937800222059],"hsluv":[278.705184193400783,48.1780536314011272,43.2434937800222059]},"#7755bb":{"lch":[44.2427493107278096,76.8690732738289171,275.624120681329657],"luv":[44.2427493107278096,7.53331271169703509,-76.4990432983646116],"rgb":[0.466666666666666674,0.333333333333333315,0.733333333333333282],"xyz":[0.198246222440106312,0.140068469495353204,0.486744699755999211],"hpluv":[275.624120681329657,220.469676556121556,44.2427493107278096],"hsluv":[275.624120681329657,58.1137757976744496,44.2427493107278096]},"#7755cc":{"lch":[45.3293721892173949,89.4999308488430785,273.541003165926895],"luv":[45.3293721892173949,5.52776894932058127,-89.3290624175056536],"rgb":[0.466666666666666674,0.333333333333333315,0.8],"xyz":[0.217538597883828067,0.147785419672842,0.588351210426269366],"hpluv":[273.541003165926895,250.543028147628775,45.3293721892173949],"hsluv":[273.541003165926895,68.560007412736141,45.3293721892173949]},"#7755dd":{"lch":[46.4976270234735622,101.740884988783861,272.062259876532949],"luv":[46.4976270234735622,3.66119191329505167,-101.674988822595736],"rgb":[0.466666666666666674,0.333333333333333315,0.866666666666666696],"xyz":[0.23905692343446161,0.15639274989309554,0.701681058326275364],"hpluv":[272.062259876532949,277.654072578046794,46.4976270234735622],"hsluv":[272.062259876532949,78.9623412233913911,46.4976270234735622]},"#7755ee":{"lch":[47.7414825998049253,113.569026574645434,270.972372145675877],"luv":[47.7414825998049253,1.92729827623402139,-113.552672000560818],"rgb":[0.466666666666666674,0.333333333333333315,0.933333333333333348],"xyz":[0.26286910370063632,0.165917621999565584,0.827091874394798587],"hpluv":[270.972372145675877,301.858443342198598,47.7414825998049253],"hsluv":[270.972372145675877,89.4067229175139175,47.7414825998049253]},"#7755ff":{"lch":[49.0548071408334749,124.996939079083958,270.144864217432826],"luv":[49.0548071408334749,0.31603661949764611,-124.996539552082652],"rgb":[0.466666666666666674,0.333333333333333315,1],"xyz":[0.289040152110467741,0.17638604136349828,0.964926062686580432],"hpluv":[270.144864217432826,323.338286172745597,49.0548071408334749],"hsluv":[270.144864217432826,99.9999999999992184,49.0548071408334749]},"#eedd00":{"lch":[86.9434330779808562,96.0018853881048528,78.7633058197047831],"luv":[86.9434330779808562,18.7071720605167293,94.1615829920517],"rgb":[0.933333333333333348,0.866666666666666696,0],"xyz":[0.611144275644513346,0.69891115944639659,0.102712103982044597],"hpluv":[78.7633058197047831,323.365375109368927,86.9434330779808562],"hsluv":[78.7633058197047831,100.000000000002331,86.9434330779808562]},"#eedd11":{"lch":[86.9632971622836,95.1251800329902153,78.7103442402005555],"luv":[86.9632971622836,18.6225708681111755,93.2845095960255293],"rgb":[0.933333333333333348,0.866666666666666696,0.0666666666666666657],"xyz":[0.612155941144150506,0.699315825646251499,0.108040208946800234],"hpluv":[78.7103442402005555,320.953864246165836,86.9632971622836],"hsluv":[78.7103442402005555,99.0572185708442134,86.9632971622836]},"#eedd22":{"lch":[87.0000996195567,93.508678235103929,78.6100630695382421],"luv":[87.0000996195567,18.466577094457584,91.6671066178629559],"rgb":[0.933333333333333348,0.866666666666666696,0.133333333333333331],"xyz":[0.614031299282627452,0.700065968901642299,0.117917095142779427],"hpluv":[78.6100630695382421,316.490280961531141,87.0000996195567],"hsluv":[78.6100630695382421,97.3195837272491104,87.0000996195567]},"#eedd33":{"lch":[87.0606371109171704,90.8714304533391157,78.438725785200063],"luv":[87.0606371109171704,18.2120693177914781,89.0277339024194561],"rgb":[0.933333333333333348,0.866666666666666696,0.2],"xyz":[0.617119050015085269,0.701301069194625426,0.134179249000390577],"hpluv":[78.438725785200063,309.159510866930361,87.0606371109171704],"hsluv":[78.438725785200063,94.4866487647953335,87.0606371109171704]},"#eedd44":{"lch":[87.1479139339873399,87.1163282896156375,78.1766823729436737],"luv":[87.1479139339873399,17.8496481580416315,85.2680755927926839],"rgb":[0.933333333333333348,0.866666666666666696,0.266666666666666663],"xyz":[0.621577045259304128,0.703084267292313,0.157658023953277215],"hpluv":[78.1766823729436737,298.614243514229941,87.1479139339873399],"hsluv":[78.1766823729436737,90.4569971269957449,87.1479139339873399]},"#eedd55":{"lch":[87.2644132886328,82.1887294441124823,77.7961103956051119],"luv":[87.2644132886328,17.3739699699556027,80.3313912186301],"rgb":[0.933333333333333348,0.866666666666666696,0.333333333333333315],"xyz":[0.627539459298666058,0.705469232908057742,0.189060071227251103],"hpluv":[77.7961103956051119,284.577035202400168,87.2644132886328],"hsluv":[77.7961103956051119,85.1762064326895114,87.2644132886328]},"#eedd66":{"lch":[87.4122373516825775,76.0722975624531,77.2543738936701],"luv":[87.4122373516825775,16.7832968217641607,74.1978126646801428],"rgb":[0.933333333333333348,0.866666666666666696,0.4],"xyz":[0.635124455072174299,0.70850323121746106,0.229007715634395093],"hpluv":[77.2543738936701,266.820521177772889,87.4122373516825775],"hsluv":[77.2543738936701,78.6319742502837187,87.4122373516825775]},"#eedd77":{"lch":[87.5931821049200323,68.7867162946957,76.4818073814204666],"luv":[87.5931821049200323,16.0791769624109904,66.8810317415814524],"rgb":[0.933333333333333348,0.866666666666666696,0.466666666666666674],"xyz":[0.644438468092376149,0.712228836425541911,0.278061517540793],"hpluv":[76.4818073814204666,245.153905791490757,87.5931821049200323],"hsluv":[76.4818073814204666,70.850552214552053,87.5931821049200323]},"#eedd88":{"lch":[87.8087818591101694,60.3863988515096,75.3563176494847],"luv":[87.8087818591101694,15.266108392374667,58.4248500280990655],"rgb":[0.933333333333333348,0.866666666666666696,0.533333333333333326],"xyz":[0.65557888519432006,0.716685003266319454,0.336734380944365141],"hpluv":[75.3563176494847,219.413652035392374,87.8087818591101694],"hsluv":[75.3563176494847,61.8928475378351,87.8087818591101694]},"#eedd99":{"lch":[88.0603378936253165,50.9615259485641658,73.6438422487017164],"luv":[88.0603378936253165,14.3511385044238935,48.8990996914362483],"rgb":[0.933333333333333348,0.866666666666666696,0.6],"xyz":[0.668635849303392704,0.721907788909948667,0.405501058585483076],"hpluv":[73.6438422487017164,189.463858183723431,88.0603378936253165],"hsluv":[73.6438422487017164,51.8496821371243328,88.0603378936253165]},"#eeddaa":{"lch":[88.3489381850503719,40.6474355343677374,70.8361013393810595],"luv":[88.3489381850503719,13.3433963411670824,38.3948927541556],"rgb":[0.933333333333333348,0.866666666666666696,0.66666666666666663],"xyz":[0.683693542268645316,0.727930866096049733,0.484804908202481677],"hpluv":[70.8361013393810595,155.230940371192503,88.3489381850503719],"hsluv":[70.8361013393810595,42.897511243529749,88.3489381850503719]},"#eeddbb":{"lch":[88.6754719765582422,29.6681200622416164,65.6052069824857256],"luv":[88.6754719765582422,12.2535763784239329,27.0193858917206811],"rgb":[0.933333333333333348,0.866666666666666696,0.733333333333333282],"xyz":[0.700831134375981879,0.734785902938984492,0.575062893301123368],"hpluv":[65.6052069824857256,116.881954111652547,88.6754719765582422],"hsluv":[65.6052069824857256,42.5880034653653823,88.6754719765582422]},"#eeddcc":{"lch":[89.0406413623298,18.5684245799280596,53.3136761054906927],"luv":[89.0406413623298,11.093403559257359,14.8903589228712931],"rgb":[0.933333333333333348,0.866666666666666696,0.8],"xyz":[0.720123509819703633,0.742502853116473349,0.676669403971393524],"hpluv":[53.3136761054906927,75.8171941810365837,89.0406413623298],"hsluv":[53.3136761054906927,42.1389745374101,89.0406413623298]},"#eedddd":{"lch":[89.4449712115231677,10.1024117660870978,12.1770506300652031],"luv":[89.4449712115231677,9.87511215198720294,2.13093488339032255],"rgb":[0.933333333333333348,0.866666666666666696,0.866666666666666696],"xyz":[0.741641835370337232,0.751110183336726855,0.789999251871399522],"hpluv":[12.1770506300652031,42.9711785560074802,89.4449712115231677],"hsluv":[12.1770506300652031,41.5103310668104939,89.4449712115231677]},"#eeddee":{"lch":[89.8888182614484919,14.0763196099440542,307.715012949260654],"luv":[89.8888182614484919,8.61096808409750203,-11.1352594229299271],"rgb":[0.933333333333333348,0.866666666666666696,0.933333333333333348],"xyz":[0.765454015636511942,0.760635055443196872,0.915410067939922745],"hpluv":[307.715012949260654,62.7286135322124423,89.8888182614484919],"hsluv":[307.715012949260654,40.6526002298302203,89.8888182614484919]},"#eeddff":{"lch":[90.3723799019863776,25.8444533047225526,286.436741223308786],"luv":[90.3723799019863776,7.31285770395748802,-24.7882609075678033],"rgb":[0.933333333333333348,0.866666666666666696,1],"xyz":[0.791625064046343363,0.771103474807129596,1.05324425623170459],"hpluv":[286.436741223308786,121.429851146909542,90.3723799019863776],"hsluv":[286.436741223308786,99.9999999999912461,90.3723799019863776]},"#776600":{"lch":[43.3967364031710616,48.7618731822316747,71.5665709091534836],"luv":[43.3967364031710616,15.4186312136361749,46.2599836547520695],"rgb":[0.466666666666666674,0.4,0],"xyz":[0.123587421414484214,0.134249841414458615,0.0194032630055357667],"hpluv":[71.5665709091534836,142.581321953300886,43.3967364031710616],"hsluv":[71.5665709091534836,100.000000000002203,43.3967364031710616]},"#776611":{"lch":[43.4563559440565683,46.5521225716425278,71.0105555334865812],"luv":[43.4563559440565683,15.1477793781447385,44.0186880294754204],"rgb":[0.466666666666666674,0.4,0.0666666666666666657],"xyz":[0.124599086914121332,0.134654507614313468,0.0247313679702914],"hpluv":[71.0105555334865812,135.933189968578517,43.4563559440565683],"hsluv":[71.0105555334865812,95.1446041192036,43.4563559440565683]},"#776622":{"lch":[43.5665595032511135,42.5748985848782695,69.8598868578742582],"luv":[43.5665595032511135,14.6592646006394602,39.9715892964128727],"rgb":[0.466666666666666674,0.4,0.133333333333333331],"xyz":[0.126474445052598361,0.135404650869704296,0.0346082541662705925],"hpluv":[69.8598868578742582,124.005139157578384,43.5665595032511135],"hsluv":[69.8598868578742582,86.4059851293991699,43.5665595032511135]},"#776633":{"lch":[43.7471247164395862,36.3538810550032,67.535659471968259],"luv":[43.7471247164395862,13.8911218179866047,33.5952586297408544],"rgb":[0.466666666666666674,0.4,0.2],"xyz":[0.129562195785056095,0.136639751162687395,0.0508704080238817358],"hpluv":[67.535659471968259,105.448545621014873,43.7471247164395862],"hsluv":[67.535659471968259,72.7162107178341,43.7471247164395862]},"#776644":{"lch":[44.0059094002531381,28.0798421405657628,62.7556004259007807],"luv":[44.0059094002531381,12.8545871201011757,24.9647175952547435],"rgb":[0.466666666666666674,0.4,0.266666666666666663],"xyz":[0.134020191029274982,0.138422949260375,0.0743491829767683743],"hpluv":[62.7556004259007807,80.969785387169,44.0059094002531381],"hsluv":[62.7556004259007807,54.3487361937933,44.0059094002531381]},"#776655":{"lch":[44.348573895236818,18.4503377813959695,51.0995937541716287],"luv":[44.348573895236818,11.5862323365157813,14.3587668165439446],"rgb":[0.466666666666666674,0.4,0.333333333333333315],"xyz":[0.139982605068636967,0.140807914876119822,0.10575123025074229],"hpluv":[51.0995937541716287,52.7914984191523473,44.348573895236818],"hsluv":[51.0995937541716287,32.0544530960382303,44.348573895236818]},"#776666":{"lch":[44.7789425039584543,10.3722772339139464,12.177050630063178],"luv":[44.7789425039584543,10.1389057710203723,2.18785849257654696],"rgb":[0.466666666666666674,0.4,0.4],"xyz":[0.147567600842145152,0.143841913185523113,0.145698874657886251],"hpluv":[12.177050630063178,29.3927086392471182,44.7789425039584543],"hsluv":[12.177050630063178,6.88762268030489189,44.7789425039584543]},"#776677":{"lch":[45.2992151274866899,14.0123007519981453,307.715012949251729],"luv":[45.2992151274866899,8.57180555029232849,-11.0846164558105222],"rgb":[0.466666666666666674,0.4,0.466666666666666674],"xyz":[0.156881613862347058,0.147567518393603936,0.194752676564284161],"hpluv":[307.715012949251729,39.2516664249610088,45.2992151274866899],"hsluv":[307.715012949251729,13.5798811229143528,45.2992151274866899]},"#776688":{"lch":[45.9101336093725934,25.9566305949561666,285.511882327844],"luv":[45.9101336093725934,6.94179491604529719,-25.0111606125461954],"rgb":[0.466666666666666674,0.4,0.533333333333333326],"xyz":[0.168022030964290886,0.152023685234381534,0.253425539967856328],"hpluv":[285.511882327844,71.7429261821633304,45.9101336093725934],"hsluv":[285.511882327844,20.4210179876919788,45.9101336093725934]},"#776699":{"lch":[46.6111419677041781,39.5636276789354753,277.694853057332239],"luv":[46.6111419677041781,5.29745753469698322,-39.2073663842078446],"rgb":[0.466666666666666674,0.4,0.6],"xyz":[0.181078995073363613,0.157246470878010691,0.322192217608974207],"hpluv":[277.694853057332239,107.707436484347127,46.6111419677041781],"hsluv":[277.694853057332239,30.3115853005661187,46.6111419677041781]},"#7766aa":{"lch":[47.4005539940279945,53.5010996637438936,273.94010537559177],"luv":[47.4005539940279945,3.67625443841083355,-53.3746458398921959],"rgb":[0.466666666666666674,0.4,0.66666666666666663],"xyz":[0.196136688038616142,0.163269548064111786,0.401496067225972808],"hpluv":[273.94010537559177,143.224929654224553,47.4005539940279945],"hsluv":[273.94010537559177,41.7476492103462178,47.4005539940279945]},"#7766bb":{"lch":[48.2757296522395052,67.3356727079262356,271.790784098674919],"luv":[48.2757296522395052,2.10423911354751,-67.3027859511178],"rgb":[0.466666666666666674,0.4,0.733333333333333282],"xyz":[0.213274280145952788,0.170124584907046544,0.491754052324614555],"hpluv":[271.790784098674919,176.992833999799871,48.2757296522395052],"hsluv":[271.790784098674919,53.26174830093764,48.2757296522395052]},"#7766cc":{"lch":[49.2332558923506838,80.8618894300095263,270.423298283194697],"luv":[49.2332558923506838,0.597398061184884921,-80.8596826468393886],"rgb":[0.466666666666666674,0.4,0.8],"xyz":[0.232566655589674542,0.177841535084535346,0.59336056299488471],"hpluv":[270.423298283194697,208.412927467485218,49.2332558923506838],"hsluv":[270.423298283194697,64.812294986267446,49.2332558923506838]},"#7766dd":{"lch":[50.2691251722936698,93.9789905273776327,269.490145829531343],"luv":[50.2691251722936698,-0.836273601566472236,-93.9752696564806769],"rgb":[0.466666666666666674,0.4,0.866666666666666696],"xyz":[0.254084981140308086,0.18644886530478888,0.706690410894890708],"hpluv":[269.490145829531343,237.229544488008315,50.2691251722936698],"hsluv":[269.490145829531343,76.411365903071939,50.2691251722936698]},"#7766ee":{"lch":[51.378904811117593,106.647241299318011,268.82087794331261],"luv":[51.378904811117593,-2.19459861633770803,-106.624658562961542],"rgb":[0.466666666666666674,0.4,0.933333333333333348],"xyz":[0.277897161406482796,0.195973737411258925,0.832101226963413931],"hpluv":[268.82087794331261,263.392927722023558,51.378904811117593],"hsluv":[268.82087794331261,88.1124589032604177,51.378904811117593]},"#7766ff":{"lch":[52.5578914047646748,118.864223743766644,268.322642340607558],"luv":[52.5578914047646748,-3.47930230784918848,-118.81329109850806],"rgb":[0.466666666666666674,0.4,1],"xyz":[0.304068209816314217,0.206442156775191621,0.969935415255195776],"hpluv":[268.322642340607558,286.980608281330717,52.5578914047646748],"hsluv":[268.322642340607558,99.9999999999990621,52.5578914047646748]},"#eeee00":{"lch":[91.3819857871042416,100.73955854358779,85.8743202181747591],"luv":[91.3819857871042416,7.24765584469138,100.478505862268193],"rgb":[0.933333333333333348,0.933333333333333348,0],"xyz":[0.658323051985028163,0.793268712127427555,0.118438362762215782],"hpluv":[85.8743202181747591,533.074105620447313,91.3819857871042416],"hsluv":[85.8743202181747591,100.000000000002302,91.3819857871042416]},"#eeee11":{"lch":[91.4002420948697,99.9206079899190485,85.8743202181747449],"luv":[91.4002420948697,7.18873686735402107,99.6616775060856526],"rgb":[0.933333333333333348,0.933333333333333348,0.0666666666666666657],"xyz":[0.659334717484665322,0.793673378327282464,0.123766467726971419],"hpluv":[85.8743202181747449,529.940172906192515,91.4002420948697],"hsluv":[85.8743202181747449,99.1672499526241182,91.4002420948697]},"#eeee22":{"lch":[91.4340680155716,98.4094794247264559,85.8743202181747],"luv":[91.4340680155716,7.08001949817026599,98.1544648222952105],"rgb":[0.933333333333333348,0.933333333333333348,0.133333333333333331],"xyz":[0.661210075623142268,0.794423521582673264,0.133643353922950597],"hpluv":[85.8743202181747,524.128135432551403,91.4340680155716],"hsluv":[85.8743202181747,97.631382664670781,91.4340680155716]},"#eeee33":{"lch":[91.4897155548310224,95.9410009888260475,85.874320218174617],"luv":[91.4897155548310224,6.90242608380469225,95.6923831080380864],"rgb":[0.933333333333333348,0.933333333333333348,0.2],"xyz":[0.664297826355600085,0.795658621875656391,0.149905507780561748],"hpluv":[85.874320218174617,514.550466890897383,91.4897155548310224],"hsluv":[85.874320218174617,95.1245282264191,91.4897155548310224]},"#eeee44":{"lch":[91.569956182858661,92.4193611961338917,85.8743202181745],"luv":[91.569956182858661,6.64906351605686385,92.1798691594911],"rgb":[0.933333333333333348,0.933333333333333348,0.266666666666666663],"xyz":[0.668755821599819,0.797441819973344,0.173384282733448386],"hpluv":[85.8743202181745,500.701064757674544,91.569956182858661],"hsluv":[85.8743202181745,91.5525623856835438,91.569956182858661]},"#eeee55":{"lch":[91.6770884747666912,87.7855710128071536,85.8743202181743612],"luv":[91.6770884747666912,6.31568785915728625,87.5580868047623682],"rgb":[0.933333333333333348,0.933333333333333348,0.333333333333333315],"xyz":[0.674718235639180874,0.799826785589088707,0.204786330007422301],"hpluv":[85.8743202181743612,482.129233036801622,91.6770884747666912],"hsluv":[85.8743202181743612,86.8606098102410584,91.6770884747666912]},"#eeee66":{"lch":[91.8130678710263197,82.0131153940214261,85.8743202181741481],"luv":[91.8130678710263197,5.90039150181238092,81.8005897091115912],"rgb":[0.933333333333333348,0.933333333333333348,0.4],"xyz":[0.682303231412689115,0.802860783898492,0.244733974414566263],"hpluv":[85.8743202181741481,458.402522986492727,91.8130678710263197],"hsluv":[85.8743202181741481,81.0287908474737435,91.8130678710263197]},"#eeee77":{"lch":[91.9795762822891163,75.1051560234190703,85.8743202181738923],"luv":[91.9795762822891163,5.40340190972927914,74.9105313631138],"rgb":[0.933333333333333348,0.933333333333333348,0.466666666666666674],"xyz":[0.691617244432891,0.806586389106572876,0.2937877763209642],"hpluv":[85.8743202181738923,429.072804464814112,91.9795762822891163],"hsluv":[85.8743202181738923,74.0694118243717838,91.9795762822891163]},"#eeee88":{"lch":[92.1780636375363542,67.0918310376028444,85.8743202181734233],"luv":[92.1780636375363542,4.82688735568056,66.9179718045445497],"rgb":[0.933333333333333348,0.933333333333333348,0.533333333333333326],"xyz":[0.702757661534834877,0.811042555947350419,0.35246063972453634],"hpluv":[85.8743202181734233,393.637417052406249,92.1780636375363542],"hsluv":[85.8743202181734233,66.0241185279663085,92.1780636375363542]},"#eeee99":{"lch":[92.4097746137617264,58.0271343519240759,85.8743202181728549],"luv":[92.4097746137617264,4.17473240419888647,57.8767650309654],"rgb":[0.933333333333333348,0.933333333333333348,0.6],"xyz":[0.715814625643907521,0.816265341590979632,0.421227317365654219],"hpluv":[85.8743202181728549,351.489405737917593,92.4097746137617264],"hsluv":[85.8743202181728549,56.9604957584853295,92.4097746137617264]},"#eeeeaa":{"lch":[92.6757669457712,47.9852530272659195,85.8743202181718885],"luv":[92.6757669457712,3.45227440531043239,47.8609058577161903],"rgb":[0.933333333333333348,0.933333333333333348,0.66666666666666663],"xyz":[0.730872318609160132,0.822288418777080699,0.500531166982652875],"hpluv":[85.8743202181718885,301.850049763156903,92.6757669457712],"hsluv":[85.8743202181718885,46.9680087594427178,92.6757669457712]},"#eeeebb":{"lch":[92.9769247593952741,37.0564456712956627,85.8743202181703253],"luv":[92.9769247593952741,2.66600696822725,36.9604189997225347],"rgb":[0.933333333333333348,0.933333333333333348,0.733333333333333282],"xyz":[0.748009910716496695,0.829143455620015457,0.590789152081294566],"hpluv":[85.8743202181703253,243.673832720465015,92.9769247593952741],"hsluv":[85.8743202181703253,36.1533987495139,92.9769247593952741]},"#eeeecc":{"lch":[93.3139689281547788,25.3426537884513579,85.8743202181670711],"luv":[93.3139689281547788,1.82326422217474082,25.2769817940640493],"rgb":[0.933333333333333348,0.933333333333333348,0.8],"xyz":[0.76730228616021845,0.836860405797504314,0.692395662751564722],"hpluv":[85.8743202181670711,175.509740066336235,93.3139689281547788],"hsluv":[85.8743202181670711,24.635760697738192,93.3139689281547788]},"#eeeedd":{"lch":[93.6874656794852143,12.9530841337210045,85.8743202181571377],"luv":[93.6874656794852143,0.931902991100789779,12.919518001474831],"rgb":[0.933333333333333348,0.933333333333333348,0.866666666666666696],"xyz":[0.788820611710852,0.84546773601775782,0.80572551065157072],"hpluv":[85.8743202181571377,95.2907564198152812,93.6874656794852143],"hsluv":[85.8743202181571377,12.5415797244653469,93.6874656794852143]},"#eeeeee":{"lch":[94.0978342288501466,4.90671076366048496e-12,0],"luv":[94.0978342288501466,4.6515081442594671e-12,1.56182025281704723e-12],"rgb":[0.933333333333333348,0.933333333333333348,0.933333333333333348],"xyz":[0.812632791977026758,0.854992608124227838,0.931136326720093943],"hpluv":[0,3.87295813278393312e-11,94.0978342288501466],"hsluv":[0,3.8714510065860851e-11,94.0978342288501466]},"#eeeeff":{"lch":[94.5453539438838391,13.4050739145486393,265.874320218197],"luv":[94.5453539438838391,-0.964421163933715353,-13.3703365130825738],"rgb":[0.933333333333333348,0.933333333333333348,1],"xyz":[0.838803840386858179,0.865461027488160561,1.06897051501187579],"hpluv":[265.874320218197,114.885858328026472,94.5453539438838391],"hsluv":[265.874320218197,99.999999999981938,94.5453539438838391]},"#777700":{"lch":[48.4055282063088868,53.3622847060179737,85.8743202181747],"luv":[48.4055282063088868,3.83912219020021839,53.2240036999738706],"rgb":[0.466666666666666674,0.466666666666666674,0],"xyz":[0.142041159467901856,0.171157317521294372,0.0255545090233414707],"hpluv":[85.8743202181747,139.887458074797621,48.4055282063088868],"hsluv":[85.8743202181747,100.000000000002331,48.4055282063088868]},"#777711":{"lch":[48.4562461221814829,51.3697569370731628,85.874320218174617],"luv":[48.4562461221814829,3.69577080233359201,51.2366392921178502],"rgb":[0.466666666666666674,0.466666666666666674,0.0666666666666666657],"xyz":[0.143052824967539,0.171561983721149225,0.0308826139880971],"hpluv":[85.874320218174617,134.523163178361983,48.4562461221814829],"hsluv":[85.874320218174617,96.1652781669932324,48.4562461221814829]},"#777722":{"lch":[48.5500530694338579,47.7524066126053768,85.8743202181744323],"luv":[48.5500530694338579,3.43552238949120969,47.6286628324468282],"rgb":[0.466666666666666674,0.466666666666666674,0.133333333333333331],"xyz":[0.144928183106016,0.172312126976540053,0.0407595001840763],"hpluv":[85.8743202181744323,124.808706278838557,48.5500530694338579],"hsluv":[85.8743202181744323,89.2207979160694293,48.5500530694338579]},"#777733":{"lch":[48.7039135074563063,42.0024110114446501,85.874320218174],"luv":[48.7039135074563063,3.02184190658892726,41.8935675523809934],"rgb":[0.466666666666666674,0.466666666666666674,0.2],"xyz":[0.148015933838473723,0.173547227269523152,0.0570216540416874432],"hpluv":[85.874320218174,109.433348296247431,48.7039135074563063],"hsluv":[85.874320218174,78.2295638238963704,48.7039135074563063]},"#777744":{"lch":[48.9247697387985312,34.1210359912247227,85.8743202181732528],"luv":[48.9247697387985312,2.45482042510454956,34.0326160292585],"rgb":[0.466666666666666674,0.466666666666666674,0.266666666666666663],"xyz":[0.152473929082692611,0.175330425367210746,0.0805004289945740747],"hpluv":[85.8743202181732528,88.497855114462908,48.9247697387985312],"hsluv":[85.8743202181732528,63.2636094274766378,48.9247697387985312]},"#777755":{"lch":[49.2178287935421537,24.2815247917763841,85.8743202181716327],"luv":[49.2178287935421537,1.74692184102758041,24.2186025669317253],"rgb":[0.466666666666666674,0.466666666666666674,0.333333333333333315],"xyz":[0.158436343122054624,0.177715390982955579,0.11190247626854799],"hpluv":[85.8743202181716327,62.6026663147617,49.2178287935421537],"hsluv":[85.8743202181716327,44.7521651878825324,49.2178287935421537]},"#777766":{"lch":[49.5868745078829676,12.7836483150604128,85.8743202181664742],"luv":[49.5868745078829676,0.919713018071489197,12.750521252385596],"rgb":[0.466666666666666674,0.466666666666666674,0.4],"xyz":[0.166021338895562781,0.18074938929235887,0.151850120675691952],"hpluv":[85.8743202181664742,32.7135296885410085,49.5868745078829676],"hsluv":[85.8743202181664742,23.385605928338574,49.5868745078829676]},"#777777":{"lch":[50.0344387925380687,2.67192546523751356e-12,0],"luv":[50.0344387925380687,2.52749706171116152e-12,8.66570421158112546e-13],"rgb":[0.466666666666666674,0.466666666666666674,0.466666666666666674],"xyz":[0.175335351915764714,0.184474994500439693,0.200903922582089861],"hpluv":[0,6.77633132918180515e-12,50.0344387925380687],"hsluv":[0,1.94020402484744743e-12,50.0344387925380687]},"#777788":{"lch":[50.5619220099523545,13.6772258441596737,265.874320218187563],"luv":[50.5619220099523545,-0.984000994856362388,-13.6417831984777926],"rgb":[0.466666666666666674,0.466666666666666674,0.533333333333333326],"xyz":[0.186475769017708515,0.188931161341217291,0.259576785985662029],"hpluv":[265.874320218187563,34.3252548472133,50.5619220099523545],"hsluv":[265.874320218187563,11.1797639211738336,50.5619220099523545]},"#777799":{"lch":[51.1696982290560669,27.8798810968622455,265.87432021818239],"luv":[51.1696982290560669,-2.00580373888746255,-27.8076342276045096],"rgb":[0.466666666666666674,0.466666666666666674,0.6],"xyz":[0.199532733126781242,0.194153946984846448,0.328343463626779908],"hpluv":[265.87432021818239,69.1380916549642563,51.1696982290560669],"hsluv":[265.87432021818239,22.9846011782403536,51.1696982290560669]},"#7777aa":{"lch":[51.8572203345112,42.2927406525888614,265.874320218180628],"luv":[51.8572203345112,-3.04272952363285398,-42.1831448442758443],"rgb":[0.466666666666666674,0.466666666666666674,0.66666666666666663],"xyz":[0.21459042609203377,0.200177024170947543,0.407647313243778564],"hpluv":[265.874320218180628,103.489412577951782,51.8572203345112],"hsluv":[265.874320218180628,35.2207148819814435,51.8572203345112]},"#7777bb":{"lch":[52.6231302285762439,56.6671214785474,265.874320218179832],"luv":[52.6231302285762439,-4.07688697591046,-56.5202764435038816],"rgb":[0.466666666666666674,0.466666666666666674,0.733333333333333282],"xyz":[0.231728018199370445,0.207032061013882301,0.497905298342420255],"hpluv":[265.874320218179832,136.645017565491173,52.6231302285762439],"hsluv":[265.874320218179832,47.751077300634,52.6231302285762439]},"#7777cc":{"lch":[53.4653742998309696,70.8221320427834513,265.874320218179378],"luv":[53.4653742998309696,-5.09526194727884452,-70.6386062488075],"rgb":[0.466666666666666674,0.466666666666666674,0.8],"xyz":[0.251020393643092143,0.214749011191371103,0.599511809012690411],"hpluv":[265.874320218179378,168.087613695837888,53.4653742998309696],"hsluv":[265.874320218179378,60.4968982098403671,53.4653742998309696]},"#7777dd":{"lch":[54.3813217092404102,84.6378263199215581,265.874320218179037],"luv":[54.3813217092404102,-6.08922498249284594,-84.4184990584042083],"rgb":[0.466666666666666674,0.466666666666666674,0.866666666666666696],"xyz":[0.272538719193725743,0.223356341411624637,0.712841656912696409],"hpluv":[265.874320218179037,197.494074150637061,54.3813217092404102],"hsluv":[265.874320218179037,73.4330970128385445,54.3813217092404102]},"#7777ee":{"lch":[55.3678819060931,98.0443353361264656,265.874320218178809],"luv":[55.3678819060931,-7.05374939408338086,-97.7902669542745713],"rgb":[0.466666666666666674,0.466666666666666674,0.933333333333333348],"xyz":[0.296350899459900452,0.232881213518094682,0.838252472981219632],"hpluv":[265.874320218178809,224.700440227144242,55.3678819060931],"hsluv":[265.874320218178809,86.5809092876847,55.3678819060931]},"#7777ff":{"lch":[56.4216176153771158,111.010032393554411,265.874320218178696],"luv":[56.4216176153771158,-7.98655981550332,-110.722365194803288],"rgb":[0.466666666666666674,0.466666666666666674,1],"xyz":[0.322521947869731873,0.243349632882027378,0.976086661273001477],"hpluv":[265.874320218178696,249.664056525023511,56.4216176153771158],"hsluv":[265.874320218178696,99.99999999999892,56.4216176153771158]},"#eeff00":{"lch":[95.8710857598618702,106.837421111995667,91.929871543819857],"luv":[95.8710857598618702,-3.59788306357601462,106.776822332015158],"rgb":[0.933333333333333348,1,0],"xyz":[0.710175424414702,0.896973456986776663,0.135722486905439893],"hpluv":[91.929871543819857,1221.941869030823,95.8710857598618702],"hsluv":[91.929871543819857,100.000000000002217,95.8710857598618702]},"#eeff11":{"lch":[95.8879066370154192,106.077593073364397,91.9648080695471748],"luv":[95.8879066370154192,-3.63693915095535747,106.015227330089402],"rgb":[0.933333333333333348,1,0.0666666666666666657],"xyz":[0.71118708991433921,0.897378123186631571,0.14105059187019553],"hpluv":[91.9648080695471748,1218.36968740939687,95.8879066370154192],"hsluv":[91.9648080695471748,99.9999999999846096,95.8879066370154192]},"#eeff22":{"lch":[95.9190746883988083,104.674935415410417,92.0306447189025221],"luv":[95.9190746883988083,-3.7090534526558554,104.609201443781629],"rgb":[0.933333333333333348,1,0.133333333333333331],"xyz":[0.713062448052816156,0.898128266442022372,0.150927478066174708],"hpluv":[92.0306447189025221,1211.72771901411761,95.9190746883988083],"hsluv":[92.0306447189025221,99.9999999999843254,95.9190746883988083]},"#eeff33":{"lch":[95.9703546560603,102.38192729680722,92.1421884898051076],"luv":[95.9703546560603,-3.826988551916231,102.31037677397255],"rgb":[0.933333333333333348,1,0.2],"xyz":[0.716150198785274,0.899363366735005498,0.167189631923785859],"hpluv":[92.1421884898051076,1200.73225066318059,95.9703546560603],"hsluv":[92.1421884898051076,99.9999999999843,95.9703546560603]},"#eeff44":{"lch":[96.0443082677326316,99.1069805797193482,92.3105231291127666],"luv":[96.0443082677326316,-3.99552836231266495,99.0264073504377],"rgb":[0.933333333333333348,1,0.266666666666666663],"xyz":[0.720608194029492832,0.901146564832693064,0.190668406876672497],"hpluv":[92.3105231291127666,1184.71704479359755,96.0443082677326316],"hsluv":[92.3105231291127666,99.999999999984,96.0443082677326316]},"#eeff55":{"lch":[96.1430663154878,94.7914212488158086,92.5502587525383831],"luv":[96.1430663154878,-4.21781218752730513,94.6975374691506744],"rgb":[0.933333333333333348,1,0.333333333333333315],"xyz":[0.726570608068854762,0.903531530448437814,0.222070454150646412],"hpluv":[92.5502587525383831,1163.01160371768833,96.1430663154878],"hsluv":[92.5502587525383831,99.9999999999832312,96.1430663154878]},"#eeff66":{"lch":[96.2684490440968261,89.4056432425818315,92.8821944044194083],"luv":[96.2684490440968261,-4.49554545672610839,89.2925479234763912],"rgb":[0.933333333333333348,1,0.4],"xyz":[0.734155603842363,0.906565528757841133,0.262018098557790347],"hpluv":[92.8821944044194083,1134.86447310352946,96.2684490440968261],"hsluv":[92.8821944044194083,99.9999999999826912,96.2684490440968261]},"#eeff77":{"lch":[96.4220309754045104,82.947030730659,93.3376121292550494],"luv":[96.4220309754045104,-4.82912482473711879,82.8063370791148827],"rgb":[0.933333333333333348,1,0.466666666666666674],"xyz":[0.743469616862564853,0.910291133965922,0.311071900464188311],"hpluv":[93.3376121292550494,1099.34916045901696,96.4220309754045104],"hsluv":[93.3376121292550494,99.9999999999824354,96.4220309754045104]},"#eeff88":{"lch":[96.6051797330544559,75.4384320618763553,93.966065888554354],"luv":[96.6051797330544559,-5.21774760700183382,75.2577713054536446],"rgb":[0.933333333333333348,1,0.533333333333333326],"xyz":[0.754610033964508764,0.914747300806699526,0.369744763867760451],"hpluv":[93.966065888554354,1055.22684316018899,96.6051797330544559],"hsluv":[93.966065888554354,99.9999999999810711,96.6051797330544559]},"#eeff99":{"lch":[96.8190810543072,66.9270103141668926,94.8508818247366],"luv":[96.8190810543072,-5.65953211211599072,66.6872881879637589],"rgb":[0.933333333333333348,1,0.6],"xyz":[0.767666998073581408,0.919970086450328739,0.43851144150887833],"hpluv":[94.8508818247366,1000.72847038880911,96.8190810543072],"hsluv":[94.8508818247366,99.9999999999804,96.8190810543072]},"#eeffaa":{"lch":[97.0647558759300182,57.4841926777339438,96.1432585072641785],"luv":[97.0647558759300182,-6.15165762861061438,57.1540857352402938],"rgb":[0.933333333333333348,1,0.66666666666666663],"xyz":[0.782724691038834,0.925993163636429806,0.517815291125877],"hpluv":[96.1432585072641785,933.191048721381,97.0647558759300182],"hsluv":[96.1432585072641785,99.9999999999786127,97.0647558759300182]},"#eeffbb":{"lch":[97.3430726615411857,47.2094061136043166,98.1473956779809242],"luv":[97.3430726615411857,-6.69052372550339935,46.7329104366258861],"rgb":[0.933333333333333348,1,0.733333333333333282],"xyz":[0.799862283146170583,0.932848200479364564,0.608073276224518677],"hpluv":[98.1473956779809242,848.432918810296883,97.3430726615411857],"hsluv":[98.1473956779809242,99.9999999999760689,97.3430726615411857]},"#eeffcc":{"lch":[97.6547568121604,36.2474903433398126,101.573139749476653],"luv":[97.6547568121604,-7.27192346215819718,35.5105573787715443],"rgb":[0.933333333333333348,1,0.8],"xyz":[0.819154658589892337,0.940565150656853421,0.709679786894788833],"hpluv":[101.573139749476653,739.717147432346792,97.6547568121604],"hsluv":[101.573139749476653,99.999999999972971,97.6547568121604]},"#eeffdd":{"lch":[98.0003982932414743,24.8675243497069864,108.50155795297276],"luv":[98.0003982932414743,-7.89122250686935445,23.5822470225029335],"rgb":[0.933333333333333348,1,0.866666666666666696],"xyz":[0.840672984140525936,0.949172480877106928,0.823009634794794831],"hpluv":[108.50155795297276,596.728870831386416,98.0003982932414743],"hsluv":[108.50155795297276,99.9999999999688072,98.0003982932414743]},"#eeffee":{"lch":[98.3804582036479,13.96608756186059,127.715012949221688],"luv":[98.3804582036479,-8.54353535492541205,11.0480588984987129],"rgb":[0.933333333333333348,1,0.933333333333333348],"xyz":[0.864485164406700646,0.958697352983577,0.948420450863318],"hpluv":[127.715012949221688,414.943064796341446,98.3804582036479],"hsluv":[127.715012949221688,99.9999999999608491,98.3804582036479]},"#eeffff":{"lch":[98.7952747621608438,9.43620053547767768,192.177050630058204],"luv":[98.7952747621608438,-9.22389036737693679,-1.99040876112424892],"rgb":[0.933333333333333348,1,1],"xyz":[0.890656212816532067,0.969165772347509669,1.0862546391551],"hpluv":[192.177050630058204,378.040319927501173,98.7952747621608438],"hsluv":[192.177050630058204,99.999999999948713,98.7952747621608438]},"#778800":{"lch":[53.5249548615687303,60.5938372915660253,96.5029793655947259],"luv":[53.5249548615687303,-6.86254771619202231,60.2039745910497572],"rgb":[0.466666666666666674,0.533333333333333326,0],"xyz":[0.164113529192872309,0.215302056971235917,0.0329119655983314136],"hpluv":[96.5029793655947259,143.651932639250902,53.5249548615687303],"hsluv":[96.5029793655947259,100.000000000002373,53.5249548615687303]},"#778811":{"lch":[53.5684856288310272,58.8481082257442409,96.7583563096261088],"luv":[53.5684856288310272,-6.9253766303469888,58.4391906196240143],"rgb":[0.466666666666666674,0.533333333333333326,0.0666666666666666657],"xyz":[0.165125194692509442,0.21570672317109077,0.0382400705630870433],"hpluv":[96.7583563096261088,139.399900460742,53.5684856288310272],"hsluv":[96.7583563096261088,96.9357421545617,53.5684856288310272]},"#778822":{"lch":[53.6490362820541407,55.6690512282284615,97.2652817371477],"luv":[53.6490362820541407,-7.04010577997538,55.2220986133077147],"rgb":[0.466666666666666674,0.533333333333333326,0.133333333333333331],"xyz":[0.167000552830986443,0.216456866426481598,0.0481169567590662428],"hpluv":[97.2652817371477,131.671329649176641,53.6490362820541407],"hsluv":[97.2652817371477,91.3605066517003337,53.6490362820541407]},"#778833":{"lch":[53.7812573057213,50.5917713326567053,98.2096275165039856],"luv":[53.7812573057213,-7.22426441450666346,50.0733195448945381],"rgb":[0.466666666666666674,0.533333333333333326,0.2],"xyz":[0.170088303563444176,0.217691966719464697,0.064379110616677393],"hpluv":[98.2096275165039856,119.368094402160139,53.7812573057213],"hsluv":[98.2096275165039856,82.4672262716137539,53.7812573057213]},"#778844":{"lch":[53.9712743947247162,43.5928841845235198,99.8805739619221811],"luv":[53.9712743947247162,-7.48032491712259429,42.9462954241638357],"rgb":[0.466666666666666674,0.533333333333333326,0.266666666666666663],"xyz":[0.174546298807663064,0.219475164817152291,0.0878578855695640315],"hpluv":[99.8805739619221811,102.492540276722124,53.9712743947247162],"hsluv":[99.8805739619221811,70.2195807792145672,53.9712743947247162]},"#778855":{"lch":[54.2238135722873,34.8221097745323078,102.954066597198249],"luv":[54.2238135722873,-7.80606678579386326,33.9358903004666175],"rgb":[0.466666666666666674,0.533333333333333326,0.333333333333333315],"xyz":[0.180508712847025077,0.221860130432897124,0.119259932843537933],"hpluv":[102.954066597198249,81.4900057495692636,54.2238135722873],"hsluv":[102.954066597198249,54.8454134878709638,54.2238135722873]},"#778866":{"lch":[54.542475349788262,24.6519214642532667,109.417534351990682],"luv":[54.542475349788262,-8.19552569001744224,23.2497438812554442],"rgb":[0.466666666666666674,0.533333333333333326,0.4],"xyz":[0.188093708620533234,0.224894128742300414,0.159207577250681909],"hpluv":[109.417534351990682,57.3528835536874197,54.542475349788262],"hsluv":[109.417534351990682,36.7830408334215164,54.542475349788262]},"#778877":{"lch":[54.9298804020046703,14.1239929232838151,127.715012949231166],"luv":[54.9298804020046703,-8.6401314869560828,11.1729720300858784],"rgb":[0.466666666666666674,0.533333333333333326,0.466666666666666674],"xyz":[0.197407721640735168,0.228619733950381238,0.208261379157079818],"hpluv":[127.715012949231166,32.6278280107521041,54.9298804020046703],"hsluv":[127.715012949231166,16.6133799052879709,54.9298804020046703]},"#778888":{"lch":[55.3877640712208574,9.3400800844087577,192.177050630059369],"luv":[55.3877640712208574,-9.12993258220805437,-1.97013375878514596],"rgb":[0.466666666666666674,0.533333333333333326,0.533333333333333326],"xyz":[0.208548138742678968,0.233075900791158835,0.266934242560651958],"hpluv":[192.177050630059369,21.3981433643613,55.3877640712208574],"hsluv":[192.177050630059369,21.3143847536295468,55.3877640712208574]},"#778899":{"lch":[55.9170512374386703,18.5603965019494623,238.655736169794807],"luv":[55.9170512374386703,-9.65472976501325597,-15.851640655596027],"rgb":[0.466666666666666674,0.533333333333333326,0.6],"xyz":[0.221605102851751695,0.238298686434788,0.335700920201769892],"hpluv":[238.655736169794807,42.1194135101242679,55.9170512374386703],"hsluv":[238.655736169794807,26.1912729818073053,55.9170512374386703]},"#7788aa":{"lch":[56.5179258756863732,31.8473117719276075,251.310804784322386],"luv":[56.5179258756863732,-10.2049729927717898,-30.1680260095876527],"rgb":[0.466666666666666674,0.533333333333333326,0.66666666666666663],"xyz":[0.236662795817004223,0.244321763620889087,0.415004769818768493],"hpluv":[251.310804784322386,71.5032678590983721,56.5179258756863732],"hsluv":[251.310804784322386,31.1149405392867244,56.5179258756863732]},"#7788bb":{"lch":[57.1899017055338845,45.9393215269311881,256.438388794294667],"luv":[57.1899017055338845,-10.7723499078102041,-44.6584565319768387],"rgb":[0.466666666666666674,0.533333333333333326,0.733333333333333282],"xyz":[0.253800387924340898,0.251176800463823846,0.505262754917410239],"hpluv":[256.438388794294667,101.930593576715296,57.1899017055338845],"hsluv":[256.438388794294667,41.4357647235180622,57.1899017055338845]},"#7788cc":{"lch":[57.9318961804226547,60.1932243037694406,259.131204763586595],"luv":[57.9318961804226547,-11.3500713849249486,-59.1134513595764233],"rgb":[0.466666666666666674,0.533333333333333326,0.8],"xyz":[0.273092763368062652,0.258893750641312648,0.606869265587680395],"hpluv":[259.131204763586595,131.8466774878151,57.9318961804226547],"hsluv":[259.131204763586595,55.5026255722761661,57.9318961804226547]},"#7788dd":{"lch":[58.7423077351926679,74.3397271130694861,260.762999043897821],"luv":[58.7423077351926679,-11.9329115646152975,-73.3757497327060264],"rgb":[0.466666666666666674,0.533333333333333326,0.866666666666666696],"xyz":[0.29461108891869614,0.267501080861566209,0.720199113487686393],"hpluv":[260.762999043897821,160.586593274196787,58.7423077351926679],"hsluv":[260.762999043897821,69.9489143241080598,58.7423077351926679]},"#7788ee":{"lch":[59.6190949291064101,88.2283098571320465,261.84384456781811],"luv":[59.6190949291064101,-12.5170812067924775,-87.3358880318318285],"rgb":[0.466666666666666674,0.533333333333333326,0.933333333333333348],"xyz":[0.318423269184870905,0.277025952968036226,0.845609929556209616],"hpluv":[261.84384456781811,187.785436290663455,59.6190949291064101],"hsluv":[261.84384456781811,84.7689484415743237,59.6190949291064101]},"#7788ff":{"lch":[60.55985551741054,101.77153783075579,262.604380260147],"luv":[60.55985551741054,-13.1000102630052879,-100.924901008354297],"rgb":[0.466666666666666674,0.533333333333333326,1],"xyz":[0.344594317594702271,0.28749437233196895,0.983444117847991461],"hpluv":[262.604380260147,213.245970352856943,60.55985551741054],"hsluv":[262.604380260147,99.9999999999987921,60.55985551741054]},"#779900":{"lch":[58.6994568897504223,69.1976359459353603,103.993850276975294],"luv":[58.6994568897504223,-16.7332165977800322,67.1439668384135899],"rgb":[0.466666666666666674,0.6,0],"xyz":[0.189983129645339782,0.267041257876171612,0.0415351657491536685],"hpluv":[103.993850276975294,149.587912305351722,58.6994568897504223],"hsluv":[103.993850276975294,100.000000000002444,58.6994568897504223]},"#779911":{"lch":[58.7371702745588493,67.6759907780605232,104.326162498332039],"luv":[58.7371702745588493,-16.7458460058928829,65.5714600214076],"rgb":[0.466666666666666674,0.6,0.0666666666666666657],"xyz":[0.190994795144976914,0.267445924076026464,0.0468632707139093],"hpluv":[104.326162498332039,146.20456366036808,58.7371702745588493],"hsluv":[104.326162498332039,97.5197891999702,58.7371702745588493]},"#779922":{"lch":[58.8069803361006223,64.8997387816913,104.97431376012679],"luv":[58.8069803361006223,-16.7691829588827659,62.6958578920751464],"rgb":[0.466666666666666674,0.6,0.133333333333333331],"xyz":[0.192870153283453916,0.268196067331417265,0.0567401569098885],"hpluv":[104.97431376012679,140.04041716275114,58.8069803361006223],"hsluv":[104.97431376012679,92.9911396041894704,58.8069803361006223]},"#779933":{"lch":[58.9216385591388132,60.4528100001228097,106.14237332279157],"luv":[58.9216385591388132,-16.8074000849803582,58.0693855598141369],"rgb":[0.466666666666666674,0.6,0.2],"xyz":[0.195957904015911677,0.269431167624400392,0.0730023107674996341],"hpluv":[106.14237332279157,130.191012221085145,58.9216385591388132],"hsluv":[106.14237332279157,85.724115661044948,58.9216385591388132]},"#779944":{"lch":[59.0865618982540752,54.3006768161790845,108.091337704968765],"luv":[59.0865618982540752,-16.8621369683366211,51.6161974534756354],"rgb":[0.466666666666666674,0.6,0.266666666666666663],"xyz":[0.200415899260130537,0.271214365722087958,0.0964810857203862726],"hpluv":[108.091337704968765,116.615384645059635,59.0865618982540752],"hsluv":[108.091337704968765,75.6282332091309399,59.0865618982540752]},"#779955":{"lch":[59.3060149965037056,46.5647823410072945,111.326222899357617],"luv":[59.3060149965037056,-16.9345685221747893,43.3762532203180413],"rgb":[0.466666666666666674,0.6,0.333333333333333315],"xyz":[0.206378313299492522,0.273599331337832818,0.127883132994360188],"hpluv":[111.326222899357617,99.6318422422000367,59.3060149965037056],"hsluv":[111.326222899357617,62.8087826319283806,59.3060149965037056]},"#779966":{"lch":[59.5833535636433282,37.5662597340720836,116.949978591108717],"luv":[59.5833535636433282,-17.0254963867212936,33.4866591823296957],"rgb":[0.466666666666666674,0.6,0.4],"xyz":[0.213963309073000707,0.276633329647236137,0.16783077740150415],"hpluv":[116.949978591108717,80.0041177209304522,59.5833535636433282],"hsluv":[116.949978591108717,47.5357009492008,59.5833535636433282]},"#779977":{"lch":[59.921152065724,28.0111989307655129,127.71501294923614],"luv":[59.921152065724,-17.1354122862910181,22.1586306282167591],"rgb":[0.466666666666666674,0.6,0.466666666666666674],"xyz":[0.223277322093202613,0.280358934855316932,0.216884579307902059],"hpluv":[127.71501294923614,59.3185968765002301,59.921152065724],"hsluv":[127.71501294923614,30.2037385091367128,59.921152065724]},"#779988":{"lch":[60.3212826107906608,19.7788738743410271,150.794869664161695],"luv":[60.3212826107906608,-17.2645515875173317,9.65086059473676272],"rgb":[0.466666666666666674,0.6,0.533333333333333326],"xyz":[0.234417739195146468,0.28481510169609453,0.275557442711474199],"hpluv":[150.794869664161695,41.6073752981458043,60.3212826107906608],"hsluv":[150.794869664161695,33.5278156565034706,60.3212826107906608]},"#779999":{"lch":[60.7849725890424537,17.8137422376051369,192.177050630060307],"luv":[60.7849725890424537,-17.4129412378011317,-3.75751113860251662],"rgb":[0.466666666666666674,0.6,0.6],"xyz":[0.247474703304219168,0.290037887339723688,0.344324120352592133],"hpluv":[192.177050630060307,37.1876097830212373,60.7849725890424537],"hsluv":[192.177050630060307,37.0420465685486562,60.7849725890424537]},"#7799aa":{"lch":[61.3128540464897895,25.0117677757311512,225.340924984985747],"luv":[61.3128540464897895,-17.5804418295499474,-17.7909131959243076],"rgb":[0.466666666666666674,0.6,0.66666666666666663],"xyz":[0.262532396269471724,0.29606096452582481,0.423627969969590734],"hpluv":[225.340924984985747,51.7645188682129742,61.3128540464897895],"hsluv":[225.340924984985747,40.6599304384258815,61.3128540464897895]},"#7799bb":{"lch":[61.9050111975332129,36.7727368637825478,241.108601392342877],"luv":[61.9050111975332129,-17.766782778670386,-32.1958942436537],"rgb":[0.466666666666666674,0.6,0.733333333333333282],"xyz":[0.279669988376808343,0.302916001368759569,0.513885955068232425],"hpluv":[241.108601392342877,75.37710856774234,61.9050111975332129],"hsluv":[241.108601392342877,44.3026829048042927,61.9050111975332129]},"#7799cc":{"lch":[62.5610290710097274,50.0883036089361084,248.973595844380469],"luv":[62.5610290710097274,-17.971590279241223,-46.7531827927901],"rgb":[0.466666666666666674,0.6,0.8],"xyz":[0.298962363820530097,0.31063295154624837,0.615492465738502581],"hpluv":[248.973595844380469,101.594866952252644,62.5610290710097274],"hsluv":[248.973595844380469,49.5852758814030068,62.5610290710097274]},"#7799dd":{"lch":[63.2800443412030518,63.9273589508424962,253.464421950176984],"luv":[63.2800443412030518,-18.1944086519195096,-61.2835272829234228],"rgb":[0.466666666666666674,0.6,0.866666666666666696],"xyz":[0.320480689371163641,0.319240281766501877,0.728822313638508579],"hpluv":[253.464421950176984,128.191525099113591,63.2800443412030518],"hsluv":[253.464421950176984,65.7895471985927429,63.2800443412030518]},"#7799ee":{"lch":[64.0607982423263138,77.8622331281598292,256.304567564122067],"luv":[64.0607982423263138,-18.434716379612933,-75.6484539148497106],"rgb":[0.466666666666666674,0.6,0.933333333333333348],"xyz":[0.344292869637338406,0.328765153872971894,0.854233129707031802],"hpluv":[256.304567564122067,154.231767587931557,64.0607982423263138],"hsluv":[256.304567564122067,82.5871459557978085,64.0607982423263138]},"#7799ff":{"lch":[64.9016907971027,91.67329289213788,258.23504341307023],"luv":[64.9016907971027,-18.6919383586334327,-89.7474460365571929],"rgb":[0.466666666666666674,0.6,1],"xyz":[0.370463918047169771,0.339233573236904618,0.992067317998813758],"hpluv":[258.23504341307023,179.236372955016122,64.9016907971027],"hsluv":[258.23504341307023,99.9999999999984368,64.9016907971027]},"#660000":{"lch":[19.330201679573328,65.0080772249371819,12.1770506300617765],"luv":[19.330201679573328,63.5454254137925432,13.7123671721378795],"rgb":[0.4,0,0],"xyz":[0.0547936733227042463,0.0282529878070199789,0.00256845343700170745],"hpluv":[12.1770506300617765,426.746789183125202,19.330201679573328],"hsluv":[12.1770506300617765,100.000000000002217,19.330201679573328]},"#660011":{"lch":[19.4980803058243595,61.695772445130423,8.9911342856641614],"luv":[19.4980803058243595,60.9376877881905799,9.641916024853316],"rgb":[0.4,0,0.0666666666666666657],"xyz":[0.0558053388223413716,0.0286576540068748317,0.0078965584017573389],"hpluv":[8.9911342856641614,401.51602003210553,19.4980803058243595],"hsluv":[8.9911342856641614,99.9999999999966178,19.4980803058243595]},"#660022":{"lch":[19.8051492014688648,56.728751528179842,2.87530221933591967],"luv":[19.8051492014688648,56.6573341637173584,2.84565201787440492],"rgb":[0.4,0,0.133333333333333331],"xyz":[0.0576806969608183867,0.029407797262265653,0.0177734445977365332],"hpluv":[2.87530221933591967,363.466537566247382,19.8051492014688648],"hsluv":[2.87530221933591967,99.9999999999968594,19.8051492014688648]},"#660033":{"lch":[20.2995520444984123,51.2727836305606957,352.516911450402631],"luv":[20.2995520444984123,50.836110988726972,-6.67743669143524787],"rgb":[0.4,0,0.2],"xyz":[0.0607684476932761272,0.0306428975552487659,0.0340355984553476765],"hpluv":[352.516911450402631,320.508659944055125,20.2995520444984123],"hsluv":[352.516911450402631,99.9999999999973852,20.2995520444984123]},"#660044":{"lch":[20.9904438433464762,47.7800185043531087,338.095292373375855],"luv":[20.9904438433464762,44.3305689635839855,-17.8250055719836844],"rgb":[0.4,0,0.266666666666666663],"xyz":[0.0652264429374950078,0.0324260956529363389,0.057514373408234315],"hpluv":[338.095292373375855,288.844444062118953,20.9904438433464762],"hsluv":[338.095292373375855,99.999999999997911,20.9904438433464762]},"#660055":{"lch":[21.8759682447435324,48.0792454528985687,322.009867044845],"luv":[21.8759682447435324,37.8920594608334085,-29.5940141436867741],"rgb":[0.4,0,0.333333333333333315],"xyz":[0.071188856976857,0.0348110612686811718,0.0889164206822082304],"hpluv":[322.009867044845,278.887908627948889,21.8759682447435324],"hsluv":[322.009867044845,99.9999999999984,21.8759682447435324]},"#660066":{"lch":[22.9458380566939866,52.2668983658326383,307.715012949243601],"luv":[22.9458380566939866,31.9734565677830815,-41.3464235441515271],"rgb":[0.4,0,0.4],"xyz":[0.0787738527503651781,0.0378450595780844834,0.128864065089352192],"hpluv":[307.715012949243601,289.042783730483393,22.9458380566939866],"hsluv":[307.715012949243601,99.9999999999988,22.9458380566939866]},"#660077":{"lch":[24.1840444716539054,59.1802438936044553,296.875135467660698],"luv":[24.1840444716539054,26.7522904844618061,-52.7884099129864097],"rgb":[0.4,0,0.466666666666666674],"xyz":[0.0880878657705671,0.0415706647861653,0.177917866995750101],"hpluv":[296.875135467660698,310.518260327731298,24.1840444716539054],"hsluv":[296.875135467660698,99.9999999999992326,24.1840444716539054]},"#660088":{"lch":[25.5714349826340381,67.6035320092512819,289.201479741547303],"luv":[25.5714349826340381,22.2341957091879898,-63.8426039670327725],"rgb":[0.4,0,0.533333333333333326],"xyz":[0.0992282828725109256,0.0460268316269428907,0.236590730399322269],"hpluv":[289.201479741547303,335.469941782198191,25.5714349826340381],"hsluv":[289.201479741547303,99.9999999999995168,25.5714349826340381]},"#660099":{"lch":[27.0878540213863559,76.7583277742970296,283.827270614430063],"luv":[27.0878540213863559,18.3449067131383,-74.5339203342523291],"rgb":[0.4,0,0.6],"xyz":[0.112285246981583625,0.0512496172705720551,0.305357408040440148],"hpluv":[283.827270614430063,359.575614235331898,27.0878540213863559],"hsluv":[283.827270614430063,99.9999999999996732,27.0878540213863559]},"#6600aa":{"lch":[28.7136916664512327,86.2331190336617226,280.0081392435834],"luv":[28.7136916664512327,14.9862877024472088,-84.9209161465722246],"rgb":[0.4,0,0.66666666666666663],"xyz":[0.127342939946836181,0.0572726944566731566,0.384661257657438749],"hpluv":[280.0081392435834,381.087223541781498,28.7136916664512327],"hsluv":[280.0081392435834,99.9999999999998863,28.7136916664512327]},"#6600bb":{"lch":[30.4308478844127208,95.8259209373334784,277.232006261077231],"luv":[30.4308478844127208,12.063278317584528,-95.06358103774852],"rgb":[0.4,0,0.733333333333333282],"xyz":[0.144480532054172828,0.0641277312996079152,0.474919242756080495],"hpluv":[277.232006261077231,399.584170303460496,30.4308478844127208],"hsluv":[277.232006261077231,100.000000000000071,30.4308478844127208]},"#6600cc":{"lch":[32.2232190058254631,105.440117399912424,275.16595430901134],"luv":[32.2232190058254631,9.49391256045434,-105.011827817640437],"rgb":[0.4,0,0.8],"xyz":[0.163772907497894554,0.0718446814770967168,0.576525753426350707],"hpluv":[275.16595430901134,415.218107165999243,32.2232190058254631],"hsluv":[275.16595430901134,100.000000000000284,32.2232190058254631]},"#6600dd":{"lch":[34.0768449366564425,115.029794578821409,273.594219506454294],"luv":[34.0768449366564425,7.21119822634443164,-114.803537667557165],"rgb":[0.4,0,0.866666666666666696],"xyz":[0.185291233048528098,0.0804520116973502508,0.689855601326356704],"hpluv":[273.594219506454294,428.341637585051217,34.0768449366564425],"hsluv":[273.594219506454294,100.000000000000313,34.0768449366564425]},"#6600ee":{"lch":[35.9798440153965657,124.573148355199,272.374748889870204],"luv":[35.9798440153965657,5.16172842086039729,-124.466163477612255],"rgb":[0.4,0,0.933333333333333348],"xyz":[0.209103413314702835,0.0899768838038202817,0.815266417394879928],"hpluv":[272.374748889870204,439.343788723350144,35.9798440153965657],"hsluv":[272.374748889870204,100.000000000000313,35.9798440153965657]},"#6600ff":{"lch":[37.9222328155672699,134.059876636217865,271.411957283269032],"luv":[37.9222328155672699,3.30334385288953181,-134.01917192367489],"rgb":[0.4,0,1],"xyz":[0.235274461724534228,0.100445303167752992,0.953100605686661773],"hpluv":[271.411957283269032,448.58447779597617,37.9222328155672699],"hsluv":[271.411957283269032,100.00000000000054,37.9222328155672699]},"#661100":{"lch":[20.9278595225824304,60.6482483509225645,15.3961031612090817],"luv":[20.9278595225824304,58.4717927536604165,16.1015365791022269],"rgb":[0.4,0.0666666666666666657,0],"xyz":[0.0567980735836326536,0.0322617883288768559,0.00323658685731115833],"hpluv":[15.3961031612090817,367.733145903292666,20.9278595225824304],"hsluv":[15.3961031612090817,100.00000000000216,20.9278595225824304]},"#661111":{"lch":[21.0816163302651134,57.5811303886473453,12.1770506300618102],"luv":[21.0816163302651134,56.2855814623301782,12.1457768908291825],"rgb":[0.4,0.0666666666666666657,0.0666666666666666657],"xyz":[0.0578097390832697788,0.0326664545287317087,0.00856469182206678892],"hpluv":[12.1770506300618102,346.589664487627374,21.0816163302651134],"hsluv":[12.1770506300618102,81.2167011616125762,21.0816163302651134]},"#661122":{"lch":[21.363314856368774,52.932385078801687,5.93410154371749865],"luv":[21.363314856368774,52.6487447994206548,5.4723908098767966],"rgb":[0.4,0.0666666666666666657,0.133333333333333331],"xyz":[0.059685097221746794,0.0334165977841225301,0.018441578018045985],"hpluv":[5.93410154371749865,314.406957937895,21.363314856368774],"hsluv":[5.93410154371749865,82.5199513610387356,21.363314856368774]},"#661133":{"lch":[21.8180817632255923,47.7742586248590229,355.183549580278111],"luv":[21.8180817632255923,47.6055578330604661,-4.01131531521171425],"rgb":[0.4,0.0666666666666666657,0.2],"xyz":[0.0627728479542045414,0.0346516980771056429,0.0347037318756571317],"hpluv":[355.183549580278111,277.854041301729922,21.8180817632255923],"hsluv":[355.183549580278111,84.3121175303292603,21.8180817632255923]},"#661144":{"lch":[22.4559756968324393,44.5402485804784689,339.935360677682411],"luv":[22.4559756968324393,41.8369301419790247,-15.2808710453946635],"rgb":[0.4,0.0666666666666666657,0.266666666666666663],"xyz":[0.0672308431984234151,0.036434896174793216,0.0581825068285437702],"hpluv":[339.935360677682411,251.686564911624259,22.4559756968324393],"hsluv":[339.935360677682411,86.3348863624116518,22.4559756968324393]},"#661155":{"lch":[23.2773926977910151,45.1903944783221903,322.792583995755933],"luv":[23.2773926977910151,35.9919645110905364,-27.3267313035930464],"rgb":[0.4,0.0666666666666666657,0.333333333333333315],"xyz":[0.073193257237785414,0.0388198617905380489,0.0895845541025176717],"hpluv":[322.792583995755933,246.349182588766354,23.2773926977910151],"hsluv":[322.792583995755933,88.344826800164725,23.2773926977910151]},"#661166":{"lch":[24.275087751098269,49.8658315110702119,307.715012949243715],"luv":[24.275087751098269,30.5046415204515107,-39.4470277460696508],"rgb":[0.4,0.0666666666666666657,0.4],"xyz":[0.0807782530112935854,0.0418538600999413604,0.129532198509661634],"hpluv":[307.715012949243715,260.664316843383688,24.275087751098269],"hsluv":[307.715012949243715,90.1819147598703239,24.275087751098269]},"#661177":{"lch":[25.4363091503391701,57.3032374709331265,296.512546946797],"luv":[25.4363091503391701,25.5798087859014238,-51.2770358652572114],"rgb":[0.4,0.0666666666666666657,0.466666666666666674],"xyz":[0.0900922660314955,0.0455794653080221768,0.178586000416059543],"hpluv":[296.512546946797,285.867241464858182,25.4363091503391701],"hsluv":[296.512546946797,91.7740463972148461,25.4363091503391701]},"#661188":{"lch":[26.7449145171680129,66.1973281861227179,288.734792076243366],"luv":[26.7449145171680129,21.2617948521868456,-62.6898902427238127],"rgb":[0.4,0.0666666666666666657,0.533333333333333326],"xyz":[0.101232683133439333,0.0500356321487997746,0.23725886381963171],"hpluv":[288.734792076243366,314.078764213635395,26.7449145171680129],"hsluv":[288.734792076243366,93.110372692245349,26.7449145171680129]},"#661199":{"lch":[28.1832309630650286,75.7381406209258614,283.36677781159608],"luv":[28.1832309630650286,17.5094321789343716,-73.6864012521064637],"rgb":[0.4,0.0666666666666666657,0.6],"xyz":[0.114289647242512032,0.0552584177924289321,0.306025541460749617],"hpluv":[283.36677781159608,341.006914961476241,28.1832309630650286],"hsluv":[283.36677781159608,94.2123428080992,28.1832309630650286]},"#6611aa":{"lch":[29.733500038717203,85.5146667147819102,279.591039159426828],"luv":[29.733500038717203,14.2479867443400359,-84.3193518539685],"rgb":[0.4,0.0666666666666666657,0.66666666666666663],"xyz":[0.129347340207764588,0.0612814949785300336,0.385329391077748218],"hpluv":[279.591039159426828,364.950446526832081,29.733500038717203],"hsluv":[279.591039159426828,95.1136535912152254,29.733500038717203]},"#6611bb":{"lch":[31.378866229854367,95.3367425151459287,276.866082014695],"luv":[31.378866229854367,11.3974241300945351,-94.6530147253534153],"rgb":[0.4,0.0666666666666666657,0.733333333333333282],"xyz":[0.146484932315101235,0.0681365318214647853,0.475587376176389964],"hpluv":[276.866082014695,385.533736621086632,31.378866229854367],"hsluv":[276.866082014695,95.8493220980777636,31.378866229854367]},"#6611cc":{"lch":[33.1039576367877899,105.121866511028642,274.848446148865946],"luv":[33.1039576367877899,8.88494143701037409,-104.745714157780327],"rgb":[0.4,0.0666666666666666657,0.8],"xyz":[0.165777307758822962,0.0758534819989535869,0.577193886846660176],"hpluv":[274.848446148865946,402.951217622234481,33.1039576367877899],"hsluv":[274.848446148865946,96.4508528344463372,33.1039576367877899]},"#6611dd":{"lch":[34.8951509835915559,114.837148656435488,273.319244536407894],"luv":[34.8951509835915559,6.64899595047804048,-114.644500803094743],"rgb":[0.4,0.0666666666666666657,0.866666666666666696],"xyz":[0.187295633309456505,0.0844608122192071209,0.690523734746666173],"hpluv":[273.319244536407894,417.596303228590671,34.8951509835915559],"hsluv":[273.319244536407894,96.944722371929771,34.8951509835915559]},"#6611ee":{"lch":[36.7406193088150914,124.471664845310258,272.136065946829319],"luv":[36.7406193088150914,4.63940101804097527,-124.385173182164465],"rgb":[0.4,0.0666666666666666657,0.933333333333333348],"xyz":[0.211107813575631242,0.0939856843256771657,0.815934550815189397],"hpluv":[272.136065946829319,429.895948632666091,36.7406193088150914],"hsluv":[272.136065946829319,97.3524117238680446,36.7406193088150914]},"#6611ff":{"lch":[38.6302462525687815,134.023748920536207,271.203906716280642],"luv":[38.6302462525687815,2.81591803113255,-133.994163605572282],"rgb":[0.4,0.0666666666666666657,1],"xyz":[0.237278861985462636,0.104454103689609862,0.953768739106971242],"hpluv":[271.203906716280642,440.244168299440901,38.6302462525687815],"hsluv":[271.203906716280642,99.999999999999531,38.6302462525687815]},"#662200":{"lch":[23.5697003211059126,54.0433218319152,21.7646438431993481],"luv":[23.5697003211059126,50.1908335966774928,20.038983444740694],"rgb":[0.4,0.133333333333333331,0],"xyz":[0.0605136973184005889,0.0396930357984128235,0.00447512810223376842],"hpluv":[21.7646438431993481,290.955989204018863,23.5697003211059126],"hsluv":[21.7646438431993481,100.000000000002302,23.5697003211059126]},"#662211":{"lch":[23.7037155268300239,51.2256671637292627,18.5481266113504795],"luv":[23.7037155268300239,48.5648418325832196,16.2949413667354186],"rgb":[0.4,0.133333333333333331,0.0666666666666666657],"xyz":[0.0615253628180377071,0.0400977019982676763,0.0098032330669894],"hpluv":[18.5481266113504795,274.227196288753476,23.7037155268300239],"hsluv":[18.5481266113504795,84.4421944630679775,23.7037155268300239]},"#662222":{"lch":[23.9497782760704823,46.8639841586094761,12.177050630061828],"luv":[23.9497782760704823,45.8095660888384515,9.88517404858116],"rgb":[0.4,0.133333333333333331,0.133333333333333331],"xyz":[0.0634007209565147362,0.0408478452536585,0.0196801192629685942],"hpluv":[12.177050630061828,248.300181449835577,23.9497782760704823],"hsluv":[12.177050630061828,58.184428739378582,23.9497782760704823]},"#662233":{"lch":[24.3484354577474491,41.8866591548313139,0.79920805816821483],"luv":[24.3484354577474491,41.8825842907357284,0.584250188216085209],"rgb":[0.4,0.133333333333333331,0.2],"xyz":[0.0664884716889724697,0.0420829455466416105,0.0359422731205797374],"hpluv":[0.79920805816821483,218.295100847162672,24.3484354577474491],"hsluv":[0.79920805816821483,61.8388407102714908,24.3484354577474491]},"#662244":{"lch":[24.9104705449366364,38.7518995195090881,343.921953822216381],"luv":[24.9104705449366364,37.2361321960480467,-10.7322027305005232],"rgb":[0.4,0.133333333333333331,0.266666666666666663],"xyz":[0.0709464669331913433,0.0438661436443291836,0.059421048073466376],"hpluv":[343.921953822216381,197.40147375767063,24.9104705449366364],"hsluv":[343.921953822216381,66.1143919991375,24.9104705449366364]},"#662255":{"lch":[25.6388481254070371,39.7515606661792376,324.488651014584605],"luv":[25.6388481254070371,32.3577893991285421,-23.0902585650003651],"rgb":[0.4,0.133333333333333331,0.333333333333333315],"xyz":[0.0769088809725533423,0.0462511092600740165,0.0908230953474402913],"hpluv":[324.488651014584605,196.74105716675524,25.6388481254070371],"hsluv":[324.488651014584605,70.5303777194930746,25.6388481254070371]},"#662266":{"lch":[26.530115175026431,45.1550068711170525,307.715012949244],"luv":[26.530115175026431,27.6228683191850166,-35.7204674010796381],"rgb":[0.4,0.133333333333333331,0.4],"xyz":[0.0844938767460615137,0.049285107569477328,0.130770739754584253],"hpluv":[307.715012949244,215.976303505553034,26.530115175026431],"hsluv":[307.715012949244,74.7212231760600076,26.530115175026431]},"#662277":{"lch":[27.5758503181253047,53.47184404785515,295.772994892671647],"luv":[27.5758503181253047,23.2499163509258366,-48.1526686233805137],"rgb":[0.4,0.133333333333333331,0.466666666666666674],"xyz":[0.0938078897662634331,0.0530107127775581444,0.179824541660982162],"hpluv":[295.772994892671647,246.056915236342576,27.5758503181253047],"hsluv":[295.772994892671647,78.4792949436714622,27.5758503181253047]},"#662288":{"lch":[28.7641691288539221,63.1969785740596492,287.807032602413699],"luv":[28.7641691288539221,19.3264050913403267,-60.169329123196718],"rgb":[0.4,0.133333333333333331,0.533333333333333326],"xyz":[0.104948306868207261,0.0574668796183357422,0.23849740506455433],"hpluv":[287.807032602413699,278.794247273594806,28.7641691288539221],"hsluv":[287.807032602413699,81.7283139306751565,28.7641691288539221]},"#662299":{"lch":[30.081149723697223,73.446586603294,282.467625610713],"luv":[30.081149723697223,15.8562317990126083,-71.7145800853016766],"rgb":[0.4,0.133333333333333331,0.6],"xyz":[0.118005270977279975,0.0626896652619649,0.307264082705672237],"hpluv":[282.467625610713,309.825038390781458,30.081149723697223],"hsluv":[282.467625610713,84.475317587044259,30.081149723697223]},"#6622aa":{"lch":[31.512047889249807,83.7990879252892569,278.786617054458873],"luv":[31.512047889249807,12.8007301136733549,-82.8156292354725565],"rgb":[0.4,0.133333333333333331,0.66666666666666663],"xyz":[0.133062963942532531,0.068712742448066,0.386567932322670837],"hpluv":[278.786617054458873,337.444217562648532,31.512047889249807],"hsluv":[278.786617054458873,86.7692530837111349,31.512047889249807]},"#6622bb":{"lch":[33.0422299311305281,94.07636648958254,276.16643073789237],"luv":[33.0422299311305281,10.1053888262289746,-93.5320471739658643],"rgb":[0.4,0.133333333333333331,0.733333333333333282],"xyz":[0.150200556049869149,0.0755677792910007529,0.476825917421312584],"hpluv":[276.16643073789237,361.285484259324733,33.0422299311305281],"hsluv":[276.16643073789237,88.6739591516067662,33.0422299311305281]},"#6622cc":{"lch":[34.6578144612334853,104.214655833315277,274.245119058655746],"luv":[34.6578144612334853,7.71433729467952212,-103.928742369761551],"rgb":[0.4,0.133333333333333331,0.8],"xyz":[0.169492931493590904,0.0832847294684895545,0.578432428091582684],"hpluv":[274.245119058655746,381.563613242959605,34.6578144612334853],"hsluv":[274.245119058655746,90.2534916489383079,34.6578144612334853]},"#6622dd":{"lch":[36.346058304563158,114.200305800004017,272.799119030217753],"luv":[36.346058304563158,5.5769048208672336,-114.064052082299],"rgb":[0.4,0.133333333333333331,0.866666666666666696],"xyz":[0.191011257044224447,0.0918920596887430885,0.691762275991588682],"hpluv":[272.799119030217753,398.702789727268566,36.346058304563158],"hsluv":[272.799119030217753,91.5654894217155118,36.346058304563158]},"#6622ee":{"lch":[38.0955422395423,124.039689220569301,271.686141036519132],"luv":[38.0955422395423,3.64980151132168062,-123.985980864222597],"rgb":[0.4,0.133333333333333331,0.933333333333333348],"xyz":[0.214823437310399185,0.101416931795213133,0.817173092060111905],"hpluv":[271.686141036519132,413.167199445381073,38.0955422395423],"hsluv":[271.686141036519132,92.6590152569973498,38.0955422395423]},"#6622ff":{"lch":[39.8962147757429264,133.745689778340022,270.812765394378914],"luv":[39.8962147757429264,1.89717678294479941,-133.732233416399],"rgb":[0.4,0.133333333333333331,1],"xyz":[0.240994485720230578,0.111885351159145829,0.95500728035189375],"hpluv":[270.812765394378914,425.390148773484384,39.8962147757429264],"hsluv":[270.812765394378914,99.99999999999946,39.8962147757429264]},"#ddaa00":{"lch":[72.3107430320736881,86.5721801417344494,59.9465914104400071],"luv":[72.3107430320736881,43.355958426121056,74.9333253195491267],"rgb":[0.866666666666666696,0.66666666666666663,0],"xyz":[0.441922241377765923,0.441231641500849037,0.0618909005679976823],"hpluv":[59.9465914104400071,151.919966798177825,72.3107430320736881],"hsluv":[59.9465914104400071,100.000000000002402,72.3107430320736881]},"#ddaa11":{"lch":[72.3377322217577188,85.4954146103564625,59.6744594052448178],"luv":[72.3377322217577188,43.1676990261245663,73.7971251485224],"rgb":[0.866666666666666696,0.66666666666666663,0.0666666666666666657],"xyz":[0.442933906877403,0.44163630770070389,0.067219005532753312],"hpluv":[59.6744594052448178,149.974443711406025,72.3377322217577188],"hsluv":[59.6744594052448178,98.5180859943944398,72.3377322217577188]},"#ddaa22":{"lch":[72.3877194091470386,83.5208789068112623,59.1557200492863586],"luv":[72.3877194091470386,42.8217010650181038,71.708013019916109],"rgb":[0.866666666666666696,0.66666666666666663,0.133333333333333331],"xyz":[0.444809265015880084,0.44238645095609469,0.0770958917287325],"hpluv":[59.1557200492863586,146.409577733002152,72.3877194091470386],"hsluv":[59.1557200492863586,95.7957425728033911,72.3877194091470386]},"#ddaa33":{"lch":[72.4698996386445771,80.3304907566891,58.2589820164620633],"luv":[72.4698996386445771,42.2603136650720543,68.3158373595774435],"rgb":[0.866666666666666696,0.66666666666666663,0.2],"xyz":[0.44789701574833779,0.443621551249077817,0.0933580455863436548],"hpluv":[58.2589820164620633,140.657238526484292,72.4698996386445771],"hsluv":[58.2589820164620633,91.3821490755410082,72.4698996386445771]},"#ddaa44":{"lch":[72.5882801580772679,75.8571050863154,56.8623293870095949],"luv":[72.5882801580772679,41.467485474955744,63.5196665644635701],"rgb":[0.866666666666666696,0.66666666666666663,0.266666666666666663],"xyz":[0.452355010992556705,0.445404749346765383,0.116836820539230293],"hpluv":[56.8623293870095949,132.607804442486071,72.5882801580772679],"hsluv":[56.8623293870095949,85.1564308385751332,72.5882801580772679]},"#ddaa55":{"lch":[72.7461171317656579,70.1198989219024469,54.780917696258733],"luv":[72.7461171317656579,40.4384565855633085,57.2846528644045065],"rgb":[0.866666666666666696,0.66666666666666663,0.333333333333333315],"xyz":[0.45831742503191869,0.447789714962510244,0.148238867813204195],"hpluv":[54.780917696258733,122.3124851735341,72.7461171317656579],"hsluv":[54.780917696258733,77.0893717991816345,72.7461171317656579]},"#ddaa66":{"lch":[72.9460991959627307,63.2340905833455835,51.7145858463931702],"luv":[72.9460991959627307,39.17852917707404,49.6345954292357661],"rgb":[0.866666666666666696,0.66666666666666663,0.4],"xyz":[0.465902420805426876,0.450823713271913562,0.188186512220348157],"hpluv":[51.7145858463931702,109.998947735143361,72.9460991959627307],"hsluv":[51.7145858463931702,67.2337497701281421,72.9460991959627307]},"#ddaa77":{"lch":[73.1904440644495651,55.4382228560327377,47.150998877343909],"luv":[73.1904440644495651,37.7017926183457632,40.6444508733775294],"rgb":[0.866666666666666696,0.66666666666666663,0.466666666666666674],"xyz":[0.475216433825628781,0.454549318479994358,0.237240314126746066],"hpluv":[47.150998877343909,96.1156803308001173,73.1904440644495651],"hsluv":[47.150998877343909,55.7140089565642214,73.1904440644495651]},"#ddaa88":{"lch":[73.4809558021361511,47.1613293807763228,40.1850915920125189],"luv":[73.4809558021361511,36.0295555463961819,30.4312687229965526],"rgb":[0.866666666666666696,0.66666666666666663,0.533333333333333326],"xyz":[0.486356850927572582,0.459005485320771955,0.295913177530318261],"hpluv":[40.1850915920125189,81.4424009312931645,73.4809558021361511],"hsluv":[40.1850915920125189,45.325944585658668,73.4809558021361511]},"#ddaa99":{"lch":[73.8190624606049539,39.1833139250455389,29.2463480703396321],"luv":[73.8190624606049539,34.1885051927702435,19.1436204212419021],"rgb":[0.866666666666666696,0.66666666666666663,0.6],"xyz":[0.499413815036645281,0.464228270964401113,0.36467985517143614],"hpluv":[29.2463480703396321,67.3553294964948,73.8190624606049539],"hsluv":[29.2463480703396321,46.1073405736803323,73.8190624606049539]},"#ddaaaa":{"lch":[74.2058435914849923,32.9500913661112946,12.1770506300625296],"luv":[74.2058435914849923,32.2087294789219527,6.95027095793437244],"rgb":[0.866666666666666696,0.66666666666666663,0.66666666666666663],"xyz":[0.514471508001897893,0.470251348150502235,0.443983704788434741],"hpluv":[12.1770506300625296,56.3453191386000114,74.2058435914849923],"hsluv":[12.1770506300625296,46.9171896008106,74.2058435914849923]},"#ddaabb":{"lch":[74.6420527030620633,30.7078714289026884,348.787813428378513],"luv":[74.6420527030620633,30.1217754775259223,-5.97093039446416807],"rgb":[0.866666666666666696,0.66666666666666663,0.733333333333333282],"xyz":[0.531609100109234456,0.477106384993437,0.534241689887076543],"hpluv":[348.787813428378513,52.2042025244198,74.6420527030620633],"hsluv":[348.787813428378513,47.7320050944543937,74.6420527030620633]},"#ddaacc":{"lch":[75.1281375044867445,34.0548346014018435,325.184688201169763],"luv":[75.1281375044867445,27.9589055182432595,-19.4430286208394669],"rgb":[0.866666666666666696,0.66666666666666663,0.8],"xyz":[0.55090147555295621,0.484823335170925795,0.635848200557346699],"hpluv":[325.184688201169763,57.5195499622066393,75.1281375044867445],"hsluv":[325.184688201169763,48.5278754329488109,75.1281375044867445]},"#ddaadd":{"lch":[75.6642595524878772,42.092894356631966,307.715012949247466],"luv":[75.6642595524878772,25.749668941594777,-33.2981426616688125],"rgb":[0.866666666666666696,0.66666666666666663,0.866666666666666696],"xyz":[0.572419801103589809,0.493430665391179302,0.749178048457352697],"hpluv":[307.715012949247466,70.5922995729826255,75.6642595524878772],"hsluv":[307.715012949247466,49.2811497501269855,75.6642595524878772]},"#ddaaee":{"lch":[76.2503141773092636,52.9001531738191915,296.399494755977059],"luv":[76.2503141773092636,23.5208512504545659,-47.3834967290038875],"rgb":[0.866666666666666696,0.66666666666666663,0.933333333333333348],"xyz":[0.596231981369764519,0.502955537497649319,0.87458886452587592],"hpluv":[296.399494755977059,89.1958388421213,76.2503141773092636],"hsluv":[296.399494755977059,73.8038640729286,76.2503141773092636]},"#ddaaff":{"lch":[76.8859510948180542,65.1444004641461447,289.080822119258073],"luv":[76.8859510948180542,21.295808093697417,-61.565261872824486],"rgb":[0.866666666666666696,0.66666666666666663,1],"xyz":[0.62240302977959594,0.513423956861582,1.01242305281765765],"hpluv":[289.080822119258073,113.514774922986319,76.8859510948180542],"hsluv":[289.080822119258073,99.9999999999968736,76.8859510948180542]},"#663300":{"lch":[27.2772702365161024,46.6784293424923,33.1138040531735385],"luv":[27.2772702365161024,39.0972512948193938,25.5006020923387098],"rgb":[0.4,0.2,0],"xyz":[0.0666314194074114075,0.0519284799764346272,0.00651436879857064926],"hpluv":[33.1138040531735385,217.147410386557254,27.2772702365161024],"hsluv":[33.1138040531735385,100.000000000002288,27.2772702365161024]},"#663311":{"lch":[27.3893959478715772,43.971204952951652,30.1269617465812196],"luv":[27.3893959478715772,38.0313691656755353,22.0699303215615963],"rgb":[0.4,0.2,0.0666666666666666657],"xyz":[0.0676430849070485257,0.0523331461762894801,0.0118424737633262799],"hpluv":[30.1269617465812196,203.716046393577358,27.3893959478715772],"hsluv":[30.1269617465812196,87.8713966090680572,27.3893959478715772]},"#663322":{"lch":[27.5957277293980781,39.608651287835805,23.9834802389854467],"luv":[27.5957277293980781,36.1889469500517436,16.0998563809655693],"rgb":[0.4,0.2,0.133333333333333331],"xyz":[0.0695184430455255548,0.0530832894316803,0.0217193599593054759],"hpluv":[23.9834802389854467,182.132533879714401,27.5957277293980781],"hsluv":[23.9834802389854467,66.9779468056010501,27.5957277293980781]},"#663333":{"lch":[27.9312558147072,34.2527069144242517,12.1770506300619683],"luv":[27.9312558147072,33.482036777055967,7.2250359324586606],"rgb":[0.4,0.2,0.2],"xyz":[0.0726061937779832883,0.0543183897246634143,0.0379815138169166192],"hpluv":[12.1770506300619683,155.612242967619039,27.9312558147072],"hsluv":[12.1770506300619683,36.4647718300342518,27.9312558147072]},"#663344":{"lch":[28.4068233476218452,30.4023991370198274,352.642674566889241],"luv":[28.4068233476218452,30.1520905841737843,-3.89323858637544307],"rgb":[0.4,0.2,0.266666666666666663],"xyz":[0.0770641890222021619,0.0561015878223509873,0.0614602887698032577],"hpluv":[352.642674566889241,135.807736934047625,28.4068233476218452],"hsluv":[352.642674566889241,42.3197568133242044,28.4068233476218452]},"#663355":{"lch":[29.027378781744666,31.164203729876963,328.257954430910445],"luv":[29.027378781744666,26.5028264215118483,-16.3953586660521324],"rgb":[0.4,0.2,0.333333333333333315],"xyz":[0.0830266030615641609,0.0584865534380958202,0.0928623360437771661],"hpluv":[328.257954430910445,136.234637721643935,29.027378781744666],"hsluv":[328.257954430910445,48.648881209958347,29.027378781744666]},"#663366":{"lch":[29.7928910898429251,37.2833882928919067,307.715012949244567],"luv":[29.7928910898429251,22.8075289246907325,-29.4935190668720466],"rgb":[0.4,0.2,0.4],"xyz":[0.0906115988350723323,0.0615205517474991317,0.132809980450921128],"hpluv":[307.715012949244567,158.796911496206434,29.7928910898429251],"hsluv":[307.715012949244567,54.9388950129523792,29.7928910898429251]},"#663377":{"lch":[30.6992208566667273,46.7654342463890345,294.320996437271049],"luv":[30.6992208566667273,19.2602655771695837,-42.6151148086008646],"rgb":[0.4,0.2,0.466666666666666674],"xyz":[0.0999256118552742517,0.0652461569555799481,0.181863782357319037],"hpluv":[294.320996437271049,193.302265796468333,30.6992208566667273],"hsluv":[294.320996437271049,60.8304716126584424,30.6992208566667273]},"#663388":{"lch":[31.7390466224972485,57.6768981875091811,286.074834637191429],"luv":[31.7390466224972485,15.9703082974272554,-55.4217812544619122],"rgb":[0.4,0.2,0.533333333333333326],"xyz":[0.11106602895721808,0.0697023237963575459,0.240536645760891205],"hpluv":[286.074834637191429,230.593651019326217,31.7390466224972485],"hsluv":[286.074834637191429,66.1275975958513,31.7390466224972485]},"#663399":{"lch":[32.9028065942714818,68.9918273860838696,280.844497617061506],"luv":[32.9028065942714818,12.9804074562249703,-67.7597319087197292],"rgb":[0.4,0.2,0.6],"xyz":[0.124122993066290793,0.0749251094399867,0.309303323402009112],"hpluv":[280.844497617061506,266.074975063872387,32.9028065942714818],"hsluv":[280.844497617061506,70.7618769362906761,32.9028065942714818]},"#6633aa":{"lch":[34.1795810026756612,80.2563017922262,277.366876751775067],"luv":[34.1795810026756612,10.2906460265496023,-79.5938225097975],"rgb":[0.4,0.2,0.66666666666666663],"xyz":[0.139180686031543321,0.0809481866260878,0.388607173019007712],"hpluv":[277.366876751775067,297.955725741163178,34.1795810026756612],"hsluv":[277.366876751775067,74.7463951454814293,34.1795810026756612]},"#6633bb":{"lch":[35.5578512622049701,91.2933310256451875,274.950579703742051],"luv":[35.5578512622049701,7.87828999249439477,-90.9527615663878208],"rgb":[0.4,0.2,0.733333333333333282],"xyz":[0.15631827813888,0.0878032234690225566,0.478865158117649459],"hpluv":[274.950579703742051,325.793841875348,35.5578512622049701],"hsluv":[274.950579703742051,78.1373397599298158,35.5578512622049701]},"#6633cc":{"lch":[37.0261004663704369,102.052471518039624,273.208108112313198],"luv":[37.0261004663704369,5.71114175070883,-101.892540467119574],"rgb":[0.4,0.2,0.8],"xyz":[0.175610653582601722,0.0955201736465113582,0.58047166878791967],"hpluv":[273.208108112313198,349.747708937339723,37.0261004663704369],"hsluv":[273.208108112313198,81.008127051099,37.0261004663704369]},"#6633dd":{"lch":[38.5732487885037258,112.538160698021628,271.912259810227567],"luv":[38.5732487885037258,3.75528971541350476,-112.475488051606391],"rgb":[0.4,0.2,0.866666666666666696],"xyz":[0.197128979133235266,0.104127503866764892,0.693801516687925668],"hpluv":[271.912259810227567,370.214070757058153,38.5732487885037258],"hsluv":[271.912259810227567,83.8924044294761,38.5732487885037258]},"#6633ee":{"lch":[40.1889386764538372,122.775879994578517,270.923585069715159],"luv":[40.1889386764538372,1.97901241536538453,-122.759929204537158],"rgb":[0.4,0.2,0.933333333333333348],"xyz":[0.22094115939941,0.113652375973234937,0.819212332756448891],"hpluv":[270.923585069715159,387.655406037674595,40.1889386764538372],"hsluv":[270.923585069715159,91.8481370725274502,40.1889386764538372]},"#6633ff":{"lch":[41.8636962738951581,132.796565847050772,270.152898062524457],"luv":[41.8636962738951581,0.354377123439640451,-132.796093005873018],"rgb":[0.4,0.2,1],"xyz":[0.247112207809241397,0.124120795337167633,0.957046521048230736],"hpluv":[270.152898062524457,402.521052726566381,41.8636962738951581],"hsluv":[270.152898062524457,99.9999999999993747,41.8636962738951581]},"#ddbb00":{"lch":[76.6269242453545871,86.8164471599593,69.4373142874166263],"luv":[76.6269242453545871,30.4927107526369845,81.2852390562642],"rgb":[0.866666666666666696,0.733333333333333282,0],"xyz":[0.475876739286364758,0.509140637318047595,0.0732090665375303],"hpluv":[69.4373142874166263,149.25100710879434,76.6269242453545871],"hsluv":[69.4373142874166263,100.000000000002373,76.6269242453545871]},"#ddbb11":{"lch":[76.6514577805917412,85.7837129406502754,69.2755127455160391],"luv":[76.6514577805917412,30.3566774947925779,80.2328956062352461],"rgb":[0.866666666666666696,0.733333333333333282,0.0666666666666666657],"xyz":[0.476888404786001863,0.509545303517902504,0.0785371715022859379],"hpluv":[69.2755127455160391,147.663405788509436,76.6514577805917412],"hsluv":[69.2755127455160391,98.710789014839,76.6514577805917412]},"#ddbb22":{"lch":[76.6969020797125722,83.8847347199512257,68.9672438614109353],"luv":[76.6969020797125722,30.1063672837106679,78.2959473281657523],"rgb":[0.866666666666666696,0.733333333333333282,0.133333333333333331],"xyz":[0.478763762924478919,0.510295446773293304,0.0884140576982651305],"hpluv":[68.9672438614109353,144.735860207932831,76.6969020797125722],"hsluv":[68.9672438614109353,96.3396664069398554,76.6969020797125722]},"#ddbb33":{"lch":[76.7716285455552452,80.8014056767331823,68.4347482297151828],"luv":[76.7716285455552452,29.6994133556607949,75.1452726767666093],"rgb":[0.866666666666666696,0.733333333333333282,0.2],"xyz":[0.481851513656936625,0.511530547066276431,0.104676211555876281],"hpluv":[68.4347482297151828,139.9591753538609,76.7716285455552452],"hsluv":[68.4347482297151828,92.4878111801133542,76.7716285455552452]},"#ddbb44":{"lch":[76.8793043130786771,76.4437058057830683,67.6060651816737277],"luv":[76.8793043130786771,29.122950030038453,70.6788082728408398],"rgb":[0.866666666666666696,0.733333333333333282,0.266666666666666663],"xyz":[0.486309508901155541,0.513313745163964,0.128154986508762919],"hpluv":[67.6060651816737277,133.157612926581692,76.8793043130786771],"hsluv":[67.6060651816737277,87.0382611213693167,76.8793043130786771]},"#ddbb55":{"lch":[77.0229278214451654,70.786451757311653,66.3713649049339551],"luv":[77.0229278214451654,28.3717024864450664,64.851894732620238],"rgb":[0.866666666666666696,0.733333333333333282,0.333333333333333315],"xyz":[0.492271922940517526,0.515698710779708747,0.159557033782736835],"hpluv":[66.3713649049339551,124.235507886155276,77.0229278214451654],"hsluv":[66.3713649049339551,79.9485715087726,77.0229278214451654]},"#ddbb66":{"lch":[77.2049977781888259,63.8693414267369732,64.5489675558404912],"luv":[77.2049977781888259,27.4471820183984,57.6710063509733359],"rgb":[0.866666666666666696,0.733333333333333282,0.4],"xyz":[0.499856918714025711,0.518732709089112065,0.199504678189880769],"hpluv":[64.5489675558404912,113.177180957201557,77.2049977781888259],"hsluv":[64.5489675558404912,71.2432689272834665,77.2049977781888259]},"#ddbb77":{"lch":[77.4276024714994264,55.80459657383539,61.8158033937064815],"luv":[77.4276024714994264,26.3569386858829375,49.1880552764299495],"rgb":[0.866666666666666696,0.733333333333333282,0.466666666666666674],"xyz":[0.509170931734227561,0.522458314297192916,0.248558480096278678],"hpluv":[61.8158033937064815,100.062778032150931,77.4276024714994264],"hsluv":[61.8158033937064815,61.00659046349368,77.4276024714994264]},"#ddbb88":{"lch":[77.6924726660212883,46.8021917196541537,57.5480835848938881],"luv":[77.6924726660212883,25.1136643841879952,39.4936578574539112],"rgb":[0.866666666666666696,0.733333333333333282,0.533333333333333326],"xyz":[0.520311348836171472,0.526914481137970458,0.307231343499850873],"hpluv":[57.5480835848938881,85.1204314231653285,77.6924726660212883],"hsluv":[57.5480835848938881,49.3735690170151145,77.6924726660212883]},"#ddbb99":{"lch":[78.001015952892,37.2494741955694195,50.4191367157405352],"luv":[78.001015952892,23.7341209657771088,28.7091419207933036],"rgb":[0.866666666666666696,0.733333333333333282,0.6],"xyz":[0.533368312945244116,0.532137266781599672,0.375998021140968752],"hpluv":[50.4191367157405352,68.8881727109007471,78.001015952892],"hsluv":[50.4191367157405352,37.2278198354843894,78.001015952892]},"#ddbbaa":{"lch":[78.3543411988951135,27.9779961680489,37.3601297670291643],"luv":[78.3543411988951135,22.2379488027189254,16.9776883770144309],"rgb":[0.866666666666666696,0.733333333333333282,0.66666666666666663],"xyz":[0.548426005910496728,0.538160343967700738,0.455301870757967353],"hpluv":[37.3601297670291643,52.7537881236722086,78.3543411988951135],"hsluv":[37.3601297670291643,37.9002282962103152,78.3543411988951135]},"#ddbbbb":{"lch":[78.7532777240269724,21.1216737069600953,12.1770506300632171],"luv":[78.7532777240269724,20.6464457718990104,4.45526398447083238],"rgb":[0.866666666666666696,0.733333333333333282,0.733333333333333282],"xyz":[0.565563598017833291,0.545015380810635497,0.545559855856609155],"hpluv":[12.1770506300632171,40.7192307977840144,78.7532777240269724],"hsluv":[12.1770506300632171,38.5653299871361952,78.7532777240269724]},"#ddbbcc":{"lch":[79.1983918483363425,20.8793784390591419,335.381067074864461],"luv":[79.1983918483363425,18.9814116783666442,-8.69795692664743747],"rgb":[0.866666666666666696,0.733333333333333282,0.8],"xyz":[0.584855973461555,0.552732330988124354,0.647166366526879311],"hpluv":[335.381067074864461,41.2776027841095186,79.1983918483363425],"hsluv":[335.381067074864461,39.1976988204569,79.1983918483363425]},"#ddbbdd":{"lch":[79.6900023594157858,28.2216267397768341,307.715012949250536],"luv":[79.6900023594157858,17.264138203128045,-22.325092338948604],"rgb":[0.866666666666666696,0.733333333333333282,0.866666666666666696],"xyz":[0.606374299012188644,0.56133966120837786,0.760496214426885309],"hpluv":[307.715012949250536,57.3946451248898555,79.6900023594157858],"hsluv":[307.715012949250536,39.7709084435557401,79.6900023594157858]},"#ddbbee":{"lch":[80.2281958041266,39.4567857635703447,293.154060026294076],"luv":[80.2281958041266,15.5145982189510505,-36.2785774927409221],"rgb":[0.866666666666666696,0.733333333333333282,0.933333333333333348],"xyz":[0.630186479278363354,0.570864533314847877,0.885907030495408532],"hpluv":[293.154060026294076,82.8233888781043674,80.2281958041266],"hsluv":[293.154060026294076,68.7191774169969278,80.2281958041266]},"#ddbbff":{"lch":[80.8128420975971409,52.2658591287574765,285.253756774661895],"luv":[80.8128420975971409,13.7508586713070624,-50.4245368473411],"rgb":[0.866666666666666696,0.733333333333333282,1],"xyz":[0.656357527688194775,0.581332952678780601,1.02374121878719038],"hpluv":[285.253756774661895,113.64059963508393,80.8128420975971409],"hsluv":[285.253756774661895,99.9999999999962768,80.8128420975971409]},"#664400":{"lch":[31.7142168878436834,41.7146560735594463,49.9018869072924431],"luv":[31.7142168878436834,26.8683448374877969,31.9093180282686859],"rgb":[0.4,0.266666666666666663,0],"xyz":[0.0754639898903774337,0.0695936209423669294,0.00945855895955924342],"hpluv":[49.9018869072924431,166.906788900061372,31.7142168878436834],"hsluv":[49.9018869072924431,100.000000000002103,31.7142168878436834]},"#664411":{"lch":[31.8065195391856221,38.988494662362406,47.7128576067384387],"luv":[31.8065195391856221,26.2332728657793552,28.8429906699465946],"rgb":[0.4,0.266666666666666663,0.0666666666666666657],"xyz":[0.0764756553900145519,0.0699982871422217823,0.0147866639243148749],"hpluv":[47.7128576067384387,155.546285842055198,31.8065195391856221],"hsluv":[47.7128576067384387,90.7993319288460157,31.8065195391856221]},"#664422":{"lch":[31.9766874661881033,34.3475437583520318,43.0092135947734064],"luv":[31.9766874661881033,25.116436032279772,23.4290077311931029],"rgb":[0.4,0.266666666666666663,0.133333333333333331],"xyz":[0.078351013528491581,0.0707484303976126,0.0246635501202940727],"hpluv":[43.0092135947734064,136.301783870263904,31.9766874661881033],"hsluv":[43.0092135947734064,74.6688439558526227,31.9766874661881033]},"#664433":{"lch":[32.2542649002247757,27.9288783689085562,32.9719795273007179],"luv":[32.2542649002247757,23.4305644913898661,15.1997004759998031],"rgb":[0.4,0.266666666666666663,0.2],"xyz":[0.0814387642609493145,0.0719835306905957095,0.0409257039779052159],"hpluv":[32.9719795273007179,109.876716511985933,32.2542649002247757],"hsluv":[32.9719795273007179,50.4508902462759465,32.2542649002247757]},"#664444":{"lch":[32.6494757012261942,21.7704999617243,12.1770506300622419],"luv":[32.6494757012261942,21.2806737346177428,4.59212303669972144],"rgb":[0.4,0.266666666666666663,0.266666666666666663],"xyz":[0.0858967595051681881,0.0737667287882832895,0.0644044789307918475],"hpluv":[12.1770506300622419,84.6119136876739,32.6494757012261942],"hsluv":[12.1770506300622419,19.8271939783404392,32.6494757012261942]},"#664455":{"lch":[33.1682230288457163,20.3425996427482829,337.72581918360828],"luv":[33.1682230288457163,18.8246474429619,-7.71064257201243208],"rgb":[0.4,0.266666666666666663,0.333333333333333315],"xyz":[0.0918591735445301871,0.0761516944040281224,0.0958065262047657629],"hpluv":[337.72581918360828,77.8257963773028649,33.1682230288457163],"hsluv":[337.72581918360828,26.9902218950403885,33.1682230288457163]},"#664466":{"lch":[33.8127168447387447,26.5268160416637819,307.715012949245931],"luv":[33.8127168447387447,16.2273642995468066,-20.9843898457416387],"rgb":[0.4,0.266666666666666663,0.4],"xyz":[0.0994441693180383585,0.0791856927134314409,0.135754170611909725],"hpluv":[307.715012949245931,99.5507152142919125,33.8127168447387447],"hsluv":[307.715012949245931,34.4415155187259359,33.8127168447387447]},"#664477":{"lch":[34.5819879544663067,37.1994974310500766,291.489286484323088],"luv":[34.5819879544663067,13.6271894146704895,-34.6136146303646512],"rgb":[0.4,0.266666666666666663,0.466666666666666674],"xyz":[0.108758182338240278,0.0829112979215122503,0.184807972518307634],"hpluv":[291.489286484323088,136.49804898345451,34.5819879544663067],"hsluv":[291.489286484323088,41.7425383187140824,34.5819879544663067]},"#664488":{"lch":[35.4724176022540263,49.4256461635840623,283.003444619748336],"luv":[35.4724176022540263,11.1212465051830698,-48.1582015326441066],"rgb":[0.4,0.266666666666666663,0.533333333333333326],"xyz":[0.119898599440184106,0.0873674647622898481,0.243480835921879801],"hpluv":[283.003444619748336,176.807585609029246,35.4724176022540263],"hsluv":[283.003444619748336,48.5905204317402166,35.4724176022540263]},"#664499":{"lch":[36.4782980897457563,61.9753280698008169,278.131406705371774],"luv":[36.4782980897457563,8.76603164871553453,-61.3522450974139844],"rgb":[0.4,0.266666666666666663,0.6],"xyz":[0.132955563549256806,0.092590250405919,0.312247513562997736],"hpluv":[278.131406705371774,215.5875082467536,36.4782980897457563],"hsluv":[278.131406705371774,54.8155424382278511,36.4782980897457563]},"#6644aa":{"lch":[37.5923984663849922,74.3597011725147468,275.081334091822],"luv":[37.5923984663849922,6.58602388672208239,-74.0674655150911576],"rgb":[0.4,0.266666666666666663,0.66666666666666663],"xyz":[0.148013256514509361,0.0986133275920201,0.391551363179996281],"hpluv":[275.081334091822,251.001852587777108,37.5923984663849922],"hsluv":[275.081334091822,60.3520360208115179,37.5923984663849922]},"#6644bb":{"lch":[38.8064988843830392,86.3901107279874765,273.04172423936518],"luv":[38.8064988843830392,4.58413310153298603,-86.2684006766171905],"rgb":[0.4,0.266666666666666663,0.733333333333333282],"xyz":[0.165150848621846,0.105468364434954859,0.481809348278638083],"hpluv":[273.04172423936518,282.487278503057098,38.8064988843830392],"hsluv":[273.04172423936518,65.2044789549227346,38.8064988843830392]},"#6644cc":{"lch":[40.1118623747323184,98.0126069922284415,271.608181870646],"luv":[40.1118623747323184,2.75066337520804938,-97.9740015535209],"rgb":[0.4,0.266666666666666663,0.8],"xyz":[0.184443224065567735,0.11318531461244366,0.583415858948908239],"hpluv":[271.608181870646,310.061926380003911,40.1118623747323184],"hsluv":[271.608181870646,73.249037078124374,40.1118623747323184]},"#6644dd":{"lch":[41.4996246628331491,109.23540368219534,270.561113733160255],"luv":[41.4996246628331491,1.06975602599714947,-109.230165429047204],"rgb":[0.4,0.266666666666666663,0.866666666666666696],"xyz":[0.205961549616201278,0.121792644832697194,0.696745706848914237],"hpluv":[270.561113733160255,334.009312605211903,41.4996246628331491],"hsluv":[270.561113733160255,82.0982912580276434,41.4996246628331491]},"#6644ee":{"lch":[42.9610953823040305,120.093362966476874,269.772657810053431],"luv":[42.9610953823040305,-0.476513570908160711,-120.092417593346411],"rgb":[0.4,0.266666666666666663,0.933333333333333348],"xyz":[0.229773729882376043,0.131317516939167239,0.82215652291743746],"hpluv":[269.772657810053431,354.717803858999673,42.9610953823040305],"hsluv":[269.772657810053431,90.971694410809846,42.9610953823040305]},"#6644ff":{"lch":[44.4879743720372502,130.630057251556309,269.16406595263021],"luv":[44.4879743720372502,-1.90579898569535566,-130.61615439053088],"rgb":[0.4,0.266666666666666663,1],"xyz":[0.255944778292207409,0.141785936303099935,0.959990711209219305],"hpluv":[269.16406595263021,372.597392941492103,44.4879743720372502],"hsluv":[269.16406595263021,99.9999999999993463,44.4879743720372502]},"#ddcc00":{"lch":[81.0484811072975475,89.5621409057231119,78.2088923998372394],"luv":[81.0484811072975475,18.3014975440108643,87.6723004789036224],"rgb":[0.866666666666666696,0.8,0],"xyz":[0.514100482595981623,0.585588123937282434,0.0859503143074022424],"hpluv":[78.2088923998372394,197.564965691755532,81.0484811072975475],"hsluv":[78.2088923998372394,100.000000000002245,81.0484811072975475]},"#ddcc11":{"lch":[81.070830830397739,88.588371741804238,78.1407504993947413],"luv":[81.070830830397739,18.2056357525625714,86.6974880530521261],"rgb":[0.866666666666666696,0.8,0.0666666666666666657],"xyz":[0.515112148095618783,0.585992790137137343,0.0912784192721578791],"hpluv":[78.1407504993947413,195.686226016320433,81.070830830397739],"hsluv":[78.1407504993947413,98.8754134531589699,81.070830830397739]},"#ddcc22":{"lch":[81.1122340585289265,86.7947856050049751,78.0111959233441894],"luv":[81.1122340585289265,18.0290607078827385,84.9016358983162149],"rgb":[0.866666666666666696,0.8,0.133333333333333331],"xyz":[0.516987506234095728,0.586742933392528143,0.101155305468137072],"hpluv":[78.0111959233441894,192.214732219338657,81.1122340585289265],"hsluv":[78.0111959233441894,96.8049917221618443,81.1122340585289265]},"#ddcc33":{"lch":[81.1803270736657367,83.8738846457710139,77.7882255314295747],"luv":[81.1803270736657367,17.7414783140301893,81.9760237679585089],"rgb":[0.866666666666666696,0.8,0.2],"xyz":[0.520075256966553545,0.58797803368551127,0.117417459325748208],"hpluv":[77.7882255314295747,186.530107062901806,81.1803270736657367],"hsluv":[77.7882255314295747,93.4358723678778631,81.1803270736657367]},"#ddcc44":{"lch":[81.2784695635313312,79.7261575767135469,77.443216014682],"luv":[81.2784695635313312,17.3330313363216426,77.8191893214074213],"rgb":[0.866666666666666696,0.8,0.266666666666666663],"xyz":[0.524533252210772405,0.589761231783198836,0.140896234278634847],"hpluv":[77.443216014682,178.389435414851135,81.2784695635313312],"hsluv":[77.443216014682,88.6570950843060643,81.2784695635313312]},"#ddcc55":{"lch":[81.4094229919429893,74.303525235023784,76.9333685993953509],"luv":[81.4094229919429893,16.7988406729037365,72.37964364652683],"rgb":[0.866666666666666696,0.8,0.333333333333333315],"xyz":[0.530495666250134335,0.592146197398943586,0.172298281552608762],"hpluv":[76.9333685993953509,167.620308244181615,81.4094229919429893],"hsluv":[76.9333685993953509,82.4185745103993668,81.4094229919429893]},"#ddcc66":{"lch":[81.5755062452221154,67.6049359495878406,76.1891492108976252],"luv":[81.5755062452221154,16.1384724175358123,65.6504156329288548],"rgb":[0.866666666666666696,0.8,0.4],"xyz":[0.538080662023642575,0.595180195708346904,0.212245925959752724],"hpluv":[76.1891492108976252,154.10859642349061,81.5755062452221154],"hsluv":[76.1891492108976252,74.724981631947216,81.5755062452221154]},"#ddcc77":{"lch":[81.7786782860545571,59.6741108071854,75.0887439649445554],"luv":[81.7786782860545571,15.3554995822328237,57.6646176889111857],"rgb":[0.866666666666666696,0.8,0.466666666666666674],"xyz":[0.547394675043844425,0.598905800916427755,0.261299727866150633],"hpluv":[75.0887439649445554,137.792143148878608,81.7786782860545571],"hsluv":[75.0887439649445554,65.6305091544174104,81.7786782860545571]},"#ddcc88":{"lch":[82.020587165389415,50.599662209211,73.3985048227604722],"luv":[82.020587165389415,14.4570002873895778,48.4904213054152891],"rgb":[0.866666666666666696,0.8,0.533333333333333326],"xyz":[0.558535092145788337,0.603361967757205298,0.319972591269722773],"hpluv":[73.3985048227604722,118.661765286999071,82.020587165389415],"hsluv":[73.3985048227604722,55.2326761810852389,82.020587165389415]},"#ddcc99":{"lch":[82.3026016456871901,40.5232855707982438,70.6109505258247765],"luv":[82.3026016456871901,13.4529549720920478,38.2250529884698622],"rgb":[0.866666666666666696,0.8,0.6],"xyz":[0.571592056254861,0.608584753400834511,0.388739268910840707],"hpluv":[70.6109505258247765,96.7842051030752231,82.3026016456871901],"hsluv":[70.6109505258247765,43.6647666281718685,82.3026016456871901]},"#ddccaa":{"lch":[82.6258332993788542,29.6818113573176419,65.4008685536862231],"luv":[82.6258332993788542,12.3555588351715961,26.9879619705157374],"rgb":[0.866666666666666696,0.8,0.66666666666666663],"xyz":[0.586649749220113592,0.614607830586935577,0.468043118527839308],"hpluv":[65.4008685536862231,72.4135107626852,82.6258332993788542],"hsluv":[65.4008685536862231,31.0871436920773085,82.6258332993788542]},"#ddccbb":{"lch":[82.9911533066729419,18.6379527757414252,53.1465475992889],"luv":[82.9911533066729419,11.1784915779275345,14.9135713265793797],"rgb":[0.866666666666666696,0.8,0.733333333333333282],"xyz":[0.603787341327450156,0.621462867429870336,0.55830110362648111],"hpluv":[53.1465475992889,46.5946179098545272,82.9911533066729419],"hsluv":[53.1465475992889,24.678645774572626,82.9911533066729419]},"#ddcccc":{"lch":[83.3992063850657,10.164901186858037,12.1770506300648638],"luv":[83.3992063850657,9.93619558955776228,2.14411598208697862],"rgb":[0.866666666666666696,0.8,0.8],"xyz":[0.62307971677117191,0.629179817607359193,0.659907614296751266],"hpluv":[12.1770506300648638,26.1289592314662436,83.3992063850657],"hsluv":[12.1770506300648638,25.0002112827592455,83.3992063850657]},"#ddccdd":{"lch":[83.8504233095379163,14.1290270468723165,307.715012949259346],"luv":[83.8504233095379163,8.64321103323171513,-11.1769543403501022],"rgb":[0.866666666666666696,0.8,0.866666666666666696],"xyz":[0.644598042321805509,0.637787147827612699,0.773237462196757264],"hpluv":[307.715012949259346,37.4791950150616557,83.8504233095379163],"hsluv":[307.715012949259346,25.214872966603707,83.8504233095379163]},"#ddccee":{"lch":[84.3450329093034,25.9620569722210597,286.361909425528779],"luv":[84.3450329093034,7.31360586969829818,-24.9106316943502399],"rgb":[0.866666666666666696,0.8,0.933333333333333348],"xyz":[0.668410222587980218,0.647312019934082716,0.898648278265280487],"hpluv":[286.361909425528779,71.3464154396222199,84.3450329093034],"hsluv":[286.361909425528779,60.879598082714125,84.3450329093034]},"#ddccff":{"lch":[84.8830740665913623,39.380529428060008,278.705583312848262],"luv":[84.8830740665913623,5.96052452183370107,-38.926831947371717],"rgb":[0.866666666666666696,0.8,1],"xyz":[0.694581270997811639,0.65778043929801544,1.03648246655706222],"hpluv":[278.705583312848262,112.590543218900592,84.8830740665913623],"hsluv":[278.705583312848262,99.9999999999947704,84.8830740665913623]},"#665500":{"lch":[36.5970311204425656,41.5054710368830655,69.2006364019199651],"luv":[36.5970311204425656,14.7384507745119784,38.800543743107859],"rgb":[0.4,0.333333333333333315,0],"xyz":[0.0872772466047234,0.0932201343710592,0.0133963111976744542],"hpluv":[69.2006364019199651,143.912599562803223,36.5970311204425656],"hsluv":[69.2006364019199651,100.000000000002359,36.5970311204425656]},"#665511":{"lch":[36.673028710438345,38.8606023214232366,68.2658014049057869],"luv":[36.673028710438345,14.3901304021596417,36.0980686435250391],"rgb":[0.4,0.333333333333333315,0.0666666666666666657],"xyz":[0.0882889121043605174,0.0936248005709140463,0.0187244161624300839],"hpluv":[68.2658014049057869,134.462776824764262,36.673028710438345],"hsluv":[68.2658014049057869,93.0449405246809107,36.673028710438345]},"#665522":{"lch":[36.8133307706753357,34.1687527519613923,66.2355675996872719],"luv":[36.8133307706753357,13.769229594380441,31.2715842419585037],"rgb":[0.4,0.333333333333333315,0.133333333333333331],"xyz":[0.0901642702428375464,0.0943749438263048607,0.0286013023584092835],"hpluv":[66.2355675996872719,117.777773408929676,36.8133307706753357],"hsluv":[66.2355675996872719,80.6853283069105629,36.8133307706753357]},"#665533":{"lch":[37.0427251812615097,27.0303271109949854,61.7081001991288645],"luv":[37.0427251812615097,12.8113945713483854,23.8014023297917383],"rgb":[0.4,0.333333333333333315,0.2],"xyz":[0.09325202097529528,0.0956100441192879735,0.0448634562160204267],"hpluv":[61.7081001991288645,92.5950345984193177,37.0427251812615097],"hsluv":[61.7081001991288645,61.7209513910547045,37.0427251812615097]},"#665544":{"lch":[37.3704580906404473,18.1024774089589755,50.3425610862832542],"luv":[37.3704580906404473,11.5529306171195891,13.9366237840407656],"rgb":[0.4,0.333333333333333315,0.266666666666666663],"xyz":[0.0977100162195141536,0.0973932422169755535,0.0683422311689070583],"hpluv":[50.3425610862832542,61.4679768710498351,37.3704580906404473],"hsluv":[50.3425610862832542,37.0117339514184067,37.3704580906404473]},"#665555":{"lch":[37.8025949068387348,10.2943047784276782,12.1770506300631105],"luv":[37.8025949068387348,10.0626876598879917,2.1714115065313786],"rgb":[0.4,0.333333333333333315,0.333333333333333315],"xyz":[0.103672430258876153,0.0997782078327203864,0.0997442784428809737],"hpluv":[12.1770506300631105,34.5553054430909654,37.8025949068387348],"hsluv":[12.1770506300631105,8.09737912949257321,37.8025949068387348]},"#665566":{"lch":[38.3424918197480693,13.7697499972876347,307.715012949250308],"luv":[38.3424918197480693,8.42342892447929,-10.8927434626015351],"rgb":[0.4,0.333333333333333315,0.4],"xyz":[0.111257426032384324,0.102812206142123705,0.139691922850024935],"hpluv":[307.715012949250308,45.570631638882567,38.3424918197480693],"hsluv":[307.715012949250308,15.7660506346962208,38.3424918197480693]},"#665577":{"lch":[38.9911218270375812,25.5692820710091411,285.225395910208761],"luv":[38.9911218270375812,6.71492531026355,-24.671805035392353],"rgb":[0.4,0.333333333333333315,0.466666666666666674],"xyz":[0.120571439052586243,0.106537811350204514,0.188745724756422845],"hpluv":[285.225395910208761,83.2131821356252885,38.9911218270375812],"hsluv":[285.225395910208761,23.5948697041559434,38.9911218270375812]},"#665588":{"lch":[39.7473800461840554,39.003702064123587,277.369365694294345],"luv":[39.7473800461840554,5.00282395952989312,-38.6815269493963],"rgb":[0.4,0.333333333333333315,0.533333333333333326],"xyz":[0.131711856154530071,0.110993978190982112,0.247418588159995],"hpluv":[277.369365694294345,124.519293959659265,39.7473800461840554],"hsluv":[277.369365694294345,31.2388068533835614,39.7473800461840554]},"#665599":{"lch":[40.6084045881889466,52.6763518020623636,273.629018089310307],"luv":[40.6084045881889466,3.33420095564239061,-52.5707251534733189],"rgb":[0.4,0.333333333333333315,0.6],"xyz":[0.144768820263602771,0.11621676383461127,0.316185265801112947],"hpluv":[273.629018089310307,164.603508765513965,40.6084045881889466],"hsluv":[273.629018089310307,39.2894117268144569,40.6084045881889466]},"#6655aa":{"lch":[41.5699140891343575,66.1399121177165,271.505962745252077],"luv":[41.5699140891343575,1.73822184255944534,-66.1170670838121168],"rgb":[0.4,0.333333333333333315,0.66666666666666663],"xyz":[0.159826513228855327,0.122239841020712364,0.395489115418111492],"hpluv":[271.505962745252077,201.894186201954597,41.5699140891343575],"hsluv":[271.505962745252077,49.6682832978127067,41.5699140891343575]},"#6655bb":{"lch":[42.6265484117568647,79.2031960637105499,270.166039680829499],"luv":[42.6265484117568647,0.229525718995523903,-79.2028634876978],"rgb":[0.4,0.333333333333333315,0.733333333333333282],"xyz":[0.176964105336191974,0.129094877863647123,0.485747100516753294],"hpluv":[270.166039680829499,235.777232293519603,42.6265484117568647],"hsluv":[270.166039680829499,59.8653820834470309,42.6265484117568647]},"#6655cc":{"lch":[43.7721949853351333,91.7929775852419,269.258674658723919],"luv":[43.7721949853351333,-1.18763654850412936,-91.7852943199147688],"rgb":[0.4,0.333333333333333315,0.8],"xyz":[0.1962564807799137,0.136811828041135924,0.58735361118702345],"hpluv":[269.258674658723919,266.103421792879146,43.7721949853351333],"hsluv":[269.258674658723919,69.9112236392489734,43.7721949853351333]},"#6655dd":{"lch":[45.0002850881211458,103.899953671233533,268.61259940679895],"luv":[45.0002850881211458,-2.51566121975990953,-103.869494181457682],"rgb":[0.4,0.333333333333333315,0.866666666666666696],"xyz":[0.217774806330547244,0.145419158261389458,0.700683459087029448],"hpluv":[268.61259940679895,292.98097185143456,45.0002850881211458],"hsluv":[268.61259940679895,79.8793625185682714,45.0002850881211458]},"#6655ee":{"lch":[46.3040490971424106,115.549020689755764,268.134901078425969],"luv":[46.3040490971424106,-3.7607010001107648,-115.487805894602445],"rgb":[0.4,0.333333333333333315,0.933333333333333348],"xyz":[0.241586986596722,0.154944030367859503,0.826094275155552671],"hpluv":[268.134901078425969,316.655201018988919,46.3040490971424106],"hsluv":[268.134901078425969,89.8701820385079344,46.3040490971424106]},"#6655ff":{"lch":[47.6767252326213651,126.781348408818275,267.771145841725911],"luv":[47.6767252326213651,-4.93065761335473951,-126.685432942615918],"rgb":[0.4,0.333333333333333315,1],"xyz":[0.267758035006553374,0.165412449731792199,0.963928463447334516],"hpluv":[267.771145841725911,337.433561350206048,47.6767252326213651],"hsluv":[267.771145841725911,99.9999999999992468,47.6767252326213651]},"#dddd00":{"lch":[85.547159878993142,94.3072427966830844,85.8743202181747449],"luv":[85.547159878993142,6.78488618903739749,94.0628585750738466],"rgb":[0.866666666666666696,0.866666666666666696,0],"xyz":[0.556734473143156827,0.670856105031634,0.100161644489793561],"hpluv":[85.8743202181747449,283.614606809988061,85.547159878993142],"hsluv":[85.8743202181747449,100.000000000002203,85.547159878993142]},"#dddd11":{"lch":[85.5675738163798627,93.4011806547303394,85.8743202181746881],"luv":[85.5675738163798627,6.71970001318247423,93.159144368282],"rgb":[0.866666666666666696,0.866666666666666696,0.0666666666666666657],"xyz":[0.557746138642794,0.671260771231488862,0.105489749454549198],"hpluv":[85.8743202181746881,281.335749103468061,85.5675738163798627],"hsluv":[85.8743202181746881,99.0156164862488,85.5675738163798627]},"#dddd22":{"lch":[85.6053941241358558,91.7307060091609401,85.8743202181746739],"luv":[85.6053941241358558,6.59951857201479086,91.4929985275198447],"rgb":[0.866666666666666696,0.866666666666666696,0.133333333333333331],"xyz":[0.559621496781270933,0.672010914486879662,0.11536663565052839],"hpluv":[85.8743202181746739,277.118842420723468,85.6053941241358558],"hsluv":[85.8743202181746739,97.2017654403352083,85.6053941241358558]},"#dddd33":{"lch":[85.667603455332241,89.0058006932873,85.8743202181745602],"luv":[85.667603455332241,6.4034766573555908,88.775154428206335],"rgb":[0.866666666666666696,0.866666666666666696,0.2],"xyz":[0.56270924751372875,0.673246014779862789,0.131628789508139526],"hpluv":[85.8743202181745602,270.196330508983522,85.667603455332241],"hsluv":[85.8743202181745602,94.2458512979473113,85.667603455332241]},"#dddd44":{"lch":[85.7572852094861418,85.1265937151141117,85.8743202181744607],"luv":[85.7572852094861418,6.12438910193468278,84.9059998802570419],"rgb":[0.866666666666666696,0.866666666666666696,0.266666666666666663],"xyz":[0.567167242757947609,0.675029212877550355,0.155107564461026165],"hpluv":[85.8743202181744607,260.24482525674506,85.7572852094861418],"hsluv":[85.8743202181744607,90.0440000232135844,85.7572852094861418]},"#dddd55":{"lch":[85.8769849033878074,80.0369945631262,85.874320218174276],"luv":[85.8769849033878074,5.75822050268421481,79.8295897229865545],"rgb":[0.866666666666666696,0.866666666666666696,0.333333333333333315],"xyz":[0.573129656797309539,0.677414178493295105,0.18650961173500008],"hpluv":[85.874320218174276,247.008869171162701,85.8769849033878074],"hsluv":[85.874320218174276,84.5423921226573327,85.8769849033878074]},"#dddd66":{"lch":[86.0288537292730098,73.7198014533942398,85.8743202181739775],"luv":[86.0288537292730098,5.30373328608645522,73.5287667485177252],"rgb":[0.866666666666666696,0.866666666666666696,0.4],"xyz":[0.58071465257081778,0.680448176802698423,0.226457256142144042],"hpluv":[85.8743202181739775,230.281095596483937,86.0288537292730098],"hsluv":[85.8743202181739775,77.7321300368988,86.0288537292730098]},"#dddd77":{"lch":[86.2147251389940834,66.1931358813644124,85.8743202181736365],"luv":[86.2147251389940834,4.76223119383214133,66.0216054929389315],"rgb":[0.866666666666666696,0.866666666666666696,0.466666666666666674],"xyz":[0.59002866559101963,0.684173782010779274,0.275511058048541924],"hpluv":[85.8743202181736365,209.886373280136951,86.2147251389940834],"hsluv":[85.8743202181736365,69.6453389130317362,86.2147251389940834]},"#dddd88":{"lch":[86.4361603707972,57.5066396271378224,85.8743202181730823],"luv":[86.4361603707972,4.13728567831694072,57.3576190965201391],"rgb":[0.866666666666666696,0.866666666666666696,0.533333333333333326],"xyz":[0.601169082692963541,0.688629948851556817,0.334183921452114119],"hpluv":[85.8743202181730823,185.665493576193455,86.4361603707972],"hsluv":[85.8743202181730823,60.3508056243124429,86.4361603707972]},"#dddd99":{"lch":[86.6944777431662,47.7369558995854888,85.8743202181722154],"luv":[86.6944777431662,3.43441079587341314,47.613252157820078],"rgb":[0.866666666666666696,0.866666666666666696,0.6],"xyz":[0.614226046802036185,0.693852734495186,0.402950599093232054],"hpluv":[85.8743202181722154,157.456397081560084,86.6944777431662],"hsluv":[85.8743202181722154,49.9486591868920939,86.6944777431662]},"#ddddaa":{"lch":[86.990772885999732,36.9824894935128,85.874320218170638],"luv":[86.990772885999732,2.66068622896724838,36.886654469181245],"rgb":[0.866666666666666696,0.866666666666666696,0.66666666666666663],"xyz":[0.629283739767288797,0.699875811681287097,0.482254448710230599],"hpluv":[85.874320218170638,125.071764704863014,86.990772885999732],"hsluv":[85.874320218170638,38.5641267001819443,86.990772885999732]},"#ddddbb":{"lch":[87.3259337660435477,25.3576808227713499,85.8743202181676821],"luv":[87.3259337660435477,1.82434533444747116,25.2919698878957568],"rgb":[0.866666666666666696,0.866666666666666696,0.733333333333333282],"xyz":[0.64642133187462536,0.706730848524221855,0.572512433808872401],"hpluv":[85.8743202181676821,88.2719508819342735,87.3259337660435477],"hsluv":[85.8743202181676821,26.340671416181145,87.3259337660435477]},"#ddddcc":{"lch":[87.7006527393466797,12.9871390430395461,85.8743202181585445],"luv":[87.7006527393466797,0.934353054076054512,12.9534846621895881],"rgb":[0.866666666666666696,0.866666666666666696,0.8],"xyz":[0.665713707318347114,0.714447798701710712,0.674118944479142557],"hpluv":[85.8743202181585445,46.7319159493201113,87.7006527393466797],"hsluv":[85.8743202181585445,13.4329442518860063,87.7006527393466797]},"#dddddd":{"lch":[88.1154369871094,4.67545248961294327e-12,0],"luv":[88.1154369871094,4.4193702762792188e-12,1.52611347670073729e-12],"rgb":[0.866666666666666696,0.866666666666666696,0.866666666666666696],"xyz":[0.687232032868980713,0.723055128921964219,0.787448792379148554],"hpluv":[0,1.74708563976297451e-11,88.1154369871094],"hsluv":[0,1.74437740136320375e-11,88.1154369871094]},"#ddddee":{"lch":[88.5706181797242209,13.4751686036456029,265.874320218195521],"luv":[88.5706181797242209,-0.969464090371862097,-13.4402495614536726],"rgb":[0.866666666666666696,0.866666666666666696,0.933333333333333348],"xyz":[0.711044213135155423,0.732580001028434236,0.912859608447671778],"hpluv":[265.874320218195521,52.5550848411252431,88.5706181797242209],"hsluv":[265.874320218195521,47.1269490590101725,88.5706181797242209]},"#ddddff":{"lch":[89.0663618949558753,27.3146757005029208,265.874320218186369],"luv":[89.0663618949558753,-1.9651403266809826,-27.2438934831293338],"rgb":[0.866666666666666696,0.866666666666666696,1],"xyz":[0.737215261544986844,0.743048420392367,1.05069379673945362],"hpluv":[265.874320218186369,111.815120511018762,89.0663618949558753],"hsluv":[265.874320218186369,99.9999999999922125,89.0663618949558753]},"#666600":{"lch":[41.7321583215394583,46.0055575524193685,85.8743202181747449],"luv":[41.7321583215394583,3.30984623025532709,45.8863404908370924],"rgb":[0.4,0.4,0],"xyz":[0.102305304310569861,0.123276249782752534,0.0184056637662898],"hpluv":[85.8743202181747449,139.887458074797365,41.7321583215394583],"hsluv":[85.8743202181747449,100.000000000002203,41.7321583215394583]},"#666611":{"lch":[41.7952597887023742,43.6298127640598423,85.8743202181746],"luv":[41.7952597887023742,3.13892449057558931,43.5167521176544625],"rgb":[0.4,0.4,0.0666666666666666657],"xyz":[0.103316969810206979,0.123680915982607387,0.0237337687310454348],"hpluv":[85.8743202181746,132.463323325332908,41.7952597887023742],"hsluv":[85.8743202181746,94.6927802880713756,41.7952597887023742]},"#666622":{"lch":[41.9118699845736913,39.3503176022612067,85.874320218174276],"luv":[41.9118699845736913,2.83103840719259514,39.248346677737],"rgb":[0.4,0.4,0.133333333333333331],"xyz":[0.105192327948684008,0.124431059237998201,0.0336106549270246274],"hpluv":[85.874320218174276,119.138061739500813,41.9118699845736913],"hsluv":[85.874320218174276,85.1670788640685288,41.9118699845736913]},"#666633":{"lch":[42.1028501842444953,32.6344620115447057,85.8743202181736507],"luv":[42.1028501842444953,2.34786962297492563,32.5498943011565842],"rgb":[0.4,0.4,0.2],"xyz":[0.108280078681141742,0.125666159530981314,0.0498728087846357776],"hpluv":[85.8743202181736507,98.3567766096709306,42.1028501842444953],"hsluv":[85.8743202181736507,70.3113616926845,42.1028501842444953]},"#666644":{"lch":[42.3763861696741557,23.5947988734222314,85.8743202181723575],"luv":[42.3763861696741557,1.69751569722617934,23.5336562041455402],"rgb":[0.4,0.4,0.266666666666666663],"xyz":[0.112738073925360616,0.127449357628668908,0.0733515837375224161],"hpluv":[85.8743202181723575,70.6531759312171346,42.3763861696741557],"hsluv":[85.8743202181723575,50.5071554688203506,42.3763861696741557]},"#666655":{"lch":[42.7382714661199543,12.562340839470254,85.87432021816781],"luv":[42.7382714661199543,0.903791165304248856,12.5297872646162745],"rgb":[0.4,0.4,0.333333333333333315],"xyz":[0.118700487964722615,0.129834323244413741,0.104753631011496318],"hpluv":[85.87432021816781,37.2986356199978459,42.7382714661199543],"hsluv":[85.87432021816781,26.6633164497530721,42.7382714661199543]},"#666666":{"lch":[43.1922895629847048,2.27708065554704512e-12,0],"luv":[43.1922895629847048,2.15069538500574498e-12,7.48067960001998255e-13],"rgb":[0.4,0.4,0.4],"xyz":[0.126285483738230786,0.132868321553817031,0.144701275418640279],"hpluv":[0,6.68977504875838914e-12,43.1922895629847048],"hsluv":[0,1.91542116883063395e-12,43.1922895629847048]},"#666677":{"lch":[43.7404449074606489,13.5883126365404472,265.874320218186085],"luv":[43.7404449074606489,-0.977604179760566572,-13.5531003971814314],"rgb":[0.4,0.4,0.466666666666666674],"xyz":[0.135599496758432692,0.136593926761897855,0.193755077325038189],"hpluv":[265.874320218186085,39.4204575510779804,43.7404449074606489],"hsluv":[265.874320218186085,10.3527957183817456,43.7404449074606489]},"#666688":{"lch":[44.3831523723879684,27.7327571842679852,265.874320218181708],"luv":[44.3831523723879684,-1.9952189844931838,-27.660891566352042],"rgb":[0.4,0.4,0.533333333333333326],"xyz":[0.146739913860376547,0.141050093602675453,0.252427940728610356],"hpluv":[265.874320218181708,79.2892354857961692,44.3831523723879684],"hsluv":[265.874320218181708,21.2254167484079588,44.3831523723879684]},"#666699":{"lch":[45.1194249231942308,42.0446421145154,265.87432021818023],"luv":[45.1194249231942308,-3.02488020162380478,-41.9356892193690598],"rgb":[0.4,0.4,0.6],"xyz":[0.159796877969449247,0.14627287924630461,0.321194618369728291],"hpluv":[265.87432021818023,118.245992523098394,45.1194249231942308],"hsluv":[265.87432021818023,32.3647541960069702,45.1194249231942308]},"#6666aa":{"lch":[45.9470714788517682,56.2348015337582652,265.874320218179548],"luv":[45.9470714788517682,-4.04578393932889835,-56.0890767962662125],"rgb":[0.4,0.4,0.66666666666666663],"xyz":[0.174854570934701803,0.152295956432405705,0.400498467986726892],"hpluv":[265.874320218179548,155.305436018888514,45.9470714788517682],"hsluv":[265.874320218179548,43.5990379455573205,45.9470714788517682]},"#6666bb":{"lch":[46.8629040956598786,70.1103551977131,265.874320218179093],"luv":[46.8629040956598786,-5.04405352741049562,-69.9286738753289541],"rgb":[0.4,0.4,0.733333333333333282],"xyz":[0.191992163042038422,0.159150993275340463,0.490756453085368638],"hpluv":[265.874320218179093,189.841997809706953,46.8629040956598786],"hsluv":[265.874320218179093,54.8353857399755285,46.8629040956598786]},"#6666cc":{"lch":[47.8629477245616854,83.5592716582008,265.874320218178866],"luv":[47.8629477245616854,-6.01162892081844,-83.3427393224351505],"rgb":[0.4,0.4,0.8],"xyz":[0.211284538485760176,0.166867943452829265,0.592362963755638794],"hpluv":[265.874320218178866,221.531011478982748,47.8629477245616854],"hsluv":[265.874320218178866,66.0482344892977693,47.8629477245616854]},"#6666dd":{"lch":[48.9426439028117102,96.5306872715973583,265.874320218178696],"luv":[48.9426439028117102,-6.94485076081307,-96.2805413000828736],"rgb":[0.4,0.4,0.866666666666666696],"xyz":[0.23280286403639372,0.175475273673082799,0.705692811655644792],"hpluv":[265.874320218178696,250.274901054084751,48.9426439028117102],"hsluv":[265.874320218178696,77.2646968282616911,48.9426439028117102]},"#6666ee":{"lch":[50.0970402589656203,109.016062738443594,265.874320218178525],"luv":[50.0970402589656203,-7.84310469187671711,-108.73356263723052],"rgb":[0.4,0.4,0.933333333333333348],"xyz":[0.256615044302568429,0.185000145779552844,0.831103627724168],"hpluv":[265.874320218178525,276.132643737939816,50.0970402589656203],"hsluv":[265.874320218178525,88.5507283896609181,50.0970402589656203]},"#6666ff":{"lch":[51.3209595583197142,121.033610519319112,265.874320218178411],"luv":[51.3209595583197142,-8.70770100014002502,-120.719968599376287],"rgb":[0.4,0.4,1],"xyz":[0.28278609271239985,0.19546856514348554,0.96893781601594986],"hpluv":[265.874320218178411,299.261292593223402,51.3209595583197142],"hsluv":[265.874320218178411,99.9999999999991616,51.3209595583197142]},"#ddee00":{"lch":[90.1008574130140261,100.518542770188731,92.3281002120423295],"luv":[90.1008574130140261,-4.08324753875312307,100.435574027231638],"rgb":[0.866666666666666696,0.933333333333333348,0],"xyz":[0.603913249483671644,0.765213657712664919,0.115887903269964759],"hpluv":[92.3281002120423295,458.324419080212692,90.1008574130140261],"hsluv":[92.3281002120423295,100.000000000002288,90.1008574130140261]},"#ddee11":{"lch":[90.1195571422023676,99.6821059706602739,92.3717344777628284],"luv":[90.1195571422023676,-4.12512016496088219,99.5967149778072667],"rgb":[0.866666666666666696,0.933333333333333348,0.0666666666666666657],"xyz":[0.604924914983308804,0.765618323912519827,0.121216008234720396],"hpluv":[92.3717344777628284,455.439701471196656,90.1195571422023676],"hsluv":[92.3717344777628284,99.1349582088955827,90.1195571422023676]},"#ddee22":{"lch":[90.1542040339558213,98.139145338163118,92.4541942657322409],"luv":[90.1542040339558213,-4.20238430415396635,98.0491295925940562],"rgb":[0.866666666666666696,0.933333333333333348,0.133333333333333331],"xyz":[0.606800273121785749,0.766368467167910628,0.131092894430699575],"hpluv":[92.4541942657322409,450.094002053356689,90.1542040339558213],"hsluv":[92.4541942657322409,97.539848527320828,90.1542040339558213]},"#ddee33":{"lch":[90.2112004280082402,95.6198982889531237,92.5945991605726562],"luv":[90.2112004280082402,-4.32860020636881337,95.5218727257959728],"rgb":[0.866666666666666696,0.933333333333333348,0.2],"xyz":[0.609888023854243566,0.767603567460893754,0.147355048288310725],"hpluv":[92.5945991605726562,441.296742170845221,90.2112004280082402],"hsluv":[92.5945991605726562,94.9371734060285348,90.2112004280082402]},"#ddee44":{"lch":[90.2933822328294582,92.028546743238266,92.808164678773025],"luv":[90.2933822328294582,-4.50867173729536486,91.9180357429253689],"rgb":[0.866666666666666696,0.933333333333333348,0.266666666666666663],"xyz":[0.614346019098462426,0.76938676555858132,0.170833823241197363],"hpluv":[92.808164678773025,428.602609406071736,90.2933822328294582],"hsluv":[92.808164678773025,91.2305485856041827,90.2933822328294582]},"#ddee55":{"lch":[90.4030992965535,87.3081168904988658,93.1158428735316477],"luv":[90.4030992965535,-4.74562541158387852,87.1790474507375137],"rgb":[0.866666666666666696,0.933333333333333348,0.333333333333333315],"xyz":[0.620308433137824355,0.77177173117432607,0.202235870515171279],"hpluv":[93.1158428735316477,411.63119840797242,90.4030992965535],"hsluv":[93.1158428735316477,86.365058197250562,90.4030992965535]},"#ddee66":{"lch":[90.5423480313319828,81.4363754503924,93.5488244177654451],"luv":[90.5423480313319828,-5.04083628618753,81.2802141731499717],"rgb":[0.866666666666666696,0.933333333333333348,0.4],"xyz":[0.627893428911332596,0.774805729483729388,0.242183514922315241],"hpluv":[93.5488244177654451,390.03815237863023,90.5423480313319828],"hsluv":[93.5488244177654451,80.3228278296054583,90.5423480313319828]},"#ddee77":{"lch":[90.7128424721769449,74.4235139877598613,94.1564113073248],"luv":[90.7128424721769449,-5.39417557361030209,74.2277731322134855],"rgb":[0.866666666666666696,0.933333333333333348,0.466666666666666674],"xyz":[0.637207441931534446,0.77853133469181024,0.291237316828713122],"hpluv":[94.1564113073248,363.492124647987794,90.7128424721769449],"hsluv":[94.1564113073248,73.1200108954656116,90.7128424721769449]},"#ddee88":{"lch":[90.9160566530372449,66.3104835404903099,95.0215233218939801],"luv":[90.9160566530372449,-5.80415396856009735,66.0559764448523197],"rgb":[0.866666666666666696,0.933333333333333348,0.533333333333333326],"xyz":[0.648347859033478358,0.782987501532587782,0.349910180232285317],"hpluv":[95.0215233218939801,331.65301907995223,90.9160566530372449],"hsluv":[95.0215233218939801,64.803658473982523,90.9160566530372449]},"#ddee99":{"lch":[91.1532518637430798,57.1683554138076389,96.2947128608995513],"luv":[91.1532518637430798,-6.26808654843775237,56.8236918172404799],"rgb":[0.866666666666666696,0.933333333333333348,0.6],"xyz":[0.661404823142551,0.788210287176217,0.418676857873403252],"hpluv":[96.2947128608995513,294.152965661212647,91.1532518637430798],"hsluv":[96.2947128608995513,55.4479539090275679,91.1532518637430798]},"#ddeeaa":{"lch":[91.4254953447680805,47.1012792006961263,98.2790075719046712],"luv":[91.4254953447680805,-6.78228473243696595,46.6104185365255219],"rgb":[0.866666666666666696,0.933333333333333348,0.66666666666666663],"xyz":[0.676462516107803613,0.794233364362318062,0.497980707490401797],"hpluv":[98.2790075719046712,250.593114601078071,91.4254953447680805],"hsluv":[98.2790075719046712,45.1497304611624699,91.4254953447680805]},"#ddeebb":{"lch":[91.7336739482950634,36.2629153409390739,101.681625346389353],"luv":[91.7336739482950634,-7.34227032126066,35.5118303605101318],"rgb":[0.866666666666666696,0.933333333333333348,0.733333333333333282],"xyz":[0.693600108215140176,0.80108840120525282,0.588238692589043599],"hpluv":[101.681625346389353,200.613962446551909,91.7336739482950634],"hsluv":[101.681625346389353,34.0234190840686495,91.7336739482950634]},"#ddeecc":{"lch":[92.0785048140775189,24.9340669502590622,108.575873850927678],"luv":[92.0785048140775189,-7.94300120518182506,23.6350677285782567],"rgb":[0.866666666666666696,0.933333333333333348,0.8],"xyz":[0.712892483658861931,0.808805351382741677,0.689845203259313755],"hpluv":[108.575873850927678,144.339382081965653,92.0785048140775189],"hsluv":[108.575873850927678,22.1956929245148693,92.0785048140775189]},"#ddeedd":{"lch":[92.4605443140240908,14.0242187757329084,127.71501294922345],"luv":[92.4605443140240908,-8.57909621466854766,11.0940443666446207],"rgb":[0.866666666666666696,0.933333333333333348,0.866666666666666696],"xyz":[0.73441080920949553,0.817412681602995184,0.803175051159319753],"hpluv":[127.71501294922345,85.5555802205660854,92.4605443140240908],"hsluv":[127.71501294922345,19.0167034911391681,92.4605443140240908]},"#ddeeee":{"lch":[92.8801960589335636,9.45784403502816851,192.177050630058346],"luv":[92.8801960589335636,-9.24504689815110403,-1.99497409554724747],"rgb":[0.866666666666666696,0.933333333333333348,0.933333333333333348],"xyz":[0.758222989475670239,0.826937553709465201,0.928585867227843],"hpluv":[192.177050630058346,61.3009405779386327,92.8801960589335636],"hsluv":[192.177050630058346,16.5065503962475049,92.8801960589335636]},"#ddeeff":{"lch":[93.3377184761608305,18.4254994321377019,237.36941304521946],"luv":[93.3377184761608305,-9.93540601395951306,-15.5173044263971267],"rgb":[0.866666666666666696,0.933333333333333348,1],"xyz":[0.78439403788550166,0.837405973073397925,1.06642005551962482],"hpluv":[237.36941304521946,128.083838047846456,93.3377184761608305],"hsluv":[237.36941304521946,99.9999999999860592,93.3377184761608305]},"#667700":{"lch":[46.9985837429297462,53.5023535392226,97.7743932102929705],"luv":[46.9985837429297462,-7.23741162388150272,53.0105810873873509],"rgb":[0.4,0.466666666666666674,0],"xyz":[0.12075904236398749,0.160183725889588319,0.0245569097840955056],"hpluv":[97.7743932102929705,144.453291553004675,46.9985837429297462],"hsluv":[97.7743932102929705,100.000000000002416,46.9985837429297462]},"#667711":{"lch":[47.0515894602548315,51.4525286527524344,98.1592061252685681],"luv":[47.0515894602548315,-7.3023584206057679,50.9317019768564],"rgb":[0.4,0.466666666666666674,0.0666666666666666657],"xyz":[0.121770707863624608,0.160588392089443172,0.0298850147488511353],"hpluv":[98.1592061252685681,138.762383385982389,47.0515894602548315],"hsluv":[98.1592061252685681,95.8888552433840573,47.0515894602548315]},"#667722":{"lch":[47.1496128779850068,47.7434140964333835,98.9413563019921],"luv":[47.1496128779850068,-7.4204465613794337,47.1632331632727],"rgb":[0.4,0.466666666666666674,0.133333333333333331],"xyz":[0.123646066002101637,0.161338535344834,0.0397619009448303348],"hpluv":[98.9413563019921,128.491579290861381,47.1496128779850068],"hsluv":[98.9413563019921,88.4562635009272071,47.1496128779850068]},"#667733":{"lch":[47.3103471969426579,41.884713336750373,100.466311561708949],"luv":[47.3103471969426579,-7.6086666810921777,41.1878307590699961],"rgb":[0.4,0.466666666666666674,0.2],"xyz":[0.126733816734559357,0.162573635637817099,0.0560240548024414781],"hpluv":[100.466311561708949,112.341117260385403,47.3103471969426579],"hsluv":[100.466311561708949,76.7252257071794,47.3103471969426579]},"#667744":{"lch":[47.5409803755201068,33.9506682862991624,103.399633201782777],"luv":[47.5409803755201068,-7.86778476785512915,33.0264415269496823],"rgb":[0.4,0.466666666666666674,0.266666666666666663],"xyz":[0.131191811978778244,0.164356833735504693,0.0795028297553281166],"hpluv":[103.399633201782777,90.6190532449782324,47.5409803755201068],"hsluv":[103.399633201782777,60.8161329795325543,47.5409803755201068]},"#667755":{"lch":[47.8468512336942808,24.3055974565694441,109.700167733355244],"luv":[47.8468512336942808,-8.19336864569332768,22.8829800934354815],"rgb":[0.4,0.466666666666666674,0.333333333333333315],"xyz":[0.137154226018140257,0.166741799351249526,0.110904877029302018],"hpluv":[109.700167733355244,64.4602914823941262,47.8468512336942808],"hsluv":[109.700167733355244,41.23982633361328,47.8468512336942808]},"#667766":{"lch":[48.2317738399223543,14.0211946941261125,127.715012949232488],"luv":[48.2317738399223543,-8.57724628010491408,11.0916521267580634],"rgb":[0.4,0.466666666666666674,0.4],"xyz":[0.144739221791648415,0.169775797660652816,0.15085252143644598],"hpluv":[127.715012949232488,36.8885098590324958,48.2317738399223543],"hsluv":[127.715012949232488,18.7828263722028552,48.2317738399223543]},"#667777":{"lch":[48.6982180758881356,9.21652694043341,192.177050630059739],"luv":[48.6982180758881356,-9.00915932709454736,-1.94407228846053126],"rgb":[0.4,0.466666666666666674,0.466666666666666674],"xyz":[0.154053234811850348,0.17350140286873364,0.199906323342843889],"hpluv":[192.177050630059739,24.0156061835451808,48.6982180758881356],"hsluv":[192.177050630059739,23.9216020554503501,48.6982180758881356]},"#667788":{"lch":[49.2474401880289605,18.4334880243097601,239.056580638027469],"luv":[49.2474401880289605,-9.47834019220879398,-15.8099509152663327],"rgb":[0.4,0.466666666666666674,0.533333333333333326],"xyz":[0.165193651913794148,0.177957569709511237,0.258579186746416056],"hpluv":[239.056580638027469,47.4966726259429564,49.2474401880289605],"hsluv":[239.056580638027469,29.274081353383373,49.2474401880289605]},"#667799":{"lch":[49.8796002039077422,31.7351192214463786,251.680675473596239],"luv":[49.8796002039077422,-9.97474964621831,-30.126768188683684],"rgb":[0.4,0.466666666666666674,0.6],"xyz":[0.178250616022866876,0.183180355353140395,0.327345864387534],"hpluv":[251.680675473596239,80.734004933806176,49.8796002039077422],"hsluv":[251.680675473596239,34.661761655835349,49.8796002039077422]},"#6677aa":{"lch":[50.5938810850088174,45.7960576637453798,256.758518919433186],"luv":[50.5938810850088174,-10.4898463625666416,-44.5784928057335676],"rgb":[0.4,0.466666666666666674,0.66666666666666663],"xyz":[0.193308308988119404,0.18920343253924149,0.406649714004532592],"hpluv":[256.758518919433186,114.860161977636537,50.5938810850088174],"hsluv":[256.758518919433186,39.9381656359214858,50.5938810850088174]},"#6677bb":{"lch":[51.388614147457119,59.9444468574027738,259.409682348511467],"luv":[51.388614147457119,-11.0169047239158306,-58.9233783768730106],"rgb":[0.4,0.466666666666666674,0.733333333333333282],"xyz":[0.210445901095456078,0.196058469382176248,0.496907699103174338],"hpluv":[259.409682348511467,148.020333314730891,51.388614147457119],"hsluv":[259.409682348511467,49.2101017344363356,51.388614147457119]},"#6677cc":{"lch":[52.2614099661724225,73.9004259234932306,261.00752312302825],"luv":[52.2614099661724225,-11.5509895931656974,-72.9921063615257566],"rgb":[0.4,0.466666666666666674,0.8],"xyz":[0.229738276539177805,0.20377541955966505,0.598514209773444494],"hpluv":[261.00752312302825,179.434168102703751,52.2614099661724225],"hsluv":[261.00752312302825,61.6581230008595327,52.2614099661724225]},"#6677dd":{"lch":[53.2092913421323,87.5170631601914266,262.060353074135],"luv":[53.2092913421323,-12.0887245225321198,-86.6781349799548],"rgb":[0.4,0.466666666666666674,0.866666666666666696],"xyz":[0.251256602089811376,0.212382749779918584,0.711844057673450492],"hpluv":[262.060353074135,208.710638687620559,53.2092913421323],"hsluv":[262.060353074135,74.2459971892304083,53.2092913421323]},"#6677ee":{"lch":[54.2288239257805884,100.719531231348427,262.797438231409785],"luv":[54.2288239257805884,-12.6279723106459851,-99.9247631309883531],"rgb":[0.4,0.466666666666666674,0.933333333333333348],"xyz":[0.275068782355986086,0.221907621886388629,0.837254873741973715],"hpluv":[262.797438231409785,235.68005803746027,54.2288239257805884],"hsluv":[262.797438231409785,87.0042080584200193,54.2288239257805884]},"#6677ff":{"lch":[55.3162401631211793,113.47857319487936,263.336661992011841],"luv":[55.3162401631211793,-13.1675101506557386,-112.712036849566218],"rgb":[0.4,0.466666666666666674,1],"xyz":[0.301239830765817507,0.232376041250321325,0.97508906203375556],"hpluv":[263.336661992011841,260.315806593762318,55.3162401631211793],"hsluv":[263.336661992011841,99.999999999999,55.3162401631211793]},"#ddff00":{"lch":[94.69236188875891,107.73563953931891,97.6513944636985],"luv":[94.69236188875891,-14.3445112693176284,106.77641604488548],"rgb":[0.866666666666666696,1,0],"xyz":[0.65576562191334542,0.868918402572014,0.13317202741318887],"hpluv":[97.6513944636985,949.977135711580445,94.69236188875891],"hsluv":[97.6513944636985,100.000000000002302,94.69236188875891]},"#ddff11":{"lch":[94.7095428290633237,106.965998536257018,97.7198690947758308],"luv":[94.7095428290633237,-14.3687245726656343,105.996531061225838],"rgb":[0.866666666666666696,1,0.0666666666666666657],"xyz":[0.65677728741298258,0.869323068771868934,0.138500132377944507],"hpluv":[97.7198690947758308,946.378692368412885,94.7095428290633237],"hsluv":[97.7198690947758308,99.9999999999867697,94.7095428290633237]},"#ddff22":{"lch":[94.7413776147606086,105.545731309599958,97.8489007917202827],"luv":[94.7413776147606086,-14.4134418215914106,104.556941866783148],"rgb":[0.866666666666666696,1,0.133333333333333331],"xyz":[0.658652645551459526,0.870073212027259735,0.148377018573923686],"hpluv":[97.8489007917202827,939.695870823628752,94.7413776147606086],"hsluv":[97.8489007917202827,99.9999999999872,94.7413776147606086]},"#ddff33":{"lch":[94.7937532988665197,103.225383790498825,98.0674915546983],"luv":[94.7937532988665197,-14.4865977424562669,102.203807876928138],"rgb":[0.866666666666666696,1,0.2],"xyz":[0.661740396283917343,0.871308312320242861,0.164639172431534836],"hpluv":[98.0674915546983,928.656435156239354,94.7937532988665197],"hsluv":[98.0674915546983,99.9999999999868834,94.7937532988665197]},"#ddff44":{"lch":[94.8692843830354491,99.9146373114600692,98.397314807396512],"luv":[94.8692843830354491,-14.5912004882884094,98.8434702820129729],"rgb":[0.866666666666666696,1,0.266666666666666663],"xyz":[0.666198391528136202,0.873091510417930428,0.188117947384421474],"hpluv":[98.397314807396512,912.633071017653265,94.8692843830354491],"hsluv":[98.397314807396512,99.9999999999866276,94.8692843830354491]},"#ddff55":{"lch":[94.9701440016210654,95.558111661139634,98.8668834316730738],"luv":[94.9701440016210654,-14.7292629682473848,94.4161083536863828],"rgb":[0.866666666666666696,1,0.333333333333333315],"xyz":[0.672160805567498132,0.875476476033675177,0.21951999465839539],"hpluv":[98.8668834316730738,891.031026100052486,94.9701440016210654],"hsluv":[98.8668834316730738,99.9999999999861586,94.9701440016210654]},"#ddff66":{"lch":[95.0981866754888,90.1320341607989235,99.5166683548804798],"luv":[95.0981866754888,-14.9019372161492765,88.8915960547979438],"rgb":[0.866666666666666696,1,0.4],"xyz":[0.679745801341006373,0.878510474343078496,0.259467639065539379],"hpluv":[99.5166683548804798,863.234823568518,95.0981866754888],"hsluv":[99.5166683548804798,99.9999999999856186,95.0981866754888]},"#ddff77":{"lch":[95.2550143462764396,83.6430269583913599,100.407261812829162],"luv":[95.2550143462764396,-15.1095945804084604,82.2669806810598487],"rgb":[0.866666666666666696,1,0.466666666666666674],"xyz":[0.689059814361208223,0.882236079551159347,0.308521440971937233],"hpluv":[100.407261812829162,828.556184265804632,95.2550143462764396],"hsluv":[100.407261812829162,99.9999999999855476,95.2550143462764396]},"#ddff88":{"lch":[95.4420158908659175,76.1281736437493,101.633961649281417],"luv":[95.4420158908659175,-15.3518949618923237,74.5641880758576434],"rgb":[0.866666666666666696,1,0.533333333333333326],"xyz":[0.700200231463152134,0.886692246391936889,0.367194304375509428],"hpluv":[101.633961649281417,786.17501332264635,95.4420158908659175],"hsluv":[101.633961649281417,99.9999999999848512,95.4420158908659175]},"#ddff99":{"lch":[95.6603925662724208,67.6570848719276086,103.355147801887099],"luv":[95.6603925662724208,-15.6278614338241617,65.8274341013866859],"rgb":[0.866666666666666696,1,0.6],"xyz":[0.713257195572224778,0.891915032035566102,0.435960982016627363],"hpluv":[103.355147801887099,735.074270676232231,95.6603925662724208],"hsluv":[103.355147801887099,99.9999999999844107,95.6603925662724208]},"#ddffaa":{"lch":[95.9111754000973775,58.338925144698,105.852499131344544],"luv":[95.9111754000973775,-15.935965587620279,56.1201852084333268],"rgb":[0.866666666666666696,1,0.66666666666666663],"xyz":[0.72831488853747739,0.897938109221667169,0.515264831633625908],"hpluv":[105.852499131344544,673.992295850936557,95.9111754000973775],"hsluv":[105.852499131344544,99.9999999999831886,95.9111754000973775]},"#ddffbb":{"lch":[96.1952377631310185,48.3433070572267596,109.672211431084662],"luv":[96.1952377631310185,-16.2742233848326485,45.5216980180866813],"rgb":[0.866666666666666696,1,0.733333333333333282],"xyz":[0.745452480644814,0.904793146064601927,0.60552281673226771],"hpluv":[109.672211431084662,601.502194015230771,96.1952377631310185],"hsluv":[109.672211431084662,99.9999999999821654,96.1952377631310185]},"#ddffcc":{"lch":[96.513305005727517,37.9644197829535202,115.996292551248089],"luv":[96.513305005727517,-16.6402982513575566,34.1232712904577653],"rgb":[0.866666666666666696,1,0.8],"xyz":[0.764744856088535707,0.912510096242090785,0.707129327402537866],"hpluv":[115.996292551248089,516.693096965009204,96.513305005727517],"hsluv":[115.996292551248089,99.9999999999804885,96.513305005727517]},"#ddffdd":{"lch":[96.8659623148576,27.841508205801528,127.715012949232161],"luv":[96.8659623148576,-17.0316066426751398,22.0243945284064],"rgb":[0.866666666666666696,1,0.866666666666666696],"xyz":[0.786263181639169306,0.921117426462344291,0.820459175302543864],"hpluv":[127.715012949232161,422.676993554754517,96.8659623148576],"hsluv":[127.715012949232161,99.9999999999786411,96.8659623148576]},"#ddffee":{"lch":[97.2536615310726802,19.7831433293950418,151.864226334417424],"luv":[97.2536615310726802,-17.4454209009420502,9.32898974060759478],"rgb":[0.866666666666666696,1,0.933333333333333348],"xyz":[0.810075361905344,0.930642298568814308,0.945869991371067087],"hpluv":[151.864226334417424,343.73229759561508,97.2536615310726802],"hsluv":[151.864226334417424,99.9999999999752,97.2536615310726802]},"#ddffff":{"lch":[97.6767274082888406,18.2904922799610645,192.177050630059568],"luv":[97.6767274082888406,-17.878964623675607,-3.85807359036494368],"rgb":[0.866666666666666696,1,1],"xyz":[0.836246410315175437,0.941110717932747,1.08370417966284882],"hpluv":[192.177050630059568,376.852754928906336,97.6767274082888406],"hsluv":[192.177050630059568,99.9999999999715072,97.6767274082888406]},"#668800":{"lch":[52.32310792684153,62.4331707825390509,105.73052795354684],"luv":[52.32310792684153,-16.9264656143939405,60.0948881001240167],"rgb":[0.4,0.533333333333333326,0],"xyz":[0.142831412088957943,0.204328465339529863,0.0319143663590854554],"hpluv":[105.73052795354684,151.412310196323318,52.32310792684153],"hsluv":[105.73052795354684,100.000000000002359,52.32310792684153]},"#668811":{"lch":[52.3681821172622222,60.6739112189649603,106.201766876928076],"luv":[52.3681821172622222,-16.9292783492562116,58.26425179456308],"rgb":[0.4,0.533333333333333326,0.0666666666666666657],"xyz":[0.143843077588595075,0.204733131539384716,0.0372424713238410851],"hpluv":[106.201766876928076,147.019120365759306,52.3681821172622222],"hsluv":[106.201766876928076,96.7617570127925859,52.3681821172622222]},"#668822":{"lch":[52.4515808002199,57.4815115963739842,107.134347730867304],"luv":[52.4515808002199,-16.9348150675510247,54.9302850350507796],"rgb":[0.4,0.533333333333333326,0.133333333333333331],"xyz":[0.145718435727072076,0.205483274794775544,0.0471193575198202846],"hpluv":[107.134347730867304,139.062145386582984,52.4515808002199],"hsluv":[107.134347730867304,90.8761910280814647,52.4515808002199]},"#668833":{"lch":[52.5884544541714121,52.4173031151438593,108.860637572968898],"luv":[52.5884544541714121,-16.9448041098426323,49.6028958786070291],"rgb":[0.4,0.533333333333333326,0.2],"xyz":[0.14880618645952981,0.206718375087758643,0.0633815113774314209],"hpluv":[108.860637572968898,126.480505252334424,52.5884544541714121],"hsluv":[108.860637572968898,81.504484256448066,52.5884544541714121]},"#668844":{"lch":[52.7851097594501937,45.5231929703366234,111.874794573011059],"luv":[52.7851097594501937,-16.9610118856818559,42.2455343678863215],"rgb":[0.4,0.533333333333333326,0.266666666666666663],"xyz":[0.153264181703748698,0.208501573185446237,0.0868602863303180595],"hpluv":[111.874794573011059,109.436101408621766,52.7851097594501937],"hsluv":[111.874794573011059,68.6312430201703734,52.7851097594501937]},"#668855":{"lch":[53.0463844713544859,37.0894540992544819,117.255878513522262],"luv":[53.0463844713544859,-16.9856764955971045,32.9714179156375593],"rgb":[0.4,0.533333333333333326,0.333333333333333315],"xyz":[0.15922659574311071,0.21088653880119107,0.118262333604291975],"hpluv":[117.255878513522262,88.7225425584692715,53.0463844713544859],"hsluv":[117.255878513522262,52.5261258187504225,53.0463844713544859]},"#668866":{"lch":[53.3759296841588906,27.8248149657310222,127.715012949236794],"luv":[53.3759296841588906,-17.0213948144824521,22.0111891193247189],"rgb":[0.4,0.533333333333333326,0.4],"xyz":[0.166811591516618868,0.213920537110594361,0.158209978011435937],"hpluv":[127.715012949236794,66.1494380276081415,53.3759296841588906],"hsluv":[127.715012949236794,33.681854155652033,53.3759296841588906]},"#668877":{"lch":[53.7763606180623839,19.6211535767711887,150.461713858693599],"luv":[53.7763606180623839,-17.0709226847205855,9.67332757511772101],"rgb":[0.4,0.533333333333333326,0.466666666666666674],"xyz":[0.176125604536820801,0.217646142318675184,0.207263779917833846],"hpluv":[150.461713858693599,46.2990901048939207,53.7763606180623839],"hsluv":[150.461713858693599,37.1484166060608132,53.7763606180623839]},"#668888":{"lch":[54.2493559855519436,17.5313913512660982,192.17705063006045],"luv":[54.2493559855519436,-17.1369431164247104,-3.69795393909545],"rgb":[0.4,0.533333333333333326,0.533333333333333326],"xyz":[0.187266021638764601,0.222102309159452782,0.265936643321406],"hpluv":[192.17705063006045,41.0072951616226788,54.2493559855519436],"hsluv":[192.17705063006045,40.8467805779917228,54.2493559855519436]},"#668899":{"lch":[54.7957384612029728,24.7393499057112685,225.882505108050964],"luv":[54.7957384612029728,-17.2218541013304964,-17.7607200042594577],"rgb":[0.4,0.533333333333333326,0.6],"xyz":[0.200322985747837329,0.22732509480308194,0.33470332096252392],"hpluv":[225.882505108050964,57.2902642666713859,54.7957384612029728],"hsluv":[225.882505108050964,44.6631352998217963,54.7957384612029728]},"#6688aa":{"lch":[55.4155508256813363,36.5699037808867828,241.717344836465486],"luv":[55.4155508256813363,-17.3276119763631087,-32.2042190673817643],"rgb":[0.4,0.533333333333333326,0.66666666666666663],"xyz":[0.215380678713089857,0.233348171989183034,0.414007170579522521],"hpluv":[241.717344836465486,83.7397171719788389,55.4155508256813363],"hsluv":[241.717344836465486,48.4952118884804193,55.4155508256813363]},"#6688bb":{"lch":[56.1081340603271457,49.918102431374308,249.531909378681803],"luv":[56.1081340603271457,-17.4556451944419777,-46.7666270025424495],"rgb":[0.4,0.533333333333333326,0.733333333333333282],"xyz":[0.232518270820426531,0.240203208832117793,0.504265155678164323],"hpluv":[249.531909378681803,112.8941838879785,56.1081340603271457],"hsluv":[249.531909378681803,52.2580147864780216,56.1081340603271457]},"#6688cc":{"lch":[56.8722093096567107,63.7230017864969795,253.960340799970709],"luv":[56.8722093096567107,-17.6068348542363715,-61.2423082770199372],"rgb":[0.4,0.533333333333333326,0.8],"xyz":[0.251810646264148286,0.247920159009606594,0.605871666348434479],"hpluv":[253.960340799970709,142.178999158492672,56.8722093096567107],"hsluv":[253.960340799970709,56.6402695601832349,56.8722093096567107]},"#6688dd":{"lch":[57.7059632125805564,77.5471512008463719,256.744147904563079],"luv":[57.7059632125805564,-17.7815469636593271,-75.4809727477468755],"rgb":[0.4,0.533333333333333326,0.866666666666666696],"xyz":[0.273328971814781774,0.256527489229860128,0.719201514248440477],"hpluv":[256.744147904563079,170.523595036459966,57.7059632125805564],"hsluv":[256.744147904563079,70.7529337108087475,57.7059632125805564]},"#6688ee":{"lch":[58.6071348177704721,91.1720868217648501,258.626369492504523],"luv":[58.6071348177704721,-17.979697586292076,-89.3816529839368599],"rgb":[0.4,0.533333333333333326,0.933333333333333348],"xyz":[0.297141152080956539,0.266052361336330145,0.8446123303169637],"hpluv":[258.626369492504523,197.40162879311913,58.6071348177704721],"hsluv":[258.626369492504523,85.1920367601911295,58.6071348177704721]},"#6688ff":{"lch":[59.57310174908622,104.481663139573541,259.967822360236937],"luv":[59.57310174908622,-18.2008336002305597,-102.884146439906075],"rgb":[0.4,0.533333333333333326,1],"xyz":[0.323312200490787904,0.276520780700262869,0.982446518608745434],"hpluv":[259.967822360236937,222.550815911907222,59.57310174908622],"hsluv":[259.967822360236937,99.9999999999987352,59.57310174908622]},"#669900":{"lch":[57.6618978033021961,71.9113437902946373,111.072092359847389],"luv":[57.6618978033021961,-25.8551729794803826,67.1025438856612624],"rgb":[0.4,0.6,0],"xyz":[0.168701012541425444,0.25606766624446553,0.0405375665099077104],"hpluv":[111.072092359847389,158.251486754186431,57.6618978033021961],"hsluv":[111.072092359847389,100.000000000002444,57.6618978033021961]},"#669911":{"lch":[57.7006802499588929,70.3894808316696867,111.521292839157113],"luv":[57.7006802499588929,-25.8221679479897865,65.4820177928093727],"rgb":[0.4,0.6,0.0666666666666666657],"xyz":[0.169712678041062576,0.256472332444320383,0.0458656714746633401],"hpluv":[111.521292839157113,154.798288730060023,57.7006802499588929],"hsluv":[111.521292839157113,97.4070268725327821,57.7006802499588929]},"#669922":{"lch":[57.7724648019637499,67.6202459496272326,112.394641072548438],"luv":[57.7724648019637499,-25.7622250908158499,62.5204400229094404],"rgb":[0.4,0.6,0.133333333333333331],"xyz":[0.171588036179539577,0.257222475699711184,0.0557425576706425396],"hpluv":[112.394641072548438,148.523500329687067,57.7724648019637499],"hsluv":[112.394641072548438,92.6757293451634183,57.7724648019637499]},"#669933":{"lch":[57.8903535973237524,63.206621217633213,113.958803391015238],"luv":[57.8903535973237524,-25.6669247559924365,57.7605915769530824],"rgb":[0.4,0.6,0.2],"xyz":[0.174675786911997311,0.258457575992694311,0.0720047115282536898],"hpluv":[113.958803391015238,138.546544821103367,57.8903535973237524],"hsluv":[113.958803391015238,85.092275495173979,57.8903535973237524]},"#669944":{"lch":[58.0598969225296457,57.1535921702901888,116.538768682419729],"luv":[58.0598969225296457,-25.5364113217858204,51.131446241744662],"rgb":[0.4,0.6,0.266666666666666663],"xyz":[0.179133782156216198,0.260240774090381877,0.0954834864811403283],"hpluv":[116.538768682419729,124.912700512594284,58.0598969225296457],"hsluv":[116.538768682419729,74.5746503624431796,58.0598969225296457]},"#669955":{"lch":[58.2854489010818355,49.6561447471622515,120.7300937454592],"luv":[58.2854489010818355,-25.3740154630121886,42.6836274282534163],"rgb":[0.4,0.6,0.333333333333333315],"xyz":[0.185096196195578211,0.262625739706126737,0.126885533755114244],"hpluv":[120.7300937454592,108.106592630407334,58.2854489010818355],"hsluv":[120.7300937454592,61.2495338993745833,58.2854489010818355]},"#669966":{"lch":[58.5704165792398754,41.1710358166226,127.715012949238272],"luv":[58.5704165792398754,-25.1857364161826034,32.5688942303571949],"rgb":[0.4,0.6,0.4],"xyz":[0.192681191969086368,0.265659738015530056,0.166833178162258178],"hpluv":[127.715012949238272,89.1975256314243552,58.5704165792398754],"hsluv":[127.715012949238272,45.4174387408809324,58.5704165792398754]},"#669977":{"lch":[58.9173908027988489,32.643461159974926,139.926834832055846],"luv":[58.9173908027988489,-24.9795271581232114,21.0147276798767138],"rgb":[0.4,0.6,0.466666666666666674],"xyz":[0.201995204989288302,0.269385343223610851,0.215886980068656087],"hpluv":[139.926834832055846,70.3059403526018514,58.9173908027988489],"hsluv":[139.926834832055846,47.7876005322921813,58.9173908027988489]},"#669988":{"lch":[59.328227692638464,26.116847909850911,161.480821243886396],"luv":[59.328227692638464,-24.7644493579715288,8.29528738156475498],"rgb":[0.4,0.6,0.533333333333333326],"xyz":[0.213135622091232102,0.273841510064388449,0.274559843472228282],"hpluv":[161.480821243886396,55.8597144892801083,59.328227692638464],"hsluv":[161.480821243886396,50.3655359274122105,59.328227692638464]},"#669999":{"lch":[59.8041090330486043,25.1148951486962346,192.17705063006062],"luv":[59.8041090330486043,-24.5498215694726056,-5.29756729424584893],"rgb":[0.4,0.6,0.6],"xyz":[0.226192586200304829,0.279064295708017607,0.343326521113346161],"hpluv":[192.17705063006062,53.2892577697712042,59.8041090330486043],"hsluv":[192.17705063006062,53.0806679813151447,59.8041090330486043]},"#6699aa":{"lch":[60.3455948386344119,31.1785657150768039,218.6653689057203],"luv":[60.3455948386344119,-24.3444790905776323,-19.4794583563761137],"rgb":[0.4,0.6,0.66666666666666663],"xyz":[0.241250279165557358,0.285087372894118729,0.422630370730344762],"hpluv":[218.6653689057203,65.5616517705923911,60.3455948386344119],"hsluv":[218.6653689057203,55.8649153078387357,60.3455948386344119]},"#6699bb":{"lch":[60.9526745558420231,41.7013653705125407,234.60099737489486],"luv":[60.9526745558420231,-24.1562241025528444,-33.9923625373734168],"rgb":[0.4,0.6,0.733333333333333282],"xyz":[0.258387871272894032,0.291942409737053488,0.512888355828986509],"hpluv":[234.60099737489486,86.8154127469588,60.9526745558420231],"hsluv":[234.60099737489486,58.6571249967150123,60.9526745558420231]},"#6699cc":{"lch":[61.6248198105828493,54.2138016672169485,243.734276496040906],"luv":[61.6248198105828493,-23.9914938552849968,-48.6162988492970101],"rgb":[0.4,0.6,0.8],"xyz":[0.277680246716615731,0.299659359914542289,0.614494866499256664],"hpluv":[243.734276496040906,111.633239234030881,61.6248198105828493],"hsluv":[243.734276496040906,61.4057918386087067,61.6248198105828493]},"#6699dd":{"lch":[62.361039595623,67.5283063616342361,249.312993820438976],"luv":[62.361039595623,-23.8552311607989473,-63.1743627299522288],"rgb":[0.4,0.6,0.866666666666666696],"xyz":[0.29919857226724933,0.308266690134795796,0.727824714399262662],"hpluv":[249.312993820438976,137.407942777337979,62.361039595623],"hsluv":[249.312993820438976,66.62550454031512,62.361039595623]},"#6699ee":{"lch":[63.1599376048740453,81.0888167917790526,252.968345076420633],"luv":[63.1599376048740453,-23.7509145884581336,-77.5325110189427278],"rgb":[0.4,0.6,0.933333333333333348],"xyz":[0.323010752533424039,0.317791562241265813,0.853235530467785885],"hpluv":[252.968345076420633,162.914071535813093,63.1599376048740453],"hsluv":[252.968345076420633,83.0301883133999183,63.1599376048740453]},"#6699ff":{"lch":[64.0197707514621186,94.6074384193794771,255.504450424431923],"luv":[64.0197707514621186,-23.6806962224400728,-91.5958079318982499],"rgb":[0.4,0.6,1],"xyz":[0.34918180094325546,0.328259981605198536,0.99106971875956773],"hpluv":[255.504450424431923,187.521252715437782,64.0197707514621186],"hsluv":[255.504450424431923,99.9999999999985079,64.0197707514621186]},"#550000":{"lch":[15.1243819173422267,50.8637728648741643,12.1770506300617765],"luv":[15.1243819173422267,49.7193613905117289,10.7288626130266547],"rgb":[0.333333333333333315,0,0],"xyz":[0.0374622858816120868,0.019316491157706641,0.00175604465070052949],"hpluv":[12.1770506300617765,426.746789183125202,15.1243819173422267],"hsluv":[12.1770506300617765,100.000000000002203,15.1243819173422267]},"#550011":{"lch":[15.3402258633588957,47.2707050856887108,7.4875089370669734],"luv":[15.3402258633588957,46.8676416739534929,6.15984766208174239],"rgb":[0.333333333333333315,0,0.0666666666666666657],"xyz":[0.0384739513812492051,0.0197211573575614939,0.00708414961545616138],"hpluv":[7.4875089370669734,391.020613457768548,15.3402258633588957],"hsluv":[7.4875089370669734,99.9999999999966889,15.3402258633588957]},"#550022":{"lch":[15.7326592199860933,42.4312907985821823,358.411234527054887],"luv":[15.7326592199860933,42.4149789665186745,-1.17643448760390168],"rgb":[0.333333333333333315,0,0.133333333333333331],"xyz":[0.0403493095197262272,0.0204713006129523117,0.0169610358114353557],"hpluv":[358.411234527054887,342.234221563623748,15.7326592199860933],"hsluv":[358.411234527054887,99.9999999999971578,15.7326592199860933]},"#550033":{"lch":[16.358416636328208,38.360101220613565,343.406058671947278],"luv":[16.358416636328208,36.7625096026365128,-10.9551473459637485],"rgb":[0.333333333333333315,0,0.2],"xyz":[0.0434370602521839677,0.0217064009059354281,0.0332231896690465],"hpluv":[343.406058671947278,297.562230749163234,16.358416636328208],"hsluv":[343.406058671947278,99.9999999999977547,16.358416636328208]},"#550044":{"lch":[17.2212923868602061,37.8614359764106112,324.728975934647224],"luv":[17.2212923868602061,30.9112016871952413,-21.8628896637516235],"rgb":[0.333333333333333315,0,0.266666666666666663],"xyz":[0.0478950554964028483,0.0234895990036230046,0.0567019646219331375],"hpluv":[324.728975934647224,278.978456842737614,17.2212923868602061],"hsluv":[324.728975934647224,99.9999999999983089,17.2212923868602061]},"#550055":{"lch":[18.3096014215038,41.7063030886972754,307.715012949243544],"luv":[18.3096014215038,25.5131777875110508,-32.9923245090298636],"rgb":[0.333333333333333315,0,0.333333333333333315],"xyz":[0.0538574695357648403,0.025874564619367834,0.0881040118959070528],"hpluv":[307.715012949243544,289.042783730483393,18.3096014215038],"hsluv":[307.715012949243544,99.9999999999988,18.3096014215038]},"#550066":{"lch":[19.6013792550641099,48.6148100748190828,295.355623011865077],"luv":[19.6013792550641099,20.818580180871372,-43.9316113733990079],"rgb":[0.333333333333333315,0,0.4],"xyz":[0.0614424653092730116,0.028908562928771149,0.128051656303051015],"hpluv":[295.355623011865077,314.717786655224245,19.6013792550641099],"hsluv":[295.355623011865077,99.9999999999992468,19.6013792550641099]},"#550077":{"lch":[21.069395574911745,57.1127554515679421,287.139622223683091],"luv":[21.069395574911745,16.83119884103942,-54.5763463493480572],"rgb":[0.333333333333333315,0,0.466666666666666674],"xyz":[0.0707564783294749311,0.0326341681368519654,0.177105458209448924],"hpluv":[287.139622223683091,343.969838941793114,21.069395574911745],"hsluv":[287.139622223683091,99.9999999999995737,21.069395574911745]},"#550088":{"lch":[22.6852054601189934,66.3294491167530822,281.703433904835379],"luv":[22.6852054601189934,13.454662288017035,-64.9505033302079084],"rgb":[0.333333333333333315,0,0.533333333333333326],"xyz":[0.0818968954314187592,0.0370903349776295563,0.235778321613021091],"hpluv":[281.703433904835379,371.024851449370942,22.6852054601189934],"hsluv":[281.703433904835379,99.9999999999998721,22.6852054601189934]},"#550099":{"lch":[24.4218644362266417,75.8503102235033424,278.01254475278904],"luv":[24.4218644362266417,10.5727682252252198,-75.1098271403773339],"rgb":[0.333333333333333315,0,0.6],"xyz":[0.0949538595404914726,0.0423131206212587208,0.304544999254138971],"hpluv":[278.01254475278904,394.110378481836165,24.4218644362266417],"hsluv":[278.01254475278904,100.000000000000071,24.4218644362266417]},"#5500aa":{"lch":[26.2553935553790794,85.4876195151354,275.424483319872081],"luv":[26.2553935553790794,8.0814629277942,-85.1047768771603614],"rgb":[0.333333333333333315,0,0.66666666666666663],"xyz":[0.110011552505744015,0.0483361978073598153,0.383848848871137571],"hpluv":[275.424483319872081,413.165469396605374,26.2553935553790794],"hsluv":[275.424483319872081,100.00000000000027,26.2553935553790794]},"#5500bb":{"lch":[28.1653177219846,95.1546470205467756,273.553022331801344],"luv":[28.1653177219846,5.89694295360029841,-94.9717479748942708],"rgb":[0.333333333333333315,0,0.733333333333333282],"xyz":[0.127149144613080661,0.0551912346502945739,0.474106833969779318],"hpluv":[273.553022331801344,428.701175528050442,28.1653177219846],"hsluv":[273.553022331801344,100.000000000000355,28.1653177219846]},"#5500cc":{"lch":[30.1346298593711452,104.80902699908826,272.162345307959299],"luv":[30.1346298593711452,3.95455850560158062,-104.734395532324456],"rgb":[0.333333333333333315,0,0.8],"xyz":[0.146441520056802388,0.0629081848277833755,0.575713344640049529],"hpluv":[272.162345307959299,441.338845171454864,30.1346298593711452],"hsluv":[272.162345307959299,100.000000000000441,30.1346298593711452]},"#5500dd":{"lch":[32.1494591091083208,114.428501102308275,271.104225820707256],"luv":[32.1494591091083208,2.20517261265448461,-114.407250986418532],"rgb":[0.333333333333333315,0,0.866666666666666696],"xyz":[0.167959845607435931,0.0715155150480369095,0.689043192540055527],"hpluv":[271.104225820707256,451.647764573950099,32.1494591091083208],"hsluv":[271.104225820707256,100.000000000000483,32.1494591091083208]},"#5500ee":{"lch":[34.1986254005705774,124.000502171291956,270.282536199645165],"luv":[34.1986254005705774,0.611467178704377612,-123.998994538754019],"rgb":[0.333333333333333315,0,0.933333333333333348],"xyz":[0.191772025873610696,0.0810403871545069404,0.81445400860857875],"hpluv":[270.282536199645165,460.101999214721616,34.1986254005705774],"hsluv":[270.282536199645165,100.000000000000597,34.1986254005705774]},"#5500ff":{"lch":[36.2731838611955055,133.517545782829444,269.6330586770423],"luv":[36.2731838611955055,-0.855085145745556,-133.514807647929],"rgb":[0.333333333333333315,0,1],"xyz":[0.217943074283442062,0.0915088065184396504,0.952288196900360595],"hpluv":[269.6330586770423,467.080772865482345,36.2731838611955055],"hsluv":[269.6330586770423,100.000000000000668,36.2731838611955055]},"#551100":{"lch":[17.1436512350983392,46.6418802884309827,16.9386517648024579],"luv":[17.1436512350983392,44.618427652544149,13.5889996193616174],"rgb":[0.333333333333333315,0.0666666666666666657,0],"xyz":[0.0394666861425404941,0.0233252916795635146,0.00242417807100998037],"hpluv":[16.9386517648024579,345.232802292268,17.1436512350983392],"hsluv":[16.9386517648024579,100.000000000002245,17.1436512350983392]},"#551111":{"lch":[17.3342210988239742,43.3325537190722372,12.1770506300618173],"luv":[17.3342210988239742,42.3575912084996133,9.14027783111198566],"rgb":[0.333333333333333315,0.0666666666666666657,0.0666666666666666657],"xyz":[0.0404783516421776124,0.0237299578794183674,0.0077522830357656114],"hpluv":[12.1770506300618173,317.211759513802576,17.3342210988239742],"hsluv":[12.1770506300618173,74.3325474389658751,17.3342210988239742]},"#551122":{"lch":[17.681833534927847,38.7809423842287515,2.75476418742331486],"luv":[17.681833534927847,38.7361268795629599,1.86385798259144919],"rgb":[0.333333333333333315,0.0666666666666666657,0.133333333333333331],"xyz":[0.0423537097806546345,0.0244801011348091888,0.0176291692317448075],"hpluv":[2.75476418742331486,278.311009894887945,17.681833534927847],"hsluv":[2.75476418742331486,76.7057995287142234,17.681833534927847]},"#551133":{"lch":[18.2390179286851222,34.9181665436168771,346.660743506282301],"luv":[18.2390179286851222,33.9761101882180157,-8.05619582966011727],"rgb":[0.333333333333333315,0.0666666666666666657,0.2],"xyz":[0.045441460513112375,0.0257152014277923,0.0338913230893559542],"hpluv":[346.660743506282301,242.9345634355779,18.2390179286851222],"hsluv":[346.660743506282301,79.7834922439867285,18.2390179286851222]},"#551144":{"lch":[19.0128230091186055,34.7408929356053093,326.164658676814156],"luv":[19.0128230091186055,28.8572161490225767,-19.3440098762325228],"rgb":[0.333333333333333315,0.0666666666666666657,0.266666666666666663],"xyz":[0.0498994557573312555,0.0274983995254798746,0.0573700980422425927],"hpluv":[326.164658676814156,231.864199750183133,19.0128230091186055],"hsluv":[326.164658676814156,83.0221027238197706,19.0128230091186055]},"#551155":{"lch":[19.9971255718025702,39.1813209297373,307.715012949243771],"luv":[19.9971255718025702,23.9685594933690105,-30.9949038651824331],"rgb":[0.333333333333333315,0.0666666666666666657,0.333333333333333315],"xyz":[0.0558618697966932476,0.0298833651412247076,0.0887721453162165],"hpluv":[307.715012949243771,248.628452083429778,19.9971255718025702],"hsluv":[307.715012949243771,86.0178721207098391,19.9971255718025702]},"#551166":{"lch":[21.1763147828962417,46.7756191769153702,294.771362117319313],"luv":[21.1763147828962417,19.5989049109657927,-42.4716549674572263],"rgb":[0.333333333333333315,0.0666666666666666657,0.4],"xyz":[0.0634468655702014189,0.0329173634506280191,0.128719789723360456],"hpluv":[294.771362117319313,280.29057047770084,21.1763147828962417],"hsluv":[294.771362117319313,88.5810746573468464,21.1763147828962417]},"#551177":{"lch":[22.529041607596703,55.8726050260016436,286.442196236272423],"luv":[22.529041607596703,15.8146223861076685,-53.5877384405836494],"rgb":[0.333333333333333315,0.0666666666666666657,0.466666666666666674],"xyz":[0.0727608785904033384,0.0366429686587088355,0.177773591629758365],"hpluv":[286.442196236272423,314.699121073082495,22.529041607596703],"hsluv":[286.442196236272423,90.6792509168865166,22.529041607596703]},"#551188":{"lch":[24.0315326783493077,65.5523157673088548,281.05474383939486],"luv":[24.0315326783493077,12.5694476912001676,-64.3359548557037613],"rgb":[0.333333333333333315,0.0666666666666666657,0.533333333333333326],"xyz":[0.0839012956923471664,0.0410991354994864333,0.236446455033330533],"hpluv":[281.05474383939486,346.135302225987516,24.0315326783493077],"hsluv":[281.05474383939486,92.3586421581981654,24.0315326783493077]},"#551199":{"lch":[25.6600874124784752,75.409923320082811,277.450872837297311],"luv":[25.6600874124784752,9.77886091464338847,-74.7731931533810439],"rgb":[0.333333333333333315,0.0666666666666666657,0.6],"xyz":[0.0969582598014198799,0.0463219211431155908,0.30521313267444844],"hpluv":[277.450872837297311,372.914863977489176,25.6600874124784752],"hsluv":[277.450872837297311,93.6909530677945099,25.6600874124784752]},"#5511aa":{"lch":[27.3926712394503795,85.2829889480110097,274.948569823839534],"luv":[27.3926712394503795,7.3566383451248436,-84.9650991652784882],"rgb":[0.333333333333333315,0.0666666666666666657,0.66666666666666663],"xyz":[0.112015952766672422,0.0523449983292166923,0.38451698229144704],"hpluv":[274.948569823839534,395.063906765864772,27.3926712394503795],"hsluv":[274.948569823839534,94.7471527755802185,27.3926712394503795]},"#5511bb":{"lch":[29.2097366740877575,95.1102004757886732,273.151254165932869],"luv":[29.2097366740877575,5.22840137893499524,-94.9663838079847125],"rgb":[0.333333333333333315,0.0666666666666666657,0.733333333333333282],"xyz":[0.129153544874009069,0.0592000351721514509,0.474774967390088787],"hpluv":[273.151254165932869,413.179515249173164,29.2097366740877575],"hsluv":[273.151254165932869,95.5878244802283,29.2097366740877575]},"#5511cc":{"lch":[31.0944914716528729,104.870266468627406,271.822015936655589],"luv":[31.0944914716528729,3.33433100744475697,-104.81724584215],"rgb":[0.333333333333333315,0.0666666666666666657,0.8],"xyz":[0.148445920317730795,0.0669169853496402456,0.576381478060359],"hpluv":[271.822015936655589,427.964986778194486,31.0944914716528729],"hsluv":[271.822015936655589,96.2613872132177733,31.0944914716528729]},"#5511dd":{"lch":[33.0328257175950526,114.557035031638449,270.814150293263936],"luv":[33.0328257175950526,1.62775523553093748,-114.545469959022128],"rgb":[0.333333333333333315,0.0666666666666666657,0.866666666666666696],"xyz":[0.169964245868364339,0.0755243155698937796,0.689711325960365],"hpluv":[270.814150293263936,440.063516862193467,33.0328257175950526],"hsluv":[270.814150293263936,96.8053522828386832,33.0328257175950526]},"#5511ee":{"lch":[35.0130604571318926,124.169729525043778,270.033521846843314],"luv":[35.0130604571318926,0.0726475571782520396,-124.169708273213573],"rgb":[0.333333333333333315,0.0666666666666666657,0.933333333333333348],"xyz":[0.193776426134539104,0.0850491876763638244,0.815122142028888219],"hpluv":[270.033521846843314,450.012925469310176,35.0130604571318926],"hsluv":[270.033521846843314,97.2483877085506663,35.0130604571318926]},"#5511ff":{"lch":[37.0256255288684244,133.709282746677673,269.417732433602225],"luv":[37.0256255288684244,-1.35879534673770408,-133.702378317802101],"rgb":[0.333333333333333315,0.0666666666666666657,1],"xyz":[0.219947474544370469,0.0955176070402965205,0.952956330320670064],"hpluv":[269.417732433602225,458.245787382607887,37.0256255288684244],"hsluv":[269.417732433602225,99.999999999999531,37.0256255288684244]},"#552200":{"lch":[20.34436993371488,40.5799496107340403,26.5709502396200712],"luv":[20.34436993371488,36.2939416756913289,18.1516420207988389],"rgb":[0.333333333333333315,0.133333333333333331,0],"xyz":[0.0431823098773084293,0.0307565391490994891,0.0036627193159325909],"hpluv":[26.5709502396200712,253.10841584108,20.34436993371488],"hsluv":[26.5709502396200712,100.000000000002359,20.34436993371488]},"#552211":{"lch":[20.5030711832139332,37.4561676233306144,21.8926823519782197],"luv":[20.5030711832139332,34.7549742653004543,13.9662542166947503],"rgb":[0.333333333333333315,0.133333333333333331,0.0666666666666666657],"xyz":[0.0441939753769455546,0.031161205348954342,0.00899082428068822236],"hpluv":[21.8926823519782197,231.816181029165051,20.5030711832139332],"hsluv":[21.8926823519782197,79.998991439989,20.5030711832139332]},"#552222":{"lch":[20.7936643332181177,32.9512801850020054,12.1770506300619488],"luv":[20.7936643332181177,32.2098915499349658,6.95052171940595098],"rgb":[0.333333333333333315,0.133333333333333331,0.133333333333333331],"xyz":[0.0460693335154225697,0.0319113486043451633,0.0188677104766674167],"hpluv":[12.1770506300619488,201.08542320769223,20.7936643332181177],"hsluv":[12.1770506300619488,47.1205474310924046,20.7936643332181177]},"#552233":{"lch":[21.2623572347893699,28.8586800011052311,354.1745907436],"luv":[21.2623572347893699,28.7096478626609084,-2.92908364650122532],"rgb":[0.333333333333333315,0.133333333333333331,0.2],"xyz":[0.0491570842478803102,0.0331464488973282762,0.0351298643342785599],"hpluv":[354.1745907436,172.228245917758017,21.2623572347893699],"hsluv":[354.1745907436,52.8325366869496236,21.2623572347893699]},"#552244":{"lch":[21.9189283311679688,28.7014290952845421,329.54904741067952],"luv":[21.9189283311679688,24.7424491748557642,-14.5459011732283336],"rgb":[0.333333333333333315,0.133333333333333331,0.266666666666666663],"xyz":[0.0536150794920991908,0.0349296469950158492,0.0586086392871652],"hpluv":[329.54904741067952,166.158870546468904,21.9189283311679688],"hsluv":[329.54904741067952,59.1960886419386,21.9189283311679688]},"#552255":{"lch":[22.7630226511172538,33.9275210993755394,307.715012949244226],"luv":[22.7630226511172538,20.7546297224435,-26.8388157904337739],"rgb":[0.333333333333333315,0.133333333333333331,0.333333333333333315],"xyz":[0.0595774935314611828,0.0373146126107606821,0.0900106865611391138],"hpluv":[307.715012949244226,189.13048019699076,22.7630226511172538],"hsluv":[307.715012949244226,65.4333859354686211,22.7630226511172538]},"#552266":{"lch":[23.7863579144178132,42.6539605518829816,293.531429927677038],"luv":[23.7863579144178132,17.0296819355444384,-39.1069083914310625],"rgb":[0.333333333333333315,0.133333333333333331,0.4],"xyz":[0.0671624893049693611,0.0403486109201639936,0.129958330968283076],"hpluv":[293.531429927677038,227.546804006344104,23.7863579144178132],"hsluv":[293.531429927677038,71.0608597854246,23.7863579144178132]},"#552277":{"lch":[24.975052770659552,52.81712200152176,285.022920758889427],"luv":[24.975052770659552,13.6904851349353347,-51.0119495147337858],"rgb":[0.333333333333333315,0.133333333333333331,0.466666666666666674],"xyz":[0.0764765023251712805,0.04407421612824481,0.179012132874680985],"hpluv":[285.022920758889427,268.353735360872861,24.975052770659552],"hsluv":[285.022920758889427,75.8822745115455604,24.975052770659552]},"#552288":{"lch":[26.3119033569515395,63.3751525334233818,279.769698022236867],"luv":[26.3119033569515395,10.754023379801918,-62.4560720809542573],"rgb":[0.333333333333333315,0.133333333333333331,0.533333333333333326],"xyz":[0.0876169194271151086,0.0485303829690224,0.237684996278253152],"hpluv":[279.769698022236867,305.637106002952862,26.3119033569515395],"hsluv":[279.769698022236867,79.8897505498065357,26.3119033569515395]},"#552299":{"lch":[27.7783456471686065,73.9162973481211,276.357347681517297],"luv":[27.7783456471686065,8.18468635974612368,-73.4617582341209783],"rgb":[0.333333333333333315,0.133333333333333331,0.6],"xyz":[0.100673883536187808,0.0537531686126515654,0.306451673919371059],"hpluv":[276.357347681517297,337.654974874305083,27.7783456471686065],"hsluv":[276.357347681517297,83.1678045973750102,27.7783456471686065]},"#5522aa":{"lch":[29.3559430420228864,84.3037876124251824,274.032676149589577],"luv":[29.3559430420228864,5.92869585954675404,-84.0950603258353482],"rgb":[0.333333333333333315,0.133333333333333331,0.66666666666666663],"xyz":[0.115731576501440364,0.0597762457987526669,0.38575552353636966],"hpluv":[274.032676149589577,364.410076381253305,29.3559430420228864],"hsluv":[274.032676149589577,85.8312635149374898,29.3559430420228864]},"#5522bb":{"lch":[31.0273723986379082,94.5090555446981568,272.384235640696716],"luv":[31.0273723986379082,3.93164792491766635,-94.4272403734501324],"rgb":[0.333333333333333315,0.133333333333333331,0.733333333333333282],"xyz":[0.132869168608777,0.0666312826416874254,0.476013508635011406],"hpluv":[272.384235640696716,386.516244750379769,31.0273723986379082],"hsluv":[272.384235640696716,87.9935415010939437,31.0273723986379082]},"#5522cc":{"lch":[32.7769760620793207,104.54175742802569,271.176024316906762],"luv":[32.7769760620793207,2.1456208028374788,-104.519736688869415],"rgb":[0.333333333333333315,0.133333333333333331,0.8],"xyz":[0.152161544052498737,0.0743482328191762271,0.577620019305281507],"hpluv":[271.176024316906762,404.725193356887132,32.7769760620793207],"hsluv":[271.176024316906762,89.7538092894248507,32.7769760620793207]},"#5522dd":{"lch":[34.5909880118612847,114.421842397276407,270.265889656874094],"luv":[34.5909880118612847,0.530989812409553341,-114.420610326139567],"rgb":[0.333333333333333315,0.133333333333333331,0.866666666666666696],"xyz":[0.173679869603132281,0.0829555630394297611,0.690949867205287505],"hpluv":[270.265889656874094,419.744772471420788,34.5909880118612847],"hsluv":[270.265889656874094,91.1938440016712519,34.5909880118612847]},"#5522ee":{"lch":[36.4575428526747132,124.16924767107497,269.564389707514863],"luv":[36.4575428526747132,-0.94402906580191559,-124.165659005715739],"rgb":[0.333333333333333315,0.133333333333333331,0.933333333333333348],"xyz":[0.197492049869307018,0.092480435145899792,0.816360683273810728],"hpluv":[269.564389707514863,432.181309790662738,36.4575428526747132],"hsluv":[269.564389707514863,92.960018101107309,36.4575428526747132]},"#5522ff":{"lch":[38.3665568136218695,133.800754994484379,269.013084090219763],"luv":[38.3665568136218695,-2.30459494965050871,-133.780906258001124],"rgb":[0.333333333333333315,0.133333333333333331,1],"xyz":[0.223663098279138411,0.102948854509832488,0.954194871565592573],"hpluv":[269.013084090219763,442.532391911887146,38.3665568136218695],"hsluv":[269.013084090219763,99.9999999999994458,38.3665568136218695]},"#ccaa00":{"lch":[70.5858735612972623,80.4904122142546186,67.9906634155396],"luv":[70.5858735612972623,30.1643998932495876,74.6244962294604335],"rgb":[0.8,0.66666666666666663,0],"xyz":[0.392753797737474875,0.415879162748823417,0.059586129772359088],"hpluv":[67.9906634155396,144.699051457387782,70.5858735612972623],"hsluv":[67.9906634155396,100.000000000002373,70.5858735612972623]},"#ccaa11":{"lch":[70.6139482370970342,79.3332745728624786,67.7767588069511078],"luv":[70.6139482370970342,30.0051392857341135,73.4401802210267078],"rgb":[0.8,0.66666666666666663,0.0666666666666666657],"xyz":[0.393765463237112,0.416283828948678269,0.0649142347371147177],"hpluv":[67.7767588069511078,142.56214209062793,70.6139482370970342],"hsluv":[67.7767588069511078,98.4234445622979308,70.6139482370970342]},"#ccaa22":{"lch":[70.6659431154106,77.2098224605726529,67.3668792611096166],"luv":[70.6659431154106,29.7125737342128318,71.263733037795],"rgb":[0.8,0.66666666666666663,0.133333333333333331],"xyz":[0.395640821375589036,0.41703397220406907,0.0747911209330939103],"hpluv":[67.3668792611096166,138.644204697820271,70.6659431154106],"hsluv":[67.3668792611096166,95.5289103121581746,70.6659431154106]},"#ccaa33":{"lch":[70.7514162745237911,73.7740913884545,66.6515854645136159],"luv":[70.7514162745237911,29.2382542862800783,67.7328653349528622],"rgb":[0.8,0.66666666666666663,0.2],"xyz":[0.398728572108046742,0.418269072497052197,0.0910532747907050605],"hpluv":[66.6515854645136159,132.314688307412609,70.7514162745237911],"hsluv":[66.6515854645136159,90.8407422295077822,70.7514162745237911]},"#ccaa44":{"lch":[70.8745233475107597,68.9449101039795096,65.5199261400916271],"luv":[70.8745233475107597,28.5691680681362534,62.74713750555],"rgb":[0.8,0.66666666666666663,0.266666666666666663],"xyz":[0.403186567352265657,0.420052270594739763,0.114532049743591699],"hpluv":[65.5199261400916271,123.438713002021714,70.8745233475107597],"hsluv":[65.5199261400916271,84.237349466135143,70.8745233475107597]},"#ccaa55":{"lch":[71.0386313772099,62.7256766939065713,63.7915144306433959],"luv":[71.0386313772099,27.7020883768036121,56.2770363138665672],"rgb":[0.8,0.66666666666666663,0.333333333333333315],"xyz":[0.409148981391627642,0.422437236210484623,0.1459340970175656],"hpluv":[63.7915144306433959,112.044384698186093,71.0386313772099],"hsluv":[63.7915144306433959,75.6976413431368229,71.0386313772099]},"#ccaa66":{"lch":[71.2465086991263661,55.2096541299921952,61.1466680322388356],"luv":[71.2465086991263661,26.6424757380098143,48.3558103613508123],"rgb":[0.8,0.66666666666666663,0.4],"xyz":[0.416733977165135827,0.425471234519887942,0.185881741424709562],"hpluv":[61.1466680322388356,98.331070119416168,71.2465086991263661],"hsluv":[61.1466680322388356,65.2901205751262,71.2465086991263661]},"#ccaa77":{"lch":[71.5004247203994794,46.6032511345785068,56.9687004258729388],"luv":[71.5004247203994794,25.4032971934547263,39.0709035986321638],"rgb":[0.8,0.66666666666666663,0.466666666666666674],"xyz":[0.426047990185337733,0.429196839727968737,0.234935543331107471],"hpluv":[56.9687004258729388,82.707885898124573,71.5004247203994794],"hsluv":[56.9687004258729388,53.160756563752912,71.5004247203994794]},"#ccaa88":{"lch":[71.8022091544958556,37.3024926838847648,49.9478623796008847],"luv":[71.8022091544958556,24.003572993357885,28.5535364531929083],"rgb":[0.8,0.66666666666666663,0.533333333333333326],"xyz":[0.437188407287281533,0.433653006568746335,0.293608406734679639],"hpluv":[49.9478623796008847,65.9233659814751149,71.8022091544958556],"hsluv":[49.9478623796008847,39.5178130280575743,71.8022091544958556]},"#ccaa99":{"lch":[72.1532912119235874,28.1535194843350283,37.0598425499876214],"luv":[72.1532912119235874,22.4666918036374241,16.9666855559712388],"rgb":[0.8,0.66666666666666663,0.6],"xyz":[0.450245371396354233,0.438875792212375493,0.362375084375797574],"hpluv":[37.0598425499876214,49.5126161932360702,72.1532912119235874],"hsluv":[37.0598425499876214,26.6696495224772221,72.1532912119235874]},"#ccaaaa":{"lch":[72.5547286434336,21.297823518763618,12.177050630063027],"luv":[72.5547286434336,20.8186322940273918,4.49241984263274841],"rgb":[0.8,0.66666666666666663,0.66666666666666663],"xyz":[0.465303064361606789,0.444898869398476615,0.441678933992796174],"hpluv":[12.177050630063027,37.2485034287350203,72.5547286434336],"hsluv":[12.177050630063027,27.9047031904792959,72.5547286434336]},"#ccaabb":{"lch":[73.0072318845295,20.9674028584132515,335.544386587188285],"luv":[73.0072318845295,19.0862548050106788,-8.68025691700441193],"rgb":[0.8,0.66666666666666663,0.733333333333333282],"xyz":[0.482440656468943463,0.451753906241411374,0.531936919091437921],"hpluv":[335.544386587188285,36.4433325399841053,73.0072318845295],"hsluv":[335.544386587188285,29.1493731958161852,73.0072318845295]},"#ccaacc":{"lch":[73.5111862218870442,28.2733952257813925,307.715012949249683],"luv":[73.5111862218870442,17.2958067637387,-22.366044486780595],"rgb":[0.8,0.66666666666666663,0.8],"xyz":[0.501733031912665162,0.459470856418900175,0.633543429761708077],"hpluv":[307.715012949249683,48.8049486057506,73.5111862218870442],"hsluv":[307.715012949249683,30.3693282248248444,73.5111862218870442]},"#ccaadd":{"lch":[74.0666736076556,39.5441054640130645,293.032470315564865],"luv":[74.0666736076556,15.4717391639018693,-36.3917787995197202],"rgb":[0.8,0.66666666666666663,0.866666666666666696],"xyz":[0.523251357463298761,0.468078186639153682,0.746873277661714075],"hpluv":[293.032470315564865,67.7482749884916871,74.0666736076556],"hsluv":[293.032470315564865,52.1368854824616719,74.0666736076556]},"#ccaaee":{"lch":[74.6734949675833093,52.4074038625381462,285.081329657377239],"luv":[74.6734949675833093,13.6358764846886817,-50.6023601436286],"rgb":[0.8,0.66666666666666663,0.933333333333333348],"xyz":[0.54706353772947347,0.477603058745623699,0.872284093730237298],"hpluv":[285.081329657377239,89.0564736794959799,74.6734949675833093],"hsluv":[285.081329657377239,75.3315532053798194,74.6734949675833093]},"#ccaaff":{"lch":[75.3311933526529316,65.9300530396585458,280.316334998223624],"luv":[75.3311933526529316,11.8069327652914797,-64.8642292214135239],"rgb":[0.8,0.66666666666666663,1],"xyz":[0.573234586139304891,0.488071478109556423,1.01011828202201914],"hpluv":[280.316334998223624,111.057502918871393,75.3311933526529316],"hsluv":[280.316334998223624,99.9999999999973426,75.3311933526529316]},"#553300":{"lch":[24.6368918170402651,35.1311640480653367,43.6144672720514848],"luv":[24.6368918170402651,25.4348822629288698,24.2335604409056025],"rgb":[0.333333333333333315,0.2,0],"xyz":[0.049300031966319241,0.0429919833271212859,0.00570196001226947087],"hpluv":[43.6144672720514848,180.944734702515461,24.6368918170402651],"hsluv":[43.6144672720514848,100.000000000002245,24.6368918170402651]},"#553311":{"lch":[24.7639934196671305,31.9442274162558917,39.8156129865950632],"luv":[24.7639934196671305,24.536650698978292,20.4544967598277161],"rgb":[0.333333333333333315,0.2,0.0666666666666666657],"xyz":[0.0503116974659563593,0.0433966495269761388,0.0110300649770251023],"hpluv":[39.8156129865950632,163.685811409294416,24.7639934196671305],"hsluv":[39.8156129865950632,85.3309596574143256,24.7639934196671305]},"#553322":{"lch":[24.9975315322943885,26.9096454002331456,31.2519949010175395],"luv":[24.9975315322943885,23.0048892205904032,13.9608054035092266],"rgb":[0.333333333333333315,0.2,0.133333333333333331],"xyz":[0.0521870556044333814,0.0441467927823669601,0.0209069511730043],"hpluv":[31.2519949010175395,136.59983556614165,24.9975315322943885],"hsluv":[31.2519949010175395,60.4417762068684823,24.9975315322943885]},"#553333":{"lch":[25.3763514371309924,21.2787516643900716,12.1770506300621495],"luv":[25.3763514371309924,20.7999895475976082,4.48839695377019332],"rgb":[0.333333333333333315,0.2,0.2],"xyz":[0.0552748063368911219,0.0453818930753500729,0.0371691050306154416],"hpluv":[12.1770506300621495,106.403592780468983,25.3763514371309924],"hsluv":[12.1770506300621495,24.9336598370546909,25.3763514371309924]},"#553344":{"lch":[25.9113402150992655,19.4972565515274532,338.627269772390264],"luv":[25.9113402150992655,18.1564179844864455,-7.10545558065754257],"rgb":[0.333333333333333315,0.2,0.266666666666666663],"xyz":[0.05973280158111,0.047165091173037646,0.0606478799835020801],"hpluv":[338.627269772390264,95.4823185470749536,25.9113402150992655],"hsluv":[338.627269772390264,32.9723178491547841,25.9113402150992655]},"#553355":{"lch":[26.6061908173450519,25.0719265662328183,307.715012949245363],"luv":[26.6061908173450519,15.3373584467403763,-19.8334802195371829],"rgb":[0.333333333333333315,0.2,0.333333333333333315],"xyz":[0.065695215620472,0.0495500567887824789,0.0920499272574759886],"hpluv":[307.715012949245363,119.576085528419512,26.6061908173450519],"hsluv":[307.715012949245363,41.369683748934996,26.6061908173450519]},"#553366":{"lch":[27.4586282592714284,35.2024776289392847,290.893042573756475],"luv":[27.4586282592714284,12.5540679631371699,-32.8878367910220533],"rgb":[0.333333333333333315,0.2,0.4],"xyz":[0.0732802113939801658,0.0525840550981857904,0.13199757166461995],"hpluv":[290.893042573756475,162.679833835368925,27.4586282592714284],"hsluv":[290.893042573756475,49.429407074258,27.4586282592714284]},"#553377":{"lch":[28.461655060413058,46.8206771520520633,282.253113271302652],"luv":[28.461655060413058,9.93678843358592445,-45.7540822725452898],"rgb":[0.333333333333333315,0.2,0.466666666666666674],"xyz":[0.0825942244141820853,0.0563096603062666068,0.18105137357101786],"hpluv":[282.253113271302652,208.74537696470955,28.461655060413058],"hsluv":[282.253113271302652,56.732994513665389,28.461655060413058]},"#553388":{"lch":[29.6048600369324433,58.6666973974172876,277.388246485053742],"luv":[29.6048600369324433,7.54407762538358551,-58.1796207988872567],"rgb":[0.333333333333333315,0.2,0.533333333333333326],"xyz":[0.0937346415161259133,0.0607658271470442046,0.239724236974590027],"hpluv":[277.388246485053742,251.459446283522851,29.6048600369324433],"hsluv":[277.388246485053742,63.1061783000114715,29.6048600369324433]},"#553399":{"lch":[30.8756880539778678,70.2946203588512759,274.394660626066695],"luv":[30.8756880539778678,5.38640350826703,-70.0879469569565714],"rgb":[0.333333333333333315,0.2,0.6],"xyz":[0.106791605625198627,0.0659886127906733622,0.308490914615707934],"hpluv":[274.394660626066695,288.898157334443908,30.8756880539778678],"hsluv":[274.394660626066695,68.537799314251,30.8756880539778678]},"#5533aa":{"lch":[32.2605562861205,81.571224268378316,272.422737250332261],"luv":[32.2605562861205,3.44819039224039026,-81.498310483475251],"rgb":[0.333333333333333315,0.2,0.66666666666666663],"xyz":[0.121849298590451169,0.0720116899767744567,0.387794764232706535],"hpluv":[272.422737250332261,320.851781583216223,32.2605562861205],"hsluv":[272.422737250332261,73.1042224024611897,32.2605562861205]},"#5533bb":{"lch":[33.7457437232739395,92.4864953275551755,271.055064965734516],"luv":[33.7457437232739395,1.70298313903478205,-92.4708152143261231],"rgb":[0.333333333333333315,0.2,0.733333333333333282],"xyz":[0.138986890697787802,0.0788667268197092153,0.478052749331348281],"hpluv":[271.055064965734516,347.775228922495899,33.7457437232739395],"hsluv":[271.055064965734516,76.9172199670655772,33.7457437232739395]},"#5533cc":{"lch":[35.3180325241442,103.075547069605378,270.067872161558512],"luv":[35.3180325241442,0.12210251098248695,-103.075474748725966],"rgb":[0.333333333333333315,0.2,0.8],"xyz":[0.158279266141509556,0.0865836769971980169,0.579659260001618493],"hpluv":[270.067872161558512,370.338167129355497,35.3180325241442],"hsluv":[270.067872161558512,80.0940957669769205,35.3180325241442]},"#5533dd":{"lch":[36.9651203282397915,113.385246995104879,269.332372034398134],"luv":[36.9651203282397915,-1.32116971635525937,-113.377549570986602],"rgb":[0.333333333333333315,0.2,0.866666666666666696],"xyz":[0.179797591692143099,0.0951910072174515509,0.69298910790162449],"hpluv":[269.332372034398134,389.227711455139399,36.9651203282397915],"hsluv":[269.332372034398134,84.8119298710034855,36.9651203282397915]},"#5533ee":{"lch":[38.6758450270606247,123.460606758128,268.77009087446072],"luv":[38.6758450270606247,-2.64999738284680575,-123.432163292052948],"rgb":[0.333333333333333315,0.2,0.933333333333333348],"xyz":[0.203609771958317837,0.104715879323921596,0.818399923970147714],"hpluv":[268.77009087446072,405.067987408818738,38.6758450270606247],"hsluv":[268.77009087446072,92.2936685874649356,38.6758450270606247]},"#5533ff":{"lch":[40.4402700894382363,133.340096114557781,268.33094335317071],"luv":[40.4402700894382363,-3.88371885476632706,-133.283524712158766],"rgb":[0.333333333333333315,0.2,1],"xyz":[0.22978082036814923,0.115184298687854292,0.956234112261929559],"hpluv":[268.33094335317071,418.394573227645935,40.4402700894382363],"hsluv":[268.33094335317071,99.99999999999946,40.4402700894382363]},"#ccbb00":{"lch":[75.0632334950121418,83.0331806403360275,77.5616137481136292],"luv":[75.0632334950121418,17.8844849446013434,81.0842419062853423],"rgb":[0.8,0.733333333333333282,0],"xyz":[0.426708295646073654,0.483788158566022,0.0709042957418917],"hpluv":[77.5616137481136292,140.366584388758554,75.0632334950121418],"hsluv":[77.5616137481136292,100.000000000002373,75.0632334950121418]},"#ccbb11":{"lch":[75.0886164663743898,81.9438461169387438,77.472162284636525],"luv":[75.0886164663743898,17.7747618107910519,79.9928231718707394],"rgb":[0.8,0.733333333333333282,0.0666666666666666657],"xyz":[0.427719961145710759,0.484192824765876828,0.0762324007066473436],"hpluv":[77.472162284636525,138.478250548668058,75.0886164663743898],"hsluv":[77.472162284636525,98.6397508878022222,75.0886164663743898]},"#ccbb22":{"lch":[75.1356323460541802,79.9401497843360289,77.301186242421764],"luv":[75.1356323460541802,17.5729239259544805,77.9847414064744839],"rgb":[0.8,0.733333333333333282,0.133333333333333331],"xyz":[0.429595319284187815,0.484942968021267629,0.0861092869026265362],"hpluv":[77.301186242421764,135.007637737713509,75.1356323460541802],"hsluv":[77.301186242421764,96.1390577710114087,75.1356323460541802]},"#ccbb33":{"lch":[75.2129378077961235,76.6847204783522471,77.0041162235267223],"luv":[75.2129378077961235,17.2449407213965777,74.720535158405653],"rgb":[0.8,0.733333333333333282,0.2],"xyz":[0.432683070016645521,0.486178068314250755,0.102371440760237686],"hpluv":[77.0041162235267223,129.376563997369885,75.2129378077961235],"hsluv":[77.0041162235267223,92.0797058264172392,75.2129378077961235]},"#ccbb44":{"lch":[75.3243183189310628,72.0782997366288,76.5373230188340585],"luv":[75.3243183189310628,16.7806861485978907,70.0977165484408431],"rgb":[0.8,0.733333333333333282,0.266666666666666663],"xyz":[0.437141065260864436,0.487961266411938321,0.125850215713124325],"hpluv":[76.5373230188340585,121.425150369898518,75.3243183189310628],"hsluv":[76.5373230188340585,86.34290383100182,75.3243183189310628]},"#ccbb55":{"lch":[75.4728625341146397,66.0852327898053,75.831238609121371],"luv":[75.4728625341146397,16.1762634357197506,64.0748507149330351],"rgb":[0.8,0.733333333333333282,0.333333333333333315],"xyz":[0.443103479300226422,0.490346232027683182,0.157252262987098212],"hpluv":[75.831238609121371,111.10994393806304,75.4728625341146397],"hsluv":[75.831238609121371,78.8905565478608395,75.4728625341146397]},"#ccbb66":{"lch":[75.6611363515091284,58.7289677793131,74.7643785098968863],"luv":[75.6611363515091284,15.4333320312120961,56.6648384700597134],"rgb":[0.8,0.733333333333333282,0.4],"xyz":[0.450688475073734607,0.493380230337086501,0.197199907394242202],"hpluv":[74.7643785098968863,98.4960546107130739,75.6611363515091284],"hsluv":[74.7643785098968863,69.7569980114599701,75.6611363515091284]},"#ccbb77":{"lch":[75.8912747684230737,50.090867045562554,73.1036630558194389],"luv":[75.8912747684230737,14.5584607724557671,47.9285528814827799],"rgb":[0.8,0.733333333333333282,0.466666666666666674],"xyz":[0.460002488093936512,0.497105835545167296,0.246253709300640111],"hpluv":[73.1036630558194389,83.7540906733876795,75.8912747684230737],"hsluv":[73.1036630558194389,59.0406908273499624,75.8912747684230737]},"#ccbb88":{"lch":[76.1650362860674335,40.3168412407358332,70.3426656865815119],"luv":[76.1650362860674335,13.5623472284534756,37.9672283066009157],"rgb":[0.8,0.733333333333333282,0.533333333333333326],"xyz":[0.471142905195880313,0.501562002385944838,0.304926572704212251],"hpluv":[70.3426656865815119,67.6831847004182379,76.1650362860674335],"hsluv":[70.3426656865815119,46.8939441374685586,76.1650362860674335]},"#ccbb99":{"lch":[76.4838383644648871,29.6573629081618826,65.1594516064859732],"luv":[76.4838383644648871,12.4588924968264081,26.9134756658990248],"rgb":[0.8,0.733333333333333282,0.6],"xyz":[0.484199869304953068,0.506784788029574,0.373693250345330186],"hpluv":[65.1594516064859732,50.6096239917615662,76.4838383644648871],"hsluv":[65.1594516064859732,33.5105935092195324,76.4838383644648871]},"#ccbbaa":{"lch":[76.8487828748923,18.695758935396551,52.9508743401004551],"luv":[76.8487828748923,11.26418644921627,14.9214444946778713],"rgb":[0.8,0.733333333333333282,0.66666666666666663],"xyz":[0.499257562270205568,0.512807865215675118,0.452997099962328786],"hpluv":[52.9508743401004551,32.5142912020767696,76.8487828748923],"hsluv":[52.9508743401004551,19.1124274046376854,76.8487828748923]},"#ccbbbb":{"lch":[77.2606763328388126,10.2255548171674207,12.1770506300639045],"luv":[77.2606763328388126,9.99548454110707,2.15690985147396086],"rgb":[0.8,0.733333333333333282,0.733333333333333282],"xyz":[0.516395154377542243,0.519662902058609877,0.543255085060970533],"hpluv":[12.1770506300639045,18.1733155366010308,77.2606763328388126],"hsluv":[12.1770506300639045,17.1437484893634,77.2606763328388126]},"#ccbbcc":{"lch":[77.7200476270310361,14.1732404034447406,307.715012949257925],"luv":[77.7200476270310361,8.67025786172679247,-11.2119299027867267],"rgb":[0.8,0.733333333333333282,0.8],"xyz":[0.535687529821264,0.527379852236098734,0.644861595731240689],"hpluv":[307.715012949257925,25.815587331502627,77.7200476270310361],"hsluv":[307.715012949257925,18.1614974693692588,77.7200476270310361]},"#ccbbdd":{"lch":[78.2271648233418375,26.0669286991650679,286.275412631614586],"luv":[78.2271648233418375,7.3053819239814537,-25.022313377306272],"rgb":[0.8,0.733333333333333282,0.866666666666666696],"xyz":[0.557205855371897485,0.53598718245635224,0.758191443631246687],"hpluv":[286.275412631614586,48.8074477639820898,78.2271648233418375],"hsluv":[286.275412631614586,43.4510455050629929,78.2271648233418375]},"#ccbbee":{"lch":[78.7820519440635,39.5678846485468299,278.599571826643512],"luv":[78.7820519440635,5.9165048525659989,-39.1230426461218741],"rgb":[0.8,0.733333333333333282,0.933333333333333348],"xyz":[0.581018035638072305,0.545512054562822257,0.88360225969976991],"hpluv":[278.599571826643512,76.4037468789834,78.7820519440635],"hsluv":[278.599571826643512,70.6968150087455314,78.7820519440635]},"#ccbbff":{"lch":[79.3845061922316546,53.5695670840829834,274.837592460092935],"luv":[79.3845061922316546,4.51760925339512553,-53.3787385033564235],"rgb":[0.8,0.733333333333333282,1],"xyz":[0.607189084047903616,0.555980473926755,1.02143644799155164],"hpluv":[274.837592460092935,107.038572744282547,79.3845061922316546],"hsluv":[274.837592460092935,99.9999999999963762,79.3845061922316546]},"#554400":{"lch":[29.5776499109456879,34.0768703371065413,65.9474553070004674],"luv":[29.5776499109456879,13.8888553561515469,31.1180460322924546],"rgb":[0.333333333333333315,0.266666666666666663,0],"xyz":[0.0581326024492852811,0.0606571242930536,0.0086461501732580659],"hpluv":[65.9474553070004674,146.195957524823825,29.5776499109456879],"hsluv":[65.9474553070004674,100.000000000002217,29.5776499109456879]},"#554411":{"lch":[29.6787804923011507,30.8713815411758574,64.2244588846852906],"luv":[29.6787804923011507,13.4243191404277429,27.7998175151708296],"rgb":[0.333333333333333315,0.266666666666666663,0.0666666666666666657],"xyz":[0.0591442679489224,0.0610617904929084548,0.0139742551380136974],"hpluv":[64.2244588846852906,131.992525946838612,29.6787804923011507],"hsluv":[64.2244588846852906,89.4077694450363509,29.6787804923011507]},"#554422":{"lch":[29.8650740872788916,25.3442505658492152,60.1547603291711539],"luv":[29.8650740872788916,12.6127938179319639,21.9829131111162219],"rgb":[0.333333333333333315,0.266666666666666663,0.133333333333333331],"xyz":[0.0610196260873994215,0.0618119337482992762,0.0238511413339928952],"hpluv":[60.1547603291711539,107.684992873038837,29.8650740872788916],"hsluv":[60.1547603291711539,70.9921927199271892,29.8650740872788916]},"#554433":{"lch":[30.1685472793317686,17.4710669916127905,49.2680266756281497],"luv":[30.1685472793317686,11.400244593092479,13.2390560480378525],"rgb":[0.333333333333333315,0.266666666666666663,0.2],"xyz":[0.064107376819857162,0.0630470340412823821,0.0401132951916040384],"hpluv":[49.2680266756281497,73.4859575586117302,30.1685472793317686],"hsluv":[49.2680266756281497,43.7071568358896,30.1685472793317686]},"#554444":{"lch":[30.5997780424982437,10.1013456632853149,12.1770506300629258],"luv":[30.5997780424982437,9.87407003600776356,2.13071000682558],"rgb":[0.333333333333333315,0.266666666666666663,0.266666666666666663],"xyz":[0.0685653720640760356,0.0648302321389699621,0.06359207014449067],"hpluv":[12.1770506300629258,41.8890279889816597,30.5997780424982437],"hsluv":[12.1770506300629258,9.81589763549682282,30.5997780424982437]},"#554455":{"lch":[31.1643459369041338,13.3310860490153988,307.715012949249],"luv":[31.1643459369041338,8.15508312366709198,-10.5457325251654854],"rgb":[0.333333333333333315,0.266666666666666663,0.333333333333333315],"xyz":[0.0745277861034380346,0.0672151977547148,0.0949941174184645853],"hpluv":[307.715012949249,54.2808752323906702,31.1643459369041338],"hsluv":[307.715012949249,18.7795296363480162,31.1643459369041338]},"#554466":{"lch":[31.8635722620044533,24.8340912161126894,284.841165372516684],"luv":[31.8635722620044533,6.36101223964894835,-24.005616214070443],"rgb":[0.333333333333333315,0.266666666666666663,0.4],"xyz":[0.0821127818769462,0.0702491960641181135,0.134941761825608547],"hpluv":[284.841165372516684,98.8992811700442331,31.8635722620044533],"hsluv":[284.841165372516684,27.8963704264996828,31.8635722620044533]},"#554477":{"lch":[32.6951743277909443,37.9095930577936784,276.944338121378166],"luv":[32.6951743277909443,4.58346102749711282,-37.6314912117090259],"rgb":[0.333333333333333315,0.266666666666666663,0.466666666666666674],"xyz":[0.0914267948971481254,0.0739748012721989229,0.183995563732006456],"hpluv":[276.944338121378166,147.131204947893167,32.6951743277909443],"hsluv":[276.944338121378166,36.6308714978363952,32.6951743277909443]},"#554488":{"lch":[33.6539551717380903,51.1018638808679526,273.231940865766],"luv":[33.6539551717380903,2.88102600900669881,-51.0205858574182116],"rgb":[0.333333333333333315,0.266666666666666663,0.533333333333333326],"xyz":[0.102567211999091953,0.0784309681129765207,0.242668427135578624],"hpluv":[273.231940865766,192.681471981123309,33.6539551717380903],"hsluv":[273.231940865766,44.6505812495932801,33.6539551717380903]},"#554499":{"lch":[34.7325237210335871,63.9719124096453271,271.149517924849135],"luv":[34.7325237210335871,1.28337422751110575,-63.9590378909774913],"rgb":[0.333333333333333315,0.266666666666666663,0.6],"xyz":[0.115624176108164667,0.0836537537566056782,0.311435104776696559],"hpluv":[271.149517924849135,233.718085138698228,34.7325237210335871],"hsluv":[271.149517924849135,51.7999710200133876,34.7325237210335871]},"#5544aa":{"lch":[35.9219992682327671,76.3678985235758461,269.849629436139082],"luv":[35.9219992682327671,-0.200424374653859844,-76.367635520403681],"rgb":[0.333333333333333315,0.266666666666666663,0.66666666666666663],"xyz":[0.130681869073417223,0.0896768309427067867,0.390738954393695104],"hpluv":[269.849629436139082,269.767524553786757,35.9219992682327671],"hsluv":[269.849629436139082,58.0490239963672465,35.9219992682327671]},"#5544bb":{"lch":[37.2126506061998725,88.2627815084196925,268.978337620063314],"luv":[37.2126506061998725,-1.57376312233016602,-88.2487499584998574],"rgb":[0.333333333333333315,0.266666666666666663,0.733333333333333282],"xyz":[0.147819461180753842,0.0965318677856415452,0.480996939492336906],"hpluv":[268.978337620063314,300.972163983169935,37.2126506061998725],"hsluv":[268.978337620063314,66.0075029321504729,37.2126506061998725]},"#5544cc":{"lch":[38.5944341452357733,99.6871153018899605,268.363808876145868],"luv":[38.5944341452357733,-2.84637030136680202,-99.6464707519528758],"rgb":[0.333333333333333315,0.266666666666666663,0.8],"xyz":[0.167111836624475596,0.104248817963130347,0.582603450162607062],"hpluv":[268.363808876145868,327.758284181939189,38.5944341452357733],"hsluv":[268.363808876145868,74.5283681063652352,38.5944341452357733]},"#5544dd":{"lch":[40.0574145710935738,110.694467066426,267.913412719582],"luv":[40.0574145710935738,-4.03035995406870118,-110.621070496360275],"rgb":[0.333333333333333315,0.266666666666666663,0.866666666666666696],"xyz":[0.18863016217510914,0.112856148183383881,0.695933298062613059],"hpluv":[267.913412719582,350.65684831918054,40.0574145710935738],"hsluv":[267.913412719582,82.9425769408534,40.0574145710935738]},"#5544ee":{"lch":[41.5920687629554777,121.343449115737442,267.573227144435918],"luv":[41.5920687629554777,-5.13798666158471651,-121.23462268002875],"rgb":[0.333333333333333315,0.266666666666666663,0.933333333333333348],"xyz":[0.212442342441283877,0.122381020289853898,0.821344114131136283],"hpluv":[267.573227144435918,370.207437425804358,41.5920687629554777],"hsluv":[267.573227144435918,91.3878688389195872,41.5920687629554777]},"#5544ff":{"lch":[43.1894854939413833,131.689092168021887,267.309962581974105],"luv":[43.1894854939413833,-6.18053297470727,-131.543977468321657],"rgb":[0.333333333333333315,0.266666666666666663,1],"xyz":[0.23861339085111527,0.132849439653786594,0.959178302422918128],"hpluv":[267.309962581974105,386.911020330846497,43.1894854939413833],"hsluv":[267.309962581974105,99.9999999999994174,43.1894854939413833]},"#cccc00":{"lch":[79.627228346343,87.7811065558180132,85.8743202181747449],"luv":[79.627228346343,6.31536666608958797,87.5536339167982192],"rgb":[0.8,0.8,0],"xyz":[0.464932038955690574,0.560235645185256814,0.0836455435117636481],"hpluv":[85.8743202181747449,177.871840357077815,79.627228346343],"hsluv":[85.8743202181747449,100.000000000002245,79.627228346343]},"#cccc11":{"lch":[79.6502471087807891,86.7718911178833707,85.8743202181747],"luv":[79.6502471087807891,6.24275917928854351,86.5470337215737],"rgb":[0.8,0.8,0.0666666666666666657],"xyz":[0.465943704455327679,0.560640311385111723,0.0889736484765192848],"hpluv":[85.8743202181747,176.061859354342118,79.6502471087807891],"hsluv":[85.8743202181747,98.8217369524532927,79.6502471087807891]},"#cccc22":{"lch":[79.6928884771461838,84.9132131482774497,85.8743202181746597],"luv":[79.6928884771461838,6.10903754655005482,84.6931722597497298],"rgb":[0.8,0.8,0.133333333333333331],"xyz":[0.467819062593804735,0.561390454640502523,0.0988505346724984774],"hpluv":[85.8743202181746597,172.717957044242922,79.6928884771461838],"hsluv":[85.8743202181746597,96.653203912443459,79.6928884771461838]},"#cccc33":{"lch":[79.7630142061039891,81.8867831673476445,85.8743202181745602],"luv":[79.7630142061039891,5.89130259459140682,81.6745848549912665],"rgb":[0.8,0.8,0.2],"xyz":[0.470906813326262441,0.56262555493348565,0.115112688530109614],"hpluv":[85.8743202181745602,167.243641009868185,79.7630142061039891],"hsluv":[85.8743202181745602,93.1263971058523623,79.7630142061039891]},"#cccc44":{"lch":[79.8640786601047523,77.5899505798540901,85.8743202181744],"luv":[79.8640786601047523,5.58216917901353593,77.3888869169280156],"rgb":[0.8,0.8,0.266666666666666663],"xyz":[0.475364808570481356,0.564408753031173216,0.138591463482996252],"hpluv":[85.8743202181744,159.406599578518,79.8640786601047523],"hsluv":[85.8743202181744,88.1281264379617113,79.8640786601047523]},"#cccc55":{"lch":[79.9989166638852396,71.9729259129294832,85.8743202181741481],"luv":[79.9989166638852396,5.17805522174052,71.7864179952492236],"rgb":[0.8,0.8,0.333333333333333315],"xyz":[0.481327222609843342,0.566793718646918,0.169993510756970168],"hpluv":[85.8743202181741481,149.042041148428552,79.9989166638852396],"hsluv":[85.8743202181741481,81.6104176612222147,79.9989166638852396]},"#cccc66":{"lch":[80.1699032642976448,65.0330295388014,85.8743202181738],"luv":[80.1699032642976448,4.67876793832737103,64.8645054060685453],"rgb":[0.8,0.8,0.4],"xyz":[0.488912218383351527,0.569827716956321284,0.209941155164114129],"hpluv":[85.8743202181738,136.038559250079544,80.1699032642976448],"hsluv":[85.8743202181738,73.5839630734023,80.1699032642976448]},"#cccc77":{"lch":[80.3790384438565724,56.8098315426934803,85.8743202181733096],"luv":[80.3790384438565724,4.0871541782499472,56.6626166941875837],"rgb":[0.8,0.8,0.466666666666666674],"xyz":[0.498226231403553432,0.573553322164402135,0.258994957070512],"hpluv":[85.8743202181733096,120.326663009793734,80.3790384438565724],"hsluv":[85.8743202181733096,64.1122831116318252,80.3790384438565724]},"#cccc88":{"lch":[80.6279973255091704,47.3795499902223085,85.8743202181724854],"luv":[80.6279973255091704,3.40869741112766222,47.2567724166107865],"rgb":[0.8,0.8,0.533333333333333326],"xyz":[0.509366648505497288,0.578009489005179677,0.317667820474084206],"hpluv":[85.8743202181724854,101.866799769447482,80.6279973255091704],"hsluv":[85.8743202181724854,53.3047126681541172,80.6279973255091704]},"#cccc99":{"lch":[80.9181626169042119,36.8483625211582861,85.8743202181711496],"luv":[80.9181626169042119,2.65103653276840934,36.7528750683892724],"rgb":[0.8,0.8,0.6],"xyz":[0.522423612614569932,0.58323227464880889,0.386434498115202141],"hpluv":[85.8743202181711496,80.635831276566,80.9181626169042119],"hsluv":[85.8743202181711496,41.30786304104587,80.9181626169042119]},"#ccccaa":{"lch":[81.2506473976222452,25.3448572993520607,85.8743202181683216],"luv":[81.2506473976222452,1.82342275263520492,25.27917959487],"rgb":[0.8,0.8,0.66666666666666663],"xyz":[0.537481305579822544,0.58925535183491,0.465738347732200686],"hpluv":[85.8743202181683216,56.6117825452175509,81.2506473976222452],"hsluv":[85.8743202181683216,28.2959036617823898,81.2506473976222452]},"#ccccbb":{"lch":[81.6263125989092657,13.0121158497344798,85.8743202181599],"luv":[81.6263125989092657,0.936149997616518514,12.9783967449324749],"rgb":[0.8,0.8,0.733333333333333282],"xyz":[0.554618897687159107,0.596110388677844716,0.555996332830842488],"hpluv":[85.8743202181599,29.7570160502500514,81.6263125989092657],"hsluv":[85.8743202181599,14.4603328966824272,81.6263125989092657]},"#cccccc":{"lch":[82.0457816743453,4.34523248843710382e-12,0],"luv":[82.0457816743453,4.08534684758697557e-12,1.48019813318368677e-12],"rgb":[0.8,0.8,0.8],"xyz":[0.573911273130880861,0.603827338855333573,0.657602843501112644],"hpluv":[0,1.02065966511349575e-11,82.0457816743453],"hsluv":[0,1.01642596056880755e-11,82.0457816743453]},"#ccccdd":{"lch":[82.5094539517328087,13.5418343873660199,265.874320218194214],"luv":[82.5094539517328087,-0.974260325972223118,-13.5067425899839115],"rgb":[0.8,0.8,0.866666666666666696],"xyz":[0.59542959868151446,0.612434669075587079,0.770932691401118642],"hpluv":[265.874320218194214,32.7843842039110882,82.5094539517328087],"hsluv":[265.874320218194214,30.4637656032122131,82.5094539517328087]},"#ccccee":{"lch":[83.0175175610870895,27.4698052042972165,265.874320218185687],"luv":[83.0175175610870895,-1.97630103922669687,-27.3986209901955817],"rgb":[0.8,0.8,0.933333333333333348],"xyz":[0.61924177894768917,0.621959541182057096,0.896343507469641865],"hpluv":[265.874320218185687,68.7964750954906776,83.0175175610870895],"hsluv":[265.874320218185687,63.7216981471091941,83.0175175610870895]},"#ccccff":{"lch":[83.5699624582004219,41.6509292947620153,265.874320218182845],"luv":[83.5699624582004219,-2.99655473483939438,-41.5429966521238825],"rgb":[0.8,0.8,1],"xyz":[0.645412827357520591,0.63242796054598982,1.03417769576142371],"hpluv":[265.874320218182845,108.336501116640306,83.5699624582004219],"hsluv":[265.874320218182845,99.9999999999952536,83.5699624582004219]},"#555500":{"lch":[34.8595382729148753,38.4291768930055397,85.8743202181747307],"luv":[34.8595382729148753,2.76476741155027961,38.3295929776711901],"rgb":[0.333333333333333315,0.333333333333333315,0],"xyz":[0.0699458591636312466,0.084283637721745866,0.0125839024113732767],"hpluv":[85.8743202181747307,139.887458074797564,34.8595382729148753],"hsluv":[85.8743202181747307,100.000000000002331,34.8595382729148753]},"#555511":{"lch":[34.9408046802893,35.5443725161734108,85.8743202181745318],"luv":[34.9408046802893,2.55722164100294558,35.4522641737772517],"rgb":[0.333333333333333315,0.333333333333333315,0.0666666666666666657],"xyz":[0.0709575246632683648,0.0846883039216007188,0.0179120073761289064],"hpluv":[85.8743202181745318,129.085444875460666,34.9408046802893],"hsluv":[85.8743202181745318,92.2780688504912,34.9408046802893]},"#555522":{"lch":[35.0907688239250604,30.4130442263608813,85.8743202181740202],"luv":[35.0907688239250604,2.18805086034508589,30.3342330139914047],"rgb":[0.333333333333333315,0.333333333333333315,0.133333333333333331],"xyz":[0.0728328828017454,0.0854384471769915332,0.027788893572108106],"hpluv":[85.8743202181740202,109.978131404858061,35.0907688239250604],"hsluv":[85.8743202181740202,78.6190076783406653,35.0907688239250604]},"#555533":{"lch":[35.3357817552570097,22.5221214621125654,85.8743202181728549],"luv":[35.3357817552570097,1.62034247131604014,22.4637584885032275],"rgb":[0.333333333333333315,0.333333333333333315,0.2],"xyz":[0.0759206335342031274,0.0866735474699746461,0.0440510474297192492],"hpluv":[85.8743202181728549,80.8786547215116656,35.3357817552570097],"hsluv":[85.8743202181728549,57.8169450175211566,35.3357817552570097]},"#555544":{"lch":[35.6854507669058592,12.1926559388895619,85.8743202181691743],"luv":[35.6854507669058592,0.877194374836262392,12.1610603515028455],"rgb":[0.333333333333333315,0.333333333333333315,0.266666666666666663],"xyz":[0.080378628778422,0.0884567455676622261,0.0675298223826058808],"hpluv":[85.8743202181691743,43.355725530805,35.6854507669058592],"hsluv":[85.8743202181691743,30.9932899828832262,35.6854507669058592]},"#555555":{"lch":[36.1458508397197278,1.89718584003012571e-12,0],"luv":[36.1458508397197278,1.79982851973451413e-12,5.9994283991150471e-13],"rgb":[0.333333333333333315,0.333333333333333315,0.333333333333333315],"xyz":[0.086341042817784,0.090841711183407059,0.0989318696565798],"hpluv":[0,6.66025333978279224e-12,36.1458508397197278],"hsluv":[0,1.90696849203660445e-12,36.1458508397197278]},"#555566":{"lch":[36.7200402720523087,13.391014832031539,265.874320218184835],"luv":[36.7200402720523087,-0.963409690459316,-13.3563138627398903],"rgb":[0.333333333333333315,0.333333333333333315,0.4],"xyz":[0.0939260385912921714,0.0938757094928103775,0.138879514063723758],"hpluv":[265.874320218184835,46.2753453717946712,36.7200402720523087],"hsluv":[265.874320218184835,10.0205788523093844,36.7200402720523087]},"#555577":{"lch":[37.4084382237490445,27.3651172837118537,265.874320218181],"luv":[37.4084382237490445,-1.96876932050326592,-27.294204353927416],"rgb":[0.333333333333333315,0.333333333333333315,0.466666666666666674],"xyz":[0.103240051611494091,0.0976013147008911869,0.187933315970121667],"hpluv":[265.874320218181,92.8254499938530131,37.4084382237490445],"hsluv":[265.874320218181,20.457601163446,37.4084382237490445]},"#555588":{"lch":[38.2091925227490421,41.4380747403329508,265.874320218179832],"luv":[38.2091925227490421,-2.98124102314999906,-41.330693680935326],"rgb":[0.333333333333333315,0.333333333333333315,0.533333333333333326],"xyz":[0.114380468713437919,0.102057481541668785,0.246606179373693835],"hpluv":[265.874320218179832,137.616667264503377,38.2091925227490421],"hsluv":[265.874320218179832,30.9677616121988244,38.2091925227490421]},"#555599":{"lch":[39.1185695394092079,55.2798607696674651,265.874320218179207],"luv":[39.1185695394092079,-3.97708121608675258,-55.1366106295487626],"rgb":[0.333333333333333315,0.333333333333333315,0.6],"xyz":[0.127437432822510632,0.107280267185297942,0.315372857014811769],"hpluv":[265.874320218179207,179.317758559659353,39.1185695394092079],"hsluv":[265.874320218179207,41.3377460212352688,39.1185695394092079]},"#5555aa":{"lch":[40.1313601009005083,68.6985541131433166,265.874320218178866],"luv":[40.1313601009005083,-4.94248222285034178,-68.5205312786852829],"rgb":[0.333333333333333315,0.333333333333333315,0.66666666666666663],"xyz":[0.142495125787763188,0.113303344371399051,0.394676706631810315],"hpluv":[265.874320218178866,217.221618066114,40.1313601009005083],"hsluv":[265.874320218178866,51.4705865731736907,40.1313601009005083]},"#5555bb":{"lch":[41.2412811653463791,81.6070675548115787,265.874320218178639],"luv":[41.2412811653463791,-5.8711785983783864,-81.3955940869131],"rgb":[0.333333333333333315,0.333333333333333315,0.733333333333333282],"xyz":[0.159632717895099807,0.120158381214333809,0.484934691730452117],"hpluv":[265.874320218178639,251.093199488524249,41.2412811653463791],"hsluv":[265.874320218178639,61.3584924374872642,41.2412811653463791]},"#5555cc":{"lch":[42.4413509436270431,93.9883543596933,265.874320218178468],"luv":[42.4413509436270431,-6.76194392407029365,-93.7447964935174838],"rgb":[0.333333333333333315,0.333333333333333315,0.8],"xyz":[0.178925093338821561,0.127875331391822611,0.586541202400722272],"hpluv":[265.874320218178468,281.011551484187919,42.4413509436270431],"hsluv":[265.874320218178468,71.0546332315999791,42.4413509436270431]},"#5555dd":{"lch":[43.7242196004532389,105.866759380085014,265.874320218178411],"luv":[43.7242196004532389,-7.61652967783202328,-105.592420264465588],"rgb":[0.333333333333333315,0.333333333333333315,0.866666666666666696],"xyz":[0.200443418889455105,0.136482661612076145,0.69987105030072827],"hpluv":[265.874320218178411,307.239379297131052,43.7242196004532389],"hsluv":[265.874320218178411,80.6500300064864462,43.7242196004532389]},"#5555ee":{"lch":[45.0824447652298588,117.287521338877212,265.874320218178354],"luv":[45.0824447652298588,-8.43819053636753402,-116.983586892732674],"rgb":[0.333333333333333315,0.333333333333333315,0.933333333333333348],"xyz":[0.224255599155629842,0.146007533718546162,0.825281866369251493],"hpluv":[265.874320218178354,330.128999417958312,45.0824447652298588],"hsluv":[265.874320218178354,90.2572110855712708,45.0824447652298588]},"#5555ff":{"lch":[46.508708270344421,128.30356479361032,265.874320218178241],"luv":[46.508708270344421,-9.23073412981071,-127.971083789162734],"rgb":[0.333333333333333315,0.333333333333333315,1],"xyz":[0.250426647565461236,0.156475953082478858,0.963116054661033338],"hpluv":[265.874320218178241,350.061034522531031,46.508708270344421],"hsluv":[265.874320218178241,99.9999999999992468,46.508708270344421]},"#ccdd00":{"lch":[84.2515012159558552,94.1174138813685772,92.7819892835375555],"luv":[84.2515012159558552,-4.56806363508048818,94.0064912138661128],"rgb":[0.8,0.866666666666666696,0],"xyz":[0.507566029502865779,0.645503626279608334,0.0978568736941549666],"hpluv":[92.7819892835375555,256.902059824464118,84.2515012159558552],"hsluv":[92.7819892835375555,100.000000000002373,84.2515012159558552]},"#ccdd11":{"lch":[84.2724460606142287,93.1910749716768692,92.8373396690251695],"luv":[84.2724460606142287,-4.61302172096193619,93.0768310858219508],"rgb":[0.8,0.866666666666666696,0.0666666666666666657],"xyz":[0.508577695002502939,0.645908292479463242,0.103184978658910603],"hpluv":[92.8373396690251695,254.758074317949962,84.2724460606142287],"hsluv":[92.8373396690251695,98.9747327605244465,84.2724460606142287]},"#ccdd22":{"lch":[84.3112490917695396,91.4838404394451175,92.9423140418060711],"luv":[84.3112490917695396,-4.69591125178302349,91.3632392106652],"rgb":[0.8,0.866666666666666696,0.133333333333333331],"xyz":[0.510453053140979884,0.646658435734854,0.113061864854889796],"hpluv":[92.9423140418060711,250.792999873820406,84.3112490917695396],"hsluv":[92.9423140418060711,97.0860193213801637,84.3112490917695396]},"#ccdd33":{"lch":[84.3750724084435291,88.7007441607730271,93.1221866378423329],"luv":[84.3750724084435291,-4.83112791130122865,88.5690816130525],"rgb":[0.8,0.866666666666666696,0.2],"xyz":[0.513540803873437701,0.647893536027837169,0.129324018712500932],"hpluv":[93.1221866378423329,244.290353733928498,84.3750724084435291],"hsluv":[93.1221866378423329,94.0094146319777,84.3750724084435291]},"#ccdd44":{"lch":[84.4670755276021197,84.7426243382763857,93.3985511967960491],"luv":[84.4670755276021197,-5.02363867224446459,84.5935897939611152],"rgb":[0.8,0.866666666666666696,0.266666666666666663],"xyz":[0.517998799117656561,0.649676734125524735,0.152802793665387571],"hpluv":[93.3985511967960491,234.956854948695792,84.4670755276021197],"hsluv":[93.3985511967960491,89.638788485123,84.4670755276021197]},"#ccdd55":{"lch":[84.5898637292301601,79.5568981087007359,93.8026723407881633],"luv":[84.5898637292301601,-5.27624840258561711,79.3817437416967095],"rgb":[0.8,0.866666666666666696,0.333333333333333315],"xyz":[0.523961213157018491,0.652061699741269485,0.184204840939361486],"hpluv":[93.8026723407881633,222.570337020009788,84.5898637292301601],"hsluv":[93.8026723407881633,83.9211409492819485,84.5898637292301601]},"#ccdd66":{"lch":[84.7456349568684857,73.1331501088793772,94.3836122863904],"luv":[84.7456349568684857,-5.58984810871231,72.9192103836116],"rgb":[0.8,0.866666666666666696,0.4],"xyz":[0.531546208930526731,0.655095698050672803,0.224152485346505448],"hpluv":[94.3836122863904,206.963810787645969,84.7456349568684857],"hsluv":[94.3836122863904,76.851201462777,84.7456349568684857]},"#ccdd77":{"lch":[84.9362580835765186,65.5005774458529828,95.2238145131341156],"luv":[84.9362580835765186,-5.96359854749608687,65.2285300930849274],"rgb":[0.8,0.866666666666666696,0.466666666666666674],"xyz":[0.540860221950728581,0.658821303258753654,0.273206287252903357],"hpluv":[95.2238145131341156,188.015270942662227,84.9362580835765186],"hsluv":[95.2238145131341156,68.4671748287691,84.9362580835765186]},"#ccdd88":{"lch":[85.1633194008604733,56.7265968622164536,96.4730545580279],"luv":[85.1633194008604733,-6.39512608731957588,56.3649638862273221],"rgb":[0.8,0.866666666666666696,0.533333333333333326],"xyz":[0.552000639052672493,0.663277470099531197,0.331879150656475552],"hpluv":[96.4730545580279,165.642146962004915,85.1633194008604733],"hsluv":[96.4730545580279,58.8458897999489707,85.1633194008604733]},"#ccdd99":{"lch":[85.4281525463895548,46.9188240443766134,98.432972024211054],"luv":[85.4281525463895548,-6.88075351903593724,46.4115425375783843],"rgb":[0.8,0.866666666666666696,0.6],"xyz":[0.565057603161745137,0.66850025574316041,0.400645828297593432],"hpluv":[98.432972024211054,139.807612964747022,85.4281525463895548],"hsluv":[98.432972024211054,48.0968721297954644,85.4281525463895548]},"#ccddaa":{"lch":[85.7318592309590457,36.2402041704229134,101.807730551991185],"luv":[85.7318592309590457,-7.41576493035038453,35.4733537857886176],"rgb":[0.8,0.866666666666666696,0.66666666666666663],"xyz":[0.580115296126997748,0.674523332929261477,0.479949677914592032],"hpluv":[101.807730551991185,110.570541660882469,85.7318592309590457],"hsluv":[101.807730551991185,36.355428538792907,85.7318592309590457]},"#ccddbb":{"lch":[86.0753247228475828,24.9849555175277693,108.661729708420211],"luv":[86.0753247228475828,-7.99469198849898,23.671351930590518],"rgb":[0.8,0.866666666666666696,0.733333333333333282],"xyz":[0.597252888234334312,0.681378369772196235,0.570207663013233779],"hpluv":[108.661729708420211,78.3375416693066313,86.0753247228475828],"hsluv":[108.661729708420211,23.7751141135998658,86.0753247228475828]},"#ccddcc":{"lch":[86.4592303781436158,14.0773589090278701,127.715012949224516],"luv":[86.4592303781436158,-8.61160385902942771,11.1360815742673065],"rgb":[0.8,0.866666666666666696,0.8],"xyz":[0.616545263678056066,0.689095319949685092,0.671814173683503935],"hpluv":[127.715012949224516,45.5363150686036633,86.4592303781436158],"hsluv":[127.715012949224516,10.5200784033656536,86.4592303781436158]},"#ccdddd":{"lch":[86.8840646031333677,9.47353258269296106,192.177050630057835],"luv":[86.8840646031333677,-9.26038246071566817,-1.99828333241680145],"rgb":[0.8,0.866666666666666696,0.866666666666666696],"xyz":[0.638063589228689665,0.697702650169938599,0.785144021583509932],"hpluv":[192.177050630057835,31.7497104564534354,86.8840646031333677],"hsluv":[192.177050630057835,13.7818607651735867,86.8840646031333677]},"#ccddee":{"lch":[87.3501331068194276,18.4943223550678582,237.507437159903361],"luv":[87.3501331068194276,-9.9349674143158051,-15.5992429896340141],"rgb":[0.8,0.866666666666666696,0.933333333333333348],"xyz":[0.661875769494864374,0.707227522276408616,0.910554837652033155],"hpluv":[237.507437159903361,64.5162574350921432,87.3501331068194276],"hsluv":[237.507437159903361,51.9237885878372083,87.3501331068194276]},"#ccddff":{"lch":[87.8575689716950876,31.3946063828198874,250.2096672964189],"luv":[87.8575689716950876,-10.6295595905023852,-29.5403752996496962],"rgb":[0.8,0.866666666666666696,1],"xyz":[0.688046817904695795,0.717695941640341339,1.04838902594381489],"hpluv":[250.2096672964189,114.576774718516177,87.8575689716950876],"hsluv":[250.2096672964189,99.999999999992923,87.8575689716950876]},"#556600":{"lch":[40.3019892206732919,46.2375853800199934,99.381148915360626],"luv":[40.3019892206732919,-7.53678920078613679,45.6191967302971264],"rgb":[0.333333333333333315,0.4,0],"xyz":[0.0849739168694777086,0.114339753133439206,0.0175932549799886241],"hpluv":[99.381148915360626,145.582103533726,40.3019892206732919],"hsluv":[99.381148915360626,100.000000000002302,40.3019892206732919]},"#556611":{"lch":[40.3683315206726334,43.7939991819964618,99.9948312384981364],"luv":[40.3683315206726334,-7.60085740022420797,43.1293557931736729],"rgb":[0.333333333333333315,0.4,0.0666666666666666657],"xyz":[0.0859855823691148269,0.114744419333294059,0.0229213599447442573],"hpluv":[99.9948312384981364,137.661701347396985,40.3683315206726334],"hsluv":[99.9948312384981364,94.2576138599214204,40.3683315206726334]},"#556622":{"lch":[40.4909010608148421,39.4175015547736436,101.28961011017671],"luv":[40.4909010608148421,-7.7166980000465113,38.6547797923705758],"rgb":[0.333333333333333315,0.4,0.133333333333333331],"xyz":[0.0878609405075918559,0.115494562588684874,0.0327982461407234499],"hpluv":[101.28961011017671,123.529583899053776,40.4909010608148421],"hsluv":[101.28961011017671,83.977954812826539,40.4909010608148421]},"#556633":{"lch":[40.6915589391927455,32.6300466430477343,104.01044750968255],"luv":[40.6915589391927455,-7.89969574444685207,31.6593548745491518],"rgb":[0.333333333333333315,0.4,0.2],"xyz":[0.0909486912400495895,0.116729662881667987,0.0490603999983346],"hpluv":[104.01044750968255,101.754281640855311,40.6915589391927455],"hsluv":[104.01044750968255,68.015525760737134,40.6915589391927455]},"#556644":{"lch":[40.9787805135115306,23.7356999706126039,110.078417815454017],"luv":[40.9787805135115306,-8.1486066005911173,22.2931304119395044],"rgb":[0.333333333333333315,0.4,0.266666666666666663],"xyz":[0.0954066864842684631,0.118512860979355567,0.0725391749512212386],"hpluv":[110.078417815454017,73.4991539757345436,40.9787805135115306],"hsluv":[110.078417815454017,46.8659194429644117,40.9787805135115306]},"#556655":{"lch":[41.3584605937638372,13.8246485480389332,127.71501294923371],"luv":[41.3584605937638372,-8.45701225317865202,10.9361716896901875],"rgb":[0.333333333333333315,0.4,0.333333333333333315],"xyz":[0.101369100523630462,0.120897826595100399,0.10394122222519514],"hpluv":[127.71501294923371,42.4159365242361659,41.3584605937638372],"hsluv":[127.71501294923371,21.5972717302380097,41.3584605937638372]},"#556666":{"lch":[41.8343160733152146,9.01834401177998402,192.177050630060307],"luv":[41.8343160733152146,-8.8154354231024481,-1.90226891261946607],"rgb":[0.333333333333333315,0.4,0.4],"xyz":[0.108954096297138633,0.123931824904503718,0.143888866632339102],"hpluv":[192.177050630060307,27.3547941496945484,41.8343160733152146],"hsluv":[192.177050630060307,27.2477194602778816,41.8343160733152146]},"#556677":{"lch":[42.4081371223492525,18.1914318380534858,239.570903430569189],"luv":[42.4081371223492525,-9.21344558994119289,-15.6856817728697795],"rgb":[0.333333333333333315,0.4,0.466666666666666674],"xyz":[0.118268109317340553,0.127657430112584541,0.192942668538737],"hpluv":[239.570903430569189,54.4323412384199443,42.4081371223492525],"hsluv":[239.570903430569189,33.1626844996427934,42.4081371223492525]},"#556688":{"lch":[43.0800011190655425,31.444407039181371,252.144687081813345],"luv":[43.0800011190655425,-9.64130614192028546,-29.9298504828121246],"rgb":[0.333333333333333315,0.4,0.533333333333333326],"xyz":[0.129408526419284381,0.132113596953362111,0.251615531942309179],"hpluv":[252.144687081813345,92.6204805766441694,43.0800011190655425],"hsluv":[252.144687081813345,39.0862788716996903,43.0800011190655425]},"#556699":{"lch":[43.8484890486876964,45.3842681536749,257.153237313451427],"luv":[43.8484890486876964,-10.090933534038701,-44.2482186789059639],"rgb":[0.333333333333333315,0.4,0.6],"xyz":[0.142465490528357108,0.137336382596991269,0.320382209583427113],"hpluv":[257.153237313451427,131.337888607863903,43.8484890486876964],"hsluv":[257.153237313451427,44.8182326355090055,43.8484890486876964]},"#5566aa":{"lch":[44.7109144588579,59.3119903927914223,259.748012643434],"luv":[44.7109144588579,-10.5562103110165033,-58.3650462882037928],"rgb":[0.333333333333333315,0.4,0.66666666666666663],"xyz":[0.157523183493609636,0.143359459783092391,0.399686059200425714],"hpluv":[259.748012643434,168.332615885742257,44.7109144588579],"hsluv":[259.748012643434,50.2202557252039341,44.7109144588579]},"#5566bb":{"lch":[45.6635615252987463,72.9454914642558805,261.300749278862554],"luv":[45.6635615252987463,-11.0328519112314041,-72.1063166696695532],"rgb":[0.333333333333333315,0.4,0.733333333333333282],"xyz":[0.174660775600946283,0.15021449662602715,0.48994404429906746],"hpluv":[261.300749278862554,202.706651650989187,45.6635615252987463],"hsluv":[261.300749278862554,56.1551480082100767,45.6635615252987463]},"#5566cc":{"lch":[46.7019230239281953,86.153038102066219,262.316955218783903],"luv":[46.7019230239281953,-11.5180515282988498,-85.3796255742992],"rgb":[0.333333333333333315,0.4,0.8],"xyz":[0.193953151044668037,0.157931446803515951,0.591550554969337616],"hpluv":[262.316955218783903,234.085848684940913,46.7019230239281953],"hsluv":[262.316955218783903,67.0801136297732086,46.7019230239281953]},"#5566dd":{"lch":[47.8209277182799539,98.8836589551542,263.023825475898036],"luv":[47.8209277182799539,-12.010072956506761,-98.1515978267222664],"rgb":[0.333333333333333315,0.4,0.866666666666666696],"xyz":[0.215471476595301581,0.166538777023769485,0.704880402869343614],"hpluv":[263.023825475898036,262.38914084011509,47.8209277182799539],"hsluv":[263.023825475898036,77.9738615315733909,47.8209277182799539]},"#5566ee":{"lch":[49.0151480019121095,111.133834597019145,263.537783903780621],"luv":[49.0151480019121095,-12.5078880087352609,-110.427722650603215],"rgb":[0.333333333333333315,0.4,0.933333333333333348],"xyz":[0.23928365686147629,0.176063649130239502,0.830291218937866837],"hpluv":[263.537783903780621,287.710232398192659,49.0151480019121095],"hsluv":[263.537783903780621,88.9133133505171145,49.0151480019121095]},"#5566ff":{"lch":[50.2789812841098751,122.927042369796439,263.924295565134457],"luv":[50.2789812841098751,-13.0108962765956715,-122.236550687040406],"rgb":[0.333333333333333315,0.4,1],"xyz":[0.265454705271307712,0.186532068494172198,0.968125407229648682],"hpluv":[263.924295565134457,310.2417842032321,50.2789812841098751],"hsluv":[263.924295565134457,99.99999999999919,50.2789812841098751]},"#ccee00":{"lch":[88.9159222564839382,101.512339113439552,98.3897184755654],"luv":[88.9159222564839382,-14.8112090817394879,100.426007975120399],"rgb":[0.8,0.933333333333333348,0],"xyz":[0.554744805843380595,0.739861178960639299,0.113583132474326151],"hpluv":[98.3897184755654,409.405376777149172,88.9159222564839382],"hsluv":[98.3897184755654,100.000000000002402,88.9159222564839382]},"#ccee11":{"lch":[88.9350466502285855,100.665090554083037,98.4749110233884863],"luv":[88.9350466502285855,-14.8356507509631186,99.5658773027044],"rgb":[0.8,0.933333333333333348,0.0666666666666666657],"xyz":[0.555756471343017755,0.740265845160494207,0.118911237439081788],"hpluv":[98.4749110233884863,406.753799510206477,88.9350466502285855],"hsluv":[98.4749110233884863,99.103544824997428,88.9350466502285855]},"#ccee22":{"lch":[88.9704797513205108,99.1029038393990191,98.635890718104875],"luv":[88.9704797513205108,-14.8807650249594605,97.9793262973016823],"rgb":[0.8,0.933333333333333348,0.133333333333333331],"xyz":[0.557631829481494701,0.741015988415885,0.12878812363506098],"hpluv":[98.635890718104875,401.844579090604725,88.9704797513205108],"hsluv":[98.635890718104875,97.4508266239822376,88.9704797513205108]},"#ccee33":{"lch":[89.0287677898111696,96.5543294248683281,98.9099371535565837],"luv":[89.0287677898111696,-14.95450175665089,95.3892101230339335],"rgb":[0.8,0.933333333333333348,0.2],"xyz":[0.560719580213952518,0.742251088708868134,0.145050277492672131],"hpluv":[98.9099371535565837,393.778440936160052,89.0287677898111696],"hsluv":[98.9099371535565837,94.7550356083218333,89.0287677898111696]},"#ccee44":{"lch":[89.1128082270408157,92.9258219449750698,99.3266297509707101],"luv":[89.1128082270408157,-15.0597883526499068,91.6973890518296],"rgb":[0.8,0.933333333333333348,0.266666666666666663],"xyz":[0.565177575458171377,0.7440342868065557,0.168529052445558769],"hpluv":[99.3266297509707101,382.168331694223468,89.1128082270408157],"hsluv":[99.3266297509707101,90.9176847425828782,89.1128082270408157]},"#ccee55":{"lch":[89.224999764075946,88.1655281542066263,99.9265688821158591],"luv":[89.224999764075946,-15.1984931464969293,86.8456456063635187],"rgb":[0.8,0.933333333333333348,0.333333333333333315],"xyz":[0.571139989497533307,0.74641925242230045,0.199931099719532657],"hpluv":[99.9265688821158591,366.702481299920066,89.224999764075946],"hsluv":[99.9265688821158591,85.8839575374920372,89.224999764075946]},"#ccee66":{"lch":[89.3673776950467555,82.2600687786622444,100.76990980050725],"luv":[89.3673776950467555,-15.3715621348797811,80.8111006793235873],"rgb":[0.8,0.933333333333333348,0.4],"xyz":[0.578724985271041548,0.749453250731703768,0.239878744126676646],"hpluv":[100.76990980050725,347.124780760482849,89.3673776950467555],"hsluv":[100.76990980050725,79.6381055931254451,89.3673776950467555]},"#ccee77":{"lch":[89.5416863487684651,75.2338064272131817,101.95104715507324],"luv":[89.5416863487684651,-15.5791079616514043,73.6031047215169707],"rgb":[0.8,0.933333333333333348,0.466666666666666674],"xyz":[0.588038998291243398,0.753178855939784619,0.288932546033074555],"hpluv":[101.95104715507324,323.225079834159544,89.5416863487684651],"hsluv":[101.95104715507324,72.2002225208687349,89.5416863487684651]},"#ccee88":{"lch":[89.7494222523926481,67.150335761217363,103.626883623375818],"luv":[89.7494222523926481,-15.8204941270879562,65.2600916212887654],"rgb":[0.8,0.933333333333333348,0.533333333333333326],"xyz":[0.599179415393187309,0.757635022780562162,0.347605409436646695],"hpluv":[103.626883623375818,294.840431689210504,89.7494222523926481],"hsluv":[103.626883623375818,63.6228180815060256,89.7494222523926481]},"#ccee99":{"lch":[89.9918618926625697,58.1187887690418705,106.076645299715267],"luv":[89.9918618926625697,-16.094429395756972,55.8458857070554586],"rgb":[0.8,0.933333333333333348,0.6],"xyz":[0.61223637950226,0.762857808424191375,0.41637208707776463],"hpluv":[106.076645299715267,261.881276027636488,89.9918618926625697],"hsluv":[106.076645299715267,53.9866751643902418,89.9918618926625697]},"#cceeaa":{"lch":[90.2700807835134071,48.3136880988356481,109.842100564752428],"luv":[90.2700807835134071,-16.3990756203548145,45.4453823452884791],"rgb":[0.8,0.933333333333333348,0.66666666666666663],"xyz":[0.627294072467512565,0.768880885610292442,0.495675936694763231],"hpluv":[109.842100564752428,224.429228200920562,90.2700807835134071],"hsluv":[109.842100564752428,43.3959332818477037,90.2700807835134071]},"#cceebb":{"lch":[90.5849674500281736,38.0375276056681,116.096591597387416],"luv":[90.5849674500281736,-16.7321662581560417,34.1597441246474745],"rgb":[0.8,0.933333333333333348,0.733333333333333282],"xyz":[0.644431664574849128,0.7757359224532272,0.585933921793405],"hpluv":[116.096591597387416,183.067580850930824,90.5849674500281736],"hsluv":[116.096591597387416,31.9725829176952736,90.5849674500281736]},"#cceecc":{"lch":[90.9372344233822,27.9388105970907,127.715012949233042],"luv":[90.9372344233822,-17.0911298567764973,22.1013668762570106],"rgb":[0.8,0.933333333333333348,0.8],"xyz":[0.663724040018570882,0.783452872630716057,0.687540432463675133],"hpluv":[127.715012949233042,140.086760618050221,90.9372344233822],"hsluv":[127.715012949233042,30.3633811556705,90.9372344233822]},"#cceedd":{"lch":[91.327427526889025,19.8359452431300802,151.749458426713772],"luv":[91.327427526889025,-17.4732117028180483,9.38890816213244861],"rgb":[0.8,0.933333333333333348,0.866666666666666696],"xyz":[0.685242365569204481,0.792060202850969564,0.800870280363681131],"hpluv":[151.749458426713772,104.258293798779974,91.327427526889025],"hsluv":[151.749458426713772,29.0871711351253381,91.327427526889025]},"#cceeee":{"lch":[91.7559342603931,18.2870370266976643,192.177050630059739],"luv":[91.7559342603931,-17.87558711202,-3.8573447624494035],"rgb":[0.8,0.933333333333333348,0.933333333333333348],"xyz":[0.709054545835379191,0.801585074957439581,0.926281096432204354],"hpluv":[192.177050630059739,101.458793010104,91.7559342603931],"hsluv":[192.177050630059739,27.4217374065650326,91.7559342603931]},"#cceeff":{"lch":[92.2229917973594553,25.3309747642836847,223.758903531404655],"luv":[92.2229917973594553,-18.2954610486514362,-17.5195430170439934],"rgb":[0.8,0.933333333333333348,1],"xyz":[0.735225594245210612,0.812053494321372304,1.06411528472398609],"hpluv":[223.758903531404655,149.53216426558339,92.2229917973594553],"hsluv":[223.758903531404655,99.9999999999890861,92.2229917973594553]},"#557700":{"lch":[45.8045523271613533,55.5294361467329836,107.801769483020877],"luv":[45.8045523271613533,-16.9767207468495087,52.8706840456749276],"rgb":[0.333333333333333315,0.466666666666666674,0],"xyz":[0.103427654922895337,0.151247229240274977,0.023744500997794328],"hpluv":[107.801769483020877,153.83457187868342,45.8045523271613533],"hsluv":[107.801769483020877,100.000000000002288,45.8045523271613533]},"#557711":{"lch":[45.859623178970125,53.470483995502839,108.496139146384877],"luv":[45.859623178970125,-16.9630166203079504,50.7084679896019068],"rgb":[0.333333333333333315,0.466666666666666674,0.0666666666666666657],"xyz":[0.104439320422532456,0.15165189544012983,0.0290726059625499578],"hpluv":[108.496139146384877,147.952722071756682,45.859623178970125],"hsluv":[108.496139146384877,95.6324690191426,45.859623178970125]},"#557722":{"lch":[45.9614512879267494,49.76586948312967,109.899607245517743],"luv":[45.9614512879267494,-16.93896350220896,46.7943723206405409],"rgb":[0.333333333333333315,0.466666666666666674,0.133333333333333331],"xyz":[0.106314678561009485,0.152402038695520659,0.0389494921585291573],"hpluv":[109.899607245517743,137.396980684000368,45.9614512879267494],"hsluv":[109.899607245517743,87.7486210093461239,45.9614512879267494]},"#557733":{"lch":[46.1283843073061,43.9801463057798472,112.602269297118809],"luv":[46.1283843073061,-16.9029726498973396,40.6022509803905223],"rgb":[0.333333333333333315,0.466666666666666674,0.2],"xyz":[0.109402429293467218,0.153637138988503757,0.0552116460161403],"hpluv":[112.602269297118809,120.983948144693443,46.1283843073061],"hsluv":[112.602269297118809,75.3373974156097432,46.1283843073061]},"#557744":{"lch":[46.3678258482665413,36.3216896494577526,117.654446368962965],"luv":[46.3678258482665413,-16.8582748313623227,32.1724060135666861],"rgb":[0.333333333333333315,0.466666666666666674,0.266666666666666663],"xyz":[0.113860424537686092,0.155420337086191351,0.0786904209690269391],"hpluv":[117.654446368962965,99.4005156049610861,46.3678258482665413],"hsluv":[117.654446368962965,58.5682493514162346,46.3678258482665413]},"#557755":{"lch":[46.6852246722490349,27.4798560002662136,127.715012949237362],"luv":[46.6852246722490349,-16.8103715694690621,21.7383047520213317],"rgb":[0.333333333333333315,0.466666666666666674,0.333333333333333315],"xyz":[0.119822838577048091,0.157805302701936184,0.110092468243000841],"hpluv":[127.715012949237362,74.6920408293198506,46.6852246722490349],"hsluv":[127.715012949237362,38.0315615795731219,46.6852246722490349]},"#557766":{"lch":[47.0844103757355299,19.3533005907945039,150.034269154893224],"luv":[47.0844103757355299,-16.7662346577491,9.66662397939114371],"rgb":[0.333333333333333315,0.466666666666666674,0.4],"xyz":[0.127407834350556276,0.160839301011339475,0.150040112650144802],"hpluv":[150.034269154893224,52.1575559127659147,47.0844103757355299],"hsluv":[150.034269154893224,41.6155983808333403,47.0844103757355299]},"#557777":{"lch":[47.5677829408255519,17.1184872206298522,192.177050630060563],"luv":[47.5677829408255519,-16.733329138647683,-3.61085871511915846],"rgb":[0.333333333333333315,0.466666666666666674,0.466666666666666674],"xyz":[0.136721847370758182,0.164564906219420298,0.199093914556542712],"hpluv":[192.177050630060563,45.665876663612373,47.5677829408255519],"hsluv":[192.177050630060563,45.4871270252879683,47.5677829408255519]},"#557788":{"lch":[48.1364533988364371,24.3189053895014062,226.569261606948],"luv":[48.1364533988364371,-16.7186932071720697,-17.6605338760746164],"rgb":[0.333333333333333315,0.466666666666666674,0.533333333333333326],"xyz":[0.147862264472702,0.169021073060197896,0.257766777960114879],"hpluv":[226.569261606948,64.1075619232690173,48.1364533988364371],"hsluv":[226.569261606948,49.4930397679002567,48.1364533988364371]},"#557799":{"lch":[48.7903733600049776,36.1922931768580227,242.470518495943224],"luv":[48.7903733600049776,-16.7282575252316086,-32.0943528610435749],"rgb":[0.333333333333333315,0.466666666666666674,0.6],"xyz":[0.160919228581774709,0.174243858703827054,0.326533455601232814],"hpluv":[242.470518495943224,94.128532149155447,48.7903733600049776],"hsluv":[242.470518495943224,53.4981409183259657,48.7903733600049776]},"#5577aa":{"lch":[49.5284680294880957,49.5215284063763121,250.210257263218182],"luv":[49.5284680294880957,-16.7664778987851584,-46.5968560588918308],"rgb":[0.333333333333333315,0.466666666666666674,0.66666666666666663],"xyz":[0.175976921547027265,0.180266935889928148,0.405837305218231414],"hpluv":[250.210257263218182,126.875705911364861,49.5284680294880957],"hsluv":[250.210257263218182,57.3943781585142503,49.5284680294880957]},"#5577bb":{"lch":[50.3487764471929324,63.2168000831305,254.554261837862072],"luv":[50.3487764471929324,-16.8362555209572413,-60.9336057753316069],"rgb":[0.333333333333333315,0.466666666666666674,0.733333333333333282],"xyz":[0.193114513654363912,0.187121972732862907,0.496095290316873161],"hpluv":[254.554261837862072,159.324628464713726,50.3487764471929324],"hsluv":[254.554261837862072,61.1035457400689737,50.3487764471929324]},"#5577cc":{"lch":[51.2485971738404942,76.8367273058076279,257.264224247337211],"luv":[51.2485971738404942,-16.9390629845235594,-74.9463195111900546],"rgb":[0.333333333333333315,0.466666666666666674,0.8],"xyz":[0.212406889098085638,0.194838922910351708,0.597701800987143317],"hpluv":[257.264224247337211,190.250673687597981,51.2485971738404942],"hsluv":[257.264224247337211,64.5753193228694329,51.2485971738404942]},"#5577dd":{"lch":[52.2246350466270428,90.1721178795433502,259.084439545341468],"luv":[52.2246350466270428,-17.075183181685393,-88.5406627612090347],"rgb":[0.333333333333333315,0.466666666666666674,0.866666666666666696],"xyz":[0.233925214648719182,0.203446253130605242,0.711031648887149315],"hpluv":[259.084439545341468,219.096874823476185,52.2246350466270428],"hsluv":[259.084439545341468,74.9139940771913757,52.2246350466270428]},"#5577ee":{"lch":[53.2731438322457791,103.123503170291656,260.373961187264626],"luv":[53.2731438322457791,-17.2439851141504441,-101.671539200978515],"rgb":[0.333333333333333315,0.466666666666666674,0.933333333333333348],"xyz":[0.257737394914893947,0.212971125237075287,0.836442464955672538],"hpluv":[260.373961187264626,245.63410016831412,53.2731438322457791],"hsluv":[260.373961187264626,87.3510385353649,53.2731438322457791]},"#5577ff":{"lch":[54.3900599484937572,115.652149768064447,261.324783585170792],"luv":[54.3900599484937572,-17.4441870719707097,-114.32899931064253],"rgb":[0.333333333333333315,0.466666666666666674,1],"xyz":[0.283908443324725313,0.223439544601007983,0.974276653247454383],"hpluv":[261.324783585170792,269.819603010977914,54.3900599484937572],"hsluv":[261.324783585170792,99.9999999999989768,54.3900599484937572]},"#ccff00":{"lch":[93.605159534834371,109.568762044642341,102.903766821995461],"luv":[93.605159534834371,-24.4682604068618268,106.801768939739262],"rgb":[0.8,1,0],"xyz":[0.606597178273054372,0.843565923819988406,0.130867256617550276],"hpluv":[102.903766821995461,795.170643052662513,93.605159534834371],"hsluv":[102.903766821995461,100.000000000002359,93.605159534834371]},"#ccff11":{"lch":[93.6226829283917681,108.793716578542018,103.00230683973929],"luv":[93.6226829283917681,-24.4775292120886689,106.004355243751533],"rgb":[0.8,1,0.0666666666666666657],"xyz":[0.607608843772691531,0.843970590019843314,0.136195361582305913],"hpluv":[103.00230683973929,791.823376913543598,93.6226829283917681],"hsluv":[103.00230683973929,99.9999999999883755,93.6226829283917681]},"#ccff22":{"lch":[93.6551518183817535,107.364125357399203,103.187929529698394],"luv":[93.6551518183817535,-24.4946701604029187,104.532609971684906],"rgb":[0.8,1,0.133333333333333331],"xyz":[0.609484201911168477,0.844720733275234115,0.146072247778285091],"hpluv":[103.187929529698394,785.615721446726184,93.6551518183817535],"hsluv":[103.187929529698394,99.9999999999883613,93.6551518183817535]},"#ccff33":{"lch":[93.7085695338431464,105.030410790236445,103.502196488744218],"luv":[93.7085695338431464,-24.5227776356263192,102.127472150246831],"rgb":[0.8,1,0.2],"xyz":[0.612571952643626294,0.845955833568217241,0.162334401635896242],"hpluv":[103.502196488744218,775.386532390006209,93.7085695338431464],"hsluv":[103.502196488744218,99.9999999999882334,93.7085695338431464]},"#ccff44":{"lch":[93.7856006692118456,101.704796230104463,103.975902087852319],"luv":[93.7856006692118456,-24.5631097372148304,98.6940687997238],"rgb":[0.8,1,0.266666666666666663],"xyz":[0.617029947887845154,0.847739031665904808,0.18581317658878288],"hpluv":[103.975902087852319,760.597322717251814,93.7856006692118456],"hsluv":[103.975902087852319,99.9999999999883329,93.7856006692118456]},"#ccff55":{"lch":[93.8884584724407887,97.3367975087049473,104.649262803016768],"luv":[93.8884584724407887,-24.6166025777849207,94.1725810773922802],"rgb":[0.8,1,0.333333333333333315],"xyz":[0.622992361927207083,0.850123997281649557,0.217215223862756796],"hpluv":[104.649262803016768,740.773636872505676,93.8884584724407887],"hsluv":[104.649262803016768,99.999999999988,93.8884584724407887]},"#ccff66":{"lch":[94.0190298395239381,91.9106503723783561,105.578857731119598],"luv":[94.0190298395239381,-24.6839280463924027,88.5340123798424514],"rgb":[0.8,1,0.4],"xyz":[0.630577357700715324,0.853157995591052876,0.257162868269900757],"hpluv":[105.578857731119598,715.472563222964368,94.0190298395239381],"hsluv":[105.578857731119598,99.9999999999875371,94.0190298395239381]},"#ccff77":{"lch":[94.1789424927264349,85.4453105292158597,106.848417981185563],"luv":[94.1789424927264349,-24.7655268674123263,81.7775627566241781],"rgb":[0.8,1,0.466666666666666674],"xyz":[0.639891370720917174,0.856883600799133727,0.306216670176298666],"hpluv":[106.848417981185563,684.262206540111833,94.1789424927264349],"hsluv":[106.848417981185563,99.9999999999873381,94.1789424927264349]},"#ccff88":{"lch":[94.3696051468525781,77.9966506735583778,108.587502777405675],"luv":[94.3696051468525781,-24.8616333733667219,73.92818611532],"rgb":[0.8,1,0.533333333333333326],"xyz":[0.651031787822861086,0.861339767639911269,0.364889533579870862],"hpluv":[108.587502777405675,646.714804777793233,94.3696051468525781],"hsluv":[108.587502777405675,99.9999999999870397,94.3696051468525781]},"#ccff99":{"lch":[94.5922333645115572,69.6635615227201868,111.00626449694991],"luv":[94.5922333645115572,-24.9722983929036886,65.0338074927618],"rgb":[0.8,1,0.6],"xyz":[0.66408875193193373,0.866562553283540482,0.433656211220988741],"hpluv":[111.00626449694991,602.43247210261859,94.5922333645115572],"hsluv":[111.00626449694991,99.999999999986656,94.5922333645115572]},"#ccffaa":{"lch":[94.8478672375315881,60.6030718965076574,114.464397640121035],"luv":[94.8478672375315881,-25.0974127381864349,55.1620539605116],"rgb":[0.8,1,0.66666666666666663],"xyz":[0.679146444897186341,0.872585630469641549,0.512960060837987397],"hpluv":[114.464397640121035,551.164539659931279,94.8478672375315881],"hsluv":[114.464397640121035,99.9999999999858886,94.8478672375315881]},"#ccffbb":{"lch":[95.1373841969384,51.0680528276179899,119.615591899534252],"luv":[95.1373841969384,-25.2367319023901224,44.3965469658538439],"rgb":[0.8,1,0.733333333333333282],"xyz":[0.696284037004522904,0.879440667312576307,0.603218045936629088],"hpluv":[119.615591899534252,493.192076617112832,95.1373841969384],"hsluv":[119.615591899534252,99.999999999985036,95.1373841969384]},"#ccffcc":{"lch":[95.4615088709507802,41.5047839306073527,127.715012949235671],"luv":[95.4615088709507802,-25.3899015983654444,32.8329101048280876],"rgb":[0.8,1,0.8],"xyz":[0.715576412448244659,0.887157617490065165,0.704824556606899244],"hpluv":[127.715012949235671,430.524428546451247,95.4615088709507802],"hsluv":[127.715012949235671,99.9999999999844,95.4615088709507802]},"#ccffdd":{"lch":[95.8208211701733603,32.8093273722257,141.163585516297758],"luv":[95.8208211701733603,-25.5564832849791728,20.5746962243056899],"rgb":[0.8,1,0.866666666666666696],"xyz":[0.737094737998878258,0.895764947710318671,0.818154404506905242],"hpluv":[141.163585516297758,370.598640927928557,95.8208211701733603],"hsluv":[141.163585516297758,99.9999999999829612,95.8208211701733603]},"#ccffee":{"lch":[96.2157633520208293,26.8716381406037179,163.283084738459195],"luv":[96.2157633520208293,-25.7359786647352209,7.72944619800421506],"rgb":[0.8,1,0.933333333333333348],"xyz":[0.760906918265053,0.905289819816788688,0.943565220575428465],"hpluv":[163.283084738459195,336.210724351278486,96.2157633520208293],"hsluv":[163.283084738459195,99.9999999999813411,96.2157633520208293]},"#ccffff":{"lch":[96.6466465538527899,26.5246444827845806,192.177050630060279],"luv":[96.6466465538527899,-25.9278521925209873,-5.59493034995961125],"rgb":[0.8,1,1],"xyz":[0.787077966674884388,0.915758239180721412,1.08139940886721031],"hpluv":[192.177050630060279,375.729722461639881,96.6466465538527899],"hsluv":[192.177050630060279,99.9999999999789111,96.6466465538527899]},"#558800":{"lch":[51.3121649295003266,65.2833526322192,113.133039202335894],"luv":[51.3121649295003266,-25.6477049188799029,60.0342515843809466],"rgb":[0.333333333333333315,0.533333333333333326,0],"xyz":[0.125500024647865804,0.195391968690216522,0.0311019575727842744],"hpluv":[113.133039202335894,161.443824642532,51.3121649295003266],"hsluv":[113.133039202335894,100.000000000002416,51.3121649295003266]},"#558811":{"lch":[51.3586018009433758,63.5282336791645363,113.757082680238781],"luv":[51.3586018009433758,-25.5929736747770171,58.1449582756467862],"rgb":[0.333333333333333315,0.533333333333333326,0.0666666666666666657],"xyz":[0.126511690147502937,0.195796634890071375,0.0364300625375399076],"hpluv":[113.757082680238781,156.961418592175818,51.3586018009433758],"hsluv":[113.757082680238781,96.6047658949560315,51.3586018009433758]},"#558822":{"lch":[51.4445144263052754,60.3557257759597761,114.985955444381503],"luv":[51.4445144263052754,-25.4940226670596211,54.707115096615226],"rgb":[0.333333333333333315,0.533333333333333326,0.133333333333333331],"xyz":[0.128387048285979938,0.196546778145462203,0.0463069487335191],"hpluv":[114.985955444381503,148.873956641671725,51.4445144263052754],"hsluv":[114.985955444381503,90.4397474873449454,51.4445144263052754]},"#558833":{"lch":[51.5854933484676366,55.3603846502330512,117.238150003797628],"luv":[51.5854933484676366,-25.3378965271949284,49.2215723864945502],"rgb":[0.333333333333333315,0.533333333333333326,0.2],"xyz":[0.131474799018437671,0.197781878438445302,0.0625691025911302434],"hpluv":[117.238150003797628,136.179218375975154,51.5854933484676366],"hsluv":[117.238150003797628,80.6386945119108844,51.5854933484676366]},"#558844":{"lch":[51.788002513998137,48.6519311113283521,121.094634958525788],"luv":[51.788002513998137,-25.1264429677671792,41.6614001762900799],"rgb":[0.333333333333333315,0.533333333333333326,0.266666666666666663],"xyz":[0.135932794262656559,0.199565076536132896,0.0860478775440168819],"hpluv":[121.094634958525788,119.20933058927335,51.788002513998137],"hsluv":[121.094634958525788,67.2069053574962112,51.788002513998137]},"#558855":{"lch":[52.0569745246593669,40.6501953066927229,127.715012949238655],"luv":[52.0569745246593669,-24.8671203906742271,32.1568764333225801],"rgb":[0.333333333333333315,0.533333333333333326,0.333333333333333315],"xyz":[0.141895208302018572,0.201950042151877729,0.117449924817990797],"hpluv":[127.715012949238655,99.0884509425644495,52.0569745246593669],"hsluv":[127.715012949238655,50.4536826414745647,52.0569745246593669]},"#558866":{"lch":[52.3961000606252156,32.296627997442414,139.535908661945541],"luv":[52.3961000606252156,-24.57168930668605,20.9595864611130054],"rgb":[0.333333333333333315,0.533333333333333326,0.4],"xyz":[0.149480204075526729,0.20498404046128102,0.157397569225134759],"hpluv":[139.535908661945541,78.2163498792783258,52.3961000606252156],"hsluv":[139.535908661945541,52.7717106037122505,52.3961000606252156]},"#558877":{"lch":[52.8079833364028417,25.6675371494617757,160.900154113051656],"luv":[52.8079833364028417,-24.2545338981935465,8.39881233868101873],"rgb":[0.333333333333333315,0.533333333333333326,0.466666666666666674],"xyz":[0.158794217095728663,0.208709645669361843,0.206451371131532668],"hpluv":[160.900154113051656,61.6770996704155934,52.8079833364028417],"hsluv":[160.900154113051656,55.3375604028527732,52.8079833364028417]},"#558888":{"lch":[53.2942460543653311,24.4817100724115,192.177050630060762],"luv":[53.2942460543653311,-23.9308828659180151,-5.16400748714853908],"rgb":[0.333333333333333315,0.533333333333333326,0.533333333333333326],"xyz":[0.169934634197672463,0.213165812510139441,0.265124234535104808],"hpluv":[192.177050630060762,58.2908991249141764,53.2942460543653311],"hsluv":[192.177050630060762,58.0627314448554515,53.2942460543653311]},"#558899":{"lch":[53.8556132197311399,30.5464388010487,219.367537814697016],"luv":[53.8556132197311399,-23.6152401502492637,-19.3753801529742589],"rgb":[0.333333333333333315,0.533333333333333326,0.6],"xyz":[0.18299159830674519,0.218388598153768598,0.333890912176222743],"hpluv":[219.367537814697016,71.9728892793730921,53.8556132197311399],"hsluv":[219.367537814697016,60.861676067449,53.8556132197311399]},"#5588aa":{"lch":[54.491995562986105,41.1624410064978434,235.49057853568965],"luv":[54.491995562986105,-23.3202411533326384,-33.9192114024460452],"rgb":[0.333333333333333315,0.533333333333333326,0.66666666666666663],"xyz":[0.198049291271997718,0.224411675339869693,0.413194761793221343],"hpluv":[235.49057853568965,95.8534470006528494,54.491995562986105],"hsluv":[235.49057853568965,63.6587877222075207,54.491995562986105]},"#5588bb":{"lch":[55.2025746803936102,53.7318677649407164,244.589939769846183],"luv":[55.2025746803936102,-23.0560079965343867,-48.5338449823709865],"rgb":[0.333333333333333315,0.533333333333333326,0.733333333333333282],"xyz":[0.215186883379334393,0.231266712182804451,0.503452746891863],"hpluv":[244.589939769846183,123.512789385845494,55.2025746803936102],"hsluv":[244.589939769846183,66.3923972476147,55.2025746803936102]},"#5588cc":{"lch":[55.9858924676882,67.0258402153595227,250.085698604565607],"luv":[55.9858924676882,-22.8299557310329213,-63.0179052166444436],"rgb":[0.333333333333333315,0.533333333333333326,0.8],"xyz":[0.234479258823056119,0.238983662360293253,0.60505925756213319],"hpluv":[250.085698604565607,151.915814945370954,55.9858924676882],"hsluv":[250.085698604565607,69.0160689386852653,55.9858924676882]},"#5588dd":{"lch":[56.8399439373084761,80.4799585659197589,253.656315856923044],"luv":[56.8399439373084761,-22.6469326722406379,-77.2278458285038596],"rgb":[0.333333333333333315,0.533333333333333326,0.866666666666666696],"xyz":[0.255997584373689691,0.247590992580546787,0.718389105462139188],"hpluv":[253.656315856923044,179.669115472769334,56.8399439373084761],"hsluv":[253.656315856923044,71.4978966707909791,56.8399439373084761]},"#5588ee":{"lch":[57.7622712344346212,93.8110643698785083,256.11666422549024],"luv":[57.7622712344346212,-22.5095618551803298,-91.0704969970917517],"rgb":[0.333333333333333315,0.533333333333333326,0.933333333333333348],"xyz":[0.2798097646398644,0.257115864687016804,0.843799921530662411],"hpluv":[256.11666422549024,206.086302990026525,57.7622712344346212],"hsluv":[256.11666422549024,85.5354286092897098,57.7622712344346212]},"#5588ff":{"lch":[58.7500561820581169,106.871298098059711,257.890974112124525],"luv":[58.7500561820581169,-22.4186692043534066,-104.493433421771144],"rgb":[0.333333333333333315,0.533333333333333326,1],"xyz":[0.305980813049695821,0.267584284050949528,0.981634109822444256],"hpluv":[257.890974112124525,230.829932612430156,58.7500561820581169],"hsluv":[257.890974112124525,99.9999999999988489,58.7500561820581169]},"#559900":{"lch":[56.7948235068901113,75.0667586450735769,116.650835958582277],"luv":[56.7948235068901113,-33.6713638042581849,67.0914116190665766],"rgb":[0.333333333333333315,0.6,0],"xyz":[0.151369625100333277,0.247131169595152217,0.0397251577236065259],"hpluv":[116.650835958582277,167.717444253109818,56.7948235068901113],"hsluv":[116.650835958582277,100.000000000002373,56.7948235068901113]},"#559911":{"lch":[56.8345345919718,73.5501475520203343,117.179331557793219],"luv":[56.8345345919718,-33.596019870913949,65.4288289193465431],"rgb":[0.333333333333333315,0.6,0.0666666666666666657],"xyz":[0.152381290599970409,0.24753583579500707,0.0450532626883621556],"hpluv":[117.179331557793219,164.214146288467191,56.8345345919718],"hsluv":[117.179331557793219,97.3073310640873501,56.8345345919718]},"#559922":{"lch":[56.9080340332033785,70.7973668034807559,118.203267177206257],"luv":[56.9080340332033785,-33.458907670269852,62.3920559351826256],"rgb":[0.333333333333333315,0.6,0.133333333333333331],"xyz":[0.154256648738447411,0.248285979050397898,0.0549301488843413552],"hpluv":[118.203267177206257,157.863907732936383,56.9080340332033785],"hsluv":[118.203267177206257,92.3971004449738444,56.9080340332033785]},"#559933":{"lch":[57.0287279601738675,66.4302504595433163,120.024921583566851],"luv":[57.0287279601738675,-33.2401456716524066,57.5158316626386181],"rgb":[0.333333333333333315,0.6,0.2],"xyz":[0.157344399470905172,0.249521079343381,0.0711923027419525],"hpluv":[120.024921583566851,147.812625691912672,57.0287279601738675],"hsluv":[120.024921583566851,84.5348632876942645,57.0287279601738675]},"#559944":{"lch":[57.2022813646338335,60.4886548808755862,122.993651447985457],"luv":[57.2022813646338335,-32.9388613723515604,50.7337045837447178],"rgb":[0.333333333333333315,0.6,0.266666666666666663],"xyz":[0.161802394715124032,0.251304277441068591,0.0946710776948391369],"hpluv":[122.993651447985457,134.183743453609452,57.2022813646338335],"hsluv":[122.993651447985457,73.6468983233054075,57.2022813646338335]},"#559955":{"lch":[57.4331244004656583,53.227141365646645,127.715012949239252],"luv":[57.4331244004656583,-32.5608701853658573,42.1060365117673499],"rgb":[0.333333333333333315,0.6,0.333333333333333315],"xyz":[0.167764808754486017,0.253689243056813396,0.126073124968813038],"hpluv":[127.715012949239252,117.600732304920115,57.4331244004656583],"hsluv":[127.715012949239252,59.8797334066369444,57.4331244004656583]},"#559966":{"lch":[57.7247064038159152,45.1954856350919556,135.286653522876605],"luv":[57.7247064038159152,-32.1175213159608433,31.7977475037242847],"rgb":[0.333333333333333315,0.6,0.4],"xyz":[0.175349804527994202,0.256723241366216715,0.166020769375957],"hpluv":[135.286653522876605,99.3510934192793371,57.7247064038159152],"hsluv":[135.286653522876605,61.4133131906424055,57.7247064038159152]},"#559977":{"lch":[58.0796295741768631,37.4448814339638858,147.624029462041108],"luv":[58.0796295741768631,-31.624170974627738,20.0507096076703846],"rgb":[0.333333333333333315,0.6,0.466666666666666674],"xyz":[0.184663817548196107,0.260448846574297566,0.215074571282354909],"hpluv":[147.624029462041108,81.8102930750829671,58.0796295741768631],"hsluv":[147.624029462041108,63.1432913181764448,58.0796295741768631]},"#559988":{"lch":[58.4997327930321092,31.9103493306277741,167.047427400638497],"luv":[58.4997327930321092,-31.0984204046450543,7.15252701768072],"rgb":[0.333333333333333315,0.6,0.533333333333333326],"xyz":[0.195804234650139963,0.264905013415075108,0.273747434685927105],"hpluv":[167.047427400638497,69.2176742514874093,58.4997327930321092],"hsluv":[167.047427400638497,65.0191416919107752,58.4997327930321092]},"#559999":{"lch":[58.9861545428406373,31.2617491707160085,192.177050630060933],"luv":[58.9861545428406373,-30.5583742056962677,-6.59414339527129822],"rgb":[0.333333333333333315,0.6,0.6],"xyz":[0.208861198759212663,0.270127799058704321,0.342514112327045],"hpluv":[192.177050630060933,67.2515837667627494,58.9861545428406373],"hsluv":[192.177050630060933,66.9883413382070216,58.9861545428406373]},"#5599aa":{"lch":[59.5393884281606915,36.5784761777074152,214.841775998693208],"luv":[59.5393884281606915,-30.0211576326403424,-20.8977274812183715],"rgb":[0.333333333333333315,0.6,0.66666666666666663],"xyz":[0.223918891724465219,0.276150876244805388,0.421817961944043585],"hpluv":[214.841775998693208,77.957978019602777,59.5393884281606915],"hsluv":[214.841775998693208,69.0007957908225,59.5393884281606915]},"#5599bb":{"lch":[60.1593377819191488,46.1560476826162613,230.269588518041076],"luv":[60.1593377819191488,-29.5018430010724479,-35.4967885479802],"rgb":[0.333333333333333315,0.6,0.733333333333333282],"xyz":[0.241056483831801838,0.283005913087740146,0.512075947042685331],"hpluv":[230.269588518041076,97.3564866347465312,60.1593377819191488],"hsluv":[230.269588518041076,71.0120526680823758,60.1593377819191488]},"#5599cc":{"lch":[60.8453721774886276,57.9560381686168284,239.960256152221575],"luv":[60.8453721774886276,-29.0128279276179057,-50.1712883614184761],"rgb":[0.333333333333333315,0.6,0.8],"xyz":[0.260348859275523592,0.290722863265228948,0.613682457712955487],"hpluv":[239.960256152221575,120.867757439807349,60.8453721774886276],"hsluv":[239.960256152221575,72.9851794318318667,60.8453721774886276]},"#5599dd":{"lch":[61.596386585270082,70.7674616346471623,246.194917025964173],"luv":[61.596386585270082,-28.563620381934669,-64.7468394355121],"rgb":[0.333333333333333315,0.6,0.866666666666666696],"xyz":[0.281867184826157136,0.29933019348548251,0.727012305612961485],"hpluv":[246.194917025964173,145.7866339341696,61.596386585270082],"hsluv":[246.194917025964173,74.8914393241793164,61.596386585270082]},"#5599ee":{"lch":[62.4108626997728209,83.9573424358243,250.401946751580681],"luv":[62.4108626997728209,-28.1609349474859023,-79.0935970339554757],"rgb":[0.333333333333333315,0.6,0.933333333333333348],"xyz":[0.305679365092331845,0.308855065591952527,0.852423121681484708],"hpluv":[250.401946751580681,170.701691169737018,62.4108626997728209],"hsluv":[250.401946751580681,83.3865807682554845,62.4108626997728209]},"#5599ff":{"lch":[63.2869312953637,97.1853240423286309,253.372761171991215],"luv":[63.2869312953637,-27.8089904224615658,-93.1216798650875859],"rgb":[0.333333333333333315,0.6,1],"xyz":[0.331850413502163266,0.319323484955885251,0.990257309973266553],"hpluv":[253.372761171991215,194.861470594675211,63.2869312953637],"hsluv":[253.372761171991215,99.9999999999986215,63.2869312953637]},"#440000":{"lch":[10.7708306123528814,36.2226426723970221,12.1770506300617765],"luv":[10.7708306123528814,35.407649887332731,7.64056094984030221],"rgb":[0.266666666666666663,0,0],"xyz":[0.0238384275584062923,0.0122916892098035059,0.00111742629180027137],"hpluv":[12.1770506300617765,426.746789183125145,10.7708306123528814],"hsluv":[12.1770506300617765,100.000000000002203,10.7708306123528814]},"#440011":{"lch":[11.0614468716721248,32.5827232355020158,4.73042674181564848],"luv":[11.0614468716721248,32.4717377839629151,2.68702414036008763],"rgb":[0.266666666666666663,0,0.0666666666666666657],"xyz":[0.024850093058043414,0.0126963554096583605,0.00644553125655590239],"hpluv":[4.73042674181564848,373.778888471265759,11.0614468716721248],"hsluv":[4.73042674181564848,99.999999999996831,11.0614468716721248]},"#440022":{"lch":[11.5842423793746683,28.6540476811609395,350.304317532446703],"luv":[11.5842423793746683,28.2447579299318896,-4.82577434136679706],"rgb":[0.266666666666666663,0,0.133333333333333331],"xyz":[0.0267254511965204326,0.0134464986650491784,0.0163224174525351],"hpluv":[350.304317532446703,313.875682434467763,11.5842423793746683],"hsluv":[350.304317532446703,99.9999999999974847,11.5842423793746683]},"#440033":{"lch":[12.4041921203750505,27.3919603751935874,328.642516788172941],"luv":[12.4041921203750505,23.3910134404871357,-14.2541216293086901],"rgb":[0.266666666666666663,0,0.2],"xyz":[0.0298132019289781731,0.0146815989580322912,0.0325845713101462417],"hpluv":[328.642516788172941,280.216663156604227,12.4041921203750505],"hsluv":[328.642516788172941,99.9999999999981668,12.4041921203750505]},"#440044":{"lch":[13.5105146335658439,30.7747615701782742,307.715012949243601],"luv":[13.5105146335658439,18.8259784531467211,-24.3447835271332202],"rgb":[0.266666666666666663,0,0.266666666666666663],"xyz":[0.0342711971731970502,0.0164647970557198695,0.0560633462630328802],"hpluv":[307.715012949243601,289.042783730483222,13.5105146335658439],"hsluv":[307.715012949243601,99.9999999999987779,13.5105146335658439]},"#440055":{"lch":[14.871657786523194,37.5926423334987589,293.358518425732086],"luv":[14.871657786523194,14.9048564440935021,-34.5116214049025416],"rgb":[0.266666666666666663,0,0.333333333333333315],"xyz":[0.0402336112125590423,0.0188497626714647,0.0874653935370067886],"hpluv":[293.358518425732086,320.761913781574776,14.871657786523194],"hsluv":[293.358518425732086,99.999999999999261,14.871657786523194]},"#440066":{"lch":[16.4463097679727497,46.0898544445027,284.618444278650202],"luv":[16.4463097679727497,11.6321972733021664,-44.597832562922008],"rgb":[0.266666666666666663,0,0.4],"xyz":[0.0478186069860672205,0.0218837609808680139,0.127413037944150764],"hpluv":[284.618444278650202,355.611827609674208,16.4463097679727497],"hsluv":[284.618444278650202,99.9999999999996447,16.4463097679727497]},"#440077":{"lch":[18.1919811936642475,55.3198462112611651,279.251207899416613],"luv":[18.1919811936642475,8.8934050845755,-54.6002997321373],"rgb":[0.266666666666666663,0,0.466666666666666674],"xyz":[0.0571326200062691331,0.0256093661889488303,0.176466839850548673],"hpluv":[279.251207899416613,385.869357778503058,18.1919811936642475],"hsluv":[279.251207899416613,100.000000000000028,18.1919811936642475]},"#440088":{"lch":[20.0701231572475791,64.8751824688912,275.807883046004235],"luv":[20.0701231572475791,6.56492582220058196,-64.5421648949036353],"rgb":[0.266666666666666663,0,0.533333333333333326],"xyz":[0.0682730371082129611,0.0300655330297264212,0.235139703254120841],"hpluv":[275.807883046004235,410.173767132845569,20.0701231572475791],"hsluv":[275.807883046004235,100.000000000000284,20.0701231572475791]},"#440099":{"lch":[22.0482755473713041,74.5764302852581267,273.495279820248],"luv":[22.0482755473713041,4.54664979059262,-74.4377050275844283],"rgb":[0.266666666666666663,0,0.6],"xyz":[0.0813300012172856746,0.0352883186733555787,0.303906380895238748],"hpluv":[273.495279820248,429.20649964036636,22.0482755473713041],"hsluv":[273.495279820248,100.000000000000384,22.0482755473713041]},"#4400aa":{"lch":[24.1003299188330615,84.3353594354864811,271.878389761009714],"luv":[24.1003299188330615,2.7643624238057809,-84.290041828810061],"rgb":[0.266666666666666663,0,0.66666666666666663],"xyz":[0.0963876941825382166,0.0413113958594566871,0.383210230512237349],"hpluv":[271.878389761009714,444.044033459252,24.1003299188330615],"hsluv":[271.878389761009714,100.000000000000398,24.1003299188330615]},"#4400bb":{"lch":[26.2058661049044161,94.1030045511215434,270.708980538846049],"luv":[26.2058661049044161,1.16440507249082947,-94.0958002589677704],"rgb":[0.266666666666666663,0,0.733333333333333282],"xyz":[0.113525286289874863,0.0481664327023914457,0.473468215610879095],"hpluv":[270.708980538846049,455.663559843794246,26.2058661049044161],"hsluv":[270.708980538846049,100.000000000000597,26.2058661049044161]},"#4400cc":{"lch":[28.3491756730399374,103.84959146554381,269.838851579513857],"luv":[28.3491756730399374,-0.292083914573144032,-103.849180711969012],"rgb":[0.266666666666666663,0,0.8],"xyz":[0.132817661733596604,0.0558833828798802473,0.575074726281149196],"hpluv":[269.838851579513857,464.840204698682,28.3491756730399374],"hsluv":[269.838851579513857,100.00000000000054,28.3491756730399374]},"#4400dd":{"lch":[30.5182871942398464,113.556060117994207,269.175711116484081],"luv":[30.5182871942398464,-1.63362415099869285,-113.544308803456943],"rgb":[0.266666666666666663,0,0.866666666666666696],"xyz":[0.154335987284230147,0.0644907131001337813,0.688404574181155193],"hpluv":[269.175711116484081,472.160320460814546,30.5182871942398464],"hsluv":[269.175711116484081,100.000000000000583,30.5182871942398464]},"#4400ee":{"lch":[32.7041215904695406,123.209994802530275,268.6598990566049],"luv":[32.7041215904695406,-2.88151723804096926,-123.176295112519156],"rgb":[0.266666666666666663,0,0.933333333333333348],"xyz":[0.178148167550404884,0.0740155852066038122,0.813815390249678416],"hpluv":[268.6598990566049,478.060407115886846,32.7041215904695406],"hsluv":[268.6598990566049,100.000000000000682,32.7041215904695406]},"#4400ff":{"lch":[34.8998090420324161,132.803387625161918,268.251574356178935],"luv":[34.8998090420324161,-4.05197057625710322,-132.741558297197031],"rgb":[0.266666666666666663,0,1],"xyz":[0.204319215960236278,0.0844840045705365084,0.951649578541460262],"hpluv":[268.251574356178935,482.864668803745815,34.8998090420324161],"hsluv":[268.251574356178935,100.000000000000824,34.8998090420324161]},"#441100":{"lch":[13.412021407860891,32.8203905090178907,19.8063713084711637],"luv":[13.412021407860891,30.878837797926078,11.1209446277644677],"rgb":[0.266666666666666663,0.0666666666666666657,0],"xyz":[0.025842827819334703,0.0163004897316603795,0.00178555971210972225],"hpluv":[19.8063713084711637,310.519467471828818,13.412021407860891],"hsluv":[19.8063713084711637,100.00000000000226,13.412021407860891]},"#441111":{"lch":[13.6534230745514442,29.3615880370140658,12.1770506300618155],"luv":[13.6534230745514442,28.7009658227648572,6.19333616848069],"rgb":[0.266666666666666663,0.0666666666666666657,0.0666666666666666657],"xyz":[0.0268544933189718248,0.0167051559315152323,0.00711366467686535414],"hpluv":[12.1770506300618155,272.883526996448495,13.6534230745514442],"hsluv":[12.1770506300618155,63.9450685777404857,13.6534230745514442]},"#441122":{"lch":[14.0908014406849,25.4444274015795777,356.558123350094036],"luv":[14.0908014406849,25.3985311285907684,-1.52758053936917793],"rgb":[0.266666666666666663,0.0666666666666666657,0.133333333333333331],"xyz":[0.0287298514574488434,0.0174552991869060536,0.0169905508728445502],"hpluv":[356.558123350094036,229.137575437366081,14.0908014406849],"hsluv":[356.558123350094036,68.4589860949294,14.0908014406849]},"#441133":{"lch":[14.7844111345271223,24.27011571268606,331.648240125609],"luv":[14.7844111345271223,21.358884082162259,-11.5254755854986932],"rgb":[0.266666666666666663,0.0666666666666666657,0.2],"xyz":[0.0318176021899065839,0.0186903994798891665,0.0332527047304557],"hpluv":[331.648240125609,208.308572243058649,14.7844111345271223],"hsluv":[331.648240125609,73.8494669394836762,14.7844111345271223]},"#441144":{"lch":[15.733846020816415,28.3218749128348932,307.715012949243942],"luv":[15.733846020816415,17.3254634530922189,-22.4043949865608347],"rgb":[0.266666666666666663,0.0666666666666666657,0.266666666666666663],"xyz":[0.0362755974341254644,0.0204735975775767395,0.0567314796833423354],"hpluv":[307.715012949243942,228.415952286272613,15.733846020816415],"hsluv":[307.715012949243942,79.0249627886423127,15.733846020816415]},"#441155":{"lch":[16.9210970319156715,36.0495621705848492,292.339268883647492],"luv":[16.9210970319156715,13.7020846665308547,-33.3440220801582683],"rgb":[0.266666666666666663,0.0666666666666666657,0.333333333333333315],"xyz":[0.0422380114734874565,0.0228585631933215724,0.0881335269573162439],"hpluv":[292.339268883647492,270.340308544513618,16.9210970319156715],"hsluv":[292.339268883647492,83.4150097743113292,16.9210970319156715]},"#441166":{"lch":[18.3175541838796221,45.305096001334384,283.521508601515677],"luv":[18.3175541838796221,10.592801308498224,-44.0493392019540195],"rgb":[0.266666666666666663,0.0666666666666666657,0.4],"xyz":[0.0498230072469956348,0.025892561502724884,0.128081171364460206],"hpluv":[283.521508601515677,313.84766122316239,18.3175541838796221],"hsluv":[283.521508601515677,86.9023417707839485,18.3175541838796221]},"#441177":{"lch":[19.8903241139664431,55.0653797371295326,278.304914930180701],"luv":[19.8903241139664431,7.95370312292975612,-54.4879312529533735],"rgb":[0.266666666666666663,0.0666666666666666657,0.466666666666666674],"xyz":[0.0591370202671975473,0.0296181667108057,0.177134973270858115],"hpluv":[278.304914930180701,351.298345972174616,19.8903241139664431],"hsluv":[278.304914930180701,89.590178354910762,19.8903241139664431]},"#441188":{"lch":[21.6068634066631873,64.9598488176177824,275.03199667533886],"luv":[21.6068634066631873,5.69776159856002,-64.7094851716016422],"rgb":[0.266666666666666663,0.0666666666666666657,0.533333333333333326],"xyz":[0.0702774373691413823,0.0340743335515832912,0.235807836674430282],"hpluv":[275.03199667533886,381.498298720028686,21.6068634066631873],"hsluv":[275.03199667533886,91.6417594317348545,21.6068634066631873]},"#441199":{"lch":[23.437698327746169,74.8628785955689153,272.864058339832695],"luv":[23.437698327746169,3.74063102269824954,-74.769367197849931],"rgb":[0.266666666666666663,0.0666666666666666657,0.6],"xyz":[0.0833344014782140818,0.0392971191952124557,0.304574514315548162],"hpluv":[272.864058339832695,405.313331644098525,23.437698327746169],"hsluv":[272.864058339832695,93.2101268622270283,23.437698327746169]},"#4411aa":{"lch":[25.3575925472355337,84.7316846097945273,271.361966301038933],"luv":[25.3575925472355337,2.01394993465393446,-84.7077468858332878],"rgb":[0.266666666666666663,0.0666666666666666657,0.66666666666666663],"xyz":[0.0983920944434666378,0.0453201963813135572,0.383878363932546762],"hpluv":[271.361966301038933,424.011024215555381,25.3575925472355337],"hsluv":[271.361966301038933,94.4180404350203872,25.3575925472355337]},"#4411bb":{"lch":[27.345710117802,94.5503656807627,270.282295464151048],"luv":[27.345710117802,0.465846378280231621,-94.5492180693092337],"rgb":[0.266666666666666663,0.0666666666666666657,0.733333333333333282],"xyz":[0.115529686550803284,0.0521752332242483158,0.474136349031188509],"hpluv":[270.282295464151048,438.746165283595928,27.345710117802],"hsluv":[270.282295464151048,95.3579307613671,27.345710117802]},"#4411cc":{"lch":[29.3852471201757481,104.311620276565549,269.482476007084244],"luv":[29.3852471201757481,-0.942181651797373232,-104.307365120864873],"rgb":[0.266666666666666663,0.0666666666666666657,0.8],"xyz":[0.134822061994525,0.0598921834017371174,0.575742859701458665],"hpluv":[269.482476007084244,450.445933463405538,29.3852471201757481],"hsluv":[269.482476007084244,96.097629526357963,29.3852471201757481]},"#4411dd":{"lch":[31.4628506304707116,114.011096091836691,268.874895171215144],"luv":[31.4628506304707116,-2.23866735310417164,-113.989115272223103],"rgb":[0.266666666666666663,0.0666666666666666657,0.866666666666666696],"xyz":[0.156340387545158555,0.0684995136219906514,0.689072707601464662],"hpluv":[268.874895171215144,459.820552568088715,31.4628506304707116],"hsluv":[268.874895171215144,96.6865382756064378,31.4628506304707116]},"#4411ee":{"lch":[33.5680052377948073,123.64577428881995,268.40345713539682],"luv":[33.5680052377948073,-3.44493495426529961,-123.597774747940718],"rgb":[0.266666666666666663,0.0666666666666666657,0.933333333333333348],"xyz":[0.180152567811333292,0.0780243857284606823,0.814483523669987886],"hpluv":[268.40345713539682,467.404695294247745,33.5680052377948073],"hsluv":[268.40345713539682,97.1606953094382817,33.5680052377948073]},"#4411ff":{"lch":[35.6924730299026081,133.21354134861582,268.030966648817412],"luv":[35.6924730299026081,-4.57713081064657,-133.134884505082312],"rgb":[0.266666666666666663,0.0666666666666666657,1],"xyz":[0.206323616221164685,0.0884928050923933784,0.952317711961769731],"hpluv":[268.030966648817412,473.599309181226886,35.6924730299026081],"hsluv":[268.030966648817412,99.999999999999531,35.6924730299026081]},"#99aa00":{"lch":[66.1528677227115907,74.3468963767982842,94.6234982733471384],"luv":[66.1528677227115907,-5.99293371363564553,74.1049643840839565],"rgb":[0.6,0.66666666666666663,0],"xyz":[0.275106719282890377,0.355217387920677,0.0540714229698005533],"hpluv":[94.6234982733471384,142.611154102436132,66.1528677227115907],"hsluv":[94.6234982733471384,100.000000000002217,66.1528677227115907]},"#99aa11":{"lch":[66.184052262829,73.0311244080130706,94.7508326892346275],"luv":[66.184052262829,-6.04863423256243316,72.7802112955118901],"rgb":[0.6,0.66666666666666663,0.0666666666666666657],"xyz":[0.276118384782527482,0.355622054120531828,0.059399527934556183],"hpluv":[94.7508326892346275,140.021252931940353,66.184052262829],"hsluv":[94.7508326892346275,98.1390759685954,66.184052262829]},"#99aa22":{"lch":[66.2417975711995695,70.6178785015108872,94.9968669170454376],"luv":[66.2417975711995695,-6.15090676716144458,70.3494926065273],"rgb":[0.6,0.66666666666666663,0.133333333333333331],"xyz":[0.277993742921004539,0.356372197375922628,0.0692764141305353826],"hpluv":[94.9968669170454376,135.276352185575888,66.2417975711995695],"hsluv":[94.9968669170454376,94.7283581868373403,66.2417975711995695]},"#99aa33":{"lch":[66.3366981156763273,66.7162457715457,95.432805623918],"luv":[66.3366981156763273,-6.31658226271684953,66.416550937003791],"rgb":[0.6,0.66666666666666663,0.2],"xyz":[0.281081493653462244,0.357607297668905755,0.0855385679881465189],"hpluv":[95.432805623918,127.619510800204154,66.3366981156763273],"hsluv":[95.432805623918,89.220332613511431,66.3366981156763273]},"#99aa44":{"lch":[66.4733277612737652,61.2361369282317085,96.1403021162386],"luv":[66.4733277612737652,-6.55002950525979344,60.8848222414533211],"rgb":[0.6,0.66666666666666663,0.266666666666666663],"xyz":[0.28553948889768116,0.359390495766593321,0.109017342941033157],"hpluv":[96.1403021162386,116.896010950353556,66.4733277612737652],"hsluv":[96.1403021162386,81.495914591183535,66.4733277612737652]},"#99aa55":{"lch":[66.6553605356915853,54.1785870660784568,97.2658616968833769],"luv":[66.6553605356915853,-6.85216039608048888,53.7435316515674231],"rgb":[0.6,0.66666666666666663,0.333333333333333315],"xyz":[0.291501902937043145,0.361775461382338182,0.140419390215007073],"hpluv":[97.2658616968833769,103.141138146130345,66.6553605356915853],"hsluv":[97.2658616968833769,71.5645731506566563,66.6553605356915853]},"#99aa66":{"lch":[66.8857782590742573,45.6318272725976186,99.1048787772859328],"luv":[66.8857782590742573,-7.22087825912546055,45.0568815765480224],"rgb":[0.6,0.66666666666666663,0.4],"xyz":[0.29908689871055133,0.3648094596917415,0.180367034622151035],"hpluv":[99.1048787772859328,86.5711928674077882,66.8857782590742573],"hsluv":[99.1048787772859328,59.5487850828384495,66.8857782590742573]},"#99aa77":{"lch":[67.16697930835997,35.7793898766585272,102.348317274789],"luv":[67.16697930835997,-7.65157453727816339,34.9516544250255947],"rgb":[0.6,0.66666666666666663,0.466666666666666674],"xyz":[0.308400911730753235,0.368535064899822296,0.229420836528548944],"hpluv":[102.348317274789,67.5952906506277742,67.16697930835997],"hsluv":[102.348317274789,45.6652750399669927,67.16697930835997]},"#99aa88":{"lch":[67.5008436530857523,24.9656779050761699,109.02352802026725],"luv":[67.5008436530857523,-8.13772239581267165,23.6021725158659379],"rgb":[0.6,0.66666666666666663,0.533333333333333326],"xyz":[0.319541328832697036,0.372991231740599893,0.288093699932121083],"hpluv":[109.02352802026725,46.9324783865521482,67.5008436530857523],"hsluv":[109.02352802026725,30.201776912068496,67.5008436530857523]},"#99aa99":{"lch":[67.8887769686822509,14.1753245834603039,127.715012949228395],"luv":[67.8887769686822509,-8.67153282620695443,11.213578621049983],"rgb":[0.6,0.66666666666666663,0.6],"xyz":[0.332598292941769791,0.378214017384229051,0.356860377573239],"hpluv":[127.715012949228395,26.4956363039349618,67.8887769686822509],"hsluv":[127.715012949228395,13.4910013502760879,67.8887769686822509]},"#99aaaa":{"lch":[68.3317447891119798,9.45739632834534838,192.177050630059227],"luv":[68.3317447891119798,-9.24460926466251642,-1.99487965930680966],"rgb":[0.6,0.66666666666666663,0.66666666666666663],"xyz":[0.347655985907022291,0.384237094570330173,0.436164227190237619],"hpluv":[192.177050630059227,17.5625836428344968,68.3317447891119798],"hsluv":[192.177050630059227,17.4938385380963979,68.3317447891119798]},"#99aabb":{"lch":[68.8303024285350205,18.6222464744475609,238.07162859052869],"luv":[68.8303024285350205,-9.84853629911531137,-15.8048852105949411],"rgb":[0.6,0.66666666666666663,0.733333333333333282],"xyz":[0.364793578014358966,0.391092131413264932,0.52642221228887931],"hpluv":[238.07162859052869,34.3314162301526622,68.8303024285350205],"hsluv":[238.07162859052869,21.6214176811966929,68.8303024285350205]},"#99aacc":{"lch":[69.3846237501618646,31.7868422871013969,250.758533684062627],"luv":[69.3846237501618646,-10.475354770609286,-30.0111693376804425],"rgb":[0.6,0.66666666666666663,0.8],"xyz":[0.38408595345808072,0.398809081590753733,0.628028722959149466],"hpluv":[250.758533684062627,58.1330991079694357,69.3846237501618646],"hsluv":[250.758533684062627,38.7837447081888556,69.3846237501618646]},"#99aadd":{"lch":[69.9945303682966,45.800012761152324,255.951164454091042],"luv":[69.9945303682966,-11.1178995355210173,-44.4300965432191859],"rgb":[0.6,0.66666666666666663,0.866666666666666696],"xyz":[0.405604279008714208,0.40741641181100724,0.741358570859155463],"hpluv":[255.951164454091042,83.0311057452140346,69.9945303682966],"hsluv":[255.951164454091042,58.1375555879370935,69.9945303682966]},"#99aaee":{"lch":[70.6595219654936,60.0690973767372896,258.700300270425373],"luv":[70.6595219654936,-11.7699993169592201,-58.9046990972259],"rgb":[0.6,0.66666666666666663,0.933333333333333348],"xyz":[0.429416459274889,0.416941283917477257,0.866769386927678687],"hpluv":[258.700300270425373,107.874733956899746,70.6595219654936],"hsluv":[258.700300270425373,78.5353046306170199,70.6595219654936]},"#99aaff":{"lch":[71.378807837336737,74.3523754541628676,260.378973553217],"luv":[71.378807837336737,-12.4265554124673407,-73.3065921746310636],"rgb":[0.6,0.66666666666666663,1],"xyz":[0.455587507684720339,0.42740970328141,1.00460357521946064],"hpluv":[260.378973553217,132.179737350703419,71.378807837336737],"hsluv":[260.378973553217,99.99999999999784,71.378807837336737]},"#442200":{"lch":[17.3350542344952459,28.221345162136295,35.6239292836567927],"luv":[17.3350542344952459,22.9399340369809366,16.4378754448194186],"rgb":[0.266666666666666663,0.133333333333333331,0],"xyz":[0.0295584515541026382,0.023731737201196354,0.00302410095703233277],"hpluv":[35.6239292836567927,206.581692971425213,17.3350542344952459],"hsluv":[35.6239292836567927,100.000000000002331,17.3350542344952459]},"#442211":{"lch":[17.5234603686317101,24.6335663377647,28.604455948929278],"luv":[17.5234603686317101,21.6269347365689519,11.7935696215031331],"rgb":[0.266666666666666663,0.133333333333333331,0.0666666666666666657],"xyz":[0.03057011705373976,0.0241364034010512069,0.00835220592178796337],"hpluv":[28.604455948929278,178.380241443971528,17.5234603686317101],"hsluv":[28.604455948929278,74.2089163354216765,17.5234603686317101]},"#442222":{"lch":[17.8672188947691239,19.9697171584766728,12.1770506300619807],"luv":[17.8672188947691239,19.520407715454283,4.21227800744330061],"rgb":[0.266666666666666663,0.133333333333333331,0.133333333333333331],"xyz":[0.0324454751922167786,0.0248865466564420282,0.0182290921177671594],"hpluv":[12.1770506300619807,141.825486578211439,17.8672188947691239],"hsluv":[12.1770506300619807,33.2341074785113406,17.8672188947691239]},"#442233":{"lch":[18.4184657925371695,17.8165085202964129,340.00784749027008],"luv":[18.4184657925371695,16.7428760354525643,-6.09131167444770583],"rgb":[0.266666666666666663,0.133333333333333331,0.2],"xyz":[0.0355332259246745191,0.026121646949425141,0.0344912459753783],"hpluv":[340.00784749027008,122.746318288975218,18.4184657925371695],"hsluv":[340.00784749027008,42.0888291674463915,18.4184657925371695]},"#442244":{"lch":[19.1844846541763658,22.4593922221866436,307.715012949244738],"luv":[19.1844846541763658,13.7391814744519145,-17.7668002578431441],"rgb":[0.266666666666666663,0.133333333333333331,0.266666666666666663],"xyz":[0.0399912211688934,0.0279048450471127141,0.0579700209282649412],"hpluv":[307.715012949244738,148.554970924606664,19.1844846541763658],"hsluv":[307.715012949244738,51.3954955066877517,19.1844846541763658]},"#442255":{"lch":[20.1595909359386596,31.6741463862469885,290.023039430837684],"luv":[20.1595909359386596,10.8451637140407797,-29.7596030436068872],"rgb":[0.266666666666666663,0.133333333333333331,0.333333333333333315],"xyz":[0.0459536352082553917,0.030289810662857547,0.0893720682022388496],"hpluv":[290.023039430837684,199.371249454156271,20.1595909359386596],"hsluv":[290.023039430837684,59.9942694866150177,20.1595909359386596]},"#442266":{"lch":[21.3287002071660226,42.3208084503031685,281.207510247893651],"luv":[21.3287002071660226,8.22559640374024781,-41.5137373852322256],"rgb":[0.266666666666666663,0.133333333333333331,0.4],"xyz":[0.0535386309817635631,0.0333238089722608585,0.129319712609382825],"hpluv":[281.207510247893651,251.784442505332123,21.3287002071660226],"hsluv":[281.207510247893651,67.3437899952651406,21.3287002071660226]},"#442277":{"lch":[22.6709734328231463,53.1747129073287113,276.391210783405313],"luv":[22.6709734328231463,5.91922219198187882,-52.8442324328661215],"rgb":[0.266666666666666663,0.133333333333333331,0.466666666666666674],"xyz":[0.0628526440019654825,0.0370494141803416749,0.178373514515780734],"hpluv":[276.391210783405313,297.628360698128461,22.6709734328231463],"hsluv":[276.391210783405313,73.3546851738733,22.6709734328231463]},"#442288":{"lch":[24.1630625686767715,63.8732961962266543,273.501787345358252],"luv":[24.1630625686767715,3.90136026108148481,-63.7540379512086801],"rgb":[0.266666666666666663,0.133333333333333331,0.533333333333333326],"xyz":[0.0739930611039093106,0.0415055810211192727,0.237046377919352902],"hpluv":[273.501787345358252,335.433687598002,24.1630625686767715],"hsluv":[273.501787345358252,78.1624380374364875,24.1630625686767715]},"#442299":{"lch":[25.7815797239733442,74.3421908873045112,271.638748742297366],"luv":[25.7815797239733442,2.1260128283266071,-74.3117851715204836],"rgb":[0.266666666666666663,0.133333333333333331,0.6],"xyz":[0.087050025212982024,0.0467283666647484303,0.305813055560470781],"hpluv":[271.638748742297366,365.902315457699217,25.7815797239733442],"hsluv":[271.638748742297366,81.974423252689391,25.7815797239733442]},"#4422aa":{"lch":[27.5046927955253,84.5952413694672885,270.370058715866037],"luv":[27.5046927955253,0.546375125789773097,-84.5934769150692176],"rgb":[0.266666666666666663,0.133333333333333331,0.66666666666666663],"xyz":[0.102107718178234566,0.0527514438508495317,0.385116905177469382],"hpluv":[270.370058715866037,390.281946032504152,27.5046927955253],"hsluv":[270.370058715866037,84.9950544768410765,27.5046927955253]},"#4422bb":{"lch":[29.3129652277151251,94.666070770970677,269.4687873747244],"luv":[29.3129652277151251,-0.87767531850734,-94.6620020982533],"rgb":[0.266666666666666663,0.133333333333333331,0.733333333333333282],"xyz":[0.119245310285571213,0.0596064806937842903,0.475374890276111128],"hpluv":[269.4687873747244,409.801860030343846,29.3129652277151251],"hsluv":[269.4687873747244,87.3984435941311517,29.3129652277151251]},"#4422cc":{"lch":[31.1896477872922873,104.586362634530047,268.806646243455475],"luv":[31.1896477872922873,-2.17816227055809408,-104.563678484665701],"rgb":[0.266666666666666663,0.133333333333333331,0.8],"xyz":[0.138537685729292953,0.0673234308712731,0.576981400946381284],"hpluv":[268.806646243455475,425.504262664631483,31.1896477872922873],"hsluv":[268.806646243455475,89.3235413687926325,31.1896477872922873]},"#4422dd":{"lch":[33.1206275871571,114.38069493574325,268.306702684458742],"luv":[33.1206275871571,-3.37987077956927,-114.330747603157818],"rgb":[0.266666666666666663,0.133333333333333331,0.866666666666666696],"xyz":[0.160056011279926497,0.0759307610915266329,0.690311248846387282],"hpluv":[268.306702684458742,438.22131720165,33.1206275871571],"hsluv":[268.306702684458742,90.877884626449017,33.1206275871571]},"#4422ee":{"lch":[35.0941942457284952,124.066768949832422,267.920557621455941],"luv":[35.0941942457284952,-4.50178121539094178,-123.985068147498538],"rgb":[0.266666666666666663,0.133333333333333331,0.933333333333333348],"xyz":[0.183868191546101234,0.0854556331979966499,0.815722064914910505],"hpluv":[267.920557621455941,448.600262181889605,35.0941942457284952],"hsluv":[267.920557621455941,93.3452679661598523,35.0941942457284952]},"#4422ff":{"lch":[37.1007304630435,133.656986375695226,267.616535799179189],"luv":[37.1007304630435,-5.55843332369103926,-133.54135623850334],"rgb":[0.266666666666666663,0.133333333333333331,1],"xyz":[0.210039239955932627,0.0959240525619293599,0.95355625320669235],"hpluv":[267.616535799179189,457.139270395610822,37.1007304630435],"hsluv":[267.616535799179189,99.999999999999531,37.1007304630435]},"#bbaa00":{"lch":[68.9787767407419,76.4078567958722346,76.7962953219783344],"luv":[68.9787767407419,17.4526104568015299,74.3879490803561652],"rgb":[0.733333333333333282,0.66666666666666663,0],"xyz":[0.348671553863065253,0.393149255751080451,0.0575197745907461769],"hpluv":[76.7962953219783344,140.560034871296551,68.9787767407419],"hsluv":[76.7962953219783344,100.000000000002245,68.9787767407419]},"#bbaa11":{"lch":[69.0079227935645747,75.1793224892161902,76.6760735029220797],"luv":[69.0079227935645747,17.325534429098667,73.1556996185784811],"rgb":[0.733333333333333282,0.66666666666666663,0.0666666666666666657],"xyz":[0.349683219362702358,0.393553921950935304,0.0628478795555018],"hpluv":[76.6760735029220797,138.241608756115426,69.0079227935645747],"hsluv":[76.6760735029220797,98.327691673723,69.0079227935645747]},"#bbaa22":{"lch":[69.0618990033698168,72.923722885125926,76.4446579961253718],"luv":[69.0618990033698168,17.0921879270318975,70.8923583420220496],"rgb":[0.733333333333333282,0.66666666666666663,0.133333333333333331],"xyz":[0.351558577501179415,0.394304065206326104,0.072724765751481],"hpluv":[76.4446579961253718,133.98915323660276,69.0618990033698168],"hsluv":[76.4446579961253718,95.2591470849694701,69.0618990033698168]},"#bbaa33":{"lch":[69.1506211183474448,69.2704933393546298,76.037430434814425],"luv":[69.1506211183474448,16.7141363744442764,67.2237970716773248],"rgb":[0.733333333333333282,0.66666666666666663,0.2],"xyz":[0.35464632823363712,0.395539165499309231,0.0889869196090921494],"hpluv":[76.037430434814425,127.113454601419591,69.1506211183474448],"hsluv":[76.037430434814425,90.2940538071316752,69.1506211183474448]},"#bbaa44":{"lch":[69.2783900215706439,64.125663575375043,75.3840533289293688],"luv":[69.2783900215706439,16.1813855024742246,62.0504914743025964],"rgb":[0.733333333333333282,0.66666666666666663,0.266666666666666663],"xyz":[0.359104323477856036,0.397322363596996797,0.112465694561978788],"hpluv":[75.3840533289293688,117.455514697890109,69.2783900215706439],"hsluv":[75.3840533289293688,83.3108908827552455,69.2783900215706439]},"#bbaa55":{"lch":[69.4486803199850158,57.4759826537307603,74.3632861967268752],"luv":[69.4486803199850158,15.4919003466967737,55.3487994961044762],"rgb":[0.733333333333333282,0.66666666666666663,0.333333333333333315],"xyz":[0.365066737517218,0.399707329212741658,0.143867741835952689],"hpluv":[74.3632861967268752,105.017514149864908,69.4486803199850158],"hsluv":[74.3632861967268752,74.2978448337225501,69.4486803199850158]},"#bbaa66":{"lch":[69.6643364030220766,49.3851711615203186,72.7428070953876],"luv":[69.6643364030220766,14.6506772614363818,47.1619845472377079],"rgb":[0.733333333333333282,0.66666666666666663,0.4],"xyz":[0.372651733290726206,0.402741327522145,0.183815386243096651],"hpluv":[72.7428070953876,89.9550160304510342,69.6643364030220766],"hsluv":[72.7428070953876,63.3404983901227254,69.6643364030220766]},"#bbaa77":{"lch":[69.927675331165787,39.998456174204172,70.017617272721],"luv":[69.927675331165787,13.6687200676018641,37.5904587366697314],"rgb":[0.733333333333333282,0.66666666666666663,0.466666666666666674],"xyz":[0.381965746310928111,0.406466932730225772,0.23286918814949456],"hpluv":[70.017617272721,72.5827577171275635,69.927675331165787],"hsluv":[70.017617272721,50.6076787731359303,69.927675331165787]},"#bbaa88":{"lch":[70.2405480333122,29.5797452752191568,64.8698942165899837],"luv":[70.2405480333122,12.5617839686329518,26.7798975739685403],"rgb":[0.733333333333333282,0.66666666666666663,0.533333333333333326],"xyz":[0.393106163412871912,0.41092309957100337,0.291542051553066728],"hpluv":[64.8698942165899837,53.4374671266607422,70.2405480333122],"hsluv":[64.8698942165899837,36.3337734813298923,70.2405480333122]},"#bbaa99":{"lch":[70.6043801086793,18.7359983934483161,52.7186742094296079],"luv":[70.6043801086793,11.3489394865138475,14.907689570511744],"rgb":[0.733333333333333282,0.66666666666666663,0.6],"xyz":[0.406163127521944611,0.416145885214632527,0.360308729194184663],"hpluv":[52.7186742094296079,33.6732102985619051,70.6043801086793],"hsluv":[52.7186742094296079,20.7983697782308,70.6043801086793]},"#bbaaaa":{"lch":[71.0202025015365876,10.2824341490213804,12.177050630064155],"luv":[71.0202025015365876,10.0510841141786607,2.16890759569567715],"rgb":[0.733333333333333282,0.66666666666666663,0.66666666666666663],"xyz":[0.421220820487197167,0.422168962400733649,0.439612578811183263],"hpluv":[12.177050630064155,18.3718697222702261,71.0202025015365876],"hsluv":[12.177050630064155,12.5020210815887047,71.0202025015365876]},"#bbaabb":{"lch":[71.4886774714552615,14.2047670368859897,307.715012949256788],"luv":[71.4886774714552615,8.68954378602241562,-11.236869464535129],"rgb":[0.733333333333333282,0.66666666666666663,0.733333333333333282],"xyz":[0.438358412594533842,0.429023999243668408,0.529870563909825],"hpluv":[307.715012949256788,25.2136766683934965,71.4886774714552615],"hsluv":[307.715012949256788,14.1682246563909,71.4886774714552615]},"#bbaacc":{"lch":[72.010122844957138,26.1519063744379174,286.174295641089373],"luv":[72.010122844957138,7.28488198445553525,-25.1167812724863673],"rgb":[0.733333333333333282,0.66666666666666663,0.8],"xyz":[0.45765078803825554,0.43674094942115721,0.631477074580095166],"hpluv":[286.174295641089373,46.0838895939184923,72.010122844957138],"hsluv":[286.174295641089373,33.6938059680335442,72.010122844957138]},"#bbaadd":{"lch":[72.5845361735228494,39.7272427931479,278.476565574149959],"luv":[72.5845361735228494,5.85598959517198825,-39.2932717625671799],"rgb":[0.733333333333333282,0.66666666666666663,0.866666666666666696],"xyz":[0.47916911358888914,0.445348279641410716,0.744806922480101163],"hpluv":[278.476565574149959,69.451822258827633,72.5845361735228494],"hsluv":[278.476565574149959,54.5084651382981775,72.5845361735228494]},"#bbaaee":{"lch":[73.2116196006959825,53.7916684525604,274.71268656160521],"luv":[73.2116196006959825,4.41947960396952144,-53.6098106221266093],"rgb":[0.733333333333333282,0.66666666666666663,0.933333333333333348],"xyz":[0.502981293855063849,0.454873151747880733,0.870217738548624387],"hpluv":[274.71268656160521,93.2340021292866084,73.2116196006959825],"hsluv":[274.71268656160521,76.5987468488048506,73.2116196006959825]},"#bbaaff":{"lch":[73.8908057188696574,67.9996555049746121,272.519622378571285],"luv":[73.8908057188696574,2.98936916429642707,-67.9339150998584671],"rgb":[0.733333333333333282,0.66666666666666663,1],"xyz":[0.52915234226489527,0.465341571111813457,1.00805192684040623],"hpluv":[272.519622378571285,116.776549017196231,73.8908057188696574],"hsluv":[272.519622378571285,99.9999999999974847,73.8908057188696574]},"#99bb00":{"lch":[71.0859361318702696,82.3913749493211327,101.26222245755217],"luv":[71.0859361318702696,-16.0909976916487061,80.8048170552163185],"rgb":[0.6,0.733333333333333282,0],"xyz":[0.309061217191489157,0.423126383737875533,0.0653895889393331653],"hpluv":[101.26222245755217,147.074503152999483,71.0859361318702696],"hsluv":[101.26222245755217,100.000000000002302,71.0859361318702696]},"#99bb11":{"lch":[71.1136894680978457,81.2167121813616291,101.442926834262664],"luv":[71.1136894680978457,-16.1127230849120338,79.6023523040561685],"rgb":[0.6,0.733333333333333282,0.0666666666666666657],"xyz":[0.310072882691126261,0.423531049937730386,0.0707176939040888],"hpluv":[101.442926834262664,144.921066000062638,71.1136894680978457],"hsluv":[101.442926834262664,98.4331733262411,71.1136894680978457]},"#99bb22":{"lch":[71.1650900316793837,79.0601549481488917,101.789083890819583],"luv":[71.1650900316793837,-16.1527448632600859,77.392486287802754],"rgb":[0.6,0.733333333333333282,0.133333333333333331],"xyz":[0.311948240829603318,0.424281193193121187,0.080594580100068],"hpluv":[101.789083890819583,140.971066242853169,71.1650900316793837],"hsluv":[101.789083890819583,95.5563304227746357,71.1650900316793837]},"#99bb33":{"lch":[71.2495884989653,75.5680342451554168,102.392870056849247],"luv":[71.2495884989653,-16.2179420391938294,73.807222923575253],"rgb":[0.6,0.733333333333333282,0.2],"xyz":[0.315035991562061,0.425516293486104313,0.0968567339576791309],"hpluv":[102.392870056849247,134.584514176993849,71.2495884989653],"hsluv":[102.392870056849247,90.8963478676004826,71.2495884989653]},"#99bb44":{"lch":[71.3712967033779648,70.652786516275043,103.347443045401377],"luv":[71.3712967033779648,-16.3105834167977157,68.7443169368786471],"rgb":[0.6,0.733333333333333282,0.266666666666666663],"xyz":[0.319493986806279939,0.427299491583791879,0.120335508910565769],"hpluv":[103.347443045401377,125.616021445862458,71.3712967033779648],"hsluv":[103.347443045401377,84.331672265085615,71.3712967033779648]},"#99bb55":{"lch":[71.5335490617920442,64.3081830776187502,104.804237401434776],"luv":[71.5335490617920442,-16.4318507493525949,62.1734404042074189],"rgb":[0.6,0.733333333333333282,0.333333333333333315],"xyz":[0.325456400845641924,0.42968445719953674,0.151737556184539685],"hpluv":[104.804237401434776,114.076396323867073,71.5335490617920442],"hsluv":[104.804237401434776,75.8403293762878263,71.5335490617920442]},"#99bb66":{"lch":[71.7390905918245494,56.6109161874071347,107.032342660002968],"luv":[71.7390905918245494,-16.5819871692753225,54.1279367156704367],"rgb":[0.6,0.733333333333333282,0.4],"xyz":[0.33304139661915011,0.432718455508940059,0.191685200591683647],"hpluv":[107.032342660002968,100.134479122606095,71.7390905918245494],"hsluv":[107.032342660002968,65.4891515707011,71.7390905918245494]},"#99bb77":{"lch":[71.9901757540345102,47.73532562127712,110.555323727161408],"luv":[71.9901757540345102,-16.7604289857032249,44.6961892378372099],"rgb":[0.6,0.733333333333333282,0.466666666666666674],"xyz":[0.342355409639352,0.436444060717020854,0.240739002498081556],"hpluv":[110.555323727161408,84.1406731320706,71.9901757540345102],"hsluv":[110.555323727161408,53.4218452589237,71.9901757540345102]},"#99bb88":{"lch":[72.2886271035685581,38.007890289968195,116.511646356383693],"luv":[72.2886271035685581,-16.9659512259030869,34.0111191126451473],"rgb":[0.6,0.733333333333333282,0.533333333333333326],"xyz":[0.353495826741295815,0.440900227557798452,0.299411865901653695],"hpluv":[116.511646356383693,66.7180145269523592,72.2886271035685581],"hsluv":[116.511646356383693,39.8440619041218724,72.2886271035685581]},"#99bb99":{"lch":[72.6358740128595315,28.1115962970155238,127.715012949234961],"luv":[72.6358740128595315,-17.1968288028560856,22.2380512970816788],"rgb":[0.6,0.733333333333333282,0.6],"xyz":[0.366552790850368515,0.44612301320142761,0.36817854354277163],"hpluv":[127.715012949234961,49.1104221429672094,72.6358740128595315],"hsluv":[127.715012949234961,25.0059581073328268,72.6358740128595315]},"#99bbaa":{"lch":[73.0329812495468929,19.8989345424194468,151.280397210880039],"luv":[73.0329812495468929,-17.4510036711552878,9.56190706882358654],"rgb":[0.6,0.733333333333333282,0.66666666666666663],"xyz":[0.381610483815621071,0.452146090387528732,0.447482393159770231],"hpluv":[151.280397210880039,34.5740392557976648,73.0329812495468929],"hsluv":[151.280397210880039,28.0327457551748473,73.0329812495468929]},"#99bbbb":{"lch":[73.4806726048520602,18.1342571597367979,192.177050630060279],"luv":[73.4806726048520602,-17.7262447217336288,-3.82511840348453136],"rgb":[0.6,0.733333333333333282,0.733333333333333282],"xyz":[0.398748075922957745,0.45900112723046349,0.537740378258412],"hpluv":[192.177050630060279,31.3159775944509384,73.4806726048520602],"hsluv":[192.177050630060279,31.1933976709334857,73.4806726048520602]},"#99bbcc":{"lch":[73.9793524714423,25.2831678504957686,224.541830016242],"luv":[73.9793524714423,-18.0202882726228886,-17.734367401402082],"rgb":[0.6,0.733333333333333282,0.8],"xyz":[0.418040451366679444,0.466718077407952292,0.639346888928682189],"hpluv":[224.541830016242,43.3670907410057183,73.9793524714423],"hsluv":[224.541830016242,34.4349286550277398,73.9793524714423]},"#99bbdd":{"lch":[74.5291269946933284,36.8692317824205347,240.185846709470951],"luv":[74.5291269946933284,-18.3309507682094441,-31.9893184697537762],"rgb":[0.6,0.733333333333333282,0.866666666666666696],"xyz":[0.439558776917313043,0.475325407628205798,0.752676736828688187],"hpluv":[240.185846709470951,62.7736499155611796,74.5291269946933284],"hsluv":[240.185846709470951,50.9371920612126914,74.5291269946933284]},"#99bbee":{"lch":[75.129825653719962,50.0395173115419851,248.109771752659725],"luv":[75.129825653719962,-18.6562099892881648,-46.4316607672792],"rgb":[0.6,0.733333333333333282,0.933333333333333348],"xyz":[0.463370957183487753,0.484850279734675815,0.87808755289721141],"hpluv":[248.109771752659725,84.5162185097210568,75.129825653719962],"hsluv":[248.109771752659725,74.708817528734329,75.129825653719962]},"#99bbff":{"lch":[75.7810236401202104,63.8171103470632701,252.684342225014],"luv":[75.7810236401202104,-18.9942553989637197,-60.9248868270445527],"rgb":[0.6,0.733333333333333282,1],"xyz":[0.489542005593319174,0.495318699098608539,1.01592174118899314],"hpluv":[252.684342225014,106.860202909060845,75.7810236401202104],"hsluv":[252.684342225014,99.9999999999971,75.7810236401202104]},"#443300":{"lch":[22.2907133772276609,26.4379209369795269,61.2454831359909],"luv":[22.2907133772276609,12.7181702882918319,23.1778300966244757],"rgb":[0.266666666666666663,0.2,0],"xyz":[0.0356761736431134499,0.0359671813792181508,0.00506334165336921362],"hpluv":[61.2454831359909,150.502134175174433,22.2907133772276609],"hsluv":[61.2454831359909,100.000000000002217,22.2907133772276609]},"#443311":{"lch":[22.433780901835803,22.5495741902090607,57.6291729330006959],"luv":[22.433780901835803,12.072970412625418,19.0453847841311372],"rgb":[0.266666666666666663,0.2,0.0666666666666666657],"xyz":[0.0366878391427505751,0.0363718475790730036,0.0103914466181248451],"hpluv":[57.6291729330006959,127.548453681164943,22.433780901835803],"hsluv":[57.6291729330006959,82.4396262904162853,22.433780901835803]},"#443322":{"lch":[22.6962080128251955,16.3034653251506185,47.6268315603120129],"luv":[22.6962080128251955,10.9878263584328284,12.044527949459761],"rgb":[0.266666666666666663,0.2,0.133333333333333331],"xyz":[0.0385631972812275903,0.037121990834463825,0.0202683328141040411],"hpluv":[47.6268315603120129,91.1519465603444,22.6962080128251955],"hsluv":[47.6268315603120129,53.1527363908354289,22.6962080128251955]},"#443333":{"lch":[23.1206934094119845,9.67437860897999613,12.1770506300626202],"luv":[23.1206934094119845,9.4567095438703852,2.04064844418642899],"rgb":[0.266666666666666663,0.2,0.2],"xyz":[0.0416509480136853308,0.0383570911274469378,0.0365304866717151844],"hpluv":[12.1770506300626202,53.0959690287213917,23.1206934094119845],"hsluv":[12.1770506300626202,12.4420312875371923,23.1206934094119845]},"#443344":{"lch":[23.7177668131648574,12.5269391023357528,307.715012949247694],"luv":[23.7177668131648574,7.66315882209806354,-9.90960141180911],"rgb":[0.266666666666666663,0.2,0.266666666666666663],"xyz":[0.0461089432579042113,0.0401402892251345109,0.0600092616246018229],"hpluv":[307.715012949247694,67.0209373905010608,23.7177668131648574],"hsluv":[307.715012949247694,23.1872031280306743,23.7177668131648574]},"#443355":{"lch":[24.4893027034144382,23.4497607107203301,284.299245815683662],"luv":[24.4893027034144382,5.79176863833153277,-22.7232632654309157],"rgb":[0.266666666666666663,0.2,0.333333333333333315],"xyz":[0.0520713572972662,0.0425252548408793438,0.0914113088985757383],"hpluv":[284.299245815683662,121.507006770462795,24.4893027034144382],"hsluv":[284.299245815683662,34.0172562824217479,24.4893027034144382]},"#443366":{"lch":[25.4301832846655458,35.8361728283181407,276.366541048647719],"luv":[25.4301832846655458,3.97382245046802396,-35.6151655634680964],"rgb":[0.266666666666666663,0.2,0.4],"xyz":[0.0596563530707743817,0.0455592531502826553,0.1313589533057197],"hpluv":[276.366541048647719,178.818092823782393,25.4301832846655458],"hsluv":[276.366541048647719,44.0521665839457555,25.4301832846655458]},"#443377":{"lch":[26.5300434901181958,48.2102429207408818,272.708376965990851],"luv":[26.5300434901181958,2.27805419202829862,-48.1563909733176416],"rgb":[0.266666666666666663,0.2,0.466666666666666674],"xyz":[0.0689703660909762872,0.0492848583583634717,0.180412755212117609],"hpluv":[272.708376965990851,230.590114205629249,26.5300434901181958],"hsluv":[272.708376965990851,52.8563285469964583,26.5300434901181958]},"#443388":{"lch":[27.7750487339787355,60.1896827108213373,270.691543734184165],"luv":[27.7750487339787355,0.726454682878815761,-60.1852986070773568],"rgb":[0.266666666666666663,0.2,0.533333333333333326],"xyz":[0.0801107831929201153,0.0537410251991410626,0.239085618615689777],"hpluv":[270.691543734184165,274.983446475144433,27.7750487339787355],"hsluv":[270.691543734184165,60.324174233719404,27.7750487339787355]},"#443399":{"lch":[29.1495234429961272,71.6961686956082218,269.452076389218803],"luv":[29.1495234429961272,-0.685625105343165342,-71.6928903298230438],"rgb":[0.266666666666666663,0.2,0.6],"xyz":[0.0931677473019928426,0.058963810842770227,0.307852296256807656],"hpluv":[269.452076389218803,312.107220431461315,29.1495234429961272],"hsluv":[269.452076389218803,66.5368599437509,29.1495234429961272]},"#4433aa":{"lch":[30.6372824460415245,82.7612763398458924,268.632918119842316],"luv":[30.6372824460415245,-1.97450330946598829,-82.7377193188284821],"rgb":[0.266666666666666663,0.2,0.66666666666666663],"xyz":[0.108225440267245371,0.0649868880288713285,0.387156145873806257],"hpluv":[268.632918119842316,342.78062465137026,30.6372824460415245],"hsluv":[268.632918119842316,71.6553387322885698,30.6372824460415245]},"#4433bb":{"lch":[32.2226022397772525,93.4505902198726375,268.062492493372758],"luv":[32.2226022397772525,-3.15951219941267691,-93.3971642776391633],"rgb":[0.266666666666666663,0.2,0.733333333333333282],"xyz":[0.125363032374582017,0.0718419248718060871,0.477414130972448],"hpluv":[268.062492493372758,368.010970109266054,32.2226022397772525],"hsluv":[268.062492493372758,75.8581190135042789,32.2226022397772525]},"#4433cc":{"lch":[33.8908458580626331,103.832026214070311,267.649236367220567],"luv":[33.8908458580626331,-4.25888397543315911,-103.744646006447894],"rgb":[0.266666666666666663,0.2,0.8],"xyz":[0.144655407818303772,0.0795588750492948887,0.579020641642718159],"hpluv":[267.649236367220567,388.765974213008576,33.8908458580626331],"hsluv":[267.649236367220567,79.3114034284002,33.8908458580626331]},"#4433dd":{"lch":[35.628800942302739,113.96424557581804,267.340372831489958],"luv":[35.628800942302739,-5.28823530427115518,-113.841485571087048],"rgb":[0.266666666666666663,0.2,0.866666666666666696],"xyz":[0.166173733368937315,0.0881662052695484227,0.692350489542724157],"hpluv":[267.340372831489958,405.888493424646128,35.628800942302739],"hsluv":[267.340372831489958,85.5677988674314,35.628800942302739]},"#4433ee":{"lch":[37.4248062251042484,123.894025620863303,267.103630337901393],"luv":[37.4248062251042484,-6.26032296204841732,-123.73575853791813],"rgb":[0.266666666666666663,0.2,0.933333333333333348],"xyz":[0.189985913635112053,0.0976910773760184536,0.81776130561124738],"hpluv":[267.103630337901393,420.078186698807599,37.4248062251042484],"hsluv":[267.103630337901393,92.6566888343209,37.4248062251042484]},"#4433ff":{"lch":[39.2687372084732473,133.657198385904053,266.918330051954797],"luv":[39.2687372084732473,-7.18532525912719411,-133.4639193988003],"rgb":[0.266666666666666663,0.2,1],"xyz":[0.216156962044943446,0.10815949673995115,0.955595493903029225],"hpluv":[266.918330051954797,431.901531941155895,39.2687372084732473],"hsluv":[266.918330051954797,99.99999999999946,39.2687372084732473]},"#bbbb00":{"lch":[73.6141498101152223,81.1522849996882485,85.8743202181747591],"luv":[73.6141498101152223,5.83845950082822274,80.9419900380996],"rgb":[0.733333333333333282,0.733333333333333282,0],"xyz":[0.382626051771664,0.461058251568279,0.0688379405602788],"hpluv":[85.8743202181747591,139.887458074797564,73.6141498101152223],"hsluv":[85.8743202181747591,100.000000000002331,73.6141498101152223]},"#bbbb11":{"lch":[73.6403599567658205,80.0195247391518478,85.8743202181747449],"luv":[73.6403599567658205,5.75696364516240155,79.8121651696532695],"rgb":[0.733333333333333282,0.733333333333333282,0.0666666666666666657],"xyz":[0.383637717271301082,0.461462917768133862,0.0741660455250344325],"hpluv":[85.8743202181747449,137.885751829634614,73.6403599567658205],"hsluv":[85.8743202181747449,98.5690595334933732,73.6403599567658205]},"#bbbb22":{"lch":[73.6889060807276763,77.9361940700347873,85.8743202181746597],"luv":[73.6889060807276763,5.60707948923862176,77.7342331648256817],"rgb":[0.733333333333333282,0.733333333333333282,0.133333333333333331],"xyz":[0.385513075409778139,0.462213061023524663,0.0840429317210136251],"hpluv":[85.8743202181746597,134.207383902194948,73.6889060807276763],"hsluv":[85.8743202181746597,95.9395400768792541,73.6889060807276763]},"#bbbb33":{"lch":[73.768722281637082,74.5519121144895536,85.8743202181745318],"luv":[73.768722281637082,5.36359906059884217,74.3587211095223],"rgb":[0.733333333333333282,0.733333333333333282,0.2],"xyz":[0.388600826142235845,0.46344816131650779,0.100305085578624775],"hpluv":[85.8743202181745318,128.24069174643796,73.768722281637082],"hsluv":[85.8743202181745318,91.6741883163470419,73.768722281637082]},"#bbbb44":{"lch":[73.8837085661944144,69.7637661309282464,85.8743202181743328],"luv":[73.8837085661944144,5.01911835485944824,69.5829829463408629],"rgb":[0.733333333333333282,0.733333333333333282,0.266666666666666663],"xyz":[0.39305882138645476,0.465231359414195356,0.123783860531511414],"hpluv":[85.8743202181743328,119.817583791868643,73.8837085661944144],"hsluv":[85.8743202181743328,85.652842249664161,73.8837085661944144]},"#bbbb55":{"lch":[74.0370403615741,63.5337415760462747,85.8743202181740628],"luv":[74.0370403615741,4.57090243520957262,63.3691026414263376],"rgb":[0.733333333333333282,0.733333333333333282,0.333333333333333315],"xyz":[0.399021235425816745,0.467616325029940216,0.155185907805485301],"hpluv":[85.8743202181740628,108.891682763750694,74.0370403615741],"hsluv":[85.8743202181740628,77.8423486010655239,74.0370403615741]},"#bbbb66":{"lch":[74.2313474843288361,55.8815023675101799,85.8743202181735512],"luv":[74.2313474843288361,4.02036601211528843,55.7366931561128212],"rgb":[0.733333333333333282,0.733333333333333282,0.4],"xyz":[0.40660623119932493,0.470650323339343535,0.195133552212629291],"hpluv":[85.8743202181735512,95.5256619678334857,74.2313474843288361],"hsluv":[85.8743202181735512,68.2875100330713138,74.2313474843288361]},"#bbbb77":{"lch":[74.468808451125966,46.8772880877030289,85.8743202181728549],"luv":[74.468808451125966,3.37256243628739805,46.7558120565865849],"rgb":[0.733333333333333282,0.733333333333333282,0.466666666666666674],"xyz":[0.415920244219526836,0.47437592854742433,0.2441873541190272],"hpluv":[85.8743202181728549,79.8780401793102328,74.468808451125966],"hsluv":[85.8743202181728549,57.1016453359253688,74.468808451125966]},"#bbbb88":{"lch":[74.7512063572608128,36.6333476151433146,85.874320218171647],"luv":[74.7512063572608128,2.63556739569020726,36.5384173438683746],"rgb":[0.733333333333333282,0.733333333333333282,0.533333333333333326],"xyz":[0.427060661321470636,0.478832095388201928,0.30286021752259934],"hpluv":[85.874320218171647,62.1867310089120195,74.7512063572608128],"hsluv":[85.874320218171647,44.4548295213588744,74.7512063572608128]},"#bbbb99":{"lch":[75.079965438194165,25.2938928616919938,85.8743202181691316],"luv":[75.079965438194165,1.81975614231989979,25.2283472245258693],"rgb":[0.733333333333333282,0.733333333333333282,0.6],"xyz":[0.440117625430543336,0.484054881031831086,0.371626895163717275],"hpluv":[85.8743202181691316,42.7494899193068392,75.079965438194165],"hsluv":[85.8743202181691316,30.559916169503893,75.079965438194165]},"#bbbbaa":{"lch":[75.4561775549407372,13.0242335847304886,85.8743202181613583],"luv":[75.4561775549407372,0.937021801842234714,12.9904830784884187],"rgb":[0.733333333333333282,0.733333333333333282,0.66666666666666663],"xyz":[0.455175318395795891,0.490077958217932208,0.450930744780715875],"hpluv":[85.8743202181613583,21.9026519543336242,75.4561775549407372],"hsluv":[85.8743202181613583,15.6573378741524305,75.4561775549407372]},"#bbbbbb":{"lch":[75.8806235332097856,3.97454725928322e-12,0],"luv":[75.8806235332097856,3.75098259432623098e-12,1.31421287976393485e-12],"rgb":[0.733333333333333282,0.733333333333333282,0.733333333333333282],"xyz":[0.472312910503132566,0.496932995060866967,0.541188729879357622],"hpluv":[0,6.64654731741433278e-12,75.8806235332097856],"hsluv":[0,6.51507609526145538e-12,75.8806235332097856]},"#bbbbcc":{"lch":[76.3537921403793,13.6026726964261613,265.874320218192793],"luv":[76.3537921403793,-0.97863730689855577,-13.5674232449512715],"rgb":[0.733333333333333282,0.733333333333333282,0.8],"xyz":[0.491605285946854265,0.504649945238355713,0.642795240549627778],"hpluv":[265.874320218192793,23.0577392955455913,76.3537921403793],"hsluv":[265.874320218192793,22.3559583930985184,76.3537921403793]},"#bbbbdd":{"lch":[76.875898300454,27.6153317552162676,265.874320218184891],"luv":[76.875898300454,-1.98677087225565296,-27.543770429115412],"rgb":[0.733333333333333282,0.733333333333333282,0.866666666666666696],"xyz":[0.513123611497487864,0.51325727545860933,0.756125088449633775],"hpluv":[265.874320218184891,48.094692651754464,76.875898300454],"hsluv":[265.874320218184891,46.4508399898830717,76.875898300454]},"#bbbbee":{"lch":[77.4469014383288794,41.8833893600305487,265.874320218182334],"luv":[77.4469014383288794,-3.01327895494808,-41.7748543291725554],"rgb":[0.733333333333333282,0.733333333333333282,0.933333333333333348],"xyz":[0.536935791763662573,0.522782147565079347,0.881535904518157],"hpluv":[265.874320218182334,75.1781465494946,77.4469014383288794],"hsluv":[265.874320218182334,72.306149300046286,77.4469014383288794]},"#bbbbff":{"lch":[78.0665243938900915,56.270213901735211,265.874320218181083],"luv":[78.0665243938900915,-4.04833166396953814,-56.1243973979724444],"rgb":[0.733333333333333282,0.733333333333333282,1],"xyz":[0.563106840173494,0.533250566929012,1.01937009280993873],"hpluv":[265.874320218181083,104.437018855576454,78.0665243938900915],"hsluv":[265.874320218181083,99.9999999999968,78.0665243938900915]},"#99cc00":{"lch":[76.0430979526319,91.0941172293808,106.263360497649074],"luv":[76.0430979526319,-25.5111694560196547,87.4489475453331124],"rgb":[0.6,0.8,0],"xyz":[0.347284960501106077,0.499573870357110428,0.0781308367092051204],"hpluv":[106.263360497649074,152.00919412554731,76.0430979526319],"hsluv":[106.263360497649074,100.000000000002444,76.0430979526319]},"#99cc11":{"lch":[76.0679435797449202,90.0431717383104342,106.457693210299354],"luv":[76.0679435797449202,-25.5098862277023812,86.3540299079582496],"rgb":[0.6,0.8,0.0666666666666666657],"xyz":[0.348296626000743181,0.499978536556965281,0.083458941673960757],"hpluv":[106.457693210299354,150.416675371578,76.0679435797449202],"hsluv":[106.457693210299354,98.6698238814781377,76.0679435797449202]},"#99cc22":{"lch":[76.1139653123302224,88.1120975577654235,106.827460928226145],"luv":[76.1139653123302224,-25.5076232207001254,84.3392132620406301],"rgb":[0.6,0.8,0.133333333333333331],"xyz":[0.350171984139220238,0.500728679812356137,0.0933358278699399496],"hpluv":[106.827460928226145,147.536178080277807,76.1139653123302224],"hsluv":[106.827460928226145,96.2239688839219554,76.1139653123302224]},"#99cc33":{"lch":[76.1896394090333615,84.9806694979027668,107.464683868975555],"luv":[76.1896394090333615,-25.5042190273125513,81.0632407452271195],"rgb":[0.6,0.8,0.2],"xyz":[0.353259734871677944,0.501963780105339263,0.109597981727551086],"hpluv":[107.464683868975555,142.843382477451314,76.1896394090333615],"hsluv":[107.464683868975555,92.2523981769505497,76.1896394090333615]},"#99cc44":{"lch":[76.2986765643697566,80.5641186971074461,108.452476349375274],"luv":[76.2986765643697566,-25.4999909675489818,76.4220366262018445],"rgb":[0.6,0.8,0.266666666666666663],"xyz":[0.357717730115896859,0.503746978203026829,0.133076756680437724],"hpluv":[108.452476349375274,136.177549938509202,76.2986765643697566],"hsluv":[108.452476349375274,86.6370393323296,76.2986765643697566]},"#99cc55":{"lch":[76.4441084930992645,74.8483308647658276,109.915235611542258],"luv":[76.4441084930992645,-25.4955548836031696,70.3722197633315858],"rgb":[0.6,0.8,0.333333333333333315],"xyz":[0.363680144155258844,0.506131943818771579,0.16447880395441164],"hpluv":[109.915235611542258,127.465568679298812,76.4441084930992645],"hsluv":[109.915235611542258,79.3378797119037245,76.4441084930992645]},"#99cc66":{"lch":[76.6284587708723279,67.8919791104198111,112.053749389120497],"luv":[76.6284587708723279,-25.4918238993559072,62.9244606001029396],"rgb":[0.6,0.8,0.4],"xyz":[0.37126513992876703,0.509165942128174898,0.204426448361555602],"hpluv":[112.053749389120497,116.726185086844026,76.6284587708723279],"hsluv":[112.053749389120497,70.3850130172815796,76.6284587708723279]},"#99cc77":{"lch":[76.8538330837355801,59.8379910057359723,115.212918879407354],"luv":[76.8538330837355801,-25.4899847789994141,54.1372869986012262],"rgb":[0.6,0.8,0.466666666666666674],"xyz":[0.380579152948968935,0.512891547336255749,0.253480250267953511],"hpluv":[115.212918879407354,104.093311342856381,76.8538330837355801],"hsluv":[115.212918879407354,59.8707914454029577,76.8538330837355801]},"#99cc88":{"lch":[77.1219726780439885,50.9458531819172649,120.024060615406185],"luv":[77.1219726780439885,-25.4914521322680621,44.1097021597488919],"rgb":[0.6,0.8,0.533333333333333326],"xyz":[0.391719570050912735,0.517347714177033291,0.31215311367152565],"hpluv":[120.024060615406185,89.8814395273866324,77.1219726780439885],"hsluv":[120.024060615406185,47.9401368886289845,77.1219726780439885]},"#99cc99":{"lch":[77.4342891130262103,41.681173098632776,127.715012949236964],"luv":[77.4342891130262103,-25.4978049096247332,32.9724450969124447],"rgb":[0.6,0.8,0.6],"xyz":[0.40477653415998549,0.522570499820662504,0.380919791312643585],"hpluv":[127.715012949236964,74.7648437658604337,77.4342891130262103],"hsluv":[127.715012949236964,34.7788947556027495,77.4342891130262103]},"#99ccaa":{"lch":[77.7918890721377352,32.9651751214879525,140.702563314804109],"luv":[77.7918890721377352,-25.5107121176450882,20.8783701002018844],"rgb":[0.6,0.8,0.66666666666666663],"xyz":[0.419834227125238,0.528593577006763571,0.460223640929642186],"hpluv":[140.702563314804109,60.2770963674260756,77.7918890721377352],"hsluv":[140.702563314804109,37.0803100068772622,77.7918890721377352]},"#99ccbb":{"lch":[78.1955939192693421,26.7536671513630395,162.617393192268167],"luv":[78.1955939192693421,-25.5318556358660231,7.9926875226808507],"rgb":[0.6,0.8,0.733333333333333282],"xyz":[0.436971819232574665,0.535448613849698329,0.550481626028283877],"hpluv":[162.617393192268167,50.006554278151107,78.1955939192693421],"hsluv":[162.617393192268167,39.5096284608221353,78.1955939192693421]},"#99cccc":{"lch":[78.6459566685868481,26.1512486118356264,192.177050630060364],"luv":[78.6459566685868481,-25.562857556775878,-5.51616873291790277],"rgb":[0.6,0.8,0.8],"xyz":[0.45626419467629642,0.543165564027187187,0.652088136698554],"hpluv":[192.177050630060364,50.1138147500145,78.6459566685868481],"hsluv":[192.177050630060364,42.0292910605185952,78.6459566685868481]},"#99ccdd":{"lch":[79.1432779300782,32.1756084020034763,217.269502822152816],"luv":[79.1432779300782,-25.6052179328205156,-19.4844191766612091],"rgb":[0.6,0.8,0.866666666666666696],"xyz":[0.477782520226929908,0.551772894247440693,0.76541798459856],"hpluv":[217.269502822152816,63.4104034428488532,79.1432779300782],"hsluv":[217.269502822152816,44.6030324020319142,79.1432779300782]},"#99ccee":{"lch":[79.6876217339600146,42.4043636674930298,232.761609201673764],"luv":[79.6876217339600146,-25.6602666815912279,-33.7591583407321],"rgb":[0.6,0.8,0.933333333333333348],"xyz":[0.501594700493104728,0.56129776635391071,0.890828800667083254],"hpluv":[232.761609201673764,86.2263034184575901,79.6876217339600146],"hsluv":[232.761609201673764,69.2463215394111842,79.6876217339600146]},"#99ccff":{"lch":[80.278831719152322,54.6396736698167231,241.908088190648726],"luv":[80.278831719152322,-25.7291311718118969,-48.2027566419988105],"rgb":[0.6,0.8,1],"xyz":[0.527765748902936,0.571766185717843434,1.02866298895886521],"hpluv":[241.908088190648726,115.039816302159181,80.278831719152322],"hsluv":[241.908088190648726,99.9999999999963762,80.278831719152322]},"#444400":{"lch":[27.7455139749470092,30.5866720374503593,85.8743202181747307],"luv":[27.7455139749470092,2.20054242411605072,30.5074108925390952],"rgb":[0.266666666666666663,0.266666666666666663,0],"xyz":[0.044508744126079483,0.0536323223451504599,0.00800753181435780864],"hpluv":[85.8743202181747307,139.887458074797593,27.7455139749470092],"hsluv":[85.8743202181747307,100.000000000002331,27.7455139749470092]},"#444411":{"lch":[27.8552611903384602,27.0161424908788135,85.8743202181744],"luv":[27.8552611903384602,1.9436625081132386,26.9461338811715763],"rgb":[0.266666666666666663,0.266666666666666663,0.0666666666666666657],"xyz":[0.0455204096257166,0.0540369885450053128,0.0133356367791134401],"hpluv":[85.8743202181744,123.070915058641674,27.8552611903384602],"hsluv":[85.8743202181744,87.9785198418851451,27.8552611903384602]},"#444422":{"lch":[28.0572627170229296,20.802612285424587,85.8743202181735086],"luv":[28.0572627170229296,1.49663326596887214,20.7487051828516122],"rgb":[0.266666666666666663,0.266666666666666663,0.133333333333333331],"xyz":[0.0473957677641936234,0.0547871318003961341,0.0232125229750926379],"hpluv":[85.8743202181735086,94.0831614915658463,28.0572627170229296],"hsluv":[85.8743202181735086,67.2563236092702539,28.0572627170229296]},"#444433":{"lch":[28.3858756417530103,11.5666907278610811,85.8743202181704],"luv":[28.3858756417530103,0.832159628943940688,11.5367172430437677],"rgb":[0.266666666666666663,0.266666666666666663,0.2],"xyz":[0.0504835184966513639,0.056022232093379247,0.0394746768327037811],"hpluv":[85.8743202181704,51.7066205750809758,28.3858756417530103],"hsluv":[85.8743202181704,36.9630139018145201,28.3858756417530103]},"#444444":{"lch":[28.8519023983998864,1.56211738287899238e-12,0],"luv":[28.8519023983998864,1.45745810878583046e-12,5.6216241338882039e-13],"rgb":[0.266666666666666663,0.266666666666666663,0.266666666666666663],"xyz":[0.0549415137408702445,0.05780543019106682,0.0629534517855904197],"hpluv":[0,6.87034486140541504e-12,28.8519023983998864],"hsluv":[0,1.96712204652458306e-12,28.8519023983998864]},"#444455":{"lch":[29.4604491554767947,12.996237632929807,265.874320218183527],"luv":[29.4604491554767947,-0.935007647451096213,-12.9625596743385874],"rgb":[0.266666666666666663,0.266666666666666663,0.333333333333333315],"xyz":[0.0609039277802322365,0.0601903958068116529,0.094355499059564335],"hpluv":[265.874320218183527,55.9780294653588157,29.4604491554767947],"hsluv":[265.874320218183527,10.903125265393685,29.4604491554767947]},"#444466":{"lch":[30.2117995944983235,26.5936989313503034,265.874320218180401],"luv":[30.2117995944983235,-1.9132700229980284,-26.52478502590359],"rgb":[0.266666666666666663,0.266666666666666663,0.4],"xyz":[0.0684889235537404079,0.0632243941162149714,0.134303143466708297],"hpluv":[265.874320218180401,111.69699235114156,30.2117995944983235],"hsluv":[265.874320218180401,21.7557908165695544,30.2117995944983235]},"#444477":{"lch":[31.1022350000615333,40.188693881548005,265.874320218179378],"luv":[31.1022350000615333,-2.89135495838767076,-40.084550420447286],"rgb":[0.266666666666666663,0.266666666666666663,0.466666666666666674],"xyz":[0.0778029365739423273,0.0669499993242957808,0.183356945373106206],"hpluv":[265.874320218179378,163.965176201048621,31.1022350000615333],"hsluv":[265.874320218179378,31.9363305989270607,31.1022350000615333]},"#444488":{"lch":[32.1249060438116132,53.4239352836437,265.874320218178923],"luv":[32.1249060438116132,-3.84355760936744639,-53.2854945186250859],"rgb":[0.266666666666666663,0.266666666666666663,0.533333333333333326],"xyz":[0.0889433536758861554,0.0714061661650733787,0.242029808776678373],"hpluv":[265.874320218178923,211.024721596932807,32.1249060438116132],"hsluv":[265.874320218178923,41.1023574005893479,32.1249060438116132]},"#444499":{"lch":[33.2707247827276404,66.1374776044503818,265.874320218178639],"luv":[33.2707247827276404,-4.75822688765494473,-65.9660914467787336],"rgb":[0.266666666666666663,0.266666666666666663,0.6],"xyz":[0.102000317784958869,0.0766289518087025362,0.31079648641779628],"hpluv":[265.874320218178639,252.246234683596128,33.2707247827276404],"hsluv":[265.874320218178639,50.2337582903708224,33.2707247827276404]},"#4444aa":{"lch":[34.5292085317775772,78.2936422443982707,265.874320218178468],"luv":[34.5292085317775772,-5.63279591471267516,-78.090755061511743],"rgb":[0.266666666666666663,0.266666666666666663,0.66666666666666663],"xyz":[0.117058010750211411,0.0826520289948036446,0.390100336034794881],"hpluv":[265.874320218178468,287.726060771882089,34.5292085317775772],"hsluv":[265.874320218178468,59.0260968416557645,34.5292085317775772]},"#4444bb":{"lch":[35.8892144652077647,89.9250819913669801,265.874320218178354],"luv":[35.8892144652077647,-6.46961387860876,-89.6920535355044],"rgb":[0.266666666666666663,0.266666666666666663,0.733333333333333282],"xyz":[0.134195602857548058,0.0895070658377384,0.480358321133436628],"hpluv":[265.874320218178354,317.948086985701252,35.8892144652077647],"hsluv":[265.874320218178354,67.4283717547759807,35.8892144652077647]},"#4444cc":{"lch":[37.3395287853000397,101.093816173965237,265.874320218178298],"luv":[37.3395287853000397,-7.27314272811459173,-100.831845482823283],"rgb":[0.266666666666666663,0.266666666666666663,0.8],"xyz":[0.153487978301269812,0.0972240160152272,0.581964831803706728],"hpluv":[265.874320218178298,343.55405942077391,37.3395287853000397],"hsluv":[265.874320218178298,75.5808548987534294,37.3395287853000397]},"#4444dd":{"lch":[38.8693012328948697,111.868746538356049,265.874320218178241],"luv":[38.8693012328948697,-8.04833956400084105,-111.578854100252741],"rgb":[0.266666666666666663,0.266666666666666663,0.866666666666666696],"xyz":[0.175006303851903355,0.105831346235480739,0.695294679703712726],"hpluv":[265.874320218178241,365.208910634554,38.8693012328948697],"hsluv":[265.874320218178241,83.6313726076760702,38.8693012328948697]},"#4444ee":{"lch":[40.4683363226646691,122.314460404417545,265.874320218178127],"luv":[40.4683363226646691,-8.799851087852959,-121.997499338533331],"rgb":[0.266666666666666663,0.266666666666666663,0.933333333333333348],"xyz":[0.198818484118078065,0.115356218341950756,0.820705495772236],"hpluv":[265.874320218178127,383.532154053589807,40.4683363226646691],"hsluv":[265.874320218178127,91.7249319236633625,40.4683363226646691]},"#4444ff":{"lch":[42.1272645151277203,132.4867415013303,265.874320218178127],"luv":[42.1272645151277203,-9.53169063144130568,-132.143420370999962],"rgb":[0.266666666666666663,0.266666666666666663,1],"xyz":[0.224989532527909486,0.12582463770588348,0.958539684064017794],"hpluv":[265.874320218178127,399.069452944254863,42.1272645151277203],"hsluv":[265.874320218178127,99.9999999999994458,42.1272645151277203]},"#bbcc00":{"lch":[78.3160688649495711,87.6272661942945916,93.3039767998847651],"luv":[78.3160688649495711,-5.05025027162958828,87.4816137990130471],"rgb":[0.733333333333333282,0.8,0],"xyz":[0.420849795081280953,0.537505738187513904,0.081579188330150737],"hpluv":[93.3039767998847651,164.876849582678972,78.3160688649495711],"hsluv":[93.3039767998847651,100.000000000002302,78.3160688649495711]},"#bbcc11":{"lch":[78.3397318378619332,86.5943586896397193,93.3754549086192],"luv":[78.3397318378619332,-5.09856582429126703,86.4441298377475249],"rgb":[0.733333333333333282,0.8,0.0666666666666666657],"xyz":[0.421861460580918057,0.537910404387368812,0.0869072932949063737],"hpluv":[93.3754549086192,163.146061131239662,78.3397318378619332],"hsluv":[93.3754549086192,98.7690619278293,78.3397318378619332]},"#bbcc22":{"lch":[78.3835653101130134,84.6929692802742125,93.5116381573829329],"luv":[78.3835653101130134,-5.18755307791811582,84.5339478468458481],"rgb":[0.733333333333333282,0.8,0.133333333333333331],"xyz":[0.423736818719395114,0.538660547642759613,0.0967841794908855663],"hpluv":[93.5116381573829329,159.95035726483485,78.3835653101130134],"hsluv":[93.5116381573829329,96.5043106774720343,78.3835653101130134]},"#bbcc33":{"lch":[78.4556479267243,81.5996211754986405,93.7468972468941644],"luv":[78.4556479267243,-5.33246113691784,81.4251990123951],"rgb":[0.733333333333333282,0.8,0.2],"xyz":[0.42682456945185282,0.53989564793574274,0.113046333348496703],"hpluv":[93.7468972468941644,154.72407311273281,78.4556479267243],"hsluv":[93.7468972468941644,92.8230308779070157,78.4556479267243]},"#bbcc44":{"lch":[78.5595248117047475,77.2136355312914873,94.1131309849175],"luv":[78.5595248117047475,-5.53822791342104281,77.0147618547127877],"rgb":[0.733333333333333282,0.8,0.266666666666666663],"xyz":[0.431282564696071735,0.541678846033430306,0.136525108301383341],"hpluv":[94.1131309849175,147.254264694427633,78.5595248117047475],"hsluv":[94.1131309849175,87.6101015600037556,78.5595248117047475]},"#bbcc55":{"lch":[78.6981007967589079,71.4912273296626921,94.6593076474989488],"luv":[78.6981007967589079,-5.80727962831129307,71.2549723768110823],"rgb":[0.733333333333333282,0.8,0.333333333333333315],"xyz":[0.43724497873543372,0.544063811649175,0.167927155575357256],"hpluv":[94.6593076474989488,137.398731222980217,78.6981007967589079],"hsluv":[94.6593076474989488,80.8199795518833639,78.6981007967589079]},"#bbcc66":{"lch":[78.8738041161037273,64.440755538040392,95.4673459440295176],"luv":[78.8738041161037273,-6.13981465986491681,64.1475927081912403],"rgb":[0.733333333333333282,0.8,0.4],"xyz":[0.444829974508941905,0.547097809958578374,0.207874799982501218],"hpluv":[95.4673459440295176,125.075317361724217,78.8738041161037273],"hsluv":[95.4673459440295176,72.4696955468646848,78.8738041161037273]},"#bbcc77":{"lch":[79.0886730863018244,56.1202023011108153,96.6860819525870454],"luv":[79.0886730863018244,-6.5340457953894715,55.7385266387743386],"rgb":[0.733333333333333282,0.8,0.466666666666666674],"xyz":[0.454143987529143811,0.550823415166659225,0.2569286018888991],"hpluv":[96.6860819525870454,110.256785788709905,79.0886730863018244],"hsluv":[96.6860819525870454,62.6323703341884,79.0886730863018244]},"#bbcc88":{"lch":[79.3444074564468451,46.6379090458556931,98.6154841820407],"luv":[79.3444074564468451,-6.9864776714612713,46.1116437563841473],"rgb":[0.733333333333333282,0.8,0.533333333333333326],"xyz":[0.465284404631087611,0.555279582007436767,0.315601465292471295],"hpluv":[98.6154841820407,92.9740665461038702,79.3444074564468451],"hsluv":[98.6154841820407,51.4293340198482483,79.3444074564468451]},"#bbcc99":{"lch":[79.6424016540563,36.1659853952486898,101.956116252097843],"luv":[79.6424016540563,-7.49223418159530397,35.3814206410296137],"rgb":[0.733333333333333282,0.8,0.6],"xyz":[0.478341368740160311,0.560502367651066,0.38436814293358923],"hpluv":[101.956116252097843,73.3480812445522616,79.6424016540563],"hsluv":[101.956116252097843,39.0205672484538439,79.6424016540563]},"#bbccaa":{"lch":[79.9837682606211899,25.01387761080953,108.762036830266098],"luv":[79.9837682606211899,-8.04542335958215382,23.6847046866463593],"rgb":[0.733333333333333282,0.8,0.66666666666666663],"xyz":[0.493399061705412867,0.566525444837167,0.463671992550587775],"hpluv":[108.762036830266098,51.7527419020047645,79.9837682606211899],"hsluv":[108.762036830266098,25.5939208298632828,79.9837682606211899]},"#bbccbb":{"lch":[80.3693561861161356,14.1229851396422195,127.715012949226079],"luv":[80.3693561861161356,-8.63951499109438892,11.1721748094634776],"rgb":[0.733333333333333282,0.8,0.733333333333333282],"xyz":[0.510536653812749486,0.573380481680101806,0.553929977649229577],"hpluv":[127.715012949226079,29.8960175179438359,80.3693561861161356],"hsluv":[127.715012949226079,11.3539027840963094,80.3693561861161356]},"#bbcccc":{"lch":[80.7997661027856537,9.48102181692548207,192.177050630058517],"luv":[80.7997661027856537,-9.26770319062559622,-1.99986306118322021],"rgb":[0.733333333333333282,0.8,0.8],"xyz":[0.52982902925647124,0.581097431857590663,0.655536488319499733],"hpluv":[192.177050630058517,20.5979746439306091,80.7997661027856537],"hsluv":[192.177050630058517,14.8313634310922779,80.7997661027856537]},"#bbccdd":{"lch":[81.2753646562375138,18.5534915910332536,237.666646406054781],"luv":[81.2753646562375138,-9.9232294288842251,-15.6767843616051454],"rgb":[0.733333333333333282,0.8,0.866666666666666696],"xyz":[0.551347354807104839,0.589704762077844169,0.76886633621950573],"hpluv":[237.666646406054781,41.5059211719903089,81.2753646562375138],"hsluv":[237.666646406054781,34.6395739712995834,81.2753646562375138]},"#bbccee":{"lch":[81.7962983545147466,31.5457627715974915,250.366116177600304],"luv":[81.7962983545147466,-10.5996485000078611,-29.7116576534899401],"rgb":[0.733333333333333282,0.8,0.933333333333333348],"xyz":[0.575159535073279549,0.599229634184314186,0.894277152288029],"hpluv":[250.366116177600304,72.9233806917818725,81.7962983545147466],"hsluv":[250.366116177600304,65.9765826509477478,81.7962983545147466]},"#bbccff":{"lch":[82.3625076456434329,45.3963265868234203,255.598148289110497],"luv":[82.3625076456434329,-11.2910283768039683,-43.9697526234994669],"rgb":[0.733333333333333282,0.8,1],"xyz":[0.601330583483111,0.60969805354824691,1.0321113405798108],"hpluv":[255.598148289110497,108.847942718229262,82.3625076456434329],"hsluv":[255.598148289110497,99.9999999999958789,82.3625076456434329]},"#99dd00":{"lch":[81.0072374435841738,100.100388992767378,110.059278565234735],"luv":[81.0072374435841738,-34.3336498242400623,94.028125400062109],"rgb":[0.6,0.866666666666666696,0],"xyz":[0.389918951048281226,0.584841851451462,0.0923421668915964389],"hpluv":[110.059278565234735,220.251619684458433,81.0072374435841738],"hsluv":[110.059278565234735,100.000000000002245,81.0072374435841738]},"#99dd11":{"lch":[81.0296061686003,99.1554895677318626,110.248463134872608],"luv":[81.0296061686003,-34.3169109383134483,93.0277417498051733],"rgb":[0.6,0.866666666666666696,0.0666666666666666657],"xyz":[0.39093061654791833,0.585246517651316855,0.0976702718563520755],"hpluv":[110.248463134872608,218.472914234601802,81.0296061686003],"hsluv":[110.248463134872608,98.8616036668283,81.0296061686003]},"#99dd22":{"lch":[81.0710445633976,97.4178442494470431,110.606606003803336],"luv":[81.0710445633976,-34.2861684396920552,91.184949591117217],"rgb":[0.6,0.866666666666666696,0.133333333333333331],"xyz":[0.392805974686395387,0.585996660906707656,0.107547158052331268],"hpluv":[110.606606003803336,215.192819254761019,81.0710445633976],"hsluv":[110.606606003803336,96.7659338960775131,81.0710445633976]},"#99dd33":{"lch":[81.1391953168863154,94.5961335984436857,111.218234049095599],"luv":[81.1391953168863154,-34.2363517117206513,88.1833358024404106],"rgb":[0.6,0.866666666666666696,0.2],"xyz":[0.395893725418853093,0.587231761199690783,0.123809311909942404],"hpluv":[111.218234049095599,209.840835623165077,81.1391953168863154],"hsluv":[111.218234049095599,93.3562182204636599,81.1391953168863154]},"#99dd44":{"lch":[81.2374208116197565,90.6080011845065343,112.152709421166279],"luv":[81.2374208116197565,-34.1661449288095653,83.9195115533635487],"rgb":[0.6,0.866666666666666696,0.266666666666666663],"xyz":[0.400351720663072,0.589014959297378349,0.147288086862829043],"hpluv":[112.152709421166279,202.22119953609328,81.2374208116197565],"hsluv":[112.152709421166279,88.5208972681928827,81.2374208116197565]},"#99dd55":{"lch":[81.3684846041416421,85.4315699411036604,113.506988965296216],"luv":[81.3684846041416421,-34.0753153837539244,78.3417259453695607],"rgb":[0.6,0.866666666666666696,0.333333333333333315],"xyz":[0.406314134702434,0.591399924913123098,0.178690134136802958],"hpluv":[113.506988965296216,192.231211336261111,81.3684846041416421],"hsluv":[113.506988965296216,82.2103932307851579,81.3684846041416421]},"#99dd66":{"lch":[81.5347071887187695,79.1067404569191837,115.426438711198742],"luv":[81.5347071887187695,-33.9646313013793,71.4442454385217758],"rgb":[0.6,0.866666666666666696,0.4],"xyz":[0.413899130475942179,0.594433923222526417,0.21863777854394692],"hpluv":[115.426438711198742,179.864586291563711,81.5347071887187695],"hsluv":[115.426438711198742,74.4308834765056,81.5347071887187695]},"#99dd77":{"lch":[81.7380487099571,71.7428264562351217,118.139890255285593],"luv":[81.7380487099571,-33.8357763954940651,63.2627329764024324],"rgb":[0.6,0.866666666666666696,0.466666666666666674],"xyz":[0.423213143496144084,0.598159528430607268,0.267691580450344802],"hpluv":[118.139890255285593,165.232292085670224,81.7380487099571],"hsluv":[118.139890255285593,65.2389156719347,81.7380487099571]},"#99dd88":{"lch":[81.9801580086414248,63.5371271244577898,122.023063704989269],"luv":[81.9801580086414248,-33.6912346765093815,53.8689820694792942],"rgb":[0.6,0.866666666666666696,0.533333333333333326],"xyz":[0.434353560598087884,0.60261569527138481,0.326364443853917],"hpluv":[122.023063704989269,148.614644251947254,81.9801580086414248],"hsluv":[122.023063704989269,54.7350081565161943,81.9801580086414248]},"#99dd99":{"lch":[82.2624042681600827,54.8181455895933,127.715012949238044],"luv":[82.2624042681600827,-33.5341421039979721,43.3646215160552],"rgb":[0.6,0.866666666666666696,0.6],"xyz":[0.447410524707160584,0.607838480915014,0.395131121495034932],"hpluv":[127.715012949238044,130.58293025992694,82.2624042681600827],"hsluv":[127.715012949238044,43.0558433261763724,82.2624042681600827]},"#99ddaa":{"lch":[82.5858991321833855,46.1452119261310898,136.311935434488049],"luv":[82.5858991321833855,-33.3681126370237138,31.8739649675161907],"rgb":[0.6,0.866666666666666696,0.66666666666666663],"xyz":[0.46246821767241314,0.61386155810111509,0.474434971112033477],"hpluv":[136.311935434488049,112.281381223378744,82.5858991321833855],"hsluv":[136.311935434488049,44.8180878493830122,82.5858991321833855]},"#99ddbb":{"lch":[82.9515135213076,38.5190468703316,149.523212457301526],"luv":[82.9515135213076,-33.1970516149390349,19.536446347119437],"rgb":[0.6,0.866666666666666696,0.733333333333333282],"xyz":[0.479605809779749814,0.620716594944049849,0.564692956210675279],"hpluv":[149.523212457301526,96.0401150933983416,82.9515135213076],"hsluv":[149.523212457301526,46.6955526922259807,82.9515135213076]},"#99ddcc":{"lch":[83.3598915829196585,33.6584009809739158,168.866706644517421],"luv":[83.3598915829196585,-33.0249710093605202,6.49917274942921],"rgb":[0.6,0.866666666666666696,0.8],"xyz":[0.498898185223471513,0.628433545121538706,0.666299466880945435],"hpluv":[168.866706644517421,86.2854242091523,83.3598915829196585],"hsluv":[168.866706644517421,48.6618587245334879,83.3598915829196585]},"#99dddd":{"lch":[83.811463234187741,33.6120761253887,192.17705063006062],"luv":[83.811463234187741,-32.85581988586,-7.08990557672323529],"rgb":[0.6,0.866666666666666696,0.866666666666666696],"xyz":[0.520416510774105112,0.637040875341792212,0.779629314780951432],"hpluv":[192.17705063006062,88.9162454401141,83.811463234187741],"hsluv":[192.17705063006062,50.6906605199231777,83.811463234187741]},"#99ddee":{"lch":[84.3064561843391402,38.9043785470910208,212.822778279485817],"luv":[84.3064561843391402,-32.6933403312743565,-21.0878203738277712],"rgb":[0.6,0.866666666666666696,0.933333333333333348],"xyz":[0.544228691040279822,0.646565747448262229,0.905040130849474656],"hpluv":[212.822778279485817,106.615167592423816,84.3064561843391402],"hsluv":[212.822778279485817,60.6575363344623781,84.3064561843391402]},"#99ddff":{"lch":[84.8449079615810575,48.055447414973429,227.378328123916845],"luv":[84.8449079615810575,-32.5409551013358396,-35.3611689193969099],"rgb":[0.6,0.866666666666666696,1],"xyz":[0.570399739450111243,0.657034166812195,1.04287431914125639],"hpluv":[227.378328123916845,137.001856984753886,84.8449079615810575],"hsluv":[227.378328123916845,99.999999999994813,84.8449079615810575]},"#445500":{"lch":[33.4053570608210535,38.7644311760376397,101.469350612776353],"luv":[33.4053570608210535,-7.7080633936099785,37.9903525006263791],"rgb":[0.266666666666666663,0.333333333333333315,0],"xyz":[0.0563220008404254485,0.0772588357738427239,0.0119452840524730177],"hpluv":[101.469350612776353,147.25044771073371,33.4053570608210535],"hsluv":[101.469350612776353,100.000000000002245,33.4053570608210535]},"#445511":{"lch":[33.4914653280992525,35.8039831739898275,102.524785035338],"luv":[33.4914653280992525,-7.76452054412734,34.9519303021045076],"rgb":[0.266666666666666663,0.333333333333333315,0.0666666666666666657],"xyz":[0.0573336663400625668,0.0776635019736975768,0.0172733890172286492],"hpluv":[102.524785035338,135.655223597469387,33.4914653280992525],"hsluv":[102.524785035338,91.5452633494882093,33.4914653280992525]},"#445522":{"lch":[33.6502992474903806,30.5965852313305291,104.897478349629381],"luv":[33.6502992474903806,-7.86608410210478493,29.5681543001366229],"rgb":[0.266666666666666663,0.333333333333333315,0.133333333333333331],"xyz":[0.0592090244785395889,0.0784136452290883912,0.0271502752132078452],"hpluv":[104.897478349629381,115.378092601865731,33.6502992474903806],"hsluv":[104.897478349629381,76.6558497494370243,33.6502992474903806]},"#445533":{"lch":[33.9096245159150911,22.79863905315759,110.61032755328398],"luv":[33.9096245159150911,-8.02535730567797501,21.3394372651287],"rgb":[0.266666666666666663,0.333333333333333315,0.2],"xyz":[0.0622967752109973294,0.0796487455220715,0.0434124290708189919],"hpluv":[110.61032755328398,85.3149751467856419,33.9096245159150911],"hsluv":[110.61032755328398,54.1403397653178331,33.9096245159150911]},"#445544":{"lch":[34.2793424585633204,13.4702363502677187,127.715012949235046],"luv":[34.2793424585633204,-8.24020614134090401,10.6558092175245633],"rgb":[0.266666666666666663,0.333333333333333315,0.266666666666666663],"xyz":[0.0667547704552162,0.081431943619759084,0.0668912040237056305],"hpluv":[127.715012949235046,49.8634197051089814,34.2793424585633204],"hsluv":[127.715012949235046,25.3893680776039865,34.2793424585633204]},"#445555":{"lch":[34.7654846399243738,8.70030094248716424,192.177050630060222],"luv":[34.7654846399243738,-8.50454817645784544,-1.83518304377262664],"rgb":[0.266666666666666663,0.333333333333333315,0.333333333333333315],"xyz":[0.0727171844945782,0.0838169092355039169,0.098293251297679532],"hpluv":[192.177050630060222,31.7559649298661668,34.7654846399243738],"hsluv":[192.177050630060222,31.6316627668381969,34.7654846399243738]},"#445566":{"lch":[35.3707740335649916,17.7582093223154978,240.254504050727519],"luv":[35.3707740335649916,-8.81070452432763318,-15.4183489427423961],"rgb":[0.266666666666666663,0.333333333333333315,0.4],"xyz":[0.0803021802680863733,0.0868509075449072354,0.138240895704823508],"hpluv":[240.254504050727519,63.7079944588343352,35.3707740335649916],"hsluv":[240.254504050727519,38.2083413049732812,35.3707740335649916]},"#445577":{"lch":[36.0950574442792913,30.8488081821149329,252.743594747999822],"luv":[36.0950574442792913,-9.15124765847803623,-29.4602042177260124],"rgb":[0.266666666666666663,0.333333333333333315,0.466666666666666674],"xyz":[0.0896161932882882928,0.0905765127529880448,0.187294697611221417],"hpluv":[252.743594747999822,108.450105614435046,36.0950574442792913],"hsluv":[252.743594747999822,44.7362415879762878,36.0950574442792913]},"#445588":{"lch":[36.935739068143242,44.5159055243500319,257.651563208142],"luv":[36.935739068143242,-9.5200062368872409,-43.4860359874579245],"rgb":[0.266666666666666663,0.333333333333333315,0.533333333333333326],"xyz":[0.100756610390232121,0.0950326795937656427,0.245967561014793584],"hpluv":[257.651563208142,152.935302017774575,36.935739068143242],"hsluv":[257.651563208142,50.9359550606187952,36.935739068143242]},"#445599":{"lch":[37.8882410462664865,58.0440865604997711,260.167284745959819],"luv":[37.8882410462664865,-9.91231220062277885,-57.1914508600732674],"rgb":[0.266666666666666663,0.333333333333333315,0.6],"xyz":[0.113813574499304834,0.1002554652373948,0.314734238655911491],"hpluv":[260.167284745959819,194.398479571090235,37.8882410462664865],"hsluv":[260.167284745959819,56.6374271499956805,37.8882410462664865]},"#4455aa":{"lch":[38.9464770503006932,71.1678309986128141,261.658277796723496],"luv":[38.9464770503006932,-10.3247958657557941,-70.4149043837850144],"rgb":[0.266666666666666663,0.333333333333333315,0.66666666666666663],"xyz":[0.128871267464557376,0.106278542423495909,0.394038088272910092],"hpluv":[261.658277796723496,231.875507383352442,38.9464770503006932],"hsluv":[261.658277796723496,61.7617646139185652,38.9464770503006932]},"#4455bb":{"lch":[40.1033117689144,83.7900384834958,262.625350778636744],"luv":[40.1033117689144,-10.7550224317659584,-83.0969316013408417],"rgb":[0.266666666666666663,0.333333333333333315,0.733333333333333282],"xyz":[0.146008859571894023,0.113133579266430667,0.484296073371551838],"hpluv":[262.625350778636744,265.125486140416797,40.1033117689144],"hsluv":[262.625350778636744,66.2950009745661,40.1033117689144]},"#4455cc":{"lch":[41.3509797710146,95.8983760986006075,263.292411358069444],"luv":[41.3509797710146,-11.2011488171863753,-95.24196975873555],"rgb":[0.266666666666666663,0.333333333333333315,0.8],"xyz":[0.165301235015615777,0.120850529443919469,0.585902584041821939],"hpluv":[263.292411358069444,294.28272942652967,41.3509797710146],"hsluv":[263.292411358069444,71.9850161095278906,41.3509797710146]},"#4455dd":{"lch":[42.6814446156526657,107.523441304607104,263.773623462042394],"luv":[42.6814446156526657,-11.661670844638417,-106.88917561239117],"rgb":[0.266666666666666663,0.333333333333333315,0.866666666666666696],"xyz":[0.186819560566249321,0.129457859664173,0.699232431941827937],"hpluv":[263.773623462042394,319.67109728436958,42.6814446156526657],"hsluv":[263.773623462042394,81.2732363837730247,42.6814446156526657]},"#4455ee":{"lch":[44.0866885883675,118.714724855013472,264.132858108854521],"luv":[44.0866885883675,-12.1352655753704255,-118.092850024109339],"rgb":[0.266666666666666663,0.333333333333333315,0.933333333333333348],"xyz":[0.21063174083242403,0.13898273177064302,0.82464324801035116],"hpluv":[264.132858108854521,341.693279595385377,44.0866885883675],"hsluv":[264.132858108854521,90.5684283810677186,44.0866885883675]},"#4455ff":{"lch":[45.5589321196955765,129.526958246416882,264.408404412275218],"luv":[45.5589321196955765,-12.6207071057408875,-128.910630534181024],"rgb":[0.266666666666666663,0.333333333333333315,1],"xyz":[0.236802789242255451,0.149451151134575744,0.962477436302133],"hpluv":[264.408404412275218,360.766296003954039,45.5589321196955765],"hsluv":[264.408404412275218,99.9999999999992752,45.5589321196955765]},"#bbdd00":{"lch":[83.0607051195576673,95.2176030862527796,99.223939245402],"luv":[83.0607051195576673,-15.2627740644400269,93.9863802119702427],"rgb":[0.733333333333333282,0.866666666666666696,0],"xyz":[0.463483785628456102,0.622773719281865423,0.0957905185125420555],"hpluv":[99.223939245402,239.164338292747971,83.0607051195576673],"hsluv":[99.223939245402,100.00000000000216,83.0607051195576673]},"#bbdd11":{"lch":[83.082156377860457,94.2793845093074765,99.3314951275217481],"luv":[83.082156377860457,-15.2870500651298524,93.0317604034238457],"rgb":[0.733333333333333282,0.866666666666666696,0.0666666666666666657],"xyz":[0.464495451128093206,0.623178385481720332,0.101118623477297692],"hpluv":[99.3314951275217481,237.15213625798873,83.082156377860457],"hsluv":[99.3314951275217481,98.93507934353417,83.082156377860457]},"#bbdd22":{"lch":[83.1218967422411765,92.5513012339483794,99.5354402549794486],"luv":[83.1218967422411765,-15.3318301742674485,91.2725497814347],"rgb":[0.733333333333333282,0.866666666666666696,0.133333333333333331],"xyz":[0.466370809266570263,0.623928528737111132,0.110995509673276885],"hpluv":[99.5354402549794486,233.433860498438293,83.1218967422411765],"hsluv":[99.5354402549794486,96.9737920722735538,83.1218967422411765]},"#bbdd33":{"lch":[83.1872593514570298,89.7372330308786,99.8847694763800718],"luv":[83.1872593514570298,-15.4049421957575614,88.4050832700449263],"rgb":[0.733333333333333282,0.866666666666666696,0.2],"xyz":[0.469458559999027969,0.625163629030094259,0.127257663530888021],"hpluv":[99.8847694763800718,227.34486653748678,83.1872593514570298],"hsluv":[99.8847694763800718,93.7802848880547373,83.1872593514570298]},"#bbdd44":{"lch":[83.2814760883348697,85.7419087717973,100.421139587323779],"luv":[83.2814760883348697,-15.5091702542505097,84.3275788686944452],"rgb":[0.733333333333333282,0.866666666666666696,0.266666666666666663],"xyz":[0.473916555243246884,0.626946827127781825,0.15073643848377466],"hpluv":[100.421139587323779,218.62539011377612,83.2814760883348697],"hsluv":[100.421139587323779,89.2463889616074511,83.2814760883348697]},"#bbdd55":{"lch":[83.4072088624658,80.5207963453540572,101.204557559233223],"luv":[83.4072088624658,-15.6461875861262687,78.9860459708531835],"rgb":[0.733333333333333282,0.866666666666666696,0.333333333333333315],"xyz":[0.479878969282608869,0.629331792743526575,0.182138485757748575],"hpluv":[101.204557559233223,207.093501481883948,83.4072088624658],"hsluv":[101.204557559233223,83.3201121340644448,83.4072088624658]},"#bbdd66":{"lch":[83.5666996797624364,74.0772937371066149,102.328486133362119],"luv":[83.5666996797624364,-15.816696660053216,72.3690372616455164],"rgb":[0.733333333333333282,0.866666666666666696,0.4],"xyz":[0.487463965056117055,0.632365791052929893,0.222086130164892537],"hpluv":[102.328486133362119,192.635686460640301,83.5666996797624364],"hsluv":[102.328486133362119,75.9999631534792854,83.5666996797624364]},"#bbdd77":{"lch":[83.7618505003220122,66.4632811318093388,103.948126608074304],"luv":[83.7618505003220122,-16.0205304866066705,64.5035684418593149],"rgb":[0.733333333333333282,0.866666666666666696,0.466666666666666674],"xyz":[0.49677797807631896,0.636091396261010744,0.271139932071290446],"hpluv":[103.948126608074304,175.207590447676779,83.7618505003220122],"hsluv":[103.948126608074304,67.3303268013154,83.7618505003220122]},"#bbdd88":{"lch":[83.9942706402616,57.7845188457632091,106.339844930601203],"luv":[83.9942706402616,-16.2567564016803381,55.4505950331715454],"rgb":[0.733333333333333282,0.866666666666666696,0.533333333333333326],"xyz":[0.50791839517826276,0.640547563101788286,0.329812795474862641],"hpluv":[106.339844930601203,154.850612540446264,83.9942706402616],"hsluv":[106.339844930601203,57.39610210967858,83.9942706402616]},"#bbdd99":{"lch":[84.2653073070245711,48.2191913160874819,110.040291826115165],"luv":[84.2653073070245711,-16.5237946272095257,45.2996095159246153],"rgb":[0.733333333333333282,0.866666666666666696,0.6],"xyz":[0.520975359287335515,0.6457703487454175,0.39857947311598052],"hpluv":[110.040291826115165,131.749772406416298,84.2653073070245711],"hsluv":[110.040291826115165,46.3161497548768466,84.2653073070245711]},"#bbddaa":{"lch":[84.5760668100806328,38.0784660246866622,116.212889721452115],"luv":[84.5760668100806328,-16.8195514991441222,34.1624393473425059],"rgb":[0.733333333333333282,0.866666666666666696,0.66666666666666663],"xyz":[0.536033052252588,0.651793425931518566,0.477883322732979121],"hpluv":[116.212889721452115,106.421399158629868,84.5760668100806328],"hsluv":[116.212889721452115,34.2356923349747433,84.5760668100806328]},"#bbddbb":{"lch":[84.9274305013996553,28.0212505683590543,127.715012949233824],"luv":[84.9274305013996553,-17.1415612181778,22.1665821095230058],"rgb":[0.733333333333333282,0.866666666666666696,0.733333333333333282],"xyz":[0.55317064435992469,0.658648462774453325,0.568141307831620868],"hpluv":[127.715012949233824,80.3800713533813109,84.9274305013996553],"hsluv":[127.715012949233824,21.3181094477761164,84.9274305013996553]},"#bbddcc":{"lch":[85.3200677868051,19.876471170849122,151.617083508593169],"luv":[85.3200677868051,-17.4871274790593141,9.44851727715650291],"rgb":[0.733333333333333282,0.866666666666666696,0.8],"xyz":[0.572463019803646445,0.666365412951942182,0.669747818501891],"hpluv":[151.617083508593169,58.7374284962306703,85.3200677868051],"hsluv":[151.617083508593169,24.0698773292010699,85.3200677868051]},"#bbdddd":{"lch":[85.7544476215988,18.2643967282432129,192.177050630059739],"luv":[85.7544476215988,-17.8534562098583329,-3.85256916996079246],"rgb":[0.733333333333333282,0.866666666666666696,0.866666666666666696],"xyz":[0.593981345354279933,0.674972743172195688,0.783077666401897],"hpluv":[192.177050630059739,55.8245506661868234,85.7544476215988],"hsluv":[192.177050630059739,26.9205986284609722,85.7544476215988]},"#bbddee":{"lch":[86.2308493598319359,25.3453434934362818,223.980933900351914],"luv":[86.2308493598319359,-18.2377721186398958,-17.6002870700688909],"rgb":[0.733333333333333282,0.866666666666666696,0.933333333333333348],"xyz":[0.617793525620454753,0.684497615278665705,0.908488482470420244],"hpluv":[223.980933900351914,80.4705047412629142,86.2308493598319359],"hsluv":[223.980933900351914,55.5800524236117397,86.2308493598319359]},"#bbddff":{"lch":[86.7493734858622076,36.743147173338194,239.520163688183],"luv":[86.7493734858622076,-18.6374141011141354,-31.6655279416778761],"rgb":[0.733333333333333282,0.866666666666666696,1],"xyz":[0.643964574030286063,0.694966034642598429,1.0463226707622022],"hpluv":[239.520163688183,121.752323062157373,86.7493734858622076],"hsluv":[239.520163688183,99.9999999999938325,86.7493734858622076]},"#99ee00":{"lch":[85.9664003491010646,109.204546268980621,112.979852313128234],"luv":[85.9664003491010646,-42.6342645949387915,100.538313136150634],"rgb":[0.6,0.933333333333333348,0],"xyz":[0.437097727388796042,0.679199404132492912,0.108068425671767623],"hpluv":[112.979852313128234,339.428934639809256,85.9664003491010646],"hsluv":[112.979852313128234,100.000000000002444,85.9664003491010646]},"#99ee11":{"lch":[85.9866468155118326,108.350123359521945,113.156064955940181],"luv":[85.9866468155118326,-42.6072764400583495,99.6211284135251702],"rgb":[0.6,0.933333333333333348,0.0666666666666666657],"xyz":[0.438109392888433147,0.67960407033234782,0.11339653063652326],"hpluv":[113.156064955940181,337.317445797395,85.9866468155118326],"hsluv":[113.156064955940181,99.0182391276988,85.9866468155118326]},"#99ee22":{"lch":[86.0241571186350455,106.77763062148405,113.488368653358094],"luv":[86.0241571186350455,-42.5576013317541353,97.9301433166804287],"rgb":[0.6,0.933333333333333348,0.133333333333333331],"xyz":[0.439984751026910204,0.680354213587738621,0.123273416832502453],"hpluv":[113.488368653358094,333.419677856626379,86.0241571186350455],"hsluv":[113.488368653358094,97.2091916908085238,86.0241571186350455]},"#99ee33":{"lch":[86.0858572784747906,104.220652596579697,114.05202992935186],"luv":[86.0858572784747906,-42.476800751453851,95.1717701084636],"rgb":[0.6,0.933333333333333348,0.2],"xyz":[0.443072501759367909,0.681589313880721748,0.139535570690113603],"hpluv":[114.05202992935186,327.048640581280779,86.0858572784747906],"hsluv":[114.05202992935186,94.2610252844147709,86.0858572784747906]},"#99ee44":{"lch":[86.1748066309051239,100.599171066032113,114.904029942881266],"luv":[86.1748066309051239,-42.3622716989010186,91.2448966007484756],"rgb":[0.6,0.933333333333333348,0.266666666666666663],"xyz":[0.447530497003586825,0.683372511978409314,0.163014345643000241],"hpluv":[114.904029942881266,317.953677409096201,86.1748066309051239],"hsluv":[114.904029942881266,90.0700159696272777,86.1748066309051239]},"#99ee55":{"lch":[86.2935317577421586,95.884762204841536,116.119599614249481],"luv":[86.2935317577421586,-42.2129155656731854,86.0927254913233355],"rgb":[0.6,0.933333333333333348,0.333333333333333315],"xyz":[0.45349291104294881,0.685757477594154063,0.194416392916974157],"hpluv":[116.119599614249481,305.984138616458665,86.2935317577421586],"hsluv":[116.119599614249481,84.5822993375075924,86.2935317577421586]},"#99ee66":{"lch":[86.4441689863048879,90.1009507230509143,117.805124209421223],"luv":[86.4441689863048879,-42.0290075887870955,79.6978283411745565],"rgb":[0.6,0.933333333333333348,0.4],"xyz":[0.461077906816457,0.688791475903557382,0.234364037324118091],"hpluv":[117.805124209421223,291.090686380889622,86.4441689863048879],"hsluv":[117.805124209421223,77.7887546135139587,86.4441689863048879]},"#99ee77":{"lch":[86.6285404402691199,83.3280712532883712,120.117619079442107],"luv":[86.6285404402691199,-41.8120893585486826,72.0785449510868261],"rgb":[0.6,0.933333333333333348,0.466666666666666674],"xyz":[0.470391919836658901,0.692517081111638233,0.283417839230516],"hpluv":[120.117619079442107,273.344218704658658,86.6285404402691199],"hsluv":[120.117619079442107,69.7211272565473,86.6285404402691199]},"#99ee88":{"lch":[86.8481992617441563,75.7142340291470646,123.296374810060541],"luv":[86.8481992617441563,-41.5648380664255939,63.2851441582641],"rgb":[0.6,0.933333333333333348,0.533333333333333326],"xyz":[0.481532336938602701,0.696973247952415775,0.342090702634088195],"hpluv":[123.296374810060541,252.981665625798911,86.8481992617441563],"hsluv":[123.296374810060541,60.4476982156994964,86.8481992617441563]},"#99ee99":{"lch":[87.1044587056640864,67.4980907628946483,127.715012949238613],"luv":[87.1044587056640864,-41.2908999939099388,53.3952604107227131],"rgb":[0.6,0.933333333333333348,0.6],"xyz":[0.4945893010476754,0.702196033596045,0.410857380275206074],"hpluv":[127.715012949238613,230.504268403717248,87.1044587056640864],"hsluv":[127.715012949238613,50.0680020008431583,87.1044587056640864]},"#99eeaa":{"lch":[87.3984122167822477,59.0554460818204134,133.961345837807],"luv":[87.3984122167822477,-40.9946911699179566,42.5085992218733182],"rgb":[0.6,0.933333333333333348,0.66666666666666663],"xyz":[0.509646994012928,0.708219110782146,0.490161229892204675],"hpluv":[133.961345837807,206.883546406693341,87.3984122167822477],"hsluv":[133.961345837807,51.4281429353489514,87.3984122167822477]},"#99eebb":{"lch":[87.7309483141988409,50.9899623050450046,142.923108379062683],"luv":[87.7309483141988409,-40.6811762109167603,30.7411476358032338],"rgb":[0.6,0.933333333333333348,0.733333333333333282],"xyz":[0.526784586120264575,0.715074147625080814,0.580419214990846477],"hpluv":[142.923108379062683,183.977628608542716,87.7309483141988409],"hsluv":[142.923108379062683,52.8887094272277523,87.7309483141988409]},"#99eecc":{"lch":[88.1027624984453581,44.2777406304916781,155.702396707036257],"luv":[88.1027624984453581,-40.3556400464907483,18.219237958245273],"rgb":[0.6,0.933333333333333348,0.8],"xyz":[0.546076961563986329,0.722791097802569671,0.682025725661116633],"hpluv":[155.702396707036257,165.259943503195302,88.1027624984453581],"hsluv":[155.702396707036257,54.4312604691531305,88.1027624984453581]},"#99eedd":{"lch":[88.514367527899708,40.3437945821223494,172.775068456479858],"luv":[88.514367527899708,-40.023467685182176,5.07383442158517628],"rgb":[0.6,0.933333333333333348,0.866666666666666696],"xyz":[0.567595287114619929,0.731398428022823177,0.795355573561122631],"hpluv":[172.775068456479858,156.503534311163719,88.514367527899708],"hsluv":[172.775068456479858,56.0368199873083199,88.514367527899708]},"#99eeee":{"lch":[88.9661029048661476,40.6035054290346196,192.177050630060762],"luv":[88.9661029048661476,-39.6899452486728,-8.56463071492281891],"rgb":[0.6,0.933333333333333348,0.933333333333333348],"xyz":[0.591407467380794638,0.740923300129293194,0.920766389629645854],"hpluv":[192.177050630060762,164.568757380081195,88.9661029048661476],"hsluv":[192.177050630060762,57.6866071933722324,88.9661029048661476]},"#99eeff":{"lch":[89.4581440962481338,45.3723498615675496,209.831659516829347],"luv":[89.4581440962481338,-39.3600920674606272,-22.5706287994267498],"rgb":[0.6,0.933333333333333348,1],"xyz":[0.617578515790626059,0.751391719493225918,1.05860057792142759],"hpluv":[209.831659516829347,193.255751503994162,89.4581440962481338],"hsluv":[209.831659516829347,99.9999999999917293,89.4581440962481338]},"#446600":{"lch":[39.1245088935371612,48.4489514943966242,110.29724752770484],"luv":[39.1245088935371612,-16.806485623906017,45.4405429311736668],"rgb":[0.266666666666666663,0.4,0],"xyz":[0.0713500585462719106,0.107314951185536064,0.0169546366210883669],"hpluv":[110.29724752770484,157.13568029472475,39.1245088935371612],"hsluv":[110.29724752770484,100.000000000002302,39.1245088935371612]},"#446611":{"lch":[39.1937103273453289,46.0071342898824156,111.370502443062165],"luv":[39.1937103273453289,-16.7648801632844737,42.843846683952],"rgb":[0.266666666666666663,0.4,0.0666666666666666657],"xyz":[0.0723617240459090288,0.107719617385390917,0.022282741585844],"hpluv":[111.370502443062165,148.9526145018813,39.1937103273453289],"hsluv":[111.370502443062165,93.861989786091,39.1937103273453289]},"#446622":{"lch":[39.3215343087732165,41.6757739733598,113.610346420587263],"luv":[39.3215343087732165,-16.6917518579939177,38.1871124358693947],"rgb":[0.266666666666666663,0.4,0.133333333333333331],"xyz":[0.0742370821843860579,0.108469760640781732,0.0321596277818231926],"hpluv":[113.610346420587263,134.490790122462073,39.3215343087732165],"hsluv":[113.610346420587263,82.9003633409612,39.3215343087732165]},"#446633":{"lch":[39.530716823468623,35.0960892868442684,118.194686061271412],"luv":[39.530716823468623,-16.5818151114938139,30.931842668007679],"rgb":[0.266666666666666663,0.4,0.2],"xyz":[0.0773248329168437915,0.109704860933764844,0.0484217816394343359],"hpluv":[118.194686061271412,112.658344014206364,39.530716823468623],"hsluv":[118.194686061271412,65.945418212904,39.530716823468623]},"#446644":{"lch":[39.8299759493166761,26.8801274380109838,127.715012949238059],"luv":[39.8299759493166761,-16.4434970133495142,21.2638815143349724],"rgb":[0.266666666666666663,0.4,0.266666666666666663],"xyz":[0.0817828281610626651,0.111488059031452424,0.0719005565923209744],"hpluv":[127.715012949238059,85.6368345314009,39.8299759493166761],"hsluv":[127.715012949238059,43.6044123282566858,39.8299759493166761]},"#446655":{"lch":[40.2252775564066809,18.9132283301115756,149.466153210293243],"luv":[40.2252775564066809,-16.2905155992652197,9.6088140463343148],"rgb":[0.266666666666666663,0.4,0.333333333333333315],"xyz":[0.087745242200424664,0.113873024647197257,0.10330260386629489],"hpluv":[149.466153210293243,59.6631175613842473,40.2252775564066809],"hsluv":[149.466153210293243,47.2452022491104273,40.2252775564066809]},"#446666":{"lch":[40.7202569602655728,16.510473073285187,192.177050630060847],"luv":[40.7202569602655728,-16.1389950297194247,-3.48260829470770128],"rgb":[0.266666666666666663,0.4,0.4],"xyz":[0.0953302379739328354,0.116907022956600576,0.143250248273438852],"hpluv":[192.177050630060847,51.4503500463259655,40.7202569602655728],"hsluv":[192.177050630060847,51.2489582821824214,40.7202569602655728]},"#446677":{"lch":[41.3164898648363632,23.6752994583974647,227.46784435344162],"luv":[41.3164898648363632,-16.0045942322577233,-17.4462823519963166],"rgb":[0.266666666666666663,0.4,0.466666666666666674],"xyz":[0.104644250994134755,0.120632628164681385,0.192304050179836761],"hpluv":[227.46784435344162,72.7128872034151783,41.3164898648363632],"hsluv":[227.46784435344162,55.4049423234493261,41.3164898648363632]},"#446688":{"lch":[42.0137303768536654,35.5424939627414,243.425378218088099],"luv":[42.0137303768536654,-15.9003964812462133,-31.7875175002811758],"rgb":[0.266666666666666663,0.4,0.533333333333333326],"xyz":[0.115784668096078583,0.125088795005458969,0.2509769135834089],"hpluv":[243.425378218088099,107.348500116853913,42.0137303768536654],"hsluv":[243.425378218088099,59.5313600522085409,42.0137303768536654]},"#446699":{"lch":[42.8101553746289696,48.7666560663799089,251.050944767945737],"luv":[42.8101553746289696,-15.8358652521886238,-46.1238779333558782],"rgb":[0.266666666666666663,0.4,0.6],"xyz":[0.128841632205151296,0.130311580649088155,0.319743591224526835],"hpluv":[251.050944767945737,144.549135771893674,42.8101553746289696],"hsluv":[251.050944767945737,63.4907652576423231,42.8101553746289696]},"#4466aa":{"lch":[43.7026231888915078,62.2363741998113298,255.27738032783347],"luv":[43.7026231888915078,-15.8167390859625119,-60.1929982491778404],"rgb":[0.266666666666666663,0.4,0.66666666666666663],"xyz":[0.143899325170403825,0.136334657835189249,0.399047440841525436],"hpluv":[255.27738032783347,180.707469421570693,43.7026231888915078],"hsluv":[255.27738032783347,67.1924648453768896,43.7026231888915078]},"#4466bb":{"lch":[44.6869405362706402,75.5191451090451409,257.888120209084718],"luv":[44.6869405362706402,-15.8455247037125186,-73.83807029483539],"rgb":[0.266666666666666663,0.4,0.733333333333333282],"xyz":[0.161036917277740499,0.143189694678124,0.489305425940167182],"hpluv":[257.888120209084718,214.444923406304468,44.6869405362706402],"hsluv":[257.888120209084718,70.5866413561882098,44.6869405362706402]},"#4466cc":{"lch":[45.7581261645645299,88.428992560325014,259.626929599743789],"luv":[45.7581261645645299,-15.9222446749778896,-86.983727499712],"rgb":[0.266666666666666663,0.4,0.8],"xyz":[0.180329292721462225,0.150906644855612809,0.590911936610437283],"hpluv":[259.626929599743789,245.225581131482073,45.7581261645645299],"hsluv":[259.626929599743789,73.6549291646736179,45.7581261645645299]},"#4466dd":{"lch":[46.9106590907269165,100.895184366494064,260.849495088158733],"luv":[46.9106590907269165,-16.0451985527389489,-99.6111933055317422],"rgb":[0.266666666666666663,0.4,0.866666666666666696],"xyz":[0.201847618272095769,0.159513975075866343,0.704241784510443281],"hpluv":[260.849495088158733,272.92180192815988,46.9106590907269165],"hsluv":[260.849495088158733,78.541907894368677,46.9106590907269165]},"#4466ee":{"lch":[48.1387014995781897,112.90717489320852,261.744736192665698],"luv":[48.1387014995781897,-16.2116120228509466,-111.737253313235385],"rgb":[0.266666666666666663,0.4,0.933333333333333348],"xyz":[0.225659798538270506,0.16903884718233636,0.829652600578966504],"hpluv":[261.744736192665698,297.623004098842955,48.1387014995781897],"hsluv":[261.744736192665698,89.2025828989012126,48.1387014995781897]},"#4466ff":{"lch":[49.4362898036433194,124.485902067172418,262.421323096893047],"luv":[49.4362898036433194,-16.4181334215125325,-123.398479360286501],"rgb":[0.266666666666666663,0.4,1],"xyz":[0.251830846948101872,0.179507266546269084,0.967486788870748349],"hpluv":[262.421323096893047,319.531462910383539,49.4362898036433194],"hsluv":[262.421323096893047,99.9999999999992,49.4362898036433194]},"#bbee00":{"lch":[87.830324097455545,103.474670767003104,103.901308289378321],"luv":[87.830324097455545,-24.8598111448325625,100.444000717728017],"rgb":[0.733333333333333282,0.933333333333333348,0],"xyz":[0.510662561968970863,0.717131271962896388,0.111516777292713254],"hpluv":[103.901308289378321,376.707439149390723,87.830324097455545],"hsluv":[103.901308289378321,100.000000000002331,87.830324097455545]},"#bbee11":{"lch":[87.8498503793181413,102.621932764236291,104.023160127863235],"luv":[87.8498503793181413,-24.8667401733108697,99.5635792718425705],"rgb":[0.733333333333333282,0.933333333333333348,0.0666666666666666657],"xyz":[0.511674227468608,0.717535938162751297,0.116844882257468891],"hpluv":[104.023160127863235,374.263941750279344,87.8498503793181413],"hsluv":[104.023160127863235,99.0733759990956315,87.8498503793181413]},"#bbee22":{"lch":[87.8860274909110757,101.050540606732312,104.253301125000391],"luv":[87.8860274909110757,-24.8795662288424886,97.9398741125263],"rgb":[0.733333333333333282,0.933333333333333348,0.133333333333333331],"xyz":[0.513549585607085,0.718286081418142097,0.126721768453448069],"hpluv":[104.253301125000391,369.744422226518111,87.8860274909110757],"hsluv":[104.253301125000391,97.3653524759520224,87.8860274909110757]},"#bbee33":{"lch":[87.9455377581158899,98.4895893313188111,104.644745385959411],"luv":[87.9455377581158899,-24.9006321902472507,95.2898615970127878],"rgb":[0.733333333333333282,0.933333333333333348,0.2],"xyz":[0.516637336339542785,0.719521181711125224,0.142983922311059219],"hpluv":[104.644745385959411,362.331462484484575,87.9455377581158899],"hsluv":[104.644745385959411,94.5802259429375454,87.9455377581158899]},"#bbee44":{"lch":[88.03133674845418,94.8494424101932339,105.239087045756335],"luv":[88.03133674845418,-24.9309340294718567,91.5142898892991781],"rgb":[0.733333333333333282,0.933333333333333348,0.266666666666666663],"xyz":[0.521095331583761645,0.72130437980881279,0.166462697263945858],"hpluv":[105.239087045756335,351.690778632920285,88.03133674845418],"hsluv":[105.239087045756335,90.61757843521751,88.03133674845418]},"#bbee55":{"lch":[88.145869167101,90.085489786575252,106.092871571181419],"luv":[88.145869167101,-24.9712578135623886,86.5553681367929499],"rgb":[0.733333333333333282,0.933333333333333348,0.333333333333333315],"xyz":[0.527057745623123575,0.72368934542455754,0.197864744537919773],"hpluv":[106.092871571181419,337.573290416608245,88.145869167101],"hsluv":[106.092871571181419,85.422816781051381,88.145869167101]},"#bbee66":{"lch":[88.2912067804751786,84.1961694748550116,107.288882190620882],"luv":[88.2912067804751786,-25.0222263001917433,80.3920589686599527],"rgb":[0.733333333333333282,0.933333333333333348,0.4],"xyz":[0.534642741396631815,0.726723343733960858,0.237812388945063735],"hpluv":[107.288882190620882,319.804166688067426,88.2912067804751786],"hsluv":[107.288882190620882,78.9823949944632631,88.2912067804751786]},"#bbee77":{"lch":[88.4691221578712828,77.2243366572971439,108.954917992899311],"luv":[88.4691221578712828,-25.0843250262429365,73.0368044901840534],"rgb":[0.733333333333333282,0.933333333333333348,0.466666666666666674],"xyz":[0.543956754416833665,0.730448948942041709,0.286866190851461644],"hpluv":[108.954917992899311,298.285685525501094,88.4691221578712828],"hsluv":[108.954917992899311,71.3203705839542,88.4691221578712828]},"#bbee88":{"lch":[88.6811325759484106,69.2626802552854599,111.298371855766348],"luv":[88.6811325759484106,-25.1579200624522237,64.5321465184381822],"rgb":[0.733333333333333282,0.933333333333333348,0.533333333333333326],"xyz":[0.555097171518777577,0.734905115782819252,0.34553905425503384],"hpluv":[111.298371855766348,273.019747479454225,88.6811325759484106],"hsluv":[111.298371855766348,62.4946759175697224,88.6811325759484106]},"#bbee99":{"lch":[88.9285282571087095,60.4678989000773228,114.674688063820184],"luv":[88.9285282571087095,-25.2432722518949362,54.9467378777547069],"rgb":[0.733333333333333282,0.933333333333333348,0.6],"xyz":[0.568154135627850221,0.740127901426448465,0.414305731896151719],"hpluv":[114.674688063820184,244.173567048365754,88.9285282571087095],"hsluv":[114.674688063820184,52.5925914284503548,88.9285282571087095]},"#bbeeaa":{"lch":[89.2123917942545148,51.0969811847688931,119.731125412935242],"luv":[89.2123917942545148,-25.3405499711494109,44.3706886734509212],"rgb":[0.733333333333333282,0.933333333333333348,0.66666666666666663],"xyz":[0.583211828593102832,0.746150978612549531,0.493609581513150319],"hpluv":[119.731125412935242,212.254877789093854,89.2123917942545148],"hsluv":[119.731125412935242,41.7253920748903084,89.2123917942545148]},"#bbeebb":{"lch":[89.5336124490095,41.6027669810227181,127.715012949236097],"luv":[89.5336124490095,-25.4498411950279184,32.9104208971130276],"rgb":[0.733333333333333282,0.933333333333333348,0.733333333333333282],"xyz":[0.600349420700439396,0.75300601545548429,0.583867566611792066],"hpluv":[127.715012949236097,178.587287563939924,89.5336124490095],"hsluv":[127.715012949236097,37.7465419844818,89.5336124490095]},"#bbeecc":{"lch":[89.8928974614309766,32.8889663829363883,141.03222670888556],"luv":[89.8928974614309766,-25.571165029146556,20.6833176446640721],"rgb":[0.733333333333333282,0.933333333333333348,0.8],"xyz":[0.61964179614416115,0.760722965632973147,0.685474077282062222],"hpluv":[141.03222670888556,146.627829178506289,89.8928974614309766],"hsluv":[141.03222670888556,37.1073685119788,89.8928974614309766]},"#bbeedd":{"lch":[90.290781675649967,26.8655052232995288,163.094148385079734],"luv":[90.290781675649967,-25.704482585445124,7.81248653872008436],"rgb":[0.733333333333333282,0.933333333333333348,0.866666666666666696],"xyz":[0.641160121694794749,0.769330295853226653,0.79880392518206822],"hpluv":[163.094148385079734,125.084011642469022,90.290781675649967],"hsluv":[163.094148385079734,36.2429238875219255,90.290781675649967]},"#bbeeee":{"lch":[90.7276363011350782,26.4447005646089579,192.177050630060336],"luv":[90.7276363011350782,-25.8497069757021904,-5.5780675168164624],"rgb":[0.733333333333333282,0.933333333333333348,0.933333333333333348],"xyz":[0.664972301960969459,0.77885516795969667,0.924214741250591443],"hpluv":[192.177050630060336,129.38009793870765,90.7276363011350782],"hsluv":[192.177050630060336,36.8413123479339077,90.7276363011350782]},"#bbeeff":{"lch":[91.2036773284388289,32.4261328799939648,216.675663960190036],"luv":[91.2036773284388289,-26.0067122100428421,-19.367627980086624],"rgb":[0.733333333333333282,0.933333333333333348,1],"xyz":[0.69114335037080088,0.789323587323629394,1.06204892954237318],"hpluv":[216.675663960190036,167.86892764061264,91.2036773284388289],"hsluv":[216.675663960190036,99.9999999999901235,91.2036773284388289]},"#99ff00":{"lch":[90.9122626200542214,118.290950299530564,115.261698016578393],"luv":[90.9122626200542214,-50.4810643573161286,106.978554225220847],"rgb":[0.6,1,0],"xyz":[0.48895009981846993,0.782904148991842,0.125352549814991721],"hpluv":[115.261698016578393,591.369219456757151,90.9122626200542214],"hsluv":[115.261698016578393,100.000000000002402,90.9122626200542214]},"#99ff11":{"lch":[90.9306796583728,117.513960007406183,115.422432906031332],"luv":[90.9306796583728,-50.4474247175277384,106.134764031356056],"rgb":[0.6,1,0.0666666666666666657],"xyz":[0.489961765318107034,0.783308815191696928,0.130680654779747357],"hpluv":[115.422432906031332,588.764777700997797,90.9306796583728],"hsluv":[115.422432906031332,99.9999999999905356,90.9306796583728]},"#99ff22":{"lch":[90.9648031673089577,116.082935310332914,115.724658723180369],"luv":[90.9648031673089577,-50.3854319755480944,104.577990585497247],"rgb":[0.6,1,0.133333333333333331],"xyz":[0.491837123456584091,0.784058958447087728,0.140557540975726536],"hpluv":[115.724658723180369,583.951350293788323,90.9648031673089577],"hsluv":[115.724658723180369,99.9999999999904219,90.9648031673089577]},"#99ff33":{"lch":[91.0209396556716399,113.753057852482627,116.234667099004312],"luv":[91.0209396556716399,-50.2843870930134642,102.035477092383132],"rgb":[0.6,1,0.2],"xyz":[0.494924874189041797,0.785294058740070855,0.156819694833337686],"hpluv":[116.234667099004312,576.067585056329449,91.0209396556716399],"hsluv":[116.234667099004312,99.9999999999905924,91.0209396556716399]},"#99ff44":{"lch":[91.1018839706868562,110.446777199697451,116.999375135233294],"luv":[91.1018839706868562,-50.1407143313292565,98.409345898362929],"rgb":[0.6,1,0.266666666666666663],"xyz":[0.499382869433260712,0.787077256837758421,0.180298469786224325],"hpluv":[116.999375135233294,564.777897061868,91.1018839706868562],"hsluv":[116.999375135233294,99.9999999999903793,91.1018839706868562]},"#99ff55":{"lch":[91.2099533036034558,106.130684884370282,118.07780645420398],"luv":[91.2099533036034558,-49.9525457622324112,93.6400846106921279],"rgb":[0.6,1,0.333333333333333315],"xyz":[0.505345283472622642,0.789462222453503171,0.21170051706019824],"hpluv":[118.07780645420398,549.854625367801646,91.2099533036034558],"hsluv":[118.07780645420398,99.9999999999901377,91.2099533036034558]},"#99ff66":{"lch":[91.3471179899501351,100.815112661229691,119.549522622156928],"luv":[91.3471179899501351,-49.7195590247369807,87.7020660605103899],"rgb":[0.6,1,0.4],"xyz":[0.512930279246130882,0.792496220762906489,0.251648161467342202],"hpluv":[119.549522622156928,531.176396965461777,91.3471179899501351],"hsluv":[119.549522622156928,99.9999999999902656,91.3471179899501351]},"#99ff77":{"lch":[91.5150716426202,94.5571579863012488,121.52621580287979],"luv":[91.5150716426202,-49.442863485124569,80.6006164792656534],"rgb":[0.6,1,0.466666666666666674],"xyz":[0.522244292266332732,0.79622182597098734,0.300701963373740111],"hpluv":[121.52621580287979,508.746904082031563,91.5150716426202],"hsluv":[121.52621580287979,99.9999999999900098,91.5150716426202]},"#99ff88":{"lch":[91.7152730008064481,87.4673964918121385,124.169042550433474],"luv":[91.7152730008064481,-49.1248751175299461,72.3691377159004077],"rgb":[0.6,1,0.533333333333333326],"xyz":[0.533384709368276644,0.800677992811764883,0.359374826777312251],"hpluv":[124.169042550433474,482.74240688111388,91.7152730008064481],"hsluv":[124.169042550433474,99.999999999989754,91.7152730008064481]},"#99ff99":{"lch":[91.9489728509177,79.7227767672504,127.715012949239039],"luv":[91.9489728509177,-48.7691602166467675,63.0657604984184559],"rgb":[0.6,1,0.6],"xyz":[0.546441673477349288,0.805900778455394096,0.428141504418430185],"hpluv":[127.715012949239039,453.611771943482722,91.9489728509177],"hsluv":[127.715012949239039,99.9999999999896119,91.9489728509177]},"#99ffaa":{"lch":[92.2172324754492365,71.5909188251234525,132.515331265000469],"luv":[92.2172324754492365,-48.380245540777544,52.769418223432119],"rgb":[0.6,1,0.66666666666666663],"xyz":[0.561499366442601899,0.811923855641495162,0.507445354035428786],"hpluv":[132.515331265000469,422.278899597361089,92.2172324754492365],"hsluv":[132.515331265000469,99.999999999989285,92.2172324754492365]},"#99ffbb":{"lch":[92.5209371039878334,63.4744472180726902,139.080731133451],"luv":[92.5209371039878334,-47.9634018094000325,41.5754439123617558],"rgb":[0.6,1,0.733333333333333282],"xyz":[0.578636958549938463,0.818778892484429921,0.597703339134070477],"hpluv":[139.080731133451,390.542311531215887,92.5209371039878334],"hsluv":[139.080731133451,99.9999999999889866,92.5209371039878334]},"#99ffcc":{"lch":[92.8608063839845,55.9838497302527216,148.091690615728766],"luv":[92.8608063839845,-47.524412431304512,29.5909049148346774],"rgb":[0.6,1,0.8],"xyz":[0.597929333993660217,0.826495842661918778,0.699309849804340633],"hpluv":[148.091690615728766,361.818313682118117,92.8608063839845],"hsluv":[148.091690615728766,99.999999999988475,92.8608063839845]},"#99ffdd":{"lch":[93.237403107538583,50.0214511206169306,160.217319691395858],"luv":[93.237403107538583,-47.0693412211659066,16.9299347080170577],"rgb":[0.6,1,0.866666666666666696],"xyz":[0.619447659544293816,0.835103172882172284,0.812639697704346631],"hpluv":[160.217319691395858,342.295010089686684,93.237403107538583],"hsluv":[160.217319691395858,99.999999999988,93.237403107538583]},"#99ffee":{"lch":[93.6511409780710267,46.7516947594382444,175.449324589633676],"luv":[93.6511409780710267,-46.6043124006013088,3.70931645277729727],"rgb":[0.6,1,0.933333333333333348],"xyz":[0.643259839810468526,0.844628044988642301,0.938050513772869854],"hpluv":[175.449324589633676,341.869484566500148,93.6511409780710267],"hsluv":[175.449324589633676,99.9999999999875,93.6511409780710267]},"#99ffff":{"lch":[94.102291921527609,47.1972299789563579,192.177050630060847],"luv":[94.102291921527609,-46.1353140316371437,-9.95546668362271703],"rgb":[0.6,1,1],"xyz":[0.6694308882203,0.855096464352575,1.07588470206465181],"hpluv":[192.177050630060847,372.830957625984183,94.102291921527609],"hsluv":[192.177050630060847,99.999999999986585,94.102291921527609]},"#447700":{"lch":[44.83248944102629,58.4741115144389809,115.479055163134589],"luv":[44.83248944102629,-25.1544589141716,52.7870714677211339],"rgb":[0.266666666666666663,0.466666666666666674,0],"xyz":[0.0898037965996895393,0.144222427292371835,0.0231058826388940708],"hpluv":[115.479055163134589,165.50461307776385,44.83248944102629],"hsluv":[115.479055163134589,100.00000000000216,44.83248944102629]},"#447711":{"lch":[44.8893318820142468,56.4264635629906337,116.3750363045054],"luv":[44.8893318820142468,-25.0671673404006405,50.5527735317644158],"rgb":[0.266666666666666663,0.466666666666666674,0.0666666666666666657],"xyz":[0.0908154620993266576,0.144627093492226688,0.0284339876036497],"hpluv":[116.3750363045054,159.506732057184706,44.8893318820142468],"hsluv":[116.3750363045054,95.4073228169634433,44.8893318820142468]},"#447722":{"lch":[44.9944227930058389,52.7636609180533824,118.171656995978211],"luv":[44.9944227930058389,-24.9105023189221484,46.5131248971114388],"rgb":[0.266666666666666663,0.466666666666666674,0.133333333333333331],"xyz":[0.0926908202378036866,0.145377236747617516,0.0383108737996289],"hpluv":[118.171656995978211,148.804327803607492,44.9944227930058389],"hsluv":[118.171656995978211,87.128369469673089,44.9944227930058389]},"#447733":{"lch":[45.1666686690004795,47.1090234718488,121.574089601592789],"luv":[45.1666686690004795,-24.6663168629185812,40.1351828809748881],"rgb":[0.266666666666666663,0.466666666666666674,0.2],"xyz":[0.0957785709702614202,0.146612337040600615,0.0545730276572400433],"hpluv":[121.574089601592789,132.350433634303585,45.1666686690004795],"hsluv":[121.574089601592789,74.1245535442141232,45.1666686690004795]},"#447744":{"lch":[45.4136534494367368,39.7908238780444137,127.715012949239082],"luv":[45.4136534494367368,-24.3414133770851677,31.4770592606648769],"rgb":[0.266666666666666663,0.466666666666666674,0.266666666666666663],"xyz":[0.100236566214480294,0.148395535138288209,0.0780518026101266749],"hpluv":[127.715012949239082,111.18234158710581,45.4136534494367368],"hsluv":[127.715012949239082,56.6116285441109,45.4136534494367368]},"#447755":{"lch":[45.7409133262359902,31.7219583115713704,139.030718806592802],"luv":[45.7409133262359902,-23.9520203549447466,20.798638417872084],"rgb":[0.266666666666666663,0.466666666666666674,0.333333333333333315],"xyz":[0.106198980253842293,0.150780500754033042,0.10945384988410059],"hpluv":[139.030718806592802,88.0023935360314766,45.7409133262359902],"hsluv":[139.030718806592802,58.7992252631310066,45.7409133262359902]},"#447766":{"lch":[46.1522822994750328,25.0075472636366349,160.141849635166039],"luv":[46.1522822994750328,-23.5205108300662609,8.49488024846472],"rgb":[0.266666666666666663,0.466666666666666674,0.4],"xyz":[0.113783976027350464,0.153814499063436333,0.149401494291244552],"hpluv":[160.141849635166039,68.7570511480334,46.1522822994750328],"hsluv":[160.141849635166039,61.2825519214888672,46.1522822994750328]},"#447777":{"lch":[46.650089933282672,23.6026970305602966,192.177050630060933],"luv":[46.650089933282672,-23.0716472128555,-4.97859438013953248],"rgb":[0.266666666666666663,0.466666666666666674,0.466666666666666674],"xyz":[0.123097989047552384,0.157540104271517156,0.198455296197642461],"hpluv":[192.177050630060933,64.2019875277067,46.650089933282672],"hsluv":[192.177050630060933,63.9506821134950414,46.650089933282672]},"#447788":{"lch":[47.2353114433284134,29.6592888392359697,220.273189901853613],"luv":[47.2353114433284134,-22.6291741496980734,-19.1727382434503575],"rgb":[0.266666666666666663,0.466666666666666674,0.533333333333333326],"xyz":[0.134238406149496226,0.161996271112294754,0.257128159601214601],"hpluv":[220.273189901853613,79.6770556088496,47.2353114433284134],"hsluv":[220.273189901853613,66.6958169909158585,47.2353114433284134]},"#447799":{"lch":[47.9077085122244526,40.3569508451274856,236.603980798736757],"luv":[47.9077085122244526,-22.2133832668581981,-33.6934576046404],"rgb":[0.266666666666666663,0.466666666666666674,0.6],"xyz":[0.147295370258568925,0.167219056755923912,0.325894837242332536],"hpluv":[236.603980798736757,106.893740352524901,47.9077085122244526],"hsluv":[236.603980798736757,69.4246608010291197,47.9077085122244526]},"#4477aa":{"lch":[48.6659751090485,52.9419227285019574,245.636459716194196],"luv":[48.6659751090485,-21.8398581964299439,-48.2272513849846476],"rgb":[0.266666666666666663,0.466666666666666674,0.66666666666666663],"xyz":[0.162353063223821481,0.173242133942025,0.405198686859331136],"hpluv":[245.636459716194196,138.042751347741245,48.6659751090485],"hsluv":[245.636459716194196,72.0643617009564,48.6659751090485]},"#4477bb":{"lch":[49.5078912458612,66.145388752002,251.014275727268966],"luv":[49.5078912458612,-21.5192486824625604,-62.5470573991759125],"rgb":[0.266666666666666663,0.466666666666666674,0.733333333333333282],"xyz":[0.1794906553311581,0.180097170784959765,0.495456671957972883],"hpluv":[251.014275727268966,169.536991245322184,49.5078912458612],"hsluv":[251.014275727268966,74.5637193650047578,49.5078912458612]},"#4477cc":{"lch":[50.4304819457797606,79.4031370336833,254.471410742848605],"luv":[50.4304819457797606,-21.2577420931439356,-76.5046833330565761],"rgb":[0.266666666666666663,0.466666666666666674,0.8],"xyz":[0.198783030774879854,0.187814120962448566,0.597063182628243094],"hpluv":[254.471410742848605,199.794656417231295,50.4304819457797606],"hsluv":[254.471410742848605,76.8911855438839638,50.4304819457797606]},"#4477dd":{"lch":[51.4301761714764183,92.4467030892661654,256.833353640671476],"luv":[51.4301761714764183,-21.0578873175855144,-90.0164334652001514],"rgb":[0.266666666666666663,0.466666666666666674,0.866666666666666696],"xyz":[0.220301356325513398,0.1964214511827021,0.710393030528249092],"hpluv":[256.833353640671476,228.093412194404408,51.4301761714764183],"hsluv":[256.833353640671476,79.0312420746427904,51.4301761714764183]},"#4477ee":{"lch":[52.5029598761355913,105.148975578657073,258.524369979875587],"luv":[52.5029598761355913,-20.9195063280493,-103.046985983248078],"rgb":[0.266666666666666663,0.466666666666666674,0.933333333333333348],"xyz":[0.244113536591688135,0.205946323289172145,0.835803846596772315],"hpluv":[258.524369979875587,254.132720010738154,52.5029598761355913],"hsluv":[258.524369979875587,87.6254974090696,52.5029598761355913]},"#4477ff":{"lch":[53.6445179522116,117.458222301342076,259.779939364455799],"luv":[53.6445179522116,-20.8405325230258285,-115.594576820663164],"rgb":[0.266666666666666663,0.466666666666666674,1],"xyz":[0.270284585001519528,0.216414742653104841,0.973638034888554],"hpluv":[259.779939364455799,277.841684308431127,53.6445179522116],"hsluv":[259.779939364455799,99.999999999999,53.6445179522116]},"#bbff00":{"lch":[92.6117448358007778,112.09772632761252,107.605046807390437],"luv":[92.6117448358007778,-33.9043888880720843,106.847520616749406],"rgb":[0.733333333333333282,1,0],"xyz":[0.56251493439864475,0.820836016822245496,0.128800901435937365],"hpluv":[107.605046807390437,698.685604225905081,92.6117448358007778],"hsluv":[107.605046807390437,100.000000000002302,92.6117448358007778]},"#bbff11":{"lch":[92.6295901709342,111.320425805292416,107.729052066712285],"luv":[92.6295901709342,-33.8988588935206678,106.033506813595423],"rgb":[0.733333333333333282,1,0.0666666666666666657],"xyz":[0.56352659989828191,0.821240683022100404,0.134129006400693],"hpluv":[107.729052066712285,695.618439183936061,92.6295901709342],"hsluv":[107.729052066712285,99.9999999999893703,92.6295901709342]},"#bbff22":{"lch":[92.6626551654141,109.887399193340656,107.962519071076329],"luv":[92.6626551654141,-33.888700280085942,104.531318248662245],"rgb":[0.733333333333333282,1,0.133333333333333331],"xyz":[0.565401958036758856,0.821990826277491204,0.14400589259667218],"hpluv":[107.962519071076329,689.937572971075,92.6626551654141],"hsluv":[107.962519071076329,99.9999999999891713,92.6626551654141]},"#bbff33":{"lch":[92.7170524122382318,107.550157892444602,108.357408717671873],"luv":[92.7170524122382318,-33.8722333827189388,102.076972272674624],"rgb":[0.733333333333333282,1,0.2],"xyz":[0.568489708769216673,0.823225926570474331,0.160268046454283331],"hpluv":[108.357408717671873,680.59767216104342,92.7170524122382318],"hsluv":[108.357408717671873,99.9999999999894271,92.7170524122382318]},"#bbff44":{"lch":[92.7954935084343475,104.224206838295117,108.951712424811362],"luv":[92.7954935084343475,-33.8490183743317,98.5744857768270464],"rgb":[0.733333333333333282,1,0.266666666666666663],"xyz":[0.572947704013435533,0.825009124668161897,0.183746821407169969],"hpluv":[108.951712424811362,667.142517523628385,92.7954935084343475],"hsluv":[108.951712424811362,99.9999999999890576,92.7954935084343475]},"#bbff55":{"lch":[92.9002292713318809,99.8647848732016,109.794505003516988],"luv":[92.9002292713318809,-33.8189779888925628,93.9640994505754605],"rgb":[0.733333333333333282,1,0.333333333333333315],"xyz":[0.578910118052797462,0.827394090283906647,0.215148868681143884],"hpluv":[109.794505003516988,649.201221057988732,92.9002292713318809],"hsluv":[109.794505003516988,99.9999999999888445,92.9002292713318809]},"#bbff66":{"lch":[93.0331768315467826,94.4651128464689691,110.953951756581517],"luv":[93.0331768315467826,-33.7823795150753,88.2179595059619146],"rgb":[0.733333333333333282,1,0.4],"xyz":[0.586495113826305703,0.83042808859331,0.255096513088287846],"hpluv":[110.953951756581517,626.470359589551208,93.0331768315467826],"hsluv":[110.953951756581517,99.9999999999888871,93.0331768315467826]},"#bbff77":{"lch":[93.1959878807374196,88.0576290523864742,112.529317332402641],"luv":[93.1959878807374196,-33.7398191848892566,81.3373876867131571],"rgb":[0.733333333333333282,1,0.466666666666666674],"xyz":[0.595809126846507553,0.834153693801390816,0.304150314994685755],"hpluv":[112.529317332402641,598.713569857690459,93.1959878807374196],"hsluv":[112.529317332402641,99.9999999999886455,93.1959878807374196]},"#bbff88":{"lch":[93.3900894470196334,80.7182094219550805,114.670873894576516],"luv":[93.3900894470196334,-33.6921989698203319,73.3502901212028888],"rgb":[0.733333333333333282,1,0.533333333333333326],"xyz":[0.606949543948451464,0.838609860642168359,0.362823178398257951],"hpluv":[114.670873894576516,565.785048639302204,93.3900894470196334],"hsluv":[114.670873894576516,99.9999999999880913,93.3900894470196334]},"#bbff99":{"lch":[93.6167101348934239,72.575742292483838,117.61482369288214],"luv":[93.6167101348934239,-33.6406927329059684,64.3081811417119411],"rgb":[0.733333333333333282,1,0.6],"xyz":[0.620006508057524108,0.843832646285797572,0.43158985603937583],"hpluv":[117.61482369288214,527.702623330867254,93.6167101348934239],"hsluv":[117.61482369288214,99.9999999999881,93.6167101348934239]},"#bbffaa":{"lch":[93.8768980816178384,63.8331941826517948,121.746607961207644],"luv":[93.8768980816178384,-33.5867019719833948,54.2826872050868303],"rgb":[0.733333333333333282,1,0.66666666666666663],"xyz":[0.63506420102277672,0.849855723471898639,0.510893705656374486],"hpluv":[121.746607961207644,484.836572610502856,93.8768980816178384],"hsluv":[121.746607961207644,99.9999999999878781,93.8768980816178384]},"#bbffbb":{"lch":[94.1715339943383,54.8143223318485937,127.715012949237362],"luv":[94.1715339943383,-33.5318032859449531,43.3615970772812602],"rgb":[0.733333333333333282,1,0.733333333333333282],"xyz":[0.652201793130113283,0.856710760314833397,0.601151690755016177],"hpluv":[127.715012949237362,438.38038704048256,94.1715339943383],"hsluv":[127.715012949237362,99.999999999986926,94.1715339943383]},"#bbffcc":{"lch":[94.5013412228876888,46.0666753200389323,136.612331153023604],"luv":[94.5013412228876888,-33.4776907719138919,31.6446329670924698],"rgb":[0.733333333333333282,1,0.8],"xyz":[0.671494168573835,0.864427710492322254,0.702758201425286333],"hpluv":[136.612331153023604,391.513584290668746,94.5013412228876888],"hsluv":[136.612331153023604,99.9999999999865707,94.5013412228876888]},"#bbffdd":{"lch":[94.8668940681869515,38.5674836948257322,150.076437256866],"luv":[94.8668940681869515,-33.4261169986321818,19.2391658068743077],"rgb":[0.733333333333333282,1,0.866666666666666696],"xyz":[0.693012494124468637,0.873035040712575761,0.816088049325292331],"hpluv":[150.076437256866,352.109825744613431,94.8668940681869515],"hsluv":[150.076437256866,99.9999999999853628,94.8668940681869515]},"#bbffee":{"lch":[95.2686250900245568,33.9600576278843675,169.384373669661102],"luv":[95.2686250900245568,-33.3788361105619771,6.25610214058809699],"rgb":[0.733333333333333282,1,0.933333333333333348],"xyz":[0.716824674390643346,0.882559912819045778,0.941498865393815554],"hpluv":[169.384373669661102,337.406400875084444,95.2686250900245568],"hsluv":[169.384373669661102,99.9999999999845,95.2686250900245568]},"#bbffff":{"lch":[95.7068319095003,34.1048965933827191,192.177050630060478],"luv":[95.7068319095003,-33.3375521201936849,-7.19385781613020914],"rgb":[0.733333333333333282,1,1],"xyz":[0.742995722800474767,0.893028332182978501,1.0793330536855974],"hpluv":[192.177050630060478,374.679972152143307,95.7068319095003],"hsluv":[192.177050630060478,99.9999999999829186,95.7068319095003]},"#448800":{"lch":[50.4956227619448157,68.4221216779621244,118.715311426014551],"luv":[50.4956227619448157,-32.873947818662586,60.0074186224478723],"rgb":[0.266666666666666663,0.533333333333333326,0],"xyz":[0.111876166324659992,0.18836716674231338,0.0304633392138840171],"hpluv":[118.715311426014551,171.942062028892252,50.4956227619448157],"hsluv":[118.715311426014551,100.000000000002373,50.4956227619448157]},"#448811":{"lch":[50.543205868460916,66.6756511812714763,119.435612575278299],"luv":[50.543205868460916,-32.7674265649617098,58.0683925794095899],"rgb":[0.266666666666666663,0.533333333333333326,0.0666666666666666657],"xyz":[0.112887831824297111,0.188771832942168233,0.0357914441786396503],"hpluv":[119.435612575278299,167.395510973175305,50.543205868460916],"hsluv":[119.435612575278299,96.4702491056824272,50.543205868460916]},"#448822":{"lch":[50.6312327062127565,63.5295563644356918,120.846986072134357],"luv":[50.6312327062127565,-32.5745953261955492,54.5426463530750425],"rgb":[0.266666666666666663,0.533333333333333326,0.133333333333333331],"xyz":[0.11476318996277414,0.189521976197559061,0.0456683303746188429],"hpluv":[120.846986072134357,159.219643782083125,50.6312327062127565],"hsluv":[120.846986072134357,90.0662104861249,50.6312327062127565]},"#448833":{"lch":[50.775662969350762,58.6076690216783831,123.408487274566809],"luv":[50.775662969350762,-32.2696404838739213,48.9237076599487182],"rgb":[0.266666666666666663,0.533333333333333326,0.2],"xyz":[0.117850940695231873,0.19075707649054216,0.0619304842322299931],"hpluv":[123.408487274566809,146.466455796741883,50.775662969350762],"hsluv":[123.408487274566809,79.8990388198805732,50.775662969350762]},"#448844":{"lch":[50.9830910358637652,52.0733509329185,127.715012949239537],"luv":[50.9830910358637652,-31.855056956676961,41.1933152789351382],"rgb":[0.266666666666666663,0.533333333333333326,0.266666666666666663],"xyz":[0.122308935939450747,0.192540274588229754,0.0854092591851166316],"hpluv":[127.715012949239537,129.607069016793787,50.9830910358637652],"hsluv":[127.715012949239537,65.9930987522981241,50.9830910358637652]},"#448855":{"lch":[51.2585265038955384,44.4350179761376651,134.860489600104756],"luv":[51.2585265038955384,-31.3437036744621551,31.4967151066136601],"rgb":[0.266666666666666663,0.533333333333333326,0.333333333333333315],"xyz":[0.128271349978812732,0.194925240203974587,0.116811306459090533],"hpluv":[134.860489600104756,110.001490313735033,51.2585265038955384],"hsluv":[134.860489600104756,67.3517725464548676,51.2585265038955384]},"#448866":{"lch":[51.6056896491522537,36.7437212642011914,146.829747927558799],"luv":[51.6056896491522537,-30.7562765884277063,20.1035445321824895],"rgb":[0.266666666666666663,0.533333333333333326,0.4],"xyz":[0.135856345752320917,0.197959238513377878,0.156758950866234509],"hpluv":[146.829747927558799,90.3493178961374781,51.6056896491522537],"hsluv":[146.829747927558799,68.9308752248562797,51.6056896491522537]},"#448877":{"lch":[52.0271709342862039,31.0045548915217921,166.266503182991642],"luv":[52.0271709342862039,-30.1181499011556575,7.36067052332227245],"rgb":[0.266666666666666663,0.533333333333333326,0.466666666666666674],"xyz":[0.145170358772522823,0.201684843721458701,0.205812752772632418],"hpluv":[166.266503182991642,75.6196418937204555,52.0271709342862039],"hsluv":[166.266503182991642,70.6726995402934506,52.0271709342862039]},"#448888":{"lch":[52.5245390493459041,30.1341009641634088,192.177050630061],"luv":[52.5245390493459041,-29.456097564679137,-6.35628485662009179],"rgb":[0.266666666666666663,0.533333333333333326,0.533333333333333326],"xyz":[0.156310775874466679,0.206141010562236299,0.264485616176204585],"hpluv":[192.177050630061,72.8006598676027181,52.5245390493459041],"hsluv":[192.177050630061,72.5156967272479847,52.5245390493459041]},"#448899":{"lch":[53.0984315279962118,35.4547108695225,215.690916113393854],"luv":[53.0984315279962118,-28.7954664423823949,-20.6847198484066084],"rgb":[0.266666666666666663,0.533333333333333326,0.6],"xyz":[0.169367739983539378,0.211363796205865456,0.333252293817322465],"hpluv":[215.690916113393854,84.7289026839812,53.0984315279962118],"hsluv":[215.690916113393854,74.4011420122721319,53.0984315279962118]},"#4488aa":{"lch":[53.7486427971268625,45.1587425535104146,231.425064236121358],"luv":[53.7486427971268625,-28.1581765792043193,-35.3048030832715654],"rgb":[0.266666666666666663,0.533333333333333326,0.66666666666666663],"xyz":[0.184425432948791934,0.217386873391966551,0.412556143434321065],"hpluv":[231.425064236121358,106.613859301848393,53.7486427971268625],"hsluv":[231.425064236121358,76.2778611087785,53.7486427971268625]},"#4488bb":{"lch":[54.4742155909258514,57.0545505189943469,241.113543257937238],"luv":[54.4742155909258514,-27.5616516575745152,-49.9557513488787208],"rgb":[0.266666666666666663,0.533333333333333326,0.733333333333333282],"xyz":[0.201563025056128553,0.224241910234901309,0.502814128532962812],"hpluv":[241.113543257937238,132.904176722924205,54.4742155909258514],"hsluv":[241.113543257937238,78.1047803623200707,54.4742155909258514]},"#4488cc":{"lch":[55.273536978614473,69.875332030770025,247.25266296501286],"luv":[55.273536978614473,-27.0185618464256976,-64.4403549195783398],"rgb":[0.266666666666666663,0.533333333333333326,0.8],"xyz":[0.220855400499850307,0.231958860412390111,0.604420639203233],"hpluv":[247.25266296501286,160.415361718249983,55.273536978614473],"hsluv":[247.25266296501286,79.8515774594708603,55.273536978614473]},"#4488dd":{"lch":[56.1444377207636194,82.97891177410213,251.348812353132246],"luv":[56.1444377207636194,-26.53714651812043,-78.6211145551246631],"rgb":[0.266666666666666663,0.533333333333333326,0.866666666666666696],"xyz":[0.242373726050483851,0.240566190632643645,0.717750487103239],"hpluv":[251.348812353132246,187.542769341675751,56.1444377207636194],"hsluv":[251.348812353132246,81.4979766670821,56.1444377207636194]},"#4488ee":{"lch":[57.0842924141545609,96.0325607902411775,254.216059778839536],"luv":[57.0842924141545609,-26.1218678035424112,-92.4115834426919776],"rgb":[0.266666666666666663,0.533333333333333326,0.933333333333333348],"xyz":[0.266185906316658616,0.25009106273911369,0.843161303171762189],"hpluv":[254.216059778839536,213.472145126724115,57.0842924141545609],"hsluv":[254.216059778839536,85.8050168900109469,57.0842924141545609]},"#4488ff":{"lch":[58.090117466996233,108.861046277687535,256.304473865935392],"luv":[58.090117466996233,-25.7741898685227575,-105.765866579412872],"rgb":[0.266666666666666663,0.533333333333333326,1],"xyz":[0.29235695472649,0.260559482103046358,0.980995491463544],"hpluv":[256.304473865935392,237.798754650411269,58.090117466996233],"hsluv":[256.304473865935392,99.9999999999988631,58.090117466996233]},"#449900":{"lch":[56.0984423000037538,78.159424491283,120.852962610827774],"luv":[56.0984423000037538,-40.0830169860907191,67.0987882610508279],"rgb":[0.266666666666666663,0.6,0],"xyz":[0.137745766777127493,0.240106367647249075,0.0390865393647062687],"hpluv":[120.852962610827774,176.794958777624345,56.0984423000037538],"hsluv":[120.852962610827774,100.000000000002416,56.0984423000037538]},"#449911":{"lch":[56.1389235634784143,76.6482268999804859,121.431666795625887],"luv":[56.1389235634784143,-39.9706170908808929,65.4010738159938256],"rgb":[0.266666666666666663,0.6,0.0666666666666666657],"xyz":[0.138757432276764625,0.240511033847103928,0.0444146443294619],"hpluv":[121.431666795625887,173.251641588156104,56.1389235634784143],"hsluv":[121.431666795625887,97.2234127009916,56.1389235634784143]},"#449922":{"lch":[56.21384509356389,73.9109075723002746,122.549403254372123],"luv":[56.21384509356389,-39.7660359546788555,62.3015621201611793],"rgb":[0.266666666666666663,0.6,0.133333333333333331],"xyz":[0.140632790415241626,0.241261177102494756,0.0542915305254411],"hpluv":[122.549403254372123,166.841685682494415,56.21384509356389],"hsluv":[122.549403254372123,92.1627352690631,56.21384509356389]},"#449933":{"lch":[56.3368647095541064,69.5846668696270143,124.526315047954697],"luv":[56.3368647095541064,-39.4395235157555177,57.3284383897480296],"rgb":[0.266666666666666663,0.6,0.2],"xyz":[0.143720541147699388,0.242496277395477855,0.0705536843830522342],"hpluv":[124.526315047954697,156.73291295139785,56.3368647095541064],"hsluv":[124.526315047954697,84.0665441712718859,56.3368647095541064]},"#449944":{"lch":[56.5137417426914368,63.7361451042890153,127.715012949239735],"luv":[56.5137417426914368,-38.9895886498958575,50.4193233757345922],"rgb":[0.266666666666666663,0.6,0.266666666666666663],"xyz":[0.148178536391918247,0.244279475493165449,0.0940324593359388727],"hpluv":[127.715012949239735,143.110354253444,56.5137417426914368],"hsluv":[127.715012949239735,72.8686777069245,56.5137417426914368]},"#449955":{"lch":[56.7489681974646629,56.6620380577650309,132.698160989074609],"luv":[56.7489681974646629,-38.4245724364924328,41.642992086692793],"rgb":[0.266666666666666663,0.6,0.333333333333333315],"xyz":[0.154140950431280233,0.246664441108910282,0.125434506609912788],"hpluv":[132.698160989074609,126.69910537289924,56.7489681974646629],"hsluv":[132.698160989074609,73.7405349232989664,56.7489681974646629]},"#449966":{"lch":[57.0460268500437166,48.9673458777373511,140.456743036678859],"luv":[57.0460268500437166,-37.7608817984154683,31.1755796757022061],"rgb":[0.266666666666666663,0.6,0.4],"xyz":[0.161725946204788418,0.249698439418313572,0.16538215101705675],"hpluv":[140.456743036678859,108.923224533285605,57.0460268500437166],"hsluv":[140.456743036678859,74.7718537787272766,57.0460268500437166]},"#449977":{"lch":[57.4075272841014481,41.7361359201695734,152.500832231763781],"luv":[57.4075272841014481,-37.0206846158697,19.2710651526888199],"rgb":[0.266666666666666663,0.6,0.466666666666666674],"xyz":[0.171039959224990323,0.253424044626394396,0.214435952923454659],"hpluv":[152.500832231763781,92.2534727828265915,57.4075272841014481],"hsluv":[152.500832231763781,75.9325502249844817,57.4075272841014481]},"#449988":{"lch":[57.8352917232380861,36.7607331244742284,170.245603374965924],"luv":[57.8352917232380861,-36.2292854489646174,6.22819200942437323],"rgb":[0.266666666666666663,0.6,0.533333333333333326],"xyz":[0.182180376326934179,0.257880211467172,0.273108816327026827],"hpluv":[170.245603374965924,80.6548633994409414,57.8352917232380861],"hsluv":[170.245603374965924,77.1878957355486222,57.8352917232380861]},"#449999":{"lch":[58.3304201548299517,36.2276744984656105,192.17705063006116],"luv":[58.3304201548299517,-35.4125684996312486,-7.64162232943372643],"rgb":[0.266666666666666663,0.6,0.6],"xyz":[0.195237340436006879,0.263102997110801151,0.341875493968144761],"hpluv":[192.17705063006116,78.8106081595615251,58.3304201548299517],"hsluv":[192.17705063006116,78.5021203184449803,58.3304201548299517]},"#4499aa":{"lch":[58.8933484328044585,41.0197173156303379,212.502133513081617],"luv":[58.8933484328044585,-34.5948579745346478,-22.041166266239177],"rgb":[0.266666666666666663,0.6,0.66666666666666663],"xyz":[0.210295033401259435,0.269126074296902273,0.421179343585143307],"hpluv":[212.502133513081617,88.3823902117899536,58.8933484328044585],"hsluv":[212.502133513081617,79.8414276244135692,58.8933484328044585]},"#4499bb":{"lch":[59.523905851944221,49.8962585520308082,227.36281958486083],"luv":[59.523905851944221,-33.7974051546762055,-36.7065664738854878],"rgb":[0.266666666666666663,0.6,0.733333333333333282],"xyz":[0.227432625508596054,0.275981111139837032,0.511437328683785108],"hpluv":[227.36281958486083,106.36919851968392,59.523905851944221],"hsluv":[227.36281958486083,81.1761313086710885,59.523905851944221]},"#4499cc":{"lch":[60.2213749252976385,61.1171242450200438,237.278146949597897],"luv":[60.2213749252976385,-33.0375484580145766,-51.4181219791773],"rgb":[0.266666666666666663,0.6,0.8],"xyz":[0.246725000952317808,0.283698061317325834,0.613043839354055264],"hpluv":[237.278146949597897,128.780934100622716,60.2213749252976385],"hsluv":[237.278146949597897,82.4818489079811741,60.2213749252976385]},"#4499dd":{"lch":[60.9845539619455508,73.4958381074912,243.904542785491344],"luv":[60.9845539619455508,-32.3284648877968195,-66.0038527445257728],"rgb":[0.266666666666666663,0.6,0.866666666666666696],"xyz":[0.268243326502951351,0.29230539153757934,0.726373687254061262],"hpluv":[243.904542785491344,152.926314240713424,60.9845539619455508],"hsluv":[243.904542785491344,83.7398679369964469,60.9845539619455508]},"#4499ee":{"lch":[61.8118218103912653,86.3580647779335351,248.479300934605874],"luv":[61.8118218103912653,-31.6793620640961606,-80.3376211460214193],"rgb":[0.266666666666666663,0.6,0.933333333333333348],"xyz":[0.292055506769126061,0.301830263644049357,0.851784503322584485],"hpluv":[248.479300934605874,177.284466220706,61.8118218103912653],"hsluv":[248.479300934605874,84.9368954206658344,61.8118218103912653]},"#4499ff":{"lch":[62.7012034705467585,99.3269113509348,251.755860244601337],"luv":[62.7012034705467585,-31.0959452870692914,-94.3338619225358173],"rgb":[0.266666666666666663,0.6,1],"xyz":[0.318226555178957482,0.312298683007982081,0.98961869161436633],"hpluv":[251.755860244601337,201.015886170810859,62.7012034705467585],"hsluv":[251.755860244601337,99.9999999999986073,62.7012034705467585]},"#330000":{"lch":[6.35863201887414942,21.3842798011123882,12.1770506300617836],"luv":[6.35863201887414942,20.9031433498234946,4.51065635013277699],"rgb":[0.2,0,0],"xyz":[0.0136521011456799905,0.00703936465324139522,0.000639942241203736136],"hpluv":[12.1770506300617836,426.746789183125031,6.35863201887414942],"hsluv":[12.1770506300617836,100.000000000002217,6.35863201887414942]},"#330011":{"lch":[6.72416549840036915,18.2596394021459751,358.956333183931122],"luv":[6.72416549840036915,18.2566101970553,-0.332588648601129133],"rgb":[0.2,0,0.0666666666666666657],"xyz":[0.0146637666453171122,0.00744403085309625,0.00596804720595936738],"hpluv":[358.956333183931122,344.582429927088697,6.72416549840036915],"hsluv":[358.956333183931122,99.9999999999970868,6.72416549840036915]},"#330022":{"lch":[7.4017671226143058,16.6083885778583671,334.642609555635659],"luv":[7.4017671226143058,15.0082373074967617,-7.11276205668364714],"rgb":[0.2,0,0.133333333333333331],"xyz":[0.0165391247837941326,0.00819417410848706854,0.0158449334019385643],"hpluv":[334.642609555635659,284.728805881674077,7.4017671226143058],"hsluv":[334.642609555635659,99.999999999998,7.4017671226143058]},"#330033":{"lch":[8.50665746950019,19.3767863388894384,307.715012949243601],"luv":[8.50665746950019,11.8534455994177517,-15.3282639670843448],"rgb":[0.2,0,0.2],"xyz":[0.0196268755162518696,0.00942927440147018139,0.0321070872595497075],"hpluv":[307.715012949243601,289.042783730483279,8.50665746950019],"hsluv":[307.715012949243601,99.9999999999987921,8.50665746950019]},"#330044":{"lch":[9.96321399083228343,25.9151774110163871,290.632214162589],"luv":[9.96321399083228343,9.13167627644372,-24.2530185467023678],"rgb":[0.2,0,0.266666666666666663],"xyz":[0.0240848707604707502,0.0112124724991577579,0.0555858622124363461],"hpluv":[290.632214162589,330.060881015257678,9.96321399083228343],"hsluv":[290.632214162589,99.9999999999994,9.96321399083228343]},"#330055":{"lch":[11.6870713271151807,34.2775786608295405,281.502617436257196],"luv":[11.6870713271151807,6.83538450996046,-33.589133919325],"rgb":[0.2,0,0.333333333333333315],"xyz":[0.0300472847998327422,0.0135974381149025891,0.0869879094864102614],"hpluv":[281.502617436257196,372.172061509357604,11.6870713271151807],"hsluv":[281.502617436257196,99.9999999999999289,11.6870713271151807]},"#330066":{"lch":[13.6097387714237676,43.4818398400869768,276.434806151814087],"luv":[13.6097387714237676,4.87312317733106592,-43.2079051375733059],"rgb":[0.2,0,0.4],"xyz":[0.0376322805733409205,0.0166314364243059024,0.126935553893554209],"hpluv":[276.434806151814087,405.412793254212261,13.6097387714237676],"hsluv":[276.434806151814087,100.00000000000027,13.6097387714237676]},"#330077":{"lch":[15.6735112457106673,53.108485659557914,273.408523183706109],"luv":[15.6735112457106673,3.15755804167271537,-53.0145364618510655],"rgb":[0.2,0,0.466666666666666674],"xyz":[0.046946293593542833,0.0203570416323867187,0.175989355799952119],"hpluv":[273.408523183706109,429.968801903614121,15.6735112457106673],"hsluv":[273.408523183706109,100.000000000000313,15.6735112457106673]},"#330088":{"lch":[17.8339183845063687,62.9511834901283365,271.47985970994057],"luv":[17.8339183845063687,1.62574911173865799,-62.9301870538574448],"rgb":[0.2,0,0.533333333333333326],"xyz":[0.058086710695486661,0.0248132084731643096,0.234662219203524286],"hpluv":[271.47985970994057,447.91587095992594,17.8339183845063687],"hsluv":[271.47985970994057,100.000000000000441,17.8339183845063687]},"#330099":{"lch":[20.0583065104412341,72.8932825114363,270.184356583024851],"luv":[20.0583065104412341,0.234543162084408924,-72.8929051746271313],"rgb":[0.2,0,0.6],"xyz":[0.0711436748045593814,0.0300359941167934706,0.303428896844642193],"hpluv":[270.184356583024851,461.139761646516433,20.0583065104412341],"hsluv":[270.184356583024851,100.000000000000625,20.0583065104412341]},"#3300aa":{"lch":[22.3232943619689834,82.8637729479105474,269.276671227287579],"luv":[22.3232943619689834,-1.04608331699459467,-82.8571697371855578],"rgb":[0.2,0,0.66666666666666663],"xyz":[0.0862013677698119235,0.0360590713028945756,0.382732746461640794],"hpluv":[269.276671227287579,471.026936966419044,22.3232943619689834],"hsluv":[269.276671227287579,100.000000000000554,22.3232943619689834]},"#3300bb":{"lch":[24.6123405885396807,92.8181896970849,268.61855571411644],"luv":[24.6123405885396807,-2.23769945956788,-92.7912120826788538],"rgb":[0.2,0,0.733333333333333282],"xyz":[0.10333895987714857,0.0429141081458293341,0.47299073156028254],"hpluv":[268.61855571411644,478.541387025058441,24.6123405885396807],"hsluv":[268.61855571411644,100.000000000000625,24.6123405885396807]},"#3300cc":{"lch":[26.9138017967000778,102.728605647013808,268.127719933063759],"luv":[26.9138017967000778,-3.35631165306985224,-102.673762910819349],"rgb":[0.2,0,0.8],"xyz":[0.122631335320870311,0.0506310583233181358,0.574597242230552752],"hpluv":[268.127719933063759,484.345947247320225,26.9138017967000778],"hsluv":[268.127719933063759,100.000000000000881,26.9138017967000778]},"#3300dd":{"lch":[29.2194977691074271,112.577730384171886,267.752877980499],"luv":[29.2194977691074271,-4.41413050162269105,-112.49115889867052],"rgb":[0.2,0,0.866666666666666696],"xyz":[0.144149660871503854,0.0592383885435716698,0.687927090130558749],"hpluv":[267.752877980499,488.89890937186334,29.2194977691074271],"hsluv":[267.752877980499,100.000000000000753,29.2194977691074271]},"#3300ee":{"lch":[31.5236887929336334,122.355215968494591,267.460804758990776],"luv":[31.5236887929336334,-5.42068013199621,-122.235081304851008],"rgb":[0.2,0,0.933333333333333348],"xyz":[0.167961841137678591,0.0687632606500417,0.813337906199082],"hpluv":[267.460804758990776,492.52103452607281,31.5236887929336334],"hsluv":[267.460804758990776,100.000000000000824,31.5236887929336334]},"#3300ff":{"lch":[33.8223579343154,132.055276159319874,267.229255072945307],"luv":[33.8223579343154,-6.38352242786170443,-131.900896899631505],"rgb":[0.2,0,1],"xyz":[0.194132889547509985,0.0792316800139744,0.951172094490863818],"hpluv":[267.229255072945307,495.440155164142311,33.8223579343154],"hsluv":[267.229255072945307,100.000000000000881,33.8223579343154]},"#331100":{"lch":[9.83576796362177319,19.9321083570360571,25.9770166386959609],"luv":[9.83576796362177319,17.918363864654,8.73047421223431108],"rgb":[0.2,0.0666666666666666657,0],"xyz":[0.0156565014066084,0.0110481651750982679,0.00130807566151318702],"hpluv":[25.9770166386959609,257.148675223584291,9.83576796362177319],"hsluv":[25.9770166386959609,100.000000000002302,9.83576796362177319]},"#331111":{"lch":[10.1474261289244687,16.4836545456174051,12.1770506300618813],"luv":[10.1474261289244687,16.1127799065782149,3.4769513746129066],"rgb":[0.2,0.0666666666666666657,0.0666666666666666657],"xyz":[0.0166681669062455212,0.0114528313749531225,0.00663618062626881826],"hpluv":[12.1770506300618813,206.127972902374523,10.1474261289244687],"hsluv":[12.1770506300618813,48.3021731216650707,10.1474261289244687]},"#331122":{"lch":[10.7062693823806221,14.2435433110065777,342.375847990242676],"luv":[10.7062693823806221,13.5749958919169824,-4.31254131423193],"rgb":[0.2,0.0666666666666666657,0.133333333333333331],"xyz":[0.0185435250447225398,0.0122029746303439404,0.0165130668222480161],"hpluv":[342.375847990242676,168.818174775843545,10.7062693823806221],"hsluv":[342.375847990242676,57.1044970617697913,10.7062693823806221]},"#331133":{"lch":[11.5784810016780177,17.5377888786733784,307.715012949244169],"luv":[11.5784810016780177,10.7284677021084427,-13.8735006223280077],"rgb":[0.2,0.0666666666666666657,0.2],"xyz":[0.0216312757771802804,0.0134380749233270532,0.0327752206798591628],"hpluv":[307.715012949244169,192.204068690519591,11.5784810016780177],"hsluv":[307.715012949244169,66.4967539441281,11.5784810016780177]},"#331144":{"lch":[12.7480449023252049,25.2894553184220108,288.641508688419037],"luv":[12.7480449023252049,8.08366941467993172,-23.9626968243691536],"rgb":[0.2,0.0666666666666666657,0.266666666666666663],"xyz":[0.0260892710213991574,0.0152212730210146297,0.0562539956327458],"hpluv":[288.641508688419037,251.73014018207067,12.7480449023252049],"hsluv":[288.641508688419037,74.5439781366083309,12.7480449023252049]},"#331155":{"lch":[14.1772863520069095,34.570642435857458,279.659572498507771],"luv":[14.1772863520069095,5.80074057604611415,-34.0805036230000695],"rgb":[0.2,0.0666666666666666657,0.333333333333333315],"xyz":[0.0320516850607611564,0.0176062386367594609,0.0876560429067197],"hpluv":[279.659572498507771,309.423764447612427,14.1772863520069095],"hsluv":[279.659572498507771,80.733364837348816,14.1772863520069095]},"#331166":{"lch":[15.8197098676790517,44.2946391552180785,274.993838621827194],"luv":[15.8197098676790517,3.85578699555013271,-44.1264995726595686],"rgb":[0.2,0.0666666666666666657,0.4],"xyz":[0.0396366808342693278,0.0206402369461627724,0.127603687313863678],"hpluv":[274.993838621827194,355.297359803625511,15.8197098676790517],"hsluv":[274.993838621827194,85.2848648605675095,15.8197098676790517]},"#331177":{"lch":[17.6293493428787755,54.1580116435351115,272.303494486185969],"luv":[17.6293493428787755,2.17675853502087469,-54.1142490242773135],"rgb":[0.2,0.0666666666666666657,0.466666666666666674],"xyz":[0.0489506938544712472,0.0243658421542435888,0.176657489220261588],"hpluv":[272.303494486185969,389.821469213037517,17.6293493428787755],"hsluv":[272.303494486185969,88.5936990192462588,17.6293493428787755]},"#331188":{"lch":[19.5658128626021437,64.0679547566568,270.623065923527406],"luv":[19.5658128626021437,0.696696562564985133,-64.064166587888522],"rgb":[0.2,0.0666666666666666657,0.533333333333333326],"xyz":[0.0600911109564150753,0.0288220089950211832,0.235330352623833755],"hpluv":[270.623065923527406,415.51077593183,19.5658128626021437],"hsluv":[270.623065923527406,91.0112456871911348,19.5658128626021437]},"#331199":{"lch":[21.5959931816331263,73.9854871429769645,269.508319412823],"luv":[21.5959931816331263,-0.634894604710849,-73.9827629696574576],"rgb":[0.2,0.0666666666666666657,0.6],"xyz":[0.0731480750654877887,0.0340447946386503442,0.304097030264951662],"hpluv":[269.508319412823,434.723064450461493,21.5959931816331263],"hsluv":[269.508319412823,92.7998436287799,21.5959931816331263]},"#3311aa":{"lch":[23.6938673935249824,83.8866252842298792,268.733700318675346],"luv":[23.6938673935249824,-1.85383566080119344,-83.8661385478044821],"rgb":[0.2,0.0666666666666666657,0.66666666666666663],"xyz":[0.0882057680307403308,0.0400678718247514457,0.383400879881950263],"hpluv":[268.733700318675346,449.258286440651602,23.6938673935249824],"hsluv":[268.733700318675346,94.1436997610677,23.6938673935249824]},"#3311bb":{"lch":[25.8394818705352094,93.7535423490500079,268.175268957576],"luv":[25.8394818705352094,-2.98531729009247,-93.7060007879569525],"rgb":[0.2,0.0666666666666666657,0.733333333333333282],"xyz":[0.105343360138076977,0.0469229086676862042,0.473658864980592],"hpluv":[268.175268957576,460.408371224539451,25.8394818705352094],"hsluv":[268.175268957576,95.1697562295976525,25.8394818705352094]},"#3311cc":{"lch":[28.017750605254669,103.572636018550753,267.760492630427507],"luv":[28.017750605254669,-4.04728980779695124,-103.493528189171812],"rgb":[0.2,0.0666666666666666657,0.8],"xyz":[0.124635735581798718,0.0546398588451750059,0.57526537565086211],"hpluv":[267.760492630427507,469.084508820223505,28.017750605254669],"hsluv":[267.760492630427507,95.9655004656031423,28.017750605254669]},"#3311dd":{"lch":[30.2173526676312889,113.33386550323506,267.444704079349265],"luv":[30.2173526676312889,-5.05282540459801588,-113.221173043455181],"rgb":[0.2,0.0666666666666666657,0.866666666666666696],"xyz":[0.146154061132432261,0.0632471890654285329,0.688595223550868107],"hpluv":[267.444704079349265,475.929488946899937,30.2173526676312889],"hsluv":[267.444704079349265,96.591763702558211,30.2173526676312889]},"#3311ee":{"lch":[32.429822932533412,123.030197380053124,267.199217974228532],"luv":[32.429822932533412,-6.01167404447580456,-122.883234180085807],"rgb":[0.2,0.0666666666666666657,0.933333333333333348],"xyz":[0.169966241398607,0.0727720611718985777,0.814006039619391331],"hpluv":[267.199217974228532,481.400425551936735,32.429822932533412],"hsluv":[267.199217974228532,97.0913881744298095,32.429822932533412]},"#3311ff":{"lch":[34.6488414224811834,132.657034918193688,267.004954598207064],"luv":[34.6488414224811834,-6.93127707868383425,-132.475832933200962],"rgb":[0.2,0.0666666666666666657,1],"xyz":[0.196137289808438392,0.0832404805358312738,0.951840227911173176],"hpluv":[267.004954598207064,485.826158631145177,34.6488414224811834],"hsluv":[267.004954598207064,99.999999999999531,34.6488414224811834]},"#88aa00":{"lch":[64.9493872277699467,75.8454165204624502,102.522158340464031],"luv":[64.9493872277699467,-16.4445883060260414,74.0412231301438624],"rgb":[0.533333333333333326,0.66666666666666663,0],"xyz":[0.245272120749672057,0.339833923051985953,0.0526729261635559762],"hpluv":[102.522158340464031,148.181371186867864,64.9493872277699467],"hsluv":[102.522158340464031,100.000000000002217,64.9493872277699467]},"#88aa11":{"lch":[64.9815053546997206,74.514883993558044,102.764001416735823],"luv":[64.9815053546997206,-16.4630035423646639,72.6734989589568414],"rgb":[0.533333333333333326,0.66666666666666663,0.0666666666666666657],"xyz":[0.246283786249309189,0.340238589251840806,0.0580010311283116059],"hpluv":[102.764001416735823,145.509915409181133,64.9815053546997206],"hsluv":[102.764001416735823,98.0498740713468635,64.9815053546997206]},"#88aa22":{"lch":[65.040976504183746,72.0784265262596762,103.230826782560158],"luv":[65.040976504183746,-16.4969246852166869,70.1651697527462801],"rgb":[0.533333333333333326,0.66666666666666663,0.133333333333333331],"xyz":[0.24815914438778619,0.340988732507231607,0.0678779173242908],"hpluv":[103.230826782560158,140.623392494363173,65.040976504183746],"hsluv":[103.230826782560158,94.4776072436414296,65.040976504183746]},"#88aa33":{"lch":[65.138705174337673,68.1506383708936596,104.056367163177015],"luv":[65.138705174337673,-16.5521781693680836,66.1100212389152],"rgb":[0.533333333333333326,0.66666666666666663,0.2],"xyz":[0.251246895120243952,0.342223832800214733,0.0841400711819019487],"hpluv":[104.056367163177015,132.760883332008575,65.138705174337673],"hsluv":[104.056367163177015,88.7139905695652544,65.138705174337673]},"#88aa44":{"lch":[65.2793887406011,62.6606585185119442,105.391240881396499],"luv":[65.2793887406011,-16.6306856640551395,60.4133960336360687],"rgb":[0.533333333333333326,0.66666666666666663,0.266666666666666663],"xyz":[0.255704890364462811,0.344007030897902299,0.107618846134788587],"hpluv":[105.391240881396499,121.803060858356815,65.2793887406011],"hsluv":[105.391240881396499,80.6421361820775,65.2793887406011]},"#88aa55":{"lch":[65.4667902277309821,55.6467221212728731,107.50018297907917],"luv":[65.4667902277309821,-16.7334615527701551,53.0711687011330397],"rgb":[0.533333333333333326,0.66666666666666663,0.333333333333333315],"xyz":[0.261667304403824796,0.34639199651364716,0.139020893408762503],"hpluv":[107.50018297907917,107.859366541167589,65.4667902277309821],"hsluv":[107.50018297907917,70.2829236383929157,65.4667902277309821]},"#88aa66":{"lch":[65.7039511656785606,47.2674293485405386,110.898270106627507],"luv":[65.7039511656785606,-16.8607549547505542,44.1579530727492582],"rgb":[0.533333333333333326,0.66666666666666663,0.4],"xyz":[0.269252300177333,0.349425994823050479,0.178968537815906464],"hpluv":[110.898270106627507,91.2871867148882075,65.7039511656785606],"hsluv":[110.898270106627507,57.7776943224234358,65.7039511656785606]},"#88aa77":{"lch":[65.993303036365262,37.8517489546572605,116.707912668539493],"luv":[65.993303036365262,-17.0121797895697142,33.8133204186420073],"rgb":[0.533333333333333326,0.66666666666666663,0.466666666666666674],"xyz":[0.278566313197534887,0.353151600031131274,0.228022339722304374],"hpluv":[116.707912668539493,72.782239014817236,65.993303036365262],"hsluv":[116.707912668539493,43.3670204896631262,65.993303036365262]},"#88aa88":{"lch":[66.3367341259492,28.0952907790087707,127.715012949235486],"luv":[66.3367341259492,-17.1868541575625393,22.2251526006848934],"rgb":[0.533333333333333326,0.66666666666666663,0.533333333333333326],"xyz":[0.289706730299478743,0.357607766871908872,0.286695203125876541],"hpluv":[127.715012949235486,53.7426121206727316,66.3367341259492],"hsluv":[127.715012949235486,27.3645684281827677,66.3367341259492]},"#88aa99":{"lch":[66.7356352778598705,19.8636867466165334,151.061783220075199],"luv":[66.7356352778598705,-17.3835461247401071,9.6113669837720046],"rgb":[0.533333333333333326,0.66666666666666663,0.6],"xyz":[0.302763694408551443,0.36283055251553803,0.35546188076699442],"hpluv":[151.061783220075199,37.7695130125235536,66.7356352778598705],"hsluv":[151.061783220075199,30.5390729913306274,66.7356352778598705]},"#88aaaa":{"lch":[67.1909358184889811,18.0059400546344968,192.177050630060364],"luv":[67.1909358184889811,-17.6008146924254447,-3.79805205519771905],"rgb":[0.533333333333333326,0.66666666666666663,0.66666666666666663],"xyz":[0.317821387373804,0.368853629701639152,0.434765730383993],"hpluv":[192.177050630060364,34.0051297749840913,67.1909358184889811],"hsluv":[192.177050630060364,33.872023720911649,67.1909358184889811]},"#88aabb":{"lch":[67.7031355134684674,25.1829477340388976,224.903065382651],"luv":[67.7031355134684674,-17.8371340556046292,-17.7768812016541453],"rgb":[0.533333333333333326,0.66666666666666663,0.733333333333333282],"xyz":[0.334958979481140617,0.37570866654457391,0.525023715482634823],"hpluv":[224.903065382651,47.1994684953027459,67.7031355134684674],"hsluv":[224.903065382651,37.296330310174362,67.7031355134684674]},"#88aacc":{"lch":[68.2723356589922901,36.8600300209604939,240.606662797769701],"luv":[68.2723356589922901,-18.0909926283411373,-32.1150712106857341],"rgb":[0.533333333333333326,0.66666666666666663,0.8],"xyz":[0.354251354924862372,0.383425616722062712,0.626630226152905],"hpluv":[240.606662797769701,68.5094136262693,68.2723356589922901],"hsluv":[240.606662797769701,40.7502319604911136,68.2723356589922901]},"#88aadd":{"lch":[68.8982708583434,50.1120766914241216,248.506358436024811],"luv":[68.8982708583434,-18.3609632112572676,-46.6271944285953168],"rgb":[0.533333333333333326,0.66666666666666663,0.866666666666666696],"xyz":[0.375769680475495915,0.392032946942316218,0.739960074052911],"hpluv":[248.506358436024811,92.2939864083951278,68.8982708583434],"hsluv":[248.506358436024811,59.5109742880650217,68.8982708583434]},"#88aaee":{"lch":[69.5803420919898,63.9362726255054454,253.044423586561948],"luv":[69.5803420919898,-18.6457452648911577,-61.1570367231747554],"rgb":[0.533333333333333326,0.66666666666666663,0.933333333333333348],"xyz":[0.39958186074167068,0.401557819048786235,0.8653708901214342],"hpluv":[253.044423586561948,116.600410917186778,69.5803420919898],"hsluv":[253.044423586561948,79.2673662112875093,69.5803420919898]},"#88aaff":{"lch":[70.3176511000829549,77.916964899147743,255.928474825822],"luv":[70.3176511000829549,-18.9441834980668631,-75.578907974954177],"rgb":[0.533333333333333326,0.66666666666666663,1],"xyz":[0.425752909151502046,0.412026238412718959,1.00320507841321604],"hpluv":[255.928474825822,140.607018245256825,70.3176511000829549],"hsluv":[255.928474825822,99.9999999999979394,70.3176511000829549]},"#332200":{"lch":[14.6681357538016819,18.4720509904151484,54.0318728094203635],"luv":[14.6681357538016819,10.8492842291989344,14.9502407842332925],"rgb":[0.2,0.133333333333333331,0],"xyz":[0.0193721251413763347,0.0184794126446342424,0.00254661690643579732],"hpluv":[54.0318728094203635,159.801011716648361,14.6681357538016819],"hsluv":[54.0318728094203635,100.000000000002359,14.6681357538016819]},"#332211":{"lch":[14.8903804788128475,14.003495227987683,44.8263438888978243],"luv":[14.8903804788128475,9.93193249146711,9.87190941941900668],"rgb":[0.2,0.133333333333333331,0.0666666666666666657],"xyz":[0.0203837906410134564,0.0188840788444890953,0.00787472187119143],"hpluv":[44.8263438888978243,119.33558852926538,14.8903804788128475],"hsluv":[44.8263438888978243,67.0844803779226595,14.8903804788128475]},"#332222":{"lch":[15.2941064614028619,8.70381909014442101,12.1770506300622809],"luv":[15.2941064614028619,8.50798716741232397,1.83592513820952408],"rgb":[0.2,0.133333333333333331,0.133333333333333331],"xyz":[0.0222591487794904751,0.0196342220998799166,0.0177516080671706253],"hpluv":[12.1770506300622809,72.2146104972558476,15.2941064614028619],"hsluv":[12.1770506300622809,16.9221215783466867,15.2941064614028619]},"#332233":{"lch":[15.9369990430381634,10.9638268591401484,307.7150129492465],"luv":[15.9369990430381634,6.70694938589646661,-8.67308072902737],"rgb":[0.2,0.133333333333333331,0.2],"xyz":[0.0253468995119482156,0.0208693223928630295,0.0340137619247817685],"hpluv":[307.7150129492465,87.2961214462547,15.9369990430381634],"hsluv":[307.7150129492465,30.2017993044426838,15.9369990430381634]},"#332244":{"lch":[16.8218835175385664,20.7382675483863608,283.478697838556343],"luv":[16.8218835175385664,4.83375477674434428,-20.1670661145035197],"rgb":[0.2,0.133333333333333331,0.266666666666666663],"xyz":[0.0298048947561670927,0.0226525204905506025,0.057492536877668407],"hpluv":[283.478697838556343,156.436171283708973,16.8218835175385664],"hsluv":[283.478697838556343,43.2894908809756558,16.8218835175385664]},"#332255":{"lch":[17.9355503164319856,31.8518286021958055,275.537546938931484],"luv":[17.9355503164319856,3.0736387963894658,-31.7031816992078603],"rgb":[0.2,0.133333333333333331,0.333333333333333315],"xyz":[0.0357673087955290847,0.0250374861062954354,0.0888945841516423224],"hpluv":[275.537546938931484,225.350740722061715,17.9355503164319856],"hsluv":[275.537546938931484,54.6600619512456092,17.9355503164319856]},"#332266":{"lch":[19.2543827660255502,42.9346801988288,271.988815040461645],"luv":[19.2543827660255502,1.49002234071320738,-42.9088172430781114],"rgb":[0.2,0.133333333333333331,0.4],"xyz":[0.043352304569037263,0.028071484415698747,0.12884222855878627],"hpluv":[271.988815040461645,282.955381276792764,19.2543827660255502],"hsluv":[271.988815040461645,63.8744485302889515,19.2543827660255502]},"#332277":{"lch":[20.7496984269819,53.7295137018198687,270.083996688769219],"luv":[20.7496984269819,0.0787684479011579453,-53.7294559637975908],"rgb":[0.2,0.133333333333333331,0.466666666666666674],"xyz":[0.0526663175892391755,0.0317970896237795633,0.17789603046518418],"hpluv":[270.083996688769219,328.579487011522247,20.7496984269819],"hsluv":[270.083996688769219,71.0892762838988546,20.7496984269819]},"#332288":{"lch":[22.3919640579388926,64.2366699579867,268.940142222195846],"luv":[22.3919640579388926,-1.18818265954209568,-64.2256801385464087],"rgb":[0.2,0.133333333333333331,0.533333333333333326],"xyz":[0.063806734691183,0.0362532564645571542,0.236568893868756347],"hpluv":[268.940142222195846,364.024117005976393,22.3919640579388926],"hsluv":[268.940142222195846,76.6637840765232426,22.3919640579388926]},"#332299":{"lch":[24.1535324867621668,74.5121507797046689,268.199285594367666],"luv":[24.1535324867621668,-2.34141182983712737,-74.4753543426316469],"rgb":[0.2,0.133333333333333331,0.6],"xyz":[0.076863698800255717,0.0414760421081863187,0.305335571509874282],"hpluv":[268.199285594367666,391.458538227207669,24.1535324867621668],"hsluv":[268.199285594367666,80.9654036049547301,24.1535324867621668]},"#3322aa":{"lch":[26.0100477302332607,84.6098540849434926,267.692459882235937],"luv":[26.0100477302332607,-3.40667075751279169,-84.541244387726735],"rgb":[0.2,0.133333333333333331,0.66666666666666663],"xyz":[0.0919213917655082591,0.0474991192942874202,0.384639421126872882],"hpluv":[267.692459882235937,412.780453116303818,26.0100477302332607],"hsluv":[267.692459882235937,84.3023702715129,26.0100477302332607]},"#3322bb":{"lch":[27.9408960039881222,94.5690254119923281,267.330995248517297],"luv":[27.9408960039881222,-4.40370835341661504,-94.4664380619492761],"rgb":[0.2,0.133333333333333331,0.733333333333333282],"xyz":[0.109058983872844906,0.0543541561372221788,0.474897406225514629],"hpluv":[267.330995248517297,429.484911570580266,27.9408960039881222],"hsluv":[267.330995248517297,86.9134730370406743,27.9408960039881222]},"#3322cc":{"lch":[29.9290875828623939,104.415306333233346,267.064581258752071],"luv":[29.9290875828623939,-5.34714045276937444,-104.278302084572317],"rgb":[0.2,0.133333333333333331,0.8],"xyz":[0.12835135931656666,0.0620711063147109804,0.576503916895784729],"hpluv":[267.064581258752071,442.700503900749,29.9290875828623939],"hsluv":[267.064581258752071,88.9774620844202389,29.9290875828623939]},"#3322dd":{"lch":[31.9608605817263296,114.164622106097937,266.862904678446171],"luv":[31.9608605817263296,-6.2476920173399213,-113.993540541052639],"rgb":[0.2,0.133333333333333331,0.866666666666666696],"xyz":[0.149869684867200204,0.0706784365349645144,0.689833764795790727],"hpluv":[266.862904678446171,453.265229710644405,31.9608605817263296],"hsluv":[266.862904678446171,90.6264253960307826,31.9608605817263296]},"#3322ee":{"lch":[34.0251904593745635,123.826689560879501,266.706806867468629],"luv":[34.0251904593745635,-7.11327635006579229,-123.622208147136817],"rgb":[0.2,0.133333333333333331,0.933333333333333348],"xyz":[0.173681865133374941,0.0802033086414345453,0.815244580864314],"hpluv":[266.706806867468629,461.799038215803307,34.0251904593745635],"hsluv":[266.706806867468629,93.6430785136650741,34.0251904593745635]},"#3322ff":{"lch":[36.1133053940478774,133.407509730883817,266.583697157343806],"luv":[36.1133053940478774,-7.94980801741223875,-133.170432923686747],"rgb":[0.2,0.133333333333333331,1],"xyz":[0.199852913543206334,0.0906717280053672414,0.953078769156095795],"hpluv":[266.583697157343806,468.761962088723578,36.1133053940478774],"hsluv":[266.583697157343806,99.999999999999531,36.1133053940478774]},"#aaaa00":{"lch":[67.4983691984715506,74.4102446110960472,85.8743202181747449],"luv":[67.4983691984715506,5.35340686476390193,74.217420717938225],"rgb":[0.66666666666666663,0.66666666666666663,0],"xyz":[0.309512896760441802,0.372958073182539818,0.0556842125390607443],"hpluv":[85.8743202181747449,139.887458074797593,67.4983691984715506],"hsluv":[85.8743202181747449,100.000000000002373,67.4983691984715506]},"#aaaa11":{"lch":[67.528557359020084,73.1276023311446863,85.8743202181746881],"luv":[67.528557359020084,5.26112782412359792,72.9381022286724345],"rgb":[0.66666666666666663,0.66666666666666663,0.0666666666666666657],"xyz":[0.310524562260078907,0.373362739382394671,0.061012317503816374],"hpluv":[85.8743202181746881,137.414698385368666,67.528557359020084],"hsluv":[85.8743202181746881,98.2323220941626118,67.528557359020084]},"#aaaa22":{"lch":[67.5844605157977,70.7729399531690575,85.8743202181746],"luv":[67.5844605157977,5.09172284764045369,70.589541633712912],"rgb":[0.66666666666666663,0.66666666666666663,0.133333333333333331],"xyz":[0.312399920398555964,0.374112882637785471,0.0708892036997955666],"hpluv":[85.8743202181746,132.880028295953878,67.5844605157977],"hsluv":[85.8743202181746,94.9906661574379854,67.5844605157977]},"#aaaa33":{"lch":[67.6763416895574181,66.9597491826677924,85.8743202181744607],"luv":[67.6763416895574181,4.81738479440415723,66.7862322215321882],"rgb":[0.66666666666666663,0.66666666666666663,0.2],"xyz":[0.315487671131013669,0.375347982930768598,0.0871513575574067167],"hpluv":[85.8743202181744607,125.549870841925909,67.6763416895574181],"hsluv":[85.8743202181744607,89.7506270896691376,67.6763416895574181]},"#aaaa44":{"lch":[67.8086418759902898,61.5895608625658824,85.8743202181741623],"luv":[67.8086418759902898,4.43102935143870269,61.429960004304057],"rgb":[0.66666666666666663,0.66666666666666663,0.266666666666666663],"xyz":[0.319945666375232585,0.377131181028456164,0.110630132510293355],"hpluv":[85.8743202181741623,115.255428047766188,67.8086418759902898],"hsluv":[85.8743202181741623,82.3915379076671854,67.8086418759902898]},"#aaaa55":{"lch":[67.9849384953625844,54.6449851984581514,85.8743202181737786],"luv":[67.9849384953625844,3.93140541890911,54.5033802508787772],"rgb":[0.66666666666666663,0.66666666666666663,0.333333333333333315],"xyz":[0.32590808041459457,0.379516146644201,0.142032179784267271],"hpluv":[85.8743202181737786,101.994541545207838,67.9849384953625844],"hsluv":[85.8743202181737786,72.9118556794948631,67.9849384953625844]},"#aaaa66":{"lch":[68.2081473948541515,46.1798212544818156,85.8743202181731675],"luv":[68.2081473948541515,3.32238354287766668,46.0601526125338268],"rgb":[0.66666666666666663,0.66666666666666663,0.4],"xyz":[0.333493076188102755,0.382550144953604343,0.181979824191411232],"hpluv":[85.8743202181731675,85.9122949373369806,68.2081473948541515],"hsluv":[85.8743202181731675,61.415294923296095,68.2081473948541515]},"#aaaa77":{"lch":[68.4806287458147551,36.3079853189649668,85.874320218171988],"luv":[68.4806287458147551,2.61215937225179973,36.2138981792368284],"rgb":[0.66666666666666663,0.66666666666666663,0.466666666666666674],"xyz":[0.342807089208304661,0.386275750161685139,0.231033626097809142],"hpluv":[85.874320218171988,67.2781031791916604,68.4806287458147551],"hsluv":[85.874320218171988,48.0944497134402909,68.4806287458147551]},"#aaaa88":{"lch":[68.804250183835336,25.1900382005990835,85.8743202181696574],"luv":[68.804250183835336,1.81228437202058101,25.1247616884732103],"rgb":[0.66666666666666663,0.66666666666666663,0.533333333333333326],"xyz":[0.353947506310248461,0.390731917002462736,0.289706489501381281],"hpluv":[85.8743202181696574,46.4571845078746506,68.804250183835336],"hsluv":[85.8743202181696574,33.210400093935057,68.804250183835336]},"#aaaa99":{"lch":[69.1804292601881485,13.0180161266067085,85.8743202181625236],"luv":[69.1804292601881485,0.936574490007753058,12.9842817320504498],"rgb":[0.66666666666666663,0.66666666666666663,0.6],"xyz":[0.36700447041932116,0.395954702646091894,0.358473167142499216],"hpluv":[85.8743202181625236,23.8781611725121081,69.1804292601881485],"hsluv":[85.8743202181625236,17.0695511242654057,69.1804292601881485]},"#aaaaaa":{"lch":[69.6101658300367916,3.6866289517569387e-12,0],"luv":[69.6101658300367916,3.46613397703382525e-12,1.25584564385283521e-12],"rgb":[0.66666666666666663,0.66666666666666663,0.66666666666666663],"xyz":[0.382062163384573716,0.401977779832193,0.437777016759497817],"hpluv":[0,6.72041492281092149e-12,69.6101658300367916],"hsluv":[0,4.48262290109626775e-12,69.6101658300367916]},"#aaaabb":{"lch":[70.0940699613229441,13.6540669730780309,265.874320218191428],"luv":[70.0940699613229441,-0.982334841759501587,-13.618684340418703],"rgb":[0.66666666666666663,0.66666666666666663,0.733333333333333282],"xyz":[0.399199755491910391,0.408832816675127775,0.528035001858139563],"hpluv":[265.874320218191428,24.7183841606301087,70.0940699613229441],"hsluv":[265.874320218191428,17.6184615311656536,70.0940699613229441]},"#aaaacc":{"lch":[70.6323884029978188,27.7441307883788433,265.87432021818438],"luv":[70.6323884029978188,-1.99603725260327192,-27.6722356973355303],"rgb":[0.66666666666666663,0.66666666666666663,0.8],"xyz":[0.41849213093563209,0.416549766852616576,0.629641512528409719],"hpluv":[265.87432021818438,49.8432735452352063,70.6323884029978188],"hsluv":[265.87432021818438,36.467826786828347,70.6323884029978188]},"#aaaadd":{"lch":[71.2250312240615813,42.0886841218373817,265.874320218182],"luv":[71.2250312240615813,-3.02804878123905441,-41.979617097899343],"rgb":[0.66666666666666663,0.66666666666666663,0.866666666666666696],"xyz":[0.440010456486265689,0.425157097072870083,0.742971360428415717],"hpluv":[265.874320218182,74.9845908684596,71.2250312240615813],"hsluv":[265.874320218182,56.4865697219014891,71.2250312240615813]},"#aaaaee":{"lch":[71.8715993709786432,56.5301989351418541,265.874320218180742],"luv":[71.8715993709786432,-4.0670361537863835,-56.3837087159979902],"rgb":[0.66666666666666663,0.66666666666666663,0.933333333333333348],"xyz":[0.463822636752440398,0.4346819691793401,0.86838217649693894],"hpluv":[265.874320218180742,99.8073514218055,71.8715993709786432],"hsluv":[265.874320218180742,77.6546881169827259,71.8715993709786432]},"#aaaaff":{"lch":[72.5714133442747595,70.9376272522327,265.87432021818006],"luv":[72.5714133442747595,-5.10357119085512778,-70.7538021683399],"rgb":[0.66666666666666663,0.66666666666666663,1],"xyz":[0.489993685162271819,0.445150388543272824,1.00621636478872079],"hpluv":[265.87432021818006,124.036757123492009,72.5714133442747595],"hsluv":[265.87432021818006,99.999999999997641,72.5714133442747595]},"#88bb00":{"lch":[70.0174964893220135,84.793654921948729,107.670265811619984],"luv":[70.0174964893220135,-25.7381496181260658,80.7930168347331659],"rgb":[0.533333333333333326,0.733333333333333282,0],"xyz":[0.279226618658270809,0.407742918869184512,0.0639910921330886],"hpluv":[107.670265811619984,153.672481251000221,70.0174964893220135],"hsluv":[107.670265811619984,100.000000000002288,70.0174964893220135]},"#88bb11":{"lch":[70.045943224524,83.6147085810298,107.921872667069366],"luv":[70.045943224524,-25.7299069713944561,79.5574721715938296],"rgb":[0.533333333333333326,0.733333333333333282,0.0666666666666666657],"xyz":[0.280238284157907913,0.408147585069039365,0.0693191970978442318],"hpluv":[107.921872667069366,151.474322676164348,70.045943224524],"hsluv":[107.921872667069366,98.3704135852689,70.045943224524]},"#88bb22":{"lch":[70.0986261940145567,81.4532385975490172,108.403169751544382],"luv":[70.0986261940145567,-25.7149121100318041,77.2876016784231],"rgb":[0.533333333333333326,0.733333333333333282,0.133333333333333331],"xyz":[0.28211364229638497,0.408897728324430165,0.0791960832938234244],"hpluv":[108.403169751544382,147.447759071005407,70.0986261940145567],"hsluv":[108.403169751544382,95.3794817356858431,70.0986261940145567]},"#88bb33":{"lch":[70.185227758130182,77.9617926087192643,109.240455548552404],"luv":[70.185227758130182,-25.6910124331637526,73.6071530961765887],"rgb":[0.533333333333333326,0.733333333333333282,0.2],"xyz":[0.285201393028842676,0.410132828617413292,0.0954582371514345607],"hpluv":[109.240455548552404,140.95335886915251,70.185227758130182],"hsluv":[109.240455548552404,90.5378353052476399,70.185227758130182]},"#88bb44":{"lch":[70.3099541281250708,73.067556170236557,110.558097475340105],"luv":[70.3099541281250708,-25.6581823155790048,68.4143657790612281],"rgb":[0.533333333333333326,0.733333333333333282,0.266666666666666663],"xyz":[0.289659388273061591,0.411916026715100858,0.118937012104321199],"hpluv":[110.558097475340105,131.870330314080604,70.3099541281250708],"hsluv":[110.558097475340105,83.7238240635208655,70.3099541281250708]},"#88bb55":{"lch":[70.4762099132372,66.7907607981454845,112.553407091589676],"luv":[70.4762099132372,-25.6172250438111178,61.682765089203194],"rgb":[0.533333333333333326,0.733333333333333282,0.333333333333333315],"xyz":[0.295621802312423576,0.414300992330845719,0.150339059378295115],"hpluv":[112.553407091589676,120.257778383662554,70.4762099132372],"hsluv":[112.553407091589676,74.9213657205140606,70.4762099132372]},"#88bb66":{"lch":[70.6867901559138687,59.2534136994931373,115.564788197424377],"luv":[70.6867901559138687,-25.56971066242372,53.4523800375924836],"rgb":[0.533333333333333326,0.733333333333333282,0.4],"xyz":[0.303206798085931761,0.417334990640249037,0.190286703785439076],"hpluv":[115.564788197424377,106.368844477737383,70.6867901559138687],"hsluv":[115.564788197424377,64.2082802413586791,70.6867901559138687]},"#88bb77":{"lch":[70.9439811929011483,50.7088031944788611,120.213509646437856],"luv":[70.9439811929011483,-25.5178724843925657,43.8203252530908287],"rgb":[0.533333333333333326,0.733333333333333282,0.466666666666666674],"xyz":[0.312520811106133667,0.421060595848329833,0.239340505691836986],"hpluv":[120.213509646437856,90.6999673798200519,70.9439811929011483],"hsluv":[120.213509646437856,51.7430673824667338,70.9439811929011483]},"#88bb88":{"lch":[71.2496205680497781,41.6266624709187667,127.715012949237462],"luv":[71.2496205680497781,-25.4644588867656232,32.9293237414924747],"rgb":[0.533333333333333326,0.733333333333333282,0.533333333333333326],"xyz":[0.323661228208077467,0.425516762689107431,0.298013369095409153],"hpluv":[127.715012949237462,74.1358655131278397,71.2496205680497781],"hsluv":[127.715012949237462,37.7483692132655,71.2496205680497781]},"#88bb99":{"lch":[71.605136773449729,32.9376822973712677,140.491872589160209],"luv":[71.605136773449729,-25.4125532319559895,20.9545473192710077],"rgb":[0.533333333333333326,0.733333333333333282,0.6],"xyz":[0.336718192317150167,0.430739548332736588,0.366780046736527088],"hpluv":[140.491872589160209,58.3697971606621948,71.605136773449729],"hsluv":[140.491872589160209,40.0947707109065163,71.605136773449729]},"#88bbaa":{"lch":[72.0115788449514298,26.624214972975043,162.310745910586235],"luv":[72.0115788449514298,-25.3653817896029707,8.0898843993512255],"rgb":[0.533333333333333326,0.733333333333333282,0.66666666666666663],"xyz":[0.351775885282402723,0.43676262551883771,0.446083896353525633],"hpluv":[162.310745910586235,46.9152251525928463,72.0115788449514298],"hsluv":[162.310745910586235,42.5902472855224445,72.0115788449514298]},"#88bbbb":{"lch":[72.4696411221425478,25.9090725846495289,192.177050630060563],"luv":[72.4696411221425478,-25.3261303787159093,-5.46508574835939687],"rgb":[0.533333333333333326,0.733333333333333282,0.733333333333333282],"xyz":[0.368913477389739397,0.443617662361772469,0.536341881452167435],"hpluv":[192.177050630060563,45.3664800039612786,72.4696411221425478],"hsluv":[192.177050630060563,45.1889022919971595,72.4696411221425478]},"#88bbcc":{"lch":[72.9796861172365539,31.9509756483125074,217.648879320727843],"luv":[72.9796861172365539,-25.297786835453639,-19.5163220435359541],"rgb":[0.533333333333333326,0.733333333333333282,0.8],"xyz":[0.388205852833461096,0.451334612539261271,0.637948392122437591],"hpluv":[217.648879320727843,55.5547835161394303,72.9796861172365539],"hsluv":[217.648879320727843,47.846459663484211,72.9796861172365539]},"#88bbdd":{"lch":[73.5417671198988501,42.2771793498237827,233.271065498294831],"luv":[73.5417671198988501,-25.2830202693059967,-33.8840490472881442],"rgb":[0.533333333333333326,0.733333333333333282,0.866666666666666696],"xyz":[0.409724178384094695,0.459941942759514777,0.751278240022443589],"hpluv":[233.271065498294831,72.9476439375157781,73.5417671198988501],"hsluv":[233.271065498294831,52.600286903313318,73.5417671198988501]},"#88bbee":{"lch":[74.1556513704433655,54.6140049995012049,242.42172167609948],"luv":[74.1556513704433655,-25.2841013367454792,-48.4087157615106349],"rgb":[0.533333333333333326,0.733333333333333282,0.933333333333333348],"xyz":[0.433536358650269404,0.469466814865984794,0.876689056090966812],"hpluv":[242.42172167609948,93.4542589851821646,74.1556513704433655],"hsluv":[242.42172167609948,75.5983078602269387,74.1556513704433655]},"#88bbff":{"lch":[74.8208441285393206,67.8489412305869877,248.103607922481928],"luv":[74.8208441285393206,-25.3028619495915343,-62.9543009116260492],"rgb":[0.533333333333333326,0.733333333333333282,1],"xyz":[0.459707407060100826,0.479935234229917518,1.01452324438274855],"hpluv":[248.103607922481928,115.069386567942303,74.8208441285393206],"hsluv":[248.103607922481928,99.9999999999973568,74.8208441285393206]},"#333300":{"lch":[20.3279441284931792,22.4095383785379596,85.8743202181747449],"luv":[20.3279441284931792,1.61224273913978733,22.3514671484727536],"rgb":[0.2,0.2,0],"xyz":[0.0254898472303871464,0.0307148568226560392,0.00458585760277267773],"hpluv":[85.8743202181747449,139.887458074797735,20.3279441284931792],"hsluv":[85.8743202181747449,100.000000000002458,20.3279441284931792]},"#333311":{"lch":[20.4867879892499971,17.9332091798965507,85.8743202181741],"luv":[20.4867879892499971,1.2901955319819518,17.8867377399899183],"rgb":[0.2,0.2,0.0666666666666666657],"xyz":[0.0265015127300242681,0.0311195230225108921,0.00991396256752831],"hpluv":[85.8743202181741,111.076827622251201,20.4867879892499971],"hsluv":[85.8743202181741,79.4044220625277717,20.4867879892499971]},"#333322":{"lch":[20.7776374982028358,10.4602453251552614,85.8743202181717749],"luv":[20.7776374982028358,0.752556982220839221,10.4331390411008691],"rgb":[0.2,0.2,0.133333333333333331],"xyz":[0.0283768708685012867,0.0318696662779017134,0.019790848763507507],"hpluv":[85.8743202181717749,63.8829601302186703,20.7776374982028358],"hsluv":[85.8743202181717749,45.6673964981637113,20.7776374982028358]},"#333333":{"lch":[21.246731294981295,1.12524964979295229e-12,0],"luv":[21.246731294981295,1.05794917113478783e-12,3.83314917077821647e-13],"rgb":[0.2,0.2,0.2],"xyz":[0.0314646216009590307,0.0331047665708848263,0.0360530026211186502],"hpluv":[0,6.72041492281092149e-12,21.246731294981295],"hsluv":[0,1.92419399944792236e-12,21.246731294981295]},"#333344":{"lch":[21.9038391599933462,12.2084714240410825,265.874320218182163],"luv":[21.9038391599933462,-0.878332211796974,-12.176834853004598],"rgb":[0.2,0.2,0.266666666666666663],"xyz":[0.0359226168451779043,0.0348879646685724,0.0595317775740052887],"hpluv":[265.874320218182163,70.7262082967351517,21.9038391599933462],"hsluv":[265.874320218182163,13.7757030029577514,21.9038391599933462]},"#333355":{"lch":[22.7485838486986935,25.0264321710322868,265.874320218179776],"luv":[22.7485838486986935,-1.80051382017376982,-24.9615796213830023],"rgb":[0.2,0.2,0.333333333333333315],"xyz":[0.0418850308845399,0.0372729302843172322,0.0909338248479792],"hpluv":[265.874320218179776,139.599512106194084,22.7485838486986935],"hsluv":[265.874320218179776,27.1905063829271256,22.7485838486986935]},"#333366":{"lch":[23.7726526978294,37.7235732610660364,265.874320218179],"luv":[23.7726526978294,-2.71400312032964841,-37.625817820292724],"rgb":[0.2,0.2,0.4],"xyz":[0.0494700266580480746,0.0403069285937205438,0.130881469255123173],"hpluv":[265.874320218179,201.360603518100845,23.7726526978294],"hsluv":[265.874320218179,39.2200280117306193,23.7726526978294]},"#333377":{"lch":[24.9621315786770737,49.9646270765614062,265.874320218178639],"luv":[24.9621315786770737,-3.59467945556105306,-49.8351506319748268],"rgb":[0.2,0.2,0.466666666666666674],"xyz":[0.0587840396782499941,0.0440325338018013601,0.179935271161521082],"hpluv":[265.874320218178639,253.992158426909725,24.9621315786770737],"hsluv":[265.874320218178639,49.4713434217918646,24.9621315786770737]},"#333388":{"lch":[26.2997861111378413,61.6680265106551175,265.874320218178468],"luv":[26.2997861111378413,-4.43667452222106906,-61.5082223194812912],"rgb":[0.2,0.2,0.533333333333333326],"xyz":[0.0699244567801938222,0.048488700642578958,0.238608134565093222],"hpluv":[265.874320218178468,297.541234413863208,26.2997861111378413],"hsluv":[265.874320218178468,57.953618257344317,26.2997861111378413]},"#333399":{"lch":[27.7670269025285634,72.8744236647892336,265.874320218178354],"luv":[27.7670269025285634,-5.24291301488723782,-72.6855796399362788],"rgb":[0.2,0.2,0.6],"xyz":[0.0829814208892665356,0.0537114862862081155,0.307374812206211157],"hpluv":[265.874320218178354,333.031319879373427,27.7670269025285634],"hsluv":[265.874320218178354,64.8662025552495862,27.7670269025285634]},"#3333aa":{"lch":[29.34539826905295,83.6653121043175361,265.874320218178241],"luv":[29.34539826905295,-6.01925794630032573,-83.4485049793509575],"rgb":[0.2,0.2,0.66666666666666663],"xyz":[0.0980391138545190777,0.059734563472309217,0.386678661823209757],"hpluv":[265.874320218178241,361.780166220798492,29.34539826905295],"hsluv":[265.874320218178241,70.4657614516561353,29.34539826905295]},"#3333bb":{"lch":[31.0175640968910713,94.1237197643615247,265.874320218178184],"luv":[31.0175640968910713,-6.77168271864664284,-93.8798111173964855],"rgb":[0.2,0.2,0.733333333333333282],"xyz":[0.115176705961855724,0.0665896003152439686,0.476936646921851504],"hpluv":[265.874320218178184,385.062051502536349,31.0175640968910713],"hsluv":[265.874320218178184,75.0004925607309758,31.0175640968910713]},"#3333cc":{"lch":[32.7678589751368321,104.319620441623087,265.874320218178127],"luv":[32.7678589751368321,-7.50522156082274261,-104.049290523324899],"rgb":[0.2,0.2,0.8],"xyz":[0.134469081405577451,0.0743065504927327702,0.578543157592121604],"hpluv":[265.874320218178127,403.977575952485893,32.7678589751368321],"hsluv":[265.874320218178127,79.524052836351089,32.7678589751368321]},"#3333dd":{"lch":[34.5825131799139243,114.307143948468337,265.874320218178127],"luv":[34.5825131799139243,-8.22376881440244745,-114.010932739554079],"rgb":[0.2,0.2,0.866666666666666696],"xyz":[0.155987406956211,0.0829138807129863,0.691873005492127602],"hpluv":[265.874320218178127,419.426773039758132,34.5825131799139243],"hsluv":[265.874320218178127,86.1542613798901584,34.5825131799139243]},"#3333ee":{"lch":[36.4496605331747929,124.126383834434506,265.87432021817807],"luv":[36.4496605331747929,-8.93020898923314732,-123.80472741871364],"rgb":[0.2,0.2,0.933333333333333348],"xyz":[0.179799587222385732,0.092438752819456349,0.817283821560650825],"hpluv":[265.87432021817807,432.12554656995303,36.4496605331747929],"hsluv":[265.87432021817807,92.9362870993519,36.4496605331747929]},"#3333ff":{"lch":[38.3592184432327414,133.806417871427385,265.87432021817807],"luv":[38.3592184432327414,-9.62663407069321231,-133.45967698167118],"rgb":[0.2,0.2,1],"xyz":[0.205970635632217125,0.102907172183389045,0.95511800985243267],"hpluv":[265.87432021817807,442.635784237250618,38.3592184432327414],"hsluv":[265.87432021817807,99.99999999999946,38.3592184432327414]},"#aabb00":{"lch":[72.2864137555308162,81.0402066187271686,93.9104624709461291],"luv":[72.2864137555308162,-5.52673715975233737,80.8515322376329664],"rgb":[0.66666666666666663,0.733333333333333282,0],"xyz":[0.343467394669040582,0.440867068999738376,0.0670023785085933632],"hpluv":[93.9104624709461291,142.260125307220505,72.2864137555308162],"hsluv":[93.9104624709461291,100.00000000000226,72.2864137555308162]},"#aabb11":{"lch":[72.3134178153803759,79.8795424406406198,94.0047051989067199],"luv":[72.3134178153803759,-5.5786590117117969,79.6845020324350912],"rgb":[0.66666666666666663,0.733333333333333282,0.0666666666666666657],"xyz":[0.344479060168677687,0.441271735199593229,0.072330483473349],"hpluv":[94.0047051989067199,140.170301198642704,72.3134178153803759],"hsluv":[94.0047051989067199,98.4998030851846522,72.3134178153803759]},"#aabb22":{"lch":[72.3634325080893319,77.7463008610920667,94.1853407287125179],"luv":[72.3634325080893319,-5.67416055225396132,77.5389656857163],"rgb":[0.66666666666666663,0.733333333333333282,0.133333333333333331],"xyz":[0.346354418307154743,0.44202187845498403,0.0822073696693281925],"hpluv":[94.1853407287125179,136.332658010127801,72.3634325080893319],"hsluv":[94.1853407287125179,95.7441801677588131,72.3634325080893319]},"#aabb33":{"lch":[72.4456578556837343,74.284969405898,94.5007685828256427],"luv":[72.4456578556837343,-5.82932493434540167,74.0558954469191377],"rgb":[0.66666666666666663,0.733333333333333282,0.2],"xyz":[0.349442169039612449,0.443256978747967156,0.0984695235269393288],"hpluv":[94.5007685828256427,130.115164427369336,72.4456578556837343],"hsluv":[94.5007685828256427,91.2774770665997721,72.4456578556837343]},"#aabb44":{"lch":[72.5641031469497193,69.3968632274838768,95.0004815565242922],"luv":[72.5641031469497193,-6.04891620231322502,69.1327363742496317],"rgb":[0.66666666666666663,0.733333333333333282,0.266666666666666663],"xyz":[0.353900164283831364,0.445040176845654722,0.121948298479825967],"hpluv":[95.0004815565242922,121.354905136961719,72.5641031469497193],"hsluv":[95.0004815565242922,84.978619462346515,72.5641031469497193]},"#aabb55":{"lch":[72.7220260779140659,63.0543258899363366,95.7659530899235705],"luv":[72.7220260779140659,-6.33475857174489843,62.7353078200147181],"rgb":[0.66666666666666663,0.733333333333333282,0.333333333333333315],"xyz":[0.359862578323193349,0.447425142461399583,0.153350345753799883],"hpluv":[95.7659530899235705,110.024206089370551,72.7220260779140659],"hsluv":[95.7659530899235705,76.8198788639563475,72.7220260779140659]},"#aabb66":{"lch":[72.922116394456026,55.2958006214329245,96.9449007941817342],"luv":[72.922116394456026,-6.68608027099689206,54.8900892418207675],"rgb":[0.66666666666666663,0.733333333333333282,0.4],"xyz":[0.367447574096701535,0.450459140770802902,0.193297990160943844],"hpluv":[96.9449007941817342,96.2215198645611167,72.922116394456026],"hsluv":[96.9449007941817342,66.8569788454327778,72.922116394456026]},"#aabb77":{"lch":[73.1665925415562555,46.2248747385797927,98.8352478745929801],"luv":[73.1665925415562555,-7.09985217623529596,45.6763740206356488],"rgb":[0.66666666666666663,0.733333333333333282,0.466666666666666674],"xyz":[0.37676158711690344,0.454184745978883697,0.242351792067341754],"hpluv":[98.8352478745929801,80.1682197570307267,73.1665925415562555],"hsluv":[98.8352478745929801,55.2184354086421223,73.1665925415562555]},"#aabb88":{"lch":[73.4572589636137,36.0214199172978056,102.133241078873],"luv":[73.4572589636137,-7.57119112276486117,35.2167539367396216],"rgb":[0.66666666666666663,0.733333333333333282,0.533333333333333326],"xyz":[0.387902004218847241,0.458640912819661295,0.301024655470913949],"hpluv":[102.133241078873,62.2250760292602862,73.4572589636137],"hsluv":[102.133241078873,42.0922357464751116,73.4572589636137]},"#aabb99":{"lch":[73.7955437608147236,25.0118273668521454,108.880774444702425],"luv":[73.7955437608147236,-8.09382587885112592,23.6660408786948082],"rgb":[0.66666666666666663,0.733333333333333282,0.6],"xyz":[0.40095896832792,0.463863698463290453,0.369791333112031828],"hpluv":[108.880774444702425,43.0085312761643337,73.7955437608147236],"hsluv":[108.880774444702425,27.7101400322224,73.7955437608147236]},"#aabbaa":{"lch":[74.1825262226786464,14.1574418893213867,127.715012949227386],"luv":[74.1825262226786464,-8.66059336811296632,11.1994322785447302],"rgb":[0.66666666666666663,0.733333333333333282,0.66666666666666663],"xyz":[0.416016661293172496,0.469886775649391575,0.449095182729030429],"hpluv":[127.715012949227386,24.2171200924073027,74.1825262226786464],"hsluv":[127.715012949227386,12.3308304853939106,74.1825262226786464]},"#aabbbb":{"lch":[74.6189593067414734,9.47715438031144153,192.177050630059],"luv":[74.6189593067414734,-9.26392276955498417,-1.99904729008021675],"rgb":[0.66666666666666663,0.733333333333333282,0.733333333333333282],"xyz":[0.43315425340050917,0.476741812492326333,0.539353167827672175],"hpluv":[192.177050630059,16.1164020856357908,74.6189593067414734],"hsluv":[192.177050630059,16.0533177597809029,74.6189593067414734]},"#aabbcc":{"lch":[75.1052899078477623,18.5983929047544514,237.852316168687679],"luv":[75.1052899078477623,-9.89626817417043547,-15.7468757175676597],"rgb":[0.66666666666666663,0.733333333333333282,0.8],"xyz":[0.452446628844230925,0.484458762669815135,0.640959678497942331],"hpluv":[237.852316168687679,31.4227520087917149,75.1052899078477623],"hsluv":[237.852316168687679,25.8004515395991127,75.1052899078477623]},"#aabbdd":{"lch":[75.6416785331857682,31.6798915222297,250.547006926215033],"luv":[75.6416785331857682,-10.5504613433008458,-29.8714461033234144],"rgb":[0.66666666666666663,0.733333333333333282,0.866666666666666696],"xyz":[0.473964954394864413,0.493066092890068641,0.754289526397948329],"hpluv":[250.547006926215033,53.1449318902714438,75.6416785331857682],"hsluv":[250.547006926215033,48.9122949421499484,75.6416785331857682]},"#aabbee":{"lch":[76.2280192594463699,45.6175545861468166,255.761586302643195],"luv":[76.2280192594463699,-11.2199701465387403,-44.2162137267639],"rgb":[0.66666666666666663,0.733333333333333282,0.933333333333333348],"xyz":[0.497777134661039178,0.502590964996538658,0.879700342466471552],"hpluv":[255.761586302643195,76.8288153841444483,76.2280192594463699],"hsluv":[255.761586302643195,73.6249760737912311,76.2280192594463699]},"#aabbff":{"lch":[76.863960378353255,59.8395450787859247,258.530312903596609],"luv":[76.863960378353255,-11.8990616804050067,-58.6445520603744583],"rgb":[0.66666666666666663,0.733333333333333282,1],"xyz":[0.523948183070870543,0.513059384360471382,1.01753453075825329],"hpluv":[258.530312903596609,104.151140840900069,76.863960378353255],"hsluv":[258.530312903596609,99.9999999999969305,76.863960378353255]},"#88cc00":{"lch":[75.0884647575288,93.9986167747887,111.475410134903882],"luv":[75.0884647575288,-34.413070492851,87.4727416674912348],"rgb":[0.533333333333333326,0.8,0],"xyz":[0.317450361967887784,0.484190405488419406,0.0767323399029605363],"hpluv":[111.475410134903882,158.85012628624969,75.0884647575288],"hsluv":[111.475410134903882,100.000000000002288,75.0884647575288]},"#88cc11":{"lch":[75.1138336746799,92.9472917959209752,111.713770271434171],"luv":[75.1138336746799,-34.3877142984514421,86.3520941119794685],"rgb":[0.533333333333333326,0.8,0.0666666666666666657],"xyz":[0.318462027467524889,0.484595071688274259,0.082060444867716173],"hpluv":[111.713770271434171,157.020421425354783,75.1138336746799],"hsluv":[111.713770271434171,98.6248626695712289,75.1138336746799]},"#88cc22":{"lch":[75.1608235532889495,91.0175657840787551,112.166724150973],"luv":[75.1608235532889495,-34.3412008388942667,84.2904455214339805],"rgb":[0.533333333333333326,0.8,0.133333333333333331],"xyz":[0.320337385606001945,0.48534521494366506,0.0919373310636953656],"hpluv":[112.166724150973,153.664310911800271,75.1608235532889495],"hsluv":[112.166724150973,96.0970283406349,75.1608235532889495]},"#88cc33":{"lch":[75.2380863503033908,87.8942550668024865,112.94545296029041],"luv":[75.2380863503033908,-34.2659803117460342,80.9397471396048331],"rgb":[0.533333333333333326,0.8,0.2],"xyz":[0.323425136338459651,0.486580315236648187,0.108199484921306516],"hpluv":[112.94545296029041,148.2388630129999,75.2380863503033908],"hsluv":[112.94545296029041,91.9942509365254324,75.2380863503033908]},"#88cc44":{"lch":[75.3494055810326415,83.5027286146262,114.147802574759467],"luv":[75.3494055810326415,-34.1602904869016655,76.1956707427555244],"rgb":[0.533333333333333326,0.8,0.266666666666666663],"xyz":[0.327883131582678566,0.488363513334335753,0.131678259874193154],"hpluv":[114.147802574759467,140.624231819797672,75.3494055810326415],"hsluv":[114.147802574759467,86.1974134191241177,75.3494055810326415]},"#88cc55":{"lch":[75.4978684165763241,77.8461227965530469,115.917002828128631],"luv":[75.4978684165763241,-34.0241050685150555,70.0169915716368365],"rgb":[0.533333333333333326,0.8,0.333333333333333315],"xyz":[0.333845545622040552,0.490748478950080613,0.16308030714816707],"hpluv":[115.917002828128631,130.840327774204638,75.4978684165763241],"hsluv":[115.917002828128631,78.6694108520956092,75.4978684165763241]},"#88cc66":{"lch":[75.6860396561484663,71.0106875190110287,118.477611184333398],"luv":[75.6860396561484663,-33.8589835890750237,62.4186428259808963],"rgb":[0.533333333333333326,0.8,0.4],"xyz":[0.341430541395548737,0.493782477259483932,0.203027951555311],"hpluv":[118.477611184333398,119.054896833398359,75.6860396561484663],"hsluv":[118.477611184333398,69.4467240035668141,75.6860396561484663]},"#88cc77":{"lch":[75.9160535408259705,63.1826013081171638,122.199343200922883],"luv":[75.9160535408259705,-33.6678964132470924,53.4650713940171656],"rgb":[0.533333333333333326,0.8,0.466666666666666674],"xyz":[0.350744554415750642,0.497508082467564727,0.252081753461708913],"hpluv":[122.199343200922883,105.609553255175555,75.9160535408259705],"hsluv":[122.199343200922883,58.6308874961384063,75.9160535408259705]},"#88cc88":{"lch":[76.1896681333118124,54.6887581458639929,127.715012949238314],"luv":[76.1896681333118124,-33.4549913615237,43.2622678616965288],"rgb":[0.533333333333333326,0.8,0.533333333333333326],"xyz":[0.361884971517694443,0.50196424930834227,0.310754616865281108],"hpluv":[127.715012949238314,91.92606633748386,76.1896681333118124],"hsluv":[127.715012949238314,46.3779062484352878,76.1896681333118124]},"#88cc99":{"lch":[76.5083007543168492,46.0935908553499587,136.122445502284393],"luv":[76.5083007543168492,-33.2253063874269188,31.9483666781575764],"rgb":[0.533333333333333326,0.8,0.6],"xyz":[0.374941935626767142,0.507187034951971483,0.379521294506399],"hpluv":[136.122445502284393,78.7570782006024643,76.5083007543168492],"hsluv":[136.122445502284393,48.1280089891728622,76.5083007543168492]},"#88ccaa":{"lch":[76.8730534179438223,38.4110576559043437,149.173477570542047],"luv":[76.8730534179438223,-32.9844501501569098,19.6833787378341469],"rgb":[0.533333333333333326,0.8,0.66666666666666663],"xyz":[0.389999628592019698,0.513210112138072549,0.458825144123397588],"hpluv":[149.173477570542047,66.8865090410736229,76.8730534179438223],"hsluv":[149.173477570542047,50.0095890879800891,76.8730534179438223]},"#88ccbb":{"lch":[77.2847330465352087,33.404634806871222,168.536638924911273],"luv":[77.2847330465352087,-32.73827895277973,6.638879257104497],"rgb":[0.533333333333333326,0.8,0.733333333333333282],"xyz":[0.407137220699356372,0.520065148981007308,0.54908312922203939],"hpluv":[168.536638924911273,59.444025112992847,77.2847330465352087],"hsluv":[168.536638924911273,51.9915664660802292,77.2847330465352087]},"#88cccc":{"lch":[77.7438691793350074,33.2404934388306,192.177050630060876],"luv":[77.7438691793350074,-32.4925976386916417,-7.01152642061846443],"rgb":[0.533333333333333326,0.8,0.8],"xyz":[0.426429596143078071,0.527782099158496165,0.650689639892309546],"hpluv":[192.177050630060876,60.6231146417445359,77.7438691793350074],"hsluv":[192.177050630060876,54.0427382519684585,77.7438691793350074]},"#88ccdd":{"lch":[78.2507307533704,38.5418325774740964,213.193277164244591],"luv":[78.2507307533704,-32.2529061156020589,-21.1003058159876602],"rgb":[0.533333333333333326,0.8,0.866666666666666696],"xyz":[0.44794792169371167,0.536389429378749671,0.764019487792315544],"hpluv":[213.193277164244591,72.2588367593471759,78.2507307533704],"hsluv":[213.193277164244591,56.1332045791076126,78.2507307533704]},"#88ccee":{"lch":[78.8053428571366368,47.78945312574524,227.924421751618695],"luv":[78.8053428571366368,-32.0242046898233,-35.4722728908382834],"rgb":[0.533333333333333326,0.8,0.933333333333333348],"xyz":[0.47176010195988638,0.545914301485219688,0.889430303860838767],"hpluv":[227.924421751618695,92.3999074491721473,78.8053428571366368],"hsluv":[227.924421751618695,70.4270935368067796,78.8053428571366368]},"#88ccff":{"lch":[79.4075039272108114,59.2521837878726885,237.529017152572294],"luv":[79.4075039272108114,-31.8108626015509195,-49.9889018100727327],"rgb":[0.533333333333333326,0.8,1],"xyz":[0.497931150369717801,0.556382720849152412,1.02726449215262061],"hpluv":[237.529017152572294,118.549697277888072,79.4075039272108114],"hsluv":[237.529017152572294,99.999999999996561,79.4075039272108114]},"#334400":{"lch":[26.2681529832905483,31.0251081485104194,104.276907196552472],"luv":[26.2681529832905483,-7.65105337509169647,30.0669040288198879],"rgb":[0.2,0.266666666666666663,0],"xyz":[0.034322417713353183,0.0483799977885883553,0.00753004776376127276],"hpluv":[104.276907196552472,149.872894059772364,26.2681529832905483],"hsluv":[104.276907196552472,100.000000000002302,26.2681529832905483]},"#334411":{"lch":[26.3856741683463127,27.3886432490873446,106.295788944443402],"luv":[26.3856741683463127,-7.68514827558869662,26.2883296351821087],"rgb":[0.2,0.266666666666666663,0.0666666666666666657],"xyz":[0.0353340832129903082,0.0487846639884432082,0.0128581527285169042],"hpluv":[106.295788944443402,131.716945387015755,26.3856741683463127],"hsluv":[106.295788944443402,86.6296124974134614,26.3856741683463127]},"#334422":{"lch":[26.6018195362025054,21.2226436820006832,111.412237748000109],"luv":[26.6018195362025054,-7.74787020962619799,19.7578114189793403],"rgb":[0.2,0.266666666666666663,0.133333333333333331],"xyz":[0.0372094413514673233,0.0495348072438340295,0.0227350389244961],"hpluv":[111.412237748000109,101.234249163259577,26.6018195362025054],"hsluv":[111.412237748000109,63.7673799144094,26.6018195362025054]},"#334433":{"lch":[26.9529945323855813,12.8320575385027151,127.715012949236225],"luv":[26.9529945323855813,-7.8498102472204323,10.150969399721264],"rgb":[0.2,0.266666666666666663,0.2],"xyz":[0.0402971920839250639,0.0507699075368171424,0.038997192782107247],"hpluv":[127.715012949236225,60.4127494816677171,26.9529945323855813],"hsluv":[127.715012949236225,30.7608572023581708,26.9529945323855813]},"#334444":{"lch":[27.4501004194092673,8.17817622085537721,192.177050630060421],"luv":[27.4501004194092673,-7.99417102070306651,-1.72504956193021397],"rgb":[0.2,0.266666666666666663,0.266666666666666663],"xyz":[0.0447551873281439444,0.0525531056345047154,0.0624759677349938855],"hpluv":[192.177050630060421,37.8052272806132379,27.4501004194092673],"hsluv":[192.177050630060421,37.6572465300637518,27.4501004194092673]},"#334455":{"lch":[28.0976851129048839,16.9879579660521678,241.20654356816641],"luv":[28.0976851129048839,-8.1823109542023289,-14.8875956186718064],"rgb":[0.2,0.266666666666666663,0.333333333333333315],"xyz":[0.0507176013675059364,0.0549380712502495483,0.0938780150089678],"hpluv":[241.20654356816641,76.720241835207986,28.0976851129048839],"hsluv":[241.20654356816641,44.9859363973003568,28.0976851129048839]},"#334466":{"lch":[28.8949601880565652,29.7043747380071501,253.545194757545516],"luv":[28.8949601880565652,-8.41402976058801855,-28.487786536758108],"rgb":[0.2,0.266666666666666663,0.4],"xyz":[0.0583025971410141147,0.0579720695596528598,0.133825659416111742],"hpluv":[253.545194757545516,130.448064952476017,28.8949601880565652],"hsluv":[253.545194757545516,52.1427730716471629,28.8949601880565652]},"#334477":{"lch":[29.8367962202096138,42.8398018741040758,258.299336276781332],"luv":[29.8367962202096138,-8.68785350705267589,-41.9496105590085691],"rgb":[0.2,0.266666666666666663,0.466666666666666674],"xyz":[0.0676166101612160342,0.0616976747677336762,0.182879461322509651],"hpluv":[258.299336276781332,182.19421868795277,29.8367962202096138],"hsluv":[258.299336276781332,58.7347196438674857,29.8367962202096138]},"#334488":{"lch":[30.9147794404111025,55.6960507233291082,260.699324576281469],"luv":[30.9147794404111025,-9.00134255207500189,-54.9638599302837605],"rgb":[0.2,0.266666666666666663,0.533333333333333326],"xyz":[0.0787570272631598622,0.066153841608511274,0.241552324726081818],"hpluv":[260.699324576281469,228.611238042833349,30.9147794404111025],"hsluv":[260.699324576281469,64.5716173949788583,30.9147794404111025]},"#334499":{"lch":[32.1182691124294664,68.0605660836803281,262.102678541403236],"luv":[32.1182691124294664,-9.35140200670356769,-67.4150720250304],"rgb":[0.2,0.266666666666666663,0.6],"xyz":[0.0918139913722325618,0.0713766272521404316,0.310319002367199726],"hpluv":[262.102678541403236,268.895014901030436,32.1182691124294664],"hsluv":[262.102678541403236,69.6097770986353623,32.1182691124294664]},"#3344aa":{"lch":[33.435366318838156,79.8975403264742852,263.001802037450773],"luv":[33.435366318838156,-9.73456660877536528,-79.3023023824649158],"rgb":[0.2,0.266666666666666663,0.66666666666666663],"xyz":[0.106871684337485118,0.07739970443824154,0.389622851984198326],"hpluv":[263.001802037450773,303.226149032408784,33.435366318838156],"hsluv":[263.001802037450773,73.891501645941716,33.435366318838156]},"#3344bb":{"lch":[34.8537252521307721,91.2457354427413492,263.615054402289786],"luv":[34.8537252521307721,-10.1472390443123768,-90.6797539490724773],"rgb":[0.2,0.266666666666666663,0.733333333333333282],"xyz":[0.124009276444821764,0.0842547412811763,0.479880837082840073],"hpluv":[263.615054402289786,332.202349056841342,34.8537252521307721],"hsluv":[263.615054402289786,77.4995146205371412,34.8537252521307721]},"#3344cc":{"lch":[36.3611746115969083,102.170263494902102,264.052905077601281],"luv":[36.3611746115969083,-10.5858721727669973,-101.620382074461631],"rgb":[0.2,0.266666666666666663,0.8],"xyz":[0.143301651888543491,0.0919716914586651,0.581487347753110284],"hpluv":[264.052905077601281,356.55451128807033,36.3611746115969083],"hsluv":[264.052905077601281,80.5286468598271767,36.3611746115969083]},"#3344dd":{"lch":[37.9461503215655611,112.73940211649635,264.376684246138268],"luv":[37.9461503215655611,-11.0470957042534899,-112.196855865421313],"rgb":[0.2,0.266666666666666663,0.866666666666666696],"xyz":[0.164819977439177034,0.100579021678918634,0.694817195653116282],"hpluv":[264.376684246138268,377.005191833442723,37.9461503215655611],"hsluv":[264.376684246138268,84.1625325255073,37.9461503215655611]},"#3344ee":{"lch":[39.5979632159824462,123.014623823289881,264.622878978329823],"luv":[39.5979632159824462,-11.5277944422180187,-122.473293536523641],"rgb":[0.2,0.266666666666666663,0.933333333333333348],"xyz":[0.188632157705351772,0.110103893785388651,0.820228011721639505],"hpluv":[264.622878978329823,394.205992168221826,39.5979632159824462],"hsluv":[264.622878978329823,91.9832832027675664,39.5979632159824462]},"#3344ff":{"lch":[41.3069357297154482,133.047388274610427,264.814390787746049],"luv":[41.3069357297154482,-12.0251481753234213,-132.502842754623401],"rgb":[0.2,0.266666666666666663,1],"xyz":[0.214803206115183165,0.120572313149321361,0.95806220001342135],"hpluv":[264.814390787746049,408.716999433792864,41.3069357297154482],"hsluv":[264.814390787746049,99.9999999999994458,41.3069357297154482]},"#aacc00":{"lch":[77.1199831352121,88.8460909387721,100.173289143969555],"luv":[77.1199831352121,-15.692520471132994,87.4492577233428108],"rgb":[0.66666666666666663,0.8,0],"xyz":[0.381691137978657502,0.517314555618973326,0.0797436262784653],"hpluv":[100.173289143969555,156.730643533439519,77.1199831352121],"hsluv":[100.173289143969555,100.000000000002373,77.1199831352121]},"#aacc11":{"lch":[77.1442576556984676,87.800209961997254,100.311366942902],"luv":[77.1442576556984676,-15.7160097521192821,86.3821967007212237],"rgb":[0.66666666666666663,0.8,0.0666666666666666657],"xyz":[0.382702803478294606,0.517719221818828235,0.085071731243220941],"hpluv":[100.311366942902,155.08420894585916,77.1442576556984676],"hsluv":[100.311366942902,98.7181568051142,77.1442576556984676]},"#aacc22":{"lch":[77.1892227090432641,85.8765024717939411,100.574350259733862],"luv":[77.1892227090432641,-15.7593085348968636,84.4181134075499102],"rgb":[0.66666666666666663,0.8,0.133333333333333331],"xyz":[0.384578161616771663,0.518469365074219,0.0949486174392001336],"hpluv":[100.574350259733862,152.047171814071362,77.1892227090432641],"hsluv":[100.574350259733862,96.3604791744028404,77.1892227090432641]},"#aacc33":{"lch":[77.2631626362465482,82.7513779572315116,101.028364552392574],"luv":[77.2631626362465482,-15.8299191574657527,81.2231753460099668],"rgb":[0.66666666666666663,0.8,0.2],"xyz":[0.387665912349229369,0.519704465367202162,0.111210771296811284],"hpluv":[101.028364552392574,147.088857703341773,77.2631626362465482],"hsluv":[101.028364552392574,92.5301726329619,77.2631626362465482]},"#aacc44":{"lch":[77.3697083481362569,78.3307208035327278,101.734312614214147],"luv":[77.3697083481362569,-15.9304072801298968,76.6937021240348],"rgb":[0.66666666666666663,0.8,0.266666666666666663],"xyz":[0.392123907593448284,0.521487663464889728,0.134689546249697922],"hpluv":[101.734312614214147,140.021584702469511,77.3697083481362569],"hsluv":[101.734312614214147,87.1104907412273377,77.3697083481362569]},"#aacc55":{"lch":[77.5118305539362495,72.5836718124644875,102.784946304826448],"luv":[77.5118305539362495,-16.0622064150904862,70.7841432727597493],"rgb":[0.66666666666666663,0.8,0.333333333333333315],"xyz":[0.398086321632810269,0.523872629080634478,0.16609159352367181],"hpluv":[102.784946304826448,130.736122666873541,77.5118305539362495],"hsluv":[102.784946304826448,80.0585735006639,77.5118305539362495]},"#aacc66":{"lch":[77.6920071630818114,65.5409770618580865,104.333567867024144],"luv":[77.6920071630818114,-16.225762577214013,63.5007425390513731],"rgb":[0.66666666666666663,0.8,0.4],"xyz":[0.405671317406318455,0.526906627390037796,0.2060392379308158],"hpluv":[104.333567867024144,119.198186871977654,77.6920071630818114],"hsluv":[104.333567867024144,71.3979720959128,77.6920071630818114]},"#aacc77":{"lch":[77.912311817127474,57.2990991241466574,106.653185897117098],"luv":[77.912311817127474,-16.4206512214041886,54.8958010589496865],"rgb":[0.66666666666666663,0.8,0.466666666666666674],"xyz":[0.41498533042652036,0.530632232598118647,0.255093039837213709],"hpluv":[106.653185897117098,105.457526508453554,77.912311817127474],"hsluv":[106.653185897117098,61.2114900666368769,77.912311817127474]},"#aacc88":{"lch":[78.1744663257663,48.0371110011961946,110.274462486898784],"luv":[78.1744663257663,-16.6457037997795574,45.0608985524173633],"rgb":[0.66666666666666663,0.8,0.533333333333333326],"xyz":[0.42612574752846416,0.53508839943889619,0.313765903240785848],"hpluv":[110.274462486898784,89.6844859178180513,78.1744663257663],"hsluv":[110.274462486898784,49.6324036967210418,78.1744663257663]},"#aacc99":{"lch":[78.4798746855988583,38.0746183254558517,116.349336294343573],"luv":[78.4798746855988583,-16.8991518201031816,34.1188397866961779],"rgb":[0.66666666666666663,0.8,0.6],"xyz":[0.43918271163753686,0.540311185082525403,0.382532580881903783],"hpluv":[116.349336294343573,72.2917022308792383,78.4798746855988583],"hsluv":[116.349336294343573,36.8338589582570535,78.4798746855988583]},"#aaccaa":{"lch":[78.8296472340984593,28.0820980315160789,127.715012949234293],"luv":[78.8296472340984593,-17.1787837008838338,22.2147163027108476],"rgb":[0.66666666666666663,0.8,0.66666666666666663],"xyz":[0.454240404602789416,0.546334262268626469,0.461836430498902384],"hpluv":[127.715012949234293,54.3703242245777503,78.8296472340984593],"hsluv":[127.715012949234293,23.0170216670413055,78.8296472340984593]},"#aaccbb":{"lch":[79.2246195207133,19.8998018903229301,151.462718702096396],"luv":[79.2246195207133,-17.4821042808439238,9.50674209115818236],"rgb":[0.66666666666666663,0.8,0.733333333333333282],"xyz":[0.47137799671012609,0.553189299111561228,0.55209441559754413],"hpluv":[151.462718702096396,39.3999249764932173,79.2246195207133],"hsluv":[151.462718702096396,25.9022649263565761,79.2246195207133]},"#aacccc":{"lch":[79.665368512397464,18.216345023755192,192.177050630059796],"luv":[79.665368512397464,-17.80648564660072,-3.84243346616347603],"rgb":[0.66666666666666663,0.8,0.8],"xyz":[0.490670372153847789,0.560906249289050085,0.653700926267814286],"hpluv":[192.177050630059796,36.9937893704297878,79.665368512397464],"hsluv":[192.177050630059796,28.9019874878943099,79.665368512397464]},"#aaccdd":{"lch":[80.1522276755556504,25.332665849504842,224.238778454296437],"luv":[80.1522276755556504,-18.1492995031005968,-17.6733382978265112],"rgb":[0.66666666666666663,0.8,0.866666666666666696],"xyz":[0.512188697704481388,0.569513579509303591,0.767030774167820284],"hpluv":[224.238778454296437,52.9363308364733882,80.1522276755556504],"hsluv":[224.238778454296437,37.9969627853472787,80.1522276755556504]},"#aaccee":{"lch":[80.6853018377357216,36.8247992939862954,239.828051209207672],"luv":[80.6853018377357216,-18.5080244281037345,-31.8358112007702587],"rgb":[0.66666666666666663,0.8,0.933333333333333348],"xyz":[0.536000877970656098,0.579038451615773608,0.892441590236343507],"hpluv":[239.828051209207672,79.4490805971393854,80.6853018377357216],"hsluv":[239.828051209207672,67.7857500876551313,80.6853018377357216]},"#aaccff":{"lch":[81.2644823279674284,49.9029399741520834,247.769045833277914],"luv":[81.2644823279674284,-18.8803249793402337,-46.1934708236816434],"rgb":[0.66666666666666663,0.8,1],"xyz":[0.562171926380487519,0.589506870979706332,1.03027577852812535],"hpluv":[247.769045833277914,111.562078640814406,81.2644823279674284],"hsluv":[247.769045833277914,99.9999999999962625,81.2644823279674284]},"#88dd00":{"lch":[80.1491214608994085,103.252993693735874,114.339076779275487],"luv":[80.1491214608994085,-42.5542610136121837,94.0761158653142218],"rgb":[0.533333333333333326,0.866666666666666696,0],"xyz":[0.360084352515062933,0.569458386582770926,0.0909436700853518548],"hpluv":[114.339076779275487,215.722602995807392,80.1491214608994085],"hsluv":[114.339076779275487,100.000000000002288,80.1491214608994085]},"#88dd11":{"lch":[80.1718911006532551,102.308936337717924,114.55620444532569],"luv":[80.1718911006532551,-42.518128048011647,93.0555062414261727],"rgb":[0.533333333333333326,0.866666666666666696,0.0666666666666666657],"xyz":[0.361096018014700038,0.569863052782625834,0.0962717750501074915],"hpluv":[114.55620444532569,214.038948901986089,80.1718911006532551],"hsluv":[114.55620444532569,98.8288322371321186,80.1718911006532551]},"#88dd22":{"lch":[80.2140714473537315,100.574216022873557,114.966813202702411],"luv":[80.2140714473537315,-42.4516967311958453,91.1757992740300125],"rgb":[0.533333333333333326,0.866666666666666696,0.133333333333333331],"xyz":[0.362971376153177094,0.570613196038016635,0.106148661246086684],"hpluv":[114.966813202702411,210.937294411552,80.2140714473537315],"hsluv":[114.966813202702411,96.6732644510524,80.2140714473537315]},"#88dd33":{"lch":[80.283440325316,97.7612202004146695,115.666709499512805],"luv":[80.283440325316,-42.3438510501166832,88.1150069699792908],"rgb":[0.533333333333333326,0.866666666666666696,0.2],"xyz":[0.3660591268856348,0.571848296330999761,0.122410815103697834],"hpluv":[115.666709499512805,205.88559104418357,80.283440325316],"hsluv":[115.666709499512805,93.1672856447162303,80.283440325316]},"#88dd44":{"lch":[80.3834168948860821,93.7943752395521,116.732715571790365],"luv":[80.3834168948860821,-42.1914333437924896,83.7691338081886698],"rgb":[0.533333333333333326,0.866666666666666696,0.266666666666666663],"xyz":[0.370517122129853715,0.573631494428687327,0.145889590056584473],"hpluv":[116.732715571790365,198.714220363605108,80.3834168948860821],"hsluv":[116.732715571790365,88.1979852499996184,80.3834168948860821]},"#88dd55":{"lch":[80.5168087418625475,88.6629430887769,118.270203219525229],"luv":[80.5168087418625475,-41.9934519908601374,78.0875628192801088],"rgb":[0.533333333333333326,0.866666666666666696,0.333333333333333315],"xyz":[0.376479536169215701,0.576016460044432077,0.17729163733055836],"hpluv":[118.270203219525229,189.352414361266369,80.5168087418625475],"hsluv":[118.270203219525229,81.7170886524359474,80.5168087418625475]},"#88dd66":{"lch":[80.6859701106092757,82.4238546620344437,120.433562333743893],"luv":[80.6859701106092757,-41.7508898851674672,71.0672569552589266],"rgb":[0.533333333333333326,0.866666666666666696,0.4],"xyz":[0.384064531942723886,0.579050458353835396,0.21723928173770235],"hpluv":[120.433562333743893,177.835721711884361,80.6859701106092757],"hsluv":[120.433562333743893,73.7344666622195604,80.6859701106092757]},"#88dd77":{"lch":[80.8928858528116734,75.2114908165065827,123.458458278308711],"luv":[80.8928858528116734,-41.4665196955592208,62.7478772165182832],"rgb":[0.533333333333333326,0.866666666666666696,0.466666666666666674],"xyz":[0.393378544962925791,0.582776063561916247,0.266293083644100259],"hpluv":[123.458458278308711,164.332036041008877,80.8928858528116734],"hsluv":[123.458458278308711,64.312379996729149,80.8928858528116734]},"#88dd88":{"lch":[81.1392211885512,67.2590471315356524,127.71501294923884],"luv":[81.1392211885512,-41.1446687958856145,53.2061617739807531],"rgb":[0.533333333333333326,0.866666666666666696,0.533333333333333326],"xyz":[0.404518962064869592,0.587232230402693789,0.324965947047672399],"hpluv":[127.71501294923884,149.199726190229825,81.1392211885512],"hsluv":[127.71501294923884,53.5585775308776633,81.1392211885512]},"#88dd99":{"lch":[81.4263538436063072,58.943488890057,133.791370377408185],"luv":[81.4263538436063072,-40.7909253788266,42.5492102073736831],"rgb":[0.533333333333333326,0.866666666666666696,0.6],"xyz":[0.417575926173942347,0.592455016046323,0.393732624688790334],"hpluv":[133.791370377408185,133.11083868071384,81.4263538436063072],"hsluv":[133.791370377408185,54.8771054313611515,81.4263538436063072]},"#88ddaa":{"lch":[81.7553965772464437,50.8758256364689956,142.591286230634154],"luv":[81.7553965772464437,-40.4117997418374131,30.906893661738728],"rgb":[0.533333333333333326,0.866666666666666696,0.66666666666666663],"xyz":[0.432633619139194847,0.598478093232424069,0.473036474305788934],"hpluv":[142.591286230634154,117.302359569381537,81.7553965772464437],"hsluv":[142.591286230634154,56.3076629138628,81.7553965772464437]},"#88ddbb":{"lch":[82.1272144034785327,44.0521153731503716,155.27715859232552],"luv":[82.1272144034785327,-40.0143654100278567,18.4238820470094566],"rgb":[0.533333333333333326,0.866666666666666696,0.733333333333333282],"xyz":[0.449771211246531522,0.605333130075358827,0.563294459404430681],"hpluv":[155.27715859232552,104.020343594656595,82.1272144034785327],"hsluv":[155.27715859232552,57.829298146967858,82.1272144034785327]},"#88ddcc":{"lch":[82.542438979776648,39.9525966793572422,172.446474622419316],"luv":[82.542438979776648,-39.6059077008678173,5.25186220437346396],"rgb":[0.533333333333333326,0.866666666666666696,0.8],"xyz":[0.469063586690253276,0.613050080252847684,0.664900970074700837],"hpluv":[172.446474622419316,96.9346789585341355,82.542438979776648],"hsluv":[172.446474622419316,59.4202271347422908,82.542438979776648]},"#88dddd":{"lch":[83.0014816422074375,40.0957403917498354,192.177050630060734],"luv":[83.0014816422074375,-39.1936046909777,-8.4575261684472629],"rgb":[0.533333333333333326,0.866666666666666696,0.866666666666666696],"xyz":[0.490581912240886764,0.621657410473101191,0.778230817974706834],"hpluv":[192.177050630060734,100.308679558078737,83.0014816422074375],"hsluv":[192.177050630060734,61.0588228331018783,83.0014816422074375]},"#88ddee":{"lch":[83.5045459788204,44.8677054153188,210.184175125347622],"luv":[83.5045459788204,-38.7842593009493157,-22.5586395802706683],"rgb":[0.533333333333333326,0.866666666666666696,0.933333333333333348],"xyz":[0.514394092507061584,0.631182282579571208,0.903641634043230058],"hpluv":[210.184175125347622,116.175045715242419,83.5045459788204],"hsluv":[210.184175125347622,62.7244468832174746,83.5045459788204]},"#88ddff":{"lch":[84.0516404633952732,53.2556266987753659,223.883407592331508],"luv":[84.0516404633952732,-38.3840933399078779,-36.9164347351224436],"rgb":[0.533333333333333326,0.866666666666666696,1],"xyz":[0.540565140916892894,0.641650701943503932,1.04147582233501179],"hpluv":[223.883407592331508,143.298172182841085,84.0516404633952732],"hsluv":[223.883407592331508,99.9999999999952,84.0516404633952732]},"#335500":{"lch":[32.2593993637483862,41.1235506245754365,113.326494368716226],"luv":[32.2593993637483862,-16.2836990313566261,37.7622504868051223],"rgb":[0.2,0.333333333333333315,0],"xyz":[0.0461356744276991415,0.0720065112172806193,0.0114678000018764836],"hpluv":[113.326494368716226,161.760937136611716,32.2593993637483862],"hsluv":[113.326494368716226,100.000000000002288,32.2593993637483862]},"#335511":{"lch":[32.3496341583576381,38.1897920123001313,115.090818108356473],"luv":[32.3496341583576381,-16.1945453684027605,34.5860797757347456],"rgb":[0.2,0.333333333333333315,0.0666666666666666657],"xyz":[0.0471473399273362598,0.0724111774171354722,0.016795904966632115],"hpluv":[115.090818108356473,149.801873896373706,32.3496341583576381],"hsluv":[115.090818108356473,90.8995446090399923,32.3496341583576381]},"#335522":{"lch":[32.5160201858231659,33.1206139518783189,118.966642902489184],"luv":[32.5160201858231659,-16.0403246718637718,28.9772851207727022],"rgb":[0.2,0.333333333333333315,0.133333333333333331],"xyz":[0.0490226980658132819,0.0731613206725262866,0.0266727911626113111],"hpluv":[118.966642902489184,129.252907346834121,32.5160201858231659],"hsluv":[118.966642902489184,74.935129302234273,32.5160201858231659]},"#335533":{"lch":[32.7875119073456176,25.8516304293262671,127.715012949238741],"luv":[32.7875119073456176,-15.8143300747053051,20.4502753072602665],"rgb":[0.2,0.333333333333333315,0.2],"xyz":[0.0521104487982710224,0.0743964209655094,0.0429349450202224578],"hpluv":[127.715012949238741,100.050394151032577,32.7875119073456176],"hsluv":[127.715012949238741,50.9434831873252207,32.7875119073456176]},"#335544":{"lch":[33.1742322541989836,18.1915220066791647,148.674883917516439],"luv":[33.1742322541989836,-15.539762262897943,9.45765624941535421],"rgb":[0.2,0.333333333333333315,0.266666666666666663],"xyz":[0.0565684440424899,0.0761796190631969794,0.0664137199731090894],"hpluv":[148.674883917516439,69.5836942134034899,33.1742322541989836],"hsluv":[148.674883917516439,54.5088767633859703,33.1742322541989836]},"#335555":{"lch":[33.6821363315134121,15.5994691341387064,192.177050630060819],"luv":[33.6821363315134121,-15.2484882598238034,-3.29044724269541522],"rgb":[0.2,0.333333333333333315,0.333333333333333315],"xyz":[0.0625308580818519,0.0785645846789418123,0.097815767247083],"hpluv":[192.177050630060819,58.7691644617976934,33.6821363315134121],"hsluv":[192.177050630060819,58.539124710901028,33.6821363315134121]},"#335566":{"lch":[34.3136156967701496,22.6822476529859181,228.692277460856218],"luv":[34.3136156967701496,-14.9726179113300351,-17.0383412183435361],"rgb":[0.2,0.333333333333333315,0.4],"xyz":[0.0701158538553600663,0.0815985829883451308,0.137763411654226953],"hpluv":[228.692277460856218,83.8800984368335,34.3136156967701496],"hsluv":[228.692277460856218,62.7386213411417089,34.3136156967701496]},"#335577":{"lch":[35.0679836745485218,34.4527831327976131,244.673076132176305],"luv":[35.0679836745485218,-14.7383029974912176,-31.1412377780608658],"rgb":[0.2,0.333333333333333315,0.466666666666666674],"xyz":[0.0794298668755619858,0.0853241881964259402,0.186817213560624862],"hpluv":[244.673076132176305,124.667382519216758,35.0679836745485218],"hsluv":[244.673076132176305,66.8604241763398335,35.0679836745485218]},"#335588":{"lch":[35.9419713942028523,47.4274747217606318,252.117898483801355],"luv":[35.9419713942028523,-14.5630489263951493,-45.1362710516793229],"rgb":[0.2,0.333333333333333315,0.533333333333333326],"xyz":[0.0905702839775058138,0.089780355037203538,0.245490076964197029],"hpluv":[252.117898483801355,167.443168522882189,35.9419713942028523],"hsluv":[252.117898483801355,70.7327730687023433,35.9419713942028523]},"#335599":{"lch":[36.9302538454711851,60.4953772811161272,256.174865065393647],"luv":[36.9302538454711851,-14.4559426241851021,-58.7427986669927833],"rgb":[0.2,0.333333333333333315,0.6],"xyz":[0.103627248086578527,0.0950031406808327,0.314256754605314936],"hpluv":[256.174865065393647,207.863972679723531,36.9302538454711851],"hsluv":[256.174865065393647,74.2581677802949258,36.9302538454711851]},"#3355aa":{"lch":[38.0259842211890557,73.2582460718320903,258.648348715518409],"luv":[38.0259842211890557,-14.4194259870406505,-71.8251402485603165],"rgb":[0.2,0.333333333333333315,0.66666666666666663],"xyz":[0.118684941051831069,0.101026217866933804,0.393560604222313537],"hpluv":[258.648348715518409,244.464262316607687,38.0259842211890557],"hsluv":[258.648348715518409,77.3978910060545,38.0259842211890557]},"#3355bb":{"lch":[39.2213032744107579,85.5750988898230815,260.277622363739169],"luv":[39.2213032744107579,-14.4514388960387397,-84.3460340729607623],"rgb":[0.2,0.333333333333333315,0.733333333333333282],"xyz":[0.135822533159167702,0.107881254709868563,0.483818589320955283],"hpluv":[260.277622363739169,276.862869377010384,39.2213032744107579],"hsluv":[260.277622363739169,80.1529964351826578,39.2213032744107579]},"#3355cc":{"lch":[40.5077939091134667,97.4185991778777,261.412040351160215],"luv":[40.5077939091134667,-14.5472816309580448,-96.326320717286734],"rgb":[0.2,0.333333333333333315,0.8],"xyz":[0.155114908602889456,0.115598204887357364,0.585425099991225495],"hpluv":[261.412040351160215,305.17054630009352,40.5077939091134667],"hsluv":[261.412040351160215,82.5478264076183734,40.5077939091134667]},"#3355dd":{"lch":[41.8768615158020552,108.813506268261335,262.235450095721887],"luv":[41.8768615158020552,-14.7009821832840935,-107.815862790406285],"rgb":[0.2,0.333333333333333315,0.866666666666666696],"xyz":[0.176633234153523,0.124205535107610898,0.698754947891231493],"hpluv":[262.235450095721887,329.72206067647727,41.8768615158020552],"hsluv":[262.235450095721887,84.6180359154754456,41.8768615158020552]},"#3355ee":{"lch":[43.3200322197542533,119.805986402952101,262.852770803428143],"luv":[43.3200322197542533,-14.9061911990543372,-118.875059797762361],"rgb":[0.2,0.333333333333333315,0.933333333333333348],"xyz":[0.200445414419697737,0.133730407214080915,0.824165763959754716],"hpluv":[262.852770803428143,350.936931775297865,43.3200322197542533],"hsluv":[262.852770803428143,90.8055999978327577,43.3200322197542533]},"#3355ff":{"lch":[44.8291710285026497,130.447860525532377,263.327743444412704],"luv":[44.8291710285026497,-15.1567128937849134,-129.564340657235334],"rgb":[0.2,0.333333333333333315,1],"xyz":[0.226616462829529131,0.144198826578013639,0.961999952251536561],"hpluv":[263.327743444412704,369.245812735261836,44.8291710285026497],"hsluv":[263.327743444412704,99.9999999999993,44.8291710285026497]},"#aadd00":{"lch":[81.9783608763648175,97.3184216433040916,105.014728605041086],"luv":[81.9783608763648175,-25.2120246284188454,93.9958988747909245],"rgb":[0.66666666666666663,0.866666666666666696,0],"xyz":[0.424325128525832707,0.602582536713324846,0.0939549564608566229],"hpluv":[105.014728605041086,227.603505169437568,81.9783608763648175],"hsluv":[105.014728605041086,100.000000000002203,81.9783608763648175]},"#aadd11":{"lch":[82.0002885274849262,96.374791846509865,105.167446282879951],"luv":[82.0002885274849262,-25.2155818179290208,93.017605521973266],"rgb":[0.66666666666666663,0.866666666666666696,0.0666666666666666657],"xyz":[0.425336794025469811,0.602987202913179754,0.0992830614256122596],"hpluv":[105.167446282879951,225.71449396257529,82.0002885274849262],"hsluv":[105.167446282879951,98.8971907906987298,82.0002885274849262]},"#aadd22":{"lch":[82.0409106120811,94.6380623122949345,105.456830413527484],"luv":[82.0409106120811,-25.2222030700150874,91.2151484706391216],"rgb":[0.66666666666666663,0.866666666666666696,0.133333333333333331],"xyz":[0.427212152163946868,0.603737346168570554,0.109159947621591452],"hpluv":[105.456830413527484,222.227322886837186,82.0409106120811],"hsluv":[105.456830413527484,96.86659260915998,82.0409106120811]},"#aadd33":{"lch":[82.1077210543303693,91.8137349028061891,105.951891130476156],"luv":[82.1077210543303693,-25.2331804702422886,88.2782448860360773],"rgb":[0.66666666666666663,0.866666666666666696,0.2],"xyz":[0.430299902896404574,0.604972446461553681,0.125422101479202602],"hpluv":[105.951891130476156,216.526835376233663,82.1077210543303693],"hsluv":[105.951891130476156,93.5615293661406469,82.1077210543303693]},"#aadd44":{"lch":[82.204019596801416,87.812555976334508,106.710442618715334],"luv":[82.204019596801416,-25.2491908313752447,84.1042409718896238],"rgb":[0.66666666666666663,0.866666666666666696,0.266666666666666663],"xyz":[0.434757898140623489,0.606755644559241247,0.148900876432089241],"hpluv":[106.710442618715334,208.386709262610594,82.204019596801416],"hsluv":[106.710442618715334,88.8720213109455415,82.204019596801416]},"#aadd55":{"lch":[82.332521082647844,82.6008871447080537,107.814707884186447],"luv":[82.332521082647844,-25.2708912490316564,78.6402480449573],"rgb":[0.66666666666666663,0.866666666666666696,0.333333333333333315],"xyz":[0.440720312179985474,0.609140610174986,0.180302923706063156],"hpluv":[107.814707884186447,197.666387369374576,82.332521082647844],"hsluv":[107.814707884186447,82.7472331150865,82.332521082647844]},"#aadd66":{"lch":[82.495508489392364,76.2000100439918526,109.390646830849064],"luv":[82.495508489392364,-25.2989483474785786,71.8777068583581666],"rgb":[0.66666666666666663,0.866666666666666696,0.4],"xyz":[0.448305307953493659,0.612174608484389315,0.22025056811320709],"hpluv":[109.390646830849064,184.308617744019813,82.495508489392364],"hsluv":[109.390646830849064,75.1895211365387723,82.495508489392364]},"#aadd77":{"lch":[82.694914273715753,68.6905071379487,111.642517734809914],"luv":[82.694914273715753,-25.3340491820501299,63.8480361711309499],"rgb":[0.66666666666666663,0.866666666666666696,0.466666666666666674],"xyz":[0.457619320973695565,0.615900213692470166,0.269304370019605],"hpluv":[111.642517734809914,168.351618208890358,82.694914273715753],"hsluv":[111.642517734809914,66.2494286969421182,82.694914273715753]},"#aadd88":{"lch":[82.9323686283524921,60.2252781448786436,114.920875432447886],"luv":[82.9323686283524921,-25.3769003534370228,54.6177357282387277],"rgb":[0.66666666666666663,0.866666666666666696,0.533333333333333326],"xyz":[0.468759738075639365,0.620356380533247709,0.327977233423177195],"hpluv":[114.920875432447886,149.967217229555729,82.9323686283524921],"hsluv":[114.920875432447886,56.0198042099318698,82.9323686283524921]},"#aadd99":{"lch":[83.2092305924335,51.0640475908324305,119.865599423026282],"luv":[83.2092305924335,-25.4282188712646082,44.2825320120006438],"rgb":[0.66666666666666663,0.866666666666666696,0.6],"xyz":[0.481816702184712065,0.625579166176876922,0.396743911064295074],"hpluv":[119.865599423026282,129.562195810811914,83.2092305924335],"hsluv":[119.865599423026282,44.6286172342680487,83.2092305924335]},"#aaddaa":{"lch":[83.526609727912188,41.6663179647472717,127.715012949236481],"luv":[83.526609727912188,-25.4887175141036408,32.9606937461220255],"rgb":[0.66666666666666663,0.866666666666666696,0.66666666666666663],"xyz":[0.496874395149964621,0.631602243362978,0.476047760681293675],"hpluv":[127.715012949236481,108.050849780995421,83.526609727912188],"hsluv":[127.715012949236481,32.2306770176982198,83.526609727912188]},"#aaddbb":{"lch":[83.8853825066367449,32.9442078204095523,140.880295511025736],"luv":[83.8853825066367449,-25.5590871805440472,20.7859060762739638],"rgb":[0.66666666666666663,0.866666666666666696,0.733333333333333282],"xyz":[0.514011987257301239,0.638457280205912747,0.566305745779935421],"hpluv":[140.880295511025736,87.605014056209555,83.8853825066367449],"hsluv":[140.880295511025736,34.4766875289621382,83.8853825066367449]},"#aaddcc":{"lch":[84.2862057978904602,26.8294893367150316,162.87488866986746],"luv":[84.2862057978904602,-25.639978502468459,7.90018990036700242],"rgb":[0.66666666666666663,0.866666666666666696,0.8],"xyz":[0.533304362701023,0.646174230383401604,0.667912256450205577],"hpluv":[162.87488866986746,73.4171355960865526,84.2862057978904602],"hsluv":[162.87488866986746,36.8333761539634708,84.2862057978904602]},"#aadddd":{"lch":[84.729528894444158,26.3242685722419552,192.177050630060421],"luv":[84.729528894444158,-25.7319846477226655,-5.55266440124834],"rgb":[0.66666666666666663,0.866666666666666696,0.866666666666666696],"xyz":[0.554822688251656593,0.654781560603655111,0.781242104350211575],"hpluv":[192.177050630060421,74.4077864529294146,84.729528894444158],"hsluv":[192.177050630060421,39.269697519551606,84.729528894444158]},"#aaddee":{"lch":[85.2156049558348769,32.3281965376105802,216.94937298104162],"luv":[85.2156049558348769,-25.8356267715816657,-19.4327733659894548],"rgb":[0.66666666666666663,0.866666666666666696,0.933333333333333348],"xyz":[0.578634868517831302,0.664306432710125128,0.906652920418734798],"hpluv":[216.94937298104162,94.7745998726022094,85.2156049558348769],"hsluv":[216.94937298104162,58.4216362813771397,85.2156049558348769]},"#aaddff":{"lch":[85.744502396509489,42.4619511969095527,232.326067904807843],"luv":[85.744502396509489,-25.9513430438233641,-33.608705623253762],"rgb":[0.66666666666666663,0.866666666666666696,1],"xyz":[0.604805916927662723,0.674774852074057852,1.04448710871051675],"hpluv":[232.326067904807843,129.682154580054771,85.744502396509489],"hsluv":[232.326067904807843,99.9999999999945572,85.744502396509489]},"#88ee00":{"lch":[85.1906878331824515,112.448241602139106,116.535675589642423],"luv":[85.1906878331824515,-50.2368100475369914,100.602534538950536],"rgb":[0.533333333333333326,0.933333333333333348,0],"xyz":[0.40726312885557775,0.663815939263801891,0.106669928865523039],"hpluv":[116.535675589642423,329.03324103323672,85.1906878331824515],"hsluv":[116.535675589642423,100.000000000002416,85.1906878331824515]},"#88ee11":{"lch":[85.2112458075113182,111.594873497969587,116.730132104203335],"luv":[85.2112458075113182,-50.1941202672300193,99.669283541253],"rgb":[0.533333333333333326,0.933333333333333348,0.0666666666666666657],"xyz":[0.408274794355214854,0.664220605463656799,0.111998033830278676],"hpluv":[116.730132104203335,327.047318494663614,85.2112458075113182],"hsluv":[116.730132104203335,98.9939616796445,85.2112458075113182]},"#88ee22":{"lch":[85.2493327369145,110.025246585506409,117.096539077460619],"luv":[85.2493327369145,-50.115524286233132,97.9489107224652429],"rgb":[0.533333333333333326,0.933333333333333348,0.133333333333333331],"xyz":[0.410150152493691911,0.6649707487190476,0.121874920026257869],"hpluv":[117.096539077460619,323.384561507736407,85.2493327369145],"hsluv":[117.096539077460619,97.140453749143191,85.2493327369145]},"#88ee33":{"lch":[85.3119799721786,107.475578977757436,117.717135468026783],"luv":[85.3119799721786,-49.9876247553973769,95.1432469906181097],"rgb":[0.533333333333333326,0.933333333333333348,0.2],"xyz":[0.413237903226149617,0.666205849012030726,0.138137073883869],"hpluv":[117.717135468026783,317.406918528502,85.3119799721786],"hsluv":[117.717135468026783,94.120593299189423,85.3119799721786]},"#88ee44":{"lch":[85.4022915890189864,103.870397610997969,118.652974854946393],"luv":[85.4022915890189864,-49.8062112723248518,91.1504296126099],"rgb":[0.533333333333333326,0.933333333333333348,0.266666666666666663],"xyz":[0.417695898470368532,0.667989047109718292,0.161615848836755643],"hpluv":[118.652974854946393,308.894438519259097,85.4022915890189864],"hsluv":[118.652974854946393,89.8292917088674869,85.4022915890189864]},"#88ee55":{"lch":[85.5228293578601466,99.1885702075232,119.98340282305692],"luv":[85.5228293578601466,-49.5693999595221584,85.9141842041562],"rgb":[0.533333333333333326,0.933333333333333348,0.333333333333333315],"xyz":[0.423658312509730517,0.670374012725463,0.193017896110729559],"hpluv":[119.98340282305692,297.731707367046795,85.5228293578601466],"hsluv":[119.98340282305692,84.2131356884780473,85.5228293578601466]},"#88ee66":{"lch":[85.6757572108422,93.4644574192068234,121.818598205465591],"luv":[85.6757572108422,-49.2774194314266083,79.4187681524083189],"rgb":[0.533333333333333326,0.933333333333333348,0.4],"xyz":[0.431243308283238702,0.673408011034866361,0.232965540517873521],"hpluv":[121.818598205465591,283.912655540997662,85.6757572108422],"hsluv":[121.818598205465591,77.2651144072775082,85.6757572108422]},"#88ee77":{"lch":[85.8629182835971676,86.7937408847250822,124.317503927832064],"luv":[85.8629182835971676,-48.9324360738715,71.6852157466327071],"rgb":[0.533333333333333326,0.933333333333333348,0.466666666666666674],"xyz":[0.440557321303440608,0.677133616242947212,0.282019342424271402],"hpluv":[124.317503927832064,267.563092583833793,85.8629182835971676],"hsluv":[124.317503927832064,69.0205357789205749,85.8629182835971676]},"#88ee88":{"lch":[86.0858807036169793,79.3454652904755164,127.71501294923921],"luv":[86.0858807036169793,-48.5383458294846,62.7672832477191918],"rgb":[0.533333333333333326,0.933333333333333348,0.533333333333333326],"xyz":[0.451697738405384408,0.681589783083724754,0.340692205827843597],"hpluv":[127.71501294923921,248.989760930573482,86.0858807036169793],"hsluv":[127.71501294923921,59.5524101967812,86.0858807036169793]},"#88ee99":{"lch":[86.3459670558122525,71.3853284581525429,132.362204285947513],"luv":[86.3459670558122525,-48.1005130697284287,52.7466184841000825],"rgb":[0.533333333333333326,0.933333333333333348,0.6],"xyz":[0.464754702514457163,0.686812568727354,0.409458883468961532],"hpluv":[132.362204285947513,228.778132650246619,86.3459670558122525],"hsluv":[132.362204285947513,60.5562348819982645,86.3459670558122525]},"#88eeaa":{"lch":[86.6442747471204768,63.319361027400987,138.776693085718904],"luv":[86.6442747471204768,-47.625461320552418,41.7271723811105204],"rgb":[0.533333333333333326,0.933333333333333348,0.66666666666666663],"xyz":[0.479812395479709664,0.692835645913455,0.488762733085960077],"hpluv":[138.776693085718904,207.981038552319745,86.6442747471204768],"hsluv":[138.776693085718904,61.6537348625427342,86.6442747471204768]},"#88eebb":{"lch":[86.9816911545789679,55.7684583245382299,147.664608842749317],"luv":[86.9816911545789679,-47.1205330954276,29.8291184029711189],"rgb":[0.533333333333333326,0.933333333333333348,0.733333333333333282],"xyz":[0.496949987587046338,0.699690682756389792,0.579020718184601879],"hpluv":[147.664608842749317,188.458500832318975,86.9816911545789679],"hsluv":[147.664608842749317,62.830800627143077,86.9816911545789679]},"#88eecc":{"lch":[87.3589058048410294,49.6608679924305463,159.75715297219557],"luv":[87.3589058048410294,-46.5935415809549696,17.182656741768227],"rgb":[0.533333333333333326,0.933333333333333348,0.8],"xyz":[0.516242363030768092,0.70740763293387865,0.680627228854872],"hpluv":[159.75715297219557,173.371642714007834,87.3589058048410294],"hsluv":[159.75715297219557,64.0722902507549179,87.3589058048410294]},"#88eedd":{"lch":[87.7764209496729,46.2191498548509543,175.132102674355139],"luv":[87.7764209496729,-46.0524373199716166,3.92209512827700335],"rgb":[0.533333333333333326,0.933333333333333348,0.866666666666666696],"xyz":[0.53776068858140158,0.716014963154132156,0.793957076754878],"hpluv":[175.132102674355139,167.447502067072264,87.7764209496729],"hsluv":[175.132102674355139,65.3626972838926434,87.7764209496729]},"#88eeee":{"lch":[88.2345613859691866,46.5524177333431339,192.177050630060933],"luv":[88.2345613859691866,-45.5050097647113958,-9.8194543195231],"rgb":[0.533333333333333326,0.933333333333333348,0.933333333333333348],"xyz":[0.56157286884757629,0.725539835260602173,0.919367892823401256],"hpluv":[192.177050630060933,175.887543813927181,88.2345613859691866],"hsluv":[192.177050630060933,66.6867488369664443,88.2345613859691866]},"#88eeff":{"lch":[88.7334840469836763,50.9233073192915242,208.009521596121829],"luv":[88.7334840469836763,-44.9586380478967271,-23.9145163700465169],"rgb":[0.533333333333333326,0.933333333333333348,1],"xyz":[0.587743917257407711,0.736008254624534897,1.05720208111518299],"hpluv":[208.009521596121829,201.749007974481685,88.7334840469836763],"hsluv":[208.009521596121829,99.9999999999925109,88.7334840469836763]},"#336600":{"lch":[38.2101034680229574,51.4017776291135888,118.130952889189317],"luv":[38.2101034680229574,-24.2353400261634,45.3298029694491902],"rgb":[0.2,0.4,0],"xyz":[0.0611637321335456105,0.10206262662897396,0.0164771525704918292],"hpluv":[118.130952889189317,170.702252266418213,38.2101034680229574],"hsluv":[118.130952889189317,100.000000000002288,38.2101034680229574]},"#336611":{"lch":[38.2816545292110959,48.9828222693822468,119.470954908934345],"luv":[38.2816545292110959,-24.0986808399199681,42.6447002480913682],"rgb":[0.2,0.4,0.0666666666666666657],"xyz":[0.0621753976331827357,0.102467292828828813,0.021805257535247459],"hpluv":[119.470954908934345,162.365005406289157,38.2816545292110959],"hsluv":[119.470954908934345,93.5286374368429,38.2816545292110959]},"#336622":{"lch":[38.4137944304132617,44.7307250918699282,122.230818066602779],"luv":[38.4137944304132617,-23.8562978467226365,37.8380076152656173],"rgb":[0.2,0.4,0.133333333333333331],"xyz":[0.0640507557716597509,0.103217436084219627,0.0316821437312266585],"hpluv":[122.230818066602779,147.760399550800031,38.4137944304132617],"hsluv":[122.230818066602779,81.994947572555219,38.4137944304132617]},"#336633":{"lch":[38.6299730126545171,38.3921679396875817,127.715012949239437],"luv":[38.6299730126545171,-23.4858075099586969,30.3706339201924216],"rgb":[0.2,0.4,0.2],"xyz":[0.0671385065041174844,0.10445253637720274,0.0479442975888378],"hpluv":[127.715012949239437,126.112332565807833,38.6299730126545171],"hsluv":[127.715012949239437,64.2136550115152,38.6299730126545171]},"#336644":{"lch":[38.9390987599147635,30.7877900918170191,138.353415806708398],"luv":[38.9390987599147635,-23.0064236741332095,20.4595329483365589],"rgb":[0.2,0.4,0.266666666666666663],"xyz":[0.0715965017483363719,0.10623573447489032,0.0714230725417244472],"hpluv":[138.353415806708398,100.330262339301328,38.9390987599147635],"hsluv":[138.353415806708398,66.1490613915476899,38.9390987599147635]},"#336655":{"lch":[39.3471830293532108,24.0314899024670439,159.111050143656939],"luv":[39.3471830293532108,-22.4519783641565418,8.56861566811244479],"rgb":[0.2,0.4,0.333333333333333315],"xyz":[0.077558915787698357,0.108620700090635153,0.102825119815698349],"hpluv":[159.111050143656939,77.5008343503898089,39.3471830293532108],"hsluv":[159.111050143656939,68.4324421599544337,39.3471830293532108]},"#336666":{"lch":[39.8577781510875653,22.3660784387423632,192.177050630061],"luv":[39.8577781510875653,-21.8628519700770774,-4.71775036033837925],"rgb":[0.2,0.4,0.4],"xyz":[0.0851439115612065422,0.111654698400038471,0.142772764222842297],"hpluv":[192.177050630061,71.205917149352544,39.8577781510875653],"hsluv":[192.177050630061,70.9271962998489727,39.8577781510875653]},"#336677":{"lch":[40.4722660639059,28.403364995264031,221.483563289625266],"luv":[40.4722660639059,-21.2782609928981294,-18.8145356618838697],"rgb":[0.2,0.4,0.466666666666666674],"xyz":[0.0944579245814084478,0.115380303608119281,0.191826566129240206],"hpluv":[221.483563289625266,89.0536244466218534,40.4722660639059],"hsluv":[221.483563289625266,73.4989606489913,40.4722660639059]},"#336688":{"lch":[41.1901179582142731,39.1584560294521253,238.034471274574031],"luv":[41.1901179582142731,-20.7308371309926542,-33.2207325394668516],"rgb":[0.2,0.4,0.533333333333333326],"xyz":[0.105598341683352276,0.119836470448896878,0.250499429532812401],"hpluv":[238.034471274574031,120.634589470818128,41.1901179582142731],"hsluv":[238.034471274574031,76.0346320246428746,41.1901179582142731]},"#336699":{"lch":[42.0091634944821948,51.6886413393569626,246.942440261812],"luv":[42.0091634944821948,-20.2441498032976277,-47.5593318103852951],"rgb":[0.2,0.4,0.6],"xyz":[0.118655305792425,0.12505925609252605,0.31926610717393028],"hpluv":[246.942440261812,156.131455895945,42.0091634944821948],"hsluv":[246.942440261812,78.4511744564818514,42.0091634944821948]},"#3366aa":{"lch":[42.9258754740709847,64.6951641030825,252.148217293940775],"luv":[42.9258754740709847,-19.832670948043944,-61.5802681172418218],"rgb":[0.2,0.4,0.66666666666666663],"xyz":[0.133712998757677531,0.131082333278627144,0.398569956790928881],"hpluv":[252.148217293940775,191.245834212653307,42.9258754740709847],"hsluv":[252.148217293940775,80.6959595489171,42.9258754740709847]},"#3366bb":{"lch":[43.9356615222631106,77.6311657782158164,255.449757662516049],"luv":[43.9356615222631106,-19.5031901130623,-75.1413566253536374],"rgb":[0.2,0.4,0.733333333333333282],"xyz":[0.150850590865014178,0.137937370121561903,0.488827941889570627],"hpluv":[255.449757662516049,224.211696450950683,43.9356615222631106],"hsluv":[255.449757662516049,82.7420790911240402,43.9356615222631106]},"#3366cc":{"lch":[45.0331492258045287,90.2591849706621332,257.681278432902445],"luv":[45.0331492258045287,-19.2567634880452658,-88.1810497302775786],"rgb":[0.2,0.4,0.8],"xyz":[0.170142966308735932,0.145654320299050705,0.590434452559840839],"hpluv":[257.681278432902445,254.330482568364204,45.0331492258045287],"hsluv":[257.681278432902445,84.5818015821218694,45.0331492258045287]},"#3366dd":{"lch":[46.2124513047425367,102.485732700579547,259.264483160570819],"luv":[46.2124513047425367,-19.0906003056708045,-100.691977769551045],"rgb":[0.2,0.4,0.866666666666666696],"xyz":[0.191661291859369476,0.154261650519304239,0.703764300459846837],"hpluv":[259.264483160570819,281.412724566330553,46.2124513047425367],"hsluv":[259.264483160570819,86.2202337385041488,46.2124513047425367]},"#3366ee":{"lch":[47.467400384741687,114.289765210034219,260.43068521754094],"luv":[47.467400384741687,-18.99960653492559,-112.699447129445844],"rgb":[0.2,0.4,0.933333333333333348],"xyz":[0.215473472125544213,0.163786522625774256,0.82917511652837006],"hpluv":[260.43068521754094,305.528142270574733,47.467400384741687],"hsluv":[260.43068521754094,89.4216395109538524,47.467400384741687]},"#3366ff":{"lch":[48.7917470574018068,125.686826272807437,261.315666926990161],"luv":[48.7917470574018068,-18.9775194272026404,-124.245853270525785],"rgb":[0.2,0.4,1],"xyz":[0.241644520535375606,0.17425494198970698,0.967009304820151905],"hpluv":[261.315666926990161,326.875761207371056,48.7917470574018068],"hsluv":[261.315666926990161,99.9999999999992184,48.7917470574018068]},"#aaee00":{"lch":[86.8465682321076713,106.130019137569278,108.773889799394041],"luv":[86.8465682321076713,-34.1562767274136,100.483479847491182],"rgb":[0.66666666666666663,0.933333333333333348,0],"xyz":[0.471503904866347523,0.696940089394355811,0.109681215241027807],"hpluv":[108.773889799394041,354.560190530248747,86.8465682321076713],"hsluv":[108.773889799394041,100.000000000002302,86.8465682321076713]},"#aaee11":{"lch":[86.8664697406872364,105.275413073012288,108.926122010215039],"luv":[86.8664697406872364,-34.1459453835818323,99.5839696515197801],"rgb":[0.66666666666666663,0.933333333333333348,0.0666666666666666657],"xyz":[0.472515570365984627,0.697344755594210719,0.115009320205783444],"hpluv":[108.926122010215039,352.296735211520456,86.8664697406872364],"hsluv":[108.926122010215039,99.0448212343627,86.8664697406872364]},"#aaee22":{"lch":[86.9033414770782286,103.701584155213482,109.21343759479339],"luv":[86.9033414770782286,-34.1269596340241961,97.9253245204656224],"rgb":[0.66666666666666663,0.933333333333333348,0.133333333333333331],"xyz":[0.474390928504461684,0.69809489884960152,0.124886206401762637],"hpluv":[109.21343759479339,348.114419217609168,86.9033414770782286],"hsluv":[109.21343759479339,97.2844700630890742,86.9033414770782286]},"#aaee33":{"lch":[86.9639927659971,101.139559122436452,109.701502859778287],"luv":[86.9639927659971,-34.0961634116812462,95.2190215245081504],"rgb":[0.66666666666666663,0.933333333333333348,0.2],"xyz":[0.47747867923691939,0.699329999142584646,0.141148360259373773],"hpluv":[109.701502859778287,341.266668172598315,86.9639927659971],"hsluv":[109.701502859778287,94.4148698146506,86.9639927659971]},"#aaee44":{"lch":[87.0514332975086091,97.5044422856038864,110.440992284795044],"luv":[87.0514332975086091,-34.052698770047833,91.3648180204122298],"rgb":[0.66666666666666663,0.933333333333333348,0.266666666666666663],"xyz":[0.481936674481138305,0.701113197240272212,0.164627135212260411],"hpluv":[110.440992284795044,331.464832239423686,87.0514332975086091],"hsluv":[110.440992284795044,90.3338544995677353,87.0514332975086091]},"#aaee55":{"lch":[87.1681505263978,92.7597711807761556,111.499860176168639],"luv":[87.1681505263978,-33.9963593100021271,86.3054036730909644],"rgb":[0.66666666666666663,0.933333333333333348,0.333333333333333315],"xyz":[0.48789908852050029,0.703498162856017,0.196029182486234327],"hpluv":[111.499860176168639,318.513853400728863,87.1681505263978],"hsluv":[111.499860176168639,84.9871568734489813,87.1681505263978]},"#aaee66":{"lch":[87.3162499846890086,86.9168013961255923,112.975973936880195],"luv":[87.3162499846890086,-33.9275471197994563,80.0215715377255492],"rgb":[0.66666666666666663,0.933333333333333348,0.4],"xyz":[0.495484084294008476,0.70653216116542028,0.235976826893378289],"hpluv":[112.975973936880195,302.308385752370668,87.3162499846890086],"hsluv":[112.975973936880195,78.3634586897027106,87.3162499846890086]},"#aaee77":{"lch":[87.4975302296396,80.0378594698754853,115.017197938190947],"luv":[87.4975302296396,-33.8472328521792534,72.5287789554594298],"rgb":[0.66666666666666663,0.933333333333333348,0.466666666666666674],"xyz":[0.504798097314210326,0.710257766373501132,0.285030628799776198],"hpluv":[115.017197938190947,282.845349503141222,87.4975302296396],"hsluv":[115.017197938190947,70.4907283307095,87.4975302296396]},"#aaee88":{"lch":[87.7135274362348838,72.2451165326571072,117.856267937731204],"luv":[87.7135274362348838,-33.7569011423620324,63.8735351149597861],"rgb":[0.66666666666666663,0.933333333333333348,0.533333333333333326],"xyz":[0.515938514416154237,0.714713933214278674,0.343703492203348393],"hpluv":[117.856267937731204,260.261444274219798,87.7135274362348838],"hsluv":[117.856267937731204,61.4321883079204412,87.7135274362348838]},"#aaee99":{"lch":[87.9655440812905312,63.7405265694191954,121.874104620002555],"luv":[87.9655440812905312,-33.6584769753751445,54.1291202131068871],"rgb":[0.66666666666666663,0.933333333333333348,0.6],"xyz":[0.528995478525226881,0.719936718857907887,0.412470169844466272],"hpluv":[121.874104620002555,234.922523447188695,87.9655440812905312],"hsluv":[121.874104620002555,51.2814060811362182,87.9655440812905312]},"#aaeeaa":{"lch":[88.2546687059401,54.8509913255605497,127.715012949237604],"luv":[88.2546687059401,-33.5542349686064441,43.3906045713616138],"rgb":[0.66666666666666663,0.933333333333333348,0.66666666666666663],"xyz":[0.544053171490479492,0.725959796044009,0.491774019461464873],"hpluv":[127.715012949237604,207.631017102058365,88.2546687059401],"hsluv":[127.715012949237604,42.8122115000723795,88.2546687059401]},"#aaeebb":{"lch":[88.5817905154621457,46.1299748711590425,136.47329364537066],"luv":[88.5817905154621457,-33.4466969972147226,31.7693726974624511],"rgb":[0.66666666666666663,0.933333333333333348,0.733333333333333282],"xyz":[0.561190763597816056,0.732814832886943712,0.582032004560106619],"hpluv":[136.47329364537066,180.106084736741337,88.5817905154621457],"hsluv":[136.47329364537066,42.5306558804052,88.5817905154621457]},"#aaeecc":{"lch":[88.947610994722524,38.5659339652702471,149.820563383504265],"luv":[88.947610994722524,-33.3385252257337896,19.3874701388989088],"rgb":[0.66666666666666663,0.933333333333333348,0.8],"xyz":[0.58048313904153781,0.740531783064432569,0.683638515230376775],"hpluv":[149.820563383504265,156.025185046421541,88.947610994722524],"hsluv":[149.820563383504265,43.7743007306855176,88.947610994722524]},"#aaeedd":{"lch":[89.3526538659385636,33.8378115459028308,169.14561851222],"luv":[89.3526538659385636,-33.2324178366612202,6.37211856022751721],"rgb":[0.66666666666666663,0.933333333333333348,0.866666666666666696],"xyz":[0.602001464592171409,0.749139113284686076,0.796968363130382773],"hpluv":[169.14561851222,142.575756051086472,89.3526538659385636],"hsluv":[169.14561851222,45.7128350403065866,89.3526538659385636]},"#aaeeee":{"lch":[89.797274219494,33.893604395025335,192.177050630060734],"luv":[89.797274219494,-33.1310138990311174,-7.14928925898844092],"rgb":[0.66666666666666663,0.933333333333333348,0.933333333333333348],"xyz":[0.625813644858346119,0.758663985391156093,0.922379179198906],"hpluv":[192.177050630060734,149.574468983420843,89.797274219494],"hsluv":[192.177050630060734,47.7079369778472326,89.797274219494]},"#aaeeff":{"lch":[90.2816673401601406,39.1749897548907384,212.508271358442045],"luv":[90.2816673401601406,-33.0368122621910558,-21.0534761464356919],"rgb":[0.66666666666666663,0.933333333333333348,1],"xyz":[0.65198469326817754,0.769132404755088817,1.06021336749068773],"hpluv":[212.508271358442045,182.211685385120148,90.2816673401601406],"hsluv":[212.508271358442045,99.9999999999910898,90.2816673401601406]},"#88ff00":{"lch":[90.2073775103659727,121.530167505498795,118.25137340908573],"luv":[90.2073775103659727,-57.5251845782800331,107.053420090856534],"rgb":[0.533333333333333326,1,0],"xyz":[0.459115501285251582,0.767520684123151,0.12395405300874715],"hpluv":[118.25137340908573,560.639311859311,90.2073775103659727],"hsluv":[118.25137340908573,100.00000000000226,90.2073775103659727]},"#88ff11":{"lch":[90.2260397586701828,120.75410845816802,118.424372307304225],"luv":[90.2260397586701828,-57.4787561773275684,106.196738640291272],"rgb":[0.533333333333333326,1,0.0666666666666666657],"xyz":[0.460127166784888686,0.767925350323005906,0.129282157973502787],"hpluv":[118.424372307304225,558.207032378019221,90.2260397586701828],"hsluv":[118.424372307304225,99.9999999999909335,90.2260397586701828]},"#88ff22":{"lch":[90.260617257984066,119.32542599803422,118.749452026898098],"luv":[90.260617257984066,-57.393189210317729,104.616342518179295],"rgb":[0.533333333333333326,1,0.133333333333333331],"xyz":[0.462002524923365743,0.768675493578396707,0.139159044169481966],"hpluv":[118.749452026898098,553.71568515647823,90.260617257984066],"hsluv":[118.749452026898098,99.9999999999907772,90.260617257984066]},"#88ff33":{"lch":[90.3174996442954665,117.001153508636776,119.297411154505227],"luv":[90.3174996442954665,-57.253701051451273,102.035697862378711],"rgb":[0.533333333333333326,1,0.2],"xyz":[0.465090275655823449,0.769910593871379834,0.155421198027093116],"hpluv":[119.297411154505227,546.370637823869743,90.3174996442954665],"hsluv":[119.297411154505227,99.9999999999907914,90.3174996442954665]},"#88ff44":{"lch":[90.399517385893148,113.706822542904789,120.117552028257023],"luv":[90.399517385893148,-57.0553255590242614,98.3561452994036074],"rgb":[0.533333333333333326,1,0.266666666666666663],"xyz":[0.469548270900042364,0.7716937919690674,0.178899972979979754],"hpluv":[120.117552028257023,535.877566613280692,90.399517385893148],"hsluv":[120.117552028257023,99.9999999999907914,90.399517385893148]},"#88ff55":{"lch":[90.5090160073098389,109.413894688598035,121.271093020798972],"luv":[90.5090160073098389,-56.7954345723420317,93.518334901057969],"rgb":[0.533333333333333326,1,0.333333333333333315],"xyz":[0.475510684939404349,0.774078757584812149,0.21030202025395367],"hpluv":[121.271093020798972,522.05545338002139,90.5090160073098389],"hsluv":[121.271093020798972,99.9999999999906493,90.5090160073098389]},"#88ff66":{"lch":[90.6479884721694,104.139810410505333,122.839359042112989],"luv":[90.6479884721694,-56.4735097148607039,87.4976731851854908],"rgb":[0.533333333333333326,1,0.4],"xyz":[0.483095680712912534,0.777112755894215468,0.250249664661097659],"hpluv":[122.839359042112989,504.839052288882328,90.6479884721694],"hsluv":[122.839359042112989,99.9999999999905498,90.6479884721694]},"#88ff77":{"lch":[90.8181461195308515,97.9515013566305441,124.934550835890477],"luv":[90.8181461195308515,-56.0909812525741813,80.3012978733306],"rgb":[0.533333333333333326,1,0.466666666666666674],"xyz":[0.49240969373311444,0.780838361102296319,0.299303466567495513],"hpluv":[124.934550835890477,484.301391198376791,90.8181461195308515],"hsluv":[124.934550835890477,99.9999999999904,90.8181461195308515]},"#88ff88":{"lch":[91.0209609702079803,90.9725812653771,127.715012949239437],"luv":[91.0209609702079803,-55.6510519447396348,71.9650676337452779],"rgb":[0.533333333333333326,1,0.533333333333333326],"xyz":[0.503550110835058295,0.785294527943073861,0.357976329971067708],"hpluv":[127.715012949239437,460.703998076760797,91.0209609702079803],"hsluv":[127.715012949239437,99.9999999999902087,91.0209609702079803]},"#88ff99":{"lch":[91.2576929391802167,83.3964386150156116,131.406800448379954],"luv":[91.2576929391802167,-55.158478848678719,62.5500454417735057],"rgb":[0.533333333333333326,1,0.6],"xyz":[0.51660707494413094,0.790517313586703074,0.426743007612185643],"hpluv":[131.406800448379954,434.595507650037121,91.2576929391802167],"hsluv":[131.406800448379954,99.9999999999900524,91.2576929391802167]},"#88ffaa":{"lch":[91.5294084976530229,75.5094657025462226,136.33125230150921],"luv":[91.5294084976530229,-54.6193101996060264,52.1383770748881048],"rgb":[0.533333333333333326,1,0.66666666666666663],"xyz":[0.531664767909383551,0.796540390772804141,0.506046857229184188],"hpluv":[136.33125230150921,406.99849880976177,91.5294084976530229],"hsluv":[136.33125230150921,99.9999999999897824,91.5294084976530229]},"#88ffbb":{"lch":[91.8369943060547911,67.7301008509963225,142.928263991524119],"luv":[91.8369943060547911,-54.0405872892441,40.8286846067776423],"rgb":[0.533333333333333326,1,0.733333333333333282],"xyz":[0.548802360016720114,0.8033954276157389,0.596304842327826],"hpluv":[142.928263991524119,379.751065707187763,91.8369943060547911],"hsluv":[142.928263991524119,99.9999999999894413,91.8369943060547911]},"#88ffcc":{"lch":[92.1811678623774498,60.665065650155249,151.731515164157571],"luv":[92.1811678623774498,-53.4300279465168941,28.7312078404662543],"rgb":[0.533333333333333326,1,0.8],"xyz":[0.568094735460441869,0.811112377793227757,0.697911352998096146],"hpluv":[151.731515164157571,356.080713038752435,92.1811678623774498],"hsluv":[151.731515164157571,99.9999999999893134,92.1811678623774498]},"#88ffdd":{"lch":[92.5624864174544371,55.1561732277505712,163.177123134509742],"luv":[92.5624864174544371,-52.7957106082625316,15.9629692256241533],"rgb":[0.533333333333333326,1,0.866666666666666696],"xyz":[0.589613061011075468,0.819719708013481263,0.811241200898102144],"hpluv":[163.177123134509742,341.369587308077,92.5624864174544371],"hsluv":[163.177123134509742,99.9999999999887,92.5624864174544371]},"#88ffee":{"lch":[92.9813549493531752,52.2127257219241301,177.098205352907513],"luv":[92.9813549493531752,-52.1457771028834927,2.64322864112605771],"rgb":[0.533333333333333326,1,0.933333333333333348],"xyz":[0.613425241277250177,0.82924458011995128,0.936652016966625367],"hpluv":[177.098205352907513,343.566349205584061,92.9813549493531752],"hsluv":[177.098205352907513,99.9999999999882,92.9813549493531752]},"#88ffff":{"lch":[93.4380337051328524,52.6732939730945162,192.177050630061075],"luv":[93.4380337051328524,-51.4881691068088543,-11.1105508416409933],"rgb":[0.533333333333333326,1,1],"xyz":[0.639596289687081598,0.839712999483884,1.07448620525840721],"hpluv":[192.177050630061075,372.044084252862206,93.4380337051328524],"hsluv":[192.177050630061075,99.9999999999874802,93.4380337051328524]},"#337700":{"lch":[44.0848685544221084,61.4877933810524127,120.932619831412623],"luv":[44.0848685544221084,-31.6065510805688668,52.7425318283298168],"rgb":[0.2,0.466666666666666674,0],"xyz":[0.0796174701869632462,0.138970102735809731,0.0226283985882975332],"hpluv":[120.932619831412623,176.985906279588789,44.0848685544221084],"hsluv":[120.932619831412623,100.000000000002217,44.0848685544221084]},"#337711":{"lch":[44.1431322932100159,59.4532082216814146,121.943929432148849],"luv":[44.1431322932100159,-31.4560442613915434,50.449987584497805],"rgb":[0.2,0.466666666666666674,0.0666666666666666657],"xyz":[0.0806291356866003645,0.139374768935664584,0.0279565035530531664],"hpluv":[121.943929432148849,170.903703930819205,44.1431322932100159],"hsluv":[121.943929432148849,95.223210781581642,44.1431322932100159]},"#337722":{"lch":[44.2508401312458517,55.8308883755444327,123.957293362486936],"luv":[44.2508401312458517,-31.1857277137109214,46.3091619851707605],"rgb":[0.2,0.466666666666666674,0.133333333333333331],"xyz":[0.0825044938250774,0.140124912191055412,0.037833389749032359],"hpluv":[123.957293362486936,160.100373243526178,44.2508401312458517],"hsluv":[123.957293362486936,86.6219708852072,44.2508401312458517]},"#337733":{"lch":[44.4273451577554681,50.2894934834324943,127.715012949239792],"luv":[44.4273451577554681,-30.7638100974309978,39.782171171385329],"rgb":[0.2,0.466666666666666674,0.2],"xyz":[0.0855922445575351271,0.141360012484038511,0.0540955436066435091],"hpluv":[127.715012949239792,143.636966976451419,44.4273451577554681],"hsluv":[127.715012949239792,73.1368174441878409,44.4273451577554681]},"#337744":{"lch":[44.6803728315295743,43.2379901525315873,134.305487238163835],"luv":[44.6803728315295743,-30.2010367205865329,30.9422231494797764],"rgb":[0.2,0.466666666666666674,0.266666666666666663],"xyz":[0.090050239801754,0.143143210581726105,0.0775743185595301477],"hpluv":[134.305487238163835,122.797079037201513,44.6803728315295743],"hsluv":[134.305487238163835,74.2422920898123664,44.6803728315295743]},"#337755":{"lch":[45.0155248592042057,35.7001949681147,145.791078733963843],"luv":[45.0155248592042057,-29.5238129364495734,20.071083439987369],"rgb":[0.2,0.466666666666666674,0.333333333333333315],"xyz":[0.096012653841116,0.145528176197470938,0.108976365833504049],"hpluv":[145.791078733963843,100.634662922797503,45.0155248592042057],"hsluv":[145.791078733963843,75.5860232244433377,45.0155248592042057]},"#337766":{"lch":[45.436632811343884,29.7520619336037022,165.22669317203713],"luv":[45.436632811343884,-28.7685269489331041,7.58663604567268468],"rgb":[0.2,0.466666666666666674,0.4],"xyz":[0.103597649614624171,0.148562174506874228,0.148924010240648025],"hpluv":[165.22669317203713,83.0902864995861847,45.436632811343884],"hsluv":[165.22669317203713,77.1054195363406194,45.436632811343884]},"#337777":{"lch":[45.9459628200325696,28.6191137838588361,192.177050630061018],"luv":[45.9459628200325696,-27.9751968985082726,-6.03672363647301413],"rgb":[0.2,0.466666666666666674,0.466666666666666674],"xyz":[0.11291166263482609,0.152287779714955052,0.197977812147045934],"hpluv":[192.177050630061018,79.0402219352416324,45.9459628200325696],"hsluv":[192.177050630061018,78.7308353184449743,45.9459628200325696]},"#337788":{"lch":[46.5443737533918309,33.948531272854666,216.805091226728479],"luv":[46.5443737533918309,-27.1818468531358306,-20.3383867904182836],"rgb":[0.2,0.466666666666666674,0.533333333333333326],"xyz":[0.124052079736769919,0.156743946555732649,0.256650675550618101],"hpluv":[216.805091226728479,92.5535593562344587,46.5443737533918309],"hsluv":[216.805091226728479,80.3955897349876381,46.5443737533918309]},"#337799":{"lch":[47.2314677007312085,43.7891028043947799,232.889035089769209],"luv":[47.2314677007312085,-26.4206199262946413,-34.9204290798973105],"rgb":[0.2,0.466666666666666674,0.6],"xyz":[0.137109043845842632,0.161966732199361807,0.325417353191736],"hpluv":[232.889035089769209,117.645124104106614,47.2314677007312085],"hsluv":[232.889035089769209,82.0429045074046144,47.2314677007312085]},"#3377aa":{"lch":[48.0057466772197472,55.756363166772573,242.534195481556935],"luv":[48.0057466772197472,-25.7159019754829359,-49.471854818395343],"rgb":[0.2,0.466666666666666674,0.66666666666666663],"xyz":[0.15216673681109516,0.167989809385462902,0.404721202808734581],"hpluv":[242.534195481556935,147.380673097935755,48.0057466772197472],"hsluv":[242.534195481556935,83.6292827510673078,48.0057466772197472]},"#3377bb":{"lch":[48.8647777502949623,68.5281348418467076,248.528316013511841],"luv":[48.8647777502949623,-25.0841318464231762,-63.7721851155626],"rgb":[0.2,0.466666666666666674,0.733333333333333282],"xyz":[0.169304328918431835,0.17484484622839766,0.494979187907376328],"hpluv":[248.528316013511841,177.955866809146045,48.8647777502949623],"hsluv":[248.528316013511841,85.1249045257873,48.8647777502949623]},"#3377cc":{"lch":[49.8053630390326845,81.4640551302433096,252.471981644912631],"luv":[49.8053630390326845,-24.5347040681135518,-77.6816617648812553],"rgb":[0.2,0.466666666666666674,0.8],"xyz":[0.188596704362153561,0.182561796405886462,0.596585698577646539],"hpluv":[252.471981644912631,207.553107999557341,49.8053630390326845],"hsluv":[252.471981644912631,86.5120902950020678,49.8053630390326845]},"#3377dd":{"lch":[50.8237086019957047,94.2508792352234,255.202895611269554],"luv":[50.8237086019957047,-24.0713820337122506,-91.1251710758325],"rgb":[0.2,0.466666666666666674,0.866666666666666696],"xyz":[0.210115029912787105,0.19116912662614,0.709915546477652537],"hpluv":[255.202895611269554,235.319753343529385,50.8237086019957047],"hsluv":[255.202895611269554,87.7828608732328,50.8237086019957047]},"#3377ee":{"lch":[51.9155858415672498,106.73807185779232,257.174602046687482],"luv":[51.9155858415672498,-23.6937959642247655,-104.075069141100855],"rgb":[0.2,0.466666666666666674,0.933333333333333348],"xyz":[0.233927210178961842,0.200693998732610041,0.83532636254617576],"hpluv":[257.174602046687482,260.892095272406607,51.9155858415672498],"hsluv":[257.174602046687482,88.9363454602875692,51.9155858415672498]},"#3377ff":{"lch":[53.0764799083082721,118.861737619173724,258.646767383963777],"luv":[53.0764799083082721,-23.3987809317452253,-116.535873106771263],"rgb":[0.2,0.466666666666666674,1],"xyz":[0.260098258588793207,0.211162418096542737,0.973160550837957605],"hpluv":[258.646767383963777,284.170694785425781,53.0764799083082721],"hsluv":[258.646767383963777,99.9999999999990763,53.0764799083082721]},"#aaff00":{"lch":[91.7137860391432156,115.080534629040301,111.722667154579099],"luv":[91.7137860391432156,-42.5929524944460596,106.908230966149674],"rgb":[0.66666666666666663,1,0],"xyz":[0.523356277296021299,0.800644834253704918,0.126965339384251918],"hpluv":[111.722667154579099,635.020942157405898,91.7137860391432156],"hsluv":[111.722667154579099,100.000000000002359,91.7137860391432156]},"#aaff11":{"lch":[91.7319300755291209,114.302910123776968,111.867287470019974],"luv":[91.7319300755291209,-42.5730312099484394,106.078707931238455],"rgb":[0.66666666666666663,1,0.0666666666666666657],"xyz":[0.524367942795658459,0.801049500453559826,0.132293444349007555],"hpluv":[111.867287470019974,632.205251281199821,91.7319300755291209],"hsluv":[111.867287470019974,99.9999999999902087,91.7319300755291209]},"#aaff22":{"lch":[91.76554812600844,112.870020698142184,112.139393409643191],"luv":[91.76554812600844,-42.5363318976714595,104.548084827461963],"rgb":[0.66666666666666663,1,0.133333333333333331],"xyz":[0.526243300934135405,0.801799643708950627,0.142170330544986734],"hpluv":[112.139393409643191,626.996151229530483,91.76554812600844],"hsluv":[112.139393409643191,99.9999999999901,91.76554812600844]},"#aaff33":{"lch":[91.8208541183991116,110.535111156119868,112.599114759903571],"luv":[91.8208541183991116,-42.4765495373732875,102.047800258971023],"rgb":[0.66666666666666663,1,0.2],"xyz":[0.529331051666593222,0.803034744001933753,0.158432484402597884],"hpluv":[112.599114759903571,618.449193227995465,91.8208541183991116],"hsluv":[112.599114759903571,99.9999999999900808,91.8208541183991116]},"#aaff44":{"lch":[91.9006031807778498,107.217215837920833,113.289723447654],"luv":[91.9006031807778498,-42.3916247074254713,98.4808688360338],"rgb":[0.66666666666666663,1,0.266666666666666663],"xyz":[0.533789046910812082,0.80481794209962132,0.181911259355484523],"hpluv":[113.289723447654,606.175591066234915,91.9006031807778498],"hsluv":[113.289723447654,99.9999999999900808,91.9006031807778498]},"#aaff55":{"lch":[92.0070808640835338,102.877427982590888,114.266397603879824],"luv":[92.0070808640835338,-42.2805422001356135,93.7876374559873796],"rgb":[0.66666666666666663,1,0.333333333333333315],"xyz":[0.539751460950174,0.807202907715366069,0.213313306629458438],"hpluv":[114.266397603879824,589.885725054723707,92.0070808640835338],"hsluv":[114.266397603879824,99.9999999999897,92.0070808640835338]},"#aaff66":{"lch":[92.142232175119787,97.5178938455906,115.604656391492952],"luv":[92.142232175119787,-42.1432392632638226,87.9413839126902559],"rgb":[0.66666666666666663,1,0.4],"xyz":[0.547336456723682252,0.810236906024769388,0.2532609510366024],"hpluv":[115.604656391492952,569.381090837871511,92.142232175119787],"hsluv":[115.604656391492952,99.9999999999898,92.142232175119787]},"#aaff77":{"lch":[92.3077308115560555,91.1840841453542197,117.412488820025033],"luv":[92.3077308115560555,-41.9805406670279666,80.9454841651530899],"rgb":[0.66666666666666663,1,0.466666666666666674],"xyz":[0.556650469743884102,0.813962511232850239,0.302314752943000309],"hpluv":[117.412488820025033,544.56608764574878,92.3077308115560555],"hsluv":[117.412488820025033,99.9999999999895692,92.3077308115560555]},"#aaff88":{"lch":[92.5050204995058749,83.9705472319660657,119.849478645386625],"luv":[92.5050204995058749,-41.7940850853900727,72.8306752289927601],"rgb":[0.66666666666666663,1,0.533333333333333326],"xyz":[0.567790886845828,0.818418678073627781,0.360987616346572504],"hpluv":[119.849478645386625,515.487838204951345,92.5050204995058749],"hsluv":[119.849478645386625,99.9999999999892708,92.5050204995058749]},"#aaff99":{"lch":[92.7353415895377,76.0327408171719,123.158131820453576],"luv":[92.7353415895377,-41.5862309318022625,63.6518897838709137],"rgb":[0.66666666666666663,1,0.6],"xyz":[0.580847850954900657,0.823641463717257,0.429754293987690383],"hpluv":[123.158131820453576,482.430180447041607,92.7353415895377],"hsluv":[123.158131820453576,99.9999999999891145,92.7353415895377]},"#aaffaa":{"lch":[92.9997492696274435,67.6109506527765802,127.715012949238414],"luv":[92.9997492696274435,-41.3599402641421108,53.4845397242865488],"rgb":[0.66666666666666663,1,0.66666666666666663],"xyz":[0.595905543920153269,0.829664540903358061,0.509058143604689],"hpluv":[127.715012949238414,446.121940639593902,92.9997492696274435],"hsluv":[127.715012949238414,99.9999999999887308,92.9997492696274435]},"#aaffbb":{"lch":[93.2991268167713201,59.0781485982363,134.10730048328],"luv":[93.2991268167713201,-41.1186450338129887,42.4203332421914823],"rgb":[0.66666666666666663,1,0.733333333333333282],"xyz":[0.613043136027489832,0.836519577746292819,0.599316128703330731],"hpluv":[134.10730048328,408.190288953842469,93.2991268167713201],"hsluv":[134.10730048328,99.9999999999883613,93.2991268167713201]},"#aaffcc":{"lch":[93.6341958749929404,51.0306218960527929,143.208028901391231],"luv":[93.6341958749929404,-40.8661030238149436,30.5628204644932246],"rgb":[0.66666666666666663,1,0.8],"xyz":[0.632335511471211587,0.844236527923781677,0.700922639373600886],"hpluv":[143.208028901391231,372.11656739719416,93.6341958749929404],"hsluv":[143.208028901391231,99.9999999999879492,93.6341958749929404]},"#aaffdd":{"lch":[94.005524978734,44.4262644213682094,156.066165366624773],"luv":[94.005524978734,-40.6062520520773305,18.0229094410556279],"rgb":[0.66666666666666663,1,0.866666666666666696],"xyz":[0.653853837021845186,0.852843858144035183,0.814252487273606884],"hpluv":[156.066165366624773,345.018188987702331,94.005524978734],"hsluv":[156.066165366624773,99.999999999986926,94.005524978734]},"#aaffee":{"lch":[94.4135370960349576,40.641316399200953,173.054449077896464],"luv":[94.4135370960349576,-40.3430708217409446,4.91459411670529711],"rgb":[0.66666666666666663,1,0.933333333333333348],"xyz":[0.677666017288019895,0.8623687302505052,0.939663303342130107],"hpluv":[173.054449077896464,339.745490646316398,94.4135370960349576],"hsluv":[173.054449077896464,99.9999999999862865,94.4135370960349576]},"#aaffff":{"lch":[94.8585166918378633,41.0030022313427764,192.177050630060705],"luv":[94.8585166918378633,-40.0804535568370639,-8.64889788711415264],"rgb":[0.66666666666666663,1,1],"xyz":[0.703837065697851316,0.872837149614437924,1.07749749163391195],"hpluv":[192.177050630060705,373.711432895013843,94.8585166918378633],"hsluv":[192.177050630060705,99.9999999999852491,94.8585166918378633]},"#338800":{"lch":[49.8717454753508918,71.2965557675853461,122.69380865426514],"luv":[49.8717454753508918,-38.5107906934601871,60.0009821960016509],"rgb":[0.2,0.533333333333333326,0],"xyz":[0.101689839911933699,0.183114842185751275,0.0299858551632874795],"hpluv":[122.69380865426514,181.406693814272955,49.8717454753508918],"hsluv":[122.69380865426514,100.000000000002245,49.8717454753508918]},"#338811":{"lch":[49.9202331837381053,69.5570511040883162,123.47043015419375],"luv":[49.9202331837381053,-38.361169332567485,58.0224443274741475],"rgb":[0.2,0.533333333333333326,0.0666666666666666657],"xyz":[0.102701505411570818,0.183519508385606128,0.0353139601280431092],"hpluv":[123.47043015419375,176.808802540010674,49.9202331837381053],"hsluv":[123.47043015419375,96.3624965314944291,49.9202331837381053]},"#338822":{"lch":[50.0099282713402,66.4316762124597915,124.985970570646856],"luv":[50.0099282713402,-38.0903182709230137,54.426971791721833],"rgb":[0.2,0.533333333333333326,0.133333333333333331],"xyz":[0.104576863550047847,0.184269651640996956,0.0451908463240223088],"hpluv":[124.985970570646856,168.561468288507513,50.0099282713402],"hsluv":[124.985970570646856,89.7672781446156876,50.0099282713402]},"#338833":{"lch":[50.1570811029395429,61.5658815699287487,127.715012949239991],"luv":[50.1570811029395429,-37.6619639194057143,48.7025076070614134],"rgb":[0.2,0.533333333333333326,0.2],"xyz":[0.10766461428250558,0.185504751933980055,0.061453000181633452],"hpluv":[127.715012949239991,155.756856758587162,50.1570811029395429],"hsluv":[127.715012949239991,79.3080015418374416,50.1570811029395429]},"#338844":{"lch":[50.3683877843642165,55.1600753981733334,132.238380805917416],"luv":[50.3683877843642165,-37.0795228857786441,40.8380080377971524],"rgb":[0.2,0.533333333333333326,0.266666666666666663],"xyz":[0.112122609526724454,0.187287950031667649,0.0849317751345200905],"hpluv":[132.238380805917416,138.965222681713072,50.3683877843642165],"hsluv":[132.238380805917416,79.9701630926319922,50.3683877843642165]},"#338855":{"lch":[50.648916869713247,47.7759983149871488,139.558488969535745],"luv":[50.648916869713247,-36.3608093871966886,30.990926990033774],"rgb":[0.2,0.533333333333333326,0.333333333333333315],"xyz":[0.118085023566086453,0.189672915647412482,0.116333822408493992],"hpluv":[139.558488969535745,119.695806374350084,50.648916869713247],"hsluv":[139.558488969535745,80.7922551095087726,50.648916869713247]},"#338866":{"lch":[51.0024095938582747,40.50700493167151,151.3112863122482],"luv":[51.0024095938582747,-35.5343950908498,19.4454162738124445],"rgb":[0.2,0.533333333333333326,0.4],"xyz":[0.125670019339594624,0.192706913956815773,0.156281466815637954],"hpluv":[151.3112863122482,100.78102351571394,51.0024095938582747],"hsluv":[151.3112863122482,81.7453783644028249,51.0024095938582747]},"#338877":{"lch":[51.4314426692160964,35.2513066472794421,169.271441625736571],"luv":[51.4314426692160964,-34.635118433957949,6.56225505495134165],"rgb":[0.2,0.533333333333333326,0.466666666666666674],"xyz":[0.134984032359796557,0.196432519164896596,0.205335268722035863],"hpluv":[169.271441625736571,86.9732781104886499,51.4314426692160964],"hsluv":[169.271441625736571,82.7938072280844182,51.4314426692160964]},"#338888":{"lch":[51.9375397067754818,34.4751674240590873,192.177050630061075],"luv":[51.9375397067754818,-33.6994920276336458,-7.27196025816705482],"rgb":[0.2,0.533333333333333326,0.533333333333333326],"xyz":[0.146124449461740358,0.200888686005674194,0.26400813212560803],"hpluv":[192.177050630061075,84.229522237058,51.9375397067754818],"hsluv":[192.177050630061075,83.8998231764876579,51.9375397067754818]},"#338899":{"lch":[52.5212658253882267,39.2899369869163,213.503984387174484],"luv":[52.5212658253882267,-32.7618132949538179,-21.68784770470414],"rgb":[0.2,0.533333333333333326,0.6],"xyz":[0.159181413570813085,0.206111471649303352,0.332774809766725965],"hpluv":[213.503984387174484,94.9260641143146415,52.5212658253882267],"hsluv":[213.503984387174484,85.0278067813718081,52.5212658253882267]},"#3388aa":{"lch":[53.1823203703714142,48.3403865273999855,228.783963154055925],"luv":[53.1823203703714142,-31.8514822326876157,-36.3631138545534753],"rgb":[0.2,0.533333333333333326,0.66666666666666663],"xyz":[0.174239106536065613,0.212134548835404446,0.412078659383724566],"hpluv":[228.783963154055925,115.340588590435829,53.1823203703714142],"hsluv":[228.783963154055925,86.1470646970195588,53.1823203703714142]},"#3388bb":{"lch":[53.9196335036436238,59.7107302664646866,238.732819450220632],"luv":[53.9196335036436238,-30.9916356267104831,-51.0381213421469],"rgb":[0.2,0.533333333333333326,0.733333333333333282],"xyz":[0.191376698643402288,0.218989585678339205,0.502336644482366257],"hpluv":[238.732819450220632,140.522147305520861,53.9196335036436238],"hsluv":[238.732819450220632,87.2332789223686262,53.9196335036436238]},"#3388cc":{"lch":[54.7314676322995268,72.1439684856409826,245.254262274299492],"luv":[54.7314676322995268,-30.1989009668194051,-65.5192992121664446],"rgb":[0.2,0.533333333333333326,0.8],"xyz":[0.210669074087124014,0.226706535855828,0.603943155152636413],"hpluv":[245.254262274299492,167.263916186866481,54.7314676322995268],"hsluv":[245.254262274299492,88.2687848362996,54.7314676322995268]},"#3388dd":{"lch":[55.6155220749816692,84.9545141717074728,249.692682338977761],"luv":[55.6155220749816692,-29.4839257322198733,-79.6741338300441697],"rgb":[0.2,0.533333333333333326,0.866666666666666696],"xyz":[0.232187399637757558,0.23531386607608154,0.717273003052642411],"hpluv":[249.692682338977761,193.833915517882872,55.6155220749816692],"hsluv":[249.692682338977761,89.2420383366021923,55.6155220749816692]},"#3388ee":{"lch":[56.5690381344568323,97.7754852991564434,252.83721230554255],"luv":[56.5690381344568323,-28.8523290085395629,-93.4215640859675602],"rgb":[0.2,0.533333333333333326,0.933333333333333348],"xyz":[0.255999579903932295,0.244838738182551585,0.842683819121165634],"hpluv":[252.83721230554255,219.32619909500923,56.5690381344568323],"hsluv":[252.83721230554255,90.146641202583325,56.5690381344568323]},"#3388ff":{"lch":[57.5889013880528182,110.410831334845568,255.145344615238457],"luv":[57.5889013880528182,-28.3057941013035759,-106.720821287817699],"rgb":[0.2,0.533333333333333326,1],"xyz":[0.282170628313763716,0.255307157546484254,0.980518007412947479],"hpluv":[255.145344615238457,243.283252172694205,57.5889013880528182],"hsluv":[255.145344615238457,99.9999999999988489,57.5889013880528182]},"#339900":{"lch":[55.5688440832231,80.82821284508357,123.866754715109295],"luv":[55.5688440832231,-45.0426054376311527,67.1145564473163603],"rgb":[0.2,0.6,0],"xyz":[0.127559440364401172,0.23485404309068697,0.0386090553141097345],"hpluv":[123.866754715109295,184.574176757765827,55.5688440832231],"hsluv":[123.866754715109295,100.00000000000226,55.5688440832231]},"#339911":{"lch":[55.6099261578814463,79.3206910999707446,124.475743785225987],"luv":[55.6099261578814463,-44.9000555787807372,65.3892731692238556],"rgb":[0.2,0.6,0.0666666666666666657],"xyz":[0.128571105864038304,0.235258709290541823,0.0439371602788653642],"hpluv":[124.475743785225987,180.997883954149785,55.6099261578814463],"hsluv":[124.475743785225987,97.1571693172972601,55.6099261578814463]},"#339922":{"lch":[55.6859569378682124,76.5942224429011418,125.649114872203555],"luv":[55.6859569378682124,-44.6406262928881503,62.240576763164114],"rgb":[0.2,0.6,0.133333333333333331],"xyz":[0.130446464002515305,0.236008852545932651,0.0538140464748445638],"hpluv":[125.649114872203555,174.537861698610129,55.6859569378682124],"hsluv":[125.649114872203555,91.9778413864117113,55.6859569378682124]},"#339933":{"lch":[55.8107903110879278,72.2971425020977563,127.715012949240148],"luv":[55.8107903110879278,-44.2266447414942618,57.191613973364035],"rgb":[0.2,0.6,0.2],"xyz":[0.133534214734973067,0.23724395283891575,0.070076200332455707],"hpluv":[127.715012949240148,164.377468022308932,55.8107903110879278],"hsluv":[127.715012949240148,83.6974291768240874,55.8107903110879278]},"#339944":{"lch":[55.9902586993563602,66.5149718399310501,131.021169741293448],"luv":[55.9902586993563602,-43.6562926505411042,50.1833597009719128],"rgb":[0.2,0.6,0.266666666666666663],"xyz":[0.137992209979191927,0.239027150936603344,0.0935549752853423455],"hpluv":[131.021169741293448,150.746162046382238,55.9902586993563602],"hsluv":[131.021169741293448,84.1112663411127386,55.9902586993563602]},"#339955":{"lch":[56.2289015921924,59.572114639014508,136.121417864766215],"luv":[56.2289015921924,-42.9401916463123783,41.2913645202220323],"rgb":[0.2,0.6,0.333333333333333315],"xyz":[0.143954624018553912,0.241412116552348177,0.124957022559316261],"hpluv":[136.121417864766215,134.438216783596687,56.2289015921924],"hsluv":[136.121417864766215,84.6329955380286236,56.2289015921924]},"#339966":{"lch":[56.5302268191487514,52.1043875673731947,143.898662284026642],"luv":[56.5302268191487514,-42.0991012865816785,30.700698275986678],"rgb":[0.2,0.6,0.4],"xyz":[0.151539619792062097,0.244446114861751468,0.164904666966460223],"hpluv":[143.898662284026642,116.958797396111564,56.5302268191487514],"hsluv":[143.898662284026642,85.2491724948614689,56.5302268191487514]},"#339977":{"lch":[56.8968484427531678,45.1992705399313124,155.596009487994166],"luv":[56.8968484427531678,-41.1609366004351855,18.6748856895258584],"rgb":[0.2,0.6,0.466666666666666674],"xyz":[0.160853632812264,0.248171720069832291,0.213958468872858132],"hpluv":[155.596009487994166,100.805108459810327,56.8968484427531678],"hsluv":[155.596009487994166,85.9413862611579873,56.8968484427531678]},"#339988":{"lch":[57.330574208667926,40.5351988689668303,172.17134267960472],"luv":[57.330574208667926,-40.1574041849560217,5.52134371985359085],"rgb":[0.2,0.6,0.533333333333333326],"xyz":[0.171994049914207858,0.252627886910609889,0.272631332276430272],"hpluv":[172.17134267960472,89.7191897797317,57.330574208667926],"hsluv":[172.17134267960472,86.6885468018933665,57.330574208667926]},"#339999":{"lch":[57.8324724587931627,40.0212192418936539,192.177050630061103],"luv":[57.8324724587931627,-39.1207602326874735,-8.44180717763071],"rgb":[0.2,0.6,0.6],"xyz":[0.185051014023280558,0.257850672554239047,0.341398009917548206],"hpluv":[192.177050630061103,87.8128114771670312,57.8324724587931627],"hsluv":[192.177050630061103,87.4690863712762194,57.8324724587931627]},"#3399aa":{"lch":[58.4029323329449568,44.4430671798845367,211.035048784986628],"luv":[58.4029323329449568,-38.0811346860811923,-22.913170914918652],"rgb":[0.2,0.6,0.66666666666666663],"xyz":[0.200108706988533114,0.263873749740340169,0.420701859534546807],"hpluv":[211.035048784986628,96.5625435737210154,58.4029323329449568],"hsluv":[211.035048784986628,88.2627766327166,58.4029323329449568]},"#3399bb":{"lch":[59.0417237507550823,52.8166449153409445,225.431517702392057],"luv":[59.0417237507550823,-37.064675814253917,-37.6272213549907448],"rgb":[0.2,0.6,0.733333333333333282],"xyz":[0.217246299095869733,0.270728786583274927,0.510959844633188554],"hpluv":[225.431517702392057,113.514439229551684,59.0417237507550823],"hsluv":[225.431517702392057,89.0519907331041196,59.0417237507550823]},"#3399cc":{"lch":[59.7480598269018373,63.5982744854026194,235.423336237979868],"luv":[59.7480598269018373,-36.0925574956591646,-52.364757336811472],"rgb":[0.2,0.6,0.8],"xyz":[0.236538674539591487,0.278445736760763729,0.612566355303458709],"hpluv":[235.423336237979868,135.070607162709791,59.7480598269018373],"hsluv":[235.423336237979868,89.8223822716188636,59.7480598269018373]},"#3399dd":{"lch":[60.5206621982976856,75.6357863680042186,242.281144195606601],"luv":[60.5206621982976856,-35.1807304699237235,-66.9558689220665286],"rgb":[0.2,0.6,0.866666666666666696],"xyz":[0.25805700009022503,0.287053066981017235,0.725896203203464707],"hpluv":[242.281144195606601,158.58531958905732,60.5206621982976856],"hsluv":[242.281144195606601,90.5630616197976508,60.5206621982976856]},"#3399ee":{"lch":[61.3578284965586818,88.2341933332873083,247.095644636752098],"luv":[61.3578284965586818,-34.3402162860227946,-81.277441019049661],"rgb":[0.2,0.6,0.933333333333333348],"xyz":[0.28186918035639974,0.296577939087487252,0.85130701927198793],"hpluv":[247.095644636752098,182.476215369006297,61.3578284965586818],"hsluv":[247.095644636752098,91.2664056494933504,61.3578284965586818]},"#3399ff":{"lch":[62.2575005434706554,100.992674077385175,250.5808182685887],"luv":[62.2575005434706554,-33.5777301361133595,-95.2473425151972],"rgb":[0.2,0.6,1],"xyz":[0.308040228766231161,0.30704635845142,0.989141207563769775],"hpluv":[250.5808182685887,205.84367033720622,62.2575005434706554],"hsluv":[250.5808182685887,99.9999999999985789,62.2575005434706554]},"#220000":{"lch":[3.07250446727781679,10.3329293192956264,12.1770506300617765],"luv":[3.07250446727781679,10.1004431663672367,2.17955870775360072],"rgb":[0.133333333333333331,0,0],"xyz":[0.00659672420629513,0.00340143591887099878,0.000309221447170077699],"hpluv":[12.1770506300617765,426.746789183125429,3.07250446727781679],"hsluv":[12.1770506300617765,100.000000000002217,3.07250446727781679]},"#220011":{"lch":[3.43803794680403607,8.12070857757986353,344.488545895364155],"luv":[3.43803794680403607,7.82492808895188574,-2.17172931202554675],"rgb":[0.133333333333333331,0,0.0666666666666666657],"xyz":[0.00760838970593225201,0.00380610211872585338,0.00563732641192570948],"hpluv":[344.488545895364155,299.724735916282839,3.43803794680403607],"hsluv":[344.488545895364155,99.9999999999976836,3.43803794680403607]},"#220022":{"lch":[4.11563957101797229,9.37475958111893348,307.715012949243601],"luv":[4.11563957101797229,5.73486236359989565,-7.41602797151862436],"rgb":[0.133333333333333331,0,0.133333333333333331],"xyz":[0.00948374784440927,0.00455624537411667124,0.0155142126079049047],"hpluv":[307.715012949243601,289.042783730483393,4.11563957101797229],"hsluv":[307.715012949243601,99.9999999999988205,4.11563957101797229]},"#220033":{"lch":[5.23130109110515384,14.2535250315243012,286.735013267555587],"luv":[5.23130109110515384,4.10424250296207127,-13.6498413654214126],"rgb":[0.133333333333333331,0,0.2],"xyz":[0.0125714985768670112,0.00579134566709978496,0.0317763664655160497],"hpluv":[286.735013267555587,345.74180296647927,5.23130109110515384],"hsluv":[286.735013267555587,99.9999999999995737,5.23130109110515384]},"#220044":{"lch":[6.84205732813722722,21.3889830656619786,277.641816515271671],"luv":[6.84205732813722722,2.84430225454687724,-21.1990221771654959],"rgb":[0.133333333333333331,0,0.266666666666666663],"xyz":[0.01702949382108589,0.0075745437647873606,0.0552551414184026882],"hpluv":[277.641816515271671,396.682237683346386,6.84205732813722722],"hsluv":[277.641816515271671,100.000000000000085,6.84205732813722722]},"#220055":{"lch":[8.95766614306443,30.4428627575942237,273.263558660643355],"luv":[8.95766614306443,1.73308321478426808,-30.3934913336449455],"rgb":[0.133333333333333331,0,0.333333333333333315],"xyz":[0.0229919078604478855,0.00995950938053219263,0.0866571886923766],"hpluv":[273.263558660643355,431.250830347711485,8.95766614306443],"hsluv":[273.263558660643355,100.000000000000242,8.95766614306443]},"#220066":{"lch":[11.2709410858812937,40.3162667149428913,270.881506896841],"luv":[11.2709410858812937,0.620249265146302853,-40.3114952920317435],"rgb":[0.133333333333333331,0,0.4],"xyz":[0.0305769036339560568,0.0129935076899355059,0.126604833099520558],"hpluv":[270.881506896841,453.899240935372916,11.2709410858812937],"hsluv":[270.881506896841,100.000000000000469,11.2709410858812937]},"#220077":{"lch":[13.6616791408408957,50.492834518379162,269.459540268375122],"luv":[13.6616791408408957,-0.476281836738408071,-50.4905881656414763],"rgb":[0.133333333333333331,0,0.466666666666666674],"xyz":[0.0398909166541579763,0.0167191128980163223,0.175658635005918468],"hpluv":[269.459540268375122,468.991527020998944,13.6616791408408957],"hsluv":[269.459540268375122,100.000000000000711,13.6616791408408957]},"#220088":{"lch":[16.0923146306383913,60.7890037695263104,268.549935621017426],"luv":[16.0923146306383913,-1.53830805749361632,-60.7695366743217278],"rgb":[0.133333333333333331,0,0.533333333333333326],"xyz":[0.0510313337561018043,0.0211752797387939132,0.234331498409490635],"hpluv":[268.549935621017426,479.34239057424071,16.0923146306383913],"hsluv":[268.549935621017426,100.000000000000711,16.0923146306383913]},"#220099":{"lch":[18.5394450926422749,71.1015482986176437,267.936483797094468],"luv":[18.5394450926422749,-2.56017951479828287,-71.0554406876254916],"rgb":[0.133333333333333331,0,0.6],"xyz":[0.0640882978651745178,0.0263980653824230742,0.30309817605060857],"hpluv":[267.936483797094468,486.655519564945394,18.5394450926422749],"hsluv":[267.936483797094468,100.000000000000739,18.5394450926422749]},"#2200aa":{"lch":[20.9885603179873783,81.3727160976321,267.505178931910336],"luv":[20.9885603179873783,-3.54207977840461252,-81.2955878012407851],"rgb":[0.133333333333333331,0,0.66666666666666663],"xyz":[0.0791459908304270598,0.0324211425685241791,0.382402025667607171],"hpluv":[267.505178931910336,491.966452636739518,20.9885603179873783],"hsluv":[267.505178931910336,100.000000000000782,20.9885603179873783]},"#2200bb":{"lch":[23.4306921856835828,91.57073581353,267.191578225858507],"luv":[23.4306921856835828,-4.48665301772878333,-91.4607544366971155],"rgb":[0.133333333333333331,0,0.733333333333333282],"xyz":[0.0962835829377637,0.0392761794114589377,0.472660010766248917],"hpluv":[267.191578225858507,495.919187528698728,23.4306921856835828],"hsluv":[267.191578225858507,100.000000000000909,23.4306921856835828]},"#2200cc":{"lch":[25.860342630381858,101.678845182637474,266.957159441292106],"luv":[25.860342630381858,-5.39738007409318588,-101.535490573545474],"rgb":[0.133333333333333331,0,0.8],"xyz":[0.115575958381485447,0.0469931295889477393,0.574266521436519],"hpluv":[266.957159441292106,498.925449111647538,25.860342630381858],"hsluv":[266.957159441292106,100.000000000000881,25.860342630381858]},"#2200dd":{"lch":[28.2742062228116282,111.689036790699618,266.777814373778199],"luv":[28.2742062228116282,-6.27782958394359714,-111.512464751476173],"rgb":[0.133333333333333331,0,0.866666666666666696],"xyz":[0.137094283932118977,0.0556004598092012733,0.687596369336525],"hpluv":[266.777814373778199,501.255846139694427,28.2742062228116282],"hsluv":[266.777814373778199,100.000000000000838,28.2742062228116282]},"#2200ee":{"lch":[30.6703766456275062,121.598437280905173,266.637867063772376],"luv":[30.6703766456275062,-7.13133722672581882,-121.389142753859758],"rgb":[0.133333333333333331,0,0.933333333333333348],"xyz":[0.160906464198293714,0.0651253319156713,0.813007185405048238],"hpluv":[266.637867063772376,503.092926092128948,30.6703766456275062],"hsluv":[266.637867063772376,100.000000000000838,30.6703766456275062]},"#2200ff":{"lch":[33.0478477502328261,131.407178056457695,266.526788769360394],"luv":[33.0478477502328261,-7.96089030872800674,-131.165813649189772],"rgb":[0.133333333333333331,0,1],"xyz":[0.187077512608125107,0.0755937512796040073,0.950841373696830083],"hpluv":[266.526788769360394,504.562807291912918,33.0478477502328261],"hsluv":[266.526788769360394,100.000000000000824,33.0478477502328261]},"#221100":{"lch":[6.69363913087575835,9.72440836304526535,42.3457761997067053],"luv":[6.69363913087575835,7.18724369375563921,6.55039282011655288],"rgb":[0.133333333333333331,0.0666666666666666657,0],"xyz":[0.00860112446722354,0.00741023644072787233,0.000977354867479528471],"hpluv":[42.3457761997067053,184.348759610596915,6.69363913087575835],"hsluv":[42.3457761997067053,100.000000000002402,6.69363913087575835]},"#221111":{"lch":[7.0591726104019763,6.19439175917428564,12.1770506300621],"luv":[7.0591726104019763,6.05502079617615863,1.30660339200560327],"rgb":[0.133333333333333331,0.0666666666666666657,0.0666666666666666657],"xyz":[0.00961278996686066103,0.00781490264058272606,0.00630545983223516],"hpluv":[12.1770506300621,111.348454543071412,7.0591726104019763],"hsluv":[12.1770506300621,26.092394217240134,7.0591726104019763]},"#221122":{"lch":[7.73677423461591474,7.55259268754738677,307.715012949245249],"luv":[7.73677423461591474,4.62018030186617779,-5.97457866985129],"rgb":[0.133333333333333331,0.0666666666666666657,0.133333333333333331],"xyz":[0.0114881481053376797,0.00856504589597354565,0.0161823460282143547],"hpluv":[307.715012949245249,123.872660774597591,7.73677423461591474],"hsluv":[307.715012949245249,42.856167926372315,7.73677423461591474]},"#221133":{"lch":[8.8238329822443653,14.9761175001236957,282.095598903329574],"luv":[8.8238329822443653,3.13814740657790647,-14.6436377390353236],"rgb":[0.133333333333333331,0.0666666666666666657,0.2],"xyz":[0.0145758988377954202,0.00980014618895665851,0.0324444998858255],"hpluv":[282.095598903329574,215.36805510923017,8.8238329822443653],"hsluv":[282.095598903329574,58.3941618505161273,8.8238329822443653]},"#221144":{"lch":[10.2463738670161,23.9334379374521049,274.255517801158362],"luv":[10.2463738670161,1.77596948547040223,-23.8674544912638211],"rgb":[0.133333333333333331,0.0666666666666666657,0.266666666666666663],"xyz":[0.0190338940820143,0.011583344286644235,0.0559232748387121364],"hpluv":[274.255517801158362,296.397281412249697,10.2463738670161],"hsluv":[274.255517801158362,70.1230959508528287,10.2463738670161]},"#221155":{"lch":[11.9365395500671561,33.3852442414483903,270.945812779521702],"luv":[11.9365395500671561,0.551083463009601,-33.3806956200430349],"rgb":[0.133333333333333331,0.0666666666666666657,0.333333333333333315],"xyz":[0.0249963081213762928,0.0139683099023890662,0.0873253221126860518],"hpluv":[270.945812779521702,354.907717298979946,11.9365395500671561],"hsluv":[270.945812779521702,78.3035236172291,11.9365395500671561]},"#221166":{"lch":[13.8282163263251512,43.1006504094303509,269.247085426223],"luv":[13.8282163263251512,-0.566362377205730683,-43.0969291176716496],"rgb":[0.133333333333333331,0.0666666666666666657,0.4],"xyz":[0.0325813038948844641,0.0170023082117923795,0.12727296651983],"hpluv":[269.247085426223,395.509560036398682,13.8282163263251512],"hsluv":[269.247085426223,83.9084652674952167,13.8282163263251512]},"#221177":{"lch":[15.8647012598499089,52.9790758801604,268.263491631539182],"luv":[15.8647012598499089,-1.60543281970815044,-52.954745458525224],"rgb":[0.133333333333333331,0.0666666666666666657,0.466666666666666674],"xyz":[0.0418953169150863836,0.0207279134198731958,0.176326768426227909],"hpluv":[268.263491631539182,423.75204448359591,15.8647012598499089],"hsluv":[268.263491631539182,87.783734282584831,15.8647012598499089]},"#221188":{"lch":[18.0016522099437424,62.9493123294311872,267.645454528547475],"luv":[18.0016522099437424,-2.58614693443793442,-62.8961665507666297],"rgb":[0.133333333333333331,0.0666666666666666657,0.533333333333333326],"xyz":[0.0530357340170302116,0.0251840802606507867,0.234999631829800076],"hpluv":[267.645454528547475,443.729139668046173,18.0016522099437424],"hsluv":[267.645454528547475,90.5156952975567464,18.0016522099437424]},"#221199":{"lch":[20.2061107483083475,72.9561611588118524,267.23334268313738],"luv":[20.2061107483083475,-3.52148568403582729,-72.8711231531918742],"rgb":[0.133333333333333331,0.0666666666666666657,0.6],"xyz":[0.066092698126102925,0.0304068659042799477,0.303766309470918],"hpluv":[267.23334268313738,458.161478440778865,20.2061107483083475],"hsluv":[267.23334268313738,92.4853336382361704,20.2061107483083475]},"#2211aa":{"lch":[22.4542330055690798,82.9584275230068471,266.945798214496847],"luv":[22.4542330055690798,-4.42007776686241449,-82.8405915576709759],"rgb":[0.133333333333333331,0.0666666666666666657,0.66666666666666663],"xyz":[0.0811503910913554671,0.0364299430903810492,0.383070159087916584],"hpluv":[266.945798214496847,468.815123306781686,22.4542330055690798],"hsluv":[266.945798214496847,93.9373181855700921,22.4542330055690798]},"#2211bb":{"lch":[24.7289983316777295,92.9268656932788701,266.737844101991243],"luv":[24.7289983316777295,-5.28796663316276483,-92.7762888698575097],"rgb":[0.133333333333333331,0.0666666666666666657,0.733333333333333282],"xyz":[0.0982879831986921138,0.0432849799333158078,0.473328144186558331],"hpluv":[266.737844101991243,476.841549380862261,24.7289983316777295],"hsluv":[266.737844101991243,95.0302193246277369,24.7289983316777295]},"#2211cc":{"lch":[27.0183279904475668,102.841627589427389,266.583003116257],"luv":[27.0183279904475668,-6.12961814831514129,-102.658794784462174],"rgb":[0.133333333333333331,0.0666666666666666657,0.8],"xyz":[0.117580358642413854,0.0510019301108046094,0.574934654856828486],"hpluv":[266.583003116257,483.002966655360069,27.0183279904475668],"hsluv":[266.583003116257,95.8686128249461689,27.0183279904475668]},"#2211dd":{"lch":[29.313669578695368,112.689841457512074,266.464886381494523],"luv":[29.313669578695368,-6.94848190374932617,-112.475414944566779],"rgb":[0.133333333333333331,0.0666666666666666657,0.866666666666666696],"xyz":[0.139098684193047384,0.0596092603310581434,0.688264502756834484],"hpluv":[266.464886381494523,487.813602393737767,29.313669578695368],"hsluv":[266.464886381494523,96.5228774582602256,29.313669578695368]},"#2211ee":{"lch":[31.6089746608533417,122.463629630364608,266.372923821556242],"luv":[31.6089746608533417,-7.74731231829930689,-122.21832814306471],"rgb":[0.133333333333333331,0.0666666666666666657,0.933333333333333348],"xyz":[0.162910864459222149,0.0691341324375281813,0.813675318825357707],"hpluv":[266.372923821556242,491.627361233059389,31.6089746608533417],"hsluv":[266.372923821556242,97.0413663214109761,31.6089746608533417]},"#2211ff":{"lch":[33.8999739889387115,132.15860685194221,266.300059947999785],"luv":[33.8999739889387115,-8.52836196764118,-131.883146789857562],"rgb":[0.133333333333333331,0.0666666666666666657,1],"xyz":[0.189081912869053514,0.0796025518014608774,0.951509507117139552],"hpluv":[266.300059947999785,494.692599475339,33.8999739889387115],"hsluv":[266.300059947999785,99.9999999999995737,33.8999739889387115]},"#77aa00":{"lch":[63.8935034159882491,78.4053265973676616,109.262687899665323],"luv":[63.8935034159882491,-25.8658938451783591,74.0158819067222424],"rgb":[0.466666666666666674,0.66666666666666663,0],"xyz":[0.219816749274909073,0.326708497135311,0.0514797056256764834],"hpluv":[109.262687899665323,155.714190603412163,63.8935034159882491],"hsluv":[109.262687899665323,100.000000000002132,63.8935034159882491]},"#77aa11":{"lch":[63.9264755829735662,77.0719876411919,109.595002167467626],"luv":[63.9264755829735662,-25.8475857965541422,72.6084952843247464],"rgb":[0.466666666666666674,0.66666666666666663,0.0666666666666666657],"xyz":[0.220828414774546206,0.32711316333516588,0.0568078105904321132],"hpluv":[109.595002167467626,152.98720995680398,63.9264755829735662],"hsluv":[109.595002167467626,97.9667163347824612,63.9264755829735662]},"#77aa22":{"lch":[63.9875253363426424,74.6349938152274603,110.235118064089221],"luv":[63.9875253363426424,-25.8142561390327501,70.0286118796271],"rgb":[0.466666666666666674,0.66666666666666663,0.133333333333333331],"xyz":[0.222703772913023207,0.32786330659055668,0.0666846967864113127],"hpluv":[110.235118064089221,148.008450888663447,63.9875253363426424],"hsluv":[110.235118064089221,94.2440053809013421,63.9875253363426424]},"#77aa33":{"lch":[64.0878403339217328,70.7199026331045,111.362593229805157],"luv":[64.0878403339217328,-25.7610573917560757,65.8610093340090685],"rgb":[0.466666666666666674,0.66666666666666663,0.2],"xyz":[0.22579152364548094,0.329098406883539807,0.0829468506440224629],"hpluv":[111.362593229805157,140.024923426145421,64.0878403339217328],"hsluv":[111.362593229805157,88.2427941375042,64.0878403339217328]},"#77aa44":{"lch":[64.2322300921174616,65.2796522257345,113.17268826837423],"luv":[64.2322300921174616,-25.6877867579927681,60.0130869576689463],"rgb":[0.466666666666666674,0.66666666666666663,0.266666666666666663],"xyz":[0.230249518889699828,0.330881604981227373,0.106425625596909101],"hpluv":[113.17268826837423,128.962712139229978,64.2322300921174616],"hsluv":[113.17268826837423,79.8488372015295482,64.2322300921174616]},"#77aa55":{"lch":[64.4245377454048338,58.3957340906732298,115.996670283872277],"luv":[64.4245377454048338,-25.5959546947607706,52.487225714952487],"rgb":[0.466666666666666674,0.66666666666666663,0.333333333333333315],"xyz":[0.236211932929061841,0.333266570596972234,0.137827672870883],"hpluv":[115.996670283872277,115.018880896771989,64.4245377454048338],"hsluv":[115.996670283872277,69.0944053471027075,64.4245377454048338]},"#77aa66":{"lch":[64.6678576456364,50.3036055521827663,120.443938093288892],"luv":[64.6678576456364,-25.4885877435648602,43.368013862617552],"rgb":[0.466666666666666674,0.66666666666666663,0.4],"xyz":[0.24379692870257,0.336300568906375552,0.177775317278026979],"hpluv":[120.443938093288892,98.707457943709727,64.6678576456364],"hsluv":[120.443938093288892,56.1391996219007723,64.6678576456364]},"#77aa77":{"lch":[64.964649263009,41.4721527505437351,127.71501294923786],"luv":[64.964649263009,-25.3699399849719889,32.8070967768157118],"rgb":[0.466666666666666674,0.66666666666666663,0.466666666666666674],"xyz":[0.253110941722771932,0.340026174114456348,0.226829119184424888],"hpluv":[127.71501294923786,81.006302212696113,64.964649263009],"hsluv":[127.71501294923786,41.2466460512923874,64.964649263009]},"#77aa88":{"lch":[65.3168057391263375,32.8409027786736161,140.238161573904051],"luv":[65.3168057391263375,-25.2451203613846147,21.004970679758074],"rgb":[0.466666666666666674,0.66666666666666663,0.533333333333333326],"xyz":[0.264251358824715732,0.344482340955233945,0.285501982587997],"hpluv":[140.238161573904051,63.8012923553667,65.3168057391263375],"hsluv":[140.238161573904051,43.6199696205744232,65.3168057391263375]},"#77aa99":{"lch":[65.7257012160132,26.4214783611449491,161.939459903532622],"luv":[65.7257012160132,-25.1196781367095241,8.19123245284666],"rgb":[0.466666666666666674,0.66666666666666663,0.6],"xyz":[0.277308322933788487,0.349705126598863103,0.354268660229114962],"hpluv":[161.939459903532622,51.0106916742292213,65.7257012160132],"hsluv":[161.939459903532622,46.1685656356417766,65.7257012160132]},"#77aaaa":{"lch":[66.1922284915170565,25.5746156232648509,192.177050630060677],"luv":[66.1922284915170565,-24.9991985449953802,-5.39453764336142338],"rgb":[0.466666666666666674,0.66666666666666663,0.66666666666666663],"xyz":[0.292366015899041,0.355728203784964225,0.433572509846113563],"hpluv":[192.177050630060677,49.0276908522131265,66.1922284915170565],"hsluv":[192.177050630060677,48.8357820868943122,66.1922284915170565]},"#77aabb":{"lch":[66.7168329685055568,31.6300901405034409,218.105494045696133],"luv":[66.7168329685055568,-24.8889541052261336,-19.519287021925777],"rgb":[0.466666666666666674,0.66666666666666663,0.733333333333333282],"xyz":[0.309503608006377662,0.362583240627899,0.523830494944755309],"hpluv":[218.105494045696133,60.1595160354738923,66.7168329685055568],"hsluv":[218.105494045696133,51.56699221483656,66.7168329685055568]},"#77aacc":{"lch":[67.2995460165272306,42.0550186755790207,233.874741843371567],"luv":[67.2995460165272306,-24.7936410920562054,-33.9691029790543908],"rgb":[0.466666666666666674,0.66666666666666663,0.8],"xyz":[0.328795983450099416,0.370300190805387786,0.625437005615025465],"hpluv":[233.874741843371567,79.2948573353567099,67.2995460165272306],"hsluv":[233.874741843371567,54.3124963748670382,67.2995460165272306]},"#77aadd":{"lch":[67.9400192524912,54.4863937886276304,243.022531341574677],"luv":[67.9400192524912,-24.7172120267711577,-48.557456046554158],"rgb":[0.466666666666666674,0.66666666666666663,0.866666666666666696],"xyz":[0.350314309000732904,0.378907521025641292,0.738766853515031463],"hpluv":[243.022531341574677,101.765770647841308,67.9400192524912],"hsluv":[243.022531341574677,60.6446157506369659,67.9400192524912]},"#77aaee":{"lch":[68.6375602707836,67.7758398266106781,248.660849953701415],"luv":[68.6375602707836,-24.6627990544268876,-63.1293181256010882],"rgb":[0.466666666666666674,0.66666666666666663,0.933333333333333348],"xyz":[0.374126489266907669,0.388432393132111309,0.864177669583554686],"hpluv":[248.660849953701415,125.300382334337471,68.6375602707836],"hsluv":[248.660849953701415,79.8712566390148453,68.6375602707836]},"#77aaff":{"lch":[69.3911697465266428,81.3794470542267874,252.380781260055755],"luv":[69.3911697465266428,-24.6327125013740549,-77.5618712878715399],"rgb":[0.466666666666666674,0.66666666666666663,1],"xyz":[0.400297537676739035,0.398900812496044033,1.00201185787533653],"hpluv":[252.380781260055755,148.816077288451226,69.3911697465266428],"hsluv":[252.380781260055755,99.9999999999980531,69.3911697465266428]},"#222200":{"lch":[12.5069288045758107,13.787646171799997,85.8743202181747307],"luv":[12.5069288045758107,0.991945128669063814,13.751917387057734],"rgb":[0.133333333333333331,0.133333333333333331,0],"xyz":[0.0123167482019914745,0.014841483910263846,0.002215896112402139],"hpluv":[85.8743202181747307,139.887458074797621,12.5069288045758107],"hsluv":[85.8743202181747307,100.000000000002359,12.5069288045758107]},"#222211":{"lch":[12.7636979604368612,8.34346759842367,85.8743202181729828],"luv":[12.7636979604368612,0.600266494900015157,8.32184665209868513],"rgb":[0.133333333333333331,0.133333333333333331,0.0666666666666666657],"xyz":[0.0133284137016285963,0.0152461501101187,0.00754400107715777046],"hpluv":[85.8743202181729828,82.9486632734846552,12.7636979604368612],"hsluv":[85.8743202181729828,59.2967120963297631,12.7636979604368612]},"#222222":{"lch":[13.2279109842717837,6.86787642036123471e-13,0],"luv":[13.2279109842717837,6.53891093021720259e-13,2.10008818196756883e-13],"rgb":[0.133333333333333331,0.133333333333333331,0.133333333333333331],"xyz":[0.0152037718401056149,0.0159962933655095202,0.0174208872731369674],"hpluv":[0,6.58825703928357502e-12,13.2279109842717837],"hsluv":[0,1.88635445986832e-12,13.2279109842717837]},"#222233":{"lch":[13.9615854376221584,10.5260121123804868,265.874320218180912],"luv":[13.9615854376221584,-0.757288539977712838,-10.4987354027615698],"rgb":[0.133333333333333331,0.133333333333333331,0.2],"xyz":[0.0182915225725633554,0.017231393658492633,0.0336830411307481106],"hpluv":[265.874320218180912,95.6683874279760431,13.9615854376221584],"hsluv":[265.874320218180912,18.6338179823007195,13.9615854376221584]},"#222244":{"lch":[14.9613810506728697,21.7214686924654536,265.874320218179207],"luv":[14.9613810506728697,-1.5627399186581008,-21.6651805001571454],"rgb":[0.133333333333333331,0.133333333333333331,0.266666666666666663],"xyz":[0.0227495178167822359,0.0190145917561802061,0.0571618160836347491],"hpluv":[265.874320218179207,184.228505509793536,14.9613810506728697],"hsluv":[265.874320218179207,35.8831222215914138,14.9613810506728697]},"#222255":{"lch":[16.2052187005970154,32.8139057554865161,265.874320218178639],"luv":[16.2052187005970154,-2.3607796110480268,-32.728873041368395],"rgb":[0.133333333333333331,0.133333333333333331,0.333333333333333315],"xyz":[0.028711931856144228,0.021399557371925039,0.0885638633576086576],"hpluv":[265.874320218178639,256.946292996249099,16.2052187005970154],"hsluv":[265.874320218178639,50.0467352240393097,16.2052187005970154]},"#222266":{"lch":[17.6604729086265309,43.5908485911403716,265.874320218178354],"luv":[17.6604729086265309,-3.13612123314657865,-43.477888915018994],"rgb":[0.133333333333333331,0.133333333333333331,0.4],"xyz":[0.0362969276296524063,0.0244335556813283505,0.128511507764752619],"hpluv":[265.874320218178354,313.207621322876264,17.6604729086265309],"hsluv":[265.874320218178354,61.00504004829466,17.6604729086265309]},"#222277":{"lch":[19.2910482951380544,54.0745009411091573,265.874320218178241],"luv":[19.2910482951380544,-3.89036222175517965,-53.9343743248547867],"rgb":[0.133333333333333331,0.133333333333333331,0.466666666666666674],"xyz":[0.0456109406498543188,0.0281591608894091669,0.177565309671150529],"hpluv":[265.874320218178241,355.693573155256843,19.2910482951380544],"hsluv":[265.874320218178241,69.2802447897283429,19.2910482951380544]},"#222288":{"lch":[21.0622605487373207,64.3390225585563371,265.874320218178184],"luv":[21.0622605487373207,-4.62883796225993471,-64.1722968492601353],"rgb":[0.133333333333333331,0.133333333333333331,0.533333333333333326],"xyz":[0.0567513577517981468,0.0326153277301867578,0.236238173074722696],"hpluv":[265.874320218178184,387.622344883614403,21.0622605487373207],"hsluv":[265.874320218178184,75.4991739133377706,21.0622605487373207]},"#222299":{"lch":[22.9434551626666803,74.4470789880776351,265.874320218178127],"luv":[22.9434551626666803,-5.35605689510984373,-74.2541596437089737],"rgb":[0.133333333333333331,0.133333333333333331,0.6],"xyz":[0.0698083218608708533,0.0378381133738159223,0.305004850715840603],"hpluv":[265.874320218178127,411.744842564929684,22.9434551626666803],"hsluv":[265.874320218178127,80.1976353712613559,22.9434551626666803]},"#2222aa":{"lch":[24.9089307040763188,84.4389391258505526,265.87432021817807],"luv":[24.9089307040763188,-6.07491614537627278,-84.2201272530844705],"rgb":[0.133333333333333331,0.133333333333333331,0.66666666666666663],"xyz":[0.0848660148261234093,0.0438611905599170238,0.384308700332839204],"hpluv":[265.87432021817807,430.157015573344836,24.9089307040763188],"hsluv":[265.87432021817807,83.7838678741945557,24.9089307040763188]},"#2222bb":{"lch":[26.937850813592469,94.3371638934954149,265.87432021817807],"luv":[26.937850813592469,-6.78703884698804139,-94.0927021354881106],"rgb":[0.133333333333333331,0.133333333333333331,0.733333333333333282],"xyz":[0.102003606933460056,0.0507162274028517823,0.47456668543148095],"hpluv":[265.87432021817807,444.384803230596,26.937850813592469],"hsluv":[265.87432021817807,86.5550863782758,26.937850813592469]},"#2222cc":{"lch":[29.0136770200274086,104.153206308830732,265.874320218178],"luv":[29.0136770200274086,-7.49324898143496743,-103.883307629821275],"rgb":[0.133333333333333331,0.133333333333333331,0.8],"xyz":[0.121295982377181782,0.058433177580340584,0.576173196101751106],"hpluv":[265.874320218178,455.521834046362642,29.0136770200274086],"hsluv":[265.874320218178,88.7243024658832695,29.0136770200274086]},"#2222dd":{"lch":[31.1234509916598299,113.892375340460845,265.874320218178],"luv":[31.1234509916598299,-8.19392849973896809,-113.597238947227837],"rgb":[0.133333333333333331,0.133333333333333331,0.866666666666666696],"xyz":[0.142814307927815326,0.067040507800594118,0.689503044001757104],"hpluv":[265.874320218178,464.350835522916555,31.1234509916598299],"hsluv":[265.874320218178,90.4439719502614565,31.1234509916598299]},"#2222ee":{"lch":[33.2570959032629503,123.556928623667645,265.874320218178],"luv":[33.2570959032629503,-8.88923982631188103,-123.236747872639071],"rgb":[0.133333333333333331,0.133333333333333331,0.933333333333333348],"xyz":[0.166626488193990063,0.0765653799070641489,0.814913860070280327],"hpluv":[265.874320218178,471.435310205520636,33.2570959032629503],"hsluv":[265.874320218178,93.8546607467714296,33.2570959032629503]},"#2222ff":{"lch":[35.4068078244889,133.147814572056944,265.874320218177957],"luv":[35.4068078244889,-9.57925119428392335,-132.802780361977625],"rgb":[0.133333333333333331,0.133333333333333331,1],"xyz":[0.192797536603821457,0.0870337992709968589,0.952748048362062172],"hpluv":[265.874320218177957,477.184793215987838,35.4068078244889],"hsluv":[265.874320218177957,99.999999999999531,35.4068078244889]},"#77bb00":{"lch":[69.0844312744863629,87.8096536524333544,113.037133893102563],"luv":[69.0844312744863629,-34.3623439699837476,80.8069588058406225],"rgb":[0.466666666666666674,0.733333333333333282,0],"xyz":[0.253771247183507853,0.394617492952509585,0.0627978715952091093],"hpluv":[113.037133893102563,161.287757631366873,69.0844312744863629],"hsluv":[113.037133893102563,100.000000000002331,69.0844312744863629]},"#77bb11":{"lch":[69.1135050244688216,86.6316159473835654,113.342165034517933],"luv":[69.1135050244688216,-34.3252912529264051,79.5412550948043275],"rgb":[0.466666666666666674,0.733333333333333282,0.0666666666666666657],"xyz":[0.254782912683144958,0.395022159152364438,0.068125976559964746],"hpluv":[113.342165034517933,159.057013433643618,69.1135050244688216],"hsluv":[113.342165034517933,98.3127503818399,69.1135050244688216]},"#77bb22":{"lch":[69.1673475306790664,84.4748154027895595,113.924619678029501],"luv":[69.1673475306790664,-34.2574435126740582,77.2167209955934197],"rgb":[0.466666666666666674,0.733333333333333282,0.133333333333333331],"xyz":[0.256658270821622,0.395772302407755239,0.0780028627559439386],"hpluv":[113.924619678029501,154.976360107776344,69.1673475306790664],"hsluv":[113.924619678029501,95.2170715716625438,69.1673475306790664]},"#77bb33":{"lch":[69.2558504240405313,80.9996568929936132,114.934551128374181],"luv":[69.2558504240405313,-34.1480550559542593,73.4496749664571666],"rgb":[0.466666666666666674,0.733333333333333282,0.2],"xyz":[0.25974602155407972,0.397007402700738365,0.0942650166135550749],"hpluv":[114.934551128374181,148.410982175614635,69.2558504240405313],"hsluv":[114.934551128374181,90.2088459481891363,69.2558504240405313]},"#77bb44":{"lch":[69.3833048234310752,76.148419012573342,116.514961433737128],"luv":[69.3833048234310752,-33.9950520676451049,68.1389620777462426],"rgb":[0.466666666666666674,0.733333333333333282,0.266666666666666663],"xyz":[0.264204016798298635,0.398790600798425932,0.117743791566441713],"hpluv":[116.514961433737128,139.266042804817573,69.3833048234310752],"hsluv":[116.514961433737128,83.166634884803841,69.3833048234310752]},"#77bb55":{"lch":[69.5531781358710788,69.9670725739878918,118.886197685461212],"luv":[69.5531781358710788,-33.7990968432466516,61.2618339356121666],"rgb":[0.466666666666666674,0.733333333333333282,0.333333333333333315],"xyz":[0.270166430837660621,0.401175566414170792,0.149145838840415629],"hpluv":[118.886197685461212,127.648598426560824,69.5531781358710788],"hsluv":[118.886197685461212,74.0801666731923092,69.5531781358710788]},"#77bb66":{"lch":[69.7683097004737647,62.6192143930699672,122.411113057511386],"luv":[69.7683097004737647,-33.5633071802414804,52.8646424591145],"rgb":[0.466666666666666674,0.733333333333333282,0.4],"xyz":[0.277751426611168806,0.404209564723574111,0.189093483247559591],"hpluv":[122.411113057511386,113.8908252780179,69.7683097004737647],"hsluv":[122.411113057511386,63.0377921091212627,69.7683097004737647]},"#77bb77":{"lch":[70.0310134677453391,54.4237865803123384,127.71501294923867],"luv":[70.0310134677453391,-33.2928991557924476,43.0526585885427053],"rgb":[0.466666666666666674,0.733333333333333282,0.466666666666666674],"xyz":[0.287065439631370711,0.407935169931654906,0.2381472851539575],"hpluv":[127.71501294923867,98.6137944921033522,70.0310134677453391],"hsluv":[127.71501294923867,50.2119979074062357,70.0310134677453391]},"#77bb88":{"lch":[70.3431390634792422,45.948041729110173,135.896820739423845],"luv":[70.3431390634792422,-32.9947227526694,31.9776610966863863],"rgb":[0.466666666666666674,0.733333333333333282,0.533333333333333326],"xyz":[0.298205856733314512,0.412391336772432504,0.296820148557529695],"hpluv":[135.896820739423845,82.8866502392756246,70.3431390634792422],"hsluv":[135.896820739423845,51.9268484553617711,70.3431390634792422]},"#77bb99":{"lch":[70.7061124793432612,38.2197788608509725,148.75629343317604],"luv":[70.7061124793432612,-32.6767203094589,19.8238100775241328],"rgb":[0.466666666666666674,0.733333333333333282,0.6],"xyz":[0.311262820842387211,0.417614122416061662,0.365586826198647574],"hpluv":[148.75629343317604,68.5915373148405,70.7061124793432612],"hsluv":[148.75629343317604,53.7921873551213565,70.7061124793432612]},"#77bbaa":{"lch":[71.1209666334754615,33.0529501718716148,168.140026251468868],"luv":[71.1209666334754615,-32.3473621836046874,6.79306078486928744],"rgb":[0.466666666666666674,0.733333333333333282,0.66666666666666663],"xyz":[0.326320513807639767,0.423637199602162784,0.444890675815646175],"hpluv":[168.140026251468868,58.9728212370576585,71.1209666334754615],"hsluv":[168.140026251468868,55.7713219876506372,71.1209666334754615]},"#77bbbb":{"lch":[71.5883672123020744,32.7520226121926044,192.177050630060876],"luv":[71.5883672123020744,-32.0151171807858432,-6.90849166534396097],"rgb":[0.466666666666666674,0.733333333333333282,0.733333333333333282],"xyz":[0.343458105914976441,0.430492236445097542,0.535148660914287921],"hpluv":[192.177050630060876,58.0543804308889762,71.5883672123020744],"hsluv":[192.177050630060876,57.8271385543864938,71.5883672123020744]},"#77bbcc":{"lch":[72.1086367753872111,38.0603267014846267,213.636027248927832],"luv":[72.1086367753872111,-31.6880044447458609,-21.0821925551758049],"rgb":[0.466666666666666674,0.733333333333333282,0.8],"xyz":[0.36275048135869814,0.438209186622586344,0.636755171584558077],"hpluv":[213.636027248927832,66.97682452789428,72.1086367753872111],"hsluv":[213.636027248927832,59.9241419588218278,72.1086367753872111]},"#77bbdd":{"lch":[72.6817787487410101,47.4106862821029651,228.567760630430627],"luv":[72.6817787487410101,-31.3732552756954277,-35.5456330249727728],"rgb":[0.466666666666666674,0.733333333333333282,0.866666666666666696],"xyz":[0.384268806909331739,0.44681651684283985,0.750085019484564075],"hpluv":[228.567760630430627,82.7732525696479371,72.6817787487410101],"hsluv":[228.567760630430627,62.0300015657167449,72.6817787487410101]},"#77bbee":{"lch":[73.3075021126589803,58.9885691422652769,238.208313348868131],"luv":[73.3075021126589803,-31.0770938488335098,-50.1384635520735316],"rgb":[0.466666666666666674,0.733333333333333282,0.933333333333333348],"xyz":[0.408080987175506449,0.456341388949309867,0.875495835553087298],"hpluv":[238.208313348868131,102.107764199280055,73.3075021126589803],"hsluv":[238.208313348868131,76.3238953534044,73.3075021126589803]},"#77bbff":{"lch":[73.9852470697490219,71.6819577745528846,244.548916872628638],"luv":[73.9852470697490219,-30.8046295043453391,-64.7254036023940102],"rgb":[0.466666666666666674,0.733333333333333282,1],"xyz":[0.43425203558533787,0.466809808313242591,1.01333002384486903],"hpluv":[244.548916872628638,122.943070755930805,73.9852470697490219],"hsluv":[244.548916872628638,99.9999999999974,73.9852470697490219]},"#223300":{"lch":[18.8330192465532917,22.9063411551717806,108.204985820955727],"luv":[18.8330192465532917,-7.15634373768739707,21.7597612446731326],"rgb":[0.133333333333333331,0.2,0],"xyz":[0.0184344702910022862,0.0270769280882856428,0.00425513680873902],"hpluv":[108.204985820955727,154.338793470845559,18.8330192465532917],"hsluv":[108.204985820955727,100.000000000002331,18.8330192465532917]},"#223311":{"lch":[19.0056890338669575,18.4529510656336271,112.754551304246377],"luv":[19.0056890338669575,-7.13731020483261602,17.0167625026225657],"rgb":[0.133333333333333331,0.2,0.0666666666666666657],"xyz":[0.0194461357906394079,0.0274815942881404957,0.0095832417734946513],"hpluv":[112.754551304246377,123.203072156705915,19.0056890338669575],"hsluv":[112.754551304246377,76.6034511576994248,19.0056890338669575]},"#223322":{"lch":[19.3213416797184507,11.6344605438365232,127.71501294923759],"luv":[19.3213416797184507,-7.11719904028337247,9.20359440474635],"rgb":[0.133333333333333331,0.2,0.133333333333333331],"xyz":[0.0213214939291164265,0.028231737543531317,0.0194601279694738491],"hpluv":[127.71501294923759,76.4096652359405084,19.3213416797184507],"hsluv":[127.71501294923759,38.9061385447444366,19.3213416797184507]},"#223333":{"lch":[19.8290945906418372,7.27996715422488894,192.177050630060677],"luv":[19.8290945906418372,-7.11617124458192585,-1.53558737438758408],"rgb":[0.133333333333333331,0.2,0.2],"xyz":[0.0244092446615741671,0.0294668378365144298,0.0357222818270849923],"hpluv":[192.177050630060677,46.5871198449043149,19.8290945906418372],"hsluv":[192.177050630060677,46.4047641905018935,19.8290945906418372]},"#223344":{"lch":[20.5377244517829496,15.5714684077650816,242.621028364370432],"luv":[20.5377244517829496,-7.16091210703038339,-13.8272183091687548],"rgb":[0.133333333333333331,0.2,0.266666666666666663],"xyz":[0.0288672399057930476,0.031250035934202,0.0592010567799716309],"hpluv":[242.621028364370432,96.2091932027738181,20.5377244517829496],"hsluv":[242.621028364370432,54.472556800898019,20.5377244517829496]},"#223355":{"lch":[21.4445377167678828,27.4997828393463344,254.670418676715883],"luv":[21.4445377167678828,-7.27014529691604761,-26.5213695644274097],"rgb":[0.133333333333333331,0.2,0.333333333333333315],"xyz":[0.0348296539451550397,0.0336350015499468358,0.0906031040539455323],"hpluv":[254.670418676715883,162.72410902482622,21.4445377167678828],"hsluv":[254.670418676715883,62.1025047738862597,21.4445377167678828]},"#223366":{"lch":[22.538163137523668,39.6650934211933617,259.172698399253136],"luv":[22.538163137523668,-7.45106225263504562,-38.9589695374422647],"rgb":[0.133333333333333331,0.2,0.4],"xyz":[0.042414649718663211,0.0366689998593501473,0.130550748461089494],"hpluv":[259.172698399253136,223.320859110196579,22.538163137523668],"hsluv":[259.172698399253136,68.7622962285398103,22.538163137523668]},"#223377":{"lch":[23.8014699151847751,51.4679604591091,261.393782909523054],"luv":[23.8014699151847751,-7.70180102721624227,-50.8884389105972517],"rgb":[0.133333333333333331,0.2,0.466666666666666674],"xyz":[0.0517286627388651304,0.0403946050674309637,0.179604550367487403],"hpluv":[261.393782909523054,274.392670476726266,23.8014699151847751],"hsluv":[261.393782909523054,74.3066649079193837,23.8014699151847751]},"#223388":{"lch":[25.214303338898695,62.8010579136007649,262.667168962641028],"luv":[25.214303338898695,-8.01548446335257658,-62.2874376089207189],"rgb":[0.133333333333333331,0.2,0.533333333333333326],"xyz":[0.0628690798408089585,0.0448507719082085615,0.238277413771059571],"hpluv":[262.667168962641028,316.052560368409843,25.214303338898695],"hsluv":[262.667168962641028,78.8060188103052184,25.214303338898695]},"#223399":{"lch":[26.7557115473943199,73.7050787305795723,263.468936800572067],"luv":[26.7557115473943199,-8.38335327394953111,-73.2267575314180732],"rgb":[0.133333333333333331,0.2,0.6],"xyz":[0.0759260439498816719,0.0500735575518377191,0.307044091412177478],"hpluv":[263.468936800572067,349.558796760350788,26.7557115473943199],"hsluv":[263.468936800572067,82.4151943494814105,26.7557115473943199]},"#2233aa":{"lch":[28.4055164492709622,84.2578478733767184,264.007358934798901],"luv":[28.4055164492709622,-8.79658068794244485,-83.7974050699281],"rgb":[0.133333333333333331,0.2,0.66666666666666663],"xyz":[0.090983736915134214,0.0560966347379388205,0.386347941029176078],"hpluv":[264.007358934798901,376.397732872534505,28.4055164492709622],"hsluv":[264.007358934798901,85.301735461295209,28.4055164492709622]},"#2233bb":{"lch":[30.1452579578322855,94.5340435151979506,264.386468786418391],"luv":[30.1452579578322855,-9.24712484322681583,-94.0806891209195868],"rgb":[0.133333333333333331,0.2,0.733333333333333282],"xyz":[0.108121329022470861,0.0629516715808735861,0.476605926127817825],"hpluv":[264.386468786418391,397.931717533943186,30.1452579578322855],"hsluv":[264.386468786418391,87.6154589527103553,30.1452579578322855]},"#2233cc":{"lch":[31.9586404471462444,104.593501952517812,264.663323368501551],"luv":[31.9586404471462444,-9.72802821613955615,-104.140127317558722],"rgb":[0.133333333333333331,0.2,0.8],"xyz":[0.127413704466192601,0.0706686217583623877,0.578212436798088],"hpluv":[264.663323368501551,415.294074833826699,31.9586404471462444],"hsluv":[264.663323368501551,89.4797268300864,31.9586404471462444]},"#2233dd":{"lch":[33.8316358854510284,114.480561125644712,264.87147297862515],"luv":[33.8316358854510284,-10.233440845943651,-114.022259072932982],"rgb":[0.133333333333333331,0.2,0.866666666666666696],"xyz":[0.148932030016826145,0.0792759519786159217,0.691542284698094],"hpluv":[264.87147297862515,429.386195390892226,33.8316358854510284],"hsluv":[264.87147297862515,90.9921469937159,33.8316358854510284]},"#2233ee":{"lch":[35.7523793143002209,124.226868169083772,265.031742065807748],"luv":[35.7523793143002209,-10.7585230682670669,-123.760126682580946],"rgb":[0.133333333333333331,0.2,0.933333333333333348],"xyz":[0.172744210283000882,0.0888008240850859387,0.816953100766617202],"hpluv":[265.031742065807748,440.909964314972513,35.7523793143002209],"hsluv":[265.031742065807748,93.1343838757889557,35.7523793143002209]},"#2233ff":{"lch":[37.7109573358094536,133.854664271403067,265.157628752861342],"luv":[37.7109573358094536,-11.2993072928814158,-133.376897556927247],"rgb":[0.133333333333333331,0.2,1],"xyz":[0.198915258692832275,0.0992692434490186487,0.954787289058399],"hpluv":[265.157628752861342,450.407151983715153,37.7109573358094536],"hsluv":[265.157628752861342,99.9999999999994884,37.7109573358094536]},"#77cc00":{"lch":[74.2578384949046892,97.2071675743180776,115.806356387580706],"luv":[74.2578384949046892,-42.3172913249353897,87.5127435448238202],"rgb":[0.466666666666666674,0.8,0],"xyz":[0.291994990493124773,0.47106497957174448,0.0755391193650810505],"hpluv":[115.806356387580706,166.109821583261578,74.2578384949046892],"hsluv":[115.806356387580706,100.000000000002331,74.2578384949046892]},"#77cc11":{"lch":[74.283676291108776,96.1575231653334441,116.077287726142885],"luv":[74.283676291108776,-42.2692272766684525,86.3688698937585144],"rgb":[0.466666666666666674,0.8,0.0666666666666666657],"xyz":[0.293006655992761877,0.471469645771599333,0.0808672243298366872],"hpluv":[116.077287726142885,164.2590118749402,74.283676291108776],"hsluv":[116.077287726142885,98.5840266713216522,74.283676291108776]},"#77cc22":{"lch":[74.3315335987815331,94.2328042547367914,116.591431825394338],"luv":[74.3315335987815331,-42.1809937248656581,84.2649699821603519],"rgb":[0.466666666666666674,0.8,0.133333333333333331],"xyz":[0.294882014131238934,0.472219789026990133,0.0907441105258158798],"hpluv":[116.591431825394338,160.867513369155,74.3315335987815331],"hsluv":[116.591431825394338,95.9817736999432611,74.3315335987815331]},"#77cc33":{"lch":[74.410219680569412,91.1231466477069176,117.473161926834081],"luv":[74.410219680569412,-42.0381214847294515,80.8469182901527148],"rgb":[0.466666666666666674,0.8,0.2],"xyz":[0.29796976486369664,0.47345488931997326,0.10700626438342703],"hpluv":[117.473161926834081,155.394430123968846,74.410219680569412],"hsluv":[117.473161926834081,91.7599970515073551,74.410219680569412]},"#77cc44":{"lch":[74.5235830687713445,86.7634188586395,118.828926444460791],"luv":[74.5235830687713445,-41.8369758074171045,76.0102513305232748],"rgb":[0.466666666666666674,0.8,0.266666666666666663],"xyz":[0.302427760107915555,0.475238087417660826,0.130485039336313668],"hpluv":[118.828926444460791,147.734611978654129,74.5235830687713445],"hsluv":[118.828926444460791,85.7987877580492153,74.5235830687713445]},"#77cc55":{"lch":[74.6747602628398,81.1723246922669688,120.810965560633605],"luv":[74.6747602628398,-41.5770530159641396,69.7158156981220571],"rgb":[0.466666666666666674,0.8,0.333333333333333315],"xyz":[0.30839017414727754,0.477623053033405687,0.161887086610287556],"hpluv":[120.810965560633605,137.934680546119694,74.6747602628398],"hsluv":[120.810965560633605,78.0638956664307671,74.6747602628398]},"#77cc66":{"lch":[74.866352492363319,74.4599116278811692,123.651008617564372],"luv":[74.866352492363319,-41.2606832822808798,61.982533464768764],"rgb":[0.466666666666666674,0.8,0.4],"xyz":[0.315975169920785726,0.480657051342809,0.201834731017431546],"hpluv":[123.651008617564372,126.204595224585091,74.866352492363319],"hsluv":[123.651008617564372,68.5978490432360388,74.866352492363319]},"#77cc77":{"lch":[75.1005189251371519,66.8471540376336719,127.715012949239053],"luv":[75.1005189251371519,-40.8926996459993219,52.8803282761483189],"rgb":[0.466666666666666674,0.8,0.466666666666666674],"xyz":[0.325289182940987631,0.484382656550889801,0.250888532923829455],"hpluv":[127.715012949239053,112.948199149412858,75.1005189251371519],"hsluv":[127.715012949239053,57.5107647824030153,75.1005189251371519]},"#77cc88":{"lch":[75.3790318815133,58.7087525381891311,133.590980823477452],"luv":[75.3790318815133,-40.4800101313413947,42.5215992685696946],"rgb":[0.466666666666666674,0.8,0.533333333333333326],"xyz":[0.336429600042931432,0.488838823391667399,0.309561396327401595],"hpluv":[133.590980823477452,98.8306436104363542,75.3790318815133],"hsluv":[133.590980823477452,58.7660231359317748,75.3790318815133]},"#77cc99":{"lch":[75.7033128937519848,50.6622606125816759,142.200076129410462],"luv":[75.7033128937519848,-40.0310804193600305,31.0512036938324556],"rgb":[0.466666666666666674,0.8,0.6],"xyz":[0.349486564152004187,0.494061609035296556,0.378328073968519529],"hpluv":[142.200076129410462,84.9198084445103802,75.7033128937519848],"hsluv":[142.200076129410462,60.1459848784672815,75.7033128937519848]},"#77ccaa":{"lch":[76.0744587192654,43.7254195479873289,154.773618890386814],"luv":[76.0744587192654,-39.5553661600219684,18.6355928962322395],"rgb":[0.466666666666666674,0.8,0.66666666666666663],"xyz":[0.364544257117256687,0.500084686221397678,0.45763192358551813],"hpluv":[154.773618890386814,73.067319501552376,76.0744587192654],"hsluv":[154.773618890386814,61.6269813218812459,76.0744587192654]},"#77ccbb":{"lch":[76.4932621718819235,39.4413790272598561,172.054536865796422],"luv":[76.4932621718819235,-39.0627454070693716,5.45199970968949721],"rgb":[0.466666666666666674,0.8,0.733333333333333282],"xyz":[0.381681849224593361,0.506939723064332437,0.547889908684159876],"hpluv":[172.054536865796422,67.3385729198675733,76.4932621718819235],"hsluv":[172.054536865796422,63.1840553036415713,76.4932621718819235]},"#77cccc":{"lch":[76.9602305249106,39.4506200876857847,192.177050630060961],"luv":[76.9602305249106,-38.5629992967744357,-8.32144882456723778],"rgb":[0.466666666666666674,0.8,0.8],"xyz":[0.400974224668315116,0.514656673241821183,0.64949641935443],"hpluv":[192.177050630060961,69.0111626451701312,76.9602305249106],"hsluv":[192.177050630060961,64.792316690459316,76.9602305249106]},"#77ccdd":{"lch":[77.4756030772436475,44.2250390945155942,210.602473757279853],"luv":[77.4756030772436475,-38.0653777824919359,-22.5140200139291444],"rgb":[0.466666666666666674,0.8,0.866666666666666696],"xyz":[0.422492550218948604,0.5232640034620748,0.762826267254436],"hpluv":[210.602473757279853,79.5030322309331439,77.4756030772436475],"hsluv":[210.602473757279853,66.4280770246703156,77.4756030772436475]},"#77ccee":{"lch":[78.0393687787239116,52.7144148097026246,224.531483635923479],"luv":[78.0393687787239116,-37.5782716813780482,-36.9686762837126182],"rgb":[0.466666666666666674,0.8,0.933333333333333348],"xyz":[0.446304730485123369,0.532788875568544817,0.888237083322959253],"hpluv":[224.531483635923479,97.6926138158747648,78.0393687787239116],"hsluv":[224.531483635923479,71.3781641956177282,78.0393687787239116]},"#77ccff":{"lch":[78.6512843692400736,63.5145451324089052,234.249283216901347],"luv":[78.6512843692400736,-37.1089966152940249,-51.5462880679385549],"rgb":[0.466666666666666674,0.8,1],"xyz":[0.472475778894954734,0.54325729493247743,1.0260712716147411],"hpluv":[234.249283216901347,121.749546403725816,78.6512843692400736],"hsluv":[234.249283216901347,99.9999999999968168,78.6512843692400736]},"#224400":{"lch":[25.1809799681870601,33.4179584834008523,116.999863609689683],"luv":[25.1809799681870601,-15.1713647924420147,29.7756551486773162],"rgb":[0.133333333333333331,0.266666666666666663,0],"xyz":[0.0272670407739683193,0.0447420690542179589,0.00719932696972761486],"hpluv":[116.999863609689683,168.401755360818214,25.1809799681870601],"hsluv":[116.999863609689683,100.000000000002217,25.1809799681870601]},"#224411":{"lch":[25.304760275593587,29.8643723317269938,120.153298663054528],"luv":[25.304760275593587,-15.0013316265206242,25.8232605261065515],"rgb":[0.133333333333333331,0.266666666666666663,0.0666666666666666657],"xyz":[0.0282787062736054411,0.0451467352540728117,0.0125274319344832463],"hpluv":[120.153298663054528,149.758158325470362,25.304760275593587],"hsluv":[120.153298663054528,85.5029145399767287,25.304760275593587]},"#224422":{"lch":[25.5322735505540379,24.0578500603585184,127.715012949239281],"luv":[25.5322735505540379,-14.7170130248608242,19.0312815425753499],"rgb":[0.133333333333333331,0.266666666666666663,0.133333333333333331],"xyz":[0.0301540644120824597,0.0458968785094636331,0.0224043181304624424],"hpluv":[127.715012949239281,119.565711231297882,25.5322735505540379],"hsluv":[127.715012949239281,60.8802579098014363,25.5322735505540379]},"#224433":{"lch":[25.9015299317797343,16.981905402382786,147.498859327993841],"luv":[25.9015299317797343,-14.3222120947549634,9.12465625699578098],"rgb":[0.133333333333333331,0.266666666666666663,0.2],"xyz":[0.0332418151445402,0.0471319788024467459,0.0386664719880735891],"hpluv":[147.498859327993841,83.1955939146196357,25.9015299317797343],"hsluv":[147.498859327993841,64.09678513773909,25.9015299317797343]},"#224444":{"lch":[26.423438440277998,14.1959776348833024,192.177050630061],"luv":[26.423438440277998,-13.8765746732054378,-2.99440417262938974],"rgb":[0.133333333333333331,0.266666666666666663,0.266666666666666663],"xyz":[0.0376998103887590807,0.048915176900134319,0.0621452469409602276],"hpluv":[192.177050630061,68.1734546180548762,26.423438440277998],"hsluv":[192.177050630061,67.9066037165366367,26.423438440277998]},"#224455":{"lch":[27.1020089847707979,21.1158760403194243,230.453768193421723],"luv":[27.1020089847707979,-13.4444916811297333,-16.2826860310628518],"rgb":[0.133333333333333331,0.266666666666666663,0.333333333333333315],"xyz":[0.0436622244281210728,0.0513001425158791519,0.0935472942149341291],"hpluv":[230.453768193421723,98.865995891455,27.1020089847707979],"hsluv":[230.453768193421723,71.8953118433392717,27.1020089847707979]},"#224466":{"lch":[27.935501760142138,32.6185654266362306,246.366656325875056],"luv":[27.935501760142138,-13.0762038460066634,-29.8828329224226863],"rgb":[0.133333333333333331,0.266666666666666663,0.4],"xyz":[0.0512472202016292511,0.0543341408252824634,0.133494938622078091],"hpluv":[246.366656325875056,148.165710166053657,27.935501760142138],"hsluv":[246.366656325875056,75.7322080769735351,27.935501760142138]},"#224477":{"lch":[28.9175817086007072,45.1016041758277453,253.511262930840303],"luv":[28.9175817086007072,-12.8010466495854338,-43.2468253621948548],"rgb":[0.133333333333333331,0.266666666666666663,0.466666666666666674],"xyz":[0.0605612332218311636,0.0580597460333632798,0.182548740528476],"hpluv":[253.511262930840303,197.910731630760921,28.9175817086007072],"hsluv":[253.511262930840303,79.2164102145581381,28.9175817086007072]},"#224488":{"lch":[30.0385370730522183,57.5093846577101502,257.31357801273],"luv":[30.0385370730522183,-12.6299243743950456,-56.1053859625395432],"rgb":[0.133333333333333331,0.266666666666666663,0.533333333333333326],"xyz":[0.0717016503237749847,0.0625159128741408776,0.241221603932048168],"hpluv":[257.31357801273,242.94013543841632,30.0385370730522183],"hsluv":[257.31357801273,82.2624245727818106,30.0385370730522183]},"#224499":{"lch":[31.2864747985506213,69.5224780150470139,259.59064804278853],"luv":[31.2864747985506213,-12.5612993437317204,-68.3782765807230675],"rgb":[0.133333333333333331,0.266666666666666663,0.6],"xyz":[0.084758614432847712,0.0677386985177700351,0.309988281573166102],"hpluv":[259.59064804278853,281.973268281811727,31.2864747985506213],"hsluv":[259.59064804278853,84.8626039888072796,31.2864747985506213]},"#2244aa":{"lch":[32.6483868166792277,81.0719578322086676,261.068394107427196],"luv":[32.6483868166792277,-12.5868550230291323,-80.0889095154670372],"rgb":[0.133333333333333331,0.266666666666666663,0.66666666666666663],"xyz":[0.0998163073981002402,0.0737617757038711297,0.389292131190164703],"hpluv":[261.068394107427196,315.099896322028769,32.6483868166792277],"hsluv":[261.068394107427196,87.0515845849570695,32.6483868166792277]},"#2244bb":{"lch":[34.1110146972578292,92.183713113584,262.084105297610279],"luv":[34.1110146972578292,-12.6954785449376448,-91.3053217940914266],"rgb":[0.133333333333333331,0.266666666666666663,0.733333333333333282],"xyz":[0.116953899505436887,0.0806168125468058883,0.479550116288806449],"hpluv":[262.084105297610279,342.924793116778346,34.1110146972578292],"hsluv":[262.084105297610279,88.8814901896574128,34.1110146972578292]},"#2244cc":{"lch":[35.6614866183058439,102.915147630289923,262.812952152813068],"luv":[35.6614866183058439,-12.875606592693158,-102.106544191029045],"rgb":[0.133333333333333331,0.266666666666666663,0.8],"xyz":[0.136246274949158641,0.0883337627242946899,0.58115662695907655],"hpluv":[262.812952152813068,366.200711918304478,35.6614866183058439],"hsluv":[262.812952152813068,90.4075680541016453,35.6614866183058439]},"#2244dd":{"lch":[37.2877389569632456,113.32806156453313,263.353781276912969],"luv":[37.2877389569632456,-13.1164125913708496,-112.566465959927598],"rgb":[0.133333333333333331,0.266666666666666663,0.866666666666666696],"xyz":[0.157764600499792185,0.0969410929445482239,0.694486474859082548],"hpluv":[263.353781276912969,385.665452845521429,37.2877389569632456],"hsluv":[263.353781276912969,91.6811227311716408,37.2877389569632456]},"#2244ee":{"lch":[38.9787575249373575,123.477944203962494,263.76603971616106],"luv":[38.9787575249373575,-13.4082956886680194,-122.74779147325674],"rgb":[0.133333333333333331,0.266666666666666663,0.933333333333333348],"xyz":[0.181576780765966922,0.106465965051018269,0.819897290927605771],"hpluv":[263.76603971616106,401.976556214066079,38.9787575249373575],"hsluv":[263.76603971616106,92.7467647141115208,38.9787575249373575]},"#2244ff":{"lch":[40.7246816385265333,133.410810959437413,264.087324287658078],"luv":[40.7246816385265333,-13.7429938745542355,-132.701072340123574],"rgb":[0.133333333333333331,0.266666666666666663,1],"xyz":[0.207747829175798315,0.116934384414950965,0.957731479219387616],"hpluv":[264.087324287658078,415.692943868353552,40.7246816385265333],"hsluv":[264.087324287658078,99.9999999999994174,40.7246816385265333]},"#77dd00":{"lch":[79.4046595803128525,106.500737968556749,117.886764510297155],"luv":[79.4046595803128525,-49.8131268255250319,94.1332012826045457],"rgb":[0.466666666666666674,0.866666666666666696,0],"xyz":[0.3346289810403,0.556332960666096,0.089750449547472369],"hpluv":[117.886764510297155,213.048114553231642,79.4046595803128525],"hsluv":[117.886764510297155,100.000000000002288,79.4046595803128525]},"#77dd11":{"lch":[79.427785829561941,105.558219679332908,118.124490997004173],"luv":[79.427785829561941,-49.7589732732473422,93.0944806133132801],"rgb":[0.466666666666666674,0.866666666666666696,0.0666666666666666657],"xyz":[0.335640646539937082,0.556737626865951,0.095078554512228],"hpluv":[118.124490997004173,211.44368721760469,79.427785829561941],"hsluv":[118.124490997004173,98.7993418471683498,79.427785829561941]},"#77dd22":{"lch":[79.4706261070012658,103.827566318990023,118.57359388187615],"luv":[79.4706261070012658,-49.6593926395600249,91.1817319993116],"rgb":[0.466666666666666674,0.866666666666666696,0.133333333333333331],"xyz":[0.337516004678414139,0.557487770121341764,0.104955440708207198],"hpluv":[118.57359388187615,208.49071074424171,79.4706261070012658],"hsluv":[118.57359388187615,96.5898934808467,79.4706261070012658]},"#77dd33":{"lch":[79.5410783702752582,101.02472031386101,119.337697767432388],"luv":[79.5410783702752582,-49.4976803830995067,88.0680063995226874],"rgb":[0.466666666666666674,0.866666666666666696,0.2],"xyz":[0.340603755410871845,0.55872287041432489,0.121217594565818348],"hpluv":[119.337697767432388,203.689012727245881,79.5410783702752582],"hsluv":[119.337697767432388,92.9973786049096276,79.5410783702752582]},"#77dd44":{"lch":[79.6426121547728485,97.0801788178617073,120.498016398630853],"luv":[79.6426121547728485,-49.2690191092090188,83.6488187323909642],"rgb":[0.466666666666666674,0.866666666666666696,0.266666666666666663],"xyz":[0.34506175065509076,0.560506068512012456,0.144696369518705],"hpluv":[120.498016398630853,196.890303230407255,79.6426121547728485],"hsluv":[120.498016398630853,87.9077551580221126,79.6426121547728485]},"#77dd55":{"lch":[79.7780740091910729,91.9929116678805912,122.163902680224],"luv":[79.7780740091910729,-48.9717875622404577,77.8746417012192325],"rgb":[0.466666666666666674,0.866666666666666696,0.333333333333333315],"xyz":[0.351024164694452745,0.562891034127757206,0.176098416792678902],"hpluv":[122.163902680224,188.049297266091,79.7780740091910729],"hsluv":[122.163902680224,81.2740392578912889,79.7780740091910729]},"#77dd66":{"lch":[79.9498479155991788,85.8342168020908645,124.492086237753256],"luv":[79.9498479155991788,-48.6072648253697466,70.7449403153661],"rgb":[0.466666666666666674,0.866666666666666696,0.4],"xyz":[0.35860916046796093,0.565925032437160525,0.216046061199822836],"hpluv":[124.492086237753256,177.233761467474238,79.9498479155991788],"hsluv":[124.492086237753256,73.1095665987697174,79.9498479155991788]},"#77dd77":{"lch":[80.1599403321921,78.7586110849663896,127.715012949239352],"luv":[80.1599403321921,-48.1793469594900188,62.3030444407821093],"rgb":[0.466666666666666674,0.866666666666666696,0.466666666666666674],"xyz":[0.367923173488162836,0.569650637645241376,0.265099863106220746],"hpluv":[127.715012949239352,164.652954432832814,80.1599403321921],"hsluv":[127.715012949239352,63.4818861677236654,80.1599403321921]},"#77dd88":{"lch":[80.4100305893493754,71.0258644695610855,132.183293417803185],"luv":[80.4100305893493754,-47.69419139775556,52.6301959958607597],"rgb":[0.466666666666666674,0.866666666666666696,0.533333333333333326],"xyz":[0.379063590590106636,0.574106804486018918,0.323772726509792941],"hpluv":[132.183293417803185,150.716476916292407,80.4100305893493754],"hsluv":[132.183293417803185,64.4129914780986184,80.4100305893493754]},"#77dd99":{"lch":[80.7015034668449829,63.0436351039456042,138.421724913218469],"luv":[80.7015034668449829,-47.1597772740100254,41.838443261971527],"rgb":[0.466666666666666674,0.866666666666666696,0.6],"xyz":[0.392120554699179391,0.579329590129648131,0.39253940415091082],"hpluv":[138.421724913218469,136.149613262507529,80.7015034668449829],"hsluv":[138.421724913218469,65.4455974050235909,80.7015034668449829]},"#77ddaa":{"lch":[81.0354720941451916,55.4433276111880673,147.164903113494319],"luv":[81.0354720941451916,-46.5854032558204594,30.0626475895607292],"rgb":[0.466666666666666674,0.866666666666666696,0.66666666666666663],"xyz":[0.407178247664431892,0.585352667315749198,0.471843253767909421],"hpluv":[147.164903113494319,122.204418643173668,81.0354720941451916],"hsluv":[147.164903113494319,66.5644374268903505,81.0354720941451916]},"#77ddbb":{"lch":[81.4127955433910415,49.1817473647014651,159.215751775487576],"luv":[81.4127955433910415,-45.9811599326092804,17.452140415923953],"rgb":[0.466666666666666674,0.866666666666666696,0.733333333333333282],"xyz":[0.424315839771768566,0.592207704158684,0.562101238866551167],"hpluv":[159.215751775487576,110.971854928909636,81.4127955433910415],"hsluv":[159.215751775487576,67.7527973989238461,81.4127955433910415]},"#77ddcc":{"lch":[81.8340936239464298,45.5480287935550479,174.756411210455894],"luv":[81.8340936239464298,-45.3574175840417197,4.16264304083146897],"rgb":[0.466666666666666674,0.866666666666666696,0.8],"xyz":[0.44360821521549032,0.599924654336172813,0.663707749536821323],"hpluv":[174.756411210455894,105.54602277980743,81.8340936239464298],"hsluv":[174.756411210455894,68.9933910523739371,81.8340936239464298]},"#77dddd":{"lch":[82.299760373596115,45.7538051586653296,192.177050630060847],"luv":[82.299760373596115,-44.7243656053231931,-9.65100034703627],"rgb":[0.466666666666666674,0.866666666666666696,0.866666666666666696],"xyz":[0.465126540766123808,0.60853198455642632,0.777037597436827321],"hpluv":[192.177050630060847,109.256318691998032,82.299760373596115],"hsluv":[192.177050630060847,70.2691471280789557,82.299760373596115]},"#77ddee":{"lch":[82.8099771424448221,50.1244355238275574,208.400620203695752],"luv":[82.8099771424448221,-44.0916301090396274,-23.8408722766172367],"rgb":[0.466666666666666674,0.866666666666666696,0.933333333333333348],"xyz":[0.488938721032298573,0.618056856662896337,0.902448413505350544],"hpluv":[208.400620203695752,123.794681382199428,82.8099771424448221],"hsluv":[208.400620203695752,71.5638635335918,82.8099771424448221]},"#77ddff":{"lch":[83.364725787715372,57.9146258331384161,221.361714592462022],"luv":[83.364725787715372,-43.4679842885535521,-38.2705921992655504],"rgb":[0.466666666666666674,0.866666666666666696,1],"xyz":[0.515109769442129939,0.628525276026829061,1.0402826017971325],"hpluv":[221.361714592462022,148.517135389694232,83.364725787715372],"hsluv":[221.361714592462022,99.9999999999953531,83.364725787715372]},"#225500":{"lch":[31.4325909084541877,43.9203091385023825,121.065637009975248],"luv":[31.4325909084541877,-22.6637443991712324,37.6211143459447541],"rgb":[0.133333333333333331,0.333333333333333315,0],"xyz":[0.0390802974883142848,0.0683685824829102229,0.0111370792078428239],"hpluv":[121.065637009975248,177.306450001223254,31.4325909084541877],"hsluv":[121.065637009975248,100.000000000002373,31.4325909084541877]},"#225511":{"lch":[31.5259896590935043,41.027632513747335,123.178290947815412],"luv":[31.5259896590935043,-22.452213479362328,34.3389682366875704],"rgb":[0.133333333333333331,0.333333333333333315,0.0666666666666666657],"xyz":[0.04009196298795141,0.0687732486827650757,0.0164651841725984571],"hpluv":[123.178290947815412,165.138012967735222,31.5259896590935043],"hsluv":[123.178290947815412,90.3912533003173877,31.5259896590935043]},"#225522":{"lch":[31.6981615382414716,36.1013694166085486,127.715012949239792],"luv":[31.6981615382414716,-22.0844473877159331,28.5584673491706482],"rgb":[0.133333333333333331,0.333333333333333315,0.133333333333333331],"xyz":[0.0419673211264284252,0.0695233919381558901,0.0263420703685776497],"hpluv":[127.715012949239792,144.520324593974209,31.6981615382414716],"hsluv":[127.715012949239792,73.5866039174798345,31.6981615382414716]},"#225533":{"lch":[31.9789617713411829,29.2625646618711706,137.400330584271074],"luv":[31.9789617713411829,-21.5402028917408828,19.8070025489176231],"rgb":[0.133333333333333331,0.333333333333333315,0.2],"xyz":[0.0450550718588861657,0.070758492231139,0.0426042242261888],"hpluv":[137.400330584271074,116.114739730974975,31.9789617713411829],"hsluv":[137.400330584271074,75.0932106461487,31.9789617713411829]},"#225544":{"lch":[32.3786649626227785,22.5648709259736577,157.632626155133437],"luv":[32.3786649626227785,-20.8671549807805796,8.58692278490586247],"rgb":[0.133333333333333331,0.333333333333333315,0.266666666666666663],"xyz":[0.0495130671031050462,0.072541690328826583,0.0660829991790754384],"hpluv":[157.632626155133437,88.4327727432137465,32.3786649626227785],"hsluv":[157.632626155133437,76.9882679005547459,32.3786649626227785]},"#225555":{"lch":[32.9031430542149863,20.5945867127178737,192.177050630061132],"luv":[32.9031430542149863,-20.1312179923833199,-4.34408379417313384],"rgb":[0.133333333333333331,0.333333333333333315,0.333333333333333315],"xyz":[0.0554754811424670383,0.0749266559445714159,0.0974850464530493399],"hpluv":[192.177050630061132,79.4245973683706268,32.9031430542149863],"hsluv":[192.177050630061132,79.1137061933639245,32.9031430542149863]},"#225566":{"lch":[33.5545056011551,26.6006796322727546,223.177731373198952],"luv":[33.5545056011551,-19.398136743372234,-18.2018803364993715],"rgb":[0.133333333333333331,0.333333333333333315,0.4],"xyz":[0.0630604769159752165,0.0779606542539747344,0.137432690860193302],"hpluv":[223.177731373198952,100.596116474312993,33.5545056011551],"hsluv":[223.177731373198952,81.3097794801720113,33.5545056011551]},"#225577":{"lch":[34.3316296590174,37.3644949384619807,239.932022094073261],"luv":[34.3316296590174,-18.7206257951117045,-32.3364137134245127],"rgb":[0.133333333333333331,0.333333333333333315,0.466666666666666674],"xyz":[0.0723744899361771221,0.0816862594620555438,0.186486492766591211],"hpluv":[239.932022094073261,138.103289638438355,34.3316296590174],"hsluv":[239.932022094073261,83.4469752602442298,34.3316296590174]},"#225588":{"lch":[35.230707776085,49.7211482448765594,248.610781811292384],"luv":[35.230707776085,-18.1333810040152876,-46.2965773697387775],"rgb":[0.133333333333333331,0.333333333333333315,0.533333333333333326],"xyz":[0.0835149070381209502,0.0861424263028331416,0.245159356170163378],"hpluv":[248.610781811292384,179.084957393431893,35.230707776085],"hsluv":[248.610781811292384,85.4385601139613158,35.230707776085]},"#225599":{"lch":[36.2458273864096512,62.3718238545276336,253.557833057747018],"luv":[36.2458273864096512,-17.6541819100499602,-59.8211858126123],"rgb":[0.133333333333333331,0.333333333333333315,0.6],"xyz":[0.0965718711471936775,0.0913652119464623,0.313926033811281313],"hpluv":[253.557833057747018,218.35832406203005,36.2458273864096512],"hsluv":[253.557833057747018,87.2381583586425791,36.2458273864096512]},"#2255aa":{"lch":[37.3695533294905928,74.8190204360075,256.640324292617947],"luv":[37.3695533294905928,-17.2879233745104131,-72.7943234352841841],"rgb":[0.133333333333333331,0.333333333333333315,0.66666666666666663],"xyz":[0.111629564112446206,0.0973882891325634,0.393229883428279914],"hpluv":[256.640324292617947,254.058329165629146,37.3695533294905928],"hsluv":[256.640324292617947,88.8301308270208807,37.3695533294905928]},"#2255bb":{"lch":[38.5934754222231291,86.8805221786483,258.695157685582501],"luv":[38.5934754222231291,-17.0311035792378,-85.1948745225196831],"rgb":[0.133333333333333331,0.333333333333333315,0.733333333333333282],"xyz":[0.128767156219782852,0.104243325975498152,0.48348786852692166],"hpluv":[258.695157685582501,285.658965815982469,38.5934754222231291],"hsluv":[258.695157685582501,90.2188193496234874,38.5934754222231291]},"#2255cc":{"lch":[39.9086891196534097,98.5112685419302,260.136263381096],"luv":[39.9086891196534097,-16.8755295039118458,-97.0550695930042],"rgb":[0.133333333333333331,0.333333333333333315,0.8],"xyz":[0.148059531663504607,0.111960276152986954,0.585094379197191761],"hpluv":[260.136263381096,313.22597901471056,39.9086891196534097],"hsluv":[260.136263381096,91.4196885710314433,39.9086891196534097]},"#2255dd":{"lch":[41.3061900239028503,109.727240919989157,261.187210775965298],"luv":[41.3061900239028503,-16.8109176424286737,-108.431823962952976],"rgb":[0.133333333333333331,0.333333333333333315,0.866666666666666696],"xyz":[0.16957785721413815,0.120567606373240488,0.698424227097197758],"hpluv":[261.187210775965298,337.084394380702577,41.3061900239028503],"hsluv":[261.187210775965298,92.4531471705562353,41.3061900239028503]},"#2255ee":{"lch":[42.7771763125841602,120.569176865205208,261.977669343247612],"luv":[42.7771763125841602,-16.8265186863462972,-119.389256965822398],"rgb":[0.133333333333333331,0.333333333333333315,0.933333333333333348],"xyz":[0.193390037480312887,0.130092478479710533,0.823835043165721],"hpluv":[261.977669343247612,357.654347674158601,42.7771763125841602],"hsluv":[261.977669343247612,93.3407272081067,42.7771763125841602]},"#2255ff":{"lch":[44.3132637322964129,131.084767922007643,262.587267096581058],"luv":[44.3132637322964129,-16.9120289519133,-129.989229007238322],"rgb":[0.133333333333333331,0.333333333333333315,1],"xyz":[0.219561085890144281,0.140560897843643229,0.961669231457502827],"hpluv":[262.587267096581058,375.368494421854962,44.3132637322964129],"hsluv":[262.587267096581058,99.9999999999993463,44.3132637322964129]},"#77ee00":{"lch":[84.5193058633960703,115.647601499010833,119.483871035599748],"luv":[84.5193058633960703,-56.9192667804191,100.670575649757225],"rgb":[0.466666666666666674,0.933333333333333348,0],"xyz":[0.381807757380814794,0.650690513347127,0.105476708327643554],"hpluv":[119.483871035599748,321.869538605652735,84.5193058633960703],"hsluv":[119.483871035599748,100.000000000002359,84.5193058633960703]},"#77ee11":{"lch":[84.5401392884337355,114.795422022346642,119.691827475064969],"luv":[84.5401392884337355,-56.862163274863434,99.7230329712822083],"rgb":[0.466666666666666674,0.933333333333333348,0.0666666666666666657],"xyz":[0.382819422880451898,0.651095179546981928,0.11080481329239919],"hpluv":[119.691827475064969,319.985367790437692,84.5401392884337355],"hsluv":[119.691827475064969,98.9722780394741477,84.5401392884337355]},"#77ee22":{"lch":[84.5787360835130499,113.228793274865538,120.083373039169615],"luv":[84.5787360835130499,-56.7570256545281637,97.9765260934141651],"rgb":[0.466666666666666674,0.933333333333333348,0.133333333333333331],"xyz":[0.384694781018928955,0.651845322802372729,0.120681699488378383],"hpluv":[120.083373039169615,316.512949618186383,84.5787360835130499],"hsluv":[120.083373039169615,97.0790709390529,84.5787360835130499]},"#77ee33":{"lch":[84.6422206992536275,110.686316006337648,120.745647293955486],"luv":[84.6422206992536275,-56.585921413754825,95.1288286946244313],"rgb":[0.466666666666666674,0.933333333333333348,0.2],"xyz":[0.387782531751386661,0.653080423095355855,0.136943853345989519],"hpluv":[120.745647293955486,310.853610471304819,84.6422206992536275],"hsluv":[120.745647293955486,93.9952250088888093,84.6422206992536275]},"#77ee44":{"lch":[84.7337366993681513,107.096480548503891,121.742158736883837],"luv":[84.7337366993681513,-56.3431952848259598,91.0774422728923412],"rgb":[0.466666666666666674,0.933333333333333348,0.266666666666666663],"xyz":[0.392240526995605576,0.654863621193043421,0.160422628298876158],"hpluv":[121.742158736883837,302.811644310583176,84.7337366993681513],"hsluv":[121.742158736883837,89.6144795711786628,84.7337366993681513]},"#77ee55":{"lch":[84.8558768548969766,102.444399932600575,123.154228511336783],"luv":[84.8558768548969766,-56.0262879596216621,85.7666026785261266],"rgb":[0.466666666666666674,0.933333333333333348,0.333333333333333315],"xyz":[0.398202941034967561,0.657248586808788171,0.191824675572850073],"hpluv":[123.154228511336783,292.298881153811294,84.8558768548969766],"hsluv":[123.154228511336783,83.883891015311761,84.8558768548969766]},"#77ee66":{"lch":[85.0108293450033159,96.7735040486586,125.092887734820366],"luv":[85.0108293450033159,-55.6354444449268186,79.1821217654036],"rgb":[0.466666666666666674,0.933333333333333348,0.4],"xyz":[0.405787936808475747,0.66028258511819149,0.231772319979994035],"hpluv":[125.092887734820366,279.341716913636219,85.0108293450033159],"hsluv":[125.092887734820366,76.7984153057879411,85.0108293450033159]},"#77ee77":{"lch":[85.2004556710930814,90.1918871908529667,127.71501294923965],"luv":[85.2004556710930814,-55.1734745704367882,71.3474892261312306],"rgb":[0.466666666666666674,0.933333333333333348,0.466666666666666674],"xyz":[0.415101949828677652,0.664008190326272341,0.280826121886391944],"hpluv":[127.71501294923965,264.105357222364148,85.2004556710930814],"hsluv":[127.71501294923965,68.3966317942099522,85.2004556710930814]},"#77ee88":{"lch":[85.4263369442757323,82.8846309918514521,131.246169999264879],"luv":[85.4263369442757323,-54.6454688778224167,62.3196179848555],"rgb":[0.466666666666666674,0.933333333333333348,0.533333333333333326],"xyz":[0.426242366930621452,0.668464357167049883,0.339498985289964139],"hpluv":[131.246169999264879,246.94310788397641,85.4263369442757323],"hsluv":[131.246169999264879,69.0963798671032379,85.4263369442757323]},"#77ee99":{"lch":[85.6898036798217,75.1362836057233,136.010896750223054],"luv":[85.6898036798217,-54.0584447513185395,52.1837682153016473],"rgb":[0.466666666666666674,0.933333333333333348,0.6],"xyz":[0.439299331039694207,0.673687142810679096,0.408265662931082],"hpluv":[136.010896750223054,228.489214549916312,85.6898036798217],"hsluv":[136.010896750223054,69.8780652000076827,85.6898036798217]},"#77eeaa":{"lch":[85.9919564191548602,67.3699388554866232,142.461966648640384],"luv":[85.9919564191548602,-53.4209300451477489,41.0476904892764551],"rgb":[0.466666666666666674,0.933333333333333348,0.66666666666666663],"xyz":[0.454357024004946708,0.679710219996780163,0.487569512548080619],"hpluv":[142.461966648640384,209.826142071523691,85.9919564191548602],"hsluv":[142.461966648640384,70.7318226594993575,85.9919564191548602]},"#77eebb":{"lch":[86.3336811163097337,60.2064759054885243,151.166773543866697],"luv":[86.3336811163097337,-52.7425080063862524,29.0352818163428843],"rgb":[0.466666666666666674,0.933333333333333348,0.733333333333333282],"xyz":[0.471494616112283382,0.686565256839714921,0.577827497646722366],"hpluv":[151.166773543866697,192.758378827545073,86.3336811163097337],"hsluv":[151.166773543866697,71.6464628016145895,86.3336811163097337]},"#77eecc":{"lch":[86.7156615657761449,54.5207620102438284,162.626180625161169],"luv":[86.7156615657761449,-52.0333543078463094,16.2801575438255028],"rgb":[0.466666666666666674,0.933333333333333348,0.8],"xyz":[0.490786991556005137,0.694282207017203778,0.679434008316992522],"hpluv":[162.626180625161169,180.150974339718545,86.7156615657761449],"hsluv":[162.626180625161169,72.6100300694190111,86.7156615657761449]},"#77eedd":{"lch":[87.1383902516757445,51.3868015721907483,176.742975614533037],"luv":[87.1383902516757445,-51.3037971188162771,2.91955082350760353],"rgb":[0.466666666666666674,0.933333333333333348,0.866666666666666696],"xyz":[0.512305317106638625,0.702889537237457285,0.792763856216998519],"hpluv":[176.742975614533037,175.997429168902841,87.1383902516757445],"hsluv":[176.742975614533037,73.6103328445444305,87.1383902516757445]},"#77eeee":{"lch":[87.6021784736708327,51.7277775307036,192.177050630061075],"luv":[87.6021784736708327,-50.5639263491039941,-10.9111099540033418],"rgb":[0.466666666666666674,0.933333333333333348,0.933333333333333348],"xyz":[0.536117497372813334,0.712414409343927302,0.918174672285521742],"hpluv":[192.177050630061075,184.503896016801804,87.6021784736708327],"hsluv":[192.177050630061075,74.6354143053272594,87.6021784736708327]},"#77eeff":{"lch":[88.107166277409533,55.7808213308350673,206.722210113893169],"luv":[88.107166277409533,-49.8232704905303336,-25.0826981397535107],"rgb":[0.466666666666666674,0.933333333333333348,1],"xyz":[0.562288545782644755,0.72288282870786,1.05600886057730348],"hpluv":[206.722210113893169,208.278116369071,88.107166277409533],"hsluv":[206.722210113893169,99.9999999999928804,88.107166277409533]},"#226600":{"lch":[37.5582057574881532,54.1200869321592961,123.236537452327113],"luv":[37.5582057574881532,-29.6630419039077431,45.2668505040000824],"rgb":[0.133333333333333331,0.4,0],"xyz":[0.0541083551941607538,0.0984246978946035633,0.0161464317764581713],"hpluv":[123.236537452327113,182.849162381267462,37.5582057574881532],"hsluv":[123.236537452327113,100.000000000002288,37.5582057574881532]},"#226611":{"lch":[37.6315056544729529,51.7196180195473119,124.710513292064419],"luv":[37.6315056544729529,-29.4507212427394194,42.5155725160833242],"rgb":[0.133333333333333331,0.4,0.0666666666666666657],"xyz":[0.0551200206937978721,0.0988293640944584162,0.0214745367412138],"hpluv":[124.710513292064419,174.398618448608886,37.6315056544729529],"hsluv":[124.710513292064419,93.2756924270169918,37.6315056544729529]},"#226622":{"lch":[37.7668566222969062,47.5272711912458519,127.715012949240034],"luv":[37.7668566222969062,-29.0740638670039928,37.5970785719263176],"rgb":[0.133333333333333331,0.4,0.133333333333333331],"xyz":[0.0569953788322748942,0.0995795073498492306,0.031351422937193],"hpluv":[127.715012949240034,159.687663587322874,37.7668566222969062],"hsluv":[127.715012949240034,81.309482828258183,37.7668566222969062]},"#226633":{"lch":[37.9882367851431084,41.3581300307957349,133.555287588173542],"luv":[37.9882367851431084,-28.497993426715972,29.9726423642471254],"rgb":[0.133333333333333331,0.4,0.2],"xyz":[0.0600831295647326347,0.100814607642832343,0.0476135767948041438],"hpluv":[133.555287588173542,138.150062101989391,37.9882367851431084],"hsluv":[133.555287588173542,82.0766642375396742,37.9882367851431084]},"#226644":{"lch":[38.3046909892153806,34.1393686276432291,144.379277801066621],"luv":[38.3046909892153806,-27.7515572052733894,19.8833488873617412],"rgb":[0.133333333333333331,0.4,0.266666666666666663],"xyz":[0.0645411248089515083,0.102597805740519923,0.0710923517476907824],"hpluv":[144.379277801066621,113.094855071532635,38.3046909892153806],"hsluv":[144.379277801066621,83.0794073538424414,38.3046909892153806]},"#226655":{"lch":[38.7222568592555234,28.0005039743963025,163.778220785970291],"luv":[38.7222568592555234,-26.8857357715149732,7.82211191715276755],"rgb":[0.133333333333333331,0.4,0.333333333333333315],"xyz":[0.0705035388483135073,0.104982771356264756,0.102494399021664684],"hpluv":[163.778220785970291,91.7581213405574516,38.7222568592555234],"hsluv":[163.778220785970291,84.2573678500350809,38.7222568592555234]},"#226666":{"lch":[39.2444156655659739,26.5583838540848376,192.177050630061103],"luv":[39.2444156655659739,-25.9608324434988,-5.60204710632589631],"rgb":[0.133333333333333331,0.4,0.4],"xyz":[0.0780885346218216786,0.108016769665668075,0.142442043428808646],"hpluv":[192.177050630061103,85.8742788705857691,39.2444156655659739],"hsluv":[192.177050630061103,85.5381417500271652,39.2444156655659739]},"#226677":{"lch":[39.8723950361637449,31.9118423017057466,218.325872967111877],"luv":[39.8723950361637449,-25.034725973132506,-19.7895976345933065],"rgb":[0.133333333333333331,0.4,0.466666666666666674],"xyz":[0.0874025476420236,0.111742374873748884,0.191495845335206555],"hpluv":[218.325872967111877,101.559108573692257,39.8723950361637449],"hsluv":[218.325872967111877,86.8516914397336137,39.8723950361637449]},"#226688":{"lch":[40.6054458094686836,41.8995680003496318,234.7955790683381],"luv":[40.6054458094686836,-24.1549067561574908,-34.2361545477476241],"rgb":[0.133333333333333331,0.4,0.533333333333333326],"xyz":[0.0985429647439674261,0.116198541714526482,0.250168708738778722],"hpluv":[234.7955790683381,130.937664052949941,40.6054458094686836],"hsluv":[234.7955790683381,88.1401386465251733,40.6054458094686836]},"#226699":{"lch":[41.4411308461218226,53.8933488408681782,244.319142730286046],"luv":[41.4411308461218226,-23.3551142576285748,-48.5698639826860301],"rgb":[0.133333333333333331,0.4,0.6],"xyz":[0.11159992885304014,0.12142132735815564,0.318935386379896657],"hpluv":[244.319142730286046,165.022400136876769,41.4411308461218226],"hsluv":[244.319142730286046,89.3619383181549267,41.4411308461218226]},"#2266aa":{"lch":[42.3756299296545578,66.5269840788925251,250.089735516440328],"luv":[42.3756299296545578,-22.655631138578233,-62.5504755245386193],"rgb":[0.133333333333333331,0.4,0.66666666666666663],"xyz":[0.126657621818292682,0.127444404544256734,0.398239235996895258],"hpluv":[250.089735516440328,199.214522587526545,42.3756299296545578],"hsluv":[250.089735516440328,90.4915899210210597,42.3756299296545578]},"#2266bb":{"lch":[43.404050412459263,79.1834510223872599,253.819475134999237],"luv":[43.404050412459263,-22.0656311263342282,-76.0468726432017803],"rgb":[0.133333333333333331,0.4,0.733333333333333282],"xyz":[0.143795213925629328,0.134299441387191493,0.488497221095537],"hpluv":[253.819475134999237,231.496000814517572,43.404050412459263],"hsluv":[253.819475134999237,91.5168425909476895,43.404050412459263]},"#2266cc":{"lch":[44.520728505208055,91.5877705166709,256.367788484306971],"luv":[44.520728505208055,-21.5861851194902563,-89.0076194502553193],"rgb":[0.133333333333333331,0.4,0.8],"xyz":[0.163087589369351083,0.142016391564680294,0.590103731765807105],"hpluv":[256.367788484306971,261.044502527732277,44.520728505208055],"hsluv":[256.367788484306971,92.43509558526695,44.520728505208055]},"#2266dd":{"lch":[45.7195068588792211,103.627896901795907,258.1878164043369],"luv":[45.7195068588792211,-21.2130654589597789,-101.433460308337743],"rgb":[0.133333333333333331,0.4,0.866666666666666696],"xyz":[0.184605914919984626,0.150623721784933828,0.703433579665813102],"hpluv":[258.1878164043369,287.616948003961852,45.7195068588792211],"hsluv":[258.1878164043369,93.2500413525610696,45.7195068588792211]},"#2266ee":{"lch":[46.9939777237187144,115.273293340910215,259.534328145616598],"luv":[46.9939777237187144,-20.9389771714321675,-113.35559709460216],"rgb":[0.133333333333333331,0.4,0.933333333333333348],"xyz":[0.208418095186159336,0.160148593891403873,0.828844395734336326],"hpluv":[259.534328145616598,311.261797341727515,46.9939777237187144],"hsluv":[259.534328145616598,93.969002023907521,46.9939777237187144]},"#2266ff":{"lch":[48.3376856243364728,126.534150990995641,260.559220542156197],"luv":[48.3376856243364728,-20.75515631493003,-124.820330288598825],"rgb":[0.133333333333333331,0.4,1],"xyz":[0.234589143595990757,0.170617013255336569,0.966678584026118171],"hpluv":[260.559220542156197,332.170629177470857,48.3376856243364728],"hsluv":[260.559220542156197,99.9999999999992184,48.3376856243364728]},"#77ff00":{"lch":[89.5984732569245921,124.632639236881928,120.733702851753719],"luv":[89.5984732569245921,-63.6933378884713406,107.128210438594465],"rgb":[0.466666666666666674,1,0],"xyz":[0.433660129810488626,0.754395258206476127,0.122760832470867665],"hpluv":[120.733702851753719,538.628162219261071,89.5984732569245921],"hsluv":[120.733702851753719,100.000000000002359,89.5984732569245921]},"#77ff11":{"lch":[89.6173512893739144,123.857431845856226,120.915842858481739],"luv":[89.6173512893739144,-63.635285050623331,106.260123846986147],"rgb":[0.466666666666666674,1,0.0666666666666666657],"xyz":[0.43467179531012573,0.754799924406331,0.128088937435623301],"hpluv":[120.915842858481739,536.333532616984598,89.6173512893739144],"hsluv":[120.915842858481739,99.9999999999912461,89.6173512893739144]},"#77ff22":{"lch":[89.6523282897647107,122.430860002153082,121.257903913559275],"luv":[89.6523282897647107,-63.5282943614823736,104.658832863679763],"rgb":[0.466666666666666674,1,0.133333333333333331],"xyz":[0.436547153448602787,0.755550067661721836,0.13796582363160248],"hpluv":[121.257903913559275,532.099457877515,89.6523282897647107],"hsluv":[121.257903913559275,99.9999999999912319,89.6523282897647107]},"#77ff33":{"lch":[89.7098670229763684,120.111567958755899,121.833904144252088],"luv":[89.7098670229763684,-63.3538816193187557,102.044472860004433],"rgb":[0.466666666666666674,1,0.2],"xyz":[0.439634904181060493,0.756785167954705,0.15422797748921363],"hpluv":[121.833904144252088,525.184015431200237,89.7098670229763684],"hsluv":[121.833904144252088,99.9999999999911893,89.7098670229763684]},"#77ff44":{"lch":[89.7928292607091834,116.827732221897932,122.694629127971339],"luv":[89.7928292607091834,-63.1058355300939766,98.317712230097257],"rgb":[0.466666666666666674,1,0.266666666666666663],"xyz":[0.444092899425279408,0.758568366052392529,0.177706752442100269],"hpluv":[122.694629127971339,515.324540814372313,89.7928292607091834],"hsluv":[122.694629127971339,99.9999999999912319,89.7928292607091834]},"#77ff55":{"lch":[89.9035853929870683,112.554947355203538,123.902387884937639],"luv":[89.9035853929870683,-62.7808648215699492,93.4193726503684161],"rgb":[0.466666666666666674,1,0.333333333333333315],"xyz":[0.450055313464641393,0.760953331668137278,0.209108799716074184],"hpluv":[123.902387884937639,502.374863630046946,89.9035853929870683],"hsluv":[123.902387884937639,99.9999999999911466,89.9035853929870683]},"#77ff66":{"lch":[90.0441481999633169,107.316590618570714,125.538864396596409],"luv":[90.0441481999633169,-62.3783098318914213,87.3258099562234662],"rgb":[0.466666666666666674,1,0.4],"xyz":[0.457640309238149579,0.763987329977540597,0.249056444123218146],"hpluv":[125.538864396596409,486.310350268178581,90.0441481999633169],"hsluv":[125.538864396596409,99.9999999999909193,90.0441481999633169]},"#77ff77":{"lch":[90.2162444924982,101.18761180958829,127.715012949239778],"luv":[90.2162444924982,-61.8999369112410065,80.0458031011764746],"rgb":[0.466666666666666674,1,0.466666666666666674],"xyz":[0.466954322258351484,0.767712935185621448,0.298110246029616055],"hpluv":[127.715012949239778,467.252180695244249,90.2162444924982],"hsluv":[127.715012949239778,99.9999999999908908,90.2162444924982]},"#77ff88":{"lch":[90.4213578195287084,94.3018691223763312,130.584388318929172],"luv":[90.4213578195287084,-61.3497133683486666,71.6174223886566352],"rgb":[0.466666666666666674,1,0.533333333333333326],"xyz":[0.478094739360295284,0.772169102026399,0.35678310943318825],"hpluv":[130.584388318929172,445.517691352744919,90.4213578195287084],"hsluv":[130.584388318929172,99.999999999990834,90.4213578195287084]},"#77ff99":{"lch":[90.660755936805927,86.8649116623181,134.360625617567337],"luv":[90.660755936805927,-60.7335297134313734,62.1043577106315],"rgb":[0.466666666666666674,1,0.6],"xyz":[0.491151703469368,0.777391887670028203,0.425549787074306129],"hpluv":[134.360625617567337,421.714412879972315,90.660755936805927],"hsluv":[134.360625617567337,99.9999999999904645,90.660755936805927]},"#77ffaa":{"lch":[90.9355096576679927,79.1755179707932513,139.336843070371486],"luv":[90.9355096576679927,-60.0588662825700368,51.5916197341755947],"rgb":[0.466666666666666674,1,0.66666666666666663],"xyz":[0.506209396434620595,0.78341496485612927,0.504853636691304786],"hpluv":[139.336843070371486,396.909453229520182,90.9355096576679927],"hsluv":[139.336843070371486,99.9999999999902371,90.9355096576679927]},"#77ffbb":{"lch":[91.2465066485729466,71.6593730134265599,145.894485367843032],"luv":[91.2465066485729466,-59.3344173347434776,40.1807498713488229],"rgb":[0.466666666666666674,1,0.733333333333333282],"xyz":[0.523346988541957159,0.790270001699064,0.595111621789946477],"hpluv":[145.894485367843032,372.920765055848051,91.2465066485729466],"hsluv":[145.894485367843032,99.9999999999901803,91.2465066485729466]},"#77ffcc":{"lch":[91.5944622372901591,64.9119206982031329,154.461378490718602],"luv":[91.5944622372901591,-58.5696939322881676,27.9847887504604707],"rgb":[0.466666666666666674,1,0.8],"xyz":[0.542639363985678913,0.797986951876552886,0.696718132460216633],"hpluv":[154.461378490718602,352.767904832744364,91.5944622372901591],"hsluv":[154.461378490718602,99.999999999989825,91.5944622372901591]},"#77ffdd":{"lch":[91.9799284987297,59.7212008687906604,165.331177548206284],"luv":[91.9799284987297,-57.7746296637575298,15.1232933062250314],"rgb":[0.466666666666666674,1,0.866666666666666696],"xyz":[0.564157689536312512,0.806594282096806392,0.81004798036022263],"hpluv":[165.331177548206284,341.200809564626638,91.9799284987297],"hsluv":[165.331177548206284,99.9999999999894698,91.9799284987297]},"#77ffee":{"lch":[92.4033024177180238,56.9851054432815545,178.272694676027839],"luv":[92.4033024177180238,-56.9592119034112,1.71767916801026743],"rgb":[0.466666666666666674,1,0.933333333333333348],"xyz":[0.587969869802487222,0.816119154203276409,0.935458796428745853],"hpluv":[178.272694676027839,344.865805035808421,92.4033024177180238],"hsluv":[178.272694676027839,99.9999999999889582,92.4033024177180238]},"#77ffff":{"lch":[92.8648336399367196,57.4251975820971623,192.177050630061018],"luv":[92.8648336399367196,-56.1331570721439945,-12.112885471963672],"rgb":[0.466666666666666674,1,1],"xyz":[0.614140918212318643,0.826587573567209133,1.0732929847205277],"hpluv":[192.177050630061018,371.354821198433683,92.8648336399367196],"hsluv":[192.177050630061018,99.9999999999883187,92.8648336399367196]},"#227700":{"lch":[43.5559297152692295,63.9882214930525208,124.519604676885976],"luv":[43.5559297152692295,-36.2613695379953711,52.7219647687080268],"rgb":[0.133333333333333331,0.466666666666666674,0],"xyz":[0.0725620932475783825,0.13533217400143932,0.0222976777942638753],"hpluv":[124.519604676885976,186.419817132403381,43.5559297152692295],"hsluv":[124.519604676885976,100.000000000002331,43.5559297152692295]},"#227711":{"lch":[43.6152314308602769,61.9621092027414093,125.591738779589861],"luv":[43.6152314308602769,-36.0623023987336282,50.3866383335378174],"rgb":[0.133333333333333331,0.466666666666666674,0.0666666666666666657],"xyz":[0.0735737587472155,0.135736840201294173,0.0276257827590195085],"hpluv":[125.591738779589861,180.271610265320959,43.6152314308602769],"hsluv":[125.591738779589861,95.0867888092805345,43.6152314308602769]},"#227722":{"lch":[43.7248500006056062,58.3665782213362476,127.715012949240148],"luv":[43.7248500006056062,-35.7048401974777292,46.1716562377823081],"rgb":[0.133333333333333331,0.466666666666666674,0.133333333333333331],"xyz":[0.0754491168856925298,0.136486983456685,0.0375026689549987],"hpluv":[127.715012949240148,169.385110384242353,43.7248500006056062],"hsluv":[127.715012949240148,86.2472116803111248,43.7248500006056062]},"#227733":{"lch":[43.9044636679785,52.8998675233047422,131.63685913347058],"luv":[43.9044636679785,-35.1470498804547518,39.5358175416168365],"rgb":[0.133333333333333331,0.466666666666666674,0.2],"xyz":[0.0785368676181502634,0.137722083749668101,0.0537648228126098443],"hpluv":[131.63685913347058,152.892166506547881,43.9044636679785],"hsluv":[131.63685913347058,86.6671370230467204,43.9044636679785]},"#227744":{"lch":[44.1618994548856207,46.0187725021067919,138.382113458020484],"luv":[44.1618994548856207,-34.403210499316,30.5638107889119937],"rgb":[0.133333333333333331,0.466666666666666674,0.266666666666666663],"xyz":[0.082994862862369137,0.139505281847355694,0.0772435977654964828],"hpluv":[138.382113458020484,132.228969104156789,44.1618994548856207],"hsluv":[138.382113458020484,87.230083060842972,44.1618994548856207]},"#227755":{"lch":[44.5028042963196171,38.7961505601339098,149.7341572603126],"luv":[44.5028042963196171,-33.5080868304533865,19.5537570621958743],"rgb":[0.133333333333333331,0.466666666666666674,0.333333333333333315],"xyz":[0.088957276901731136,0.141890247463100527,0.108645645039470398],"hpluv":[149.7341572603126,110.621765171639552,44.5028042963196171],"hsluv":[149.7341572603126,87.9126674499387235,44.5028042963196171]},"#227766":{"lch":[44.9310046324235657,33.2418513983527504,167.948858330193701],"luv":[44.9310046324235657,-32.5092552143098246,6.94038974417402166],"rgb":[0.133333333333333331,0.466666666666666674,0.4],"xyz":[0.0965422726752393073,0.144924245772503818,0.148593289446614346],"hpluv":[167.948858330193701,93.8811500215461,44.9310046324235657],"hsluv":[167.948858330193701,88.6822605795820778,44.9310046324235657]},"#227777":{"lch":[45.4487163896678652,32.1827345016432886,192.177050630061217],"luv":[45.4487163896678652,-31.4586377906525136,-6.7884098550242733],"rgb":[0.133333333333333331,0.466666666666666674,0.466666666666666674],"xyz":[0.105856285695441227,0.148649850980584641,0.197647091353012255],"hpluv":[192.177050630061217,89.8546686552558,45.4487163896678652],"hsluv":[192.177050630061217,89.5029511213474,45.4487163896678652]},"#227788":{"lch":[46.0567093690380389,37.0457871068229778,214.840569513336618],"luv":[46.0567093690380389,-30.4051407329018595,-21.1640676472289648],"rgb":[0.133333333333333331,0.466666666666666674,0.533333333333333326],"xyz":[0.116996702797385055,0.153106017821362239,0.256319954756584423],"hpluv":[214.840569513336618,102.066975938242322,46.0567093690380389],"hsluv":[214.840569513336618,90.3407286635711415,46.0567093690380389]},"#227799":{"lch":[46.7544651468991219,46.3079141704010908,230.605362437026685],"luv":[46.7544651468991219,-29.3896969252833173,-35.7864308006991223],"rgb":[0.133333333333333331,0.466666666666666674,0.6],"xyz":[0.130053666906457754,0.158328803464991397,0.325086632397702358],"hpluv":[230.605362437026685,125.681528260779189,46.7544651468991219],"hsluv":[230.605362437026685,91.1669787694701,46.7544651468991219]},"#2277aa":{"lch":[47.5403420753171133,57.8256716053654429,240.536105931551504],"luv":[47.5403420753171133,-28.4430017925967782,-50.3468365007961935],"rgb":[0.133333333333333331,0.466666666666666674,0.66666666666666663],"xyz":[0.14511135987171031,0.164351880651092491,0.404390482014700958],"hpluv":[240.536105931551504,154.346828351852139,47.5403420753171133],"hsluv":[240.536105931551504,91.9600907928071365,47.5403420753171133]},"#2277bb":{"lch":[48.4117490016133161,70.2708193466387172,246.886175208709233],"luv":[48.4117490016133161,-27.5854458877112236,-64.6299561103370337],"rgb":[0.133333333333333331,0.466666666666666674,0.733333333333333282],"xyz":[0.162248951979046957,0.17120691749402725,0.494648467113342705],"hpluv":[246.886175208709233,184.188949495161438,48.4117490016133161],"hsluv":[246.886175208709233,92.7055270960754427,48.4117490016133161]},"#2277cc":{"lch":[49.3653235224945348,82.9601291275659634,251.131977113837081],"luv":[49.3653235224945348,-26.8284223951791141,-78.5023488607078],"rgb":[0.133333333333333331,0.466666666666666674,0.8],"xyz":[0.181541327422768684,0.178923867671516051,0.596254977783612805],"hpluv":[251.131977113837081,213.248879712122147,49.3653235224945348],"hsluv":[251.131977113837081,93.3949294454883301,49.3653235224945348]},"#2277dd":{"lch":[50.3971082370692898,95.5506012475210156,254.100456017762497],"luv":[50.3971082370692898,-26.1762366694964186,-91.8951687118820928],"rgb":[0.133333333333333331,0.466666666666666674,0.866666666666666696],"xyz":[0.203059652973402227,0.187531197891769585,0.709584825683618803],"hpluv":[254.100456017762497,240.584217083197558,50.3971082370692898],"hsluv":[254.100456017762497,94.0248036114472399,50.3971082370692898]},"#2277ee":{"lch":[51.5027182397596448,107.874744495734575,256.256689112315712],"luv":[51.5027182397596448,-25.6280715933506258,-104.786270314512635],"rgb":[0.133333333333333331,0.466666666666666674,0.933333333333333348],"xyz":[0.226871833239577,0.19705606999823963,0.834995641752142],"hpluv":[256.256689112315712,265.784074864026707,51.5027182397596448],"hsluv":[256.256689112315712,94.5951642228933594,51.5027182397596448]},"#2277ff":{"lch":[52.6774941409559432,119.859275592882611,257.873120264558906],"luv":[52.6774941409559432,-25.1797078347732324,-117.18459053564186],"rgb":[0.133333333333333331,0.466666666666666674,1],"xyz":[0.253042881649408358,0.207524489362172326,0.972829830043923871],"hpluv":[257.873120264558906,288.725982332353851,52.6774941409559432],"hsluv":[257.873120264558906,99.9999999999990195,52.6774941409559432]},"#228800":{"lch":[49.4326013626652951,73.5543249838887903,125.335546592141156],"luv":[49.4326013626652951,-42.5411625112882845,60.0040683289365475],"rgb":[0.133333333333333331,0.533333333333333326,0],"xyz":[0.0946344629725488357,0.179476913451380865,0.0296551343692538216],"hpluv":[125.335546592141156,188.81394887832684,49.4326013626652951],"hsluv":[125.335546592141156,100.000000000002359,49.4326013626652951]},"#228811":{"lch":[49.4817413630627669,71.8188220709608,126.143293588176633],"luv":[49.4817413630627669,-42.3592238010278379,57.9968909738682825],"rgb":[0.133333333333333331,0.533333333333333326,0.0666666666666666657],"xyz":[0.0956461284721859539,0.179881579651235718,0.0349832393340094513],"hpluv":[126.143293588176633,184.175827324420425,49.4817413630627669],"hsluv":[126.143293588176633,96.2839239867753776,49.4817413630627669]},"#228822":{"lch":[49.5726392440562904,68.7061860444130161,127.715012949240233],"luv":[49.5726392440562904,-42.0299333634258545,54.3509402148249521],"rgb":[0.133333333333333331,0.533333333333333326,0.133333333333333331],"xyz":[0.097521486610662983,0.180631722906626546,0.0448601255299886509],"hpluv":[127.715012949240233,175.870551812838869,49.5726392440562904],"hsluv":[127.715012949240233,89.549457305464,49.5726392440562904]},"#228833":{"lch":[49.7217546026668913,63.8760413965615115,130.529662443073192],"luv":[49.7217546026668913,-41.5093107949551552,48.5502397710151357],"rgb":[0.133333333333333331,0.533333333333333326,0.2],"xyz":[0.100609237343120717,0.181866823199609645,0.0611222793875997941],"hpluv":[130.529662443073192,163.016240956960957,49.7217546026668913],"hsluv":[130.529662443073192,89.7937238944362122,49.7217546026668913]},"#228844":{"lch":[49.9358562328630171,57.5522088774297558,135.149605574971361],"luv":[49.9358562328630171,-40.8016788905052792,40.5891579906186308],"rgb":[0.133333333333333331,0.533333333333333326,0.266666666666666663],"xyz":[0.10506723258733959,0.183650021297297239,0.0846010543404864257],"hpluv":[135.149605574971361,146.247625060139768,49.9358562328630171],"hsluv":[135.149605574971361,90.1269016918236616,49.9358562328630171]},"#228855":{"lch":[50.2200542052193697,50.3265642713731509,142.503880569306347],"luv":[50.2200542052193697,-39.9288227743001443,30.6341669254964764],"rgb":[0.133333333333333331,0.533333333333333326,0.333333333333333315],"xyz":[0.111029646626701589,0.186034986913042072,0.116003101614460341],"hpluv":[142.503880569306347,127.162609675202816,50.2200542052193697],"hsluv":[142.503880569306347,90.5399352865824341,50.2200542052193697]},"#228866":{"lch":[50.5781035519961648,43.3062651916131074,154.006170397495453],"luv":[50.5781035519961648,-38.9254575775356315,18.9800252166796355],"rgb":[0.133333333333333331,0.533333333333333326,0.4],"xyz":[0.11861464240020976,0.189068985222445363,0.155950746021604303],"hpluv":[154.006170397495453,108.649446020320369,50.5781035519961648],"hsluv":[154.006170397495453,91.0179493017372607,50.5781035519961648]},"#228877":{"lch":[51.0125694858746357,38.3061120533697519,170.992189866461246],"luv":[51.0125694858746357,-37.8336830583721451,5.997553408179356],"rgb":[0.133333333333333331,0.533333333333333326,0.466666666666666674],"xyz":[0.12792865542041168,0.192794590430526186,0.205004547928002212],"hpluv":[170.992189866461246,95.2862426106229634,51.0125694858746357],"hsluv":[170.992189866461246,91.5427076584867621,51.0125694858746357]},"#228888":{"lch":[51.5249413470067594,37.5420496271247259,192.177050630061103],"luv":[51.5249413470067594,-36.6973707929670923,-7.91886779085127834],"rgb":[0.133333333333333331,0.533333333333333326,0.533333333333333326],"xyz":[0.139069072522355508,0.197250757271303784,0.263677411331574407],"hpluv":[192.177050630061103,92.4570004995607775,51.5249413470067594],"hsluv":[192.177050630061103,92.0950966753639761,51.5249413470067594]},"#228899":{"lch":[52.1157302062907064,42.0223592343639183,212.203992327233067],"luv":[52.1157302062907064,-35.5574728144251,-22.3951959730954577],"rgb":[0.133333333333333331,0.533333333333333326,0.6],"xyz":[0.152126036631428208,0.202473542914932941,0.332444088972692287],"hpluv":[212.203992327233067,102.317738016510475,52.1157302062907064],"hsluv":[212.203992327233067,92.6571999954113465,52.1157302062907064]},"#2288aa":{"lch":[52.784565077464336,50.6329849579481888,227.127925237574203],"luv":[52.784565077464336,-34.4488478228089221,-37.1076279143892478],"rgb":[0.133333333333333331,0.533333333333333326,0.66666666666666663],"xyz":[0.167183729596680763,0.208496620101034036,0.411747938589690887],"hpluv":[227.127925237574203,121.72111165959474,52.784565077464336],"hsluv":[227.127925237574203,93.213704377986,52.784565077464336]},"#2288bb":{"lch":[53.5302933631107294,61.6316847476891141,237.186375672219185],"luv":[53.5302933631107294,-33.3987075035381409,-51.7975955226846381],"rgb":[0.133333333333333331,0.533333333333333326,0.733333333333333282],"xyz":[0.18432132170401741,0.215351656943968794,0.502005923688332634],"hpluv":[237.186375672219185,146.097822373379188,53.5302933631107294],"hsluv":[237.186375672219185,93.7525919029994,53.5302933631107294]},"#2288cc":{"lch":[54.351086283976727,73.7818378825302261,243.928624140525301],"luv":[54.351086283976727,-32.4264148607849876,-66.274333045306733],"rgb":[0.133333333333333331,0.533333333333333326,0.8],"xyz":[0.203613697147739137,0.223068607121457596,0.60361243435860279],"hpluv":[243.928624140525301,172.258462735913952,54.351086283976727],"hsluv":[243.928624140525301,94.2652369190112864,54.351086283976727]},"#2288dd":{"lch":[55.2445474530087779,86.375042864399532,248.580085361336785],"luv":[55.2445474530087779,-31.544198041281593,-80.4090268549449831],"rgb":[0.133333333333333331,0.533333333333333326,0.866666666666666696],"xyz":[0.22513202269837268,0.23167593734171113,0.716942282258608787],"hpluv":[248.580085361336785,198.39840761978212,55.2445474530087779],"hsluv":[248.580085361336785,94.7460999996689566,55.2445474530087779]},"#2288ee":{"lch":[56.2078215466105604,99.0227420546019772,251.903461744910402],"luv":[56.2078215466105604,-30.7583451142169402,-94.1245326673496265],"rgb":[0.133333333333333331,0.533333333333333326,0.933333333333333348],"xyz":[0.248944202964547445,0.241200809448181175,0.842353098327132],"hpluv":[251.903461744910402,223.551465466634539,56.2078215466105604],"hsluv":[251.903461744910402,95.1922101623356838,56.2078215466105604]},"#2288ff":{"lch":[57.2376997180489866,111.514610807296222,254.356224713070389],"luv":[57.2376997180489866,-30.0705415498761575,-107.383755542446536],"rgb":[0.133333333333333331,0.533333333333333326,1],"xyz":[0.275115251374378811,0.251669228812113843,0.980187286618913856],"hpluv":[254.356224713070389,247.223031548482197,57.2376997180489866],"hsluv":[254.356224713070389,99.9999999999988773,57.2376997180489866]},"#229900":{"lch":[55.1973816023000694,82.8565734474734086,125.883775052172936],"luv":[55.1973816023000694,-48.5657961090338617,67.1310301704979508],"rgb":[0.133333333333333331,0.6,0],"xyz":[0.120504063425016322,0.23121611435631656,0.0382783345200760766],"hpluv":[125.883775052172936,190.479314261094402,55.1973816023000694],"hsluv":[125.883775052172936,100.000000000002331,55.1973816023000694]},"#229911":{"lch":[55.2388931006948951,81.3509781714907376,126.510168490119042],"luv":[55.2388931006948951,-48.4010205856972817,65.3859530459048273],"rgb":[0.133333333333333331,0.6,0.0666666666666666657],"xyz":[0.121515728924653441,0.231620780556171413,0.0436064394848317063],"hpluv":[126.510168490119042,186.877552842351321,55.2388931006948951],"hsluv":[126.510168490119042,97.109403045153627,55.2388931006948951]},"#229922":{"lch":[55.3157166450500739,78.6308396618125869,127.715012949240275],"luv":[55.3157166450500739,-48.1011847922964293,62.2019691609440102],"rgb":[0.133333333333333331,0.6,0.133333333333333331],"xyz":[0.12339108706313047,0.232370923811562241,0.0534833256808109059],"hpluv":[127.715012949240275,180.378053709807,55.3157166450500739],"hsluv":[127.715012949240275,91.8445791693357592,55.3157166450500739]},"#229933":{"lch":[55.4418461137647,74.3518111171957656,129.829614369777261],"luv":[55.4418461137647,-47.6228343175573201,57.0986643273697],"rgb":[0.133333333333333331,0.6,0.2],"xyz":[0.126478837795588217,0.23360602410454534,0.0697454795384220561],"hpluv":[129.829614369777261,170.173995330187722,55.4418461137647],"hsluv":[129.829614369777261,91.9941043082508827,55.4418461137647]},"#229944":{"lch":[55.6231658975890042,68.6117263626113925,133.195472742568398],"luv":[55.6231658975890042,-46.964006542137362,50.0195070344354846],"rgb":[0.133333333333333331,0.6,0.266666666666666663],"xyz":[0.130936833039807077,0.235389222202232934,0.0932242544913087],"hpluv":[133.195472742568398,156.524371813771666,55.6231658975890042],"hsluv":[133.195472742568398,92.2005608183228844,55.6231658975890042]},"#229955":{"lch":[55.8642490130281715,61.7521412094073696,138.342726405552],"luv":[55.8642490130281715,-46.1371272258517706,41.0450049980768625],"rgb":[0.133333333333333331,0.6,0.333333333333333315],"xyz":[0.136899247079169062,0.237774187817977767,0.124626301765282596],"hpluv":[138.342726405552,140.267605312348593,55.8642490130281715],"hsluv":[138.342726405552,92.4605995247666357,55.8642490130281715]},"#229966":{"lch":[56.1686206396836383,54.4254646973719787,146.085824005346524],"luv":[56.1686206396836383,-45.1662924386951516,30.3667126121210664],"rgb":[0.133333333333333331,0.6,0.4],"xyz":[0.144484242852677247,0.240808186127381058,0.164573946172426544],"hpluv":[146.085824005346524,122.955430161041207,56.1686206396836383],"hsluv":[146.085824005346524,92.7673635780271,56.1686206396836383]},"#229977":{"lch":[56.5388973522399,47.7139826201784629,157.505617321427167],"luv":[56.5388973522399,-44.0837619060267798,18.2550287233801534],"rgb":[0.133333333333333331,0.6,0.466666666666666674],"xyz":[0.153798255872879153,0.244533791335461881,0.213627748078824453],"hpluv":[157.505617321427167,107.087223886255089,56.5388973522399],"hsluv":[157.505617321427167,93.1115325865156,56.5388973522399]},"#229988":{"lch":[56.9768757530356,43.2189787336254057,173.325138204180888],"luv":[56.9768757530356,-42.9260293704251126,5.02355703331473169],"rgb":[0.133333333333333331,0.6,0.533333333333333326],"xyz":[0.164938672974823,0.248989958176239479,0.272300611482396648],"hpluv":[173.325138204180888,96.2532040641867,56.9768757530356],"hsluv":[173.325138204180888,93.4824878896153706,56.9768757530356]},"#229999":{"lch":[57.4836007022547477,42.6905833214490045,192.177050630061103],"luv":[57.4836007022547477,-41.7300648492924537,-9.00486490733903366],"rgb":[0.133333333333333331,0.6,0.6],"xyz":[0.177995637083895708,0.254212743819868636,0.341067289123514528],"hpluv":[192.177050630061103,94.2383018299879467,57.4836007022547477],"hsluv":[192.177050630061103,93.8694254698009587,57.4836007022547477]},"#2299aa":{"lch":[58.0594270662980563,46.8633307325653,210.133219640519371],"luv":[58.0594270662980563,-40.5302437993065823,-23.5259666096543114],"rgb":[0.133333333333333331,0.6,0.66666666666666663],"xyz":[0.193053330049148264,0.260235821005969759,0.420371138740513128],"hpluv":[210.133219640519371,102.423528384682896,58.0594270662980563],"hsluv":[210.133219640519371,94.2622655036202701,58.0594270662980563]},"#2299bb":{"lch":[58.704081470592044,54.8976329577059445,224.200669016044458],"luv":[58.704081470592044,-39.3562485070025474,-38.2731734745639],"rgb":[0.133333333333333331,0.6,0.733333333333333282],"xyz":[0.210190922156484883,0.267090857848904517,0.51062912383915493],"hpluv":[224.200669016044458,118.665547847191604,58.704081470592044],"hsluv":[224.200669016044458,94.6522748426748279,58.704081470592044]},"#2299cc":{"lch":[59.4167266489170771,65.3729917945351247,234.209137470411804],"luv":[59.4167266489170771,-38.231976961148348,-53.0277662532618663],"rgb":[0.133333333333333331,0.6,0.8],"xyz":[0.229483297600206637,0.274807808026393319,0.612235634509425086],"hpluv":[234.209137470411804,139.613998456385502,59.4167266489170771],"hsluv":[234.209137470411804,95.032392249276171,59.4167266489170771]},"#2299dd":{"lch":[60.1960287785942114,77.1664383037622201,241.199920521286145],"luv":[60.1960287785942114,-37.1753089722913614,-67.6214137925481],"rgb":[0.133333333333333331,0.6,0.866666666666666696],"xyz":[0.251001623150840181,0.283415138246646825,0.725565482409431084],"hpluv":[241.199920521286145,162.667181112599422,60.1960287785942114],"hsluv":[241.199920521286145,95.397300800485425,60.1960287785942114]},"#2299ee":{"lch":[61.0402269370523243,89.5733454479413211,246.163931095701571],"luv":[61.0402269370523243,-36.1984881015500051,-81.9332269222821],"rgb":[0.133333333333333331,0.6,0.933333333333333348],"xyz":[0.27481380341701489,0.292940010353116842,0.850976298477954307],"hpluv":[246.163931095701571,186.209563381880429,61.0402269370523243],"hsluv":[246.163931095701571,95.74331870201,61.0402269370523243]},"#2299ff":{"lch":[61.9472031658153384,102.178145565387652,249.783903318571561],"luv":[61.9472031658153384,-35.3088685699608078,-95.8835607989752532],"rgb":[0.133333333333333331,0.6,1],"xyz":[0.300984851826846311,0.303408429717049566,0.988810486769736152],"hpluv":[249.783903318571561,209.303089797111312,61.9472031658153384],"hsluv":[249.783903318571561,99.9999999999986,61.9472031658153384]},"#110000":{"lch":[1.07666134976862637,3.62084603829176643,12.1770506300617818],"luv":[1.07666134976862637,3.53937866928378497,0.763756943295526236],"rgb":[0.0666666666666666657,0,0],"xyz":[0.00231161193210362246,0.00119192490249095569,0.000108356809317355026],"hpluv":[12.1770506300617818,426.746789183125145,1.07666134976862637],"hsluv":[12.1770506300617818,100.000000000002203,1.07666134976862637]},"#110011":{"lch":[1.44219482929484544,3.28508596549136378,307.715012949243601],"luv":[1.44219482929484544,2.00959989444743092,-2.59871084672866193],"rgb":[0.0666666666666666657,0,0.0666666666666666657],"xyz":[0.0033232774317407442,0.00159659110234581,0.00543646177407298634],"hpluv":[307.715012949243601,289.042783730483393,1.44219482929484544],"hsluv":[307.715012949243601,99.9999999999988347,1.44219482929484544]},"#110022":{"lch":[2.1197964535087821,6.27745605271938789,280.884754167684719],"luv":[2.1197964535087821,1.18539805862553327,-6.16451830530416167],"rgb":[0.0666666666666666657,0,0.133333333333333331],"xyz":[0.00519863557021776369,0.00234673435773662814,0.0153133479700521824],"hpluv":[280.884754167684719,375.775833064690062,2.1197964535087821],"hsluv":[280.884754167684719,99.9999999999998721,2.1197964535087821]},"#110033":{"lch":[3.23545797359596321,11.0622687483975319,272.972319481398301],"luv":[3.23545797359596321,0.57361730895702967,-11.0473867065762477],"rgb":[0.0666666666666666657,0,0.2],"xyz":[0.00828638630267550247,0.00358183465071974143,0.0315755018276633256],"hpluv":[272.972319481398301,433.858158519435221,3.23545797359596321],"hsluv":[272.972319481398301,100.000000000000355,3.23545797359596321]},"#110044":{"lch":[4.84621421062803659,17.7312810137515946,269.891014646828467],"luv":[4.84621421062803659,-0.0337275934556249754,-17.7312489362161827],"rgb":[0.0666666666666666657,0,0.266666666666666663],"xyz":[0.012744381546894383,0.0053650327484073175,0.0550542767805499642],"hpluv":[269.891014646828467,464.276639746945534,4.84621421062803659],"hsluv":[269.891014646828467,100.000000000000711,4.84621421062803659]},"#110055":{"lch":[7.00054481789469563,26.532890242342738,268.413820694361107],"luv":[7.00054481789469563,-0.734444075336115332,-26.5227233992365541],"rgb":[0.0666666666666666657,0,0.333333333333333315],"xyz":[0.0187067955862563751,0.00774999836415214954,0.0864563240545238726],"hpluv":[268.413820694361107,480.941270902403687,7.00054481789469563],"hsluv":[268.413820694361107,100.000000000000682,7.00054481789469563]},"#110066":{"lch":[9.62818818466394,37.2351477319955,267.604082628906383],"luv":[9.62818818466394,-1.55659527409507947,-37.20259719127408],"rgb":[0.0666666666666666657,0,0.4],"xyz":[0.0262917913597645499,0.010783996673555462,0.126403968461667848],"hpluv":[267.604082628906383,490.735908571457742,9.62818818466394],"hsluv":[267.604082628906383,100.000000000000753,9.62818818466394]},"#110077":{"lch":[12.2928363787590555,48.1341065988899643,267.117295446388],"luv":[12.2928363787590555,-2.42073458662620622,-48.0731969202633138],"rgb":[0.0666666666666666657,0,0.466666666666666674],"xyz":[0.0356058043799664659,0.0145096018816362783,0.175457770368065757],"hpluv":[267.117295446388,496.866985521105335,12.2928363787590555],"hsluv":[267.117295446388,100.000000000000739,12.2928363787590555]},"#110088":{"lch":[14.9348588897968106,58.9551979191609803,266.804247897724281],"luv":[14.9348588897968106,-3.28660375460643372,-58.8635166928348781],"rgb":[0.0666666666666666657,0,0.533333333333333326],"xyz":[0.0467462214819102939,0.0189657687224138727,0.234130633771637925],"hpluv":[266.804247897724281,500.910695182750828,14.9348588897968106],"hsluv":[266.804247897724281,100.000000000000753,14.9348588897968106]},"#110099":{"lch":[17.5475874535139624,69.6538923837914297,266.59230255326986],"luv":[17.5475874535139624,-4.14026096141065292,-69.5307339482636],"rgb":[0.0666666666666666657,0,0.6],"xyz":[0.0598031855909830073,0.0241885543660430302,0.302897311412755832],"hpluv":[266.59230255326986,503.694607743992833,17.5475874535139624],"hsluv":[266.59230255326986,100.000000000000796,17.5475874535139624]},"#1100aa":{"lch":[20.1284543895036734,80.2134478690449,266.442863009455],"luv":[20.1284543895036734,-4.97675334080985809,-80.0589104673847203],"rgb":[0.0666666666666666657,0,0.66666666666666663],"xyz":[0.0748608785562355494,0.0302116315521441317,0.382201161029754433],"hpluv":[266.442863009455,505.680355905096519,20.1284543895036734],"hsluv":[266.442863009455,100.000000000000782,20.1284543895036734]},"#1100bb":{"lch":[22.6769756305364183,90.6302333913987894,266.3339747285724],"luv":[22.6769756305364183,-5.79494806122388795,-90.444777525002138],"rgb":[0.0666666666666666657,0,0.733333333333333282],"xyz":[0.0919984706635722,0.0370666683950788903,0.472459146128396179],"hpluv":[266.3339747285724,507.139328846885462,22.6769756305364183],"hsluv":[266.3339747285724,100.000000000001,22.6769756305364183]},"#1100cc":{"lch":[25.1937235339869332,100.906819147977927,266.252448568601267],"luv":[25.1937235339869332,-6.59531864805210422,-100.691051849175651],"rgb":[0.0666666666666666657,0,0.8],"xyz":[0.111290846107293936,0.0447836185725676919,0.574065656798666279],"hpluv":[266.252448568601267,508.238409831726415,25.1937235339869332],"hsluv":[266.252448568601267,100.000000000000824,25.1937235339869332]},"#1100dd":{"lch":[27.6797893663012289,111.048607057141055,266.189998210144608],"luv":[27.6797893663012289,-7.37896669992084409,-110.803176758488192],"rgb":[0.0666666666666666657,0,0.866666666666666696],"xyz":[0.132809171657927494,0.0533909487928212259,0.687395504698672277],"hpluv":[266.189998210144608,509.084249760461944,27.6797893663012289],"hsluv":[266.189998210144608,100.000000000000938,27.6797893663012289]},"#1100ee":{"lch":[30.1364964584496846,121.062148077250455,266.141219022825339],"luv":[30.1364964584496846,-8.14718371295858823,-120.787694301304626],"rgb":[0.0666666666666666657,0,0.933333333333333348],"xyz":[0.156621351924102231,0.0629158208992912638,0.8128063207671955],"hpluv":[266.141219022825339,509.74730741907581,30.1364964584496846],"hsluv":[266.141219022825339,100.000000000000952,30.1364964584496846]},"#1100ff":{"lch":[32.5652456752648263,130.954293728553409,266.102472093749839],"luv":[32.5652456752648263,-8.90125725083502495,-130.651424275813781],"rgb":[0.0666666666666666657,0,1],"xyz":[0.182792400333933625,0.0733842402632239599,0.950640509058977345],"hpluv":[266.102472093749839,510.275492181060656,32.5652456752648263],"hsluv":[266.102472093749839,100.000000000001108,32.5652456752648263]},"#111100":{"lch":[4.69779601336656771,5.17885327658484673,85.8743202181747307],"luv":[4.69779601336656771,0.372589941443898953,5.16543299210515716],"rgb":[0.0666666666666666657,0.0666666666666666657,0],"xyz":[0.00431601219303203148,0.00520072542434782924,0.000776490229626805866],"hpluv":[85.8743202181747307,139.887458074797621,4.69779601336656771],"hsluv":[85.8743202181747307,100.000000000002359,4.69779601336656771]},"#111111":{"lch":[5.06332949289278655,2.68159353999537178e-13,0],"luv":[5.06332949289278655,2.52120910544652531e-13,9.13481559944393266e-14],"rgb":[0.0666666666666666657,0.0666666666666666657,0.0666666666666666657],"xyz":[0.00532767769266915322,0.00560539162420268383,0.00610459519438243722],"hpluv":[0,6.72041492281092e-12,5.06332949289278655],"hsluv":[0,1.92419399944792277e-12,5.06332949289278655]},"#111122":{"lch":[5.74093111710672321,6.60006851394265048,265.874320218179719],"luv":[5.74093111710672321,-0.474838542395297381,-6.58296534605743222],"rgb":[0.0666666666666666657,0.0666666666666666657,0.133333333333333331],"xyz":[0.00720303583114617271,0.00635553487959350169,0.0159814813903616341],"hpluv":[265.874320218179719,145.883251481840432,5.74093111710672321],"hsluv":[265.874320218179719,28.41442223352254,5.74093111710672321]},"#111133":{"lch":[6.85659263719390388,14.212336546779186,265.874320218178582],"luv":[6.85659263719390388,-1.02249925976518052,-14.1755072354640976],"rgb":[0.0666666666666666657,0.0666666666666666657,0.2],"xyz":[0.0102907865636039132,0.00759063517257661455,0.0322436352479727809],"hpluv":[265.874320218178582,263.024656142887807,6.85659263719390388],"hsluv":[265.874320218178582,51.2306489028398957,6.85659263719390388]},"#111144":{"lch":[8.45853257854777141,22.7927945223118087,265.874320218178241],"luv":[8.45853257854777141,-1.63981590573345759,-22.7337301367732181],"rgb":[0.0666666666666666657,0.0666666666666666657,0.266666666666666663],"xyz":[0.0147487818078227903,0.00937383327026419105,0.0557224102008594194],"hpluv":[265.874320218178241,341.933676209697239,8.45853257854777141],"hsluv":[265.874320218178241,66.600159737267461,8.45853257854777141]},"#111155":{"lch":[10.3782295585045325,32.1242805487719707,265.874320218178127],"luv":[10.3782295585045325,-2.31116487943396587,-32.0410349033279545],"rgb":[0.0666666666666666657,0.0666666666666666657,0.333333333333333315],"xyz":[0.0207111958471847858,0.011758798886009024,0.0871244574748333278],"hpluv":[265.874320218178127,392.780088665713265,10.3782295585045325],"hsluv":[265.874320218178127,76.5037738801481453,10.3782295585045325]},"#111166":{"lch":[12.4757228248048477,41.8651930040424887,265.87432021817807],"luv":[12.4757228248048477,-3.01196982745712916,-41.7567051265328644],"rgb":[0.0666666666666666657,0.0666666666666666657,0.4],"xyz":[0.0282961916206929606,0.0147927971954123355,0.12707210188197729],"hpluv":[265.87432021817807,425.820638501567,12.4757228248048477],"hsluv":[265.87432021817807,82.9392496755345263,12.4757228248048477]},"#111177":{"lch":[14.6896895275036599,51.8467212520223697,265.874320218178],"luv":[14.6896895275036599,-3.73008575521422614,-51.7123676197837199],"rgb":[0.0666666666666666657,0.0666666666666666657,0.466666666666666674],"xyz":[0.0376102046408948731,0.0185184024034931519,0.176125903788375199],"hpluv":[265.874320218178,447.865910041391658,14.6896895275036599],"hsluv":[265.874320218178,87.2331192419333235,14.6896895275036599]},"#111188":{"lch":[16.9766940539391484,61.9476661879793511,265.874320218178],"luv":[16.9766940539391484,-4.45679305530888747,-61.7871373491236469],"rgb":[0.0666666666666666657,0.0666666666666666657,0.533333333333333326],"xyz":[0.0487506217428387,0.0229745692442707428,0.234798767191947366],"hpluv":[265.874320218178,463.03215765547759,16.9766940539391484],"hsluv":[265.874320218178,90.1871263608273495,16.9766940539391484]},"#111199":{"lch":[19.3069968916820471,72.0861980616198537,265.874320218178],"luv":[19.3069968916820471,-5.18620452834737478,-71.8993966147786],"rgb":[0.0666666666666666657,0.0666666666666666657,0.6],"xyz":[0.0618075858519114146,0.0281973548878999072,0.303565444833065246],"hpluv":[265.874320218178,473.779996738615694,19.3069968916820471],"hsluv":[265.874320218178,92.280537596895428,19.3069968916820471]},"#1111aa":{"lch":[21.6605350192491244,82.2093341223612839,265.874320218177957],"luv":[21.6605350192491244,-5.91450835752722703,-81.9962999636616274],"rgb":[0.0666666666666666657,0.0666666666666666657,0.66666666666666663],"xyz":[0.0768652788171639567,0.0342204320740010087,0.382869294450063846],"hpluv":[265.874320218177957,481.605322004481,21.6605350192491244],"hsluv":[265.874320218177957,93.8047159652847569,21.6605350192491244]},"#1111bb":{"lch":[24.0238472654082429,92.2838634174554215,265.874320218177957],"luv":[24.0238472654082429,-6.63931519789526092,-92.0447225046312241],"rgb":[0.0666666666666666657,0.0666666666666666657,0.733333333333333282],"xyz":[0.0940028709245006,0.0410754689169357673,0.473127279548705593],"hpluv":[265.874320218177957,487.441538809997496,24.0238472654082429],"hsluv":[265.874320218177957,94.9414655706975736,24.0238472654082429]},"#1111cc":{"lch":[26.3879200105999,102.289669569688542,265.874320218177957],"luv":[26.3879200105999,-7.35917778701558589,-102.024599989292597],"rgb":[0.0666666666666666657,0.0666666666666666657,0.8],"xyz":[0.113295246368222344,0.0487924190944245689,0.574733790218975749],"hpluv":[265.874320218177957,491.887677819884516,26.3879200105999],"hsluv":[265.874320218177957,95.8074626598259727,26.3879200105999]},"#1111dd":{"lch":[28.7467318202544035,112.215160110792439,265.874320218177957],"luv":[28.7467318202544035,-8.07326211070735766,-111.924369989661315],"rgb":[0.0666666666666666657,0.0666666666666666657,0.866666666666666696],"xyz":[0.134813571918855901,0.0573997493146781,0.688063638118981746],"hpluv":[265.874320218177957,495.338839734480189,28.7467318202544035],"hsluv":[265.874320218177957,96.479663003878315,28.7467318202544035]},"#1111ee":{"lch":[31.096282761883856,122.054240127147821,265.874320218177957],"luv":[31.096282761883856,-8.78112967353786367,-121.737953386246701],"rgb":[0.0666666666666666657,0.0666666666666666657,0.933333333333333348],"xyz":[0.158625752185030638,0.0669246214211481338,0.813474454187505],"hpluv":[265.874320218177957,498.062358817216193,31.096282761883856],"hsluv":[265.874320218177957,97.0101366558694451,31.096282761883856]},"#1111ff":{"lch":[33.4339475813396589,131.804336466263976,265.874320218177957],"luv":[33.4339475813396589,-9.48259535137154863,-131.462783694528071],"rgb":[0.0666666666666666657,0.0666666666666666657,1],"xyz":[0.184796800594862032,0.07739304078508083,0.951308642479286815],"hpluv":[265.874320218177957,500.243401112503761,33.4339475813396589],"hsluv":[265.874320218177957,99.9999999999995168,33.4339475813396589]},"#66aa00":{"lch":[62.9888010115071921,81.5107592316300185,114.758667910078074],"luv":[62.9888010115071921,-34.136471206054587,74.0182761493062884],"rgb":[0.4,0.66666666666666663,0],"xyz":[0.198534632170994735,0.315734905503604946,0.0504821063864305253],"hpluv":[114.758667910078074,164.206718875588678,62.9888010115071921],"hsluv":[114.758667910078074,100.000000000002245,62.9888010115071921]},"#66aa11":{"lch":[63.0225323172591345,80.1801511939703744,115.156040801232848],"luv":[63.0225323172591345,-34.0833758310267285,72.5753411114886262],"rgb":[0.4,0.66666666666666663,0.0666666666666666657],"xyz":[0.199546297670631867,0.316139571703459799,0.055810211351186155],"hpluv":[115.156040801232848,161.439702186697787,63.0225323172591345],"hsluv":[115.156040801232848,97.8915472494395,63.0225323172591345]},"#66aa22":{"lch":[63.0849851082382287,77.7526522520100372,115.919582231606014],"luv":[63.0849851082382287,-33.9864002990590066,69.9313915701248],"rgb":[0.4,0.66666666666666663,0.133333333333333331],"xyz":[0.201421655809108868,0.316889714958850599,0.0656870975471653545],"hpluv":[115.919582231606014,156.397041701241,63.0849851082382287],"hsluv":[115.919582231606014,94.0329763727763748,63.0849851082382287]},"#66aa33":{"lch":[63.1875983682703577,73.8659889058236416,117.258215410479664],"luv":[63.1875983682703577,-33.8307250746429062,65.6632801340230827],"rgb":[0.4,0.66666666666666663,0.2],"xyz":[0.20450940654156663,0.318124815251833726,0.0819492514047764908],"hpluv":[117.258215410479664,148.337854737344315,63.1875983682703577],"hsluv":[117.258215410479664,87.8175568215645228,63.1875983682703577]},"#66aa44":{"lch":[63.3352806074861121,68.495891054581449,119.389904478135335],"luv":[63.3352806074861121,-33.6143748396710436,59.6804900742209057],"rgb":[0.4,0.66666666666666663,0.266666666666666663],"xyz":[0.208967401785785489,0.319908013349521292,0.105428026357663129],"hpluv":[119.389904478135335,137.232870385557277,63.3352806074861121],"hsluv":[119.389904478135335,79.1339200396795093,63.3352806074861121]},"#66aa55":{"lch":[63.5319451116367162,61.7628687774086131,122.670093374403834],"luv":[63.5319451116367162,-33.3396585938880747,51.9915293529473],"rgb":[0.4,0.66666666666666663,0.333333333333333315],"xyz":[0.214929815825147474,0.322292978965266153,0.136830073631637045],"hpluv":[122.670093374403834,123.360077774302084,63.5319451116367162],"hsluv":[122.670093374403834,68.0252461175988401,63.5319451116367162]},"#66aa66":{"lch":[63.7807317293932101,53.9656100581627314,127.715012949238869],"luv":[63.7807317293932101,-33.0126168434810836,42.6902119706049703],"rgb":[0.4,0.66666666666666663,0.4],"xyz":[0.22251481159865566,0.325326977274669471,0.176777718038781],"hpluv":[127.715012949238869,107.366036241042551,63.7807317293932101],"hsluv":[127.715012949238869,54.6684489206366493,63.7807317293932101]},"#66aa77":{"lch":[64.0841229578331308,45.668717811445795,135.623736827110406],"luv":[64.0841229578331308,-32.6422859505805931,31.9392071670853355],"rgb":[0.4,0.66666666666666663,0.466666666666666674],"xyz":[0.231828824618857565,0.329052582482750267,0.225831519945178916],"hpluv":[135.623736827110406,90.428994130424627,64.0841229578331308],"hsluv":[135.623736827110406,56.3153951517164302,64.0841229578331308]},"#66aa88":{"lch":[64.4440140424290888,37.9133385548872752,148.25026899586868],"luv":[64.4440140424290888,-32.239785461804118,19.9503752785341248],"rgb":[0.4,0.66666666666666663,0.533333333333333326],"xyz":[0.242969241720801421,0.333508749323527864,0.284504383348751055],"hpluv":[148.25026899586868,74.65325904191441,64.4440140424290888],"hsluv":[148.25026899586868,58.1346686170252127,64.4440140424290888]},"#66aa99":{"lch":[64.861761772217136,32.5704605989434484,167.654678216446086],"luv":[64.861761772217136,-31.8173259789585323,6.96366793981576304],"rgb":[0.4,0.66666666666666663,0.6],"xyz":[0.256026205829874121,0.338731534967157,0.353271060989869],"hpluv":[167.654678216446086,63.7198120272805681,64.861761772217136],"hsluv":[167.654678216446086,60.083023100845935,64.861761772217136]},"#66aaaa":{"lch":[65.3382237636027,32.1097126044189949,192.177050630060876],"luv":[65.3382237636027,-31.387258852500235,-6.77300710648746396],"rgb":[0.4,0.66666666666666663,0.66666666666666663],"xyz":[0.271083898795126677,0.344754612153258144,0.432574910606867591],"hpluv":[192.177050630060876,62.3603323483304592,65.3382237636027],"hsluv":[192.177050630060876,62.1162357127798757,65.3382237636027]},"#66aabb":{"lch":[65.8737942906507641,37.4229485671739255,214.174175962111633],"luv":[65.8737942906507641,-30.9612713447490577,-21.020864781881972],"rgb":[0.4,0.66666666666666663,0.733333333333333282],"xyz":[0.288221490902463295,0.351609648996192903,0.522832895705509282],"hpluv":[214.174175962111633,72.0882777495769744,65.8737942906507641],"hsluv":[214.174175962111633,64.192083786910942,65.8737942906507641]},"#66aacc":{"lch":[66.4684397846860833,46.8829891397435361,229.336310284400895],"luv":[66.4684397846860833,-30.5497910563422188,-35.5629714322516],"rgb":[0.4,0.66666666666666663,0.8],"xyz":[0.30751386634618505,0.359326599173681704,0.624439406375779438],"hpluv":[229.336310284400895,89.5033179536005,66.4684397846860833],"hsluv":[229.336310284400895,66.2725553364081748,66.4684397846860833]},"#66aadd":{"lch":[67.1217354618507471,58.5746749070863473,239.007496148652194],"luv":[67.1217354618507471,-30.1616186688116876,-50.2122425285710676],"rgb":[0.4,0.66666666666666663,0.866666666666666696],"xyz":[0.329032191896818593,0.367933929393935211,0.737769254275785435],"hpluv":[239.007496148652194,110.735287258409116,67.1217354618507471],"hsluv":[239.007496148652194,68.3252248927570349,67.1217354618507471]},"#66aaee":{"lch":[67.8329035309127,71.3390505041132,245.305718817638592],"luv":[67.8329035309127,-29.803771094245274,-64.8150858627082584],"rgb":[0.4,0.66666666666666663,0.933333333333333348],"xyz":[0.352844372162993358,0.377458801500405228,0.863180070344308659],"hpluv":[245.305718817638592,133.452355648257935,67.8329035309127],"hsluv":[245.305718817638592,80.362890995181445,67.8329035309127]},"#66aaff":{"lch":[68.6008528128324144,84.5574659264264312,249.594848961048797],"luv":[68.6008528128324144,-29.4814940521041038,-79.2515397475312],"rgb":[0.4,0.66666666666666663,1],"xyz":[0.379015420572824724,0.387927220864337952,1.00101425863609061],"hpluv":[249.594848961048797,156.409011428865199,68.6008528128324144],"hsluv":[249.594848961048797,99.9999999999981,68.6008528128324144]},"#112200":{"lch":[11.0156269675282488,14.1286449823385087,113.920199516574741],"luv":[11.0156269675282488,-5.72865521459208082,12.9151507335100835],"rgb":[0.0666666666666666657,0.133333333333333331,0],"xyz":[0.00803163592779996757,0.0126319728938838038,0.00201503147454941628],"hpluv":[113.920199516574741,162.753605553330914,11.0156269675282488],"hsluv":[113.920199516574741,100.000000000002302,11.0156269675282488]},"#112211":{"lch":[11.3010826742418828,9.17677244733547,127.715012949238741],"luv":[11.3010826742418828,-5.61374683501564142,7.25940762201209555],"rgb":[0.0666666666666666657,0.133333333333333331,0.0666666666666666657],"xyz":[0.00904330142743709,0.0130366390937386584,0.00734313643930504731],"hpluv":[127.715012949238741,103.040803658029205,11.3010826742418828],"hsluv":[127.715012949238741,52.4661346244892783,11.3010826742418828]},"#112222":{"lch":[11.8149934741043623,5.60956124878379736,192.177050630060876],"luv":[11.8149934741043623,-5.48334870304322308,-1.18324317225625331],"rgb":[0.0666666666666666657,0.133333333333333331,0.133333333333333331],"xyz":[0.0109186595659141079,0.0137867823491294762,0.0172200226352842434],"hpluv":[192.177050630060876,60.2469040904941551,11.8149934741043623],"hsluv":[192.177050630060876,60.0110800331641911,11.8149934741043623]},"#112233":{"lch":[12.6219648570067733,12.7575995118883281,244.93155638428982],"luv":[12.6219648570067733,-5.40540262923445,-11.5558629154900672],"rgb":[0.0666666666666666657,0.133333333333333331,0.2],"xyz":[0.0140064102983718484,0.0150218826421125891,0.0334821764928953866],"hpluv":[244.93155638428982,128.257072990564865,12.6219648570067733],"hsluv":[244.93155638428982,68.2965554989448265,12.6219648570067733]},"#112244":{"lch":[13.7124312845167182,23.0561698733830092,256.354402060867073],"luv":[13.7124312845167182,-5.43930918870511082,-22.4053762472305387],"rgb":[0.0666666666666666657,0.133333333333333331,0.266666666666666663],"xyz":[0.0184644055425907255,0.0168050807398001656,0.0569609514457820251],"hpluv":[256.354402060867073,213.359519949101497,13.7124312845167182],"hsluv":[256.354402060867073,75.5965994738604508,13.7124312845167182]},"#112255":{"lch":[15.056320299603339,33.5848303856462849,260.40485184836416],"luv":[15.056320299603339,-5.59809589119781581,-33.114983835502386],"rgb":[0.0666666666666666657,0.133333333333333331,0.333333333333333315],"xyz":[0.024426819581952721,0.019190046355545,0.0883629987197559336],"hpluv":[260.40485184836416,283.050313811336878,15.056320299603339],"hsluv":[260.40485184836416,81.3424686793067,15.056320299603339]},"#112266":{"lch":[16.6136212231118279,43.9645077489691118,262.329755848243337],"luv":[16.6136212231118279,-5.86800935048734384,-43.5711419160865958],"rgb":[0.0666666666666666657,0.133333333333333331,0.4],"xyz":[0.0320118153554608958,0.02222404466494831,0.128310643126899909],"hpluv":[262.329755848243337,335.797328537363626,16.6136212231118279],"hsluv":[262.329755848243337,85.6428490187558396,16.6136212231118279]},"#112277":{"lch":[18.3427569840269769,54.1821774694947678,263.400149453671133],"luv":[18.3427569840269769,-6.22740469049246936,-53.8231157232341815],"rgb":[0.0666666666666666657,0.133333333333333331,0.466666666666666674],"xyz":[0.0413258283756628153,0.0259496498730291264,0.177364445033297818],"hpluv":[263.400149453671133,374.827260372181627,18.3427569840269769],"hsluv":[263.400149453671133,88.8099744527525559,18.3427569840269769]},"#112288":{"lch":[20.2056943122802366,64.2803592359499,264.056887374403459],"luv":[20.2056943122802366,-6.65565132438349316,-63.9348644242795103],"rgb":[0.0666666666666666657,0.133333333333333331,0.533333333333333326],"xyz":[0.0524662454776066434,0.0304058167138067173,0.236037308436869986],"hpluv":[264.056887374403459,403.686144257890874,20.2056943122802366],"hsluv":[264.056887374403459,91.1461001738222762,20.2056943122802366]},"#112299":{"lch":[22.17018380613613,74.2918952905243799,264.488199331991609],"luv":[22.17018380613613,-7.13579321215933149,-73.9484020185124677],"rgb":[0.0666666666666666657,0.133333333333333331,0.6],"xyz":[0.0655232095866793568,0.0356286023574358818,0.304803986077987865],"hpluv":[264.488199331991609,425.217833826531262,22.17018380613613],"hsluv":[264.488199331991609,92.8866294242426136,22.17018380613613]},"#1122aa":{"lch":[24.2101316823922517,84.2333021684004848,264.786067280823943],"luv":[24.2101316823922517,-7.6546801533155886,-83.8847725510625537],"rgb":[0.0666666666666666657,0.133333333333333331,0.66666666666666663],"xyz":[0.0805809025519319,0.0416516795435369833,0.384107835694986466],"hpluv":[264.786067280823943,441.495215422381477,24.2101316823922517],"hsluv":[264.786067280823943,94.2012423737010209,24.2101316823922517]},"#1122bb":{"lch":[26.3050242232650149,94.1101405136049891,264.999933480500431],"luv":[26.3050242232650149,-8.20234804116949334,-93.7520134935884926],"rgb":[0.0666666666666666657,0.133333333333333331,0.733333333333333282],"xyz":[0.0977184946592685455,0.0485067163864717418,0.474365820793628212],"hpluv":[264.999933480500431,453.98033637772636,26.3050242232650149],"hsluv":[264.999933480500431,95.2089691602506605,26.3050242232650149]},"#1122cc":{"lch":[28.4390102065576187,103.92243186966887,265.158337172634162],"luv":[28.4390102065576187,-8.77130520241401612,-103.551610565708117],"rgb":[0.0666666666666666657,0.133333333333333331,0.8],"xyz":[0.117010870102990286,0.0562236665639605435,0.575972331463898368],"hpluv":[265.158337172634162,463.69685512523705,28.4390102065576187],"hsluv":[265.158337172634162,95.9928942328389496,28.4390102065576187]},"#1122dd":{"lch":[30.599961250020371,113.668086087716972,265.278693166229971],"luv":[30.599961250020371,-9.35592092097037664,-113.282392888591403],"rgb":[0.0666666666666666657,0.133333333333333331,0.866666666666666696],"xyz":[0.138529195653623816,0.0648309967842140705,0.689302179363904366],"hpluv":[265.278693166229971,471.364637015548908,30.599961250020371],"hsluv":[265.278693166229971,96.6113336559982,30.599961250020371]},"#1122ee":{"lch":[32.7786459144851463,123.344693870669801,265.37211393361406],"luv":[32.7786459144851463,-9.95194954038693247,-122.942556531067964],"rgb":[0.0666666666666666657,0.133333333333333331,0.933333333333333348],"xyz":[0.162341375919798553,0.0743558688906841,0.814712995432427589],"hpluv":[265.37211393361406,477.494956838131543,32.7786459144851463],"hsluv":[265.37211393361406,97.1056530386567118,32.7786459144851463]},"#1122ff":{"lch":[34.9680553815075,132.950321242967135,265.445956583698],"luv":[34.9680553815075,-10.5561742154436597,-132.530581770930752],"rgb":[0.0666666666666666657,0.133333333333333331,1],"xyz":[0.188512424329629946,0.0848242882546168114,0.952547183724209434],"hpluv":[265.445956583698,482.455471693424897,34.9680553815075],"hsluv":[265.445956583698,99.9999999999995595,34.9680553815075]},"#66bb00":{"lch":[68.2883247343563,91.0397787832552297,117.384795663234385],"luv":[68.2883247343563,-41.875036539852637,80.8376313092488914],"rgb":[0.4,0.733333333333333282,0],"xyz":[0.232489130079593515,0.383643901320803504,0.0618002723559631373],"hpluv":[117.384795663234385,169.170277477244,68.2883247343563],"hsluv":[117.384795663234385,100.000000000002402,68.2883247343563]},"#66bb11":{"lch":[68.3179499939719079,89.8644626985519466,117.727722441428654],"luv":[68.3179499939719079,-41.8112733484955896,79.5452014710932644],"rgb":[0.4,0.733333333333333282,0.0666666666666666657],"xyz":[0.233500795579230647,0.384048567520658357,0.0671283773207187739],"hpluv":[117.727722441428654,166.91389144855998,68.3179499939719079],"hsluv":[117.727722441428654,98.2613130840239108,68.3179499939719079]},"#66bb22":{"lch":[68.3728123300379309,87.7153655991844374,118.381366327960222],"luv":[68.3728123300379309,-41.6944557120635579,77.1722600749346839],"rgb":[0.4,0.733333333333333282,0.133333333333333331],"xyz":[0.235376153717707648,0.384798710776049158,0.0770052635166979665],"hpluv":[118.381366327960222,162.791438416492724,68.3728123300379309],"hsluv":[118.381366327960222,95.072259168186676,68.3728123300379309]},"#66bb33":{"lch":[68.4629872592027766,84.2604886941914515,119.511012469656151],"luv":[68.4629872592027766,-41.5059446288263274,73.3286200296498691],"rgb":[0.4,0.733333333333333282,0.2],"xyz":[0.238463904450165409,0.386033811069032284,0.0932674173743091],"hpluv":[119.511012469656151,156.173540237969377,68.4629872592027766],"hsluv":[119.511012469656151,89.9157079277594846,68.4629872592027766]},"#66bb44":{"lch":[68.5928402387875451,79.4555052917154683,121.268984442668796],"luv":[68.5928402387875451,-41.2418962487648457,67.9137932600435761],"rgb":[0.4,0.733333333333333282,0.266666666666666663],"xyz":[0.242921899694384269,0.38781700916671985,0.116746192327195741],"hpluv":[121.268984442668796,146.988898097842537,68.5928402387875451],"hsluv":[121.268984442668796,82.6706505658268,68.5928402387875451]},"#66bb55":{"lch":[68.7658933773114711,73.3682686647690474,123.883282583110088],"luv":[68.7658933773114711,-40.9030232283392365,60.9085013577552417],"rgb":[0.4,0.733333333333333282,0.333333333333333315],"xyz":[0.248884313733746254,0.390201974782464711,0.148148239601169657],"hpluv":[123.883282583110088,135.386233996967292,68.7658933773114711],"hsluv":[123.883282583110088,73.3323147762666565,68.7658933773114711]},"#66bb66":{"lch":[68.985024233854773,66.1955602149500493,127.715012949239338],"luv":[68.985024233854773,-40.4940973290304953,52.3648763359380354],"rgb":[0.4,0.733333333333333282,0.4],"xyz":[0.256469309507254439,0.39323597309186803,0.188095884008313619],"hpluv":[127.715012949239338,121.76244699215377,68.985024233854773],"hsluv":[127.715012949239338,61.9987879490855889,68.985024233854773]},"#66bb77":{"lch":[69.2525700917713,58.3030977404443149,133.351332140289912],"luv":[69.2525700917713,-40.0233333378199134,42.395565742911792],"rgb":[0.4,0.733333333333333282,0.466666666666666674],"xyz":[0.265783322527456345,0.396961578299948825,0.237149685914711528],"hpluv":[133.351332140289912,106.830450835327468,69.2525700917713],"hsluv":[133.351332140289912,63.1630001095548,69.2525700917713]},"#66bb88":{"lch":[69.5703900447947632,50.3125315521488901,141.732198444264128],"luv":[69.5703900447947632,-39.5016033478381487,31.1604583428427624],"rgb":[0.4,0.733333333333333282,0.533333333333333326],"xyz":[0.276923739629400201,0.401417745140726423,0.295822549318283667],"hpluv":[141.732198444264128,91.7679559652102625,69.5703900447947632],"hsluv":[141.732198444264128,64.4651291783298888,69.5703900447947632]},"#66bb99":{"lch":[69.9399065468101924,43.264635747530761,154.168279853010262],"luv":[69.9399065468101924,-38.9415329854338594,18.8516767188195544],"rgb":[0.4,0.733333333333333282,0.6],"xyz":[0.2899807037384729,0.406640530784355581,0.364589226959401602],"hpluv":[154.168279853010262,78.4959645714096865,69.9399065468101924],"hsluv":[154.168279853010262,65.8787579381207848,69.9399065468101924]},"#66bbaa":{"lch":[70.3621368583926881,38.7745898249838348,171.579209782291855],"luv":[70.3621368583926881,-38.3565710720190296,5.67822786553099768],"rgb":[0.4,0.733333333333333282,0.66666666666666663],"xyz":[0.305038396703725456,0.412663607970456703,0.443893076576400203],"hpluv":[171.579209782291855,69.9274221790226278,70.3621368583926881],"hsluv":[171.579209782291855,67.37547943529961,70.3621368583926881]},"#66bbbb":{"lch":[70.8377198879813221,38.6292683935386592,192.177050630060933],"luv":[70.8377198879813221,-37.7601276376370194,-8.14819841495072161],"rgb":[0.4,0.733333333333333282,0.733333333333333282],"xyz":[0.322175988811062075,0.419518644813391461,0.534151061675042],"hpluv":[192.177050630060933,69.1976324805594629,70.8377198879813221],"hsluv":[192.177050630060933,68.9267726464228758,70.8377198879813221]},"#66bbcc":{"lch":[71.3669414392261103,43.4063518114314,211.106579982723787],"luv":[71.3669414392261103,-37.1648552128157,-22.4250956427882215],"rgb":[0.4,0.733333333333333282,0.8],"xyz":[0.341468364254783829,0.427235594990880263,0.635757572345312161],"hpluv":[211.106579982723787,77.1783568223693806,71.3669414392261103],"hsluv":[211.106579982723787,70.5055674968506736,71.3669414392261103]},"#66bbdd":{"lch":[71.9497594848613602,52.0084901368895629,225.300588521911806],"luv":[71.9497594848613602,-36.5821167433876298,-36.9679831866995059],"rgb":[0.4,0.733333333333333282,0.866666666666666696],"xyz":[0.362986689805417373,0.435842925211133769,0.749087420245318159],"hpluv":[225.300588521911806,91.724261948179759,71.9497594848613602],"hsluv":[225.300588521911806,72.0874065633031336,71.9497594848613602]},"#66bbee":{"lch":[72.5858302461357852,62.9426478584387183,235.089705553804919],"luv":[72.5858302461357852,-36.0216507769597953,-51.6160594653851135],"rgb":[0.4,0.733333333333333282,0.933333333333333348],"xyz":[0.386798870071592082,0.445367797317603786,0.874498236313841382],"hpluv":[235.089705553804919,110.035415213757233,72.5858302461357852],"hsluv":[235.089705553804919,76.908955535231712,72.5858302461357852]},"#66bbff":{"lch":[73.2745353232689638,75.1445669264803513,241.815748730615525],"luv":[73.2745353232689638,-35.4914181095182641,-66.2349241650025817],"rgb":[0.4,0.733333333333333282,1],"xyz":[0.412969918481423504,0.45583621668153651,1.01233242460562312],"hpluv":[241.815748730615525,130.131920555189879,73.2745353232689638],"hsluv":[241.815748730615525,99.9999999999976552,73.2745353232689638]},"#113300":{"lch":[17.8585390793191152,25.0449080182821966,121.332554648991049],"luv":[17.8585390793191152,-13.0234653569097247,21.3924465113644295],"rgb":[0.0666666666666666657,0.2,0],"xyz":[0.0141493580168107792,0.0248674170719056023,0.00405427217088629669],"hpluv":[121.332554648991049,177.956083469309505,17.8585390793191152],"hsluv":[121.332554648991049,100.000000000002288,17.8585390793191152]},"#113311":{"lch":[18.041211184449395,20.8015074137336562,127.715012949239792],"luv":[18.041211184449395,-12.7249964056056086,16.4553084796651738],"rgb":[0.0666666666666666657,0.2,0.0666666666666666657],"xyz":[0.015161023516447901,0.0252720832717604552,0.00938237713564192902],"hpluv":[127.715012949239792,146.308124837666583,18.041211184449395],"hsluv":[127.715012949239792,74.4969128915689254,18.041211184449395]},"#113322":{"lch":[18.3747440863758129,14.8635488733567129,145.575764327225926],"luv":[18.3747440863758129,-12.2605616690393529,8.40260154180516672],"rgb":[0.0666666666666666657,0.2,0.133333333333333331],"xyz":[0.0170363816549249196,0.0260222265271512765,0.0192592633316211251],"hpluv":[145.575764327225926,102.645648490479701,18.3747440863758129],"hsluv":[145.575764327225926,76.8412554017051,18.3747440863758129]},"#113333":{"lch":[18.910205854271,11.9516732098830207,192.177050630061075],"luv":[18.910205854271,-11.6827660646039035,-2.5210056714682163],"rgb":[0.0666666666666666657,0.2,0.2],"xyz":[0.0201241323873826601,0.0272573268201343893,0.0355214171892322683],"hpluv":[192.177050630061075,80.19952200231,18.910205854271],"hsluv":[192.177050630061075,79.885597544945341,18.910205854271]},"#113344":{"lch":[19.6554681695294136,18.5554908550806559,233.185939638237187],"luv":[19.6554681695294136,-11.1188227079461566,-14.8552355236207116],"rgb":[0.0666666666666666657,0.2,0.266666666666666663],"xyz":[0.0245821276316015372,0.0290405249178219624,0.0590001921421189068],"hpluv":[233.185939638237187,119.79215597403514,19.6554681695294136],"hsluv":[233.185939638237187,83.0941728600946163,19.6554681695294136]},"#113355":{"lch":[20.6059777210847557,29.4541985213363553,248.778672986371305],"luv":[20.6059777210847557,-10.6615827984222822,-27.4568837045772334],"rgb":[0.0666666666666666657,0.2,0.333333333333333315],"xyz":[0.0305445416709635327,0.0314254905335667953,0.0904022394160928222],"hpluv":[248.778672986371305,181.381634101163,20.6059777210847557],"hsluv":[248.778672986371305,86.0667890851332089,20.6059777210847557]},"#113366":{"lch":[21.7480278014825927,41.0513772817531262,255.392805777322508],"luv":[21.7480278014825927,-10.3527823296753354,-39.7244946445288178],"rgb":[0.0666666666666666657,0.2,0.4],"xyz":[0.0381295374444717075,0.0344594888429701068,0.130349883823236784],"hpluv":[255.392805777322508,239.522976201191227,21.7480278014825927],"hsluv":[255.392805777322508,88.6137215649990537,21.7480278014825927]},"#113377":{"lch":[23.0621320749224097,52.4639032010768602,258.793139915612699],"luv":[23.0621320749224097,-10.1964540550792755,-51.4635158514711293],"rgb":[0.0666666666666666657,0.2,0.466666666666666674],"xyz":[0.04744355046467362,0.0381850940510509232,0.179403685729634693],"hpluv":[258.793139915612699,288.669213908808,23.0621320749224097],"hsluv":[258.793139915612699,90.7010140503724926,23.0621320749224097]},"#113388":{"lch":[24.5260866455155693,63.5079254673071389,260.778240759541745],"luv":[24.5260866455155693,-10.1775299952298717,-62.6871157444433322],"rgb":[0.0666666666666666657,0.2,0.533333333333333326],"xyz":[0.0585839675666174481,0.0426412608918285141,0.238076549133206861],"hpluv":[260.778240759541745,328.5783880762134,24.5260866455155693],"hsluv":[260.778240759541745,92.3732755032704,24.5260866455155693]},"#113399":{"lch":[26.1173586094444445,74.1961224571638667,262.040130643645512],"luv":[26.1173586094444445,-10.2746398160742789,-73.4812653968914447],"rgb":[0.0666666666666666657,0.2,0.6],"xyz":[0.0716409316756901615,0.0478640465354576786,0.30684322677432474],"hpluv":[262.040130643645512,360.488391101723778,26.1173586094444445],"hsluv":[262.040130643645512,93.700931793532277,26.1173586094444445]},"#1133aa":{"lch":[27.8146812937100378,84.589542856674214,262.892366774415223],"luv":[27.8146812937100378,-10.4665753413372666,-83.9395113240792767],"rgb":[0.0666666666666666657,0.2,0.66666666666666663],"xyz":[0.0866986246409427,0.0538871237215587801,0.386147076391323341],"hpluv":[262.892366774415223,385.906342473210088,27.8146812937100378],"hsluv":[262.892366774415223,94.7540719156047544,27.8146812937100378]},"#1133bb":{"lch":[29.5989386642012917,94.7497677250031245,263.494633441352278],"luv":[29.5989386642012917,-10.734795769033445,-94.1396974912241],"rgb":[0.0666666666666666657,0.2,0.733333333333333282],"xyz":[0.10383621674827935,0.0607421605644935386,0.476405061489965087],"hpluv":[263.494633441352278,406.201330660618282,29.5989386642012917],"hsluv":[263.494633441352278,95.59270717643426,29.5989386642012917]},"#1133cc":{"lch":[31.4535171675710927,104.725970292241058,263.935552719695806],"luv":[31.4535171675710927,-11.0639900580249932,-104.139891384844844],"rgb":[0.0666666666666666657,0.2,0.8],"xyz":[0.123128592192001091,0.0684591107419823403,0.578011572160235243],"hpluv":[263.935552719695806,422.497850271701509,31.4535171675710927],"hsluv":[263.935552719695806,96.2648935085394299,31.4535171675710927]},"#1133dd":{"lch":[33.3643121953656845,114.554023382916327,264.267643395871801],"luv":[33.3643121953656845,-11.4418472625073555,-113.981175658242762],"rgb":[0.0666666666666666657,0.2,0.866666666666666696],"xyz":[0.144646917742634634,0.0770664409622358743,0.691341420060241241],"hpluv":[264.267643395871801,435.679872957086786,33.3643121953656845],"hsluv":[264.267643395871801,96.8079128297289913,33.3643121953656845]},"#1133ee":{"lch":[35.3195411096734375,124.259061611723823,264.523680461367292],"luv":[35.3195411096734375,-11.8585821660500468,-123.691909281234786],"rgb":[0.0666666666666666657,0.2,0.933333333333333348],"xyz":[0.168459098008809371,0.0865913130687059,0.816752236128764464],"hpluv":[264.523680461367292,446.428943593210363,35.3195411096734375],"hsluv":[264.523680461367292,97.2502875158067752,35.3195411096734375]},"#1133ff":{"lch":[37.3094684856901466,133.858437412957159,264.724991571549936],"luv":[37.3094684856901466,-12.3064438760062309,-133.291532760957],"rgb":[0.0666666666666666657,0.2,1],"xyz":[0.194630146418640765,0.0970597324326386,0.954586424420546309],"hpluv":[264.724991571549936,455.266836240216,37.3094684856901466],"hsluv":[264.724991571549936,99.9999999999995168,37.3094684856901466]},"#66cc00":{"lch":[73.5514640948473328,100.417876322708906,119.311479215942285],"luv":[73.5514640948473328,-49.1602904566029579,87.5614968315714322],"rgb":[0.4,0.8,0],"xyz":[0.270712873389210462,0.460091387940038399,0.0745415201258350923],"hpluv":[119.311479215942285,173.244332851636557,73.5514640948473328],"hsluv":[119.311479215942285,100.00000000000226,73.5514640948473328]},"#66cc11":{"lch":[73.5777109322390572,99.3703085818509,119.605548775623987],"luv":[73.5777109322390572,-49.0915230219986611,86.397225621155485],"rgb":[0.4,0.8,0.0666666666666666657],"xyz":[0.271724538888847567,0.460496054139893252,0.079869625090590729],"hpluv":[119.605548775623987,171.375877908330068,73.5777109322390572],"hsluv":[119.605548775623987,98.5479766016144652,73.5777109322390572]},"#66cc22":{"lch":[73.626324929263788,97.4510710028789333,120.162888823436575],"luv":[73.626324929263788,-48.965269014871545,84.2562381661406192],"rgb":[0.4,0.8,0.133333333333333331],"xyz":[0.273599897027324623,0.461246197395284052,0.0897465112865699216],"hpluv":[120.162888823436575,167.954954584373922,73.626324929263788],"hsluv":[120.162888823436575,95.8800576342850377,73.626324929263788]},"#66cc33":{"lch":[73.7062524827218084,94.3550745227874,121.116489614327122],"luv":[73.7062524827218084,-48.7607908304490252,80.779114663321],"rgb":[0.4,0.8,0.2],"xyz":[0.276687647759782329,0.462481297688267179,0.106008665144181058],"hpluv":[121.116489614327122,162.442721914772306,73.7062524827218084],"hsluv":[121.116489614327122,91.5533619475712896,73.7062524827218084]},"#66cc44":{"lch":[73.8213986639243,90.0253172969507318,122.577193203242018],"luv":[73.8213986639243,-48.472817822786439,75.8613451418811451],"rgb":[0.4,0.8,0.266666666666666663],"xyz":[0.281145643004001244,0.464264495785954745,0.129487440097067696],"hpluv":[122.577193203242018,154.746814564283426,73.8213986639243],"hsluv":[122.577193203242018,85.4474048693987527,73.8213986639243]},"#66cc55":{"lch":[73.974942724102462,84.4934421806047879,124.700104619680829],"luv":[73.974942724102462,-48.100513339115345,69.4656921655632118],"rgb":[0.4,0.8,0.333333333333333315],"xyz":[0.28710805704336323,0.466649461401699606,0.160889487371041612],"hpluv":[124.700104619680829,144.936474170198323,73.974942724102462],"hsluv":[124.700104619680829,77.5306238992907,73.974942724102462]},"#66cc66":{"lch":[74.1695172801941567,77.8884466842553564,127.715012949239551],"luv":[74.1695172801941567,-47.6470375142611218,61.6146893443493937],"rgb":[0.4,0.8,0.4],"xyz":[0.294693052816871415,0.469683459711102924,0.200837131778185574],"hpluv":[127.715012949239551,133.256044234036153,74.1695172801941567],"hsluv":[127.715012949239551,67.8510775159793,74.1695172801941567]},"#66cc77":{"lch":[74.407302734023375,70.4570986939790203,131.971622948486811],"luv":[74.407302734023375,-47.1190629819757234,52.3831715350808551],"rgb":[0.4,0.8,0.466666666666666674],"xyz":[0.30400706583707332,0.47340906491918372,0.249890933684583483],"hpluv":[131.971622948486811,120.156846155807528,74.407302734023375],"hsluv":[131.971622948486811,68.6882673601907499,74.407302734023375]},"#66cc88":{"lch":[74.6900832163393602,62.6050444414555045,138.002106903522986],"luv":[74.6900832163393602,-46.5261552249599859,41.8892404980031543],"rgb":[0.4,0.8,0.533333333333333326],"xyz":[0.315147482939017121,0.477865231759961318,0.308563797088155622],"hpluv":[138.002106903522986,106.361808066007058,74.6900832163393602],"hsluv":[138.002106903522986,69.6340873295455367,74.6900832163393602]},"#66cc99":{"lch":[75.0192831982140405,54.9734389641357382,146.572693391746668],"luv":[75.0192831982140405,-45.8800303566060634,30.2836887782922481],"rgb":[0.4,0.8,0.6],"xyz":[0.32820444704808982,0.483088017403590475,0.377330474729273557],"hpluv":[146.572693391746668,92.9863760296957338,75.0192831982140405],"hsluv":[146.572693391746668,70.6723780843603,75.0192831982140405]},"#66ccaa":{"lch":[75.3959940236094,48.5503126646653,158.569930493367366],"luv":[75.3959940236094,-45.1937477629490587,17.7386026218441692],"rgb":[0.4,0.8,0.66666666666666663],"xyz":[0.343262140013342376,0.489111094589691597,0.456634324346272158],"hpluv":[158.569930493367366,81.7114817988577187,75.3959940236094],"hsluv":[158.569930493367366,71.7849539596152368,75.3959940236094]},"#66ccbb":{"lch":[75.8209952994642,44.7015709258060667,174.304687468137473],"luv":[75.8209952994642,-44.4809102105153755,4.43610979112772],"rgb":[0.4,0.8,0.733333333333333282],"xyz":[0.360399732120679051,0.495966131432626356,0.546892309444913849],"hpluv":[174.304687468137473,74.8122352806046109,75.8209952994642],"hsluv":[174.304687468137473,72.9527506991265113,75.8209952994642]},"#66cccc":{"lch":[76.2947739303160262,44.7620652034609634,192.177050630061018],"luv":[76.2947739303160262,-43.7549393425641924,-9.44180938207391],"rgb":[0.4,0.8,0.8],"xyz":[0.379692107564400749,0.503683081610115102,0.648498820115184],"hpluv":[192.177050630061018,75.6461904464395,76.2947739303160262],"hsluv":[192.177050630061018,74.1568646821725679,76.2947739303160262]},"#66ccdd":{"lch":[76.8175423984245782,49.1342213212598082,208.868111129197587],"luv":[76.8175423984245782,-43.0284772118039101,-23.7217590764220851],"rgb":[0.4,0.8,0.866666666666666696],"xyz":[0.401210433115034348,0.512290411830368719,0.76182866801519],"hpluv":[208.868111129197587,85.3113130970085791,76.8175423984245782],"hsluv":[208.868111129197587,75.3794120212671714,76.8175423984245782]},"#66ccee":{"lch":[77.3892571801628435,57.0358051623713038,222.109360872917676],"luv":[77.3892571801628435,-42.312941633688304,-38.245235531031426],"rgb":[0.4,0.8,0.933333333333333348],"xyz":[0.425022613381209058,0.521815283936838736,0.887239484083713226],"hpluv":[222.109360872917676,102.061631830010029,77.3892571801628435],"hsluv":[222.109360872917676,76.6041682601332923,77.3892571801628435]},"#66ccff":{"lch":[78.0096377377628158,67.2874731922355664,231.792303901557148],"luv":[78.0096377377628158,-41.6182406850010267,-52.872734853430309],"rgb":[0.4,0.8,1],"xyz":[0.451193661791040479,0.53228370330077146,1.02507367237549518],"hpluv":[231.792303901557148,124.498094909356865,78.0096377377628158],"hsluv":[231.792303901557148,99.9999999999966604,78.0096377377628158]},"#114400":{"lch":[24.4916204196936391,35.767443133059956,124.131260038140155],"luv":[24.4916204196936391,-20.0687794552527912,29.6066559991685239],"rgb":[0.0666666666666666657,0.266666666666666663,0],"xyz":[0.0229819284997768124,0.0425325580378379114,0.00699846233187489172],"hpluv":[124.131260038140155,185.314627891622,24.4916204196936391],"hsluv":[124.131260038140155,100.000000000002416,24.4916204196936391]},"#114411":{"lch":[24.6196313539200702,32.2821952767626144,127.715012949240105],"luv":[24.6196313539200702,-19.7481274165088401,25.5372589646650674],"rgb":[0.0666666666666666657,0.266666666666666663,0.0666666666666666657],"xyz":[0.0239935939994139341,0.0429372242376927643,0.0123265672966305223],"hpluv":[127.715012949240105,166.387555424049935,24.6196313539200702],"hsluv":[127.715012949240105,84.7209219338948,24.6196313539200702]},"#114422":{"lch":[24.8548180969752792,26.7199561105771828,135.968420687644709],"luv":[24.8548180969752792,-19.2104947057918238,18.5718321042894203],"rgb":[0.0666666666666666657,0.266666666666666663,0.133333333333333331],"xyz":[0.0258689521378909527,0.0436873674930835856,0.0222034534926097184],"hpluv":[135.968420687644709,136.415738329938534,24.8548180969752792],"hsluv":[135.968420687644709,85.5945702875542338,24.8548180969752792]},"#114433":{"lch":[25.2362525898650887,20.3101465248311648,155.348193219538018],"luv":[25.2362525898650887,-18.4590663004995292,8.4714180143512],"rgb":[0.0666666666666666657,0.266666666666666663,0.2],"xyz":[0.0289567028703486933,0.0449224677860667,0.0384656073502208651],"hpluv":[155.348193219538018,102.123929581721498,25.2362525898650887],"hsluv":[155.348193219538018,86.8340768870874911,25.2362525898650887]},"#114444":{"lch":[25.774812755707849,18.0038630185053101,192.177050630061132],"luv":[25.774812755707849,-17.5987843886529483,-3.79761393914762779],"rgb":[0.0666666666666666657,0.266666666666666663,0.266666666666666663],"xyz":[0.0334146981145675703,0.0467056658837542715,0.0619443823031075036],"hpluv":[192.177050630061132,88.6358691141452226,25.774812755707849],"hsluv":[192.177050630061132,88.2889223192016743,25.774812755707849]},"#114455":{"lch":[26.4741010086829718,23.9697809957076196,225.699525295295985],"luv":[26.4741010086829718,-16.7410035671662349,-17.1548593857925162],"rgb":[0.0666666666666666657,0.266666666666666663,0.333333333333333315],"xyz":[0.0393771121539295693,0.0490906314994991044,0.0933464295770814],"hpluv":[225.699525295295985,114.889984549549212,26.4741010086829718],"hsluv":[225.699525295295985,89.7968555301121398,26.4741010086829718]},"#114466":{"lch":[27.3316922889079734,34.6428172107851182,242.548035964380944],"luv":[27.3316922889079734,-15.9705048052882308,-30.7419544037807526],"rgb":[0.0666666666666666657,0.266666666666666663,0.4],"xyz":[0.0469621079274377407,0.052124629808902416,0.133294073984225381],"hpluv":[242.548035964380944,160.837015687659374,27.3316922889079734],"hsluv":[242.548035964380944,91.2329185483074525,27.3316922889079734]},"#114477":{"lch":[28.3404051997208484,46.6267191674415,250.798290317077829],"luv":[28.3404051997208484,-15.3352867062553546,-44.0327142242719844],"rgb":[0.0666666666666666657,0.266666666666666663,0.466666666666666674],"xyz":[0.0562761209476396601,0.0558502350169832323,0.18234787589062329],"hpluv":[250.798290317077829,208.770018220734585,28.3404051997208484],"hsluv":[250.798290317077829,92.5248535524246734,28.3404051997208484]},"#114488":{"lch":[29.4896359978219706,58.6954673108201632,255.342505689020953],"luv":[29.4896359978219706,-14.8523182742844106,-56.7852667926718055],"rgb":[0.0666666666666666657,0.266666666666666663,0.533333333333333326],"xyz":[0.0674165380495834882,0.0603064018577608302,0.241020739294195457],"hpluv":[255.342505689020953,252.565763352450517,29.4896359978219706],"hsluv":[255.342505689020953,93.6449802292742817,29.4896359978219706]},"#114499":{"lch":[30.7666487879374699,70.4540899928233699,258.107815399211404],"luv":[30.7666487879374699,-14.5185243824624628,-68.9419411278265102],"rgb":[0.0666666666666666657,0.266666666666666663,0.6],"xyz":[0.0804735021586562,0.0655291875013899877,0.309787416935313364],"hpluv":[258.107815399211404,290.579747717257874,30.7666487879374699],"hsluv":[258.107815399211404,94.5943513350065359,30.7666487879374699]},"#1144aa":{"lch":[32.1577052090601185,81.8040240174920541,259.917940759024589],"luv":[32.1577052090601185,-14.3204852090806973,-80.5408098347099894],"rgb":[0.0666666666666666657,0.266666666666666663,0.66666666666666663],"xyz":[0.0955311951239087437,0.0715522646874911,0.389091266552311965],"hpluv":[259.917940759024589,322.796594575352628,32.1577052090601185],"hsluv":[259.917940759024589,95.3887741756132925,32.1577052090601185]},"#1144bb":{"lch":[33.6489603009756664,92.7573184463875435,261.168522985608377],"luv":[33.6489603009756664,-14.2409127099882671,-91.6576048702508928],"rgb":[0.0666666666666666657,0.266666666666666663,0.733333333333333282],"xyz":[0.11266878723124539,0.0784073015304258547,0.479349251650953712],"hpluv":[261.168522985608377,349.796823816496214,33.6489603009756664],"hsluv":[261.168522985608377,96.0495339612535872,33.6489603009756664]},"#1144cc":{"lch":[35.2271045850644597,103.362934076908545,262.068884255867147],"luv":[35.2271045850644597,-14.262270250582695,-102.374234005860515],"rgb":[0.0666666666666666657,0.266666666666666663,0.8],"xyz":[0.131961162674967131,0.0861242517079146563,0.580955762321223812],"hpluv":[262.068884255867147,372.329293739207799,35.2271045850644597],"hsluv":[262.068884255867147,96.5982694251149638,35.2271045850644597]},"#1144dd":{"lch":[36.8797734412618,113.676357292171801,262.73849416957313],"luv":[36.8797734412618,-14.3684841809298494,-112.764625967365617],"rgb":[0.0666666666666666657,0.266666666666666663,0.866666666666666696],"xyz":[0.153479488225600674,0.0947315819281681903,0.69428561022122981],"hpluv":[262.73849416957313,391.13009227787353,36.8797734412618],"hsluv":[262.73849416957313,97.0546019825808,36.8797734412618]},"#1144ee":{"lch":[38.5957670998368911,123.747928777943088,263.249741523271325],"luv":[38.5957670998368911,-14.5455638799169762,-122.890099065165245],"rgb":[0.0666666666666666657,0.266666666666666663,0.933333333333333348],"xyz":[0.177291668491775412,0.104256454034638207,0.819696426289753],"hpluv":[263.249741523271325,406.853061330967478,38.5957670998368911],"hsluv":[263.249741523271325,97.4353215147193623,38.5957670998368911]},"#1144ff":{"lch":[40.3651306844127546,133.619394536005728,263.648645306126298],"luv":[40.3651306844127546,-14.7816672391382209,-132.799265471613751],"rgb":[0.0666666666666666657,0.266666666666666663,1],"xyz":[0.203462716901606805,0.114724873398570917,0.957530614581534878],"hpluv":[263.648645306126298,420.051425771921231,40.3651306844127546],"hsluv":[263.648645306126298,99.9999999999994458,40.3651306844127546]},"#66dd00":{"lch":[78.7732081443282084,109.616469768408933,120.762072840728067],"luv":[78.7732081443282084,-56.0659919017112145,94.1932853050883],"rgb":[0.4,0.866666666666666696,0],"xyz":[0.313346863936385611,0.54535936903439,0.0887528503082264109],"hpluv":[120.762072840728067,211.559351010719155,78.7732081443282084],"hsluv":[120.762072840728067,100.000000000002444,78.7732081443282084]},"#66dd11":{"lch":[78.7966434753788576,108.675393583239966,121.014553037765893],"luv":[78.7966434753788576,-55.9956244091473678,93.1387739746547],"rgb":[0.4,0.866666666666666696,0.0666666666666666657],"xyz":[0.314358529436022716,0.545764035234244882,0.0940809552729820475],"hpluv":[121.014553037765893,210.019013530063148,78.7966434753788576],"hsluv":[121.014553037765893,98.7735218244661866,78.7966434753788576]},"#66dd22":{"lch":[78.8400557089289435,106.948443645027297,121.491090191754736],"luv":[78.8400557089289435,-55.866227309203758,91.1972271745690506],"rgb":[0.4,0.866666666666666696,0.133333333333333331],"xyz":[0.316233887574499772,0.546514178489635682,0.10395784146896124],"hpluv":[121.491090191754736,207.186246213049145,78.8400557089289435],"hsluv":[121.491090191754736,96.5169147905729,78.8400557089289435]},"#66dd33":{"lch":[78.911446872650572,104.154611952746194,122.300539429107701],"luv":[78.911446872650572,-55.6560904548950788,88.037394249850891],"rgb":[0.4,0.866666666666666696,0.2],"xyz":[0.319321638306957478,0.547749278782618809,0.120219995326572376],"hpluv":[122.300539429107701,202.586476802368111,78.911446872650572],"hsluv":[122.300539429107701,92.8487034899531807,78.911446872650572]},"#66dd44":{"lch":[79.0143300648071687,100.229492569308348,123.526451276321851],"luv":[79.0143300648071687,-55.3589437481663,83.5544045983716899],"rgb":[0.4,0.866666666666666696,0.266666666666666663],"xyz":[0.323779633551176393,0.549532476880306375,0.143698770279459015],"hpluv":[123.526451276321851,196.088207898644384,79.0143300648071687],"hsluv":[123.526451276321851,87.6539206040991843,79.0143300648071687]},"#66dd55":{"lch":[79.1515854502963,95.1800529291645603,125.27945296022996],"luv":[79.1515854502963,-54.9726586351532518,77.699737954393882],"rgb":[0.4,0.866666666666666696,0.333333333333333315],"xyz":[0.329742047590538379,0.551917442496051125,0.17510081755343293],"hpluv":[125.27945296022996,187.665730733793509,79.1515854502963],"hsluv":[125.27945296022996,80.8868034505971707,79.1515854502963]},"#66dd66":{"lch":[79.3256225689869723,89.0890908185611607,127.715012949239735],"luv":[79.3256225689869723,-54.4988561596450722,70.4751075215082921],"rgb":[0.4,0.866666666666666696,0.4],"xyz":[0.337327043364046564,0.554951440805454443,0.215048461960576892],"hpluv":[127.715012949239735,177.410630109117562,79.3256225689869723],"hsluv":[127.715012949239735,72.5638298210149,79.3256225689869723]},"#66dd77":{"lch":[79.538466322575843,82.1265081512392072,131.057978326052336],"luv":[79.538466322575843,-53.9425296262626048,61.9271090770055395],"rgb":[0.4,0.866666666666666696,0.466666666666666674],"xyz":[0.346641056384248469,0.558677046013535294,0.264102263866974774],"hpluv":[131.057978326052336,165.560886464635786,79.538466322575843],"hsluv":[131.057978326052336,73.175897046832489,79.538466322575843]},"#66dd88":{"lch":[79.7918079202835173,74.5708009722257543,135.636001638862723],"luv":[79.7918079202835173,-53.3115731427918,52.1409678341327378],"rgb":[0.4,0.866666666666666696,0.533333333333333326],"xyz":[0.35778147348619227,0.563133212854312837,0.322775127270546969],"hpluv":[135.636001638862723,152.557764790666909,79.7918079202835173],"hsluv":[135.636001638862723,73.8730513922454435,79.7918079202835173]},"#66dd99":{"lch":[80.0870378401123162,66.8478260511747919,141.915708870878916],"luv":[80.0870378401123162,-52.6162023759431392,41.2330825345609924],"rgb":[0.4,0.866666666666666696,0.6],"xyz":[0.370838437595265,0.568355998497942,0.391541804911664904],"hpluv":[141.915708870878916,139.150468179242381,80.0870378401123162],"hsluv":[141.915708870878916,74.6453790933081791,80.0870378401123162]},"#66ddaa":{"lch":[80.4252690581998877,59.592891473004542,150.502508447871207],"luv":[80.4252690581998877,-51.8682972227800931,29.3426729750825572],"rgb":[0.4,0.866666666666666696,0.66666666666666663],"xyz":[0.385896130560517525,0.574379075684043117,0.470845654528663449],"hpluv":[150.502508447871207,126.571308780245914,80.4252690581998877],"hsluv":[150.502508447871207,75.4812281571350638,80.4252690581998877]},"#66ddbb":{"lch":[80.807354973374558,53.7174771102931672,161.973645166837599],"luv":[80.807354973374558,-51.0807157732000334,16.6231111165276104],"rgb":[0.4,0.866666666666666696,0.733333333333333282],"xyz":[0.4030337226678542,0.581234112526977875,0.561103639627305251],"hpluv":[161.973645166837599,116.757770235740637,80.807354973374558],"hsluv":[161.973645166837599,76.3679029554368753,80.807354973374558]},"#66ddcc":{"lch":[81.2339045655681389,50.3705316419042148,176.319314132685548],"luv":[81.2339045655681389,-50.2666331071559256,3.23358221770368903],"rgb":[0.4,0.866666666666666696,0.8],"xyz":[0.422326098111575954,0.588951062704466732,0.662710150297575407],"hpluv":[176.319314132685548,112.393665646206941,81.2339045655681389],"hsluv":[176.319314132685548,77.2923330418296501,81.2339045655681389]},"#66dddd":{"lch":[81.7052962965957903,50.5769089008318389,192.177050630061],"luv":[81.7052962965957903,-49.4389517336029,-10.6683534552210038],"rgb":[0.4,0.866666666666666696,0.866666666666666696],"xyz":[0.443844423662209442,0.597558392924720239,0.776039998197581404],"hpluv":[192.177050630061,116.242714563462513,81.7052962965957903],"hsluv":[192.177050630061,78.2416694753709407,81.7052962965957903]},"#66ddee":{"lch":[82.2216916522674524,54.6311568672274745,207.154140846621715],"luv":[82.2216916522674524,-48.6098170936026577,-24.9328895793911158],"rgb":[0.4,0.866666666666666696,0.933333333333333348],"xyz":[0.467656603928384207,0.607083265031190256,0.901450814266104627],"hpluv":[207.154140846621715,129.793318723999505,82.2216916522674524],"hsluv":[207.154140846621715,79.2037752530793,82.2216916522674524]},"#66ddff":{"lch":[82.7830488398693376,61.9519841783888339,219.519505956683815],"luv":[82.7830488398693376,-47.7902556034158366,-39.4225799891321387],"rgb":[0.4,0.866666666666666696,1],"xyz":[0.493827652338215572,0.617551684395123,1.03928500255788636],"hpluv":[219.519505956683815,152.730665075356086,82.7830488398693376],"hsluv":[219.519505956683815,99.9999999999957,82.7830488398693376]},"#115500":{"lch":[30.9160157060817227,46.0913193883500583,125.457330883646421],"luv":[30.9160157060817227,-26.7374134918097575,37.543580579466358],"rgb":[0.0666666666666666657,0.333333333333333315,0],"xyz":[0.0347951852141227744,0.0661590714665301755,0.0109362145699901016],"hpluv":[125.457330883646421,189.179880792461034,30.9160157060817227],"hsluv":[125.457330883646421,100.000000000002402,30.9160157060817227]},"#115511":{"lch":[31.0114762783458957,43.2230667766736616,127.715012949240275],"luv":[31.0114762783458957,-26.4410342208804181,34.1921805521528697],"rgb":[0.0666666666666666657,0.333333333333333315,0.0666666666666666657],"xyz":[0.0358068507137599,0.0665637376663850283,0.0162643195347457331],"hpluv":[127.715012949240275,176.861157643680144,31.0114762783458957],"hsluv":[127.715012949240275,90.0538522348087156,31.0114762783458957]},"#115522":{"lch":[31.1874163697014737,38.3803455570512071,132.492971129528541],"luv":[31.1874163697014737,-25.925914044022,28.3001396827055132],"rgb":[0.0666666666666666657,0.333333333333333315,0.133333333333333331],"xyz":[0.0376822088522369147,0.0673138809217758427,0.0261412057307249292],"hpluv":[132.492971129528541,156.159643444286843,31.1874163697014737],"hsluv":[132.492971129528541,90.4316047034468653,31.1874163697014737]},"#115533":{"lch":[31.4742731349983,31.7764378074468219,142.363318860140765],"luv":[31.4742731349983,-25.163724938647551,19.4043538140960301],"rgb":[0.0666666666666666657,0.333333333333333315,0.2],"xyz":[0.0407699595846946553,0.0685489812147589556,0.0424033595883360759],"hpluv":[142.363318860140765,128.111709873485438,31.4742731349983],"hsluv":[142.363318860140765,90.9947325890089616,31.4742731349983]},"#115544":{"lch":[31.8824114421380642,25.5202649789159608,161.635705606154772],"luv":[31.8824114421380642,-24.2205825435089714,8.04035483341083435],"rgb":[0.0666666666666666657,0.333333333333333315,0.266666666666666663],"xyz":[0.0452279548289135358,0.0703321793124465355,0.0658821345412227144],"hpluv":[161.635705606154772,101.571845607751229,31.8824114421380642],"hsluv":[161.635705606154772,91.6999843863076194,31.8824114421380642]},"#115555":{"lch":[32.417637609391285,23.7206023942150033,192.177050630061103],"luv":[32.417637609391285,-23.1868997601056,-5.00346454561771115],"rgb":[0.0666666666666666657,0.333333333333333315,0.333333333333333315],"xyz":[0.0511903688682755278,0.0727171449281913684,0.0972841818151966159],"hpluv":[192.177050630061103,92.8503782686988899,32.417637609391285],"hsluv":[192.177050630061103,92.4869346485079,32.417637609391285]},"#115566":{"lch":[33.0818646063754045,29.1355194477524577,220.509575549450261],"luv":[33.0818646063754045,-22.1516601517912761,-18.9257085999416219],"rgb":[0.0666666666666666657,0.333333333333333315,0.4],"xyz":[0.0587753646417837061,0.0757511432375946869,0.137231826222340592],"hpluv":[220.509575549450261,111.756325010930979,33.0818646063754045],"hsluv":[220.509575549450261,93.2955878193037904,33.0818646063754045]},"#115577":{"lch":[33.8736729304774826,39.2775515041961185,237.359341141202208],"luv":[33.8736729304774826,-21.1850732372535866,-33.0744421585153958],"rgb":[0.0666666666666666657,0.333333333333333315,0.466666666666666674],"xyz":[0.0680893776619856117,0.0794767484456755,0.186285628128738501],"hpluv":[237.359341141202208,147.13684637222039,33.8736729304774826],"hsluv":[237.359341141202208,94.078253732623736,33.8736729304774826]},"#115588":{"lch":[34.7888943497230514,51.2161985161337938,246.60972521059881],"luv":[34.7888943497230514,-20.3324266151093482,-47.0073549392562455],"rgb":[0.0666666666666666657,0.333333333333333315,0.533333333333333326],"xyz":[0.0792297947639294398,0.0839329152864531,0.244958491532310668],"hpluv":[246.60972521059881,186.812546427038342,34.7888943497230514],"hsluv":[246.60972521059881,94.8038015691112719,34.7888943497230514]},"#115599":{"lch":[35.8212274371681403,63.5782184467896,252.028930114170464],"luv":[35.8212274371681403,-19.6162163870228632,-60.476391389741444],"rgb":[0.0666666666666666657,0.333333333333333315,0.6],"xyz":[0.0922867588730021671,0.0891557009300822517,0.313725169173428575],"hpluv":[252.028930114170464,225.22013661091745,35.8212274371681403],"hsluv":[252.028930114170464,95.4562831747131355,35.8212274371681403]},"#1155aa":{"lch":[36.9628521043173777,75.808874965898184,255.452401876993463],"luv":[36.9628521043173777,-19.0419916394553752,-73.3783897206670588],"rgb":[0.0666666666666666657,0.333333333333333315,0.66666666666666663],"xyz":[0.107344451838254695,0.0951787781161833601,0.393029018790427176],"hpluv":[255.452401876993463,260.251896817562397,36.9628521043173777],"hsluv":[255.452401876993463,96.0310300088164155,36.9628521043173777]},"#1155bb":{"lch":[38.2050019251475845,87.6984258792502089,257.752076786877694],"luv":[38.2050019251475845,-18.6045414354547205,-85.7023041678273216],"rgb":[0.0666666666666666657,0.333333333333333315,0.733333333333333282],"xyz":[0.124482043945591342,0.102033814959118119,0.483287003889068922],"hpluv":[257.752076786877694,291.280156181798475,38.2050019251475845],"hsluv":[257.752076786877694,96.5305142623785,38.2050019251475845]},"#1155cc":{"lch":[39.5384610498345523,99.1886562531622,259.372402836059223],"luv":[39.5384610498345523,-18.292845239891637,-97.4872368176334447],"rgb":[0.0666666666666666657,0.333333333333333315,0.8],"xyz":[0.143774419389313096,0.10975076513660692,0.584893514559339],"hpluv":[259.372402836059223,318.332933912315752,39.5384610498345523],"hsluv":[259.372402836059223,96.9610449958707,39.5384610498345523]},"#1155dd":{"lch":[40.9539668975822053,110.288480556245688,260.557616930578945],"luv":[40.9539668975822053,-18.0934548393737415,-108.7941902648341],"rgb":[0.0666666666666666657,0.333333333333333315,0.866666666666666696],"xyz":[0.16529274493994664,0.118358095356860454,0.698223362459345],"hpluv":[260.557616930578945,341.722445031840948,40.9539668975822053],"hsluv":[260.557616930578945,97.330522563257,40.9539668975822053]},"#1155ee":{"lch":[42.4425141949683038,121.034132372772049,261.450904748640312],"luv":[42.4425141949683038,-17.992549051743687,-119.689303523123172],"rgb":[0.0666666666666666657,0.333333333333333315,0.933333333333333348],"xyz":[0.189104925206121377,0.127882967463330471,0.823634178527868244],"hpluv":[261.450904748640312,361.864588035447412,42.4425141949683038],"hsluv":[261.450904748640312,97.6470858685672596,42.4425141949683038]},"#1155ff":{"lch":[43.9955669218353762,131.469960671873054,262.140820458865903],"luv":[43.9955669218353762,-17.9770474653633769,-130.235081001594637],"rgb":[0.0666666666666666657,0.333333333333333315,1],"xyz":[0.21527597361595277,0.138351386827263168,0.961468366819650089],"hpluv":[262.140820458865903,379.190057269809415,43.9955669218353762],"hsluv":[262.140820458865903,99.9999999999993321,43.9955669218353762]},"#66ee00":{"lch":[83.9510288300903511,118.631054776009961,121.878900606421581],"luv":[83.9510288300903511,-62.6521043104729145,100.737485489455693],"rgb":[0.4,0.933333333333333348,0],"xyz":[0.360525640276900428,0.639716921715420939,0.104479109088397595],"hpluv":[121.878900606421581,316.932305812441825,83.9510288300903511],"hsluv":[121.878900606421581,100.000000000002245,83.9510288300903511]},"#66ee11":{"lch":[83.9720997528394406,117.779830021225337,122.096631719604488],"luv":[83.9720997528394406,-62.5821687959979371,99.7775551344988401],"rgb":[0.4,0.933333333333333348,0.0666666666666666657],"xyz":[0.361537305776537532,0.640121587915275847,0.109807214053153232],"hpluv":[122.096631719604488,315.12898496103287,83.9720997528394406],"hsluv":[122.096631719604488,98.9534187198870825,83.9720997528394406]},"#66ee22":{"lch":[84.0111361497279461,116.215639794016113,122.506307539641156],"luv":[84.0111361497279461,-62.4534076072217061,98.0084017366813498],"rgb":[0.4,0.933333333333333348,0.133333333333333331],"xyz":[0.363412663915014589,0.640871731170666648,0.119684100249132425],"hpluv":[122.506307539641156,311.807725961995743,84.0111361497279461],"hsluv":[122.506307539641156,97.0256918708191,84.0111361497279461]},"#66ee33":{"lch":[84.0753427139745213,113.679067087327056,123.198426402241765],"luv":[84.0753427139745213,-62.2438639038254564,95.1242960560921],"rgb":[0.4,0.933333333333333348,0.2],"xyz":[0.366500414647472295,0.642106831463649774,0.135946254106743575],"hpluv":[123.198426402241765,306.400922934277446,84.0753427139745213],"hsluv":[123.198426402241765,93.8862320250161133,84.0753427139745213]},"#66ee44":{"lch":[84.1678970009459704,110.10189342016568,124.237870325737177],"luv":[84.1678970009459704,-61.946619900698991,91.0222127702015626],"rgb":[0.4,0.933333333333333348,0.266666666666666663],"xyz":[0.37095840989169121,0.64389002956133734,0.159425029059630213],"hpluv":[124.237870325737177,298.731636810455427,84.1678970009459704],"hsluv":[124.237870325737177,89.4277949312148337,84.1678970009459704]},"#66ee55":{"lch":[84.2914184237995414,105.474359140243067,125.706632503417083],"luv":[84.2914184237995414,-61.5585501093914829,85.6468641835444657],"rgb":[0.4,0.933333333333333348,0.333333333333333315],"xyz":[0.376920823931053195,0.64627499517708209,0.190827076333604129],"hpluv":[125.706632503417083,288.732343582820249,84.2914184237995414],"hsluv":[125.706632503417083,83.5978964235977315,84.2914184237995414]},"#66ee66":{"lch":[84.4481159447294374,99.8471979874678652,127.715012949239849],"luv":[84.4481159447294374,-61.0799597466417339,78.9854509596370633],"rgb":[0.4,0.933333333333333348,0.4],"xyz":[0.38450581970456138,0.649308993486485408,0.230774720740748063],"hpluv":[127.715012949239849,276.453302697114395,84.4481159447294374],"hsluv":[127.715012949239849,76.3932656313124454,84.4481159447294374]},"#66ee77":{"lch":[84.6398667383604391,93.3381964812165,130.416076861551431],"luv":[84.6398667383604391,-60.5142850922984863,71.0636350191446127],"rgb":[0.4,0.933333333333333348,0.466666666666666674],"xyz":[0.393819832724763286,0.65303459869456626,0.279828522647145972],"hpluv":[130.416076861551431,262.087365127001192,84.6398667383604391],"hsluv":[130.416076861551431,76.8478121958162461,84.6398667383604391]},"#66ee88":{"lch":[84.8682629083727704,86.1443361377895513,134.024834696689027],"luv":[84.8682629083727704,-59.8677379892917187,61.9411058721588503],"rgb":[0.4,0.933333333333333348,0.533333333333333326],"xyz":[0.404960249826707086,0.657490765535343802,0.338501386050718167],"hpluv":[134.024834696689027,246.018013362770375,84.8682629083727704],"hsluv":[134.024834696689027,77.3690194462974858,84.8682629083727704]},"#66ee99":{"lch":[85.1346415661787432,78.5628931277068,138.840952739605655],"luv":[85.1346415661787432,-59.1488647733143296,51.7062856200641718],"rgb":[0.4,0.933333333333333348,0.6],"xyz":[0.418017213935779841,0.662713551178973,0.407268063691836046],"hpluv":[138.840952739605655,228.905884969324347,85.1346415661787432],"hsluv":[138.840952739605655,77.9507906120806,85.1346415661787432]},"#66eeaa":{"lch":[85.4401056772853451,71.025817565124143,145.263991147699045],"luv":[85.4401056772853451,-58.3680297483556387,40.4702342974360576],"rgb":[0.4,0.933333333333333348,0.66666666666666663],"xyz":[0.433074906901032342,0.668736628365074082,0.486571913308834647],"hpluv":[145.263991147699045,211.83630636980061,85.4401056772853451],"hsluv":[145.263991147699045,78.5856392083502868,85.4401056772853451]},"#66eebb":{"lch":[85.7855396574798448,64.1465768711300228,153.7611846199909],"luv":[85.7855396574798448,-57.5368534805651,28.3600743271201026],"rgb":[0.4,0.933333333333333348,0.733333333333333282],"xyz":[0.450212499008369,0.67559166520800884,0.576829898407476449],"hpluv":[153.7611846199909,196.542528595596508,85.7855396574798448],"hsluv":[153.7611846199909,79.2651091664321683,85.7855396574798448]},"#66eecc":{"lch":[86.1716220205593,58.7524914026155827,164.690737532459508],"luv":[86.1716220205593,-56.6676444389915517,15.5123602250092176],"rgb":[0.4,0.933333333333333348,0.8],"xyz":[0.46950487445209077,0.683308615385497697,0.678436409077746605],"hpluv":[164.690737532459508,185.645341664818176,86.1716220205593],"hsluv":[164.690737532459508,79.9801993176568118,86.1716220205593]},"#66eedd":{"lch":[86.5988364705929285,55.8111450312658164,177.877712634427581],"luv":[86.5988364705929285,-55.7728621696499403,2.06682246606168096],"rgb":[0.4,0.933333333333333348,0.866666666666666696],"xyz":[0.491023200002724258,0.691915945605751204,0.791766256977752603],"hpluv":[177.877712634427581,182.628088950326941,86.5988364705929285],"hsluv":[177.877712634427581,80.7217641095277543,86.5988364705929285]},"#66eeee":{"lch":[87.0674822997282263,56.1274864183573783,192.177050630061075],"luv":[87.0674822997282263,-54.8646438121880493,-11.8391549953798521],"rgb":[0.4,0.933333333333333348,0.933333333333333348],"xyz":[0.514835380268899,0.701440817712221221,0.917177073046275826],"hpluv":[192.177050630061075,191.066910285097691,87.0674822997282263],"hsluv":[192.177050630061075,81.4808670778618165,87.0674822997282263]},"#66eeff":{"lch":[87.5776846199412518,59.9248574237073512,205.793536431897621],"luv":[87.5776846199412518,-53.9544158989052178,-26.0750751151289606],"rgb":[0.4,0.933333333333333348,1],"xyz":[0.541006428678730389,0.711909237076154,1.05501126133805756],"hpluv":[205.793536431897621,213.276590696447101,87.5776846199412518],"hsluv":[205.793536431897621,99.9999999999933351,87.5776846199412518]},"#116600":{"lch":[37.1543973335168118,56.0416844920186463,126.180156646926719],"luv":[37.1543973335168118,-33.0828721903909511,45.2348755755691201],"rgb":[0.0666666666666666657,0.4,0],"xyz":[0.0498232429199692434,0.0962151868782235159,0.0159455671386054508],"hpluv":[126.180156646926719,191.399273993181851,37.1543973335168118],"hsluv":[126.180156646926719,100.000000000002359,37.1543973335168118]},"#116611":{"lch":[37.2288128297302237,53.6508389550451668,127.715012949240304],"luv":[37.2288128297302237,-32.820060550512963,42.4412081124095124],"rgb":[0.0666666666666666657,0.4,0.0666666666666666657],"xyz":[0.0508349084196063616,0.0966198530780783688,0.021273672103361084],"hpluv":[127.715012949240304,182.867554307566394,37.2288128297302237],"hsluv":[127.715012949240304,93.1121786917857719,37.2288128297302237]},"#116622":{"lch":[37.366211587350719,49.4912288674311,130.823584918521846],"luv":[37.366211587350719,-32.3540076461773722,37.4513006989015125],"rgb":[0.0666666666666666657,0.4,0.133333333333333331],"xyz":[0.0527102665580833837,0.0973699963334691831,0.0311505582993402766],"hpluv":[130.823584918521846,168.069340269208539,37.366211587350719],"hsluv":[130.823584918521846,93.2954788878505639,37.366211587350719]},"#116633":{"lch":[37.5909073580641291,43.4152735453156,136.786924005406348],"luv":[37.5909073580641291,-31.6415889136076061,29.7270218494359924],"rgb":[0.0666666666666666657,0.4,0.2],"xyz":[0.0557980172905411242,0.0986050966264523,0.0474127121569514198],"hpluv":[136.786924005406348,146.554466726503705,37.5909073580641291],"hsluv":[136.786924005406348,93.5769168130898095,37.5909073580641291]},"#116644":{"lch":[37.9120295698984506,36.3990668435195417,147.559563985674146],"luv":[37.9120295698984506,-30.7189764474867033,19.525279846848818],"rgb":[0.0666666666666666657,0.4,0.266666666666666663],"xyz":[0.0602560125347600048,0.100388294724139876,0.0708914871098380583],"hpluv":[147.559563985674146,121.829522477327146,37.9120295698984506],"hsluv":[147.559563985674146,93.9439470857740559,37.9120295698984506]},"#116655":{"lch":[38.335629212958338,30.5483862618043851,166.063087397862887],"luv":[38.335629212958338,-29.6490880228798659,7.35768187759708869],"rgb":[0.0666666666666666657,0.4,0.333333333333333315],"xyz":[0.066218426574122,0.102773260339884709,0.102293534383811974],"hpluv":[166.063087397862887,101.117192726530064,38.335629212958338],"hsluv":[166.063087397862887,94.3739252192313529,38.335629212958338]},"#116666":{"lch":[38.8651381017916293,29.1618890828208741,192.177050630061217],"luv":[38.8651381017916293,-28.5057600031098204,-6.15121301239451324],"rgb":[0.0666666666666666657,0.4,0.4],"xyz":[0.0738034223476301682,0.105807258649288027,0.142241178790955936],"hpluv":[192.177050630061217,95.2126746116157392,38.8651381017916293],"hsluv":[192.177050630061217,94.8399842705083245,38.8651381017916293]},"#116677":{"lch":[39.5016809883423079,34.1234106492309124,216.700227589977857],"luv":[39.5016809883423079,-27.3592385518708738,-20.3931169809293316],"rgb":[0.0666666666666666657,0.4,0.466666666666666674],"xyz":[0.0831174353678320876,0.109532863857368837,0.191294980697353845],"hpluv":[216.700227589977857,109.616563248578402,39.5016809883423079],"hsluv":[216.700227589977857,95.3164106037614687,39.5016809883423079]},"#116688":{"lch":[40.2443638992953723,43.6497103352843823,233.004065811630028],"luv":[40.2443638992953723,-26.2665776267255495,-34.862072688430807],"rgb":[0.0666666666666666657,0.4,0.533333333333333326],"xyz":[0.0942578524697759157,0.113989030698146435,0.249967844100926],"hpluv":[233.004065811630028,137.630797119362086,40.2443638992953723],"hsluv":[233.004065811630028,95.7822055324918864,40.2443638992953723]},"#116699":{"lch":[41.090575936542443,55.3002439505846866,242.81143298809],"luv":[41.090575936542443,-25.2678118474637223,-49.189985418125],"rgb":[0.0666666666666666657,0.4,0.6],"xyz":[0.107314816578848629,0.119211816341775592,0.318734521742043919],"hpluv":[242.81143298809,170.774941475023041,41.090575936542443],"hsluv":[242.81143298809,96.2225162944548202,41.090575936542443]},"#1166aa":{"lch":[42.0363074660961757,67.6887016451143,248.882871092507173],"luv":[42.0363074660961757,-24.3865946332867658,-63.1431257746482615],"rgb":[0.0666666666666666657,0.4,0.66666666666666663],"xyz":[0.122372509544101171,0.125234893527876701,0.39803837135904252],"hpluv":[248.882871092507173,204.329442679703192,42.0363074660961757],"hsluv":[248.882871092507173,96.6284204735347885,42.0363074660961757]},"#1166bb":{"lch":[43.0764730814379746,80.16050208662584,252.853006907061769],"luv":[43.0764730814379746,-23.6332520973097289,-76.5974901030376429],"rgb":[0.0666666666666666657,0.4,0.733333333333333282],"xyz":[0.139510101651437818,0.132089930370811459,0.488296356457684266],"hpluv":[252.853006907061769,236.134594524550181,43.0764730814379746],"hsluv":[252.853006907061769,96.9958197331145,43.0764730814379746]},"#1166cc":{"lch":[44.2052232400861271,92.4179309088515737,255.583916344807051],"luv":[44.2052232400861271,-23.008531750755072,-89.5079964033815259],"rgb":[0.0666666666666666657,0.4,0.8],"xyz":[0.158802477095159544,0.139806880548300261,0.589902867127954367],"hpluv":[255.583916344807051,265.290671800528912,44.2052232400861271],"hsluv":[255.583916344807051,97.3240770235992159,44.2052232400861271]},"#1166dd":{"lch":[45.4162296513266455,104.336857924373376,257.542523527564185],"luv":[45.4162296513266455,-22.507022318245486,-101.880390006599782],"rgb":[0.0666666666666666657,0.4,0.866666666666666696],"xyz":[0.180320802645793088,0.148414210768553795,0.703232715027960364],"hpluv":[257.542523527564185,291.518421142394175,45.4162296513266455],"hsluv":[257.542523527564185,97.6147741074162,45.4162296513266455]},"#1166ee":{"lch":[46.7029335650228674,115.880201424536907,258.995545526323895],"luv":[46.7029335650228674,-22.1198283610194721,-113.74943637429719],"rgb":[0.0666666666666666657,0.4,0.933333333333333348],"xyz":[0.204132982911967853,0.157939082875023812,0.828643531096483588],"hpluv":[258.995545526323895,314.850514307077333,46.7029335650228674],"hsluv":[258.995545526323895,97.870742288996567,46.7029335650228674]},"#1166ff":{"lch":[48.0587511138394348,127.054293237547355,260.103604495506659],"luv":[48.0587511138394348,-21.8364562757409573,-125.163743182322264],"rgb":[0.0666666666666666657,0.4,1],"xyz":[0.230304031321799219,0.168407502238956508,0.966477719388265433],"hpluv":[260.103604495506659,335.471932494038299,48.0587511138394348],"hsluv":[260.103604495506659,99.9999999999992184,48.0587511138394348]},"#66ff00":{"lch":[89.0839511722278417,127.467952451328657,122.755484474710229],"luv":[89.0839511722278417,-68.9671698198214074,107.198919720201],"rgb":[0.4,1,0],"xyz":[0.41237801270657426,0.74342166657477,0.121763233231621706],"hpluv":[122.755484474710229,522.717702913530729,89.0839511722278417],"hsluv":[122.755484474710229,100.000000000002402,89.0839511722278417]},"#66ff11":{"lch":[89.1030144718140917,126.693355761899767,122.944319876693868],"luv":[89.1030144718140917,-68.8988566751164342,106.320994836735167],"rgb":[0.4,1,0.0666666666666666657],"xyz":[0.413389678206211364,0.743826332774625,0.127091338196377329],"hpluv":[122.944319876693868,520.53129302948,89.1030144718140917],"hsluv":[122.944319876693868,99.9999999999913456,89.1030144718140917]},"#66ff22":{"lch":[89.1383344673707825,125.268361506965746,123.29878008449495],"luv":[89.1383344673707825,-68.7729595958538482,104.70168300016438],"rgb":[0.4,1,0.133333333333333331],"xyz":[0.415265036344688421,0.744576476030015755,0.136968224392356536],"hpluv":[123.29878008449495,516.49933125362179,89.1383344673707825],"hsluv":[123.29878008449495,99.9999999999914877,89.1383344673707825]},"#66ff33":{"lch":[89.1964366933732,122.952924407393425,123.895139690212403],"luv":[89.1964366933732,-68.5677350303770368,102.0582546055644],"rgb":[0.4,1,0.2],"xyz":[0.418352787077146127,0.745811576322998881,0.153230378249967686],"hpluv":[123.895139690212403,509.920932540516333,89.1964366933732],"hsluv":[123.895139690212403,99.9999999999913456,89.1964366933732]},"#66ff44":{"lch":[89.2802097655713,119.677402261160566,124.785058224819977],"luv":[89.2802097655713,-68.2758869475835439,98.2908127624369143],"rgb":[0.4,1,0.266666666666666663],"xyz":[0.422810782321365042,0.747594774420686448,0.176709153202854324],"hpluv":[124.785058224819977,500.557479589511445,89.2802097655713],"hsluv":[124.785058224819977,99.9999999999914451,89.2802097655713]},"#66ff55":{"lch":[89.392045372062455,115.420778437487911,126.031255758612545],"luv":[89.392045372062455,-67.8935601171189802,93.3403481337991536],"rgb":[0.4,1,0.333333333333333315],"xyz":[0.428773196360727,0.749979740036431197,0.20811120047682824],"hpluv":[126.031255758612545,488.288652672415253,89.392045372062455],"hsluv":[126.031255758612545,99.9999999999912177,89.392045372062455]},"#66ff66":{"lch":[89.5339732348528088,110.211236984550467,127.715012949239977],"luv":[89.5339732348528088,-67.4199983006921428,87.1840615410833664],"rgb":[0.4,1,0.4],"xyz":[0.436358192134235212,0.753013738345834516,0.248058844883972174],"hpluv":[127.715012949239977,473.1190638884799,89.5339732348528088],"hsluv":[127.715012949239977,99.9999999999912177,89.5339732348528088]},"#66ff77":{"lch":[89.7077333531255,104.130085615398272,129.945267186452298],"luv":[89.7077333531255,-66.8572982376138754,79.8321764869086223],"rgb":[0.4,1,0.466666666666666674],"xyz":[0.445672205154437118,0.756739343553915367,0.297112646790370083],"hpluv":[129.945267186452298,455.203211628206077,89.7077333531255],"hsluv":[129.945267186452298,99.9999999999911466,89.7077333531255]},"#66ff88":{"lch":[89.9148190538961529,97.3190386909276413,132.870301628739924],"luv":[89.9148190538961529,-66.2101394375234378,71.3246992800528687],"rgb":[0.4,1,0.533333333333333326],"xyz":[0.456812622256380918,0.761195510394692909,0.355785510193942278],"hpluv":[132.870301628739924,434.894743355908361,89.9148190538961529],"hsluv":[132.870301628739924,99.999999999990834,89.9148190538961529]},"#66ff99":{"lch":[90.1565046807361,89.9924560427222247,136.692010716646195],"luv":[90.1565046807361,-65.4854512845448795,61.7276098246221707],"rgb":[0.4,1,0.6],"xyz":[0.469869586365453618,0.766418296038322122,0.424552187835060157],"hpluv":[136.692010716646195,412.835114866532763,90.1565046807361],"hsluv":[136.692010716646195,99.9999999999909903,90.1565046807361]},"#66ffaa":{"lch":[90.4338646074596113,82.4570841698328678,141.679424663280656],"luv":[90.4338646074596113,-64.6920148236146,51.1284064669742264],"rgb":[0.4,1,0.66666666666666663],"xyz":[0.484927279330706174,0.772441373224423189,0.503856037452058758],"hpluv":[141.679424663280656,390.10709074414774,90.4338646074596113],"hsluv":[141.679424663280656,99.9999999999905924,90.4338646074596113]},"#66ffbb":{"lch":[90.747787175062669,75.1410408914244101,148.168460326052468],"luv":[90.747787175062669,-63.84001546278364,39.631155067172358],"rgb":[0.4,1,0.733333333333333282],"xyz":[0.502064871438042792,0.779296410067358,0.59411402255070056],"hpluv":[148.168460326052468,368.486167720556807,90.747787175062669],"hsluv":[148.168460326052468,99.9999999999904077,90.747787175062669]},"#66ffcc":{"lch":[91.0989856399247486,68.6265957122477,156.512275503644645],"luv":[91.0989856399247486,-62.9405723747737085,27.3513068826366492],"rgb":[0.4,1,0.8],"xyz":[0.521357246881764547,0.787013360244846805,0.695720533220970716],"hpluv":[156.512275503644645,350.804850059399143,91.0989856399247486],"hsluv":[156.512275503644645,99.9999999999903508,91.0989856399247486]},"#66ffdd":{"lch":[91.4880074096490716,63.6578272942329875,166.916209854529029],"luv":[91.4880074096490716,-62.0052733715472826,14.410588119229697],"rgb":[0.4,1,0.866666666666666696],"xyz":[0.542875572432398146,0.795620690465100311,0.809050381120976714],"hpluv":[166.916209854529029,341.336295176875581,91.4880074096490716],"hsluv":[166.916209854529029,99.9999999999898819,91.4880074096490716]},"#66ffee":{"lch":[91.9152423718395113,61.0528599966611765,179.125088100836763],"luv":[91.9152423718395113,-61.045742111776633,0.93224663816584552],"rgb":[0.4,1,0.933333333333333348],"xyz":[0.566687752698572855,0.805145562571570328,0.934461197189499937],"hpluv":[179.125088100836763,345.840646438583576,91.9152423718395113],"hsluv":[179.125088100836763,99.9999999999894,91.9152423718395113]},"#66ffff":{"lch":[92.3809308294128,61.4559907165056,192.17705063006116],"luv":[92.3809308294128,-60.0732592166006256,-12.9631139022354667],"rgb":[0.4,1,1],"xyz":[0.592858801108404276,0.815613981935503,1.07229538548128178],"hpluv":[192.17705063006116,370.76546272919029,92.3809308294128],"hsluv":[192.17705063006116,99.9999999999889866,92.3809308294128]},"#117700":{"lch":[43.2300348418233042,65.6725964696673685,126.613348243544976],"luv":[43.2300348418233042,-39.1679175007181684,52.7139845365981],"rgb":[0.0666666666666666657,0.466666666666666674,0],"xyz":[0.0682769809733868721,0.133122662985059287,0.0220968131564111547],"hpluv":[126.613348243544976,192.769325646383436,43.2300348418233042],"hsluv":[126.613348243544976,100.000000000002359,43.2300348418233042]},"#117711":{"lch":[43.289989941732955,63.6505577690815443,127.715012949240403],"luv":[43.289989941732955,-38.9372319378938414,50.351618378457772],"rgb":[0.0666666666666666657,0.466666666666666674,0.0666666666666666657],"xyz":[0.0692886464730239904,0.13352732918491414,0.0274249181211667845],"hpluv":[127.715012949240403,186.57525992916959,43.289989941732955],"hsluv":[127.715012949240403,95.0000616991484321,43.289989941732955]},"#117722":{"lch":[43.400811094951429,60.069144786817489,129.889765673233825],"luv":[43.400811094951429,-38.5230987158151308,46.089836414888758],"rgb":[0.0666666666666666657,0.466666666666666674,0.133333333333333331],"xyz":[0.0711640046115010194,0.134277472440304968,0.037301804317145984],"hpluv":[129.889765673233825,175.627665872500842,43.400811094951429],"hsluv":[129.889765673233825,95.0973605906006725,43.400811094951429]},"#117733":{"lch":[43.5823807888255317,54.6433249694405205,133.881596062605809],"luv":[43.5823807888255317,-37.8771324094584756,39.3854770715327476],"rgb":[0.0666666666666666657,0.466666666666666674,0.2],"xyz":[0.074251755343958753,0.135512572733288067,0.0535639581747571272],"hpluv":[133.881596062605809,159.098283206795713,43.5823807888255317],"hsluv":[133.881596062605809,95.249567515942033,43.5823807888255317]},"#117744":{"lch":[43.8425891980029,47.8554364611196803,140.669149905405504],"luv":[43.8425891980029,-37.0161352468332083,30.3306533110056051],"rgb":[0.0666666666666666657,0.466666666666666674,0.266666666666666663],"xyz":[0.0787097505881776266,0.137295770830975661,0.0770427331276437588],"hpluv":[140.669149905405504,138.507858249946878,43.8425891980029],"hsluv":[140.669149905405504,95.4533619015585373,43.8425891980029]},"#117755":{"lch":[44.18711059062651,40.7988283335817243,151.872601466806259],"luv":[44.18711059062651,-35.9805491223838843,19.2339407882209947],"rgb":[0.0666666666666666657,0.466666666666666674,0.333333333333333315],"xyz":[0.0846721646275396256,0.139680736446720494,0.108444780401617674],"hpluv":[151.872601466806259,117.163251003272293,44.18711059062651],"hsluv":[151.872601466806259,95.7000805167539426,44.18711059062651]},"#117766":{"lch":[44.6197667240920879,35.4343089397309186,169.362936023125116],"luv":[44.6197667240920879,-34.8254110013137463,6.54071850990925796],"rgb":[0.0666666666666666657,0.466666666666666674,0.4],"xyz":[0.0922571604010478,0.142714734756123784,0.148392424808761636],"hpluv":[169.362936023125116,100.771099800457392,44.6197667240920879],"hsluv":[169.362936023125116,95.9777414193434453,44.6197667240920879]},"#117777":{"lch":[45.1427402486772138,34.384087641882445,192.177050630061217],"luv":[45.1427402486772138,-33.6104614986274584,-7.25274850066749],"rgb":[0.0666666666666666657,0.466666666666666674,0.466666666666666674],"xyz":[0.101571173421249716,0.146440339964204608,0.197446226715159545],"hpluv":[192.177050630061217,96.651570122263351,45.1427402486772138],"hsluv":[192.177050630061217,96.2732475219964385,45.1427402486772138]},"#117788":{"lch":[45.7567431438856502,38.9735922704815891,213.78628123605418],"luv":[45.7567431438856502,-32.3916401681270685,-21.6730833451154119],"rgb":[0.0666666666666666657,0.466666666666666674,0.533333333333333326],"xyz":[0.112711590523193544,0.150896506804982206,0.256119090118731685],"hpluv":[213.78628123605418,108.082320192335175,45.7567431438856502],"hsluv":[213.78628123605418,96.5742797371803192,45.7567431438856502]},"#117799":{"lch":[46.4611794427891169,47.8902134896154763,229.321579893426758],"luv":[46.4611794427891169,-31.2154548044213769,-36.3189747850083791],"rgb":[0.0666666666666666657,0.466666666666666674,0.6],"xyz":[0.125768554632266272,0.156119292448611363,0.32488576775984962],"hpluv":[229.321579893426758,130.796423620493698,46.4611794427891169],"hsluv":[229.321579893426758,96.8705519561321,46.4611794427891169]},"#1177aa":{"lch":[47.254315604307827,59.1280670765604199,239.379878554404911],"luv":[47.254315604307827,-30.1165063567495856,-50.8834389666627231],"rgb":[0.0666666666666666657,0.466666666666666674,0.66666666666666663],"xyz":[0.1408262475975188,0.162142369634712458,0.40418961737684822],"hpluv":[239.379878554404911,158.77844008322549,47.254315604307827],"hsluv":[239.379878554404911,97.1543662497403488,47.254315604307827]},"#1177bb":{"lch":[48.1334597651774914,71.3648635001192133,245.920143546346225],"luv":[48.1334597651774914,-29.1175429122131746,-65.1545273725937761],"rgb":[0.0666666666666666657,0.466666666666666674,0.733333333333333282],"xyz":[0.157963839704855447,0.168997406477647216,0.494447602475489967],"hpluv":[245.920143546346225,188.138070935962588,48.1334597651774914],"hsluv":[245.920143546346225,97.4206074841270464,48.1334597651774914]},"#1177cc":{"lch":[49.0951452720171488,83.8954152066927463,250.336037436893122],"luv":[49.0951452720171488,-28.2310616920000612,-79.0028344329863756],"rgb":[0.0666666666666666657,0.466666666666666674,0.8],"xyz":[0.177256215148577201,0.176714356655136018,0.596054113145760178],"hpluv":[250.336037436893122,216.83980339157776,49.0951452720171488],"hsluv":[250.336037436893122,97.666394869173061,49.0951452720171488]},"#1177dd":{"lch":[50.1353116048344702,96.3594544857749,253.441700788778064],"luv":[50.1353116048344702,-27.4615589113116805,-92.3634519220491512],"rgb":[0.0666666666666666657,0.466666666666666674,0.866666666666666696],"xyz":[0.198774540699210744,0.185321686875389552,0.709383961045766176],"hpluv":[253.441700788778064,243.887723915279508,50.1353116048344702],"hsluv":[253.441700788778064,97.8905898818146341,50.1353116048344702]},"#1177ee":{"lch":[51.2494756916451593,108.579054392530807,255.706052301270915],"luv":[51.2494756916451593,-26.8078049752198453,-105.217644172385562],"rgb":[0.0666666666666666657,0.466666666666666674,0.933333333333333348],"xyz":[0.222586720965385454,0.194846558981859597,0.834794777114289399],"hpluv":[255.706052301270915,268.841280267375566,51.2494756916451593],"hsluv":[255.706052301270915,98.0932983984315,51.2494756916451593]},"#1177ff":{"lch":[52.4328877873246739,120.474912105814852,257.407785454377859],"luv":[52.4328877873246739,-26.2648114927385947,-117.577056112809359],"rgb":[0.0666666666666666657,0.466666666666666674,1],"xyz":[0.248757769375216875,0.205314978345792293,0.972628965406071133],"hpluv":[257.407785454377859,291.562836812545811,52.4328877873246739],"hsluv":[257.407785454377859,99.9999999999990905,52.4328877873246739]},"#118800":{"lch":[49.1629818744817157,75.0325981068150725,126.891404302910644],"luv":[49.1629818744817157,-45.0420871994947447,60.0091756264985],"rgb":[0.0666666666666666657,0.533333333333333326,0],"xyz":[0.0903493506983573252,0.177267402435000831,0.0294542697314011],"hpluv":[126.891404302910644,193.664979881129256,49.1629818744817157],"hsluv":[126.891404302910644,100.000000000002487,49.1629818744817157]},"#118811":{"lch":[49.2125288978643,73.2988946552939211,127.715012949240403],"luv":[49.2125288978643,-44.8394509336223663,57.9840633075946883],"rgb":[0.0666666666666666657,0.533333333333333326,0.0666666666666666657],"xyz":[0.0913610161979944435,0.177672068634855684,0.0347823746961567343],"hpluv":[127.715012949240403,188.999680167490567,49.2125288978643],"hsluv":[127.715012949240403,96.2345237189928326,49.2125288978643]},"#118822":{"lch":[49.3041772439320312,70.1927728141533,129.31476933948187],"luv":[49.3041772439320312,-44.4727599639014315,54.3065279366352556],"rgb":[0.0666666666666666657,0.533333333333333326,0.133333333333333331],"xyz":[0.0932363743364714725,0.178422211890246513,0.0446592608921359269],"hpluv":[129.31476933948187,180.6541776618526,49.3041772439320312],"hsluv":[129.31476933948187,96.2899748067816859,49.3041772439320312]},"#118833":{"lch":[49.454516912369769,65.3819990709954766,132.170105234646456],"luv":[49.454516912369769,-43.8931572746598917,48.4581938064309767],"rgb":[0.0666666666666666657,0.533333333333333326,0.2],"xyz":[0.0963241250689292,0.179657312183229612,0.060921414749747077],"hpluv":[132.170105234646456,167.761213036429979,49.454516912369769],"hsluv":[132.170105234646456,96.3778002926358,49.454516912369769]},"#118844":{"lch":[49.6703617695526,59.1036258375550787,136.829676092870073],"luv":[49.6703617695526,-43.1056388924535057,40.4368950689726887],"rgb":[0.0666666666666666657,0.533333333333333326,0.266666666666666663],"xyz":[0.10078212031314808,0.181440510280917205,0.0844001897026337156],"hpluv":[136.829676092870073,150.9927614306973,49.6703617695526],"hsluv":[136.829676092870073,96.4975069627829356,49.6703617695526]},"#118855":{"lch":[49.9568473676091145,51.9652717779864091,144.176427678513875],"luv":[49.9568473676091145,-42.1346422468413806,30.4148219408018328],"rgb":[0.0666666666666666657,0.533333333333333326,0.333333333333333315],"xyz":[0.106744534352510079,0.183825475896662038,0.115802236976607617],"hpluv":[144.176427678513875,131.995007799011802,49.9568473676091145],"hsluv":[144.176427678513875,96.6457662191899658,49.9568473676091145]},"#118866":{"lch":[50.3177367885428879,45.0776565581224133,155.49998607369966],"luv":[50.3177367885428879,-41.0189171061503615,18.6934095394821433],"rgb":[0.0666666666666666657,0.533333333333333326,0.4],"xyz":[0.11432953012601825,0.186859474206065329,0.155749881383751593],"hpluv":[155.49998607369966,113.67882025976219,50.3177367885428879],"hsluv":[155.49998607369966,96.8171590628882512,50.3177367885428879]},"#118877":{"lch":[50.7555873970602391,40.2042284802375036,171.921706717236162],"luv":[50.7555873970602391,-39.8052806191025255,5.64974535051283322],"rgb":[0.0666666666666666657,0.533333333333333326,0.466666666666666674],"xyz":[0.12364354314622017,0.190585079414146152,0.204803683290149502],"hpluv":[171.921706717236162,100.514149141729121,50.7555873970602391],"hsluv":[171.921706717236162,97.0050762990714333,50.7555873970602391]},"#118888":{"lch":[51.2718664023781088,39.4294820301430349,192.17705063006116],"luv":[51.2718664023781088,-38.5423368357954814,-8.3169901046866368],"rgb":[0.0666666666666666657,0.533333333333333326,0.533333333333333326],"xyz":[0.134783960248164,0.19504124625492375,0.263476546693721669],"hpluv":[192.17705063006116,97.5845966821491118,51.2718664023781088],"hsluv":[192.17705063006116,97.2026219422035,51.2718664023781088]},"#118899":{"lch":[51.8670503792929907,43.7110075029310678,211.486174513119295],"luv":[51.8670503792929907,-37.2752705782940623,-22.8299448145688864],"rgb":[0.0666666666666666657,0.533333333333333326,0.6],"xyz":[0.147840924357236725,0.200264031898552908,0.332243224334839549],"hpluv":[211.486174513119295,106.93960912970239,51.8670503792929907],"hsluv":[211.486174513119295,97.4033619208845,51.8670503792929907]},"#1188aa":{"lch":[52.5407237145479371,52.059033028958666,226.184651315961702],"luv":[52.5407237145479371,-36.0423686073764102,-37.5644856890150507],"rgb":[0.0666666666666666657,0.533333333333333326,0.66666666666666663],"xyz":[0.162898617322489253,0.206287109084654,0.411547073951838149],"hpluv":[226.184651315961702,125.730132415512543,52.5407237145479371],"hsluv":[226.184651315961702,97.6018250350267,52.5407237145479371]},"#1188bb":{"lch":[53.2916815113449047,62.8295543710454396,236.286042109927791],"luv":[53.2916815113449047,-34.8733609598062557,-52.2628127623381573],"rgb":[0.0666666666666666657,0.533333333333333326,0.733333333333333282],"xyz":[0.1800362094298259,0.213142145927588761,0.501805059050479896],"hpluv":[236.286042109927791,149.604233097343041,53.2916815113449047],"hsluv":[236.286042109927791,97.7937430875757201,53.2916815113449047]},"#1188cc":{"lch":[54.1180375597057548,74.8024459991104607,243.146336149822275],"luv":[54.1180375597057548,-33.7892633498457826,-66.735984369188742],"rgb":[0.0666666666666666657,0.533333333333333326,0.8],"xyz":[0.199328584873547654,0.220859096105077563,0.60341156972075],"hpluv":[243.146336149822275,175.393335022858878,54.1180375597057548],"hsluv":[243.146336149822275,97.9760759990174819,54.1180375597057548]},"#1188dd":{"lch":[55.0173353812408266,87.2581949437380331,247.918019831454984],"luv":[55.0173353812408266,-32.8032215872693484,-80.8575366823396138],"rgb":[0.0666666666666666657,0.533333333333333326,0.866666666666666696],"xyz":[0.220846910424181198,0.229466426325331097,0.716741417620756],"hpluv":[247.918019831454984,201.254684785248685,55.0173353812408266],"hsluv":[247.918019831454984,98.1468934162311513,55.0173353812408266]},"#1188ee":{"lch":[55.9866591638471363,99.7959623087877645,251.344854654704591],"luv":[55.9866591638471363,-31.921869990719685,-94.5527805483930734],"rgb":[0.0666666666666666657,0.533333333333333326,0.933333333333333348],"xyz":[0.244659090690355907,0.238991298431801141,0.842152233689279273],"hpluv":[251.344854654704591,226.187053837960264,55.9866591638471363],"hsluv":[251.344854654704591,98.3051827042817,55.9866591638471363]},"#1188ff":{"lch":[57.0227411270994082,112.196885547184024,253.882464988485651],"luv":[57.0227411270994082,-31.1468293758358783,-107.786901552649141],"rgb":[0.0666666666666666657,0.533333333333333326,1],"xyz":[0.270830139100187328,0.249459717795733837,0.979986421981061118],"hpluv":[253.882464988485651,249.673263359937977,57.0227411270994082],"hsluv":[253.882464988485651,99.9999999999988916,57.0227411270994082]},"#119900":{"lch":[54.9698669410824721,84.160615619067471,127.079428544988929],"luv":[54.9698669410824721,-50.7422517332937772,67.1433772639973],"rgb":[0.0666666666666666657,0.6,0],"xyz":[0.116218951150824812,0.229006603339936526,0.0380774698822233526],"hpluv":[127.079428544988929,194.277964405092661,54.9698669410824721],"hsluv":[127.079428544988929,100.000000000002373,54.9698669410824721]},"#119911":{"lch":[55.0116447857556494,82.6558224500047,127.715012949240403],"luv":[55.0116447857556494,-50.563404981135136,65.3859852078442],"rgb":[0.0666666666666666657,0.6,0.0666666666666666657],"xyz":[0.11723061665046193,0.229411269539791379,0.0434055748469789823],"hpluv":[127.715012949240403,190.659367551848248,55.0116447857556494],"hsluv":[127.715012949240403,97.0796004133795094,55.0116447857556494]},"#119922":{"lch":[55.0889600096002852,79.9388272851777657,128.936266554168185],"luv":[55.0889600096002852,-50.237998627918941,62.1800579091938204],"rgb":[0.0666666666666666657,0.6,0.133333333333333331],"xyz":[0.119105974788938959,0.230161412795182208,0.0532824610429581819],"hpluv":[128.936266554168185,184.133380166819137,55.0889600096002852],"hsluv":[128.936266554168185,97.113065541928691,55.0889600096002852]},"#119933":{"lch":[55.215893256771821,75.6695179958245916,131.075562701176153],"luv":[55.215893256771821,-49.7189430335536,57.0429895547794175],"rgb":[0.0666666666666666657,0.6,0.2],"xyz":[0.122193725521396693,0.231396513088165307,0.0695446149005693182],"hpluv":[131.075562701176153,173.898642472918851,55.215893256771821],"hsluv":[131.075562701176153,97.1665253707361,55.215893256771821]},"#119944":{"lch":[55.398361036949,69.9528706873860671,134.469703140623466],"luv":[55.398361036949,-49.0042253731102591,49.9198358669935303],"rgb":[0.0666666666666666657,0.6,0.266666666666666663],"xyz":[0.126651720765615566,0.2331797111858529,0.0930233898534559567],"hpluv":[134.469703140623466,160.231519707698453,55.398361036949],"hsluv":[134.469703140623466,97.2403070889690184,55.398361036949]},"#119955":{"lch":[55.6409569880907497,63.1400511875114887,139.633471194580181],"luv":[55.6409569880907497,-48.1074656204671172,40.8942271664002206],"rgb":[0.0666666666666666657,0.6,0.333333333333333315],"xyz":[0.132614134804977579,0.235564676801597733,0.124425437127429872],"hpluv":[139.633471194580181,143.995747016857166,55.6409569880907497],"hsluv":[139.633471194580181,97.3331834328701575,55.6409569880907497]},"#119966":{"lch":[55.9472168173363,55.8918514512489466,147.340496807064056],"luv":[55.9472168173363,-47.0549257965888,30.1617807320125095],"rgb":[0.0666666666666666657,0.6,0.4],"xyz":[0.140199130578485737,0.238598675111001024,0.164373081534573834],"hpluv":[147.340496807064056,126.76791164907155,55.9472168173363],"hsluv":[147.340496807064056,97.4426708460479,55.9472168173363]},"#119977":{"lch":[56.319758368673476,49.2851425936320169,158.582299284916047],"luv":[56.319758368673476,-45.8816608646539308,17.9971796894826],"rgb":[0.0666666666666666657,0.6,0.466666666666666674],"xyz":[0.14951314359868767,0.242324280319081847,0.213426883440971743],"hpluv":[158.582299284916047,111.043862853999471,56.319758368673476],"hsluv":[158.582299284916047,97.5654087237770398,56.319758368673476]},"#119988":{"lch":[56.7603710001512951,44.8759084930006864,173.96527373508107],"luv":[56.7603710001512951,-44.6272223318454451,4.71785862613608131],"rgb":[0.0666666666666666657,0.6,0.533333333333333326],"xyz":[0.16065356070063147,0.246780447159859445,0.27209974684454391],"hpluv":[173.96527373508107,100.324581054675164,56.7603710001512951],"hsluv":[173.96527373508107,97.6975811674153647,56.7603710001512951]},"#119999":{"lch":[57.2700846473106822,44.3289506401906692,192.177050630061103],"luv":[57.2700846473106822,-43.3315696575835219,-9.35045110518458422],"rgb":[0.0666666666666666657,0.6,0.6],"xyz":[0.173710524809704198,0.252003232803488575,0.340866424485661845],"hpluv":[192.177050630061103,98.2197789195824384,57.2700846473106822],"hsluv":[192.177050630061103,97.8353178900151903,57.2700846473106822]},"#1199aa":{"lch":[57.849232550626823,48.3524707931101716,209.625127722111756],"luv":[57.849232550626823,-42.0317498411296384,-23.9017454821038378],"rgb":[0.0666666666666666657,0.6,0.66666666666666663],"xyz":[0.188768217774956726,0.258026309989589697,0.42017027410266039],"hpluv":[209.625127722111756,106.062142541807418,57.849232550626823],"hsluv":[209.625127722111756,97.9750198241805492,57.849232550626823]},"#1199bb":{"lch":[58.4975141278551263,56.1838887208170235,223.492153209811363],"luv":[58.4975141278551263,-40.7596491137071553,-38.6688551152037832],"rgb":[0.0666666666666666657,0.6,0.733333333333333282],"xyz":[0.2059058098822934,0.264881346832524456,0.510428259201302192],"hpluv":[223.492153209811363,121.8747424026255,58.4975141278551263],"hsluv":[223.492153209811363,98.1135798876595686,58.4975141278551263]},"#1199cc":{"lch":[59.2140605434028515,66.4726101728698211,233.498474693243395],"luv":[59.2140605434028515,-39.5408457239066138,-53.4334111079625274],"rgb":[0.0666666666666666657,0.6,0.8],"xyz":[0.225198185326015127,0.272598297010013257,0.612034769871572348],"hpluv":[233.498474693243395,142.448281943894045,59.2140605434028515],"hsluv":[233.498474693243395,98.2484961488154482,59.2140605434028515]},"#1199dd":{"lch":[59.9975033067865553,78.1149919905427907,240.560044488236258],"luv":[59.9975033067865553,-38.3943918665613637,-68.0281018909060151],"rgb":[0.0666666666666666657,0.6,0.866666666666666696],"xyz":[0.24671651087664867,0.281205627230266819,0.725364617771578346],"hpluv":[240.560044488236258,165.211601361935521,59.9975033067865553],"hsluv":[240.560044488236258,98.3778942246892285,59.9975033067865553]},"#1199ee":{"lch":[60.8460449735814706,90.4022578402124,245.60857134482],"luv":[60.8460449735814706,-37.3332566635070862,-82.3334450239084106],"rgb":[0.0666666666666666657,0.6,0.933333333333333348],"xyz":[0.270528691142823408,0.290730499336736836,0.850775433840101569],"hpluv":[245.60857134482,188.532510112076068,60.8460449735814706],"hsluv":[245.60857134482,98.5004851129029788,60.8460449735814706]},"#1199ff":{"lch":[61.7575303771721877,102.910627792409826,249.306643617498082],"luv":[61.7575303771721877,-36.3651553748586,-96.2713497733895167],"rgb":[0.0666666666666666657,0.6,1],"xyz":[0.296699739552654829,0.301198918700669505,0.988609622131883414],"hpluv":[249.306643617498082,211.450946466820028,61.7575303771721877],"hsluv":[249.306643617498082,99.9999999999986215,61.7575303771721877]},"#000000":{"lch":[0,0,0],"luv":[0,0,0],"rgb":[0,0,0],"xyz":[0,0,0],"hpluv":[0,0,0],"hsluv":[0,0,0]},"#000011":{"lch":[0.365533479526218952,1.47895322486610792,265.8743202181779],"luv":[0.365533479526218952,-0.106402530834795422,-1.47512072142377915],"rgb":[0,0,0.0666666666666666657],"xyz":[0.00101166549963712174,0.000404666199854854377,0.00532810496475563146],"hpluv":[265.8743202181779,513.41269684428039,0.365533479526218952],"hsluv":[265.8743202181779,100.000000000000867,0.365533479526218952]},"#000022":{"lch":[1.04313510374015572,4.22053823263236,265.8743202181779],"luv":[1.04313510374015572,-0.303644457367982512,-4.20960128950726],"rgb":[0,0,0.133333333333333331],"xyz":[0.0028870236381141408,0.00115480945524567245,0.0152049911607348275],"hpluv":[265.8743202181779,513.41269684428039,1.04313510374015572],"hsluv":[265.8743202181779,100.000000000000838,1.04313510374015572]},"#000033":{"lch":[2.15879662382733661,8.73451929157831,265.8743202181779],"luv":[2.15879662382733661,-0.62840050829424543,-8.71188498868810868],"rgb":[0,0,0.2],"xyz":[0.00597477437057188088,0.00238990974822878574,0.0314671450183459725],"hpluv":[265.8743202181779,513.412696844280276,2.15879662382733661],"hsluv":[265.8743202181779,100.000000000000838,2.15879662382733661]},"#000044":{"lch":[3.76955286085941,15.251660031516769,265.874320218177957],"luv":[3.76955286085941,-1.0972728545435857,-15.2121374566379668],"rgb":[0,0,0.266666666666666663],"xyz":[0.0104327696147907597,0.00417310784591636182,0.054945919971232611],"hpluv":[265.874320218177957,513.41269684428039,3.76955286085941],"hsluv":[265.874320218177957,100.000000000000981,3.76955286085941]},"#000055":{"lch":[5.92388346812606947,23.9681097618519345,265.8743202181779],"luv":[5.92388346812606947,-1.7243733575266309,-23.905999708860417],"rgb":[0,0,0.333333333333333315],"xyz":[0.0163951836541527535,0.00655807346166119385,0.0863479672452065194],"hpluv":[265.8743202181779,513.41269684428039,5.92388346812606947],"hsluv":[265.8743202181779,100.000000000000838,5.92388346812606947]},"#000066":{"lch":[8.64689012997685,34.9854302247980513,265.8743202181779],"luv":[8.64689012997685,-2.51700882467034193,-34.8947703043127149],"rgb":[0,0,0.4],"xyz":[0.0239801794276609283,0.00959207177106450627,0.126295611652350481],"hpluv":[265.8743202181779,513.412696844280276,8.64689012997685],"hsluv":[265.8743202181779,100.000000000000838,8.64689012997685]},"#000077":{"lch":[11.4958709948623863,46.5124439559768703,265.874320218177957],"luv":[11.4958709948623863,-3.34631391244679577,-46.3919133681426672],"rgb":[0,0,0.466666666666666674],"xyz":[0.0332941924478628443,0.0133176769791453226,0.17534941355874839],"hpluv":[265.874320218177957,513.412696844280276,11.4958709948623863],"hsluv":[265.874320218177957,100.000000000001,11.4958709948623863]},"#000088":{"lch":[14.2727431262745554,57.7477048111956535,265.874320218177957],"luv":[14.2727431262745554,-4.15462898927595781,-57.598059593379169],"rgb":[0,0,0.533333333333333326],"xyz":[0.0444346095498066723,0.0177738438199229153,0.234022276962320558],"hpluv":[265.874320218177957,513.41269684428039,14.2727431262745554],"hsluv":[265.874320218177957,100.000000000000952,14.2727431262745554]},"#000099":{"lch":[16.9872454361813823,68.7306165552763701,265.874320218177957],"luv":[16.9872454361813823,-4.94478893879780923,-68.5525106354185567],"rgb":[0,0,0.6],"xyz":[0.0574915736588793858,0.0229966294635520763,0.302788954603438465],"hpluv":[265.874320218177957,513.412696844280163,16.9872454361813823],"hsluv":[265.874320218177957,100.000000000000952,16.9872454361813823]},"#0000aa":{"lch":[19.6469460262523299,79.4917998262647529,265.8743202181779],"luv":[19.6469460262523299,-5.71899674710351302,-79.2858077831434116],"rgb":[0,0,0.66666666666666663],"xyz":[0.0725492666241319278,0.0290197066496531778,0.382092804220437066],"hpluv":[265.8743202181779,513.41269684428039,19.6469460262523299],"hsluv":[265.8743202181779,100.000000000000824,19.6469460262523299]},"#0000bb":{"lch":[22.2578820656552736,90.0556810893410926,265.8743202181779],"luv":[22.2578820656552736,-6.47900976369593895,-89.8223142039161644],"rgb":[0,0,0.733333333333333282],"xyz":[0.0896868587314685745,0.0358747434925879363,0.472350789319078812],"hpluv":[265.8743202181779,513.41269684428039,22.2578820656552736],"hsluv":[265.8743202181779,100.000000000000796,22.2578820656552736]},"#0000cc":{"lch":[24.8249727536546274,100.442163488877583,265.874320218177957],"luv":[24.8249727536546274,-7.22625991008361535,-100.18188146585355],"rgb":[0,0,0.8],"xyz":[0.108979234175190315,0.043591693670076738,0.573957299989349],"hpluv":[265.874320218177957,513.41269684428039,24.8249727536546274],"hsluv":[265.874320218177957,100.000000000001,24.8249727536546274]},"#0000dd":{"lch":[27.3522973211786535,110.667751646404724,265.8743202181779],"luv":[27.3522973211786535,-7.96193460279319343,-110.380971421034161],"rgb":[0,0,0.866666666666666696],"xyz":[0.130497559725823858,0.052199023890330272,0.687287147889355],"hpluv":[265.8743202181779,513.412696844280276,27.3522973211786535],"hsluv":[265.8743202181779,100.000000000000824,27.3522973211786535]},"#0000ee":{"lch":[29.8432887766479737,120.746335558760222,265.8743202181779],"luv":[29.8432887766479737,-8.68703315051946,-120.433438072283309],"rgb":[0,0,0.933333333333333348],"xyz":[0.154309739991998596,0.0617238959968003,0.812697963957878189],"hpluv":[265.8743202181779,513.41269684428039,29.8432887766479737],"hsluv":[265.8743202181779,100.000000000000838,29.8432887766479737]},"#0000ff":{"lch":[32.3008729039800215,130.68975298582734,265.8743202181779],"luv":[32.3008729039800215,-9.40240721482262,-130.351088503561101],"rgb":[0,0,1],"xyz":[0.18048078840183,0.072192315360733,0.95053215224966],"hpluv":[265.8743202181779,513.41269684428039,32.3008729039800215],"hsluv":[265.8743202181779,100.000000000000824,32.3008729039800215]},"#001100":{"lch":[3.62113466359794112,5.60448249758782424,127.715012949240474],"luv":[3.62113466359794112,-3.42845440085753106,4.43350025228474376],"rgb":[0,0.0666666666666666657,0],"xyz":[0.00200440026092840902,0.00400880052185687355,0.00066813342030945088],"hpluv":[127.715012949240474,196.394882900214469,3.62113466359794112],"hsluv":[127.715012949240474,100.000000000002217,3.62113466359794112]},"#001111":{"lch":[3.9866681431241604,3.15408977882195618,192.17705063006116],"luv":[3.9866681431241604,-3.08312421078118115,-0.665302512969894178],"rgb":[0,0.0666666666666666657,0.0666666666666666657],"xyz":[0.00301606576056553076,0.00441346672171172814,0.00599623838506508234],"hpluv":[192.17705063006116,100.392967527320764,3.9866681431241604],"hsluv":[192.17705063006116,99.9999999999914,3.9866681431241604]},"#001122":{"lch":[4.66426976733809706,7.30142401028103372,246.87889630792742],"luv":[4.66426976733809706,-2.86709314837997242,-6.71495118794031054],"rgb":[0,0.0666666666666666657,0.133333333333333331],"xyz":[0.00489142389904254939,0.005163609977102546,0.0158731245810442775],"hpluv":[246.87889630792742,198.638412351210178,4.66426976733809706],"hsluv":[246.87889630792742,99.9999999999921414,4.66426976733809706]},"#001133":{"lch":[5.77993128742527773,13.8979406242137369,257.974087263939282],"luv":[5.77993128742527773,-2.89569220292521434,-13.5929290537429299],"rgb":[0,0.0666666666666666657,0.2],"xyz":[0.00797917463150029,0.00639871027008565886,0.0321352784386554208],"hpluv":[257.974087263939282,305.117489912579458,5.77993128742527773],"hsluv":[257.974087263939282,99.9999999999925,5.77993128742527773]},"#001144":{"lch":[7.39068752445735111,21.802452480470059,261.611708702028636],"luv":[7.39068752445735111,-3.1805605696034065,-21.569213444774455],"rgb":[0,0.0666666666666666657,0.266666666666666663],"xyz":[0.0124371698757191687,0.00818190836777323537,0.0556140533915420593],"hpluv":[261.611708702028636,374.334482048802613,7.39068752445735111],"hsluv":[261.611708702028636,99.9999999999929656,7.39068752445735111]},"#001155":{"lch":[9.4550232844459714,31.0886305445366773,263.238579866128873],"luv":[9.4550232844459714,-3.6602302532303379,-30.8724094237562916],"rgb":[0,0.0666666666666666657,0.333333333333333315],"xyz":[0.0183995839150811608,0.0105668739835180665,0.0870161006655159747],"hpluv":[263.238579866128873,417.232678203522596,9.4550232844459714],"hsluv":[263.238579866128873,99.9999999999929514,9.4550232844459714]},"#001166":{"lch":[11.6894020192987682,40.9340765206813302,264.100423242359113],"luv":[11.6894020192987682,-4.20741678933990659,-40.7172723123955791],"rgb":[0,0.0666666666666666657,0.4],"xyz":[0.025984579688589339,0.0136008722929213798,0.126963745072659923],"hpluv":[264.100423242359113,444.357002567308371,11.6894020192987682],"hsluv":[264.100423242359113,99.9999999999928235,11.6894020192987682]},"#001177":{"lch":[14.0165943101603965,51.0460922578313898,264.608714664977526],"luv":[14.0165943101603965,-4.79613195559092276,-50.8202779710972621],"rgb":[0,0.0666666666666666657,0.466666666666666674],"xyz":[0.0352985927087912515,0.0173264775010021979,0.176017546979057832],"hpluv":[264.608714664977526,462.124851551559573,14.0165943101603965],"hsluv":[264.608714664977526,99.9999999999931504,14.0165943101603965]},"#001188":{"lch":[16.3962585295353378,61.2721603523949625,264.931782730652174],"luv":[16.3962585295353378,-5.41289085195630371,-61.0325998698597871],"rgb":[0,0.0666666666666666657,0.533333333333333326],"xyz":[0.0464390098107350796,0.0217826443417797888,0.23469041038263],"hpluv":[264.931782730652174,474.195864485329537,16.3962585295353378],"hsluv":[264.931782730652174,99.9999999999933209,16.3962585295353378]},"#001199":{"lch":[18.8023327262484941,71.5200065602600148,265.148843888859801],"luv":[18.8023327262484941,-6.04826966448705239,-71.2638040834565771],"rgb":[0,0.0666666666666666657,0.6],"xyz":[0.059495973919807793,0.0270054299854089498,0.303457088023747934],"hpluv":[265.148843888859801,482.675370310212884,18.8023327262484941],"hsluv":[265.148843888859801,99.9999999999930651,18.8023327262484941]},"#0011aa":{"lch":[21.2181090603332123,81.7349311996174919,265.301088447161305],"luv":[21.2181090603332123,-6.69569086805443892,-81.4602154551880488],"rgb":[0,0.0666666666666666657,0.66666666666666663],"xyz":[0.0745536668850603351,0.0330285071715100548,0.382760937640746535],"hpluv":[265.301088447161305,488.81030222212587,21.2181090603332123],"hsluv":[265.301088447161305,99.9999999999931788,21.2181090603332123]},"#0011bb":{"lch":[23.6329047323064216,91.8852368853417,265.411605614461337],"luv":[23.6329047323064216,-7.35054503717070418,-91.590754146539723],"rgb":[0,0.0666666666666666657,0.733333333333333282],"xyz":[0.0916912589923969817,0.0398835440144448133,0.473018922739388281],"hpluv":[265.411605614461337,493.364573724961247,23.6329047323064216],"hsluv":[265.411605614461337,99.999999999993,23.6329047323064216]},"#0011cc":{"lch":[26.0399131129061345,101.953231398784169,265.494123438592396],"luv":[26.0399131129061345,-8.00958293333115,-101.638122640513785],"rgb":[0,0.0666666666666666657,0.8],"xyz":[0.110983634436118722,0.047600494191933615,0.574625433409658437],"hpluv":[265.494123438592396,496.821968194535657,26.0399131129061345],"hsluv":[265.494123438592396,99.9999999999927383,26.0399131129061345]},"#0011dd":{"lch":[28.43483595206839,111.929749681002491,265.557201901085818],"luv":[28.43483595206839,-8.67050070949402496,-111.593419524175076],"rgb":[0,0.0666666666666666657,0.866666666666666696],"xyz":[0.132501959986752266,0.056207824412187149,0.687955281309664435],"hpluv":[265.557201901085818,499.498435149301031,28.43483595206839],"hsluv":[265.557201901085818,99.9999999999932214,28.43483595206839]},"#0011ee":{"lch":[30.8150119654139019,121.810820553676152,265.60639254385444],"luv":[30.8150119654139019,-9.33165721729429798,-121.452855781734542],"rgb":[0,0.0666666666666666657,0.933333333333333348],"xyz":[0.156314140252927,0.0657326965186571799,0.813366097378187658],"hpluv":[265.60639254385444,501.606152289563909,30.8150119654139019],"hsluv":[265.60639254385444,99.9999999999933635,30.8150119654139019]},"#0011ff":{"lch":[33.1788572452669683,131.59562707663585,265.645416939351662],"luv":[33.1788572452669683,-9.99188030865750321,-131.215743695604147],"rgb":[0,0.0666666666666666657,1],"xyz":[0.182485188662758396,0.076201115882589876,0.951200285669969503],"hpluv":[265.645416939351662,503.291227463659,33.1788572452669683],"hsluv":[265.645416939351662,99.9999999999995,33.1788572452669683]},"#55aa00":{"lch":[62.2364297391950743,84.7105424007581291,119.071642820441127],"luv":[62.2364297391950743,-41.1610955154551661,74.0380997176333437],"rgb":[0.333333333333333315,0.66666666666666663,0],"xyz":[0.181203244729902568,0.306798408854291604,0.0496696976001293408],"hpluv":[119.071642820441127,172.715819722381468,62.2364297391950743],"hsluv":[119.071642820441127,100.00000000000216,62.2364297391950743]},"#55aa11":{"lch":[62.270812500354296,83.3839078255156352,119.512873370738717],"luv":[62.270812500354296,-41.0765057562956173,72.5644317769187808],"rgb":[0.333333333333333315,0.66666666666666663,0.0666666666666666657],"xyz":[0.182214910229539701,0.307203075054146457,0.0549978025648849705],"hpluv":[119.512873370738717,169.917081036602212,62.270812500354296],"hsluv":[119.512873370738717,97.826098763204655,62.270812500354296]},"#55aa22":{"lch":[62.3344691942433826,80.9675552156414,120.358690899927907],"luv":[62.3344691942433826,-40.9219560187625078,69.8651451955580285],"rgb":[0.333333333333333315,0.66666666666666663,0.133333333333333331],"xyz":[0.184090268368016702,0.307953218309537258,0.0648746887608641631],"hpluv":[120.358690899927907,164.824621464176317,62.3344691942433826],"hsluv":[120.358690899927907,93.8493385636837729,62.3344691942433826]},"#55aa33":{"lch":[62.4390542004851312,77.1100321042589343,121.835090998601942],"luv":[62.4390542004851312,-40.6737079775314143,65.5103543760705094],"rgb":[0.333333333333333315,0.66666666666666663,0.2],"xyz":[0.187178019100474435,0.309188318602520384,0.0811368426184753133],"hpluv":[121.835090998601942,156.708983850290963,62.4390542004851312],"hsluv":[121.835090998601942,87.4478443822902,62.4390542004851312]},"#55aa44":{"lch":[62.5895604608427192,71.8060360850404322,124.168545167949461],"luv":[62.5895604608427192,-40.3283690350335959,59.4115264003566281],"rgb":[0.333333333333333315,0.66666666666666663,0.266666666666666663],"xyz":[0.191636014344693323,0.310971516700207951,0.104615617571361952],"hpluv":[124.168545167949461,145.578881327618376,62.5895604608427192],"hsluv":[124.168545167949461,78.5131262768233569,62.5895604608427192]},"#55aa55":{"lch":[62.7899606618147317,65.2067785819955361,127.715012949239551],"luv":[62.7899606618147317,-39.8892256495404212,51.582687503865472],"rgb":[0.333333333333333315,0.66666666666666663,0.333333333333333315],"xyz":[0.197598428384055336,0.313356482315952811,0.136017664845335867],"hpluv":[127.715012949239551,131.777681042751937,62.7899606618147317],"hsluv":[127.715012949239551,67.0983271543339583,62.7899606618147317]},"#55aa66":{"lch":[63.0434325957243402,57.6560159218084,133.059858461454269],"luv":[63.0434325957243402,-39.3653397911167744,42.1258376190401904],"rgb":[0.333333333333333315,0.66666666666666663,0.4],"xyz":[0.205183424157563493,0.31639048062535613,0.175965309252479829],"hpluv":[133.059858461454269,116.049721847977636,63.0434325957243402],"hsluv":[133.059858461454269,68.1368400599560289,63.0434325957243402]},"#55aa77":{"lch":[63.3524771250310863,49.7736139598232441,141.163090238883626],"luv":[63.3524771250310863,-38.7703675351212311,31.2133184364163512],"rgb":[0.333333333333333315,0.66666666666666663,0.466666666666666674],"xyz":[0.214497437177765427,0.320116085833436925,0.225019111158877738],"hpluv":[141.163090238883626,99.6953496544650903,63.3524771250310863],"hsluv":[141.163090238883626,69.3257510819996696,63.3524771250310863]},"#55aa88":{"lch":[63.7189896387035901,42.62351374085884,153.427389325734708],"luv":[63.7189896387035901,-38.1211143540371324,19.0668446268281784],"rgb":[0.333333333333333315,0.66666666666666663,0.533333333333333326],"xyz":[0.225637854279709227,0.324572252674214523,0.283691974562449878],"hpluv":[153.427389325734708,84.882799477410984,63.7189896387035901],"hsluv":[153.427389325734708,70.6362499177174783,63.7189896387035901]},"#55aa99":{"lch":[64.1443101574831473,37.9035590936142697,170.991128647613664],"luv":[64.1443101574831473,-37.4359848569684885,5.93521943587048106],"rgb":[0.333333333333333315,0.66666666666666663,0.6],"xyz":[0.238694818388781954,0.329795038317843681,0.352458652203567813],"hpluv":[170.991128647613664,74.9827180661079211,64.1443101574831473],"hsluv":[170.991128647613664,72.0364673991159918,64.1443101574831473]},"#55aaaa":{"lch":[64.6292640862610881,37.5790288142004414,192.177050630061],"luv":[64.6292640862610881,-36.7335179653569526,-7.92666793219602717],"rgb":[0.333333333333333315,0.66666666666666663,0.66666666666666663],"xyz":[0.253752511354034482,0.335818115503944803,0.431762501820566413],"hpluv":[192.177050630061,73.7828909738526,64.6292640862610881],"hsluv":[192.177050630061,73.4940830927894808,64.6292640862610881]},"#55aabb":{"lch":[65.1741997434662466,42.3607987370151307,211.725401595501864],"luv":[65.1741997434662466,-36.0311661131296148,-22.2753751520813346],"rgb":[0.333333333333333315,0.66666666666666663,0.733333333333333282],"xyz":[0.270890103461371157,0.342673152346879561,0.522020486919208104],"hpluv":[211.725401595501864,82.4760322189960249,65.1741997434662466],"hsluv":[211.725401595501864,74.9784994025983,65.1741997434662466]},"#55aacc":{"lch":[65.7790257871148327,51.0903516363502916,226.227071697937646],"luv":[65.7790257871148327,-35.3444111183519212,-36.8916878581455236],"rgb":[0.333333333333333315,0.66666666666666663,0.8],"xyz":[0.290182478905092855,0.350390102524368363,0.62362699758947826],"hpluv":[226.227071697937646,98.5577501957325808,65.7790257871148327],"hsluv":[226.227071697937646,76.4624197891718,65.7790257871148327]},"#55aadd":{"lch":[66.4432499478878071,62.1650528283955595,236.084470311275709],"luv":[66.4432499478878071,-34.6862381636523693,-51.5883579425784404],"rgb":[0.333333333333333315,0.66666666666666663,0.866666666666666696],"xyz":[0.311700804455726455,0.358997432744621869,0.736956845489484258],"hpluv":[236.084470311275709,118.722973851074883,66.4432499478878071],"hsluv":[236.084470311275709,77.9227939155192928,66.4432499478878071]},"#55aaee":{"lch":[67.1660194476775274,74.4631251020179832,242.774049894046698],"luv":[67.1660194476775274,-34.0669326024190866,-66.2133000462974763],"rgb":[0.333333333333333315,0.66666666666666663,0.933333333333333348],"xyz":[0.335512984721901164,0.368522304851091886,0.862367661558007481],"hpluv":[242.774049894046698,140.679551339708695,67.1660194476775274],"hsluv":[242.774049894046698,80.7550915423080085,67.1660194476775274]},"#55aaff":{"lch":[67.9461628502375135,87.3278464079016,247.446578213330071],"luv":[67.9461628502375135,-33.4941307575646476,-80.6492155140842897],"rgb":[0.333333333333333315,0.66666666666666663,1],"xyz":[0.361684033131732585,0.37899072421502461,1.00020184984978933],"hpluv":[247.446578213330071,163.089927997179217,67.9461628502375135],"hsluv":[247.446578213330071,99.9999999999981,67.9461628502375135]},"#002200":{"lch":[10.1376941245203973,15.6902558355344119,127.715012949240474],"luv":[10.1376941245203973,-9.59826829561359141,12.4119850914324186],"rgb":[0,0.133333333333333331,0],"xyz":[0.00572002399569634425,0.0114400479913928481,0.00190667466523206119],"hpluv":[127.715012949240474,196.394882900214583,10.1376941245203973],"hsluv":[127.715012949240474,100.000000000002331,10.1376941245203973]},"#002211":{"lch":[10.4423176349325608,11.2803579121031614,143.951720967420982],"luv":[10.4423176349325608,-9.12041102953238614,6.63811549142769763],"rgb":[0,0.133333333333333331,0.0666666666666666657],"xyz":[0.00673168949533346599,0.0118447141912477027,0.00723477962998769243],"hpluv":[143.951720967420982,137.077225818420459,10.4423176349325608],"hsluv":[143.951720967420982,99.9999999999911,10.4423176349325608]},"#002222":{"lch":[10.9891417742670896,8.69416226881610399,192.17705063006116],"luv":[10.9891417742670896,-8.49854762011842,-1.83388819318003415],"rgb":[0,0.133333333333333331,0.133333333333333331],"xyz":[0.00860704763381048461,0.0125948574466385205,0.0171116658259668902],"hpluv":[192.17705063006116,100.392967527320849,10.9891417742670896],"hsluv":[192.17705063006116,99.9999999999915,10.9891417742670896]},"#002233":{"lch":[11.8439988341371283,14.4341695325786503,236.81663495428262],"luv":[11.8439988341371283,-7.90011340243738758,-12.0802921456333543],"rgb":[0,0.133333333333333331,0.2],"xyz":[0.0116947983662682251,0.0138299577396216334,0.0333738196835780335],"hpluv":[236.81663495428262,154.643892414528665,11.8439988341371283],"hsluv":[236.81663495428262,99.9999999999918572,11.8439988341371283]},"#002244":{"lch":[12.9926705590666103,23.9154033254141893,251.756603241059679],"luv":[12.9926705590666103,-7.48682111947174356,-22.713300635140282],"rgb":[0,0.133333333333333331,0.266666666666666663],"xyz":[0.0161527936104871039,0.0156131558373092099,0.056852594636464672],"hpluv":[251.756603241059679,233.570832873869165,12.9926705590666103],"hsluv":[251.756603241059679,99.9999999999922551,12.9926705590666103]},"#002255":{"lch":[14.3995425627967926,34.0053227001087492,257.612107564284656],"luv":[14.3995425627967926,-7.29512566501762105,-33.2135983216232162],"rgb":[0,0.133333333333333331,0.333333333333333315],"xyz":[0.022115207649849096,0.0179981214530540411,0.0882546419104385804],"hpluv":[257.612107564284656,299.666041626864057,14.3995425627967926],"hsluv":[257.612107564284656,99.9999999999922551,14.3995425627967926]},"#002266":{"lch":[16.0198287291043684,44.1221041927951489,260.479541157990241],"luv":[16.0198287291043684,-7.29778599254304705,-43.514392998258792],"rgb":[0,0.133333333333333331,0.4],"xyz":[0.0297002034233572743,0.0210321197624573561,0.128202286317582542],"hpluv":[260.479541157990241,349.492349810916096,16.0198287291043684],"hsluv":[260.479541157990241,99.9999999999926672,16.0198287291043684]},"#002277":{"lch":[17.8086814865908138,54.1839210795750787,262.094384047744654],"luv":[17.8086814865908138,-7.45254493353373,-53.6689563674502708],"rgb":[0,0.133333333333333331,0.466666666666666674],"xyz":[0.0390142164435591868,0.0247577249705381724,0.177256088223980451],"hpluv":[262.094384047744654,386.080609388904179,17.8086814865908138],"hsluv":[262.094384047744654,99.9999999999926246,17.8086814865908138]},"#002288":{"lch":[19.7262797638069571,64.1945165648047862,263.091662768615947],"luv":[19.7262797638069571,-7.7213996360385595,-63.7284547486409778],"rgb":[0,0.133333333333333331,0.533333333333333326],"xyz":[0.0501546335455030148,0.0292138918113157633,0.235928951627552619],"hpluv":[263.091662768615947,412.944865974292611,19.7262797638069571],"hsluv":[263.091662768615947,99.9999999999928093,19.7262797638069571]},"#002299":{"lch":[21.7396965211461932,74.1610579713059082,263.749129578079874],"luv":[21.7396965211461932,-8.0748025544340809,-73.7201470639492129],"rgb":[0,0.133333333333333331,0.6],"xyz":[0.0632115976545757352,0.0344366774549449278,0.304695629268670554],"hpluv":[263.749129578079874,432.874263951475,21.7396965211461932],"hsluv":[263.749129578079874,99.9999999999928662,21.7396965211461932]},"#0022aa":{"lch":[23.8228560713303921,84.0831956926279389,264.204285416148139],"luv":[23.8228560713303921,-8.49087961251211532,-83.6533846373868641],"rgb":[0,0.133333333333333331,0.66666666666666663],"xyz":[0.0782692906198282773,0.0404597546410460224,0.383999478885669154],"hpluv":[264.204285416148139,447.872821658188343,23.8228560713303921],"hsluv":[264.204285416148139,99.9999999999925251,23.8228560713303921]},"#0022bb":{"lch":[25.9556350824861326,93.9557715434331868,264.531619021467236],"luv":[25.9556350824861326,-8.95364890679069,-93.5281731756572725],"rgb":[0,0.133333333333333331,0.733333333333333282],"xyz":[0.0954068827271649239,0.0473147914839807809,0.474257463984310901],"hpluv":[264.531619021467236,459.336683180505304,25.9556350824861326],"hsluv":[264.531619021467236,99.9999999999932783,25.9556350824861326]},"#0022cc":{"lch":[28.122733334265547,103.772183036952711,264.774345627526145],"luv":[28.122733334265547,-9.45141286238599143,-103.340876555018355],"rgb":[0,0.133333333333333331,0.8],"xyz":[0.114699258170886664,0.0550317416614695826,0.575863974654581057],"hpluv":[264.774345627526145,468.233789407088068,28.122733334265547],"hsluv":[264.774345627526145,99.9999999999932,28.122733334265547]},"#0022dd":{"lch":[30.3126112219004114,113.526334495176528,264.958927468127968],"luv":[30.3126112219004114,-9.97554123069502552,-113.087210599012522],"rgb":[0,0.133333333333333331,0.866666666666666696],"xyz":[0.136217583721520208,0.0636390718817231166,0.689193822554587],"hpluv":[264.958927468127968,475.239568383116307,30.3126112219004114],"hsluv":[264.958927468127968,99.9999999999930651,30.3126112219004114]},"#0022ee":{"lch":[32.516600051948771,123.213441320075319,265.102292473050682],"luv":[32.516600051948771,-10.519601137712538,-122.76355368691101],"rgb":[0,0.133333333333333331,0.933333333333333348],"xyz":[0.160029763987694945,0.0731639439881931475,0.814604638623110278],"hpluv":[265.102292473050682,480.830806343612153,32.516600051948771],"hsluv":[265.102292473050682,99.9999999999931504,32.516600051948771]},"#0022ff":{"lch":[34.728199222084136,132.830192238289243,265.215668718406278],"luv":[34.728199222084136,-11.0787458291525667,-132.367372720447662],"rgb":[0,0.133333333333333331,1],"xyz":[0.186200812397526339,0.0836323633521258575,0.952438826914892123],"hpluv":[265.215668718406278,485.348691920142073,34.728199222084136],"hsluv":[265.215668718406278,99.9999999999995595,34.728199222084136]},"#55bb00":{"lch":[67.6287132051522093,94.1564927152114421,120.799924159261636],"luv":[67.6287132051522093,-48.2120532219748839,80.8767150949587403],"rgb":[0.333333333333333315,0.733333333333333282,0],"xyz":[0.215157742638501348,0.374707404671490163,0.0609878635696619598],"hpluv":[120.799924159261636,176.668237076728246,67.6287132051522093],"hsluv":[120.799924159261636,100.000000000002245,67.6287132051522093]},"#55bb11":{"lch":[67.658807387059241,92.983820197622,121.168613223743336],"luv":[67.658807387059241,-48.1245535730997,79.5614112615755],"rgb":[0.333333333333333315,0.733333333333333282,0.0666666666666666657],"xyz":[0.21616940813813848,0.375112070871345,0.0663159685344176],"hpluv":[121.168613223743336,174.390319462510746,67.658807387059241],"hsluv":[121.168613223743336,98.2170484527892853,67.658807387059241]},"#55bb22":{"lch":[67.7145367797011,90.8418307914021739,121.8702408444057],"luv":[67.7145367797011,-47.9642424389893733,77.1470651987980318],"rgb":[0.333333333333333315,0.733333333333333282,0.133333333333333331],"xyz":[0.218044766276615481,0.375862214126735816,0.076192854730396789],"hpluv":[121.8702408444057,170.232819736279453,67.7145367797011],"hsluv":[121.8702408444057,94.9476871157098401,67.7145367797011]},"#55bb33":{"lch":[67.8061331119394595,87.4049119918652337,123.079288563119889],"luv":[67.8061331119394595,-47.7055226907732077,73.2379802090816128],"rgb":[0.333333333333333315,0.733333333333333282,0.2],"xyz":[0.221132517009073215,0.377097314419718943,0.0924550085880079253],"hpluv":[123.079288563119889,163.570954697809668,67.8061331119394595],"hsluv":[123.079288563119889,89.6636954368763526,67.8061331119394595]},"#55bb44":{"lch":[67.9380247917114701,82.6396215824211851,124.951716096499126],"luv":[67.9380247917114701,-47.3430758547011195,67.7343356349037293],"rgb":[0.333333333333333315,0.733333333333333282,0.266666666666666663],"xyz":[0.225590512253292103,0.378880512517406509,0.115933783540894564],"hpluv":[124.951716096499126,154.352877500253584,67.9380247917114701],"hsluv":[124.951716096499126,82.2446152582935213,67.9380247917114701]},"#55bb55":{"lch":[68.1137800414251,76.6309713561306154,127.715012949239735],"luv":[68.1137800414251,-46.8777966745344372,60.6199467990950964],"rgb":[0.333333333333333315,0.733333333333333282,0.333333333333333315],"xyz":[0.231552926292654115,0.38126547813315137,0.147335830814868479],"hpluv":[127.715012949239735,142.760701907139094,68.1137800414251],"hsluv":[127.715012949239735,72.6906423420812189,68.1137800414251]},"#55bb66":{"lch":[68.3363083667640723,69.6002362161904813,131.717534816394789],"luv":[68.3363083667640723,-46.3160914021311,51.9520216986687728],"rgb":[0.333333333333333315,0.733333333333333282,0.4],"xyz":[0.239137922066162273,0.384299476442554688,0.187283475222012441],"hpluv":[131.717534816394789,129.240469264566769,68.3363083667640723],"hsluv":[131.717534816394789,73.4099839145656432,68.3363083667640723]},"#55bb77":{"lch":[68.6079661831172416,61.943926665161591,137.498849513297245],"luv":[68.6079661831172416,-45.6690129611091,41.8496273084595956],"rgb":[0.333333333333333315,0.733333333333333282,0.466666666666666674],"xyz":[0.248451935086364206,0.388025081650635484,0.23633727712841035],"hpluv":[137.498849513297245,114.568047908441656,68.6079661831172416],"hsluv":[137.498849513297245,74.2430874467708719,68.6079661831172416]},"#55bb88":{"lch":[68.930619778887035,54.3103726013937376,145.860320527647957],"luv":[68.930619778887035,-44.9511677919681389,30.4796503628330058],"rgb":[0.333333333333333315,0.733333333333333282,0.533333333333333326],"xyz":[0.259592352188308,0.392481248491413082,0.29501014053198249],"hpluv":[145.860320527647957,99.9792617157038421,68.930619778887035],"hsluv":[145.860320527647957,75.173468866550067,68.930619778887035]},"#55bb99":{"lch":[69.3056876145919176,47.7211055743842465,157.786981113384826],"luv":[69.3056876145919176,-44.1794697421466793,18.0410191104680564],"rgb":[0.333333333333333315,0.733333333333333282,0.6],"xyz":[0.272649316297380762,0.397704034135042239,0.363776818173100425],"hpluv":[157.786981113384826,87.3737441175344713,69.3056876145919176],"hsluv":[157.786981113384826,76.1818306173187807,69.3056876145919176]},"#55bbaa":{"lch":[69.7341725511637378,43.6310575063277497,173.751690425302456],"luv":[69.7341725511637378,-43.37186937951342,4.74869725787034813],"rgb":[0.333333333333333315,0.733333333333333282,0.66666666666666663],"xyz":[0.287707009262633262,0.403727111321143362,0.443080667790099],"hpluv":[173.751690425302456,79.3943164161001675,69.7341725511637378],"hsluv":[173.751690425302456,77.247554342351421,69.7341725511637378]},"#55bbbb":{"lch":[70.2166895771587605,43.5254926875218899,192.177050630061075],"luv":[70.2166895771587605,-42.5461891389785691,-9.18097508120914796],"rgb":[0.333333333333333315,0.733333333333333282,0.733333333333333282],"xyz":[0.304844601369969936,0.41058214816407812,0.533338652888740716],"hpluv":[192.177050630061075,78.6579587560082274,70.2166895771587605],"hsluv":[192.177050630061075,78.350068429440185,70.2166895771587605]},"#55bbcc":{"lch":[70.753492069254392,47.9033609117661214,209.436295084806801],"luv":[70.753492069254392,-41.719164640327179,-23.5423721905035848],"rgb":[0.333333333333333315,0.733333333333333282,0.8],"xyz":[0.324136976813691691,0.418299098341566922,0.634945163559010872],"hpluv":[209.436295084806801,85.9127126132272849,70.753492069254392],"hsluv":[209.436295084806801,79.4699741443966445,70.753492069254392]},"#55bbdd":{"lch":[71.3444981992470701,55.9344204047748121,223.003151043067675],"luv":[71.3444981992470701,-40.905747403701568,-38.1494327004039633],"rgb":[0.333333333333333315,0.733333333333333282,0.866666666666666696],"xyz":[0.345655302364325179,0.426906428561820428,0.74827501145901687],"hpluv":[223.003151043067675,99.4850863142100081,71.3444981992470701],"hsluv":[223.003151043067675,80.5898663629362,71.3444981992470701]},"#55bbee":{"lch":[71.9893182406489,66.3452770137575385,232.793079173014576],"luv":[71.9893182406489,-40.1186787976363846,-52.8411524624918272],"rgb":[0.333333333333333315,0.733333333333333282,0.933333333333333348],"xyz":[0.369467482630499944,0.436431300668290445,0.873685827527540093],"hpluv":[232.793079173014576,116.944897502912525,71.9893182406489],"hsluv":[232.793079173014576,81.6948376758296888,71.9893182406489]},"#55bbff":{"lch":[72.6872829834048417,78.1278426582451146,239.741904567598624],"luv":[72.6872829834048417,-39.3683093588317803,-67.4840426816504788],"rgb":[0.333333333333333315,0.733333333333333282,1],"xyz":[0.395638531040331309,0.446899720032223169,1.01152001581932205],"hpluv":[239.741904567598624,136.39131713467242,72.6872829834048417],"hsluv":[239.741904567598624,99.9999999999976126,72.6872829834048417]},"#003300":{"lch":[17.3086983277836381,26.7889227675687067,127.71501294924046],"luv":[17.3086983277836381,-16.3877039844862402,21.1917328494772867],"rgb":[0,0.2,0],"xyz":[0.0118377460847071559,0.0236754921694146449,0.00394591536156894181],"hpluv":[127.71501294924046,196.394882900214611,17.3086983277836381],"hsluv":[127.71501294924046,100.000000000002402,17.3086983277836381]},"#003311":{"lch":[17.4974002223845133,22.6621201022865968,134.58430385811792],"luv":[17.4974002223845133,-15.9078557679049606,16.1403783226414816],"rgb":[0,0.2,0.0666666666666666657],"xyz":[0.0128494115843442776,0.0240801583692694977,0.00927402032632457241],"hpluv":[134.58430385811792,164.348724425256108,17.4974002223845133],"hsluv":[134.58430385811792,99.9999999999909335,17.4974002223845133]},"#003322":{"lch":[17.8416856931397234,17.1190432019509622,152.323942273369369],"luv":[17.8416856931397234,-15.1604156821769873,7.95131665159082601],"rgb":[0,0.2,0.133333333333333331],"xyz":[0.0147247697228212963,0.0248303016246603156,0.0191509065223037685],"hpluv":[152.323942273369369,121.753913655152402,17.8416856931397234],"hsluv":[152.323942273369369,99.9999999999912177,17.8416856931397234]},"#003333":{"lch":[18.3937448040413543,14.5523831926532932,192.17705063006116],"luv":[18.3937448040413543,-14.2249612699966086,-3.06958196712752551],"rgb":[0,0.2,0.2],"xyz":[0.017812520455279035,0.0260654019176434319,0.0354130603799149152],"hpluv":[192.17705063006116,100.392967527320849,18.3937448040413543],"hsluv":[192.17705063006116,99.9999999999915,18.3937448040413543]},"#003344":{"lch":[19.1608294605123817,20.3566459399555,229.223567805483242],"luv":[19.1608294605123817,-13.2951121246929258,-15.41535038578591],"rgb":[0,0.2,0.266666666666666663],"xyz":[0.0222705156994979156,0.0278486000153310084,0.0588918353328015537],"hpluv":[229.223567805483242,134.812835768594709,19.1608294605123817],"hsluv":[229.223567805483242,99.9999999999917577,19.1608294605123817]},"#003355":{"lch":[20.1371955335767296,30.6237106081975696,245.893961784182551],"luv":[20.1371955335767296,-12.5075398018694361,-27.9530517031554915],"rgb":[0,0.2,0.333333333333333315],"xyz":[0.0282329297388599076,0.0302335656310758379,0.0902938826067754552],"hpluv":[245.893961784182551,192.973712242731381,20.1371955335767296],"hsluv":[245.893961784182551,99.9999999999920419,20.1371955335767296]},"#003366":{"lch":[21.3076868402923836,41.8514919359335167,253.451236278131262],"luv":[21.3076868402923836,-11.9206140697212764,-40.1179054471226308],"rgb":[0,0.2,0.4],"xyz":[0.0358179255123680859,0.0332675639404791529,0.130241527013919417],"hpluv":[253.451236278131262,249.237832456686277,21.3076868402923836],"hsluv":[253.451236278131262,99.9999999999920846,21.3076868402923836]},"#003377":{"lch":[22.6513946103128916,53.0186284648852251,257.430711853641924],"luv":[22.6513946103128916,-11.5379190314963687,-51.7479602372902434],"rgb":[0,0.2,0.466666666666666674],"xyz":[0.04513193853257,0.0369931691485599692,0.179295328920317326],"hpluv":[257.430711853641924,297.011229333042763,22.6513946103128916],"hsluv":[257.430711853641924,99.9999999999922409,22.6513946103128916]},"#003388":{"lch":[24.1449124481648099,63.8887963004775941,259.778872090702237],"luv":[24.1449124481648099,-11.3369168899634012,-62.8748964862287636],"rgb":[0,0.2,0.533333333333333326],"xyz":[0.0562723556345138265,0.0414493359893375601,0.237968192323889494],"hpluv":[259.778872090702237,335.767299249073346,24.1449124481648099],"hsluv":[259.778872090702237,99.9999999999925677,24.1449124481648099]},"#003399":{"lch":[25.764809398314533,74.4520642325545481,261.279947020055374],"luv":[25.764809398314533,-11.2874373109462987,-73.5914643653724596],"rgb":[0,0.2,0.6],"xyz":[0.0693293197435865399,0.0466721216329667177,0.306734869965007428],"hpluv":[261.279947020055374,366.681615332004242,25.764809398314533],"hsluv":[261.279947020055374,99.9999999999928662,25.764809398314533]},"#0033aa":{"lch":[27.4892253326185596,84.7561178753388447,262.297068677869788],"luv":[27.4892253326185596,-11.360446037840406,-83.9913077831251],"rgb":[0,0.2,0.66666666666666663],"xyz":[0.084387012708839082,0.0526951988190678261,0.386038719582006029],"hpluv":[262.297068677869788,391.244172205097584,27.4892253326185596],"hsluv":[262.297068677869788,99.9999999999925819,27.4892253326185596]},"#0033bb":{"lch":[29.2987082140811808,94.8530383242648725,263.01737082090068],"luv":[29.2987082140811808,-11.531133966499155,-94.1495184734957178],"rgb":[0,0.2,0.733333333333333282],"xyz":[0.101524604816175729,0.0595502356620025847,0.476296704680647776],"hpluv":[263.01737082090068,410.811034734971429,29.2987082140811808],"hsluv":[263.01737082090068,99.999999999992923,29.2987082140811808]},"#0033cc":{"lch":[31.1765026722858281,104.784892642773883,263.545454640352943],"luv":[31.1765026722858281,-11.7793879173059235,-104.120697973319764],"rgb":[0,0.2,0.8],"xyz":[0.120816980259897469,0.0672671858394913863,0.577903215350917931],"hpluv":[263.545454640352943,426.491720029659064,31.1765026722858281],"hsluv":[263.545454640352943,99.9999999999928519,31.1765026722858281]},"#0033dd":{"lch":[33.108496036114694,114.582250296133722,263.943596884481394],"luv":[33.108496036114694,-12.0892798728815123,-113.942711022166648],"rgb":[0,0.2,0.866666666666666696],"xyz":[0.142335305810531026,0.0758745160597449203,0.691233063250923929],"hpluv":[263.943596884481394,439.154381827523366,33.108496036114694],"hsluv":[263.943596884481394,99.999999999992724,33.108496036114694]},"#0033ee":{"lch":[35.0829820911796091,124.266344101148519,264.250786122927309],"luv":[35.0829820911796091,-12.4483077284590724,-123.641271066592637],"rgb":[0,0.2,0.933333333333333348],"xyz":[0.166147486076705764,0.0853993881662149512,0.816643879319447152],"hpluv":[264.250786122927309,449.46548401365061,35.0829820911796091],"hsluv":[264.250786122927309,99.9999999999932214,35.0829820911796091]},"#0033ff":{"lch":[37.0903499028545482,133.851694130242549,264.492451291459133],"luv":[37.0903499028545482,-12.8466699872586325,-133.233776092154926],"rgb":[0,0.2,1],"xyz":[0.192318534486537157,0.0958678075301476473,0.954478067611229],"hpluv":[264.492451291459133,457.933345064777,37.0903499028545482],"hsluv":[264.492451291459133,99.999999999999531,37.0903499028545482]},"#55cc00":{"lch":[72.9678739916599,103.392643433537373,122.072672834653702],"luv":[72.9678739916599,-54.9009234662034089,87.6123696673744661],"rgb":[0.333333333333333315,0.8,0],"xyz":[0.253381485948118268,0.451154891290725057,0.0737291113395339148],"hpluv":[122.072672834653702,179.803140433373983,72.9678739916599],"hsluv":[122.072672834653702,100.000000000002444,72.9678739916599]},"#55cc11":{"lch":[72.9944661394807497,102.34674561848017,122.382691003133885],"luv":[72.9944661394807497,-54.8140205324080085,86.4307786136781431],"rgb":[0.333333333333333315,0.8,0.0666666666666666657],"xyz":[0.254393151447755372,0.45155955749057991,0.0790572163042895515],"hpluv":[122.382691003133885,177.91945009175069,72.9944661394807497],"hsluv":[122.382691003133885,98.5172338886757757,72.9944661394807497]},"#55cc22":{"lch":[73.0437189009647909,100.431941691916791,122.969611448584445],"luv":[73.0437189009647909,-54.6544745496639663,84.2583130836875114],"rgb":[0.333333333333333315,0.8,0.133333333333333331],"xyz":[0.256268509586232429,0.452309700745970711,0.0889341025002687441],"hpluv":[122.969611448584445,174.473032354427772,73.0437189009647909],"hsluv":[122.969611448584445,95.7933392549395,73.0437189009647909]},"#55cc33":{"lch":[73.1246943704287702,97.3470237033586,123.971835615120114],"luv":[73.1246943704287702,-54.3960871275936384,80.7310889875115123],"rgb":[0.333333333333333315,0.8,0.2],"xyz":[0.259356260318690135,0.453544801038953838,0.10519625635787988],"hpluv":[123.971835615120114,168.926560877595364,73.1246943704287702],"hsluv":[123.971835615120114,91.3772697810403542,73.1246943704287702]},"#55cc44":{"lch":[73.2413452172043,93.0415252478239836,125.502056943833935],"luv":[73.2413452172043,-54.0322080150887771,75.7446098244333399],"rgb":[0.333333333333333315,0.8,0.266666666666666663],"xyz":[0.26381425556290905,0.455327999136641404,0.128675031310766519],"hpluv":[125.502056943833935,161.198069131808353,73.2413452172043],"hsluv":[125.502056943833935,85.148140842768953,73.2413452172043]},"#55cc55":{"lch":[73.3968865779486919,87.5572640326508207,127.71501294923992],"luv":[73.3968865779486919,-53.5617851120033066,69.2633356148757144],"rgb":[0.333333333333333315,0.8,0.333333333333333315],"xyz":[0.269776669602271035,0.457712964752386264,0.160077078584740434],"hpluv":[127.71501294923992,151.374900584602614,73.3968865779486919],"hsluv":[127.71501294923992,77.0768048277098,73.3968865779486919]},"#55cc66":{"lch":[73.5939772793636,81.0375847478920832,130.834727778769576],"luv":[73.5939772793636,-52.9887999422805,61.3129449826769175],"rgb":[0.333333333333333315,0.8,0.4],"xyz":[0.277361665375779221,0.460746963061789583,0.200024722991884396],"hpluv":[130.834727778769576,139.728031568505,73.5939772793636],"hsluv":[130.834727778769576,77.5857883184082766,73.5939772793636]},"#55cc77":{"lch":[73.8348152761848553,73.7475179973278898,135.191797127350526],"luv":[73.8348152761848553,-52.3216404431773,51.972515352838883],"rgb":[0.333333333333333315,0.8,0.466666666666666674],"xyz":[0.286675678395981126,0.464472568269870378,0.249078524898282305],"hpluv":[135.191797127350526,126.743455190439619,73.8348152761848553],"hsluv":[135.191797127350526,78.1806978106980779,73.8348152761848553]},"#55cc88":{"lch":[74.1211942127210648,66.1117924559585646,141.267644806662588],"luv":[74.1211942127210648,-51.5723023085178269,41.3650424433311343],"rgb":[0.333333333333333315,0.8,0.533333333333333326],"xyz":[0.297816095497924926,0.468928735110648,0.307751388301854445],"hpluv":[141.267644806662588,113.181605649052202,74.1211942127210648],"hsluv":[141.267644806662588,78.852064841283763,74.1211942127210648]},"#55cc99":{"lch":[74.4545405069311,58.7794373107374923,149.710693018120253],"luv":[74.4545405069311,-50.7554383804248,29.646377947024483],"rgb":[0.333333333333333315,0.8,0.6],"xyz":[0.310873059606997626,0.474151520754277134,0.37651806594297238],"hpluv":[149.710693018120253,100.178278207809555,74.4545405069311],"hsluv":[149.710693018120253,79.5881732610030355,74.4545405069311]},"#55ccaa":{"lch":[74.8359403329188808,52.7021878309829361,161.189357777818884],"luv":[74.8359403329188808,-49.8873315971569866,16.9933736582089097],"rgb":[0.333333333333333315,0.8,0.66666666666666663],"xyz":[0.325930752572250182,0.480174597940378256,0.455821915559971],"hpluv":[161.189357777818884,89.3630022499163772,74.8359403329188808],"hsluv":[161.189357777818884,80.3759073289738097,74.8359403329188808]},"#55ccbb":{"lch":[75.2661614985634,49.1164256219739315,175.805780272408356],"luv":[75.2661614985634,-48.9848849956305372,3.59225665059547428],"rgb":[0.333333333333333315,0.8,0.733333333333333282],"xyz":[0.343068344679586856,0.487029634783313,0.546079900658612782],"hpluv":[175.805780272408356,82.8068592257523619,75.2661614985634],"hsluv":[175.805780272408356,81.2015846585734238,75.2661614985634]},"#55cccc":{"lch":[75.7456730324682894,49.1710405410584386,192.177050630061103],"luv":[75.7456730324682894,-48.0647147647340063,-10.3718090261618983],"rgb":[0.333333333333333315,0.8,0.8],"xyz":[0.362360720123308555,0.494746584960801816,0.647686411328882938],"hpluv":[192.177050630061103,82.3741405590198639,75.7456730324682894],"hsluv":[192.177050630061103,82.0517040066532815,75.7456730324682894]},"#55ccdd":{"lch":[76.2746640882933349,53.2320113470533514,207.674227909684788],"luv":[76.2746640882933349,-47.1424090239802069,-24.7232745296525458],"rgb":[0.333333333333333315,0.8,0.866666666666666696],"xyz":[0.383879045673942154,0.503353915181055322,0.761016259228888936],"hpluv":[207.674227909684788,89.8673986045394,76.2746640882933349],"hsluv":[207.674227909684788,82.913556803619926,76.2746640882933349]},"#55ccee":{"lch":[76.8530630513789674,60.6801737900983298,220.368363670310828],"luv":[76.8530630513789674,-46.2319850937693673,-39.3025068600722207],"rgb":[0.333333333333333315,0.8,0.933333333333333348],"xyz":[0.407691225940116864,0.51287878728752534,0.886427075297412159],"hpluv":[220.368363670310828,105.55411204702996,76.8530630513789674],"hsluv":[220.368363670310828,83.7756757275922865,76.8530630513789674]},"#55ccff":{"lch":[77.4805572724897758,70.4908339109135511,229.9629437526429],"luv":[77.4805572724897758,-45.3455492712466395,-53.9697955040126445],"rgb":[0.333333333333333315,0.8,1],"xyz":[0.433862274349948285,0.523347206651458063,1.02426126358919389],"hpluv":[229.9629437526429,126.754412601721029,77.4805572724897758],"hsluv":[229.9629437526429,99.9999999999968878,77.4805572724897758]},"#004400":{"lch":[24.1097877444294397,37.3150672336374782,127.715012949240432],"luv":[24.1097877444294397,-22.8269080205926969,29.5185791133361732],"rgb":[0,0.266666666666666663,0],"xyz":[0.0206703165676731908,0.0413406331353469575,0.00689010552255753684],"hpluv":[127.715012949240432,196.39488290021464,24.1097877444294397],"hsluv":[127.715012949240432,100.000000000002458,24.1097877444294397]},"#004411":{"lch":[24.2402356883412295,33.8624764720942082,131.447767669063751],"luv":[24.2402356883412295,-22.4148262696793807,25.3819399598065552],"rgb":[0,0.266666666666666663,0.0666666666666666657],"xyz":[0.0216819820673103125,0.0417452993352018104,0.0122182104873131692],"hpluv":[131.447767669063751,177.264269230781338,24.2402356883412295],"hsluv":[131.447767669063751,99.9999999999909335,24.2402356883412295]},"#004422":{"lch":[24.4798388415780295,28.4164365287723264,139.862893984056171],"luv":[24.4798388415780295,-21.7244820008415864,18.3177713379345413],"rgb":[0,0.266666666666666663,0.133333333333333331],"xyz":[0.0235573402057873311,0.0424954425905926317,0.0220950966832923652],"hpluv":[139.862893984056171,147.299199898382369,24.4798388415780295],"hsluv":[139.862893984056171,99.9999999999911466,24.4798388415780295]},"#004433":{"lch":[24.8682723444395748,22.2877633761795622,158.664607016269599],"luv":[24.8682723444395748,-20.760308528761005,8.10888316004269427],"rgb":[0,0.266666666666666663,0.2],"xyz":[0.0266450909382450717,0.0437305428835757445,0.0383572505409035119],"hpluv":[158.664607016269599,113.726114076625834,24.8682723444395748],"hsluv":[158.664607016269599,99.9999999999913172,24.8682723444395748]},"#004444":{"lch":[25.4163828994624552,20.1084089871091685,192.17705063006116],"luv":[25.4163828994624552,-19.6559790417892835,-4.24153273022775057],"rgb":[0,0.266666666666666663,0.266666666666666663],"xyz":[0.0311030861824639487,0.0455137409812633176,0.0618360254937901505],"hpluv":[192.17705063006116,100.392967527320792,25.4163828994624552],"hsluv":[192.17705063006116,99.9999999999914166,25.4163828994624552]},"#004455":{"lch":[26.1275223832094383,25.5944772375096541,223.546306053382096],"luv":[26.1275223832094383,-18.5513329588178841,-17.6330743352507042],"rgb":[0,0.266666666666666663,0.333333333333333315],"xyz":[0.0370655002218259477,0.0478987065970081505,0.093238072767764052],"hpluv":[223.546306053382096,124.304646155287358,26.1275223832094383],"hsluv":[223.546306053382096,99.999999999991644,26.1275223832094383]},"#004466":{"lch":[26.9988561724938734,35.8050932952910514,240.647496291889979],"luv":[26.9988561724938734,-17.5509899640931621,-31.2084516944496499],"rgb":[0,0.266666666666666663,0.4],"xyz":[0.0446504959953341191,0.050932704906411462,0.133185717174908],"hpluv":[240.647496291889979,168.282428552664811,26.9988561724938734],"hsluv":[240.647496291889979,99.9999999999920135,26.9988561724938734]},"#004477":{"lch":[28.0227048150185141,47.4927479988473422,249.396343090395135],"luv":[28.0227048150185141,-16.7127641209025413,-44.4549730392572684],"rgb":[0,0.266666666666666663,0.466666666666666674],"xyz":[0.0539645090155360385,0.0546583101144922784,0.182239519081305923],"hpluv":[249.396343090395135,215.05848085050232,28.0227048150185141],"hsluv":[249.396343090395135,99.9999999999921698,28.0227048150185141]},"#004488":{"lch":[29.1879465441319326,59.3592998069098,254.306666373838311],"luv":[29.1879465441319326,-16.0560040952153962,-57.1465765034181956],"rgb":[0,0.266666666666666663,0.533333333333333326],"xyz":[0.0651049261174798666,0.0591144769552698762,0.24091238248487809],"hpluv":[254.306666373838311,258.06229412425995,29.1879465441319326],"hsluv":[254.306666373838311,99.9999999999923,29.1879465441319326]},"#004499":{"lch":[30.4813623757938217,70.9684349502494,257.321762040288718],"luv":[30.4813623757938217,-15.5758442205369825,-69.2380808233832141],"rgb":[0,0.266666666666666663,0.6],"xyz":[0.07816189022655258,0.0643372625988990338,0.309679060125996],"hpluv":[257.321762040288718,295.440602563868879,30.4813623757938217],"hsluv":[257.321762040288718,99.9999999999926672,30.4813623757938217]},"#0044aa":{"lch":[31.8888011745219231,82.2033012029853,259.305022310013101],"luv":[31.8888011745219231,-15.2553283345918977,-80.7753532092093138],"rgb":[0,0.266666666666666663,0.66666666666666663],"xyz":[0.0932195831918051221,0.0703603397850001422,0.388982909742994598],"hpluv":[259.305022310013101,327.107417663034141,31.8888011745219231],"hsluv":[259.305022310013101,99.9999999999925109,31.8888011745219231]},"#0044bb":{"lch":[33.3960915948532602,93.0667571364503,260.679203518012741],"luv":[33.3960915948532602,-15.0732787327803415,-91.8379962332527],"rgb":[0,0.266666666666666663,0.733333333333333282],"xyz":[0.110357175299141769,0.0772153766279349,0.479240894841636345],"hpluv":[260.679203518012741,353.621176249907,33.3960915948532602],"hsluv":[260.679203518012741,99.9999999999929656,33.3960915948532602]},"#0044cc":{"lch":[34.9896851087579108,103.60206818965716,261.670396128603272],"luv":[34.9896851087579108,-15.0085679377548828,-102.509177255659253],"rgb":[0,0.266666666666666663,0.8],"xyz":[0.129649550742863495,0.0849323268054237,0.5808474055119065],"hpluv":[261.670396128603272,375.722944942957042,34.9896851087579108],"hsluv":[261.670396128603272,99.999999999992923,34.9896851087579108]},"#0044dd":{"lch":[36.6570567010139499,113.860579159150092,262.408492682931296],"luv":[36.6570567010139499,-15.0420602661110987,-112.862606338006245],"rgb":[0,0.266666666666666663,0.866666666666666696],"xyz":[0.151167876293497039,0.0935396570256772364,0.694177253411912498],"hpluv":[262.408492682931296,394.144185167595538,36.6570567010139499],"hsluv":[262.408492682931296,99.9999999999929088,36.6570567010139499]},"#0044ee":{"lch":[38.386911506645724,123.889384104134805,262.972536787865295],"luv":[38.386911506645724,-15.1572566165017264,-122.958680318078251],"rgb":[0,0.266666666666666663,0.933333333333333348],"xyz":[0.174980056559671776,0.103064529132147253,0.819588069480435721],"hpluv":[262.972536787865295,409.534269399062566,38.386911506645724],"hsluv":[262.972536787865295,99.9999999999931,38.386911506645724]},"#0044ff":{"lch":[40.1692504091911928,133.727629508879147,263.412926975584469],"luv":[40.1692504091911928,-15.3403008413028115,-132.844849595919101],"rgb":[0,0.266666666666666663,1],"xyz":[0.201151104969503169,0.113532948496079963,0.957422257772217566],"hpluv":[263.412926975584469,422.441664595501038,40.1692504091911928],"hsluv":[263.412926975584469,99.9999999999994174,40.1692504091911928]},"#55dd00":{"lch":[78.2526895057908121,112.425836873112019,123.034721453117925],"luv":[78.2526895057908121,-61.2886270790004488,94.2511166373683267],"rgb":[0.333333333333333315,0.866666666666666696,0],"xyz":[0.296015476495293473,0.536422872385076577,0.0879404415219252333],"hpluv":[123.034721453117925,210.800433631405241,78.2526895057908121],"hsluv":[123.034721453117925,100.000000000002288,78.2526895057908121]},"#55dd11":{"lch":[78.2763843013059102,111.485784004679431,123.297526334296066],"luv":[78.2763843013059102,-61.2042162992655108,93.1832814529020368],"rgb":[0.333333333333333315,0.866666666666666696,0.0666666666666666657],"xyz":[0.297027141994930577,0.536827538584931485,0.09326854648668087],"hpluv":[123.297526334296066,209.310421322213443,78.2763843013059102],"hsluv":[123.297526334296066,98.7516598856555561,78.2763843013059102]},"#55dd22":{"lch":[78.3202766586626353,109.761570808260174,123.793166282380056],"luv":[78.3202766586626353,-61.0490014413279738,91.2174426812846235],"rgb":[0.333333333333333315,0.866666666666666696,0.133333333333333331],"xyz":[0.298902500133407634,0.537577681840322286,0.103145432682660063],"hpluv":[123.793166282380056,206.571995072092733,78.3202766586626353],"hsluv":[123.793166282380056,96.4551350157602201,78.3202766586626353]},"#55dd33":{"lch":[78.3924559312840898,106.97461234521991,124.633900466047606],"luv":[78.3924559312840898,-60.7969536029841819,88.018737317724927],"rgb":[0.333333333333333315,0.866666666666666696,0.2],"xyz":[0.30199025086586534,0.538812782133305412,0.119407586540271199],"hpluv":[124.633900466047606,202.130538056106332,78.3924559312840898],"hsluv":[124.633900466047606,92.7228817840519355,78.3924559312840898]},"#55dd44":{"lch":[78.4964717161501255,103.064578059178857,125.904361390923313],"luv":[78.4964717161501255,-60.4405744101571756,83.4819993500804],"rgb":[0.333333333333333315,0.866666666666666696,0.266666666666666663],"xyz":[0.306448246110084255,0.540595980230993,0.142886361493157837],"hpluv":[125.904361390923313,195.867385876976442,78.4964717161501255],"hsluv":[125.904361390923313,87.4391970363123221,78.4964717161501255]},"#55dd55":{"lch":[78.635232286968062,98.0447483954765175,127.715012949239977],"luv":[78.635232286968062,-59.9773394353739,77.559599291037074],"rgb":[0.333333333333333315,0.866666666666666696,0.333333333333333315],"xyz":[0.31241066014944624,0.542980945846737728,0.174288408767131753],"hpluv":[127.715012949239977,187.771435495127037,78.635232286968062],"hsluv":[127.715012949239977,80.5594181605674891,78.635232286968062]},"#55dd66":{"lch":[78.8111684825228451,92.0067823672703469,130.218539636235505],"luv":[78.8111684825228451,-59.4092211255214551,70.2551951590567],"rgb":[0.333333333333333315,0.866666666666666696,0.4],"xyz":[0.319995655922954425,0.546014944156141,0.214236053174275715],"hpluv":[130.218539636235505,177.951388767985407,78.8111684825228451],"hsluv":[130.218539636235505,80.9267337864342693,78.8111684825228451]},"#55dd77":{"lch":[79.0263204832261863,85.1319563310668315,133.631202536406704],"luv":[79.0263204832261863,-58.7422260542947043,61.618186170487121],"rgb":[0.333333333333333315,0.866666666666666696,0.466666666666666674],"xyz":[0.329309668943156331,0.549740549364221898,0.263289855080673596],"hpluv":[133.631202536406704,166.66460441184762,79.0263204832261863],"hsluv":[133.631202536406704,81.3592233632428,79.0263204832261863]},"#55dd88":{"lch":[79.2823892178289,77.7115996221609322,138.259418470179128],"luv":[79.2823892178289,-57.9858175415186921,51.7371982221375],"rgb":[0.333333333333333315,0.866666666666666696,0.533333333333333326],"xyz":[0.340450086045100131,0.55419671620499944,0.321962718484245791],"hpluv":[138.259418470179128,154.371102046011828,79.2823892178289],"hsluv":[138.259418470179128,81.8514411788724,79.2823892178289]},"#55dd99":{"lch":[79.5807696492298504,70.1818875082800133,144.522564094970761],"luv":[79.5807696492298504,-57.1522092721799737,40.7323251181885624],"rgb":[0.333333333333333315,0.866666666666666696,0.6],"xyz":[0.353507050154172831,0.559419501848628653,0.390729396125363726],"hpluv":[144.522564094970761,141.828030979619143,79.5807696492298504],"hsluv":[144.522564094970761,82.3962440946128538,79.5807696492298504]},"#55ddaa":{"lch":[79.9225742847085,63.1747442044720913,152.933070337002903],"luv":[79.9225742847085,-56.2555676549498145,28.7464678372812266],"rgb":[0.333333333333333315,0.866666666666666696,0.66666666666666663],"xyz":[0.368564743119425386,0.56544257903472972,0.470033245742362271],"hpluv":[152.933070337002903,130.236824512138128,79.9225742847085],"hsluv":[152.933070337002903,82.9852754707380313,79.9225742847085]},"#55ddbb":{"lch":[80.3086513857730466,57.5612329714098649,163.927126105934775],"luv":[80.3086513857730466,-55.3111838467604926,15.9363886328987263],"rgb":[0.333333333333333315,0.866666666666666696,0.733333333333333282],"xyz":[0.385702335226762061,0.572297615877664478,0.560291230841004073],"hpluv":[163.927126105934775,121.406580229851471,80.3086513857730466],"hsluv":[163.927126105934775,83.6094665313934,80.3086513857730466]},"#55ddcc":{"lch":[80.7396004409482657,54.3905283694756534,177.403333860877041],"luv":[80.7396004409482657,-54.3346805898883076,2.46415533308082235],"rgb":[0.333333333333333315,0.866666666666666696,0.8],"xyz":[0.40499471067048376,0.580014566055153336,0.661897741511274229],"hpluv":[177.403333860877041,117.73427745544555,80.7396004409482657],"hsluv":[177.403333860877041,84.2595162876674664,80.7396004409482657]},"#55dddd":{"lch":[81.2157864208401605,54.5690893966631236,192.177050630061103],"luv":[81.2157864208401605,-53.3413100060750764,-11.5104371948595805],"rgb":[0.333333333333333315,0.866666666666666696,0.866666666666666696],"xyz":[0.426513036221117359,0.588621896275406842,0.775227589411280227],"hpluv":[192.177050630061103,121.625211000731653,81.2157864208401605],"hsluv":[192.177050630061103,84.9263164151063847,81.2157864208401605]},"#55ddee":{"lch":[81.73735371635685,58.3741450028570412,206.269517439458],"luv":[81.73735371635685,-52.3453816136692609,-25.8360567528002605],"rgb":[0.333333333333333315,0.866666666666666696,0.933333333333333348],"xyz":[0.450325216487292068,0.598146768381876859,0.90063840547980345],"hpluv":[206.269517439458,134.436687270459231,81.73735371635685],"hsluv":[206.269517439458,85.6012975649288421,81.73735371635685]},"#55ddff":{"lch":[82.3042402700550753,65.3293790133507599,218.171205050819623],"luv":[82.3042402700550753,-51.3598401525014268,-40.374429801293],"rgb":[0.333333333333333315,0.866666666666666696,1],"xyz":[0.476496264897123489,0.608615187745809583,1.0384725937715853],"hpluv":[218.171205050819623,156.046773818868189,82.3042402700550753],"hsluv":[218.171205050819623,99.9999999999958078,82.3042402700550753]},"#005500":{"lch":[30.6325595368381371,47.4104554868850059,127.715012949240474],"luv":[30.6325595368381371,-29.0026036892131067,37.5046699588244152],"rgb":[0,0.333333333333333315,0],"xyz":[0.0324835732820191528,0.0649671465640392215,0.0108278577606727468],"hpluv":[127.715012949240474,196.39488290021464,30.6325595368381371],"hsluv":[127.715012949240474,100.000000000002331,30.6325595368381371]},"#005511":{"lch":[30.7291805540017933,44.5531719728198325,130.030983014983661],"luv":[30.7291805540017933,-28.6566785608310113,34.1142185415534129],"rgb":[0,0.333333333333333315,0.0666666666666666657],"xyz":[0.033495238781656278,0.0653718127638940744,0.01615596272542838],"hpluv":[130.030983014983661,183.978458821492183,30.7291805540017933],"hsluv":[130.030983014983661,99.9999999999909335,30.7291805540017933]},"#005522":{"lch":[30.9072407208055395,39.7502752239143149,134.89425658266407],"luv":[30.9072407208055395,-28.0557665948475297,28.1595159964153758],"rgb":[0,0.333333333333333315,0.133333333333333331],"xyz":[0.0353705969201332932,0.0661219560192848888,0.0260328489214075726],"hpluv":[134.89425658266407,163.199653312489744,30.9072407208055395],"hsluv":[134.89425658266407,99.9999999999909903,30.9072407208055395]},"#005533":{"lch":[31.1975029455576802,33.2574057268159,144.773587953954916],"luv":[31.1975029455576802,-27.1672793055155033,19.1831689460880241],"rgb":[0,0.333333333333333315,0.2],"xyz":[0.0384583476525910337,0.067357056312268,0.0422950027790187227],"hpluv":[144.773587953954916,135.271984326190278,31.1975029455576802],"hsluv":[144.773587953954916,99.9999999999912177,31.1975029455576802]},"#005544":{"lch":[31.6103799108948778,27.1932751339722678,163.464109831123295],"luv":[31.6103799108948778,-26.0686058468900157,7.73963834500076331],"rgb":[0,0.333333333333333315,0.266666666666666663],"xyz":[0.0429163428968099142,0.0691402544099555816,0.0657737777319053613],"hpluv":[163.464109831123295,109.16191048912313,31.6103799108948778],"hsluv":[163.464109831123295,99.999999999991374,31.6103799108948778]},"#005555":{"lch":[32.1516370434520482,25.4370682812028797,192.17705063006116],"luv":[32.1516370434520482,-24.8647459548099441,-5.36552433088697445],"rgb":[0,0.333333333333333315,0.333333333333333315],"xyz":[0.0488787569361719063,0.0715252200257004145,0.0971758250058792628],"hpluv":[192.17705063006116,100.392967527320877,32.1516370434520482],"hsluv":[192.17705063006116,99.9999999999915,32.1516370434520482]},"#005566":{"lch":[32.8230722751799036,30.545644410021449,219.238547792689275],"luv":[32.8230722751799036,-23.6581848019048806,-19.3216636007977201],"rgb":[0,0.333333333333333315,0.4],"xyz":[0.0564637527096800845,0.074559218335103733,0.137123469413023225],"hpluv":[219.238547792689275,118.088984839520307,32.8230722751799036],"hsluv":[219.238547792689275,99.9999999999916298,32.8230722751799036]},"#005577":{"lch":[33.6230950493472065,40.3511971197610322,236.060106868306946],"luv":[33.6230950493472065,-22.5289967279924532,-33.4763112577822142],"rgb":[0,0.333333333333333315,0.466666666666666674],"xyz":[0.065777765729882,0.0782848235431845424,0.186177271319421134],"hpluv":[236.060106868306946,152.285327594300298,33.6230950493472065],"hsluv":[236.060106868306946,99.9999999999918,33.6230950493472065]},"#005588":{"lch":[34.5473308406039266,52.0529464564925703,245.569923252468897],"luv":[34.5473308406039266,-21.5281838547339461,-47.3924733973576764],"rgb":[0,0.333333333333333315,0.533333333333333326],"xyz":[0.076918182831825832,0.0827409903839621402,0.244850134722993301],"hpluv":[245.569923252468897,191.192188881903292,34.5473308406039266],"hsluv":[245.569923252468897,99.9999999999919709,34.5473308406039266]},"#005599":{"lch":[35.5892574919693772,64.2489447401961655,251.22324643469841],"luv":[35.5892574919693772,-20.6805523421639172,-60.8296116628390067],"rgb":[0,0.333333333333333315,0.6],"xyz":[0.0899751469408985316,0.0879637760275913,0.313616812364111208],"hpluv":[251.22324643469841,229.079590546614583,35.5892574919693772],"hsluv":[251.22324643469841,99.9999999999922125,35.5892574919693772]},"#0055aa":{"lch":[36.7408379507026,76.3552968047486189,254.821646708521541],"luv":[36.7408379507026,-19.9916927982920107,-73.6916791042243347],"rgb":[0,0.333333333333333315,0.66666666666666663],"xyz":[0.105032839906151088,0.0939868532136924,0.392920661981109809],"hpluv":[254.821646708521541,263.711724718685957,36.7408379507026],"hsluv":[254.821646708521541,99.9999999999921556,36.7408379507026]},"#0055bb":{"lch":[37.993106438468665,88.146943006458784,257.249085911334646],"luv":[37.993106438468665,-19.4551758320548949,-85.9731335635018],"rgb":[0,0.333333333333333315,0.733333333333333282],"xyz":[0.122170432013487734,0.100841890056627165,0.483178647079751555],"hpluv":[257.249085911334646,294.402692429224658,37.993106438468665],"hsluv":[257.249085911334646,99.9999999999924114,37.993106438468665]},"#0055cc":{"lch":[39.3366742314503384,99.5579220492412,258.963845190076711],"luv":[39.3366742314503384,-19.0582121518786707,-97.7167559446012888],"rgb":[0,0.333333333333333315,0.8],"xyz":[0.141462807457209461,0.108558840234115966,0.584785157750021711],"hpluv":[258.963845190076711,321.157087606315883,39.3366742314503384],"hsluv":[258.963845190076711,99.9999999999926,39.3366742314503384]},"#0055dd":{"lch":[40.7621365800243538,110.592821589198408,260.220233587680809],"luv":[40.7621365800243538,-18.7854624460211568,-108.985680654613518],"rgb":[0,0.333333333333333315,0.866666666666666696],"xyz":[0.162981133007843,0.1171661704543695,0.698115005650027709],"hpluv":[260.220233587680809,344.278042660470817,40.7621365800243538],"hsluv":[260.220233587680809,99.9999999999926672,40.7621365800243538]},"#0055ee":{"lch":[42.2603772648371105,121.285075365136905,261.168248695532611],"luv":[42.2603772648371105,-18.6213165580406681,-119.847052846418293],"rgb":[0,0.333333333333333315,0.933333333333333348],"xyz":[0.186793313274017742,0.126691042560839517,0.823525821718550932],"hpluv":[261.168248695532611,364.177675198016914,42.2603772648371105],"hsluv":[261.168248695532611,99.9999999999924256,42.2603772648371105]},"#0055ff":{"lch":[43.8227784910393,131.676969611306021,261.90102950371454],"luv":[43.8227784910393,-18.5511048350842884,-130.363648443170376],"rgb":[0,0.333333333333333315,1],"xyz":[0.212964361683849135,0.137159461924772241,0.961360010010332777],"hpluv":[261.90102950371454,381.28457852045068,43.8227784910393],"hsluv":[261.90102950371454,99.9999999999993321,43.8227784910393]},"#55ee00":{"lch":[83.4834241678481277,121.26988118033438,123.77813801339137],"luv":[83.4834241678481277,-67.423446821455,100.799121524975831],"rgb":[0.333333333333333315,0.933333333333333348,0],"xyz":[0.343194252835808289,0.630780425066107542,0.103666700302096418],"hpluv":[123.77813801339137,313.542875178701877,83.4834241678481277],"hsluv":[123.77813801339137,100.000000000002402,83.4834241678481277]},"#55ee11":{"lch":[83.5046935730824487,120.419265504422668,124.002811201886018],"luv":[83.5046935730824487,-67.3424968648776456,99.8287915414615412],"rgb":[0.333333333333333315,0.933333333333333348,0.0666666666666666657],"xyz":[0.344205918335445393,0.63118509126596245,0.108994805266852055],"hpluv":[124.002811201886018,311.80236567126093,83.5046935730824487],"hsluv":[124.002811201886018,98.9375412624106616,83.5046935730824487]},"#55ee22":{"lch":[83.5440973470955868,118.856748008926118,124.425313598414533],"luv":[83.5440973470955868,-67.1934622190367463,98.0406302625408728],"rgb":[0.333333333333333315,0.933333333333333348,0.133333333333333331],"xyz":[0.34608127647392245,0.631935234521353251,0.118871691462831247],"hpluv":[124.425313598414533,308.59848358059196,83.5440973470955868],"hsluv":[124.425313598414533,96.9807587800033133,83.5440973470955868]},"#55ee33":{"lch":[83.6089072227085524,116.32446068797897,125.138397832270286],"luv":[83.6089072227085524,-66.950941309724243,95.1259775880964469],"rgb":[0.333333333333333315,0.933333333333333348,0.2],"xyz":[0.349169027206380156,0.633170334814336377,0.135133845320442397],"hpluv":[125.138397832270286,303.387603747434184,83.6089072227085524],"hsluv":[125.138397832270286,93.7945051225822084,83.6089072227085524]},"#55ee44":{"lch":[83.7023291233000748,112.756808619009803,126.207644663357115],"luv":[83.7023291233000748,-66.6069499756988535,90.9813832873448547],"rgb":[0.333333333333333315,0.933333333333333348,0.266666666666666663],"xyz":[0.353627022450599071,0.634953532912023944,0.158612620273329036],"hpluv":[126.207644663357115,296.007020538140409,83.7023291233000748],"hsluv":[126.207644663357115,89.2707337544585,83.7023291233000748]},"#55ee55":{"lch":[83.8270046653184,108.148092962556504,127.715012949240077],"luv":[83.8270046653184,-66.1579022543843,85.5519840841642747],"rgb":[0.333333333333333315,0.933333333333333348,0.333333333333333315],"xyz":[0.359589436489961056,0.637338498527768693,0.190014667547302951],"hpluv":[127.715012949240077,286.404562223907249,83.8270046653184],"hsluv":[127.715012949240077,83.3573838846113091,83.8270046653184]},"#55ee66":{"lch":[83.985160091985378,102.554744038676162,129.769393513035965],"luv":[83.985160091985378,-65.6041880698479645,78.8261760618539853],"rgb":[0.333333333333333315,0.933333333333333348,0.4],"xyz":[0.367174432263469241,0.640372496837172,0.229962311954446885],"hpluv":[129.769393513035965,274.647728218817576,83.985160091985378],"hsluv":[129.769393513035965,83.6273111034757477,83.985160091985378]},"#55ee77":{"lch":[84.1786855608653752,96.1019099790829756,132.519661951802362],"luv":[84.1786855608653752,-64.9498200787083,70.8314758661090451],"rgb":[0.333333333333333315,0.933333333333333348,0.466666666666666674],"xyz":[0.376488445283671147,0.644098102045252863,0.279016113860844794],"hpluv":[132.519661951802362,260.948457539577589,84.1786855608653752],"hsluv":[132.519661951802362,83.9470254314832687,84.1786855608653752]},"#55ee88":{"lch":[84.4091822183787741,88.9952087097784,136.170997575445568],"luv":[84.4091822183787741,-64.2020140446184371,61.6299323860706],"rgb":[0.333333333333333315,0.933333333333333348,0.533333333333333326],"xyz":[0.387628862385614947,0.648554268886030405,0.337688977264417],"hpluv":[136.170997575445568,245.709397001158351,84.4091822183787741],"hsluv":[136.170997575445568,84.3134084109568533,84.4091822183787741]},"#55ee99":{"lch":[84.6779925165317877,81.540352796223317,141.002136712429774],"luv":[84.6779925165317877,-63.3706695007570531,51.3126434824633151],"rgb":[0.333333333333333315,0.933333333333333348,0.6],"xyz":[0.400685826494687647,0.653777054529659618,0.406455654905534869],"hpluv":[141.002136712429774,229.604367075154897,84.6779925165317877],"hsluv":[141.002136712429774,84.7220894550445394,84.6779925165317877]},"#55eeaa":{"lch":[84.9862212486181363,74.1734332109310373,147.37159021859884],"luv":[84.9862212486181363,-62.4677637576075426,39.9934580327855755],"rgb":[0.333333333333333315,0.933333333333333348,0.66666666666666663],"xyz":[0.415743519459940203,0.659800131715760685,0.48575950452253347],"hpluv":[147.37159021859884,213.709694911287,84.9862212486181363],"hsluv":[147.37159021859884,85.1677250765186358,84.9862212486181363]},"#55eebb":{"lch":[85.334751323756052,67.4984157699475418,155.676120933413],"luv":[85.334751323756052,-61.5066955643592337,27.8022037293077737],"rgb":[0.333333333333333315,0.933333333333333348,0.733333333333333282],"xyz":[0.432881111567276877,0.666655168558695443,0.576017489621175272],"hpluv":[155.676120933413,199.690784145783283,85.334751323756052],"hsluv":[155.676120933413,85.6443005177139298,85.334751323756052]},"#55eecc":{"lch":[85.7242566025865784,62.3040769944455,166.184583472908372],"luv":[85.7242566025865784,-60.5016239571924643,14.8778865660505755],"rgb":[0.333333333333333315,0.933333333333333348,0.8],"xyz":[0.452173487010998576,0.674372118736184301,0.677624000291445427],"hpluv":[166.184583472908372,189.979166061651426,85.7242566025865784],"hsluv":[166.184583472908372,86.1454332210543186,85.7242566025865784]},"#55eedd":{"lch":[86.1552131978466349,59.4824491826881427,178.687660418725557],"luv":[86.1552131978466349,-59.4668469392298462,1.36230535390821395],"rgb":[0.333333333333333315,0.933333333333333348,0.866666666666666696],"xyz":[0.473691812561632175,0.682979448956437807,0.790953848191451425],"hpluv":[178.687660418725557,187.703134777137279,86.1552131978466349],"hsluv":[178.687660418725557,86.6646578889921,86.1552131978466349]},"#55eeee":{"lch":[86.6279101052896578,59.7608483004272202,192.177050630061245],"luv":[86.6279101052896578,-58.4162567245265265,-12.6055519466972967],"rgb":[0.333333333333333315,0.933333333333333348,0.933333333333333348],"xyz":[0.497503992827806885,0.692504321062907824,0.916364664259974648],"hpluv":[192.177050630061245,196.025490067494644,86.6279101052896578],"hsluv":[192.177050630061245,87.195676441965972,86.6279101052896578]},"#55eeff":{"lch":[87.1424596935915901,63.3545065705612274,205.119112492248092],"luv":[87.1424596935915901,-57.3628964007582169,-26.8940814923128677],"rgb":[0.333333333333333315,0.933333333333333348,1],"xyz":[0.523675041237638306,0.702972740426840548,1.05419885255175649],"hpluv":[205.119112492248092,217.06231600799947,87.1424596935915901],"hsluv":[205.119112492248092,99.9999999999933,87.1424596935915901]},"#006600":{"lch":[36.9339903888407548,57.1632711650289735,127.71501294924046],"luv":[36.9339903888407548,-34.9687359497521086,45.2197642227726249],"rgb":[0,0.4,0],"xyz":[0.0475116309878656218,0.0950232619757325619,0.0158372103292880942],"hpluv":[127.71501294924046,196.394882900214554,36.9339903888407548],"hsluv":[127.71501294924046,100.000000000002331,36.9339903888407548]},"#006611":{"lch":[37.0090255636121412,54.7765813256580216,129.276595687178855],"luv":[37.0090255636121412,-34.6771211058740789,42.4024897091546933],"rgb":[0,0.4,0.0666666666666666657],"xyz":[0.04852329648750274,0.0954279281755874148,0.0211653152940437239],"hpluv":[129.276595687178855,187.813410896691579,37.0090255636121412],"hsluv":[129.276595687178855,99.9999999999908908,37.0090255636121412]},"#006622":{"lch":[37.1475616040544949,50.6324758020482761,132.428423847637788],"luv":[37.1475616040544949,-34.160143827310165,37.3728802682170453],"rgb":[0,0.4,0.133333333333333331],"xyz":[0.0503986546259797621,0.0961780714309782292,0.0310422014900229234],"hpluv":[132.428423847637788,172.957013965329963,37.1475616040544949],"hsluv":[132.428423847637788,99.9999999999909619,37.1475616040544949]},"#006633":{"lch":[37.3740982281225911,44.601943170857588,138.432874640413417],"luv":[37.3740982281225911,-33.3702331720845464,29.5932572160807972],"rgb":[0,0.4,0.2],"xyz":[0.0534864053584375,0.0974131717239613421,0.0473043553476340667],"hpluv":[138.432874640413417,151.43364776149042,37.3740982281225911],"hsluv":[138.432874640413417,99.9999999999910187,37.3740982281225911]},"#006644":{"lch":[37.6978110334583292,37.6830106217376226,149.139540405640531],"luv":[37.6978110334583292,-32.3478161181420845,19.3294615006434647],"rgb":[0,0.4,0.266666666666666663],"xyz":[0.0579444006026563832,0.099196369821648922,0.0707831303005207],"hpluv":[149.139540405640531,126.843666215367492,37.6978110334583292],"hsluv":[149.139540405640531,99.9999999999911893,37.6978110334583292]},"#006655":{"lch":[38.1247572916394191,31.9621551107412678,167.158861879927684],"luv":[38.1247572916394191,-31.1627826377188839,7.10354401671241],"rgb":[0,0.4,0.333333333333333315],"xyz":[0.0639068146420183752,0.101581335437393755,0.102185177574494607],"hpluv":[167.158861879927684,106.382034992292617,38.1247572916394191],"hsluv":[167.158861879927684,99.9999999999912461,38.1247572916394191]},"#006666":{"lch":[38.6583399620500714,30.584907136256998,192.177050630061132],"luv":[38.6583399620500714,-29.8967608054288689,-6.45137488264605441],"rgb":[0,0.4,0.4],"xyz":[0.0714918104155265466,0.104615333746797073,0.142132821981638569],"hpluv":[192.177050630061132,100.392967527320849,38.6583399620500714],"hsluv":[192.177050630061132,99.9999999999914877,38.6583399620500714]},"#006677":{"lch":[39.2996251720959648,35.3400629634721852,215.899751113488037],"luv":[39.2996251720959648,-28.6270125920824867,-20.7223116547099835],"rgb":[0,0.4,0.466666666666666674],"xyz":[0.080805823435728466,0.108340938954877883,0.191186623888036478],"hpluv":[215.899751113488037,114.108563264217921,39.2996251720959648],"hsluv":[215.899751113488037,99.999999999991644,39.2996251720959648]},"#006688":{"lch":[40.0476371065618721,44.619030030948764,232.088426656893603],"luv":[40.0476371065618721,-27.4159210327312195,-35.2026293738089109],"rgb":[0,0.4,0.533333333333333326],"xyz":[0.0919462405376723,0.112797105795655481,0.249859487291608645],"hpluv":[232.088426656893603,141.378234692038774,40.0476371065618721],"hsluv":[232.088426656893603,99.9999999999918145,40.0476371065618721]},"#006699":{"lch":[40.8996671875350728,56.0796471869528546,242.024131169727298],"luv":[40.8996671875350728,-26.3069429553173038,-49.5264735364712863],"rgb":[0,0.4,0.6],"xyz":[0.105003204646745008,0.118019891439284638,0.318626164932726552],"hpluv":[242.024131169727298,173.990215160848891,40.8996671875350728],"hsluv":[242.024131169727298,99.9999999999919,40.8996671875350728]},"#0066aa":{"lch":[41.8515997707465104,68.3303466488807345,248.245335088520562],"luv":[41.8515997707465104,-25.3254853434547229,-63.4638169768779861],"rgb":[0,0.4,0.66666666666666663],"xyz":[0.12006089761199755,0.124042968625385747,0.397930014549725153],"hpluv":[248.245335088520562,207.176688473106537,41.8515997707465104],"hsluv":[248.245335088520562,99.9999999999921,41.8515997707465104]},"#0066bb":{"lch":[42.8982420202673396,80.6980154219041452,252.339105133311591],"luv":[42.8982420202673396,-24.4823887435570384,-76.8946183711398],"rgb":[0,0.4,0.733333333333333282],"xyz":[0.137198489719334182,0.130898005468320505,0.488187999648366899],"hpluv":[252.339105133311591,238.705643004687346,42.8982420202673396],"hsluv":[252.339105133311591,99.9999999999922125,42.8982420202673396]},"#0066cc":{"lch":[44.0336413015701211,92.8728169416488356,255.165448618736946],"luv":[44.0336413015701211,-23.7781103155697018,-89.7772888680517696],"rgb":[0,0.4,0.8],"xyz":[0.156490865163055937,0.138614955645809307,0.589794510318637],"hpluv":[255.165448618736946,267.63526922347819,44.0336413015701211],"hsluv":[255.165448618736946,99.9999999999922835,44.0336413015701211]},"#0066dd":{"lch":[45.2513748624169807,104.723900430114114,257.197154574648096],"luv":[45.2513748624169807,-23.2064943358636171,-102.120291528843495],"rgb":[0,0.4,0.866666666666666696],"xyz":[0.17800919071368948,0.147222285866062841,0.703124358218643],"hpluv":[257.197154574648096,293.665789717253858,45.2513748624169807],"hsluv":[257.197154574648096,99.9999999999923119,45.2513748624169807]},"#0066ee":{"lch":[46.5448008930790422,116.210429262859975,258.70668283343889],"luv":[46.5448008930790422,-22.7576936505684415,-113.960305585607557],"rgb":[0,0.4,0.933333333333333348],"xyz":[0.201821370979864217,0.156747157972532858,0.828535174287166276],"hpluv":[258.70668283343889,316.82048544727013,46.5448008930790422],"hsluv":[258.70668283343889,99.9999999999923119,46.5448008930790422]},"#0066ff":{"lch":[47.9072652547968758,127.336469583599694,259.859032010401279],"luv":[47.9072652547968758,-22.4202120236612075,-125.347160234402949],"rgb":[0,0.4,1],"xyz":[0.227992419389695611,0.167215577336465582,0.966369362578948121],"hpluv":[259.859032010401279,337.280125749862,47.9072652547968758],"hsluv":[259.859032010401279,99.9999999999992326,47.9072652547968758]},"#55ff00":{"lch":[88.6611895097861691,129.940408372856581,124.363532639485271],"luv":[88.6611895097861691,-73.3437881830395213,107.262288168144963],"rgb":[0.333333333333333315,1,0],"xyz":[0.395046625265482121,0.734485169925456649,0.120950824445320529],"hpluv":[124.363532639485271,511.214684976108288,88.6611895097861691],"hsluv":[124.363532639485271,100.000000000002203,88.6611895097861691]},"#55ff11":{"lch":[88.6804070841335488,129.16615931328721,124.557188606571273],"luv":[88.6804070841335488,-73.2667318726085597,106.376137890284312],"rgb":[0.333333333333333315,1,0.0666666666666666657],"xyz":[0.396058290765119225,0.734889836125311557,0.126278929410076152],"hpluv":[124.557188606571273,509.111714190739917,88.6804070841335488],"hsluv":[124.557188606571273,99.999999999991374,88.6804070841335488]},"#55ff22":{"lch":[88.7160126920472862,127.742171235629925,124.920549061750862],"luv":[88.7160126920472862,-73.1247263453711867,104.741762009752222],"rgb":[0.333333333333333315,1,0.133333333333333331],"xyz":[0.397933648903596282,0.735639979380702358,0.136155815606055358],"hpluv":[124.920549061750862,505.235489858807625,88.7160126920472862],"hsluv":[124.920549061750862,99.9999999999912461,88.7160126920472862]},"#55ff33":{"lch":[88.7745841250638819,125.429409451765778,125.531442964179078],"luv":[88.7745841250638819,-72.893256299655377,102.074041467218606],"rgb":[0.333333333333333315,1,0.2],"xyz":[0.401021399636054,0.736875079673685485,0.152417969463666508],"hpluv":[125.531442964179078,498.916518871762833,88.7745841250638819],"hsluv":[125.531442964179078,99.9999999999915445,88.7745841250638819]},"#55ff44":{"lch":[88.8590323294941271,122.159967165607114,126.442013329478428],"luv":[88.8590323294941271,-72.5641116581323189,98.2726171279075658],"rgb":[0.333333333333333315,1,0.266666666666666663],"xyz":[0.405479394880272903,0.738658277771373,0.175896744416553147],"hpluv":[126.442013329478428,489.934204596741552,88.8590323294941271],"hsluv":[126.442013329478428,99.9999999999914735,88.8590323294941271]},"#55ff55":{"lch":[88.9717666926620154,117.915518658848484,127.715012949240119],"luv":[88.9717666926620154,-72.1329719647303,93.2786357968462],"rgb":[0.333333333333333315,1,0.333333333333333315],"xyz":[0.411441808919634888,0.7410432433871178,0.207298791690527062],"hpluv":[127.715012949240119,478.187207442594797,88.9717666926620154],"hsluv":[127.715012949240119,99.9999999999912461,88.9717666926620154]},"#55ff66":{"lch":[89.1148309932425,112.728028648536309,129.430986513959965],"luv":[89.1148309932425,-71.5990188667543919,87.0700232014633713],"rgb":[0.333333333333333315,1,0.4],"xyz":[0.419026804693143073,0.744077241696521119,0.247246436097671],"hpluv":[129.430986513959965,463.701047487447568,89.1148309932425],"hsluv":[129.430986513959965,99.999999999991374,89.1148309932425]},"#55ff77":{"lch":[89.2899761450384233,106.6837193332601,131.696695826109391],"luv":[89.2899761450384233,-70.9646547782272705,79.6582308552282825],"rgb":[0.333333333333333315,1,0.466666666666666674],"xyz":[0.428340817713345,0.747802846904602,0.296300238004068905],"hpluv":[131.696695826109391,446.653165807945641,89.2899761450384233],"hsluv":[131.696695826109391,99.9999999999911466,89.2899761450384233]},"#55ff88":{"lch":[89.4987035327786344,99.9302046144725722,134.655503696120093],"luv":[89.4987035327786344,-70.2351927280585784,71.0849034376696807],"rgb":[0.333333333333333315,1,0.533333333333333326],"xyz":[0.439481234815288779,0.752259013745379512,0.354973101407641101],"hpluv":[134.655503696120093,427.420708471833962,89.4987035327786344],"hsluv":[134.655503696120093,99.9999999999910472,89.4987035327786344]},"#55ff99":{"lch":[89.7422928839939544,92.6881300553494185,138.499225093055145],"luv":[89.7422928839939544,-69.4184746025382395,61.4179520744067275],"rgb":[0.333333333333333315,1,0.6],"xyz":[0.452538198924361534,0.757481799389008725,0.423739779048759],"hpluv":[138.499225093055145,406.664135605650245,89.7422928839939544],"hsluv":[138.499225093055145,99.9999999999909193,89.7422928839939544]},"#55ffaa":{"lch":[90.021821419032733,85.2692799565717081,143.477548510033301],"luv":[90.021821419032733,-68.524415632830582,50.7469660816416095],"rgb":[0.333333333333333315,1,0.66666666666666663],"xyz":[0.467595891889614035,0.763504876575109792,0.503043628665757581],"hpluv":[143.477548510033301,385.467603776639692,90.021821419032733],"hsluv":[143.477548510033301,99.9999999999908908,90.021821419032733]},"#55ffbb":{"lch":[90.3381779071049635,78.1017696608261929,149.892156464581973],"luv":[90.3381779071049635,-67.5644942943643514,39.178125719584358],"rgb":[0.333333333333333315,1,0.733333333333333282],"xyz":[0.484733483996950709,0.770359913418044551,0.593301613764399383],"hpluv":[149.892156464581973,365.560319764238727,90.3381779071049635],"hsluv":[149.892156464581973,99.9999999999906,90.3381779071049635]},"#55ffcc":{"lch":[90.6920737330737836,71.7555158590460849,158.04408297895796],"luv":[90.6920737330737836,-66.5512174426729217,26.828893251416094],"rgb":[0.333333333333333315,1,0.8],"xyz":[0.504025859440672463,0.778076863595533408,0.694908124434669539],"hpluv":[158.04408297895796,349.620992563925881,90.6920737330737836],"hsluv":[158.04408297895796,99.9999999999905214,90.6920737330737836]},"#55ffdd":{"lch":[91.0840522607878142,66.9403052018893874,168.083008151042208],"luv":[91.0840522607878142,-65.4975936461766,13.8227959213187273],"rgb":[0.333333333333333315,1,0.866666666666666696],"xyz":[0.525544184991306,0.786684193815786914,0.808237972334675536],"hpluv":[168.083008151042208,341.570927955438208,91.0840522607878142],"hsluv":[168.083008151042208,99.9999999999901092,91.0840522607878142]},"#55ffee":{"lch":[91.5144973031429,64.4172738793593,179.746868091755],"luv":[91.5144973031429,-64.4166452130874347,0.284593639433804613],"rgb":[0.333333333333333315,1,0.933333333333333348],"xyz":[0.549356365257480661,0.796209065922256931,0.933648788403198759],"hpluv":[179.746868091755,346.559914030924404,91.5144973031429],"hsluv":[179.746868091755,99.9999999999898108,91.5144973031429]},"#55ffff":{"lch":[91.9836412143362,64.7784688708661918,192.177050630061103],"luv":[91.9836412143362,-63.3209831419883,-13.663935128132529],"rgb":[0.333333333333333315,1,1],"xyz":[0.575527413667312082,0.806677485286189655,1.07148297669498049],"hpluv":[192.177050630061103,370.276433987554753,91.9836412143362],"hsluv":[192.177050630061103,99.9999999999890719,91.9836412143362]},"#007700":{"lch":[43.052730924646589,66.6333343982289534,127.715012949240503],"luv":[43.052730924646589,-40.7618988300426395,52.7111834129681611],"rgb":[0,0.466666666666666674,0],"xyz":[0.0659653690412832505,0.131930738082568333,0.0219884563470937981],"hpluv":[127.715012949240503,196.394882900214441,43.052730924646589],"hsluv":[127.715012949240503,100.000000000002217,43.052730924646589]},"#007711":{"lch":[43.1130460407029,64.6129906803504497,128.830381027920708],"luv":[43.1130460407029,-40.513441406878222,50.333881531534],"rgb":[0,0.466666666666666674,0.0666666666666666657],"xyz":[0.0669770345409203688,0.132335404282423186,0.0273165613118494313],"hpluv":[128.830381027920708,190.173702516526191,43.1130460407029],"hsluv":[128.830381027920708,99.9999999999908908,43.1130460407029]},"#007722":{"lch":[43.2245297597171856,61.038201507507992,131.028383581415682],"luv":[43.2245297597171856,-40.0674788501528809,46.0462721820529381],"rgb":[0,0.466666666666666674,0.133333333333333331],"xyz":[0.0688523926793974,0.133085547537814014,0.0371934475078286239],"hpluv":[131.028383581415682,179.188765673473426,43.2245297597171856],"hsluv":[131.028383581415682,99.9999999999909193,43.2245297597171856]},"#007733":{"lch":[43.4071769639209251,55.6324991773261601,135.049443606961],"luv":[43.4071769639209251,-39.3720497464739694,39.3041558041433419],"rgb":[0,0.466666666666666674,0.2],"xyz":[0.0719401434118551314,0.134320647830797113,0.0534556013654397671],"hpluv":[135.049443606961,162.632131787412106,43.4071769639209251],"hsluv":[135.049443606961,99.9999999999909193,43.4071769639209251]},"#007744":{"lch":[43.6689123670523855,48.8909209361139787,141.845848120172377],"luv":[43.6689123670523855,-38.4454486392046704,30.2038015639029105],"rgb":[0,0.466666666666666674,0.266666666666666663],"xyz":[0.076398138656074,0.136103845928484707,0.0769343763183264],"hpluv":[141.845848120172377,142.067640978907804,43.6689123670523855],"hsluv":[141.845848120172377,99.9999999999910614,43.6689123670523855]},"#007755":{"lch":[44.0154249216106,41.9153980271179,152.953344682219807],"luv":[44.0154249216106,-37.3313854656975224,19.0595973457790286],"rgb":[0,0.466666666666666674,0.333333333333333315],"xyz":[0.082360552695436,0.13848881154422954,0.108336423592300321],"hpluv":[152.953344682219807,120.839250305189026,44.0154249216106],"hsluv":[152.953344682219807,99.9999999999912461,44.0154249216106]},"#007766":{"lch":[44.4505333250062549,36.6388362985735725,170.062665906075836],"luv":[44.4505333250062549,-36.0891470448365865,6.32279929223085357],"rgb":[0,0.466666666666666674,0.4],"xyz":[0.0899455484689441753,0.141522809853632831,0.148284067999444269],"hpluv":[170.062665906075836,104.593337643625588,44.4505333250062549],"hsluv":[170.062665906075836,99.9999999999913314,44.4505333250062549]},"#007777":{"lch":[44.9764013416840669,35.58350047386471,192.17705063006116],"luv":[44.9764013416840669,-34.7828880940388601,-7.50574458738768],"rgb":[0,0.466666666666666674,0.466666666666666674],"xyz":[0.0992595614891461,0.145248415061713654,0.197337869905842178],"hpluv":[192.17705063006116,100.392967527320835,44.9764013416840669],"hsluv":[192.17705063006116,99.9999999999914451,44.9764013416840669]},"#007788":{"lch":[45.5937085159301603,40.0276538709377,213.25546015720218],"luv":[45.5937085159301603,-33.4724811425817,-21.9500815618326577],"rgb":[0,0.466666666666666674,0.533333333333333326],"xyz":[0.110399978591089923,0.149704581902491252,0.256010733309414373],"hpluv":[213.25546015720218,111.402399127386914,45.5937085159301603],"hsluv":[213.25546015720218,99.9999999999916156,45.5937085159301603]},"#007799":{"lch":[46.3018156057360244,48.7595612734022907,228.659125647543163],"luv":[46.3018156057360244,-32.2075160625452597,-36.6083422822662357],"rgb":[0,0.466666666666666674,0.6],"xyz":[0.123456942700162636,0.154927367546120409,0.324777410950532253],"hpluv":[228.659125647543163,133.62911578541167,46.3018156057360244],"hsluv":[228.659125647543163,99.9999999999917577,46.3018156057360244]},"#0077aa":{"lch":[47.0989379645613795,59.8445186957143,238.773531847525192],"luv":[47.0989379645613795,-31.0247207616125031,-51.1745358511991597],"rgb":[0,0.466666666666666674,0.66666666666666663],"xyz":[0.138514635665415164,0.160950444732221504,0.404081260567530853],"hpluv":[238.773531847525192,161.232500989130415,47.0989379645613795],"hsluv":[238.773531847525192,99.999999999991914,47.0989379645613795]},"#0077bb":{"lch":[47.9823278818304146,71.9659744020705432,245.408717039049918],"luv":[47.9823278818304146,-29.9480972873728,-65.4386196408934495],"rgb":[0,0.466666666666666674,0.733333333333333282],"xyz":[0.155652227772751839,0.167805481575156262,0.4943392456661726],"hpluv":[245.408717039049918,190.32034768447943,47.9823278818304146],"hsluv":[245.408717039049918,99.9999999999920561,47.9823278818304146]},"#0077cc":{"lch":[48.9484610491917067,84.4081580704908276,249.9122747909542],"luv":[48.9484610491917067,-28.9906993044602252,-79.2734287305105454],"rgb":[0,0.466666666666666674,0.8],"xyz":[0.174944603216473565,0.175522431752645064,0.595945756336442756],"hpluv":[249.9122747909542,218.818838178067409,48.9484610491917067],"hsluv":[249.9122747909542,99.9999999999922125,48.9484610491917067]},"#0077dd":{"lch":[49.9932200675849,96.8017840095652389,253.089738624096071],"luv":[49.9932200675849,-28.15707849035525,-92.6162206005108715],"rgb":[0,0.466666666666666674,0.866666666666666696],"xyz":[0.196462928767107109,0.184129761972898598,0.709275604236448753],"hpluv":[253.089738624096071,245.70363248193695,49.9932200675849],"hsluv":[253.089738624096071,99.9999999999921272,49.9932200675849]},"#0077ee":{"lch":[51.1120678627821547,108.963279527823246,255.411176145550684],"luv":[51.1120678627821547,-27.4457353077348785,-105.450120430828804],"rgb":[0,0.466666666666666674,0.933333333333333348],"xyz":[0.220275109033281846,0.193654634079368643,0.834686420304972],"hpluv":[255.411176145550684,270.517920771775039,51.1120678627821547],"hsluv":[255.411176145550684,99.9999999999922551,51.1120678627821547]},"#0077ff":{"lch":[52.300205122294,120.810007187166491,257.158195690943],"luv":[52.300205122294,-26.851223719183885,-117.788240590245493],"rgb":[0,0.466666666666666674,1],"xyz":[0.24644615744311324,0.204123053443301339,0.972520608596753822],"hpluv":[257.158195690943,293.11554041762389,52.300205122294],"hsluv":[257.158195690943,99.9999999999991189,52.300205122294]},"#008800":{"lch":[49.0166039301270473,75.8637069146273291,127.71501294924046],"luv":[49.0166039301270473,-46.4084346679225348,60.0129920808956214],"rgb":[0,0.533333333333333326,0],"xyz":[0.0880377387662537,0.176075477532509878,0.0293459129220837445],"hpluv":[127.71501294924046,196.394882900214583,49.0166039301270473],"hsluv":[127.71501294924046,100.000000000002359,49.0166039301270473]},"#008811":{"lch":[49.066374048408079,74.1307167522113133,128.546257021813432],"luv":[49.066374048408079,-46.1942790787678064,57.9780281364371461],"rgb":[0,0.533333333333333326,0.0666666666666666657],"xyz":[0.0890494042658908219,0.17648014373236473,0.0346740178868393742],"hpluv":[128.546257021813432,191.713881645209739,49.066374048408079],"hsluv":[128.546257021813432,99.9999999999908908,49.066374048408079]},"#008822":{"lch":[49.1584337135343503,71.0276132120671,130.159311596065152],"luv":[49.1584337135343503,-45.8067815452400779,54.2831521106656112],"rgb":[0,0.533333333333333326,0.133333333333333331],"xyz":[0.090924762404367851,0.177230286987755559,0.0445509040828185737],"hpluv":[130.159311596065152,183.344763498744726,49.1584337135343503],"hsluv":[130.159311596065152,99.9999999999909335,49.1584337135343503]},"#008833":{"lch":[49.3094443496477197,66.226384742663825,133.033255321350083],"luv":[49.3094443496477197,-45.1943905199784481,48.4086882864121648],"rgb":[0,0.533333333333333326,0.2],"xyz":[0.0940125131368255845,0.178465387280738658,0.060813057940429717],"hpluv":[133.033255321350083,170.427732437953466,49.3094443496477197],"hsluv":[133.033255321350083,99.9999999999909903,49.3094443496477197]},"#008844":{"lch":[49.5262444349700388,59.9709063982634589,137.708745518338219],"luv":[49.5262444349700388,-44.3625073014275202,40.3543995143041],"rgb":[0,0.533333333333333326,0.266666666666666663],"xyz":[0.0984705083810444581,0.180248585378426252,0.0842918328933163485],"hpluv":[137.708745518338219,153.654237765673173,49.5262444349700388],"hsluv":[137.708745518338219,99.9999999999910756,49.5262444349700388]},"#008855":{"lch":[49.8139833497656355,52.876539169604392,145.043769270071607],"luv":[49.8139833497656355,-43.3370811793054074,30.2956397756013871],"rgb":[0,0.533333333333333326,0.333333333333333315],"xyz":[0.104432922420406457,0.182633550994171084,0.115693880167290264],"hpluv":[145.043769270071607,134.694876863850226,49.8139833497656355],"hsluv":[145.043769270071607,99.9999999999911893,49.8139833497656355]},"#008866":{"lch":[50.1764284055384593,46.0546718070978613,156.264738854980266],"luv":[50.1764284055384593,-42.1591397878491918,18.5375221539472825],"rgb":[0,0.533333333333333326,0.4],"xyz":[0.112017918193914628,0.185667549303574375,0.155641524574434226],"hpluv":[156.264738854980266,116.469784961641182,50.1764284055384593],"hsluv":[156.264738854980266,99.9999999999912461,50.1764284055384593]},"#008877":{"lch":[50.6161324463586766,41.2412500498738694,172.391379993232761],"luv":[50.6161324463586766,-40.8781468825216336,5.46056893805106114],"rgb":[0,0.533333333333333326,0.466666666666666674],"xyz":[0.121331931214116548,0.189393154511655198,0.204695326480832135],"hpluv":[172.391379993232761,103.390869865470918,50.6161324463586766],"hsluv":[172.391379993232761,99.9999999999913456,50.6161324463586766]},"#008888":{"lch":[51.1345503085294695,40.4555776108317602,192.177050630061132],"luv":[51.1345503085294695,-39.545345738280993,-8.53342781453345],"rgb":[0,0.533333333333333326,0.533333333333333326],"xyz":[0.132472348316060362,0.193849321352432796,0.263368189884404302],"hpluv":[192.177050630061132,100.392967527320849,51.1345503085294695],"hsluv":[192.177050630061132,99.9999999999914877,51.1345503085294695]},"#008899":{"lch":[51.7321394091786715,44.6308971675799881,211.11913642158629],"luv":[51.7321394091786715,-38.208266400248,-23.066108485628412],"rgb":[0,0.533333333333333326,0.6],"xyz":[0.145529312425133089,0.199072106996061954,0.332134867525522237],"hpluv":[211.11913642158629,109.474886689832829,51.7321394091786715],"hsluv":[211.11913642158629,99.999999999991573,51.7321394091786715]},"#0088aa":{"lch":[52.4084594351014914,52.8385448128107598,225.694192047300788],"luv":[52.4084594351014914,-36.9070805124816346,-37.8124215831333572],"rgb":[0,0.533333333333333326,0.66666666666666663],"xyz":[0.160587005390385618,0.205095184182163048,0.411438717142520782],"hpluv":[225.694192047300788,127.934825585488483,52.4084594351014914],"hsluv":[225.694192047300788,99.9999999999917,52.4084594351014914]},"#0088bb":{"lch":[53.1622766119302952,63.4852929684367,235.812153399491365],"luv":[53.1622766119302952,-35.672889398211332,-52.5150205681309856],"rgb":[0,0.533333333333333326,0.733333333333333282],"xyz":[0.177724597497722292,0.211950221025097807,0.501696702241162584],"hpluv":[235.812153399491365,151.533580059798538,53.1622766119302952],"hsluv":[235.812153399491365,99.9999999999918572,53.1622766119302952]},"#0088cc":{"lch":[53.9916730817088961,75.3609801883338406,242.731381598031476],"luv":[53.9916730817088961,-34.5275961267233455,-66.9859868976812578],"rgb":[0,0.533333333333333326,0.8],"xyz":[0.197016972941444019,0.219667171202586609,0.60330321291143274],"hpluv":[242.731381598031476,177.116523654060018,53.9916730817088961],"hsluv":[242.731381598031476,99.9999999999919282,53.9916730817088961]},"#0088dd":{"lch":[54.894159312243417,87.7409205251226,247.565131731451658],"luv":[54.894159312243417,-33.4848266090853,-81.1001573460580545],"rgb":[0,0.533333333333333326,0.866666666666666696],"xyz":[0.218535298492077562,0.228274501422840143,0.716633060811438738],"hpluv":[247.565131731451658,202.822146488853946,54.894159312243417],"hsluv":[247.565131731451658,99.9999999999921414,54.894159312243417]},"#0088ee":{"lch":[55.8667862779657725,100.217939448335898,251.046181944553609],"luv":[55.8667862779657725,-32.551381555669181,-94.7841914355319091],"rgb":[0,0.533333333333333326,0.933333333333333348],"xyz":[0.242347478758252299,0.237799373529310187,0.842043876879962],"hpluv":[251.046181944553609,227.630842720065772,55.8667862779657725],"hsluv":[251.046181944553609,99.9999999999923261,55.8667862779657725]},"#0088ff":{"lch":[56.9062538959811803,112.568622459607909,253.628629682131134],"luv":[56.9062538959811803,-31.728824885135996,-108.00452043253614],"rgb":[0,0.533333333333333326,1],"xyz":[0.268518527168083665,0.248267792893242883,0.979878065171743806],"hpluv":[253.628629682131134,251.013269675548315,56.9062538959811803],"hsluv":[253.628629682131134,99.9999999999989,56.9062538959811803]},"#009900":{"lch":[54.8465256129575778,84.8867610313905629,127.71501294924046],"luv":[54.8465256129575778,-51.9281467214630865,67.1507987776363677],"rgb":[0,0.6,0],"xyz":[0.11390733921872119,0.227814678437445572,0.037969113072906],"hpluv":[127.71501294924046,196.394882900214611,54.8465256129575778],"hsluv":[127.71501294924046,100.000000000002359,54.8465256129575778]},"#009911":{"lch":[54.8884489227774139,83.3822613920475533,128.355135015114286],"luv":[54.8884489227774139,-51.7415219578455918,65.3866685214771195],"rgb":[0,0.6,0.0666666666666666657],"xyz":[0.114919004718358309,0.228219344637300425,0.0432972180376616292],"hpluv":[128.355135015114286,192.766711025891595,54.8884489227774139],"hsluv":[128.355135015114286,99.9999999999908908,54.8884489227774139]},"#009922":{"lch":[54.9660326693047665,80.6666974094322882,129.584419925030318],"luv":[54.9660326693047665,-51.4019848556742147,62.168738316310943],"rgb":[0,0.6,0.133333333333333331],"xyz":[0.116794362856835338,0.228969487892691254,0.0531741042336408287],"hpluv":[129.584419925030318,186.225526863887183,54.9660326693047665],"hsluv":[129.584419925030318,99.9999999999908766,54.9660326693047665]},"#009933":{"lch":[55.0934048637144826,76.4021664793699529,131.735569901926],"luv":[55.0934048637144826,-50.8604445821364948,57.0132109221080725],"rgb":[0,0.6,0.2],"xyz":[0.119882113589293071,0.230204588185674353,0.0694362580912519789],"hpluv":[131.735569901926,175.972736191316358,55.0934048637144826],"hsluv":[131.735569901926,99.9999999999909903,55.0934048637144826]},"#009944":{"lch":[55.2764995203901321,70.6973886175228614,135.142608572152881],"luv":[55.2764995203901321,-50.1148739946869739,49.8660221176072795],"rgb":[0,0.6,0.266666666666666663],"xyz":[0.124340108833511945,0.231987786283361946,0.0929150330441386174],"hpluv":[135.142608572152881,162.293888564466016,55.2764995203901321],"hsluv":[135.142608572152881,99.9999999999910472,55.2764995203901321]},"#009955":{"lch":[55.5199214835444792,63.9084670453141044,140.311824754994205],"luv":[55.5199214835444792,-49.1795700812718,40.8125231602173173],"rgb":[0,0.6,0.333333333333333315],"xyz":[0.130302522872873944,0.234372751899106779,0.124317080318112519],"hpluv":[140.311824754994205,146.065915008593578,55.5199214835444792],"hsluv":[140.311824754994205,99.999999999991033,55.5199214835444792]},"#009966":{"lch":[55.8272121342916847,56.7002292022714229,147.995210176352344],"luv":[55.8272121342916847,-48.0820094218291771,30.0505634148387166],"rgb":[0,0.6,0.4],"xyz":[0.137887518646382129,0.23740675020851007,0.164264724725256495],"hpluv":[147.995210176352344,128.877825594911201,55.8272121342916847],"hsluv":[147.995210176352344,99.9999999999911893,55.8272121342916847]},"#009977":{"lch":[56.2009899164422393,50.1460500452165832,159.138923639260469],"luv":[56.2009899164422393,-46.85880632633,17.8571723631952],"rgb":[0,0.6,0.466666666666666674],"xyz":[0.147201531666584035,0.241132355416590893,0.213318526631654404],"hpluv":[159.138923639260469,113.222330796973324,56.2009899164422393],"hsluv":[159.138923639260469,99.9999999999912887,56.2009899164422393]},"#009988":{"lch":[56.6430401241061077,45.7780774967248476,174.293450088826631],"luv":[56.6430401241061077,-45.5512109338885409,4.55187453172192669],"rgb":[0,0.6,0.533333333333333326],"xyz":[0.158341948768527863,0.245588522257368491,0.271991390035226543],"hpluv":[174.293450088826631,102.553461073272217,56.6430401241061077],"hsluv":[174.293450088826631,99.9999999999913456,56.6430401241061077]},"#009999":{"lch":[57.1543844255405133,45.2182256610376498,192.177050630061132],"luv":[57.1543844255405133,-44.2008363998384866,-9.53802880511673301],"rgb":[0,0.6,0.6],"xyz":[0.171398912877600562,0.250811307900997649,0.340758067676344478],"hpluv":[192.177050630061132,100.392967527320849,57.1543844255405133],"hsluv":[192.177050630061132,99.9999999999914877,57.1543844255405133]},"#0099aa":{"lch":[57.7353441317496,49.1617433665336065,209.362441333496832],"luv":[57.7353441317496,-42.8462007667450138,-24.1056028900479831],"rgb":[0,0.6,0.66666666666666663],"xyz":[0.186456605842853118,0.256834385087098771,0.420061917293343079],"hpluv":[209.362441333496832,108.050017888493571,57.7353441317496],"hsluv":[209.362441333496832,99.9999999999915872,57.7353441317496]},"#0099bb":{"lch":[58.3856036871333686,56.8846197873520509,223.121526867409756],"luv":[58.3856036871333686,-41.5203973647636531,-38.8833713947714656],"rgb":[0,0.6,0.733333333333333282],"xyz":[0.203594197950189765,0.26368942193003353,0.51031990239198477],"hpluv":[223.121526867409756,123.631292939903787,58.3856036871333686],"hsluv":[223.121526867409756,99.9999999999917151,58.3856036871333686]},"#0099cc":{"lch":[59.1042769117952531,67.0724902608298237,233.123241992210865],"luv":[59.1042769117952531,-40.2499186561976856,-53.6531732328907225],"rgb":[0,0.6,0.8],"xyz":[0.222886573393911491,0.271406372107522331,0.611926413062254926],"hpluv":[233.123241992210865,144.000781521109104,59.1042769117952531],"hsluv":[233.123241992210865,99.9999999999918572,59.1042769117952531]},"#0099dd":{"lch":[59.889976295668248,78.6325369214165448,240.220044999287609],"luv":[59.889976295668248,-39.0544489896310338,-68.2482664747921888],"rgb":[0,0.6,0.866666666666666696],"xyz":[0.244404898944545035,0.280013702327775837,0.725256260962260924],"hpluv":[240.220044999287609,166.60478591483178,59.889976295668248],"hsluv":[240.220044999287609,99.9999999999918288,59.889976295668248]},"#0099ee":{"lch":[60.7408843834734853,90.8542474807105549,245.312254820906361],"luv":[60.7408843834734853,-37.9473430473261288,-82.5499451298106521],"rgb":[0,0.6,0.933333333333333348],"xyz":[0.2682170792107198,0.289538574434245854,0.850667077030784147],"hpluv":[245.312254820906361,189.803165481490907,60.7408843834734853],"hsluv":[245.312254820906361,99.9999999999919424,60.7408843834734853]},"#0099ff":{"lch":[61.6548256470178444,103.309645725501895,249.051296659176671],"luv":[61.6548256470178444,-36.936501733242423,-96.4809708680364082],"rgb":[0,0.6,1],"xyz":[0.294388127620551165,0.300006993798178578,0.988501265322566],"hpluv":[249.051296659176671,212.624411607996194,61.6548256470178444],"hsluv":[249.051296659176671,99.9999999999986926,61.6548256470178444]},"#44aa00":{"lch":[61.6346835386869714,87.655425968627469,122.331376925101353],"luv":[61.6346835386869714,-46.8794507107122556,74.0661245293922],"rgb":[0.266666666666666663,0.66666666666666663,0],"xyz":[0.167579386406696784,0.29977360690638849,0.0490310792412290836],"hpluv":[122.331376925101353,180.464989524422549,61.6346835386869714],"hsluv":[122.331376925101353,100.00000000000226,61.6346835386869714]},"#44aa11":{"lch":[61.6696010074672927,86.3319887480293175,122.80087722620695],"luv":[61.6696010074672927,-46.7678581574140253,72.5670705248452492],"rgb":[0.266666666666666663,0.66666666666666663,0.0666666666666666657],"xyz":[0.168591051906333916,0.300178273106243343,0.0543591842059847133],"hpluv":[122.80087722620695,177.639660035048053,61.6696010074672927],"hsluv":[122.80087722620695,97.7717273205757778,61.6696010074672927]},"#44aa22":{"lch":[61.7342457720645541,83.9245562706402097,123.699102784065559],"luv":[61.7342457720645541,-46.5639790081192,69.8221097085679],"rgb":[0.266666666666666663,0.66666666666666663,0.133333333333333331],"xyz":[0.170466410044810918,0.300928416361634143,0.0642360704019639128],"hpluv":[123.699102784065559,172.505216938407472,61.7342457720645541],"hsluv":[123.699102784065559,93.6968530578778882,61.7342457720645541]},"#44aa33":{"lch":[61.8404488118369784,80.0901636841586111,125.261260913590505],"luv":[61.8404488118369784,-46.2365065380172098,65.3958697634278],"rgb":[0.266666666666666663,0.66666666666666663,0.2],"xyz":[0.173554160777268651,0.30216351665461727,0.080498224259575063],"hpluv":[125.261260913590505,164.340980941234676,61.8404488118369784],"hsluv":[125.261260913590505,87.1410828818075913,61.8404488118369784]},"#44aa44":{"lch":[61.9932720073472,74.8379874444649573,127.71501294923992],"luv":[61.9932720073472,-45.7809668449718501,59.2015830825281526],"rgb":[0.266666666666666663,0.66666666666666663,0.266666666666666663],"xyz":[0.178012156021487539,0.303946714752304836,0.103976999212461702],"hpluv":[127.71501294923992,153.185220958209158,61.9932720073472],"hsluv":[127.71501294923992,77.998580561819125,61.9932720073472]},"#44aa55":{"lch":[62.1967362447927883,68.3415808764166854,131.40733952388851],"luv":[62.1967362447927883,-45.2016647888952292,51.2579864704043118],"rgb":[0.266666666666666663,0.66666666666666663,0.333333333333333315],"xyz":[0.183974570060849552,0.306331680368049697,0.135379046486435617],"hpluv":[131.40733952388851,139.430168232009549,62.1967362447927883],"hsluv":[131.40733952388851,78.575415606985473,62.1967362447927883]},"#44aa66":{"lch":[62.4540496972210377,60.9745995384144,136.885019691281769],"luv":[62.4540496972210377,-44.510458035487396,41.6739836629655684],"rgb":[0.266666666666666663,0.66666666666666663,0.4],"xyz":[0.191559565834357709,0.309365678677453,0.175326690893579551],"hpluv":[136.885019691281769,123.88755407265441,62.4540496972210377],"hsluv":[136.885019691281769,79.2669246679894854,62.4540496972210377]},"#44aa77":{"lch":[62.7677273349888196,53.3862032124370103,144.988299459670287],"luv":[62.7677273349888196,-43.7251633677153,30.629998072253084],"rgb":[0.266666666666666663,0.66666666666666663,0.466666666666666674],"xyz":[0.200873578854559642,0.313091283885533811,0.22438049279997746],"hpluv":[144.988299459670287,107.927460302012818,62.7677273349888196],"hsluv":[144.988299459670287,80.0573307147673603,62.7677273349888196]},"#44aa88":{"lch":[63.1396635168947142,46.6323085826041606,156.819414130132799],"luv":[63.1396635168947142,-42.8676249510766354,18.3558964585511255],"rgb":[0.266666666666666663,0.66666666666666663,0.533333333333333326],"xyz":[0.212013995956503443,0.317547450726311409,0.283053356203549655],"hpluv":[156.819414130132799,93.7182088199909,63.1396635168947142],"hsluv":[156.819414130132799,80.9270306732118456,63.1396635168947142]},"#44aa99":{"lch":[63.5711832083111,42.2713825005608328,173.059905511526438],"luv":[63.5711832083111,-41.9616613239929848,5.10771548142927578],"rgb":[0.266666666666666663,0.66666666666666663,0.6],"xyz":[0.22507096006557617,0.322770236369940566,0.351820033844667535],"hpluv":[173.059905511526438,84.3772726773670598,63.5711832083111],"hsluv":[173.059905511526438,81.8544924931781281,63.5711832083111]},"#44aaaa":{"lch":[64.0630839897801536,41.9755778813547948,192.177050630061],"luv":[64.0630839897801536,-41.03114670244819,-8.85404646225986802],"rgb":[0.266666666666666663,0.66666666666666663,0.66666666666666663],"xyz":[0.240128653030828698,0.328793313556041689,0.431123883461666135],"hpluv":[192.177050630061,83.1434743556685731,64.0630839897801536],"hsluv":[192.177050630061,82.8180264051213868,64.0630839897801536]},"#44aabb":{"lch":[64.6156750410269893,46.3675567205894481,210.140689328835606],"luv":[64.6156750410269893,-40.0984334486196374,-23.2823098339426302],"rgb":[0.266666666666666663,0.66666666666666663,0.733333333333333282],"xyz":[0.257266245138165373,0.335648350398976447,0.521381868560307882],"hpluv":[210.140689328835606,91.0574853549996135,64.6156750410269893],"hsluv":[210.140689328835606,83.7972417316187,64.6156750410269893]},"#44aacc":{"lch":[65.2288162125558131,54.5527176111565382,224.088695054270687],"luv":[65.2288162125558131,-39.1832309762682058,-37.956203827872514],"rgb":[0.266666666666666663,0.66666666666666663,0.8],"xyz":[0.276558620581887071,0.343365300576465249,0.622988379230578],"hpluv":[224.088695054270687,106.124637545316332,65.2288162125558131],"hsluv":[224.088695054270687,84.7740840933985424,65.2288162125558131]},"#44aadd":{"lch":[65.9019585504415772,65.1392687949415574,233.984713087438024],"luv":[65.9019585504415772,-38.3019605797345406,-52.6885581021924381],"rgb":[0.266666666666666663,0.66666666666666663,0.866666666666666696],"xyz":[0.29807694613252067,0.351972630796718755,0.736318227130584],"hpluv":[233.984713087438024,125.424934833645892,65.9019585504415772],"hsluv":[233.984713087438024,85.7334354760652246,65.9019585504415772]},"#44aaee":{"lch":[66.634186587349916,77.0517400481588,240.904642753345257],"luv":[66.634186587349916,-37.4675316968449081,-67.3287064556787698],"rgb":[0.266666666666666663,0.66666666666666663,0.933333333333333348],"xyz":[0.32188912639869538,0.361497502903188772,0.861729043199107259],"hpluv":[240.904642753345257,146.73194579095005,66.634186587349916],"hsluv":[240.904642753345257,86.6633273618325717,66.634186587349916]},"#44aaff":{"lch":[67.4242620727880677,89.6163291450103827,245.832487512483851],"luv":[67.4242620727880677,-36.6894434071527229,-81.7616731231704534],"rgb":[0.266666666666666663,0.66666666666666663,1],"xyz":[0.348060174808526801,0.371965922267121496,0.999563231490889104],"hpluv":[245.832487512483851,168.659292786049974,67.4242620727880677],"hsluv":[245.832487512483851,99.9999999999982094,67.4242620727880677]},"#44bb00":{"lch":[67.1028050092269126,96.9162111575721497,123.392710981560953],"luv":[67.1028050092269126,-53.3402140179528601,80.9170782570533476],"rgb":[0.266666666666666663,0.733333333333333282,0],"xyz":[0.201533884315295564,0.367682602723587049,0.0603492452107617],"hpluv":[123.392710981560953,183.271561122122193,67.1028050092269126],"hsluv":[123.392710981560953,100.00000000000226,67.1028050092269126]},"#44bb11":{"lch":[67.1332810832727347,95.7453830613523138,123.778355355208646],"luv":[67.1332810832727347,-53.2326764896654581,79.5830417319651673],"rgb":[0.266666666666666663,0.733333333333333282,0.0666666666666666657],"xyz":[0.202545549814932696,0.368087268923441902,0.0656773501755173322],"hpluv":[123.778355355208646,180.975295348072393,67.1332810832727347],"hsluv":[123.778355355208646,98.1806384027583334,67.1332810832727347]},"#44bb22":{"lch":[67.1897165718252438,93.6085464076245728,124.511290753684577],"luv":[67.1897165718252438,-53.03566579282883,77.1348048189646391],"rgb":[0.266666666666666663,0.733333333333333282,0.133333333333333331],"xyz":[0.204420907953409697,0.368837412178832702,0.0755542363714965248],"hpluv":[124.511290753684577,176.787689053856155,67.1897165718252438],"hsluv":[124.511290753684577,94.8452524510698538,67.1897165718252438]},"#44bb33":{"lch":[67.2824703298360873,90.1849869824975627,125.771296969252688],"luv":[67.2824703298360873,-52.7177504009765485,73.1721987485246501],"rgb":[0.266666666666666663,0.733333333333333282,0.2],"xyz":[0.207508658685867431,0.370072512471815829,0.091816390229107675],"hpluv":[125.771296969252688,170.087205132927863,67.2824703298360873],"hsluv":[125.771296969252688,89.4565739304913308,67.2824703298360873]},"#44bb44":{"lch":[67.4160218575577375,85.4495691526201284,127.715012949240077],"luv":[67.4160218575577375,-52.2724357759646807,67.5960156105081182],"rgb":[0.266666666666666663,0.733333333333333282,0.266666666666666663],"xyz":[0.211966653930086318,0.371855710569503395,0.115295165181994314],"hpluv":[127.715012949240077,160.837043785954393,67.4160218575577375],"hsluv":[127.715012949240077,81.8947222100884318,67.4160218575577375]},"#44bb55":{"lch":[67.5939766620447813,79.5000401119176,130.566112214394138],"luv":[67.5939766620447813,-51.7008659583180759,60.3926886051327756],"rgb":[0.266666666666666663,0.733333333333333282,0.333333333333333315],"xyz":[0.217929067969448331,0.374240676185248256,0.146697212455968229],"hpluv":[130.566112214394138,149.244617358403957,67.5939766620447813],"hsluv":[130.566112214394138,82.2871698148834412,67.5939766620447813]},"#44bb66":{"lch":[67.8192698910356313,72.5749222232247,134.657948179728322],"luv":[67.8192698910356313,-51.0109407747319139,51.6236695420221778],"rgb":[0.266666666666666663,0.733333333333333282,0.4],"xyz":[0.225514063742956489,0.377274674494651574,0.186644856863112191],"hpluv":[134.657948179728322,135.791565604529097,67.8192698910356313],"hsluv":[134.657948179728322,82.7624878443234451,67.8192698910356313]},"#44bb77":{"lch":[68.0942730594189527,65.0902087481164671,140.487577627549143],"luv":[68.0942730594189527,-50.2162275054035163,41.4133525568618168],"rgb":[0.266666666666666663,0.733333333333333282,0.466666666666666674],"xyz":[0.234828076763158422,0.38100027970273237,0.2356986587695101],"hpluv":[140.487577627549143,121.295420087000366,68.0942730594189527],"hsluv":[140.487577627549143,83.3123735080707206,68.0942730594189527]},"#44bb88":{"lch":[68.4208577329380461,57.7058903955470939,148.752185803016886],"luv":[68.4208577329380461,-49.3345927236295907,29.9343907092910229],"rgb":[0.266666666666666663,0.733333333333333282,0.533333333333333326],"xyz":[0.245968493865102222,0.385456446543509967,0.294371522173082267],"hpluv":[148.752185803016886,107.021481540968693,68.4208577329380461],"hsluv":[148.752185803016886,83.9257037652282776,68.4208577329380461]},"#44bb99":{"lch":[68.8004384509552267,51.4171630403873507,160.23039633414129],"luv":[68.8004384509552267,-48.3866530594068536,17.3912754227620781],"rgb":[0.266666666666666663,0.733333333333333282,0.6],"xyz":[0.259025457974175,0.390679232187139125,0.363138199814200147],"hpluv":[160.23039633414129,94.8322885243955,68.8004384509552267],"hsluv":[160.23039633414129,84.5895330052649683,68.8004384509552267]},"#44bbaa":{"lch":[69.2340056114394571,47.5630236168925,175.171204236910796],"luv":[69.2340056114394571,-47.3942071553531576,4.003791165451279],"rgb":[0.266666666666666663,0.733333333333333282,0.66666666666666663],"xyz":[0.274083150939427478,0.396702309373240247,0.442442049431198747],"hpluv":[175.171204236910796,87.1744714415039113,69.2340056114394571],"hsluv":[175.171204236910796,85.2901010545764251,69.2340056114394571]},"#44bbbb":{"lch":[69.722153945093,47.4463312905994243,192.177050630061103],"luv":[69.722153945093,-46.3788106784417877,-10.0080104411700219],"rgb":[0.266666666666666663,0.733333333333333282,0.733333333333333282],"xyz":[0.291220743046764152,0.403557346216175,0.532700034529840494],"hpluv":[192.177050630061103,86.3517549054621156,69.722153945093],"hsluv":[192.177050630061103,86.0137488036252,69.722153945093]},"#44bbcc":{"lch":[70.265109629848,51.5238495855336254,208.311647260201596],"luv":[70.265109629848,-45.3606162241423405,-24.4360711219862],"rgb":[0.266666666666666663,0.733333333333333282,0.8],"xyz":[0.310513118490485907,0.411274296393663807,0.63430654520011065],"hpluv":[208.311647260201596,93.0481841100277478,70.265109629848],"hsluv":[208.311647260201596,86.7476639801695484,70.265109629848]},"#44bbdd":{"lch":[70.8627576511434683,59.1258582536945,221.390354970453018],"luv":[70.8627576511434683,-44.357542252504274,-39.0931651258026491],"rgb":[0.266666666666666663,0.733333333333333282,0.866666666666666696],"xyz":[0.332031444041119395,0.419881626613917314,0.747636393100116647],"hpluv":[221.390354970453018,105.876295000483495,70.8627576511434683],"hsluv":[221.390354970453018,87.4804162985680449,70.8627576511434683]},"#44bbee":{"lch":[71.5146701379092207,69.1277260896420813,231.126492355228834],"luv":[71.5146701379092207,-43.3847784652122499,-53.8182451576511269],"rgb":[0.266666666666666663,0.733333333333333282,0.933333333333333348],"xyz":[0.35584362430729416,0.429406498720387331,0.873047209168639871],"hpluv":[231.126492355228834,122.65816352572412,71.5146701379092207],"hsluv":[231.126492355228834,88.202277385306985,71.5146701379092207]},"#44bbff":{"lch":[72.2201358507708,80.5712163793027685,238.202407995552562],"luv":[72.2201358507708,-42.4545914747530801,-68.4786723845625573],"rgb":[0.266666666666666663,0.733333333333333282,1],"xyz":[0.382014672717125525,0.439874918084320055,1.01088139746042183],"hpluv":[238.202407995552562,141.566646923483631,72.2201358507708],"hsluv":[238.202407995552562,99.9999999999976694,72.2201358507708]},"#44cc00":{"lch":[72.503692055952385,105.959797206167082,124.178253965335855],"luv":[72.503692055952385,-59.5249745926526543,87.6598883396283384],"rgb":[0.266666666666666663,0.8,0],"xyz":[0.239757627624912484,0.444130089342821943,0.0730904929806336506],"hpluv":[124.178253965335855,185.447217969921951,72.503692055952385],"hsluv":[124.178253965335855,100.000000000002359,72.503692055952385]},"#44cc11":{"lch":[72.5305637479271752,104.914943747871533,124.498982817725434],"luv":[72.5305637479271752,-59.4229434801529877,86.4642076802510928],"rgb":[0.266666666666666663,0.8,0.0666666666666666657],"xyz":[0.240769293124549616,0.444534755542676796,0.0784185979453892873],"hpluv":[124.498982817725434,183.55052269402043,72.5305637479271752],"hsluv":[124.498982817725434,98.4921383302381628,72.5305637479271752]},"#44cc22":{"lch":[72.5803335982668,103.003123626508128,125.105641856618192],"luv":[72.5803335982668,-59.2356349500081265,84.2661440252673088],"rgb":[0.266666666666666663,0.8,0.133333333333333331],"xyz":[0.242644651263026617,0.445284898798067597,0.0882954841413684799],"hpluv":[125.105641856618192,180.082189217111164,72.5803335982668],"hsluv":[125.105641856618192,95.7225658430248387,72.5803335982668]},"#44cc33":{"lch":[72.6621573160580283,99.9260617146724144,126.139923542820412],"luv":[72.6621573160580283,-58.9323161564504758,80.6982027200153],"rgb":[0.266666666666666663,0.8,0.2],"xyz":[0.245732401995484351,0.446519999091050723,0.10455763799897963],"hpluv":[126.139923542820412,174.505777504147545,72.6621573160580283],"hsluv":[126.139923542820412,91.233607132201584,72.6621573160580283]},"#44cc44":{"lch":[72.780026014363628,95.6382843785450518,127.715012949240148],"luv":[72.780026014363628,-58.5052227586060383,75.6559339961998],"rgb":[0.266666666666666663,0.8,0.266666666666666663],"xyz":[0.250190397239703266,0.448303197188738289,0.128036412951866269],"hpluv":[127.715012949240148,166.747333178852926,72.780026014363628],"hsluv":[127.715012949240148,84.9041129363740339,72.780026014363628]},"#44cc55":{"lch":[72.9371837422115732,90.1892610669535912,129.983942971096695],"luv":[72.9371837422115732,-57.9531752136704,69.1052262456084492],"rgb":[0.266666666666666663,0.8,0.333333333333333315],"xyz":[0.256152811279065251,0.45068816280448315,0.159438460225840184],"hpluv":[129.983942971096695,156.908028239254975,72.9371837422115732],"hsluv":[129.983942971096695,85.1779272269293557,72.9371837422115732]},"#44cc66":{"lch":[73.1363103507417236,83.732792729713168,133.164212643981188],"luv":[73.1363103507417236,-57.28090462038152,61.074368962666],"rgb":[0.266666666666666663,0.8,0.4],"xyz":[0.263737807052573436,0.453722161113886469,0.199386104632984118],"hpluv":[133.164212643981188,145.278670258241675,73.1363103507417236],"hsluv":[133.164212643981188,85.5122241677148764,73.1363103507417236]},"#44cc77":{"lch":[73.3796177536812309,76.5464624175537,137.569101073773794],"luv":[73.3796177536812309,-56.4983001604517625,51.6459387330839],"rgb":[0.266666666666666663,0.8,0.466666666666666674],"xyz":[0.273051820072775342,0.457447766321967264,0.248439906539382027],"hpluv":[137.569101073773794,132.369828459728325,73.3796177536812309],"hsluv":[137.569101073773794,85.9026534082125153,73.3796177536812309]},"#44cc88":{"lch":[73.6689069899719442,69.0664605730878378,143.639563525196422],"luv":[73.6689069899719442,-55.6194534086204087,40.9469459010095278],"rgb":[0.266666666666666663,0.8,0.533333333333333326],"xyz":[0.284192237174719142,0.461903933162744862,0.307112769942954222],"hpluv":[143.639563525196422,118.965846887396481,73.6689069899719442],"hsluv":[143.639563525196422,86.3428682965135863,73.6689069899719442]},"#44cc99":{"lch":[74.0056056952011,61.9424628035573548,151.940118655705163],"luv":[74.0056056952011,-54.661526046940331,29.1373689338922652],"rgb":[0.266666666666666663,0.8,0.6],"xyz":[0.297249201283791842,0.467126718806374,0.375879447584072102],"hpluv":[151.940118655705163,106.209454381597496,74.0056056952011],"hsluv":[151.940118655705163,86.8250568088678,74.0056056952011]},"#44ccaa":{"lch":[74.3907954563299256,56.0938540204294327,163.002493202880316],"luv":[74.3907954563299256,-53.6435329798001206,16.3979214631106132],"rgb":[0.266666666666666663,0.8,0.66666666666666663],"xyz":[0.312306894249044398,0.473149795992475142,0.455183297201070702],"hpluv":[163.002493202880316,95.6831366692641581,74.3907954563299256],"hsluv":[163.002493202880316,87.3405106459777727,74.3907954563299256]},"#44ccbb":{"lch":[74.8252340948823331,52.6660587979454959,176.823724318960615],"luv":[74.8252340948823331,-52.5851528012588929,2.91812511330579927],"rgb":[0.266666666666666663,0.8,0.733333333333333282],"xyz":[0.329444486356381072,0.4800048328354099,0.545441282299712449],"hpluv":[176.823724318960615,89.3145186414393493,74.8252340948823331],"hsluv":[176.823724318960615,87.8801809558037235,74.8252340948823331]},"#44cccc":{"lch":[75.3093757141467393,52.6911947618550442,192.177050630061103],"luv":[75.3093757141467393,-51.5056671360628826,-11.1143267137884898],"rgb":[0.266666666666666663,0.8,0.8],"xyz":[0.348736861800102771,0.487721783012898702,0.647047792969982605],"hpluv":[192.177050630061103,88.7826952764381758,75.3093757141467393],"hsluv":[192.177050630061103,88.4351737608208168,75.3093757141467393]},"#44ccdd":{"lch":[75.8433901234223669,56.5143539908888,206.846753698803184],"luv":[75.8433901234223669,-50.423101427505074,-25.5222069860548118],"rgb":[0.266666666666666663,0.8,0.866666666666666696],"xyz":[0.37025518735073637,0.496329113233152208,0.760377640869988602],"hpluv":[206.846753698803184,94.5540981724771257,75.8433901234223669],"hsluv":[206.846753698803184,88.9971515077065334,75.8433901234223669]},"#44ccee":{"lch":[76.4271825186181104,63.6191993934700264,219.125479385679029],"luv":[76.4271825186181104,-49.3536035237008,-40.1450414209705926],"rgb":[0.266666666666666663,0.8,0.933333333333333348],"xyz":[0.39406736761691108,0.505853985339622225,0.885788456938511826],"hpluv":[219.125479385679029,108.248092211119214,76.4271825186181104],"hsluv":[219.125479385679029,89.5586239337052,76.4271825186181104]},"#44ccff":{"lch":[77.0604138316104752,73.087044724203011,228.6232677289035],"luv":[77.0604138316104752,-48.3110621928290342,-54.8430248647743426],"rgb":[0.266666666666666663,0.8,1],"xyz":[0.420238416026742501,0.516322404703555,1.02362264523029367],"hpluv":[228.6232677289035,128.526456918779161,77.0604138316104752],"hsluv":[228.6232677289035,99.9999999999969731,77.0604138316104752]},"#44dd00":{"lch":[77.8394471675691193,114.806757868746558,124.774603647715026],"luv":[77.8394471675691193,-65.4799812263264869,94.3025116894186],"rgb":[0.266666666666666663,0.866666666666666696,0],"xyz":[0.282391618172087688,0.529398070437173462,0.0873018231630249691],"hpluv":[124.774603647715026,210.465861771712326,77.8394471675691193],"hsluv":[124.774603647715026,100.000000000002174,77.8394471675691193]},"#44dd11":{"lch":[77.8633510332093692,113.867279553553601,125.04447057905567],"luv":[77.8633510332093692,-65.3839645843072503,93.2238946202376724],"rgb":[0.266666666666666663,0.866666666666666696,0.0666666666666666657],"xyz":[0.283403283671724793,0.529802736637028371,0.0926299281277806],"hpluv":[125.04447057905567,209.014039294370775,77.8633510332093692],"hsluv":[125.04447057905567,98.7339197526847272,77.8633510332093692]},"#44dd22":{"lch":[77.9076302523257738,112.144788460185168,125.553114236235714],"luv":[77.9076302523257738,-65.2074178024426914,91.2384033306006472],"rgb":[0.266666666666666663,0.866666666666666696,0.133333333333333331],"xyz":[0.28527864181020185,0.530552879892419171,0.102506814323759798],"hpluv":[125.553114236235714,206.347170822894697,77.9076302523257738],"hsluv":[125.553114236235714,96.4050109160080382,77.9076302523257738]},"#44dd33":{"lch":[77.9804445180848802,109.362510567887881,126.41495586461761],"luv":[77.9804445180848802,-64.9207541848309546,88.0082632130877869],"rgb":[0.266666666666666663,0.866666666666666696,0.2],"xyz":[0.288366392542659555,0.531787980185402298,0.118768968181370949],"hpluv":[126.41495586461761,202.025685311970193,77.9804445180848802],"hsluv":[126.41495586461761,92.6208241654068729,77.9804445180848802]},"#44dd44":{"lch":[78.0853727898892345,105.463232003770898,127.715012949240119],"luv":[78.0853727898892345,-64.5154806081751389,83.428089194092081],"rgb":[0.266666666666666663,0.866666666666666696,0.266666666666666663],"xyz":[0.292824387786878471,0.533571178283089864,0.142247743134257587],"hpluv":[127.715012949240119,195.940425098340825,78.0853727898892345],"hsluv":[127.715012949240119,87.2650912217990395,78.0853727898892345]},"#44dd55":{"lch":[78.2253459168282888,100.46502238820301,129.562971792001804],"luv":[78.2253459168282888,-63.9887749627021662,77.4510000079714303],"rgb":[0.266666666666666663,0.866666666666666696,0.333333333333333315],"xyz":[0.298786801826240456,0.535956143898834614,0.173649790408231475],"hpluv":[129.562971792001804,188.090878204767051,78.2253459168282888],"hsluv":[129.562971792001804,87.4605090914447,78.2253459168282888]},"#44dd66":{"lch":[78.4028117957757615,94.4661355921174,132.108441056441876],"luv":[78.4028117957757615,-63.3429373931831776,70.0822592109557],"rgb":[0.266666666666666663,0.866666666666666696,0.4],"xyz":[0.306371797599748641,0.538990142208237932,0.213597434815375464],"hpluv":[132.108441056441876,178.59774401526758,78.4028117957757615],"hsluv":[132.108441056441876,87.7006053461373654,78.4028117957757615]},"#44dd77":{"lch":[78.6198227824069278,87.656024220764337,135.559861003190832],"luv":[78.6198227824069278,-62.584854150819659,61.3735660778470375],"rgb":[0.266666666666666663,0.866666666666666696,0.466666666666666674],"xyz":[0.315685810619950546,0.542715747416318783,0.262651236721773373],"hpluv":[135.559861003190832,167.73117312681623,78.6198227824069278],"hsluv":[135.559861003190832,87.9831439767702221,78.6198227824069278]},"#44dd88":{"lch":[78.8780874692010201,80.3346414261830404,140.206181380764804],"luv":[78.8780874692010201,-61.7253288138421823,51.416324216113189],"rgb":[0.266666666666666663,0.866666666666666696,0.533333333333333326],"xyz":[0.326826227721894347,0.547171914257096326,0.321324100125345513],"hpluv":[140.206181380764804,155.961921377148798,78.8780874692010201],"hsluv":[140.206181380764804,88.3044935606717729,78.8780874692010201]},"#44dd99":{"lch":[79.1790042342924,72.9438114093828602,146.430978952194238],"luv":[79.1790042342924,-60.7782665628728651,40.3336328210091182],"rgb":[0.266666666666666663,0.866666666666666696,0.6],"xyz":[0.339883191830967046,0.552394699900725539,0.390090777766463448],"hpluv":[146.430978952194238,144.047423549525234,79.1790042342924],"hsluv":[146.430978952194238,88.6599152631773109,79.1790042342924]},"#44ddaa":{"lch":[79.5236849812282,66.109750002698334,154.681927012774025],"luv":[79.5236849812282,-59.7597565852220498,28.2713731236083063],"rgb":[0.266666666666666663,0.866666666666666696,0.66666666666666663],"xyz":[0.354940884796219602,0.558417777086826606,0.469394627383462049],"hpluv":[154.681927012774025,133.15854000611057,79.5236849812282],"hsluv":[154.681927012774025,89.0438856180527267,79.5236849812282]},"#44ddbb":{"lch":[79.9129735834354733,60.6712530747818448,165.306614809553963],"luv":[79.9129735834354733,-58.687123678359157,15.3890371376899697],"rgb":[0.266666666666666663,0.866666666666666696,0.733333333333333282],"xyz":[0.372078476903556277,0.565272813929761364,0.55965261248210374],"hpluv":[165.306614809553963,125.005338667233715,79.9129735834354733],"hsluv":[165.306614809553963,89.4504295982059574,79.9129735834354733]},"#44ddcc":{"lch":[80.3474616163736783,57.6077690930220925,178.158710030216184],"luv":[80.3474616163736783,-57.5780241737671616,1.85099760130491053],"rgb":[0.266666666666666663,0.866666666666666696,0.8],"xyz":[0.391370852347278,0.572989764107250221,0.661259123152373895],"hpluv":[178.158710030216184,121.786592068950441,80.3474616163736783],"hsluv":[178.158710030216184,89.8734379183952399,80.3474616163736783]},"#44dddd":{"lch":[80.8275029051271758,57.7489755309586,192.177050630061132],"luv":[80.8275029051271758,-56.4496501662069505,-12.1811810177875159],"rgb":[0.266666666666666663,0.866666666666666696,0.866666666666666696],"xyz":[0.412889177897911575,0.581597094327503727,0.774588971052379893],"hpluv":[192.177050630061132,125.674721736272474,80.8275029051271758],"hsluv":[192.177050630061132,90.3069463225795204,80.8275029051271758]},"#44ddee":{"lch":[81.3532277894993143,61.361693698739991,205.642938459455962],"luv":[81.3532277894993143,-55.3180860243278758,-26.5549771640468073],"rgb":[0.266666666666666663,0.866666666666666696,0.933333333333333348],"xyz":[0.436701358164086284,0.591121966433973745,0.899999787120903116],"hpluv":[205.642938459455962,137.939634766348263,81.3532277894993143],"hsluv":[205.642938459455962,90.7453615563817806,81.3532277894993143]},"#44ddff":{"lch":[81.9245576129038113,68.0382655080336463,217.195369709248553],"luv":[81.9245576129038113,-54.1978382178125813,-41.1314953029609],"rgb":[0.266666666666666663,0.866666666666666696,1],"xyz":[0.462872406573917705,0.601590385797906468,1.03783397541268507],"hpluv":[217.195369709248553,158.576151866946,81.9245576129038113],"hsluv":[217.195369709248553,99.9999999999957367,81.9245576129038113]},"#44ee00":{"lch":[83.112739541513335,123.476763986331008,125.23710114083579],"luv":[83.112739541513335,-71.241317589729718,100.852297507867192],"rgb":[0.266666666666666663,0.933333333333333348,0],"xyz":[0.329570394512602505,0.623755623118204428,0.103028081943196154],"hpluv":[125.23710114083579,311.240798427125753,83.112739541513335],"hsluv":[125.23710114083579,100.000000000002402,83.112739541513335]},"#44ee11":{"lch":[83.1341682891089135,122.626446998812852,125.466600012922257],"luv":[83.1341682891089135,-71.1513320296005674,99.8735873690646656],"rgb":[0.266666666666666663,0.933333333333333348,0.0666666666666666657],"xyz":[0.330582060012239609,0.624160289318059336,0.10835618690795179],"hpluv":[125.466600012922257,309.547675363147619,83.1341682891089135],"hsluv":[125.466600012922257,98.9247180409442279,83.1341682891089135]},"#44ee22":{"lch":[83.1738669889620184,121.064908518289769,125.897986234483838],"luv":[83.1738669889620184,-70.9856689153146192,98.0701120789979],"rgb":[0.266666666666666663,0.933333333333333348,0.133333333333333331],"xyz":[0.332457418150716666,0.624910432573450136,0.118233073103930983],"hpluv":[125.897986234483838,306.432309176179558,83.1738669889620184],"hsluv":[125.897986234483838,96.9444732717922,83.1738669889620184]},"#44ee33":{"lch":[83.2391611795664517,118.535427876706891,126.625494433478437],"luv":[83.2391611795664517,-70.7161072615436694,95.1308563805026921],"rgb":[0.266666666666666663,0.933333333333333348,0.2],"xyz":[0.335545168883174372,0.626145532866433263,0.134495226961542119],"hpluv":[126.625494433478437,301.369067751793693,83.2391611795664517],"hsluv":[126.625494433478437,93.7204451717133651,83.2391611795664517]},"#44ee44":{"lch":[83.3332795320092714,114.974418092600288,127.715012949240275],"luv":[83.3332795320092714,-70.3337997514069855,90.9520391649414],"rgb":[0.266666666666666663,0.933333333333333348,0.266666666666666663],"xyz":[0.340003164127393287,0.627928730964120829,0.157974001914428758],"hpluv":[127.715012949240275,294.205765091151079,83.3332795320092714],"hsluv":[127.715012949240275,89.1439564147074321,83.3332795320092714]},"#44ee55":{"lch":[83.4588814464859183,110.379279114867671,129.248151137931956],"luv":[83.4588814464859183,-69.8347997913980123,85.479155330485213],"rgb":[0.266666666666666663,0.933333333333333348,0.333333333333333315],"xyz":[0.345965578166755272,0.630313696579865579,0.189376049188402673],"hpluv":[129.248151137931956,284.901382538762221,83.4588814464859183],"hsluv":[129.248151137931956,89.2862876088480419,83.4588814464859183]},"#44ee66":{"lch":[83.6182069813856,104.810737833959209,131.33226272314829],"luv":[83.6182069813856,-69.2195888954281,78.7015837099029],"rgb":[0.266666666666666663,0.933333333333333348,0.4],"xyz":[0.353550573940263457,0.633347694889268897,0.229323693595546635],"hpluv":[131.33226272314829,273.53562680177663,83.6182069813856],"hsluv":[131.33226272314829,89.462046779026835,83.6182069813856]},"#44ee77":{"lch":[83.8131566406418642,98.3993759238413759,134.112401675041724],"luv":[83.8131566406418642,-68.4926783274834889,70.6483559449852123],"rgb":[0.266666666666666663,0.933333333333333348,0.466666666666666674],"xyz":[0.362864586960465363,0.637073300097349748,0.278377495501944572],"hpluv":[134.112401675041724,260.333399951005049,83.8131566406418642],"hsluv":[134.112401675041724,89.6701381262035682,83.8131566406418642]},"#44ee88":{"lch":[84.045338735079568,91.3569443918750892,137.785521400150031],"luv":[84.045338735079568,-67.6621349200187439,61.3834406553211949],"rgb":[0.266666666666666663,0.933333333333333348,0.533333333333333326],"xyz":[0.374005004062409163,0.641529466938127291,0.337050358905516712],"hpluv":[137.785521400150031,245.709311488591595,84.045338735079568],"hsluv":[137.785521400150031,89.9084899734552323,84.045338735079568]},"#44ee99":{"lch":[84.3160998906388386,83.9946679616676306,142.613931790318958],"luv":[84.3160998906388386,-66.738995210465,51.0001055321292895],"rgb":[0.266666666666666663,0.933333333333333348,0.6],"xyz":[0.387061968171481863,0.646752252581756504,0.405817036546634591],"hpluv":[142.613931790318958,230.343048149298568,84.3160998906388386],"hsluv":[142.613931790318958,90.1742147406472725,84.3160998906388386]},"#44eeaa":{"lch":[84.626546237332235,76.7502660373389887,148.925817786423067],"luv":[84.626546237332235,-65.7365837009088239,39.6144531722415607],"rgb":[0.266666666666666663,0.933333333333333348,0.66666666666666663],"xyz":[0.402119661136734419,0.652775329767857571,0.485120886163633247],"hpluv":[148.925817786423067,215.298316825794302,84.626546237332235],"hsluv":[148.925817786423067,90.4637941794664897,84.626546237332235]},"#44eebb":{"lch":[84.9775593290447,70.218708007349818,157.069253127653155],"luv":[84.9775593290447,-64.6697768267590618,27.3584889823731068],"rgb":[0.266666666666666663,0.933333333333333348,0.733333333333333282],"xyz":[0.419257253244071093,0.659630366610792329,0.575378871262274938],"hpluv":[157.069253127653155,202.183693696822303,84.9775593290447],"hsluv":[157.069253127653155,90.7732788992861401,84.9775593290447]},"#44eecc":{"lch":[85.3698091329633826,65.1592886039499462,167.256585364158155],"luv":[85.3698091329633826,-63.5542641697608914,14.3731832665241086],"rgb":[0.266666666666666663,0.933333333333333348,0.8],"xyz":[0.438549628687792792,0.667347316788281186,0.676985381932545094],"hpluv":[167.256585364158155,193.290067765431047,85.3698091329633826],"hsluv":[167.256585364158155,91.0984884260964,85.3698091329633826]},"#44eedd":{"lch":[85.803765500838054,62.4110099600490216,179.263728091065275],"luv":[85.803765500838054,-62.4058570040272613,0.801982435119061421],"rgb":[0.266666666666666663,0.933333333333333348,0.866666666666666696],"xyz":[0.460067954238426391,0.675954647008534693,0.790315229832551092],"hpluv":[179.263728091065275,191.499842549603557,85.803765500838054],"hsluv":[179.263728091065275,91.4351983708881875,85.803765500838054]},"#44eeee":{"lch":[86.2797089909746546,62.6494691870182407,192.17705063006116],"luv":[86.2797089909746546,-61.2398849709435922,-13.2148582346064085],"rgb":[0.266666666666666663,0.933333333333333348,0.933333333333333348],"xyz":[0.4838801345046011,0.68547951911500471,0.915726045901074315],"hpluv":[192.17705063006116,199.700166684316315,86.2797089909746546],"hsluv":[192.17705063006116,91.7793037580661775,86.2797089909746546]},"#44eeff":{"lch":[86.7977415696122847,66.0848691943621134,204.633388514668525],"luv":[86.7977415696122847,-60.0707080483631159,-27.5448719547627086],"rgb":[0.266666666666666663,0.933333333333333348,1],"xyz":[0.510051182914432522,0.695947938478937433,1.05356023419285627],"hpluv":[204.633388514668525,219.870556477974674,86.7977415696122847],"hsluv":[204.633388514668525,99.9999999999936904,86.7977415696122847]},"#44ff00":{"lch":[88.3264513606833,131.987460278186802,125.602389702763816],"luv":[88.3264513606833,-76.837408418496949,107.315899745634312],"rgb":[0.266666666666666663,1,0],"xyz":[0.381422766942276337,0.727460367977553535,0.120312206086420265],"hpluv":[125.602389702763816,502.990651378155178,88.3264513606833],"hsluv":[125.602389702763816,100.000000000002331,88.3264513606833]},"#44ff11":{"lch":[88.3457924202418496,131.213348009411362,125.799444038401859],"luv":[88.3457924202418496,-76.7532223203665609,106.423143908077066],"rgb":[0.266666666666666663,1,0.0666666666666666657],"xyz":[0.382434432441913441,0.727865034177408443,0.125640311051175901],"hpluv":[125.799444038401859,500.950310911531346,88.3457924202418496],"hsluv":[125.799444038401859,99.9999999999917577,88.3457924202418496]},"#44ff22":{"lch":[88.3816266358799538,129.789896608084,126.169061428897493],"luv":[88.3816266358799538,-76.5980824061806089,104.776672180562713],"rgb":[0.266666666666666663,1,0.133333333333333331],"xyz":[0.384309790580390498,0.728615177432799244,0.13551719724715508],"hpluv":[126.169061428897493,497.190929074143924,88.3816266358799538],"hsluv":[126.169061428897493,99.9999999999915445,88.3816266358799538]},"#44ff33":{"lch":[88.4405736189592204,127.478814054469,126.790121098902588],"luv":[88.4405736189592204,-76.3452168675528071,102.089450454884],"rgb":[0.266666666666666663,1,0.2],"xyz":[0.387397541312848204,0.72985027772578237,0.15177935110476623],"hpluv":[126.790121098902588,491.06642972530841,88.4405736189592204],"hsluv":[126.790121098902588,99.9999999999916,88.4405736189592204]},"#44ff44":{"lch":[88.5255621746627099,124.213522374992053,127.715012949240247],"luv":[88.5255621746627099,-75.9856771103925,98.2607552122302],"rgb":[0.266666666666666663,1,0.266666666666666663],"xyz":[0.391855536557067119,0.731633475823469936,0.175258126057652869],"hpluv":[127.715012949240247,482.369437382385513,88.5255621746627099],"hsluv":[127.715012949240247,99.9999999999915872,88.5255621746627099]},"#44ff55":{"lch":[88.6390158335401,119.977757557138,129.006344472088813],"luv":[88.6390158335401,-75.5147735105559832,93.2318684253877734],"rgb":[0.266666666666666663,1,0.333333333333333315],"xyz":[0.397817950596429104,0.734018441439214686,0.206660173331626784],"hpluv":[129.006344472088813,471.012302242813519,88.6390158335401],"hsluv":[129.006344472088813,99.9999999999916724,88.6390158335401]},"#44ff66":{"lch":[88.7829895920100256,114.806361082699226,130.743859599912923],"luv":[88.7829895920100256,-74.9316504675157518,86.9813100801842438],"rgb":[0.266666666666666663,1,0.4],"xyz":[0.405402946369937289,0.737052439748618,0.246607817738770746],"hpluv":[130.743859599912923,457.03528250903878,88.7829895920100256],"hsluv":[130.743859599912923,99.999999999991374,88.7829895920100256]},"#44ff77":{"lch":[88.9592430558717524,108.789243130847709,133.032335199193767],"luv":[88.9592430558717524,-74.2389756563468239,79.5215311376676226],"rgb":[0.266666666666666663,1,0.466666666666666674],"xyz":[0.414716959390139195,0.740778044956698856,0.295661619645168683],"hpluv":[133.032335199193767,440.631455855157412,88.9592430558717524],"hsluv":[133.032335199193767,99.999999999991374,88.9592430558717524]},"#44ff88":{"lch":[89.1692840038805343,102.078340317719523,136.01097660716411],"luv":[89.1692840038805343,-73.4425963051882462,70.8955048643657904],"rgb":[0.266666666666666663,1,0.533333333333333326],"xyz":[0.425857376492083,0.745234211797476398,0.354334483048740823],"hpluv":[136.01097660716411,422.1930512248951,89.1692840038805343],"hsluv":[136.01097660716411,99.9999999999912177,89.1692840038805343]},"#44ff99":{"lch":[89.4143964062191117,94.8987049380611438,139.863519733640288],"luv":[89.4143964062191117,-72.5511163277215303,61.1727040314764139],"rgb":[0.266666666666666663,1,0.6],"xyz":[0.43891434060115575,0.750456997441105611,0.423101160689858702],"hpluv":[139.863519733640288,402.3908266141122,89.4143964062191117],"hsluv":[139.863519733640288,99.9999999999912,89.4143964062191117]},"#44ffaa":{"lch":[89.695659684091666,87.5652599917726207,144.82485232612342],"luv":[89.695659684091666,-71.5753927145854192,50.4444042008586777],"rgb":[0.266666666666666663,1,0.66666666666666663],"xyz":[0.453972033566408251,0.756480074627206678,0.502405010306857358],"hpluv":[144.82485232612342,382.304282325397367,89.695659684091666],"hsluv":[144.82485232612342,99.9999999999909335,89.695659684091666]},"#44ffbb":{"lch":[90.0139628620153616,80.5050918065685153,151.171682460988421],"luv":[90.0139628620153616,-70.527972915407986,38.8184858440859557],"rgb":[0.266666666666666663,1,0.733333333333333282],"xyz":[0.471109625673744925,0.763335111470141436,0.592662995405499],"hpluv":[151.171682460988421,363.621116250194575,90.0139628620153616],"hsluv":[151.171682460988421,99.999999999990834,90.0139628620153616]},"#44ffcc":{"lch":[90.3700157308713443,74.2777558665274853,159.169074542576084],"luv":[90.3700157308713443,-69.4225064855060481,26.4140229771485018],"rgb":[0.266666666666666663,1,0.8],"xyz":[0.490402001117466679,0.771052061647630294,0.694269506075769205],"hpluv":[159.169074542576084,348.900804743837909,90.3700157308713443],"hsluv":[159.169074542576084,99.9999999999905924,90.3700157308713443]},"#44ffdd":{"lch":[90.7643583149998,69.56728840997188,168.931262835156701],"luv":[90.7643583149998,-68.2731674827513899,13.3559806299794577],"rgb":[0.266666666666666663,1,0.866666666666666696],"xyz":[0.511920326668100167,0.7796593918678838,0.807599353975775203],"hpluv":[168.931262835156701,341.810509676969502,90.7643583149998],"hsluv":[168.931262835156701,99.9999999999902798,90.7643583149998]},"#44ffee":{"lch":[91.1973694573754869,67.0945142582603182,180.196137266844971],"luv":[91.1973694573754869,-67.094121132442,-0.229680249688981986],"rgb":[0.266666666666666663,1,0.933333333333333348],"xyz":[0.535732506934274877,0.789184263974353817,0.933010170044298426],"hpluv":[180.196137266844971,347.079488330816218,91.1973694573754869],"hsluv":[180.196137266844971,99.999999999989825,91.1973694573754869]},"#44ffff":{"lch":[91.6692750397398726,67.4158875874256,192.177050630061103],"luv":[91.6692750397398726,-65.8990611515587261,-14.2202545175369188],"rgb":[0.266666666666666663,1,1],"xyz":[0.561903555344106298,0.799652683338286541,1.07084435833608027],"hpluv":[192.177050630061103,369.886157390881351,91.6692750397398726],"hsluv":[192.177050630061103,99.9999999999897,91.6692750397398726]},"#33aa00":{"lch":[61.1785977172963129,90.1064171712311435,124.683940112874311],"luv":[61.1785977172963129,-51.2749716142469723,74.09482911373847],"rgb":[0.2,0.66666666666666663,0],"xyz":[0.157393059993970491,0.294521282349826385,0.0485535951906325494],"hpluv":[124.683940112874311,186.894073454811917,61.1785977172963129],"hsluv":[124.683940112874311,100.000000000002302,61.1785977172963129]},"#33aa11":{"lch":[61.2139288108167818,88.7849168066190089,125.171000261233829],"luv":[61.2139288108167818,-51.1417680861379793,72.5760360544852148],"rgb":[0.2,0.66666666666666663,0.0666666666666666657],"xyz":[0.158404725493607623,0.294925948549681238,0.0538817001553881791],"hpluv":[125.171000261233829,184.046797309440706,61.2139288108167818],"hsluv":[125.171000261233829,97.729263879491441,61.2139288108167818]},"#33aa22":{"lch":[61.2793378507832642,86.3832953662584657,126.10140218084841],"luv":[61.2793378507832642,-50.8984310656693708,69.7955831939783593],"rgb":[0.2,0.66666666666666663,0.133333333333333331],"xyz":[0.160280083632084625,0.295676091805072039,0.0637585863513673717],"hpluv":[126.10140218084841,178.877217305585333,61.2793378507832642],"hsluv":[126.10140218084841,93.5778090815338146,61.2793378507832642]},"#33aa33":{"lch":[61.3867923044640946,82.5646745763668548,127.715012949240119],"luv":[61.3867923044640946,-50.5076466968263134,65.3138814728533],"rgb":[0.2,0.66666666666666663,0.2],"xyz":[0.163367834364542386,0.296911192098055166,0.0800207402089785219],"hpluv":[127.715012949240119,170.670578118814461,61.3867923044640946],"hsluv":[127.715012949240119,86.9017438736093339,61.3867923044640946]},"#33aa44":{"lch":[61.5414071550205364,77.3485744588317488,130.237764523164799],"luv":[61.5414071550205364,-49.9641607354037305,59.0456146789935588],"rgb":[0.2,0.66666666666666663,0.266666666666666663],"xyz":[0.167825829608761246,0.298694390195742732,0.10349951516186516],"hpluv":[130.237764523164799,159.486606837004757,61.5414071550205364],"hsluv":[130.237764523164799,87.1702267355774723,61.5414071550205364]},"#33aa55":{"lch":[61.7472402279952775,70.9239260559490106,134.00596147156574],"luv":[61.7472402279952775,-49.2732069613111605,51.0132763399638876],"rgb":[0.2,0.66666666666666663,0.333333333333333315],"xyz":[0.173788243648123231,0.301079355811487592,0.134901562435839062],"hpluv":[134.00596147156574,145.752006815371971,61.7472402279952775],"hsluv":[134.00596147156574,87.512567621072165,61.7472402279952775]},"#33aa66":{"lch":[62.0075227235960824,63.6834089970413046,139.532932917076664],"luv":[62.0075227235960824,-48.4490087982300253,41.3312246123130436],"rgb":[0.2,0.66666666666666663,0.4],"xyz":[0.181373239421631416,0.304113354120890911,0.174849206842983024],"hpluv":[139.532932917076664,130.323054003441854,62.0075227235960824],"hsluv":[139.532932917076664,87.9225345315596769,62.0075227235960824]},"#33aa77":{"lch":[62.3247799262656201,56.2910074750267,147.571074265173024],"luv":[62.3247799262656201,-47.5128361285441727,30.1862207898839152],"rgb":[0.2,0.66666666666666663,0.466666666666666674],"xyz":[0.190687252441833321,0.307838959328971706,0.223903008749380933],"hpluv":[147.571074265173024,114.608702125460667,62.3247799262656201],"hsluv":[147.571074265173024,88.3905588997681519,62.3247799262656201]},"#33aa88":{"lch":[62.7009046876535052,49.786919253891476,159.033972270618222],"luv":[62.7009046876535052,-46.4906641824602147,17.8144736848221363],"rgb":[0.2,0.66666666666666663,0.533333333333333326],"xyz":[0.201827669543777177,0.312295126169749304,0.2825758721529531],"hpluv":[159.033972270618222,100.758286424528237,62.7009046876535052],"hsluv":[159.033972270618222,88.9048289963628804,62.7009046876535052]},"#33aa99":{"lch":[63.1372095297142835,45.6309193537352797,174.368717478757389],"luv":[63.1372095297142835,-45.4107033068770818,4.47759156711236095],"rgb":[0.2,0.66666666666666663,0.6],"xyz":[0.214884633652849877,0.317517911813378462,0.351342549794071035],"hpluv":[174.368717478757389,91.7092542399893631,63.1372095297142835],"hsluv":[174.368717478757389,89.4524406674979,63.1372095297142835]},"#33aaaa":{"lch":[63.6344696573538897,45.3208071547743288,192.17705063006116],"luv":[63.6344696573538897,-44.3011098571894,-9.5596666563997],"rgb":[0.2,0.66666666666666663,0.66666666666666663],"xyz":[0.229942326618102433,0.323540988999479584,0.430646399411069636],"hpluv":[192.17705063006116,90.3742140686623117,63.6344696573538897],"hsluv":[192.17705063006116,90.0204628815860559,63.6344696573538897]},"#33aabb":{"lch":[64.1929631055189844,49.4317459506583177,209.109442205543161],"luv":[64.1929631055189844,-43.188124160558381,-24.0475245965695663],"rgb":[0.2,0.66666666666666663,0.733333333333333282],"xyz":[0.247079918725439052,0.330396025842414343,0.520904384509711327],"hpluv":[209.109442205543161,97.7142389408223835,64.1929631055189844],"hsluv":[209.109442205543161,90.5968047396532228,64.1929631055189844]},"#33aacc":{"lch":[64.8125111239688181,57.2242456540803062,222.641155468482083],"luv":[64.8125111239688181,-42.0947673064025736,-38.7639633693247347],"rgb":[0.2,0.66666666666666663,0.8],"xyz":[0.266372294169160806,0.338112976019903144,0.622510895179981483],"hpluv":[222.641155468482083,112.036763534802631,64.8125111239688181],"hsluv":[222.641155468482083,91.1708232266795875,64.8125111239688181]},"#33aadd":{"lch":[65.4925201274692199,67.4454999587780151,232.519386199289158],"luv":[65.4925201274692199,-41.0401119544032653,-53.5220017886062465],"rgb":[0.2,0.66666666666666663,0.866666666666666696],"xyz":[0.28789061971979435,0.34672030624015665,0.73584074307998748],"hpluv":[232.519386199289158,130.67743538587149,65.4925201274692199],"hsluv":[232.519386199289158,91.7336648454097485,65.4925201274692199]},"#33aaee":{"lch":[66.23202547083838,79.0605595482254,239.573325902293959],"luv":[66.23202547083838,-40.039054494753934,-68.1721804788773],"rgb":[0.2,0.66666666666666663,0.933333333333333348],"xyz":[0.311702799985969059,0.356245178346626667,0.861251559148510704],"hpluv":[239.573325902293959,151.471586303299148,66.23202547083838],"hsluv":[239.573325902293959,92.278374899274425,66.23202547083838]},"#33aaff":{"lch":[67.0297366624436,91.3892467801412778,244.667711773110682],"luv":[67.0297366624436,-39.1024682991195291,-82.6014007142609898],"rgb":[0.2,0.66666666666666663,1],"xyz":[0.33787384839580048,0.366713597710559391,0.999085747440292549],"hpluv":[244.667711773110682,173.00828905748071,67.0297366624436],"hsluv":[244.667711773110682,99.9999999999982094,67.0297366624436]},"#33bb00":{"lch":[66.705199456007648,99.1588934495857757,125.274120260315158],"luv":[66.705199456007648,-57.2631629787864327,80.9531735993793262],"rgb":[0.2,0.733333333333333282,0],"xyz":[0.191347557902569271,0.362430278167024944,0.0598717611601651684],"hpluv":[125.274120260315158,188.630237299381349,66.705199456007648],"hsluv":[125.274120260315158,100.000000000002331,66.705199456007648]},"#33bb11":{"lch":[66.7359690986495764,97.9890755357957914,125.670572132139952],"luv":[66.7359690986495764,-57.1397853669544133,79.6046723036925385],"rgb":[0.2,0.733333333333333282,0.0666666666666666657],"xyz":[0.192359223402206403,0.362834944366879797,0.0651998661249208],"hpluv":[125.670572132139952,186.318944611331347,66.7359690986495764],"hsluv":[125.670572132139952,98.1524285745497451,66.7359690986495764]},"#33bb22":{"lch":[66.7929473545782,95.8553977164860243,126.423299967719473],"luv":[66.7929473545782,-56.9137739802675,77.1302768224563],"rgb":[0.2,0.733333333333333282,0.133333333333333331],"xyz":[0.194234581540683404,0.363585087622270597,0.0750767523209],"hpluv":[126.423299967719473,182.106434833594022,66.7929473545782],"hsluv":[126.423299967719473,94.7659081903439073,66.7929473545782]},"#33bb33":{"lch":[66.8865907457163,92.4406335233364302,127.715012949240233],"luv":[66.8865907457163,-56.5491099236273058,73.126389853740946],"rgb":[0.2,0.733333333333333282,0.2],"xyz":[0.197322332273141166,0.364820187915253724,0.0913389061785111478],"hpluv":[127.715012949240233,175.373180985258983,66.8865907457163],"hsluv":[127.715012949240233,89.2962069049265637,66.8865907457163]},"#33bb44":{"lch":[67.0214179407225572,87.725631811763563,129.70178400392939],"luv":[67.0214179407225572,-56.0384119529137763,67.4943172612971409],"rgb":[0.2,0.733333333333333282,0.266666666666666663],"xyz":[0.201780327517360025,0.36660338601294129,0.114817681131397786],"hpluv":[129.70178400392939,166.093340387543549,67.0214179407225572],"hsluv":[129.70178400392939,89.4761749642590871,67.0214179407225572]},"#33bb55":{"lch":[67.2010629421400552,81.8171313208689099,132.60288320444127],"luv":[67.2010629421400552,-55.3830806540106479,60.2225651632978796],"rgb":[0.2,0.733333333333333282,0.333333333333333315],"xyz":[0.207742741556722,0.368988351628686151,0.146219728405371674],"hpluv":[132.60288320444127,154.492511096020365,67.2010629421400552],"hsluv":[132.60288320444127,89.7076242739581,67.2010629421400552]},"#33bb66":{"lch":[67.4284803792762091,74.9653268862145,136.738510871982356],"luv":[67.4284803792762091,-54.5922668909562248,51.3759148907695788],"rgb":[0.2,0.733333333333333282,0.4],"xyz":[0.215327737330230196,0.372022349938089469,0.186167372812515663],"hpluv":[136.738510871982356,141.07705768332076,67.4284803792762091],"hsluv":[136.738510871982356,89.9877463438330096,67.4284803792762091]},"#33bb77":{"lch":[67.7060530794905446,67.5982244112705,142.572908280802977],"luv":[67.7060530794905446,-53.681598162732449,41.0829156980295878],"rgb":[0.2,0.733333333333333282,0.466666666666666674],"xyz":[0.224641750350432101,0.375747955146170265,0.235221174718913573],"hpluv":[142.572908280802977,126.69139486293237,67.7060530794905446],"hsluv":[142.572908280802977,90.3115397167098,67.7060530794905446]},"#33bb88":{"lch":[68.0356563096068641,60.380187227113133,150.730801091974854],"luv":[68.0356563096068641,-52.67158330257773,29.5206931148449],"rgb":[0.2,0.733333333333333282,0.533333333333333326],"xyz":[0.235782167452375957,0.380204121986947863,0.293894038122485712],"hpluv":[150.730801091974854,112.615249481580875,68.0356563096068641],"hsluv":[150.730801091974854,90.6723452470342437,68.0356563096068641]},"#33bb99":{"lch":[68.4187011865960244,54.2829584497859159,161.862695711717],"luv":[68.4187011865960244,-51.585814888834193,16.8980259295610082],"rgb":[0.2,0.733333333333333282,0.6],"xyz":[0.248839131561448657,0.385426907630577,0.362660715763603647],"hpluv":[161.862695711717,100.676477021468287,68.4187011865960244],"hsluv":[161.862695711717,91.0624469223214,68.4187011865960244]},"#33bbaa":{"lch":[68.8561680799326439,50.5661966451060749,176.101011456941364],"luv":[68.8561680799326439,-50.4491601398581224,3.43838397135738649],"rgb":[0.2,0.733333333333333282,0.66666666666666663],"xyz":[0.263896824526701212,0.391449984816678143,0.441964565380602248],"hpluv":[176.101011456941364,93.1873079321678404,68.8561680799326439],"hsluv":[176.101011456941364,91.473675634614068,68.8561680799326439]},"#33bbbb":{"lch":[69.3486356756669835,50.4205674478029,192.177050630061103],"luv":[69.3486356756669835,-49.286127891295429,-10.635375839212843],"rgb":[0.2,0.733333333333333282,0.733333333333333282],"xyz":[0.281034416634037831,0.398305021659612901,0.532222550479243939],"hpluv":[192.177050630061103,92.2590830970113132,69.3486356756669835],"hsluv":[192.177050630061103,91.8979539795913922,69.3486356756669835]},"#33bbcc":{"lch":[69.8963087653012423,54.2786660468549442,207.559867588447844],"luv":[69.8963087653012423,-48.1195504219082224,-25.1133919457216273],"rgb":[0.2,0.733333333333333282,0.8],"xyz":[0.300326792077759586,0.406021971837101703,0.633829061149514095],"hpluv":[207.559867588447844,98.540384199822455,69.8963087653012423],"hsluv":[207.559867588447844,92.3277362004695306,69.8963087653012423]},"#33bbdd":{"lch":[70.4990463576295241,61.569428837921933,220.28187220447964],"luv":[70.4990463576295241,-46.9696505240293618,-39.807618580850594],"rgb":[0.2,0.733333333333333282,0.866666666666666696],"xyz":[0.321845117628393129,0.414629302057355209,0.747158909049520092],"hpluv":[220.28187220447964,110.820781636478685,70.4990463576295241],"hsluv":[220.28187220447964,92.7563200135089119,70.4990463576295241]},"#33bbee":{"lch":[71.1563908243766576,71.2672074810155181,229.953995552192254],"luv":[71.1563908243766576,-45.8534981630350487,-54.557048750410388],"rgb":[0.2,0.733333333333333282,0.933333333333333348],"xyz":[0.345657297894567894,0.424154174163825226,0.872569725118043316],"hpluv":[229.953995552192254,127.091105244163856,71.1563908243766576],"hsluv":[229.953995552192254,93.1780289437208893,71.1563908243766576]},"#33bbff":{"lch":[71.8675982303626597,82.4526478797043296,237.101125866277243],"luv":[71.8675982303626597,-44.7848112977892,-69.2297610814592161],"rgb":[0.2,0.733333333333333282,1],"xyz":[0.37182834630439926,0.43462259352775795,1.01040391340982527],"hpluv":[237.101125866277243,145.583046200088774,71.8675982303626597],"hsluv":[237.101125866277243,99.9999999999977831,71.8675982303626597]},"#33cc00":{"lch":[72.1534232831706532,108.011475964841438,125.713046635977918],"luv":[72.1534232831706532,-63.0491190384013507,87.6999859098336287],"rgb":[0.2,0.8,0],"xyz":[0.229571301212186191,0.438877764786259839,0.0726130089300371234],"hpluv":[125.713046635977918,189.955680955455,72.1534232831706532],"hsluv":[125.713046635977918,100.000000000002402,72.1534232831706532]},"#33cc11":{"lch":[72.1805088449519,106.967132064598133,126.040754358939225],"luv":[72.1805088449519,-62.9352412435677095,86.493483868665578],"rgb":[0.2,0.8,0.0666666666666666657],"xyz":[0.230582966711823323,0.439282430986114691,0.0779411138947927601],"hpluv":[126.040754358939225,188.048441784684599,72.1805088449519],"hsluv":[126.040754358939225,98.4728126855506645,72.1805088449519]},"#33cc22":{"lch":[72.2306742907645543,105.057034533260762,126.660198785960176],"luv":[72.2306742907645543,-62.7261976516662614,84.2757653960309199],"rgb":[0.2,0.8,0.133333333333333331],"xyz":[0.232458324850300324,0.440032574241505492,0.0878180000907719527],"hpluv":[126.660198785960176,184.562215611711281,72.2306742907645543],"hsluv":[126.660198785960176,95.6680740449206866,72.2306742907645543]},"#33cc33":{"lch":[72.31314692234902,101.984984863208481,127.715012949240304],"luv":[72.31314692234902,-62.3877173898115416,80.6765756365369668],"rgb":[0.2,0.8,0.2],"xyz":[0.235546075582758085,0.441267674534488619,0.104080153948383103],"hpluv":[127.715012949240304,178.960959976488198,72.31314692234902],"hsluv":[127.715012949240304,91.1230258822071306,72.31314692234902]},"#33cc44":{"lch":[72.4319472107582669,97.7091257880760651,129.318260791805528],"luv":[72.4319472107582669,-61.9111863445413135,75.5915224590797123],"rgb":[0.2,0.8,0.266666666666666663],"xyz":[0.240004070826976945,0.443050872632176185,0.127558928901269741],"hpluv":[129.318260791805528,171.176559629977817,72.4319472107582669],"hsluv":[129.318260791805528,91.2471619418673612,72.4319472107582669]},"#33cc55":{"lch":[72.590341240881628,92.2844112105744756,131.621023493746776],"luv":[72.590341240881628,-61.2953573189119396,68.9876200751215407],"rgb":[0.2,0.8,0.333333333333333315],"xyz":[0.24596648486633893,0.445435838247921045,0.158960976175243629],"hpluv":[131.621023493746776,161.32023063104279,72.590341240881628],"hsluv":[131.621023493746776,91.4078622695478,72.590341240881628]},"#33cc66":{"lch":[72.7910248315973405,85.8719567505974197,134.835055825888389],"luv":[72.7910248315973405,-60.5455878238572112,60.8951948123993319],"rgb":[0.2,0.8,0.4],"xyz":[0.253551480639847115,0.448469836557324364,0.198908620582387619],"hpluv":[134.835055825888389,149.696915507144809,72.7910248315973405],"hsluv":[134.835055825888389,91.6039613293452533,72.7910248315973405]},"#33cc77":{"lch":[73.0362204241858421,78.757716060864837,139.259917231121676],"luv":[73.0362204241858421,-59.6729854923348,51.3995393126768079],"rgb":[0.2,0.8,0.466666666666666674],"xyz":[0.262865493660049,0.452195441765405159,0.247962422488785528],"hpluv":[139.259917231121676,136.834039856532058,73.0362204241858421],"hsluv":[139.259917231121676,91.8328510325735294,73.0362204241858421]},"#33cc88":{"lch":[73.3277345291399,71.3846311778678597,145.306874573990314],"luv":[73.3277345291399,-58.6933246064594201,40.6307668527313197],"rgb":[0.2,0.8,0.533333333333333326],"xyz":[0.274005910761992877,0.456651608606182757,0.306635285892357667],"hpluv":[145.306874573990314,123.530949311180805,73.3277345291399],"hsluv":[145.306874573990314,92.0907512285691894,73.3277345291399]},"#33cc99":{"lch":[73.6669954969027714,64.400374936046,153.483372150156],"luv":[73.6669954969027714,-57.6257667092137709,28.7520312861295437],"rgb":[0.2,0.8,0.6],"xyz":[0.287062874871065576,0.461874394249811915,0.375401963533475602],"hpluv":[153.483372150156,110.931469165383049,73.6669954969027714],"hsluv":[153.483372150156,92.3730273510429072,73.6669954969027714]},"#33ccaa":{"lch":[74.0550811623464114,58.6991946004706691,164.236139418897579],"luv":[74.0550811623464114,-56.4914910882685106,15.9470022690160835],"rgb":[0.2,0.8,0.66666666666666663],"xyz":[0.302120567836318132,0.467897471435913037,0.454705813150474203],"hpluv":[164.236139418897579,100.581152280716978,74.0550811623464114],"hsluv":[164.236139418897579,92.6745296641919794,74.0550811623464114]},"#33ccbb":{"lch":[74.4927414449451106,55.3647402049724846,177.507530206592946],"luv":[74.4927414449451106,-55.3123621552270137,2.40770653799565881],"rgb":[0.2,0.8,0.733333333333333282],"xyz":[0.319258159943654751,0.474752508278847796,0.544963798249115894],"hpluv":[177.507530206592946,94.310193436061823,74.4927414449451106],"hsluv":[177.507530206592946,92.9899230693886,74.4927414449451106]},"#33cccc":{"lch":[74.9804187561532416,55.3552144916165361,192.177050630061132],"luv":[74.9804187561532416,-54.1097476482840918,-11.6762571422475752],"rgb":[0.2,0.8,0.8],"xyz":[0.338550535387376506,0.482469458456336597,0.646570308919386],"hpluv":[192.177050630061132,93.6806731785530928,74.9804187561532416],"hsluv":[192.177050630061132,93.3139795405001422,74.9804187561532416]},"#33ccdd":{"lch":[75.5182678303382602,59.0031963362726231,206.282454691493683],"luv":[75.5182678303382602,-52.9035678654544128,-26.1264173778571198],"rgb":[0.2,0.8,0.866666666666666696],"xyz":[0.360068860938010049,0.491076788676590104,0.759900156819392],"hpluv":[206.282454691493683,99.1431801932779564,75.5182678303382602],"hsluv":[206.282454691493683,93.6418135046530296,75.5182678303382602]},"#33ccee":{"lch":[76.106175853756767,65.8577115847402439,218.26062431545347],"luv":[76.106175853756767,-51.7116147040808585,-40.7817003063324606],"rgb":[0.2,0.8,0.933333333333333348],"xyz":[0.383881041204184759,0.500601660783060121,0.885310972887915271],"hpluv":[218.26062431545347,110.229350215344013,76.106175853756767],"hsluv":[218.26062431545347,93.969050662624,76.106175853756767]},"#33ccff":{"lch":[76.7437832939395435,75.0714180144803,227.674056146546604],"luv":[76.7437832939395435,-50.5491406549608,-55.5022718611574248],"rgb":[0.2,0.8,1],"xyz":[0.41005208961401618,0.511070080146992844,1.02314516117969712],"hpluv":[227.674056146546604,129.845560156838474,76.7437832939395435],"hsluv":[227.674056146546604,99.9999999999969731,76.7437832939395435]},"#33dd00":{"lch":[77.5280782787270653,116.686614644285086,126.047543424376144],"luv":[77.5280782787270653,-68.6649809221669187,94.3445092843369508],"rgb":[0.2,0.866666666666666696,0],"xyz":[0.272205291759361367,0.524145745880611358,0.0868243391124284419],"hpluv":[126.047543424376144,210.356208283509261,77.5280782787270653],"hsluv":[126.047543424376144,100.000000000002416,77.5280782787270653]},"#33dd11":{"lch":[77.5521415069474926,115.747372453695789,126.322097671746874],"luv":[77.5521415069474926,-68.5599423432795,93.2576459912042],"rgb":[0.2,0.866666666666666696,0.0666666666666666657],"xyz":[0.273216957258998472,0.524550412080466266,0.0921524440771840786],"hpluv":[126.322097671746874,208.932074165120611,77.5521415069474926],"hsluv":[126.322097671746874,98.7203227917640902,77.5521415069474926]},"#33dd22":{"lch":[77.5967156031793337,114.025807364398673,126.839335004613],"luv":[77.5967156031793337,-68.36681588768,91.2571270119929778],"rgb":[0.2,0.866666666666666696,0.133333333333333331],"xyz":[0.275092315397475529,0.525300555335857067,0.102029330273163271],"hpluv":[126.839335004613,206.31706664059891,77.5967156031793337],"hsluv":[126.839335004613,96.3665979525037102,77.5967156031793337]},"#33dd33":{"lch":[77.670013861504259,111.246421345384377,127.715012949240332],"luv":[77.670013861504259,-68.0532561222895,88.0029578668175247],"rgb":[0.2,0.866666666666666696,0.2],"xyz":[0.278180066129933234,0.526535655628840193,0.118291484130774421],"hpluv":[127.715012949240332,202.082466523340599,77.670013861504259],"hsluv":[127.715012949240332,92.5426273046004439,77.670013861504259]},"#33dd44":{"lch":[77.7756375941771267,107.354265763003397,129.034195217585733],"luv":[77.7756375941771267,-67.6100090567609726,83.3895979895470134],"rgb":[0.2,0.866666666666666696,0.266666666666666663],"xyz":[0.28263806137415215,0.52831885372652776,0.14177025908366106],"hpluv":[129.034195217585733,196.125875311323085,77.7756375941771267],"hsluv":[129.034195217585733,92.6304308505642098,77.7756375941771267]},"#33dd55":{"lch":[77.9165348137244,102.370875286307594,130.905664069221132],"luv":[77.9165348137244,-67.0340391276217105,77.3707548439410431],"rgb":[0.2,0.866666666666666696,0.333333333333333315],"xyz":[0.288600475413514135,0.530703819342272509,0.173172306357634975],"hpluv":[130.905664069221132,188.454179514464698,77.9165348137244],"hsluv":[130.905664069221132,92.7446831943234287,77.9165348137244]},"#33dd66":{"lch":[78.095166356878579,96.3992072274516261,133.476315028685519],"luv":[78.095166356878579,-66.3279238591037767,69.9529389705828777],"rgb":[0.2,0.866666666666666696,0.4],"xyz":[0.29618547118702232,0.533737817651675828,0.213119950764778909],"hpluv":[133.476315028685519,179.196222734944627,78.095166356878579],"hsluv":[133.476315028685519,92.8850067954864187,78.095166356878579]},"#33dd77":{"lch":[78.3135937781308513,89.6343875602499196,136.948304354896891],"luv":[78.3135937781308513,-65.499258897229538,61.1896275296294192],"rgb":[0.2,0.866666666666666696,0.466666666666666674],"xyz":[0.305499484207224226,0.537463422859756679,0.262173752671176818],"hpluv":[136.948304354896891,168.630388284117117,78.3135937781308513],"hsluv":[136.948304354896891,93.050064801238122,78.3135937781308513]},"#33dd88":{"lch":[78.5735314106716487,82.3820261839553609,141.59738099104726],"luv":[78.5735314106716487,-64.5599157920348432,51.1743638074698],"rgb":[0.2,0.866666666666666696,0.533333333333333326],"xyz":[0.316639901309168,0.541919589700534221,0.320846616074749],"hpluv":[141.59738099104726,157.233383580683977,78.5735314106716487],"hsluv":[141.59738099104726,93.2377028740416449,78.5735314106716487]},"#33dd99":{"lch":[78.8763801167060592,75.0869406053615762,147.781507566587862],"luv":[78.8763801167060592,-63.5251386535812799,40.0325543591259105],"rgb":[0.2,0.866666666666666696,0.6],"xyz":[0.329696865418240725,0.547142375344163434,0.389613293715866893],"hpluv":[147.781507566587862,145.760006886720333,78.8763801167060592],"hsluv":[147.781507566587862,93.4451205095912343,78.8763801167060592]},"#33ddaa":{"lch":[79.2232512041385633,68.3697583649377094,155.904677195463563],"luv":[79.2232512041385633,-62.4125308872686801,27.9123601138582131],"rgb":[0.2,0.866666666666666696,0.66666666666666663],"xyz":[0.344754558383493281,0.553165452530264501,0.468917143332865494],"hpluv":[155.904677195463563,135.355769729163313,79.2232512041385633],"hsluv":[155.904677195463563,93.6690625743759,79.2232512041385633]},"#33ddbb":{"lch":[79.6149850527770866,63.045401416642612,166.259028854183981],"luv":[79.6149850527770866,-61.2410113290283604,14.9753521221847095],"rgb":[0.2,0.866666666666666696,0.733333333333333282],"xyz":[0.361892150490829956,0.560020489373199259,0.559175128431507296],"hpluv":[166.259028854183981,127.658944712944631,79.6149850527770866],"hsluv":[166.259028854183981,93.9060163408359614,79.6149850527770866]},"#33ddcc":{"lch":[80.0521670478692613,60.0458591823856054,178.675787060338223],"luv":[80.0521670478692613,-60.0298228841068138,1.3876488942262355],"rgb":[0.2,0.866666666666666696,0.8],"xyz":[0.381184525934551655,0.567737439550688117,0.660781639101777452],"hpluv":[178.675787060338223,124.734340702728062,80.0521670478692613],"hsluv":[178.675787060338223,94.1523985056595905,80.0521670478692613]},"#33dddd":{"lch":[80.5351423549551555,60.1510343961145963,192.177050630061245],"luv":[80.5351423549551555,-58.7976638126828,-12.6878551809710149],"rgb":[0.2,0.866666666666666696,0.866666666666666696],"xyz":[0.402702851485185254,0.576344769770941623,0.774111487001783449],"hpluv":[192.177050630061245,128.603021497070955,80.5351423549551555],"hsluv":[192.177050630061245,94.4047190696773271,80.5351423549551555]},"#33ddee":{"lch":[81.0640304387754,63.6213092914002303,205.209077734070348],"luv":[81.0640304387754,-57.5619892131040913,-27.0977562499646396],"rgb":[0.2,0.866666666666666696,0.933333333333333348],"xyz":[0.426515031751359963,0.58586964187741164,0.899522303070306672],"hpluv":[205.209077734070348,140.476637056352985,81.0640304387754],"hsluv":[205.209077734070348,94.6597131799347835,81.0640304387754]},"#33ddff":{"lch":[81.6387398294900208,70.0938175080633528,216.50946924270437],"luv":[81.6387398294900208,-56.3385046754299452,-41.7027114680837769],"rgb":[0.2,0.866666666666666696,1],"xyz":[0.452686080161191384,0.596338061241344364,1.03735649136208852],"hpluv":[216.50946924270437,160.421433033358312,81.6387398294900208],"hsluv":[216.50946924270437,99.999999999996,81.6387398294900208]},"#33ee00":{"lch":[82.833762600699373,125.203353646442437,126.3077634478595],"luv":[82.833762600699373,-74.1357070958390239,100.894879442497455],"rgb":[0.2,0.933333333333333348,0],"xyz":[0.319384068099876184,0.618503298561642323,0.102550597892599626],"hpluv":[126.3077634478595,309.713105305240845,82.833762600699373],"hsluv":[126.3077634478595,100.000000000002302,82.833762600699373]},"#33ee11":{"lch":[82.85531245284119,124.353122892884315,126.540515263097504],"luv":[82.85531245284119,-74.0387382831010541,99.9097813362598544],"rgb":[0.2,0.933333333333333348,0.0666666666666666657],"xyz":[0.320395733599513288,0.618907964761497231,0.107878702857355263],"hpluv":[126.540515263097504,308.054239915702169,82.85531245284119],"hsluv":[126.540515263097504,98.9149262576223833,82.85531245284119]},"#33ee22":{"lch":[82.8952353009988,122.792060636983948,126.977870705292972],"luv":[82.8952353009988,-73.860225327277135,98.0946342573363808],"rgb":[0.2,0.933333333333333348,0.133333333333333331],"xyz":[0.322271091737990345,0.619658108016888,0.117755589053334456],"hpluv":[126.977870705292972,305.002845011722627,82.8952353009988],"hsluv":[126.977870705292972,96.9167682151396264,82.8952353009988]},"#33ee33":{"lch":[82.9608975691188846,120.264250910780831,127.715012949240375],"luv":[82.9608975691188846,-73.5697721383487391,95.1366316128687259],"rgb":[0.2,0.933333333333333348,0.2],"xyz":[0.325358842470448051,0.620893208309871159,0.134017742910945592],"hpluv":[127.715012949240375,300.046240285686,82.9608975691188846],"hsluv":[127.715012949240375,93.6639064416312834,82.9608975691188846]},"#33ee44":{"lch":[83.0555452014946241,116.707569363843,128.817932535493583],"luv":[83.0555452014946241,-73.1578713419028,90.9317469728687513],"rgb":[0.2,0.933333333333333348,0.266666666666666663],"xyz":[0.329816837714666966,0.622676406407558725,0.157496517863832231],"hpluv":[128.817932535493583,293.039720989359807,83.0555452014946241],"hsluv":[128.817932535493583,93.7274034182796356,83.0555452014946241]},"#33ee55":{"lch":[83.1818510898783643,112.121671621867506,130.367812557605703],"luv":[83.1818510898783643,-72.6203079673681202,85.4257579305358092],"rgb":[0.2,0.933333333333333348,0.333333333333333315],"xyz":[0.335779251754028951,0.625061372023303474,0.188898565137806146],"hpluv":[130.367812557605703,283.950089878719211,83.1818510898783643],"hsluv":[130.367812557605703,93.8103653792530139,83.1818510898783643]},"#33ee66":{"lch":[83.3420657578551,106.5703857928128,132.470647679843353],"luv":[83.3420657578551,-71.9576476395269,78.6088040502757224],"rgb":[0.2,0.933333333333333348,0.4],"xyz":[0.343364247527537136,0.628095370332706793,0.228846209544950108],"hpluv":[132.470647679843353,272.865433725808,83.3420657578551],"hsluv":[132.470647679843353,93.912785079345241,83.3420657578551]},"#33ee77":{"lch":[83.5380975272703523,100.188150337510052,135.268396470867572],"luv":[83.5380975272703523,-71.1748024762597851,70.5110839550557387],"rgb":[0.2,0.933333333333333348,0.466666666666666674],"xyz":[0.352678260547739042,0.631820975540787644,0.277900011451348],"hpluv":[135.268396470867572,260.019238129472967,83.5380975272703523],"hsluv":[135.268396470867572,94.0340074276028304,83.5380975272703523]},"#33ee88":{"lch":[83.7715600973053682,93.1909370684561651,138.951686086792108],"luv":[83.7715600973053682,-70.2805135444840801,61.1980405537673],"rgb":[0.2,0.933333333333333348,0.533333333333333326],"xyz":[0.363818677649682842,0.636277142381565186,0.336572874854920157],"hpluv":[138.951686086792108,245.83342468256393,83.7715600973053682],"hsluv":[138.951686086792108,94.1728069818675237,83.7715600973053682]},"#33ee99":{"lch":[84.0438031984902807,85.8935006436990278,143.770719305914184],"luv":[84.0438031984902807,-69.2867121669879822,50.7646035138469784],"rgb":[0.2,0.933333333333333348,0.6],"xyz":[0.376875641758755542,0.641499928025194399,0.405339552496038091],"hpluv":[143.770719305914184,230.989810482694878,84.0438031984902807],"hsluv":[143.770719305914184,94.3274826341768886,84.0438031984902807]},"#33eeaa":{"lch":[84.3559338989094698,78.7339796376561907,150.032255922422308],"luv":[84.3559338989094698,-68.2077782157370223,39.328596980513943],"rgb":[0.2,0.933333333333333348,0.66666666666666663],"xyz":[0.391933334724008098,0.647523005211295466,0.484643402113036692],"hpluv":[150.032255922422308,216.540119706931335,84.3559338989094698],"hsluv":[150.032255922422308,94.495967075681591,84.3559338989094698]},"#33eebb":{"lch":[84.7088326356722,72.2999891840671,158.051587623557367],"luv":[84.7088326356722,-67.0597412553262,27.0236847743774931],"rgb":[0.2,0.933333333333333348,0.733333333333333282],"xyz":[0.409070926831344772,0.654378042054230225,0.574901387211678383],"hpluv":[158.051587623557367,204.04938686040532,84.7088326356722],"hsluv":[158.051587623557367,94.6759444498571838,84.7088326356722]},"#33eecc":{"lch":[85.1031663228954,67.3294619946068451,168.005441410177127],"luv":[85.1031663228954,-65.8594808644086,13.992327638881461],"rgb":[0.2,0.933333333333333348,0.8],"xyz":[0.428363302275066471,0.662094992231719082,0.676507897881948539],"hpluv":[168.005441410177127,195.708498626929867,85.1031663228954],"hsluv":[168.005441410177127,94.8649680125767389,85.1031663228954]},"#33eedd":{"lch":[85.539399954776755,64.6250931348259314,179.663789762776076],"luv":[85.539399954776755,-64.6239805156479861,0.37921629457989664],"rgb":[0.2,0.933333333333333348,0.866666666666666696],"xyz":[0.44988162782570007,0.670702322451972588,0.789837745781954537],"hpluv":[179.663789762776076,194.233009793031641,85.539399954776755],"hsluv":[179.663789762776076,95.0605698730458926,85.539399954776755]},"#33eeee":{"lch":[86.0178075751720286,64.8282855412949601,192.177050630061217],"luv":[86.0178075751720286,-63.3696789602654533,-13.6744431219908602],"rgb":[0.2,0.933333333333333348,0.933333333333333348],"xyz":[0.47369380809187478,0.680227194558442605,0.91524856185047776],"hpluv":[192.177050630061217,202.327515221469156,86.0178075751720286],"hsluv":[192.177050630061217,95.2603564020327127,86.0178075751720286]},"#33eeff":{"lch":[86.538483142230433,68.1460620684978124,204.293044736593487],"luv":[86.538483142230433,-62.1119480142598803,-28.035543321245509],"rgb":[0.2,0.933333333333333348,1],"xyz":[0.499864856501706201,0.690695613922375329,1.05308275014225972],"hpluv":[204.293044736593487,221.878852364873978,86.538483142230433],"hsluv":[204.293044736593487,99.999999999993932,86.538483142230433]},"#33ff00":{"lch":[88.074762753062231,133.577745567808222,126.513803819973305],"luv":[88.074762753062231,-79.4809541468946,107.358241597361044],"rgb":[0.2,1,0],"xyz":[0.37123644052955,0.72220804342099143,0.119834722035823737],"hpluv":[126.513803819973305,497.272976699974663,88.074762753062231],"hsluv":[126.513803819973305,100.00000000000226,88.074762753062231]},"#33ff11":{"lch":[88.0941974462199,132.80363803677966,126.71317891025123],"luv":[88.0941974462199,-79.3912833442141448,106.460464045403725],"rgb":[0.2,1,0.0666666666666666657],"xyz":[0.37224810602918712,0.722612709620846339,0.125162827000579374],"hpluv":[126.71317891025123,495.277769978645495,88.0941974462199],"hsluv":[126.71317891025123,99.9999999999917861,88.0941974462199]},"#33ff22":{"lch":[88.1302050034733355,131.38040615815558,127.087058789859782],"luv":[88.1302050034733355,-79.2260405323659285,104.804797713872986],"rgb":[0.2,1,0.133333333333333331],"xyz":[0.374123464167664177,0.723362852876237139,0.135039713196558553],"hpluv":[127.087058789859782,491.602558840386564,88.1302050034733355],"hsluv":[127.087058789859782,99.9999999999915161,88.1302050034733355]},"#33ff33":{"lch":[88.1894367416410745,129.070276381710187,127.715012949240347],"luv":[88.1894367416410745,-78.9567203165017162,102.10275491931047],"rgb":[0.2,1,0.2],"xyz":[0.377211214900121883,0.724597953169220266,0.151301867054169703],"hpluv":[127.715012949240347,485.618062737129037,88.1894367416410745],"hsluv":[127.715012949240347,99.9999999999917577,88.1894367416410745]},"#33ff44":{"lch":[88.2748349985884,125.807640063387211,128.649544439126117],"luv":[88.2748349985884,-78.5738101086462137,98.2533391968394909],"rgb":[0.2,1,0.266666666666666663],"xyz":[0.381669210144340798,0.726381151266907832,0.174780642007056342],"hpluv":[128.649544439126117,477.126267833886629,88.2748349985884],"hsluv":[128.649544439126117,99.9999999999917151,88.2748349985884]},"#33ff55":{"lch":[88.3888340150102181,121.57774004888698,129.95306271607248],"luv":[88.3888340150102181,-78.0723424240601,93.1979410921456122],"rgb":[0.2,1,0.333333333333333315],"xyz":[0.387631624183702783,0.728766116882652581,0.206182689281030257],"hpluv":[129.95306271607248,466.04908765344419,88.3888340150102181],"hsluv":[129.95306271607248,99.999999999991644,88.3888340150102181]},"#33ff66":{"lch":[88.5334972733264,116.417510431790106,131.704600668064415],"luv":[88.5334972733264,-77.4514410423726929,86.9155395518881],"rgb":[0.2,1,0.4],"xyz":[0.395216619957210968,0.7318001151920559,0.246130333688174219],"hpluv":[131.704600668064415,452.43688525451455,88.5334972733264],"hsluv":[131.704600668064415,99.9999999999913882,88.5334972733264]},"#33ff77":{"lch":[88.7105909437740081,110.419515958012653,134.007319384137503],"luv":[88.7105909437740081,-76.7139872603015505,79.419353202025647],"rgb":[0.2,1,0.466666666666666674],"xyz":[0.404530632977412874,0.735525720400136751,0.295184135594572128],"hpluv":[134.007319384137503,436.493157669178117,88.7105909437740081],"hsluv":[134.007319384137503,99.9999999999915,88.7105909437740081]},"#33ff88":{"lch":[88.9216276204312379,103.738746998712813,136.99719245927011],"luv":[88.9216276204312379,-75.8662497359534882,70.7533729221786558],"rgb":[0.2,1,0.533333333333333326],"xyz":[0.415671050079356674,0.739981887240914293,0.353856998998144268],"hpluv":[136.99719245927011,418.619650658891032,88.9216276204312379],"hsluv":[136.99719245927011,99.9999999999912603,88.9216276204312379]},"#33ff99":{"lch":[89.1678944508512359,96.6032590942606788,140.85189111032139],"luv":[89.1678944508512359,-74.9174292298428242,60.9882649796200695],"rgb":[0.2,1,0.6],"xyz":[0.428728014188429429,0.745204672884543506,0.422623676639262202],"hpluv":[140.85189111032139,399.492483487252343,89.1678944508512359],"hsluv":[140.85189111032139,99.9999999999913456,89.1678944508512359]},"#33ffaa":{"lch":[89.4504724790268426,89.3298939826383105,145.795546705853383],"luv":[89.4504724790268426,-73.8791171714821,50.2165909327964926],"rgb":[0.2,1,0.66666666666666663],"xyz":[0.44378570715368193,0.751227750070644573,0.501927526256260803],"hpluv":[145.795546705853383,380.184928602968114,89.4504724790268426],"hsluv":[145.795546705853383,99.9999999999912,89.4504724790268426]},"#33ffbb":{"lch":[89.7702508712150262,82.3444719603705,152.087330110215447],"luv":[89.7702508712150262,-72.7646918614874494,38.5475249625060314],"rgb":[0.2,1,0.733333333333333282],"xyz":[0.460923299261018604,0.758082786913579332,0.592185511354902605],"hpluv":[152.087330110215447,362.351543222333419,89.7702508712150262],"hsluv":[152.087330110215447,99.9999999999909761,89.7702508712150262]},"#33ffcc":{"lch":[90.127938152783571,76.1985663634222,159.968053619612647],"luv":[90.127938152783571,-71.5886883295869723,26.1013643147272063],"rgb":[0.2,1,0.8],"xyz":[0.480215674704740358,0.765799737091068189,0.693792022025172761],"hpluv":[159.968053619612647,348.464440630653087,90.127938152783571],"hsluv":[159.968053619612647,99.999999999990834,90.127938152783571]},"#33ffdd":{"lch":[90.5240717550146314,71.5577226375514357,169.529475161807255],"luv":[90.5240717550146314,-70.3661811113599924,13.0041618290463337],"rgb":[0.2,1,0.866666666666666696],"xyz":[0.501734000255373846,0.774407067311321695,0.807121869925178759],"hpluv":[169.529475161807255,342.013155745428833,90.5240717550146314],"hsluv":[169.529475161807255,99.9999999999904077,90.5240717550146314]},"#33ffee":{"lch":[90.9590266887802,69.1149718308150511,180.51167449693034],"luv":[90.9590266887802,-69.1122158161064561,-0.61721646306864264],"rgb":[0.2,1,0.933333333333333348],"xyz":[0.525546180521548667,0.783931939417791712,0.932532685993702],"hpluv":[180.51167449693034,347.442342228089899,90.9590266887802],"hsluv":[180.51167449693034,99.9999999999901519,90.9590266887802]},"#33ffff":{"lch":[91.4330238629877243,69.4028497051403122,192.177050630061132],"luv":[91.4330238629877243,-67.8413175363212702,-14.6393709608822622],"rgb":[0.2,1,1],"xyz":[0.55171722893138,0.794400358781724436,1.07036687428548372],"hpluv":[192.177050630061132,369.590917988860895,91.4330238629877243],"hsluv":[192.177050630061132,99.9999999999897256,91.4330238629877243]},"#22aa00":{"lch":[60.8595101229647923,91.9296409673314656,126.268252023172565],"luv":[60.8595101229647923,-54.3824975763784053,74.1188427172042594],"rgb":[0.133333333333333331,0.66666666666666663,0],"xyz":[0.150337683054585614,0.290883353615456,0.0482228743965988915],"hpluv":[126.268252023172565,191.675426474830772,60.8595101229647923],"hsluv":[126.268252023172565,100.000000000002288,60.8595101229647923]},"#22aa11":{"lch":[60.8951349805759605,90.6090655032342482,126.765726538166419],"luv":[60.8951349805759605,-54.2335583573106,72.5859759132132893],"rgb":[0.133333333333333331,0.66666666666666663,0.0666666666666666657],"xyz":[0.151349348554222746,0.291288019815310828,0.0535509793613545212],"hpluv":[126.765726538166419,188.811473003651798,60.8951349805759605],"hsluv":[126.765726538166419,97.6988909499644365,60.8951349805759605]},"#22aa22":{"lch":[60.9610867967894592,88.21068058626,127.715012949240347],"luv":[60.9610867967894592,-53.9615024560723953,69.7802294505720226],"rgb":[0.133333333333333331,0.66666666666666663,0.133333333333333331],"xyz":[0.153224706692699747,0.292038163070701628,0.0634278655573337208],"hpluv":[127.715012949240347,183.614848439340193,60.9610867967894592],"hsluv":[127.715012949240347,93.4926845994439475,60.9610867967894592]},"#22aa33":{"lch":[61.0694299105106495,84.4016098893730629,129.358188857231823],"luv":[61.0694299105106495,-53.5246691509727626,65.259034196016259],"rgb":[0.133333333333333331,0.66666666666666663,0.2],"xyz":[0.156312457425157481,0.293273263363684755,0.0796900194149448571],"hpluv":[129.358188857231823,175.374397166590711,61.0694299105106495],"hsluv":[129.358188857231823,93.5882360519160699,61.0694299105106495]},"#22aa44":{"lch":[61.2253168994486145,79.2082340196825214,131.918899994809664],"luv":[61.2253168994486145,-52.917281977470445,58.938150671985575],"rgb":[0.133333333333333331,0.66666666666666663,0.266666666666666663],"xyz":[0.160770452669376368,0.295056461461372321,0.103168794367831496],"hpluv":[131.918899994809664,164.164260791814144,61.2253168994486145],"hsluv":[131.918899994809664,93.7213426507132397,61.2253168994486145]},"#22aa55":{"lch":[61.4328316402448422,72.8294169380228169,135.724592815827151],"luv":[61.4328316402448422,-52.1453123372646488,50.8428005993127883],"rgb":[0.133333333333333331,0.66666666666666663,0.333333333333333315],"xyz":[0.166732866708738381,0.297441427077117182,0.134570841641805411],"hpluv":[135.724592815827151,150.433869175471955,61.4328316402448422],"hsluv":[135.724592815827151,93.8909627694616802,61.4328316402448422]},"#22aa66":{"lch":[61.695221435526193,65.6694032551541511,141.26425661379642],"luv":[61.695221435526193,-51.2247747289881588,41.0912761769754056],"rgb":[0.133333333333333331,0.66666666666666663,0.4],"xyz":[0.174317862482246538,0.3004754253865205,0.174518486048949373],"hpluv":[141.26425661379642,135.067502346464636,61.695221435526193],"hsluv":[141.26425661379642,94.0939374356695737,61.695221435526193]},"#22aa77":{"lch":[62.015018576984005,58.3994247120946,149.232117680428786],"luv":[62.015018576984005,-50.1795183581889,29.8748848373309741],"rgb":[0.133333333333333331,0.66666666666666663,0.466666666666666674],"xyz":[0.183631875502448472,0.304201030594601296,0.223572287955347282],"hpluv":[149.232117680428786,119.495353216490457,62.015018576984005],"hsluv":[149.232117680428786,94.3254538020573534,62.015018576984005]},"#22aa88":{"lch":[62.3941144695078265,52.0455462506657582,160.428514439052776],"luv":[62.3941144695078265,-49.0385773736463904,17.4343572780611709],"rgb":[0.133333333333333331,0.66666666666666663,0.533333333333333326],"xyz":[0.194772292604392272,0.308657197435378894,0.282245151358919477],"hpluv":[160.428514439052776,105.847175197261592,62.3941144695078265],"hsluv":[160.428514439052776,94.5795977554836753,62.3941144695078265]},"#22aa99":{"lch":[62.8338123759312168,48.0032947436357915,175.177921691935865],"luv":[62.8338123759312168,-47.8333890460383486,4.03524455451089725],"rgb":[0.133333333333333331,0.66666666666666663,0.6],"xyz":[0.207829256713465,0.313879983079008051,0.351011829000037356],"hpluv":[175.177921691935865,96.9431131493944918,62.8338123759312168],"hsluv":[175.177921691935865,94.8499327714938119,62.8338123759312168]},"#22aaaa":{"lch":[63.334871160235295,47.6677335272966047,192.177050630061132],"luv":[63.334871160235295,-46.595231466735612,-10.0547115418935782],"rgb":[0.133333333333333331,0.66666666666666663,0.66666666666666663],"xyz":[0.222886949678717528,0.319903060265109174,0.430315678617035957],"hpluv":[192.177050630061132,95.5038628742744748,63.334871160235295],"hsluv":[192.177050630061132,95.1300327368807075,63.334871160235295]},"#22aabb":{"lch":[63.8975462810157211,51.5875561200845425,208.460106210027732],"luv":[63.8975462810157211,-45.3531553267970224,-24.5838818811491713],"rgb":[0.133333333333333331,0.66666666666666663,0.733333333333333282],"xyz":[0.240024541786054202,0.326758097108043932,0.520573663715677704],"hpluv":[208.460106210027732,102.447201536891086,63.8975462810157211],"hsluv":[208.460106210027732,95.4139121453229393,63.8975462810157211]},"#22aacc":{"lch":[64.5216311304052681,59.1142282054053112,221.706391964203618],"luv":[64.5216311304052681,-44.1325525375176184,-39.3295027027292079],"rgb":[0.133333333333333331,0.66666666666666663,0.8],"xyz":[0.259316917229775901,0.334475047285532734,0.62218017438594786],"hpluv":[221.706391964203618,116.258847224370101,64.5216311304052681],"hsluv":[221.706391964203618,95.6963242429470853,64.5216311304052681]},"#22aadd":{"lch":[65.2065000175346796,69.0826091468118619,231.553565124642319],"luv":[65.2065000175346796,-42.9543721979751538,-54.1047945713593279],"rgb":[0.133333333333333331,0.66666666666666663,0.866666666666666696],"xyz":[0.2808352427804095,0.34308237750578624,0.735510022285953857],"hpluv":[231.553565124642319,134.436491082611866,65.2065000175346796],"hsluv":[231.553565124642319,95.9729250289437,65.2065000175346796]},"#22aaee":{"lch":[65.951153016283925,80.4876559434330687,238.683318882444183],"luv":[65.951153016283925,-41.8348964739996418,-68.7612114224159825],"rgb":[0.133333333333333331,0.66666666666666663,0.933333333333333348],"xyz":[0.304647423046584209,0.352607249612256257,0.86092083835447708],"hpluv":[238.683318882444183,154.862481256054423,65.951153016283925],"hsluv":[238.683318882444183,96.2403212652285305,65.951153016283925]},"#22aaff":{"lch":[66.7542622474436911,92.6475815050926741,243.881654723446388],"luv":[66.7542622474436911,-40.785937465112724,-83.187028218555227],"rgb":[0.133333333333333331,0.66666666666666663,1],"xyz":[0.33081847145641563,0.363075668976189,0.998755026646258925],"hpluv":[243.881654723446388,176.114215620682756,66.7542622474436911],"hsluv":[243.881654723446388,99.9999999999982521,66.7542622474436911]},"#22bb00":{"lch":[66.4275479271698117,100.802558180890344,126.547308547849156],"luv":[66.4275479271698117,-60.0265444602621798,80.9812922592122533],"rgb":[0.133333333333333331,0.733333333333333282,0],"xyz":[0.184292180963184393,0.358792349432654534,0.0595410403661315105],"hpluv":[126.547308547849156,192.558484368086766,66.4275479271698117],"hsluv":[126.547308547849156,100.000000000002402,66.4275479271698117]},"#22bb11":{"lch":[66.4585250929908682,99.6331665050874449,126.950333401467461],"luv":[66.4585250929908682,-59.891738470658936,79.6225315522727612],"rgb":[0.133333333333333331,0.733333333333333282,0.0666666666666666657],"xyz":[0.185303846462821525,0.359197015632509387,0.0648691453308871402],"hpluv":[126.950333401467461,190.235936561387632,66.4585250929908682],"hsluv":[126.950333401467461,98.1323711753334464,66.4585250929908682]},"#22bb22":{"lch":[66.5158870179191553,97.5011623585143496,127.715012949240375],"luv":[66.5158870179191553,-59.6448091899021904,77.1295883430057785],"rgb":[0.133333333333333331,0.733333333333333282,0.133333333333333331],"xyz":[0.187179204601298527,0.359947158887900187,0.0747460315268663328],"hpluv":[127.715012949240375,186.004620566556611,66.5158870179191553],"hsluv":[127.715012949240375,94.7095045552014341,66.5158870179191553]},"#22bb33":{"lch":[66.6101592341861561,94.091611241079562,129.025604662043349],"luv":[66.6101592341861561,-59.2464412491434089,73.0964465979998721],"rgb":[0.133333333333333331,0.733333333333333282,0.2],"xyz":[0.19026695533375626,0.361182259180883314,0.091008185384477483],"hpluv":[129.025604662043349,179.246118589082698,66.6101592341861561],"hsluv":[129.025604662043349,94.7728361420699628,66.6101592341861561]},"#22bb44":{"lch":[66.7458880420052907,89.3893698914418735,131.03732282887168],"luv":[66.7458880420052907,-58.6886365964374903,67.424797990356],"rgb":[0.133333333333333331,0.733333333333333282,0.266666666666666663],"xyz":[0.194724950577975148,0.36296545727857088,0.114486960337364121],"hpluv":[131.03732282887168,169.941985039444177,66.7458880420052907],"hsluv":[131.03732282887168,94.8616428317247511,66.7458880420052907]},"#22bb55":{"lch":[66.9267274999506,83.5071173210959472,133.96576260666626],"luv":[66.9267274999506,-57.9730125462468777,60.1046459068846488],"rgb":[0.133333333333333331,0.733333333333333282,0.333333333333333315],"xyz":[0.200687364617337161,0.365350422894315741,0.145889007611338023],"hpluv":[133.96576260666626,158.330006142604873,66.9267274999506],"hsluv":[133.96576260666626,94.9758066387206128,66.9267274999506]},"#22bb66":{"lch":[67.1556458878222315,76.7025221245859541,138.121353671725132],"luv":[67.1556458878222315,-57.1096598103208919,51.2031606116460054],"rgb":[0.133333333333333331,0.733333333333333282,0.4],"xyz":[0.208272360390845318,0.368384421203719059,0.185836652018481985],"hpluv":[138.121353671725132,144.932719296840418,67.1556458878222315],"hsluv":[138.121353671725132,95.1139083236691363,67.1556458878222315]},"#22bb77":{"lch":[67.4350338747947831,69.4107315991336407,143.945643371462126],"luv":[67.4350338747947831,-56.1157304677756557,40.8518598743670935],"rgb":[0.133333333333333331,0.733333333333333282,0.466666666666666674],"xyz":[0.217586373411047251,0.372110026411799855,0.234890453924879894],"hpluv":[143.945643371462126,130.611184627207962,67.4350338747947831],"hsluv":[143.945643371462126,95.2734443978328471,67.4350338747947831]},"#22bb88":{"lch":[67.7667691572368653,62.2973404800357571,152.016434409622292],"luv":[67.7667691572368653,-55.0136735570032656,29.2310511724943218],"rgb":[0.133333333333333331,0.733333333333333282,0.533333333333333326],"xyz":[0.228726790512991052,0.376566193252577452,0.293563317328452089],"hpluv":[152.016434409622292,116.65196328010299,67.7667691572368653],"hsluv":[152.016434409622292,95.4510958201536823,67.7667691572368653]},"#22bb99":{"lch":[68.1522602188863402,56.3167420179958214,162.907285030510934],"luv":[68.1522602188863402,-53.8292536917802948,16.552549003324323],"rgb":[0.133333333333333331,0.733333333333333282,0.6],"xyz":[0.241783754622063779,0.38178897889620661,0.362329994969569968],"hpluv":[162.907285030510934,104.856796539193,68.1522602188863402],"hsluv":[162.907285030510934,95.6430286983925555,68.1522602188863402]},"#22bbaa":{"lch":[68.5924801056558238,52.6774965449754617,176.68900923381463],"luv":[68.5924801056558238,-52.5895649511659542,3.04241688349887474],"rgb":[0.133333333333333331,0.733333333333333282,0.66666666666666663],"xyz":[0.256841447587316307,0.387812056082307732,0.441633844586568569],"hpluv":[176.68900923381463,97.4513697523019,68.5924801056558238],"hsluv":[176.68900923381463,95.8451953079369616,68.5924801056558238]},"#22bbbb":{"lch":[69.087995915136645,52.5025293878432677,192.177050630061075],"luv":[69.087995915136645,-51.3212466461144174,-11.0745309069971647],"rgb":[0.133333333333333331,0.733333333333333282,0.733333333333333282],"xyz":[0.273979039694653,0.394667092925242491,0.531891829685210316],"hpluv":[192.177050630061075,96.4310638968393903,69.087995915136645],"hsluv":[192.177050630061075,96.05360442262905,69.087995915136645]},"#22bbcc":{"lch":[69.6389970716796824,56.2104265974936,207.07804051519031],"luv":[69.6389970716796824,-50.0490518690675117,-25.5871933841835393],"rgb":[0.133333333333333331,0.733333333333333282,0.8],"xyz":[0.293271415138374736,0.402384043102731292,0.633498340355480472],"hpluv":[207.07804051519031,102.424464009042,69.6389970716796824],"hsluv":[207.07804051519031,96.2645382772070519,69.6389970716796824]},"#22bbdd":{"lch":[70.2453239794146924,63.2897284454122868,219.558412279776348],"luv":[70.2453239794146924,-48.7948432782897541,-40.3069844585422956],"rgb":[0.133333333333333331,0.733333333333333282,0.866666666666666696],"xyz":[0.314789740689008224,0.410991373322984799,0.746828188255486469],"hpluv":[219.558412279776348,114.328666738486675,70.2453239794146924],"hsluv":[219.558412279776348,96.4747049793171101,70.2453239794146924]},"#22bbee":{"lch":[70.9064977498674409,72.7777709471329644,229.176572531806158],"luv":[70.9064977498674409,-47.5770176148035588,-55.072963774560229],"rgb":[0.133333333333333331,0.733333333333333282,0.933333333333333348],"xyz":[0.338601920955183,0.420516245429454816,0.872239004324009692],"hpluv":[229.176572531806158,130.242295294742263,70.9064977498674409],"hsluv":[229.176572531806158,96.6813261778791286,70.9064977498674409]},"#22bbff":{"lch":[71.621751136046143,83.782469360031385,236.362391595167765],"luv":[71.621751136046143,-46.4103062114400586,-69.7537500742789121],"rgb":[0.133333333333333331,0.733333333333333282,1],"xyz":[0.364772969365014355,0.43098466479338754,1.01007319261579154],"hpluv":[236.362391595167765,148.438838585801221,71.621751136046143],"hsluv":[236.362391595167765,99.9999999999977405,71.621751136046143]},"#22cc00":{"lch":[71.9091745039523431,109.499123564337054,126.755635680122666],"luv":[71.9091745039523431,-65.5246489265194185,87.7301455852794732],"rgb":[0.133333333333333331,0.8,0],"xyz":[0.222515924272801313,0.435239836051889428,0.0722822881360034586],"hpluv":[126.755635680122666,193.226045742870838,71.9091745039523431],"hsluv":[126.755635680122666,100.000000000002288,71.9091745039523431]},"#22cc11":{"lch":[71.9364107151438077,108.454952609175663,127.087674169957992],"luv":[71.9364107151438077,-65.4022833696805,86.5159989567857508],"rgb":[0.133333333333333331,0.8,0.0666666666666666657],"xyz":[0.223527589772438445,0.435644502251744281,0.0776103931007591],"hpluv":[127.087674169957992,191.311003889673145,71.9364107151438077],"hsluv":[127.087674169957992,98.4591341389350418,71.9364107151438077]},"#22cc22":{"lch":[71.9868548113652196,106.54571101335867,127.715012949240403],"luv":[71.9868548113652196,-65.1776701905061771,84.2843985793322332],"rgb":[0.133333333333333331,0.8,0.133333333333333331],"xyz":[0.225402947910915447,0.436394645507135082,0.0874872792967382878],"hpluv":[127.715012949240403,187.811464536348922,71.9868548113652196],"hsluv":[127.715012949240403,95.6295101801496,71.9868548113652196]},"#22cc33":{"lch":[72.0697845089905229,103.47656324227728,128.782383231673776],"luv":[72.0697845089905229,-64.8140104316899084,80.6631464312780224],"rgb":[0.133333333333333331,0.8,0.2],"xyz":[0.22849069864337318,0.437629745800118208,0.103749433154349424],"hpluv":[128.782383231673776,182.191494825933376,72.0697845089905229],"hsluv":[128.782383231673776,95.6728206524347,72.0697845089905229]},"#22cc44":{"lch":[72.1892409305665126,99.2080881077430092,130.402545810446583],"luv":[72.1892409305665126,-64.3020931154350563,75.5479024657046381],"rgb":[0.133333333333333331,0.8,0.266666666666666663],"xyz":[0.232948693887592068,0.439412943897805774,0.127228208107236063],"hpluv":[130.402545810446583,174.38692971209278,72.1892409305665126],"hsluv":[130.402545810446583,95.7338579762306807,72.1892409305665126]},"#22cc55":{"lch":[72.3485056391290584,93.798910065649892,132.724941359454647],"luv":[72.3485056391290584,-63.6406395178356732,68.9064912128369116],"rgb":[0.133333333333333331,0.8,0.333333333333333315],"xyz":[0.23891110792695408,0.441797909513550635,0.158630255381209978],"hpluv":[132.724941359454647,164.515777124050715,72.3485056391290584],"hsluv":[132.724941359454647,95.8128514989610665,72.3485056391290584]},"#22cc66":{"lch":[72.5502856399570106,87.4149553130202577,135.957009780349864],"luv":[72.5502856399570106,-62.8354766726053597,60.7706942835425821],"rgb":[0.133333333333333331,0.8,0.4],"xyz":[0.246496103700462238,0.444831907822953954,0.19857789978835394],"hpluv":[135.957009780349864,152.89241471165704,72.5502856399570106],"hsluv":[135.957009780349864,95.9092114165347454,72.5502856399570106]},"#22cc77":{"lch":[72.7968107106438,80.347487444586676,140.388595454497391],"luv":[72.7968107106438,-61.8986076052927601,51.2277377519640922],"rgb":[0.133333333333333331,0.8,0.466666666666666674],"xyz":[0.255810116720664171,0.448557513031034749,0.247631701694751849],"hpluv":[140.388595454497391,140.055211607516185,72.7968107106438],"hsluv":[140.388595454497391,96.0216367005683651,72.7968107106438]},"#22cc88":{"lch":[73.0898911189871399,73.0433057087839899,146.410934307510047],"luv":[73.0898911189871399,-60.8470337434031379,40.4099368162836328],"rgb":[0.133333333333333331,0.8,0.533333333333333326],"xyz":[0.266950533822607972,0.453013679871812347,0.306304565098324044],"hpluv":[146.410934307510047,126.812607157634474,73.0898911189871399],"hsluv":[146.410934307510047,96.1482500942118463,73.0898911189871399]},"#22cc99":{"lch":[73.4309556061454316,66.1476907411168,154.494840416347301],"luv":[73.4309556061454316,-59.7013675833161201,28.4826912187770667],"rgb":[0.133333333333333331,0.8,0.6],"xyz":[0.280007497931680671,0.458236465515441505,0.375071242739441923],"hpluv":[154.494840416347301,114.307528246897718,73.4309556061454316],"hsluv":[154.494840416347301,96.2867563581127826,73.4309556061454316]},"#22ccaa":{"lch":[73.8210792378530272,60.5373530055450857,165.03572853292485],"luv":[73.8210792378530272,-58.4843517505691963,15.631753236079188],"rgb":[0.133333333333333331,0.8,0.66666666666666663],"xyz":[0.295065190896933227,0.464259542701542627,0.454375092356440524],"hpluv":[165.03572853292485,104.059650734936554,73.8210792378530272],"hsluv":[165.03572853292485,96.4346108423233233,73.8210792378530272]},"#22ccbb":{"lch":[74.2610062314211916,57.2561659312404601,177.947236116536601],"luv":[74.2610062314211916,-57.2194225987583565,2.05090580243043252],"rgb":[0.133333333333333331,0.8,0.733333333333333282],"xyz":[0.312202783004269901,0.471114579544477385,0.544633077455082271],"hpluv":[177.947236116536601,97.8364666306377302,74.2610062314211916],"hsluv":[177.947236116536601,96.5891828531354406,74.2610062314211916]},"#22cccc":{"lch":[74.7511706210643467,57.2167927817266,192.177050630061132],"luv":[74.7511706210643467,-55.9294412838427633,-12.0689259631595149],"rgb":[0.133333333333333331,0.8,0.8],"xyz":[0.3314951584479916,0.478831529721966187,0.646239588125352427],"hpluv":[192.177050630061132,97.128087782713564,74.7511706210643467],"hsluv":[192.177050630061132,96.747899952527,74.7511706210643467]},"#22ccdd":{"lch":[75.2917163799825602,60.7443465218384091,205.915913497891523],"luv":[75.2917163799825602,-54.6356779140553357,-26.5484148912282159],"rgb":[0.133333333333333331,0.8,0.866666666666666696],"xyz":[0.353013483998625199,0.487438859942219693,0.759569436025358424],"hpluv":[205.915913497891523,102.375961416692178,75.2917163799825602],"hsluv":[205.915913497891523,96.9083635301369,75.2917163799825602]},"#22ccee":{"lch":[75.8825178700112843,67.4282526949852894,217.691288579377613],"luv":[75.8825178700112843,-53.3570890727704779,-41.2260877015904583],"rgb":[0.133333333333333331,0.8,0.933333333333333348],"xyz":[0.376825664264799909,0.49696373204868971,0.884980252093881647],"hpluv":[217.691288579377613,112.755958051566466,75.8825178700112843],"hsluv":[217.691288579377613,97.0684311053177851,75.8825178700112843]},"#22ccff":{"lch":[76.5232010138481,76.4669756721874165,227.041443142980768],"luv":[76.5232010138481,-52.1098871667616095,-55.9621124325938553],"rgb":[0.133333333333333331,0.8,1],"xyz":[0.40299671267463133,0.507432151412622434,1.02281444038566338],"hpluv":[227.041443142980768,130.754689276117347,76.5232010138481],"hsluv":[227.041443142980768,99.999999999997,76.5232010138481]},"#22dd00":{"lch":[77.3111928538645543,118.038829613749726,126.914864539429317],"luv":[77.3111928538645543,-70.8973873693031607,94.3754510494695],"rgb":[0.133333333333333331,0.866666666666666696,0],"xyz":[0.265149914819976518,0.520507817146241,0.0864936183183947771],"hpluv":[126.914864539429317,210.347075729226248,77.3111928538645543],"hsluv":[126.914864539429317,100.000000000002288,77.3111928538645543]},"#22dd11":{"lch":[77.3353680300965323,117.099630973594756,127.192375056145337],"luv":[77.3353680300965323,-70.7859197567446756,93.2827805028547346],"rgb":[0.133333333333333331,0.866666666666666696,0.0666666666666666657],"xyz":[0.266161580319613622,0.520912483346095856,0.0918217232831504138],"hpluv":[127.192375056145337,208.941659016378082,77.3353680300965323],"hsluv":[127.192375056145337,98.7107326231664217,77.3353680300965323]},"#22dd22":{"lch":[77.3801492665193535,115.37848303888174,127.715012949240432],"luv":[77.3801492665193535,-70.5809801545768636,91.2716801027172409],"rgb":[0.133333333333333331,0.866666666666666696,0.133333333333333331],"xyz":[0.268036938458090679,0.521662626601486656,0.101698609479129606],"hpluv":[127.715012949240432,206.361699793513822,77.3801492665193535],"hsluv":[127.715012949240432,96.3395071146262154,77.3801492665193535]},"#22dd33":{"lch":[77.4537875025684315,112.600723810091978,128.59932725776207],"luv":[77.4537875025684315,-70.24826089977104,88.0005956974969195],"rgb":[0.133333333333333331,0.866666666666666696,0.2],"xyz":[0.271124689190548385,0.522897726894469783,0.117960763336740743],"hpluv":[128.59932725776207,202.185786680839726,77.4537875025684315],"hsluv":[128.59932725776207,96.3699377868481122,77.4537875025684315]},"#22dd44":{"lch":[77.5598997380018,108.71293616133481,129.930302741787841],"luv":[77.5598997380018,-69.7779723132927217,83.3638834787812],"rgb":[0.133333333333333331,0.866666666666666696,0.266666666666666663],"xyz":[0.2755826844347673,0.524680924992157349,0.141439538289627381],"hpluv":[129.930302741787841,196.316024449944422,77.5598997380018],"hsluv":[129.930302741787841,96.4129906320409162,77.5598997380018]},"#22dd55":{"lch":[77.7014460191091416,103.73899221962921,131.815952634500974],"luv":[77.7014460191091416,-69.1669361195931,77.3156740549574266],"rgb":[0.133333333333333331,0.866666666666666696,0.333333333333333315],"xyz":[0.281545098474129285,0.527065890607902099,0.172841585563601297],"hpluv":[131.815952634500974,188.764163413831653,77.7014460191091416],"hsluv":[131.815952634500974,96.4690009350202189,77.7014460191091416]},"#22dd66":{"lch":[77.880896240080375,97.784990294992113,134.401120560320578],"luv":[77.880896240080375,-68.4179393254247117,69.8633659756971923],"rgb":[0.133333333333333331,0.866666666666666696,0.4],"xyz":[0.28913009424763747,0.530099888917305417,0.212789229970745258],"hpluv":[134.401120560320578,179.664283635232721,77.880896240080375],"hsluv":[134.401120560320578,96.5377748783722467,77.880896240080375]},"#22dd77":{"lch":[78.1003183749745205,91.0497694522495635,137.883451987021573],"luv":[78.1003183749745205,-67.5390964016577584,61.0616980975421],"rgb":[0.133333333333333331,0.866666666666666696,0.466666666666666674],"xyz":[0.298444107267839376,0.533825494125386268,0.261843031877143195],"hpluv":[137.883451987021573,169.299836923025936,78.1003183749745205],"hsluv":[137.883451987021573,96.6186469084632478,78.1003183749745205]},"#22dd88":{"lch":[78.3614307373917285,83.8424849668191143,142.529576014285681],"luv":[78.3614307373917285,-66.5430534683674608,51.0057283108209205],"rgb":[0.133333333333333331,0.866666666666666696,0.533333333333333326],"xyz":[0.309584524369783176,0.538281660966163811,0.320515895280715335],"hpluv":[142.529576014285681,158.150702843881334,78.3614307373917285],"hsluv":[142.529576014285681,96.7105501690208,78.3614307373917285]},"#22dd99":{"lch":[78.665635872828048,76.6094810635621144,148.680389056502293],"luv":[78.665635872828048,-65.4460211356496586,39.8224924677044854],"rgb":[0.133333333333333331,0.866666666666666696,0.6],"xyz":[0.322641488478855876,0.543504446609793,0.389282572921833214],"hpluv":[148.680389056502293,146.968629494944878,78.665635872828048],"hsluv":[148.680389056502293,96.8121015046769884,78.665635872828048]},"#22ddaa":{"lch":[79.0140446006893882,69.96699558248838,156.711923446039975],"luv":[79.0140446006893882,-64.2666918031728613,27.6617569130368608],"rgb":[0.133333333333333331,0.866666666666666696,0.66666666666666663],"xyz":[0.337699181444108432,0.549527523795894091,0.46858642253883187],"hpluv":[156.711923446039975,136.880679993502099,79.0140446006893882],"hsluv":[156.711923446039975,96.9216963326973513,79.0140446006893882]},"#22ddbb":{"lch":[79.4074947696843196,64.7136880558744849,166.88262774299784],"luv":[79.4074947696843196,-63.0251268096233161,14.6865520944819572],"rgb":[0.133333333333333331,0.866666666666666696,0.733333333333333282],"xyz":[0.354836773551445106,0.556382560638828849,0.558844407637473561],"hpluv":[166.88262774299784,129.476815865977585,79.4074947696843196],"hsluv":[166.88262774299784,97.0376060255481,79.4074947696843196]},"#22ddcc":{"lch":[79.8465673347569123,61.7508733998812431,179.012513434233142],"luv":[79.8465673347569123,-61.7417023409151184,1.06421693934889783],"rgb":[0.133333333333333331,0.866666666666666696,0.8],"xyz":[0.374129148995166805,0.564099510816317706,0.660450918307743717],"hpluv":[179.012513434233142,126.735630147597362,79.8465673347569123],"hsluv":[179.012513434233142,97.1580701030331824,79.8465673347569123]},"#22dddd":{"lch":[80.3316012938198867,61.8272738566169,192.177050630061245],"luv":[80.3316012938198867,-60.4361886569793,-13.0414298740249546],"rgb":[0.133333333333333331,0.866666666666666696,0.866666666666666696],"xyz":[0.395647474545800404,0.572706841036571213,0.773780766207749715],"hpluv":[192.177050630061245,130.583134255532286,80.3316012938198867],"hsluv":[192.177050630061245,97.2813767637234434,80.3316012938198867]},"#22ddee":{"lch":[80.8627083873859078,65.1993477029452606,204.924336649163848],"luv":[80.8627083873859078,-59.1270126845314579,-27.4763773429615092],"rgb":[0.133333333333333331,0.866666666666666696,0.933333333333333348],"xyz":[0.419459654811975113,0.58223171314304123,0.899191582276272938],"hpluv":[204.924336649163848,142.193638870282854,80.8627083873859078],"hsluv":[204.924336649163848,97.405927410883,80.8627083873859078]},"#22ddff":{"lch":[81.4397880620905141,71.5324096951162574,216.054756332513932],"luv":[81.4397880620905141,-57.8307265123863,-42.1009822669203544],"rgb":[0.133333333333333331,0.866666666666666696,1],"xyz":[0.445630703221806534,0.592700132506974,1.03702577056805478],"hpluv":[216.054756332513932,161.676156351457934,81.4397880620905141],"hsluv":[216.054756332513932,99.9999999999961,81.4397880620905141]},"#22ee00":{"lch":[82.639607109796458,126.437751030410212,127.039022267349651],"luv":[82.639607109796458,-76.1608929793909368,100.92583052028732],"rgb":[0.133333333333333331,0.933333333333333348,0],"xyz":[0.312328691160491334,0.614865369827271913,0.102219877098565962],"hpluv":[127.039022267349651,308.746810598848469,82.639607109796458],"hsluv":[127.039022267349651,100.000000000002203,82.639607109796458]},"#22ee11":{"lch":[82.6612418520526262,125.587498690937579,127.273852876359626],"luv":[82.6612418520526262,-76.0589691017437,99.9362449095734462],"rgb":[0.133333333333333331,0.933333333333333348,0.0666666666666666657],"xyz":[0.313340356660128438,0.615270036027126821,0.107547982063321598],"hpluv":[127.273852876359626,307.111076239802628,82.6612418520526262],"hsluv":[127.273852876359626,98.9080389542438638,82.6612418520526262]},"#22ee22":{"lch":[82.7013218186993271,124.026614606467561,127.715012949240375],"luv":[82.7013218186993271,-75.8713392100017643,98.112899341636421],"rgb":[0.133333333333333331,0.933333333333333348,0.133333333333333331],"xyz":[0.315215714798605495,0.616020179282517621,0.117424868259300791],"hpluv":[127.715012949240375,304.102865014696874,82.7013218186993271],"hsluv":[127.715012949240375,96.8972824334497176,82.7013218186993271]},"#22ee33":{"lch":[82.7672420886773921,121.499708898279266,128.458265706389938],"luv":[82.7672420886773921,-75.5660658728233443,95.1417308591278754],"rgb":[0.133333333333333331,0.933333333333333348,0.2],"xyz":[0.318303465531063201,0.617255279575500748,0.133687022116911941],"hpluv":[128.458265706389938,299.21821405622444,82.7672420886773921],"hsluv":[128.458265706389938,96.9191735237910308,82.7672420886773921]},"#22ee44":{"lch":[82.8622607061112575,117.945648419515081,129.569612755667265],"luv":[82.8622607061112575,-75.1331770294334,90.918544261133448],"rgb":[0.133333333333333331,0.933333333333333348,0.266666666666666663],"xyz":[0.322761460775282116,0.619038477673188314,0.15716579706979858],"hpluv":[129.569612755667265,292.317409010606752,82.8622607061112575],"hsluv":[129.569612755667265,96.9502397298715692,82.8622607061112575]},"#22ee55":{"lch":[82.9890600071846194,113.365618159982461,131.129866929811442],"luv":[82.9890600071846194,-74.5682726576598185,85.3893207236587],"rgb":[0.133333333333333331,0.933333333333333348,0.333333333333333315],"xyz":[0.328723874814644101,0.621423443288933064,0.188567844343772495],"hpluv":[131.129866929811442,283.372415217622233,82.9890600071846194],"hsluv":[131.129866929811442,96.9908233877961266,82.9890600071846194]},"#22ee66":{"lch":[83.1498978333136,107.825536766413322,133.243989823694022],"luv":[83.1498978333136,-73.8719849852999175,78.5447402013449647],"rgb":[0.133333333333333331,0.933333333333333348,0.4],"xyz":[0.336308870588152287,0.624457441598336382,0.228515488750916429],"hpluv":[133.243989823694022,272.476761047092111,83.1498978333136],"hsluv":[133.243989823694022,97.0409162623008683,83.1498978333136]},"#22ee77":{"lch":[83.3466879629012709,101.462411308546436,136.05169958656856],"luv":[83.3466879629012709,-73.0495185954435726,70.415827350948561],"rgb":[0.133333333333333331,0.933333333333333348,0.466666666666666674],"xyz":[0.345622883608354192,0.628183046806417233,0.277569290657314338],"hpluv":[136.05169958656856,259.869348467080897,83.3466879629012709],"hsluv":[136.05169958656856,97.1001922741487391,83.3466879629012709]},"#22ee88":{"lch":[83.5810478428977746,94.494960715205238,139.739189865999265],"luv":[83.5810478428977746,-72.1101014829990277,61.0690663485185681],"rgb":[0.133333333333333331,0.933333333333333348,0.533333333333333326],"xyz":[0.356763300710298,0.632639213647194776,0.336242154060886533],"hpluv":[139.739189865999265,245.976403795765407,83.5810478428977746],"hsluv":[139.739189865999265,97.1680458209452098,83.5810478428977746]},"#22ee99":{"lch":[83.8543293451422187,87.2401092672494514,144.548413258572367],"luv":[83.8543293451422187,-71.0663081347816,50.6005584263049286],"rgb":[0.133333333333333331,0.933333333333333348,0.6],"xyz":[0.369820264819370692,0.637861999290824,0.405008831702004413],"hpluv":[144.548413258572367,231.480208097577446,83.8543293451422187],"hsluv":[144.548413258572367,97.2436385928483844,83.8543293451422187]},"#22eeaa":{"lch":[84.1676401551603846,80.1359348037682508,150.771943883792943],"luv":[84.1676401551603846,-69.9332745317766324,39.1293388665967328],"rgb":[0.133333333333333331,0.933333333333333348,0.66666666666666663],"xyz":[0.384877957784623248,0.643885076476925056,0.484312681319003],"hpluv":[150.771943883792943,217.42312560604816,84.1676401551603846],"hsluv":[150.771943883792943,97.3259536357082311,84.1676401551603846]},"#22eebb":{"lch":[84.5218598825754697,73.7647249619211181,158.704077932293842],"luv":[84.5218598825754697,-68.7278540770417834,26.7902355844945639],"rgb":[0.133333333333333331,0.933333333333333348,0.733333333333333282],"xyz":[0.402015549891959922,0.650740113319859814,0.57457066641764476],"hpluv":[158.704077932293842,205.339796192481117,84.5218598825754697],"hsluv":[158.704077932293842,97.4138533690930331,84.5218598825754697]},"#22eecc":{"lch":[84.9176532530853621,68.8500130904050422,168.499772582144715],"luv":[84.9176532530853621,-67.467774257192545,13.7267526869778429],"rgb":[0.133333333333333331,0.933333333333333348,0.8],"xyz":[0.421307925335681621,0.658457063497348671,0.676177177087914916],"hpluv":[168.499772582144715,197.354512375483154,84.9176532530853621],"hsluv":[168.499772582144715,97.5061375012374896,84.9176532530853621]},"#22eedd":{"lch":[85.3554818050158275,66.1709053937965166,179.926877690260085],"luv":[85.3554818050158275,-66.170851505859261,0.0844489448895467398],"rgb":[0.133333333333333331,0.933333333333333348,0.866666666666666696],"xyz":[0.44282625088631522,0.667064393717602178,0.789507024987920913],"hpluv":[179.926877690260085,196.075052309852396,85.3554818050158275],"hsluv":[179.926877690260085,97.6015969291830174,85.3554818050158275]},"#22eeee":{"lch":[85.8356149635753667,66.3470894225537648,192.177050630061245],"luv":[85.8356149635753667,-64.8543104533760868,-13.9948094114017536],"rgb":[0.133333333333333331,0.933333333333333348,0.933333333333333348],"xyz":[0.46663843115248993,0.676589265824072195,0.914917841056444137],"hpluv":[192.177050630061245,204.089886920334152,85.8356149635753667],"hsluv":[192.177050630061245,97.6990604766853608,85.8356149635753667]},"#22eeff":{"lch":[86.35814102124138,69.583621560973242,204.067857145017655],"luv":[86.35814102124138,-63.5342376580599435,-28.377474072755291],"rgb":[0.133333333333333331,0.933333333333333348,1],"xyz":[0.492809479562321351,0.687057685188004919,1.05275202934822598],"hpluv":[204.067857145017655,223.225826840448832,86.35814102124138],"hsluv":[204.067857145017655,99.9999999999940883,86.35814102124138]},"#22ff00":{"lch":[87.8997189713237361,134.70927246092154,127.137510750393233],"luv":[87.8997189713237361,-81.328032504319566,107.388729464162736],"rgb":[0.133333333333333331,1,0],"xyz":[0.364181063590165166,0.718570114686621,0.119504001241790073],"hpluv":[127.137510750393233,493.515561032875894,87.8997189713237361],"hsluv":[127.137510750393233,100.000000000002359,87.8997189713237361]},"#22ff11":{"lch":[87.9192191859362708,133.935112153716517,127.338384986715198],"luv":[87.9192191859362708,-81.2344832365115792,106.487431187561],"rgb":[0.133333333333333331,1,0.0666666666666666657],"xyz":[0.36519272908980227,0.718974780886475928,0.124832106206545709],"hpluv":[127.338384986715198,491.550771148457443,87.9192191859362708],"hsluv":[127.338384986715198,99.9999999999918572,87.9192191859362708]},"#22ff22":{"lch":[87.9553480404818089,132.511927889398493,127.71501294924046],"luv":[87.9553480404818089,-81.0620967295481449,104.825319015849075],"rgb":[0.133333333333333331,1,0.133333333333333331],"xyz":[0.367068087228279327,0.719724924141866729,0.134708992402524902],"hpluv":[127.71501294924046,487.932270281505453,87.9553480404818089],"hsluv":[127.71501294924046,99.9999999999918,87.9553480404818089]},"#22ff33":{"lch":[88.0147790356886,130.202284180175667,128.347396099003475],"luv":[88.0147790356886,-80.7811428723405101,102.112887345201102],"rgb":[0.133333333333333331,1,0.2],"xyz":[0.370155837960737033,0.720960024434849855,0.150971146260136052],"hpluv":[128.347396099003475,482.0420586134328,88.0147790356886],"hsluv":[128.347396099003475,99.9999999999918572,88.0147790356886]},"#22ff44":{"lch":[88.1004639745127349,126.941230298117631,129.288082018787549],"luv":[88.1004639745127349,-80.3817123888383,98.2489504424236486],"rgb":[0.133333333333333331,1,0.266666666666666663],"xyz":[0.374613833204955948,0.722743222532537422,0.174449921213022691],"hpluv":[129.288082018787549,473.688351575452941,88.1004639745127349],"hsluv":[129.288082018787549,99.9999999999917719,88.1004639745127349]},"#22ff55":{"lch":[88.2148445849976497,122.715034192366474,130.599301535876663],"luv":[88.2148445849976497,-79.8586444797792865,93.1749779645044498],"rgb":[0.133333333333333331,1,0.333333333333333315],"xyz":[0.380576247244317933,0.725128188148282171,0.205851968486996606],"hpluv":[130.599301535876663,462.799362736769183,88.2148445849976497],"hsluv":[130.599301535876663,99.9999999999917,88.2148445849976497]},"#22ff66":{"lch":[88.3599902775167863,117.562049147645283,132.359544385640646],"luv":[88.3599902775167863,-79.2110524978463104,86.8702743288911279],"rgb":[0.133333333333333331,1,0.4],"xyz":[0.388161243017826119,0.72816218645768549,0.24579961289414054],"hpluv":[132.359544385640646,449.432018335727776,88.3599902775167863],"hsluv":[132.359544385640646,99.999999999991644,88.3599902775167863]},"#22ff77":{"lch":[88.5376718023346427,111.576626717172417,134.67079586388752],"luv":[88.5376718023346427,-78.441973739162,79.3486004003085839],"rgb":[0.133333333333333331,1,0.466666666666666674],"xyz":[0.397475256038028,0.731887791665766341,0.294853414800538449],"hpluv":[134.67079586388752,433.796433649144,88.5376718023346427],"hsluv":[134.67079586388752,99.9999999999914593,88.5376718023346427]},"#22ff88":{"lch":[88.7494051061703,104.915784817642518,137.666744209541747],"luv":[88.7494051061703,-77.5579802767934581,70.6546643845003786],"rgb":[0.133333333333333331,1,0.533333333333333326],"xyz":[0.408615673139971824,0.736343958506543883,0.353526278204110644],"hpluv":[137.666744209541747,416.300130961303353,88.7494051061703],"hsluv":[137.666744209541747,99.9999999999915161,88.7494051061703]},"#22ff99":{"lch":[88.996479539624346,97.8095196496336143,141.520869213027311],"luv":[88.996479539624346,-76.5687003963823827,60.8599725082183696],"rgb":[0.133333333333333331,1,0.6],"xyz":[0.42167263724904458,0.741566744150173096,0.422292955845228524],"hpluv":[141.520869213027311,397.621886071746928,88.996479539624346],"hsluv":[141.520869213027311,99.9999999999913882,88.996479539624346]},"#22ffaa":{"lch":[89.2799772586324281,90.5758041558366784,146.450029989774293],"luv":[89.2799772586324281,-75.4862499862398,50.057989986528554],"rgb":[0.133333333333333331,1,0.66666666666666663],"xyz":[0.43673033021429708,0.747589821336274163,0.50159680546222718],"hpluv":[146.450029989774293,378.829469872945424,89.2799772586324281],"hsluv":[146.450029989774293,99.9999999999911893,89.2799772586324281]},"#22ffbb":{"lch":[89.6007875020334552,83.6393655876379825,152.701818689515648],"luv":[89.6007875020334552,-74.3245992165371661,38.3587985630895787],"rgb":[0.133333333333333331,1,0.733333333333333282],"xyz":[0.453867922321633754,0.754444858179208921,0.591854790560868871],"hpluv":[152.701818689515648,361.553698033539774,89.6007875020334552],"hsluv":[152.701818689515648,99.9999999999909903,89.6007875020334552]},"#22ffcc":{"lch":[89.9596178804745,77.5461751086222,160.50148390925915],"luv":[89.9596178804745,-73.0989125181650223,25.8835519710636532],"rgb":[0.133333333333333331,1,0.8],"xyz":[0.473160297765355509,0.762161808356697779,0.693461301231139],"hpluv":[160.50148390925915,348.207300802542932,89.9596178804745],"hsluv":[160.50148390925915,99.999999999990834,89.9596178804745]},"#22ffdd":{"lch":[90.3570039795250466,72.9493687180361,169.926987012389134],"luv":[90.3570039795250466,-71.8249031216737421,12.7590629719491808],"rgb":[0.133333333333333331,1,0.866666666666666696],"xyz":[0.494678623315989,0.770769138576951285,0.806791149131145],"hpluv":[169.926987012389134,342.16275562632859,90.3570039795250466],"hsluv":[169.926987012389134,99.9999999999906,90.3570039795250466]},"#22ffee":{"lch":[90.793318095908873,70.5238201303846637,180.720785562676866],"luv":[90.793318095908873,-70.5182397089352,-0.887171987837557796],"rgb":[0.133333333333333331,1,0.933333333333333348],"xyz":[0.518490803582163817,0.780294010683421302,0.932201965199668248],"hpluv":[180.720785562676866,347.681124246536797,90.793318095908873],"hsluv":[180.720785562676866,99.9999999999901661,90.793318095908873]},"#22ffff":{"lch":[91.2687776254429082,70.7867026205843786,192.177050630061217],"luv":[91.2687776254429082,-69.1940343982234225,-14.9312715999851058],"rgb":[0.133333333333333331,1,1],"xyz":[0.544661851991995127,0.790762430047354,1.0700361534914502],"hpluv":[192.177050630061217,369.384676987995,91.2687776254429082],"hsluv":[192.177050630061217,99.9999999999901803,91.2687776254429082]},"#11aa00":{"lch":[60.6644104521350869,93.0873160838275,127.211890667698796],"luv":[60.6644104521350869,-56.2958954857129186,74.1351506854346241],"rgb":[0.0666666666666666657,0.66666666666666663,0],"xyz":[0.146052570780394131,0.288673842599075969,0.0480220097587461675],"hpluv":[127.211890667698796,194.713406103753528,60.6644104521350869],"hsluv":[127.211890667698796,100.000000000002444,60.6644104521350869]},"#11aa11":{"lch":[60.7002167335786424,91.7670835597914447,127.715012949240375],"luv":[60.7002167335786424,-56.1370762813229547,72.5935692169401],"rgb":[0.0666666666666666657,0.66666666666666663,0.0666666666666666657],"xyz":[0.147064236280031263,0.289078508798930822,0.0533501147235018],"hpluv":[127.715012949240375,191.838607973199288,60.7002167335786424],"hsluv":[127.715012949240375,97.6800439707354826,60.7002167335786424]},"#11aa22":{"lch":[60.7665037483511696,89.3702510768545153,128.6744569519864],"luv":[60.7665037483511696,-55.8469935821418844,69.7721655488506229],"rgb":[0.0666666666666666657,0.66666666666666663,0.133333333333333331],"xyz":[0.148939594418508264,0.289828652054321623,0.063227000919481],"hpluv":[128.6744569519864,186.624241227076766,60.7665037483511696],"hsluv":[128.6744569519864,97.7012125574833163,60.7665037483511696]},"#11aa33":{"lch":[60.8753956347493101,85.5662665428975799,130.333267948257316],"luv":[60.8753956347493101,-55.3812688292774595,65.2265362636212274],"rgb":[0.0666666666666666657,0.66666666666666663,0.2],"xyz":[0.152027345150966,0.291063752347304749,0.0794891547770921469],"hpluv":[130.333267948257316,178.361088002118152,60.8753956347493101],"hsluv":[130.333267948257316,97.7352371443594876,60.8753956347493101]},"#11aa44":{"lch":[61.0320681383245898,80.3855440613202603,132.913331110856149],"luv":[61.0320681383245898,-54.7338170014505394,58.8731260464924233],"rgb":[0.0666666666666666657,0.66666666666666663,0.266666666666666663],"xyz":[0.156485340395184885,0.292846950444992316,0.102967929729978785],"hpluv":[132.913331110856149,167.131840298358668,61.0320681383245898],"hsluv":[132.913331110856149,97.7826211010278428,61.0320681383245898]},"#11aa55":{"lch":[61.2406211479126199,74.0326893716562466,136.73626291081149],"luv":[61.2406211479126199,-53.9110982897111626,50.7388665304739064],"rgb":[0.0666666666666666657,0.66666666666666663,0.333333333333333315],"xyz":[0.162447754434546898,0.295231916060737176,0.134369977003952701],"hpluv":[136.73626291081149,153.399260409180499,61.2406211479126199],"hsluv":[136.73626291081149,97.8429805383323412,61.2406211479126199]},"#11aa66":{"lch":[61.5043118059827236,66.9183608277608926,142.276062400218507],"luv":[61.5043118059827236,-52.9302802927860938,40.944504442006675],"rgb":[0.0666666666666666657,0.66666666666666663,0.4],"xyz":[0.170032750208055056,0.298265914370140495,0.174317621411096635],"hpluv":[142.276062400218507,138.063556785316223,61.5043118059827236],"hsluv":[142.276062400218507,97.9151756761398246,61.5043118059827236]},"#11aa77":{"lch":[61.8256765996828648,59.7171413308715628,150.193024237310198],"luv":[61.8256765996828648,-51.8168585560505335,29.6841731923518672],"rgb":[0.0666666666666666657,0.66666666666666663,0.466666666666666674],"xyz":[0.179346763228257,0.30199151957822129,0.223371423317494544],"hpluv":[150.193024237310198,122.565843528602272,61.8256765996828648],"hsluv":[150.193024237310198,97.9974781059027578,61.8256765996828648]},"#11aa88":{"lch":[62.2066058842594,53.445591933814967,161.225226782668472],"luv":[62.2066058842594,-50.6018085779820197,17.201403018159084],"rgb":[0.0666666666666666657,0.66666666666666663,0.533333333333333326],"xyz":[0.190487180330200789,0.306447686418998888,0.282044286721066739],"hpluv":[161.225226782668472,109.022142353571084,62.2066058842594],"hsluv":[161.225226782668472,98.0877698343988698,62.2066058842594]},"#11aa99":{"lch":[62.6483970296267643,49.4620441969123803,175.635441576327452],"luv":[62.6483970296267643,-49.3186051456987613,3.76417356400704],"rgb":[0.0666666666666666657,0.66666666666666663,0.6],"xyz":[0.203544144439273517,0.311670472062628046,0.350810964362184619],"hpluv":[175.635441576327452,100.184705161952,62.6483970296267643],"hsluv":[175.635441576327452,98.1837511724305756,62.6483970296267643]},"#11aaaa":{"lch":[63.1517986220979424,49.10533458105958,192.177050630061103],"luv":[63.1517986220979424,-48.0004871585874326,-10.3579494522848794],"rgb":[0.0666666666666666657,0.66666666666666663,0.66666666666666663],"xyz":[0.218601837404526045,0.317693549248729168,0.430114813979183219],"hpluv":[192.177050630061103,98.6693521766944741,63.1517986220979424],"hsluv":[192.177050630061103,98.283131385506934,63.1517986220979424]},"#11aabb":{"lch":[63.7170519890822931,52.9100997091116483,208.088870357104184],"luv":[63.7170519890822931,-46.6782604891356812,-24.9122188681885817],"rgb":[0.0666666666666666657,0.66666666666666663,0.733333333333333282],"xyz":[0.235739429511862719,0.324548586091663926,0.520372799077825],"hpluv":[208.088870357104184,105.371274370578277,63.7170519890822931],"hsluv":[208.088870357104184,98.3837818799450474,63.7170519890822931]},"#11aacc":{"lch":[64.3439331362496603,60.2774830024396,221.163749704229559],"luv":[64.3439331362496603,-45.3787880982832661,-39.6754401089704345],"rgb":[0.0666666666666666657,0.66666666666666663,0.8],"xyz":[0.255031804955584418,0.332265536269152728,0.621979309748095122],"hpluv":[221.163749704229559,118.873987633214512,64.3439331362496603],"hsluv":[221.163749704229559,98.4838416101877385,64.3439331362496603]},"#11aadd":{"lch":[65.0317963778061738,70.0923801470555,230.985682804055784],"luv":[65.0317963778061738,-44.1241742926816372,-54.4609860144708762],"rgb":[0.0666666666666666657,0.66666666666666663,0.866666666666666696],"xyz":[0.276550130506218,0.340872866489406234,0.735309157648101119],"hpluv":[230.985682804055784,136.767964522831733,65.0317963778061738],"hsluv":[230.985682804055784,98.5817742563244,65.0317963778061738]},"#11aaee":{"lch":[65.7796198544585877,81.3683973110580325,238.155251398024461],"luv":[65.7796198544585877,-42.9315457639956293,-69.1208974137644248],"rgb":[0.0666666666666666657,0.66666666666666663,0.933333333333333348],"xyz":[0.300362310772392727,0.350397738595876251,0.860719973716624343],"hpluv":[238.155251398024461,156.965326989669,65.7796198544585877],"hsluv":[238.155251398024461,98.676383948407647,65.7796198544585877]},"#11aaff":{"lch":[66.5860524818013317,93.423779787985481,243.412392023658668],"luv":[66.5860524818013317,-41.8132782993845566,-83.5443139162218529],"rgb":[0.0666666666666666657,0.66666666666666663,1],"xyz":[0.326533359182224148,0.360866157959809,0.998554162008406188],"hpluv":[243.412392023658668,178.038321821181739,66.5860524818013317],"hsluv":[243.412392023658668,99.9999999999982805,66.5860524818013317]},"#11bb00":{"lch":[66.2579979425279788,101.837028338191359,127.308350947248712],"luv":[66.2579979425279788,-61.7238643700190792,80.9996599251199285],"rgb":[0.0666666666666666657,0.733333333333333282,0],"xyz":[0.180007068688992911,0.356582838416274528,0.0593401757282787864],"hpluv":[127.308350947248712,195.032386644097869,66.2579979425279788],"hsluv":[127.308350947248712,100.000000000002416,66.2579979425279788]},"#11bb11":{"lch":[66.2891028676776,100.667761827005108,127.715012949240403],"luv":[66.2891028676776,-61.5819268253258301,79.6345688739434507],"rgb":[0.0666666666666666657,0.733333333333333282,0.0666666666666666657],"xyz":[0.181018734188630043,0.356987504616129381,0.0646682806930344162],"hpluv":[127.715012949240403,192.702610495025482,66.2891028676776],"hsluv":[127.715012949240403,98.1199752505464318,66.2891028676776]},"#11bb22":{"lch":[66.3467009890152895,98.5365229927559199,128.48627008521666],"luv":[66.3467009890152895,-61.3219466901703356,77.130183570569983],"rgb":[0.0666666666666666657,0.733333333333333282,0.133333333333333331],"xyz":[0.182894092327107044,0.357737647871520181,0.0745451668890136088],"hpluv":[128.48627008521666,188.459149582366734,66.3467009890152895],"hsluv":[128.48627008521666,98.1339007760711155,66.3467009890152895]},"#11bb33":{"lch":[66.4413603116689586,95.1297105779412107,129.807139434656818],"luv":[66.4413603116689586,-60.9025570517959949,73.0790009455219121],"rgb":[0.0666666666666666657,0.733333333333333282,0.2],"xyz":[0.185981843059564778,0.358972748164503308,0.0908073207466247589],"hpluv":[129.807139434656818,181.684126992490178,66.4413603116689586],"hsluv":[129.807139434656818,98.1563849168539093,66.4413603116689586]},"#11bb44":{"lch":[66.5776441235544,90.4345556189602888,131.832147550242752],"luv":[66.5776441235544,-60.3153845158839061,67.3829595721343679],"rgb":[0.0666666666666666657,0.733333333333333282,0.266666666666666663],"xyz":[0.190439838303783665,0.360755946262190874,0.114286095699511397],"hpluv":[131.832147550242752,172.363503065423913,66.5776441235544],"hsluv":[131.832147550242752,98.1879073212924567,66.5776441235544]},"#11bb55":{"lch":[66.7592187944261,84.5672269635890501,134.774448398028227],"luv":[66.7592187944261,-59.5621947933412841,60.0329978237906374],"rgb":[0.0666666666666666657,0.733333333333333282,0.333333333333333315],"xyz":[0.196402252343145678,0.363140911877935735,0.145688142973485313],"hpluv":[134.774448398028227,160.742297130584,66.7592187944261],"hsluv":[134.774448398028227,98.2284201297941451,66.7592187944261]},"#11bb66":{"lch":[66.9890609579081513,77.7896938122995749,138.938350400658521],"luv":[66.9890609579081513,-58.6536805127572336,51.0977712402284752],"rgb":[0.0666666666666666657,0.733333333333333282,0.4],"xyz":[0.203987248116653835,0.366174910187339053,0.185635787380629275],"hpluv":[138.938350400658521,147.352496635070423,66.9890609579081513],"hsluv":[138.938350400658521,98.2774122804504486,66.9890609579081513]},"#11bb77":{"lch":[67.2695660469751573,70.5410036497719375,144.751753478195667],"luv":[67.2695660469751573,-57.6079608572489548,40.7106379437464625],"rgb":[0.0666666666666666657,0.733333333333333282,0.466666666666666674],"xyz":[0.213301261136855769,0.369900515395419849,0.234689589287027184],"hpluv":[144.751753478195667,133.064539371584743,67.2695660469751573],"hsluv":[144.751753478195667,98.33398740837616,67.2695660469751573]},"#11bb88":{"lch":[67.6026131767386289,63.4868829762913904,152.765342955174589],"luv":[67.6026131767386289,-56.44870944299889,29.0538725863731493],"rgb":[0.0666666666666666657,0.733333333333333282,0.533333333333333326],"xyz":[0.224441678238799569,0.374356682236197447,0.293362452690599351],"hpluv":[152.765342955174589,119.168054047142519,67.6026131767386289],"hsluv":[152.765342955174589,98.3969602233376293,67.6026131767386289]},"#11bb99":{"lch":[67.9896091217093357,57.5709210660889568,163.510238814203348],"luv":[67.9896091217093357,-55.2030563361408468,16.3411604100414145],"rgb":[0.0666666666666666657,0.733333333333333282,0.6],"xyz":[0.237498642347872296,0.379579467879826604,0.362129130331717231],"hpluv":[163.510238814203348,107.448401728013394,67.9896091217093357],"hsluv":[163.510238814203348,98.464964167861,67.9896091217093357]},"#11bbaa":{"lch":[68.431522322705149,53.97217733059707,177.026074660918823],"luv":[68.431522322705149,-53.8994902384006807,2.80015675382041573],"rgb":[0.0666666666666666657,0.733333333333333282,0.66666666666666663],"xyz":[0.252556335313124825,0.385602545065927726,0.441432979948715831],"hpluv":[177.026074660918823,100.081328983600983,68.431522322705149],"hsluv":[177.026074660918823,98.5365589333087684,68.431522322705149]},"#11bbbb":{"lch":[68.9289126417652511,53.7759127589290102,192.177050630061103],"luv":[68.9289126417652511,-52.5659794775517426,-11.3431298424003177],"rgb":[0.0666666666666666657,0.733333333333333282,0.733333333333333282],"xyz":[0.269693927420461499,0.392457581908862485,0.531690965047357578],"hpluv":[192.177050630061103,98.9978332941913095,68.9289126417652511],"hsluv":[192.177050630061103,98.6103267315429122,68.9289126417652511]},"#11bbcc":{"lch":[69.4819599404948463,57.3930965266865485,206.799543430538137],"luv":[69.4819599404948463,-51.2284702417124365,-25.8768499940688805],"rgb":[0.0666666666666666657,0.733333333333333282,0.8],"xyz":[0.288986302864183253,0.400174532086351287,0.633297475717627734],"hpluv":[206.799543430538137,104.81584090136549,69.4819599404948463],"hsluv":[206.799543430538137,98.6849492658553658,69.4819599404948463]},"#11bbdd":{"lch":[70.0904930703520535,64.3454332007566876,219.135570681285316],"luv":[70.0904930703520535,-49.9098388382008054,-40.6121011637893901],"rgb":[0.0666666666666666657,0.733333333333333282,0.866666666666666696],"xyz":[0.310504628414816741,0.408781862306604793,0.746627323617633731],"hpluv":[219.135570681285316,116.492493254234162,70.0904930703520535],"hsluv":[219.135570681285316,98.7592614999562244,70.0904930703520535]},"#11bbee":{"lch":[70.7540199625255184,73.7064384587933858,228.717665412779098],"luv":[70.7540199625255184,-48.6292974270947838,-55.3879996211006826],"rgb":[0.0666666666666666657,0.733333333333333282,0.933333333333333348],"xyz":[0.334316808680991506,0.41830673441307481,0.872038139686157],"hpluv":[228.717665412779098,132.188487390259695,70.7540199625255184],"hsluv":[228.717665412779098,98.8322822642660412,70.7540199625255184]},"#11bbff":{"lch":[71.471758937406932,84.600620314641418,235.923069973878228],"luv":[71.471758937406932,-47.4021956671632836,-70.0735099988154246],"rgb":[0.0666666666666666657,0.733333333333333282,1],"xyz":[0.360487857090822872,0.428775153777007534,1.00987232797793891],"hpluv":[235.923069973878228,150.202929688167188,71.471758937406932],"hsluv":[235.923069973878228,99.9999999999978115,71.471758937406932]},"#11cc00":{"lch":[71.760164015117,110.429324102022079,127.380540485202317],"luv":[71.760164015117,-67.042304751477019,87.7494444155603617],"rgb":[0.0666666666666666657,0.8,0],"xyz":[0.21823081199860983,0.433030325035509422,0.0720814234981507346],"hpluv":[127.380540485202317,195.272154443078705,71.760164015117],"hsluv":[127.380540485202317,100.000000000002245,71.760164015117]},"#11cc11":{"lch":[71.7874927519263366,109.385174124956521,127.715012949240432],"luv":[71.7874927519263366,-66.9146672826053219,86.5305935539869466],"rgb":[0.0666666666666666657,0.8,0.0666666666666666657],"xyz":[0.219242477498246963,0.433434991235364275,0.0774095284629063712],"hpluv":[127.715012949240432,193.352149077988855,71.7874927519263366],"hsluv":[127.715012949240432,98.4507061603193563,71.7874927519263366]},"#11cc22":{"lch":[71.8381079866900905,107.476295008714118,128.346772012349533],"luv":[71.8381079866900905,-66.680384726115463,84.2904519004221129],"rgb":[0.0666666666666666657,0.8,0.133333333333333331],"xyz":[0.221117835636723964,0.434185134490755076,0.0872864146588855638],"hpluv":[128.346772012349533,189.84411001864018,71.8381079866900905],"hsluv":[128.346772012349533,98.4601754700601361,71.8381079866900905]},"#11cc33":{"lch":[71.9213183931711626,104.40864440796355,129.421122123890029],"luv":[71.9213183931711626,-66.3010906987881441,80.6556284412913556],"rgb":[0.0666666666666666657,0.8,0.2],"xyz":[0.224205586369181697,0.435420234783738203,0.103548568516496714],"hpluv":[129.421122123890029,184.212095875088124,71.9213183931711626],"hsluv":[129.421122123890029,98.4755168761512749,71.9213183931711626]},"#11cc44":{"lch":[72.0411777660314669,100.144250866202455,131.050559631523186],"luv":[72.0411777660314669,-65.7672084530810395,75.5218198525557085],"rgb":[0.0666666666666666657,0.8,0.266666666666666663],"xyz":[0.228663581613400585,0.437203432881425769,0.127027343469383353],"hpluv":[131.050559631523186,176.394298837834185,72.0411777660314669],"hsluv":[131.050559631523186,98.4971346697200261,72.0411777660314669]},"#11cc55":{"lch":[72.2009771566369523,94.7439152050601621,133.383427271112737],"luv":[72.2009771566369523,-65.077446685205,68.8573554627095],"rgb":[0.0666666666666666657,0.8,0.333333333333333315],"xyz":[0.234625995652762598,0.439588398497170629,0.158429390743357268],"hpluv":[133.383427271112737,166.512782767528847,72.2009771566369523],"hsluv":[133.383427271112737,98.5251071985599225,72.2009771566369523]},"#11cc66":{"lch":[72.4034304155724,88.37638367841096,136.624435218533876],"luv":[72.4034304155724,-64.2379326004453333,60.6949191225620339],"rgb":[0.0666666666666666657,0.8,0.4],"xyz":[0.242210991426270755,0.442622396806573948,0.198377035150501202],"hpluv":[136.624435218533876,154.887514188688357,72.4034304155724],"hsluv":[136.624435218533876,98.5592219307307289,72.4034304155724]},"#11cc77":{"lch":[72.6507717937069657,81.3359578844494422,141.057484765247835],"luv":[72.6507717937069657,-63.261234579889333,51.1229326663597],"rgb":[0.0666666666666666657,0.8,0.466666666666666674],"xyz":[0.251525004446472689,0.446348002014654743,0.247430837056899111],"hpluv":[141.057484765247835,142.063228414279422,72.6507717937069657],"hsluv":[141.057484765247835,98.5990140248714795,72.6507717937069657]},"#11cc88":{"lch":[72.9448138267759703,74.0714793913140284,147.061910762632237],"luv":[72.9448138267759703,-62.1651250648783815,40.2750702654370087],"rgb":[0.0666666666666666657,0.8,0.533333333333333326],"xyz":[0.262665421548416489,0.450804168855432341,0.306103700460471306],"hpluv":[147.061910762632237,128.853412583983044,72.9448138267759703],"hsluv":[147.061910762632237,98.6438145792393755,72.9448138267759703]},"#11cc99":{"lch":[73.286985449663689,67.2264361640895203,155.087429558943455],"luv":[73.286985449663689,-60.9711251229010074,28.3181147072320734],"rgb":[0.0666666666666666657,0.8,0.6],"xyz":[0.275722385657489188,0.456026954499061499,0.374870378101589186],"hpluv":[155.087429558943455,116.399886643338576,73.286985449663689],"hsluv":[155.087429558943455,98.6928071276572609,73.286985449663689]},"#11ccaa":{"lch":[73.6783599756885224,61.6669147974486336,165.501022011161467],"luv":[73.6783599756885224,-59.7029534543248275,15.4390974304365383],"rgb":[0.0666666666666666657,0.8,0.66666666666666663],"xyz":[0.290780078622741744,0.462050031685162621,0.454174227718587786],"hpluv":[165.501022011161467,106.206622375239988,73.6783599756885224],"hsluv":[165.501022011161467,98.7450877264532494,73.6783599756885224]},"#11ccbb":{"lch":[74.1196780643846864,58.4137876130139801,178.201908682105085],"luv":[74.1196780643846864,-58.3850250256368426,1.83287644266177074],"rgb":[0.0666666666666666657,0.8,0.733333333333333282],"xyz":[0.307917670730078419,0.46890506852809738,0.544432212817229533],"hpluv":[178.201908682105085,100.004874571957387,74.1196780643846864],"hsluv":[178.201908682105085,98.7997230732590452,74.1196780643846864]},"#11cccc":{"lch":[74.6113685470067,58.3540675645504,192.177050630061103],"luv":[74.6113685470067,-57.0411279075965751,-12.3088150671508707],"rgb":[0.0666666666666666657,0.8,0.8],"xyz":[0.327210046173800118,0.476622018705586181,0.646038723487499689],"hpluv":[192.177050630061103,99.244272920381249,74.6113685470067],"hsluv":[192.177050630061103,98.8558017207376167,74.6113685470067]},"#11ccdd":{"lch":[75.1535687293590087,61.8087365466066316,205.702276410621693],"luv":[75.1535687293590087,-55.6933672323303881,-26.8061328768737823],"rgb":[0.0666666666666666657,0.8,0.866666666666666696],"xyz":[0.348728371724433717,0.485229348925839687,0.759368571387505686],"hpluv":[205.702276410621693,104.361325002032586,75.1535687293590087],"hsluv":[205.702276410621693,98.9124749687685352,75.1535687293590087]},"#11ccee":{"lch":[75.7461450403856418,68.3900229325434168,217.356690237772426],"luv":[75.7461450403856418,-54.3614174191380712,-41.4973677827407],"rgb":[0.0666666666666666657,0.8,0.933333333333333348],"xyz":[0.372540551990608426,0.494754221032309704,0.88477938745602891],"hpluv":[217.356690237772426,114.570165581500433,75.7461450403856418],"hsluv":[217.356690237772426,98.968985855810871,75.7461450403856418]},"#11ccff":{"lch":[76.3887144168947714,77.3228649101567811,226.666757851513921],"luv":[76.3887144168947714,-53.0620799518220849,-56.2426982736496726],"rgb":[0.0666666666666666657,0.8,1],"xyz":[0.398711600400439847,0.505222640396242428,1.02261357574781075],"hpluv":[226.666757851513921,131.304642630845649,76.3887144168947714],"hsluv":[226.666757851513921,99.9999999999969162,76.3887144168947714]},"#11dd00":{"lch":[77.1789729208637851,118.880191052714352,127.435820588671049],"luv":[77.1789729208637851,-72.2639845338074,94.3950017957916572],"rgb":[0.0666666666666666657,0.866666666666666696,0],"xyz":[0.260864802545785,0.518298306129860942,0.0862927536805420531],"hpluv":[127.435820588671049,210.367240137055802,77.1789729208637851],"hsluv":[127.435820588671049,100.000000000002302,77.1789729208637851]},"#11dd11":{"lch":[77.2032167276219,117.940964566200989,127.715012949240474],"luv":[77.2032167276219,-72.148538100067,93.2987651195291],"rgb":[0.0666666666666666657,0.866666666666666696,0.0666666666666666657],"xyz":[0.261876468045422084,0.51870297232971585,0.0916208586452976897],"hpluv":[127.715012949240474,208.973000844217893,77.2032167276219],"hsluv":[127.715012949240474,98.7048375113237739,77.2032167276219]},"#11dd22":{"lch":[77.2481249515021773,116.219968574506154,128.240715222563949],"luv":[77.2481249515021773,-71.936288170647174,91.2811674974022509],"rgb":[0.0666666666666666657,0.866666666666666696,0.133333333333333331],"xyz":[0.263751826183899141,0.519453115585106651,0.101497744841276882],"hpluv":[128.240715222563949,206.413967447437244,77.2481249515021773],"hsluv":[128.240715222563949,98.7114617332334348,77.2481249515021773]},"#11dd33":{"lch":[77.3219716074714114,113.443027450646795,129.129905575085218],"luv":[77.3219716074714114,-71.591714193384675,87.9996984996024],"rgb":[0.0666666666666666657,0.866666666666666696,0.2],"xyz":[0.266839576916356847,0.520688215878089777,0.117759898698888033],"hpluv":[129.129905575085218,202.273081507843187,77.3219716074714114],"hsluv":[129.129905575085218,98.7222220245650419,77.3219716074714114]},"#11dd44":{"lch":[77.4283833065767,109.557638087167803,130.467479357182611],"luv":[77.4283833065767,-71.1046976382296378,83.3486534805139],"rgb":[0.0666666666666666657,0.866666666666666696,0.266666666666666663],"xyz":[0.271297572160575762,0.522471413975777343,0.141238673651774671],"hpluv":[130.467479357182611,196.45511110559741,77.4283833065767],"hsluv":[130.467479357182611,98.737444128486942,77.4283833065767]},"#11dd55":{"lch":[77.5703274630482156,104.589066335953675,132.360930841179908],"luv":[77.5703274630482156,-70.4719757705036471,77.2824263854860192],"rgb":[0.0666666666666666657,0.866666666666666696,0.333333333333333315],"xyz":[0.277259986199937747,0.524856379591522093,0.172640720925748559],"hpluv":[132.360930841179908,188.974657198429043,77.5703274630482156],"hsluv":[132.360930841179908,98.7572451358875583,77.5703274630482156]},"#11dd66":{"lch":[77.7502795105496176,98.645271303892585,134.953797592355841],"luv":[77.7502795105496176,-69.6964700953403167,69.8089650895062732],"rgb":[0.0666666666666666657,0.866666666666666696,0.4],"xyz":[0.284844981973445932,0.527890377900925412,0.212588365332892548],"hpluv":[134.953797592355841,179.968822287066047,77.7502795105496176],"hsluv":[134.953797592355841,98.7815546318288114,77.7502795105496176]},"#11dd77":{"lch":[77.9703113413929714,91.9272626112809377,138.440937564009943],"luv":[77.9703113413929714,-68.7866216277350588,60.9837871589344616],"rgb":[0.0666666666666666657,0.866666666666666696,0.466666666666666674],"xyz":[0.294158994993647838,0.531615983109006263,0.261642167239290457],"hpluv":[138.440937564009943,169.723893920939275,77.9703113413929714],"hsluv":[138.440937564009943,98.8101351189296,77.9703113413929714]},"#11dd88":{"lch":[78.2321436880382919,84.7462074021241705,143.083472555296623],"luv":[78.2321436880382919,-67.7555613828794492,50.90288371727776],"rgb":[0.0666666666666666657,0.866666666666666696,0.533333333333333326],"xyz":[0.305299412095591638,0.536072149949783805,0.320315030642862597],"hpluv":[143.083472555296623,158.721324423216174,78.2321436880382919],"hsluv":[143.083472555296623,98.842607114853692,78.2321436880382919]},"#11dd99":{"lch":[78.5371801027425,77.5491781494168748,149.212222309724666],"luv":[78.5371801027425,-66.6201031545698,39.6942928810235145],"rgb":[0.0666666666666666657,0.866666666666666696,0.6],"xyz":[0.318356376204664393,0.541294935593413,0.389081708283980532],"hpluv":[149.212222309724666,147.710574340426348,78.5371801027425],"hsluv":[149.212222309724666,98.8784794246756746,78.5371801027425]},"#11ddaa":{"lch":[78.8865310768390771,70.9495750262721288,157.187121587348372],"luv":[78.8865310768390771,-65.3996173248364414,27.5087667875819264],"rgb":[0.0666666666666666657,0.866666666666666696,0.66666666666666663],"xyz":[0.333414069169916893,0.547318012779514085,0.468385557900979133],"hpluv":[157.187121587348372,137.807232739715857,78.8865310768390771],"hsluv":[157.187121587348372,98.9171828916172728,78.8865310768390771]},"#11ddbb":{"lch":[79.2810328759594398,65.7363215025974483,167.247861929956969],"luv":[79.2810328759594398,-64.1148749316804611,14.5102300873497096],"rgb":[0.0666666666666666657,0.866666666666666696,0.733333333333333282],"xyz":[0.350551661277253568,0.554173049622448843,0.558643542999620824],"hpluv":[167.247861929956969,130.572542181043048,79.2810328759594398],"hsluv":[167.247861929956969,98.9581049946704496,79.2810328759594398]},"#11ddcc":{"lch":[79.7212637056701396,62.7929370759791,179.209087927276954],"luv":[79.7212637056701396,-62.7869545437069903,0.866767416521026846],"rgb":[0.0666666666666666657,0.866666666666666696,0.8],"xyz":[0.369844036720975322,0.561889999799937701,0.660250053669891],"hpluv":[179.209087927276954,127.935201467087722,79.7212637056701396],"hsluv":[179.209087927276954,99.0006225499112,79.7212637056701396]},"#11dddd":{"lch":[80.2075587483664378,62.8503941808937796,192.177050630061132],"luv":[80.2075587483664378,-61.4362892449526,-13.2572400032679489],"rgb":[0.0666666666666666657,0.866666666666666696,0.866666666666666696],"xyz":[0.39136236227160881,0.570497330020191207,0.773579901569897],"hpluv":[192.177050630061132,131.767009082741112,80.2075587483664378],"hsluv":[192.177050630061132,99.0441302201931109,80.2075587483664378]},"#11ddee":{"lch":[80.7400249746916643,66.1629514334268691,204.757295278220823],"luv":[80.7400249746916643,-60.0819052998990202,-27.707414132610225],"rgb":[0.0666666666666666657,0.866666666666666696,0.933333333333333348],"xyz":[0.415174542537783575,0.580022202126661224,0.8989907176384202],"hpluv":[204.757295278220823,143.22067561241397,80.7400249746916643],"hsluv":[204.757295278220823,99.0880633014724594,80.7400249746916643]},"#11ddff":{"lch":[81.3185562290371848,72.4120095186264194,215.786316478612605],"luv":[81.3185562290371848,-58.7408753400219084,-42.3439332940817934],"rgb":[0.0666666666666666657,0.866666666666666696,1],"xyz":[0.441345590947614941,0.590490621490594,1.03682490593020216],"hpluv":[215.786316478612605,162.428807277722512,81.3185562290371848],"hsluv":[215.786316478612605,99.9999999999959925,81.3185562290371848]}} \ No newline at end of file diff --git a/vendor/github.com/lucasb-eyer/go-colorful/hsluv.go b/vendor/github.com/lucasb-eyer/go-colorful/hsluv.go new file mode 100644 index 00000000..d19fb644 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/hsluv.go @@ -0,0 +1,207 @@ +package colorful + +import "math" + +// Source: https://github.com/hsluv/hsluv-go +// Under MIT License +// Modified so that Saturation and Luminance are in [0..1] instead of [0..100]. + +// HSLuv uses a rounded version of the D65. This has no impact on the final RGB +// values, but to keep high levels of accuracy for internal operations and when +// comparing to the test values, this modified white reference is used internally. +// +// See this GitHub thread for details on these values: +// https://github.com/hsluv/hsluv/issues/79 +var hSLuvD65 = [3]float64{0.95045592705167, 1.0, 1.089057750759878} + +func LuvLChToHSLuv(l, c, h float64) (float64, float64, float64) { + // [-1..1] but the code expects it to be [-100..100] + c *= 100.0 + l *= 100.0 + + var s, max float64 + if l > 99.9999999 || l < 0.00000001 { + s = 0.0 + } else { + max = maxChromaForLH(l, h) + s = c / max * 100.0 + } + return h, clamp01(s / 100.0), clamp01(l / 100.0) +} + +func HSLuvToLuvLCh(h, s, l float64) (float64, float64, float64) { + l *= 100.0 + s *= 100.0 + + var c, max float64 + if l > 99.9999999 || l < 0.00000001 { + c = 0.0 + } else { + max = maxChromaForLH(l, h) + c = max / 100.0 * s + } + + // c is [-100..100], but for LCh it's supposed to be almost [-1..1] + return clamp01(l / 100.0), c / 100.0, h +} + +func LuvLChToHPLuv(l, c, h float64) (float64, float64, float64) { + // [-1..1] but the code expects it to be [-100..100] + c *= 100.0 + l *= 100.0 + + var s, max float64 + if l > 99.9999999 || l < 0.00000001 { + s = 0.0 + } else { + max = maxSafeChromaForL(l) + s = c / max * 100.0 + } + return h, s / 100.0, l / 100.0 +} + +func HPLuvToLuvLCh(h, s, l float64) (float64, float64, float64) { + // [-1..1] but the code expects it to be [-100..100] + l *= 100.0 + s *= 100.0 + + var c, max float64 + if l > 99.9999999 || l < 0.00000001 { + c = 0.0 + } else { + max = maxSafeChromaForL(l) + c = max / 100.0 * s + } + return l / 100.0, c / 100.0, h +} + +// HSLuv creates a new Color from values in the HSLuv color space. +// Hue in [0..360], a Saturation [0..1], and a Luminance (lightness) in [0..1]. +// +// The returned color values are clamped (using .Clamped), so this will never output +// an invalid color. +func HSLuv(h, s, l float64) Color { + // HSLuv -> LuvLCh -> CIELUV -> CIEXYZ -> Linear RGB -> sRGB + l, u, v := LuvLChToLuv(HSLuvToLuvLCh(h, s, l)) + return LinearRgb(XyzToLinearRgb(LuvToXyzWhiteRef(l, u, v, hSLuvD65))).Clamped() +} + +// HPLuv creates a new Color from values in the HPLuv color space. +// Hue in [0..360], a Saturation [0..1], and a Luminance (lightness) in [0..1]. +// +// The returned color values are clamped (using .Clamped), so this will never output +// an invalid color. +func HPLuv(h, s, l float64) Color { + // HPLuv -> LuvLCh -> CIELUV -> CIEXYZ -> Linear RGB -> sRGB + l, u, v := LuvLChToLuv(HPLuvToLuvLCh(h, s, l)) + return LinearRgb(XyzToLinearRgb(LuvToXyzWhiteRef(l, u, v, hSLuvD65))).Clamped() +} + +// HSLuv returns the Hue, Saturation and Luminance of the color in the HSLuv +// color space. Hue in [0..360], a Saturation [0..1], and a Luminance +// (lightness) in [0..1]. +func (col Color) HSLuv() (h, s, l float64) { + // sRGB -> Linear RGB -> CIEXYZ -> CIELUV -> LuvLCh -> HSLuv + return LuvLChToHSLuv(col.LuvLChWhiteRef(hSLuvD65)) +} + +// HPLuv returns the Hue, Saturation and Luminance of the color in the HSLuv +// color space. Hue in [0..360], a Saturation [0..1], and a Luminance +// (lightness) in [0..1]. +// +// Note that HPLuv can only represent pastel colors, and so the Saturation +// value could be much larger than 1 for colors it can't represent. +func (col Color) HPLuv() (h, s, l float64) { + return LuvLChToHPLuv(col.LuvLChWhiteRef(hSLuvD65)) +} + +// DistanceHSLuv calculates Euclidan distance in the HSLuv colorspace. No idea +// how useful this is. +// +// The Hue value is divided by 100 before the calculation, so that H, S, and L +// have the same relative ranges. +func (c1 Color) DistanceHSLuv(c2 Color) float64 { + h1, s1, l1 := c1.HSLuv() + h2, s2, l2 := c2.HSLuv() + return math.Sqrt(sq((h1-h2)/100.0) + sq(s1-s2) + sq(l1-l2)) +} + +// DistanceHPLuv calculates Euclidean distance in the HPLuv colorspace. No idea +// how useful this is. +// +// The Hue value is divided by 100 before the calculation, so that H, S, and L +// have the same relative ranges. +func (c1 Color) DistanceHPLuv(c2 Color) float64 { + h1, s1, l1 := c1.HPLuv() + h2, s2, l2 := c2.HPLuv() + return math.Sqrt(sq((h1-h2)/100.0) + sq(s1-s2) + sq(l1-l2)) +} + +var m = [3][3]float64{ + {3.2409699419045214, -1.5373831775700935, -0.49861076029300328}, + {-0.96924363628087983, 1.8759675015077207, 0.041555057407175613}, + {0.055630079696993609, -0.20397695888897657, 1.0569715142428786}, +} + +const kappa = 903.2962962962963 +const epsilon = 0.0088564516790356308 + +func maxChromaForLH(l, h float64) float64 { + hRad := h / 360.0 * math.Pi * 2.0 + minLength := math.MaxFloat64 + for _, line := range getBounds(l) { + length := lengthOfRayUntilIntersect(hRad, line[0], line[1]) + if length > 0.0 && length < minLength { + minLength = length + } + } + return minLength +} + +func getBounds(l float64) [6][2]float64 { + var sub2 float64 + var ret [6][2]float64 + sub1 := math.Pow(l+16.0, 3.0) / 1560896.0 + if sub1 > epsilon { + sub2 = sub1 + } else { + sub2 = l / kappa + } + for i := range m { + for k := 0; k < 2; k++ { + top1 := (284517.0*m[i][0] - 94839.0*m[i][2]) * sub2 + top2 := (838422.0*m[i][2]+769860.0*m[i][1]+731718.0*m[i][0])*l*sub2 - 769860.0*float64(k)*l + bottom := (632260.0*m[i][2]-126452.0*m[i][1])*sub2 + 126452.0*float64(k) + ret[i*2+k][0] = top1 / bottom + ret[i*2+k][1] = top2 / bottom + } + } + return ret +} + +func lengthOfRayUntilIntersect(theta, x, y float64) (length float64) { + length = y / (math.Sin(theta) - x*math.Cos(theta)) + return +} + +func maxSafeChromaForL(l float64) float64 { + minLength := math.MaxFloat64 + for _, line := range getBounds(l) { + m1 := line[0] + b1 := line[1] + x := intersectLineLine(m1, b1, -1.0/m1, 0.0) + dist := distanceFromPole(x, b1+x*m1) + if dist < minLength { + minLength = dist + } + } + return minLength +} + +func intersectLineLine(x1, y1, x2, y2 float64) float64 { + return (y1 - y2) / (x2 - x1) +} + +func distanceFromPole(x, y float64) float64 { + return math.Sqrt(math.Pow(x, 2.0) + math.Pow(y, 2.0)) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/soft_palettegen.go b/vendor/github.com/lucasb-eyer/go-colorful/soft_palettegen.go new file mode 100644 index 00000000..9f7bf6f7 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/soft_palettegen.go @@ -0,0 +1,185 @@ +// Largely inspired by the descriptions in http://lab.medialab.sciences-po.fr/iwanthue/ +// but written from scratch. + +package colorful + +import ( + "fmt" + "math" + "math/rand" +) + +// The algorithm works in L*a*b* color space and converts to RGB in the end. +// L* in [0..1], a* and b* in [-1..1] +type lab_t struct { + L, A, B float64 +} + +type SoftPaletteSettings struct { + // A function which can be used to restrict the allowed color-space. + CheckColor func(l, a, b float64) bool + + // The higher, the better quality but the slower. Usually two figures. + Iterations int + + // Use up to 160000 or 8000 samples of the L*a*b* space (and thus calls to CheckColor). + // Set this to true only if your CheckColor shapes the Lab space weirdly. + ManySamples bool +} + +// Yeah, windows-stype Foo, FooEx, screw you golang... +// Uses K-means to cluster the color-space and return the means of the clusters +// as a new palette of distinctive colors. Falls back to K-medoid if the mean +// happens to fall outside of the color-space, which can only happen if you +// specify a CheckColor function. +func SoftPaletteEx(colorsCount int, settings SoftPaletteSettings) ([]Color, error) { + + // Checks whether it's a valid RGB and also fulfills the potentially provided constraint. + check := func(col lab_t) bool { + c := Lab(col.L, col.A, col.B) + return c.IsValid() && (settings.CheckColor == nil || settings.CheckColor(col.L, col.A, col.B)) + } + + // Sample the color space. These will be the points k-means is run on. + dl := 0.05 + dab := 0.1 + if settings.ManySamples { + dl = 0.01 + dab = 0.05 + } + + samples := make([]lab_t, 0, int(1.0/dl*2.0/dab*2.0/dab)) + for l := 0.0; l <= 1.0; l += dl { + for a := -1.0; a <= 1.0; a += dab { + for b := -1.0; b <= 1.0; b += dab { + if check(lab_t{l, a, b}) { + samples = append(samples, lab_t{l, a, b}) + } + } + } + } + + // That would cause some infinite loops down there... + if len(samples) < colorsCount { + return nil, fmt.Errorf("palettegen: more colors requested (%v) than samples available (%v). Your requested color count may be wrong, you might want to use many samples or your constraint function makes the valid color space too small", colorsCount, len(samples)) + } else if len(samples) == colorsCount { + return labs2cols(samples), nil // Oops? + } + + // We take the initial means out of the samples, so they are in fact medoids. + // This helps us avoid infinite loops or arbitrary cutoffs with too restrictive constraints. + means := make([]lab_t, colorsCount) + for i := 0; i < colorsCount; i++ { + for means[i] = samples[rand.Intn(len(samples))]; in(means, i, means[i]); means[i] = samples[rand.Intn(len(samples))] { + } + } + + clusters := make([]int, len(samples)) + samples_used := make([]bool, len(samples)) + + // The actual k-means/medoid iterations + for i := 0; i < settings.Iterations; i++ { + // Reassing the samples to clusters, i.e. to their closest mean. + // By the way, also check if any sample is used as a medoid and if so, mark that. + for isample, sample := range samples { + samples_used[isample] = false + mindist := math.Inf(+1) + for imean, mean := range means { + dist := lab_dist(sample, mean) + if dist < mindist { + mindist = dist + clusters[isample] = imean + } + + // Mark samples which are used as a medoid. + if lab_eq(sample, mean) { + samples_used[isample] = true + } + } + } + + // Compute new means according to the samples. + for imean := range means { + // The new mean is the average of all samples belonging to it.. + nsamples := 0 + newmean := lab_t{0.0, 0.0, 0.0} + for isample, sample := range samples { + if clusters[isample] == imean { + nsamples++ + newmean.L += sample.L + newmean.A += sample.A + newmean.B += sample.B + } + } + if nsamples > 0 { + newmean.L /= float64(nsamples) + newmean.A /= float64(nsamples) + newmean.B /= float64(nsamples) + } else { + // That mean doesn't have any samples? Get a new mean from the sample list! + var inewmean int + for inewmean = rand.Intn(len(samples_used)); samples_used[inewmean]; inewmean = rand.Intn(len(samples_used)) { + } + newmean = samples[inewmean] + samples_used[inewmean] = true + } + + // But now we still need to check whether the new mean is an allowed color. + if nsamples > 0 && check(newmean) { + // It does, life's good (TM) + means[imean] = newmean + } else { + // New mean isn't an allowed color or doesn't have any samples! + // Switch to medoid mode and pick the closest (unused) sample. + // This should always find something thanks to len(samples) >= colorsCount + mindist := math.Inf(+1) + for isample, sample := range samples { + if !samples_used[isample] { + dist := lab_dist(sample, newmean) + if dist < mindist { + mindist = dist + newmean = sample + } + } + } + } + } + } + return labs2cols(means), nil +} + +// A wrapper which uses common parameters. +func SoftPalette(colorsCount int) ([]Color, error) { + return SoftPaletteEx(colorsCount, SoftPaletteSettings{nil, 50, false}) +} + +func in(haystack []lab_t, upto int, needle lab_t) bool { + for i := 0; i < upto && i < len(haystack); i++ { + if haystack[i] == needle { + return true + } + } + return false +} + +const LAB_DELTA = 1e-6 + +func lab_eq(lab1, lab2 lab_t) bool { + return math.Abs(lab1.L-lab2.L) < LAB_DELTA && + math.Abs(lab1.A-lab2.A) < LAB_DELTA && + math.Abs(lab1.B-lab2.B) < LAB_DELTA +} + +// That's faster than using colorful's DistanceLab since we would have to +// convert back and forth for that. Here is no conversion. +func lab_dist(lab1, lab2 lab_t) float64 { + return math.Sqrt(sq(lab1.L-lab2.L) + sq(lab1.A-lab2.A) + sq(lab1.B-lab2.B)) +} + +func labs2cols(labs []lab_t) (cols []Color) { + cols = make([]Color, len(labs)) + for k, v := range labs { + cols[k] = Lab(v.L, v.A, v.B) + } + return cols +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/warm_palettegen.go b/vendor/github.com/lucasb-eyer/go-colorful/warm_palettegen.go new file mode 100644 index 00000000..00f42a5c --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/warm_palettegen.go @@ -0,0 +1,25 @@ +package colorful + +import ( + "math/rand" +) + +// Uses the HSV color space to generate colors with similar S,V but distributed +// evenly along their Hue. This is fast but not always pretty. +// If you've got time to spare, use Lab (the non-fast below). +func FastWarmPalette(colorsCount int) (colors []Color) { + colors = make([]Color, colorsCount) + + for i := 0; i < colorsCount; i++ { + colors[i] = Hsv(float64(i)*(360.0/float64(colorsCount)), 0.55+rand.Float64()*0.2, 0.35+rand.Float64()*0.2) + } + return +} + +func WarmPalette(colorsCount int) ([]Color, error) { + warmy := func(l, a, b float64) bool { + _, c, _ := LabToHcl(l, a, b) + return 0.1 <= c && c <= 0.4 && 0.2 <= l && l <= 0.5 + } + return SoftPaletteEx(colorsCount, SoftPaletteSettings{warmy, 50, true}) +} diff --git a/vendor/github.com/rivo/tview/CONTRIBUTING.md b/vendor/github.com/rivo/tview/CONTRIBUTING.md new file mode 100644 index 00000000..0f1db609 --- /dev/null +++ b/vendor/github.com/rivo/tview/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# Contributing to tview + +First of all, thank you for taking the time to contribute. + +The following provides you with some guidance on how to contribute to this project. Mainly, it is meant to save us all some time so please read it, it's not long. + +Please note that this document is work in progress so I might add to it in the future. + +## Issues + +- Please include enough information so everybody understands your request. +- Screenshots or code that illustrates your point always helps. +- It's fine to ask for help. But you should have checked out the [documentation](https://godoc.org/github.com/rivo/tview) first in any case. +- If you request a new feature, state your motivation and share a use case that you faced where you needed that new feature. It should be something that others will also need. + +## Pull Requests + +In my limited time I can spend on this project, I will always go through issues first before looking at pull requests. It takes a _lot_ of time to look at code that you submitted and I may not have that time. So be prepared to have your pull requests lying around for a long time. + +Therefore, if you have a feature request, open an issue first before sending me a pull request, and allow for some discussion. It may save you from writing code that will get rejected. If your case is strong, there is a good chance that I will add the feature for you. + +I'm very picky about the code that goes into this repo. So if you violate any of the following guidelines, there is a good chance I won't merge your pull request. + +- There must be a strong case for your additions/changes, such as: + - Bug fixes + - Features that are needed (see "Issues" above; state your motivation) + - Improvements in stability or performance (if readability does not suffer) +- Your code must follow the structure of the existing code. Don't just patch something on. Try to understand how `tview` is currently designed and follow that design. Your code needs to be consistent with existing code. +- If you're adding code that increases the work required to maintain the project, you must be willing to take responsibility for that extra work. I will ask you to maintain your part of the code in the long run. +- Function/type/variable/constant names must be as descriptive as they are right now. Follow the conventions of the package. +- All functions/types/variables/constants, even private ones, must have comments in good English. These comments must be elaborate enough so that new users of the package understand them and can follow them. Provide examples if you have to. Start all sentences upper-case, as is common in English, and end them with a period. Comments in their own lines must not exceed the 80 character border. Break over if necessary. +- A new function should be located close to related functions in the file. For example, `GetColor()` should come after (or before) `SetColor()`. +- Your changes must not decrease the project's [Go Report](https://goreportcard.com/report/github.com/rivo/tview) rating. +- No breaking changes unless there is absolutely no other way. +- If an issue accompanies your pull request, reference it in the PR's comments, e.g. "Fixes #123", so it is closed automatically when the PR is closed. diff --git a/vendor/github.com/rivo/tview/LICENSE.txt b/vendor/github.com/rivo/tview/LICENSE.txt new file mode 100644 index 00000000..9d694307 --- /dev/null +++ b/vendor/github.com/rivo/tview/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Oliver Kuederle + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/rivo/tview/README.md b/vendor/github.com/rivo/tview/README.md new file mode 100644 index 00000000..245f9b85 --- /dev/null +++ b/vendor/github.com/rivo/tview/README.md @@ -0,0 +1,171 @@ +# Rich Interactive Widgets for Terminal UIs + +[![PkgGoDev](https://pkg.go.dev/badge/github.com/rivo/tview)](https://pkg.go.dev/github.com/rivo/tview) +[![Go Report](https://img.shields.io/badge/go%20report-A%2B-brightgreen.svg)](https://goreportcard.com/report/github.com/rivo/tview) + +This Go package provides commonly used components for terminal based user interfaces. + +![Screenshot](tview.gif) + +Among these components are: + +- __Input forms__ (including __text input__, __selections__, __checkboxes__, and __buttons__) +- Navigable multi-color __text views__ +- Editable multi-line __text areas__ +- Sophisticated navigable __table views__ +- Flexible __tree views__ +- Selectable __lists__ +- __Images__ +- __Grid__, __Flexbox__ and __page layouts__ +- Modal __message windows__ +- An __application__ wrapper + +They come with lots of customization options and can be easily extended to fit your needs. + +## Usage + +To add this package to your project: + +```bash +go get github.com/rivo/tview@master +``` + +## Hello World + +This basic example creates a box titled "Hello, World!" and displays it in your terminal: + +```go +package main + +import ( + "github.com/rivo/tview" +) + +func main() { + box := tview.NewBox().SetBorder(true).SetTitle("Hello, world!") + if err := tview.NewApplication().SetRoot(box, true).Run(); err != nil { + panic(err) + } +} +``` + +Check out the [GitHub Wiki](https://github.com/rivo/tview/wiki) for more examples along with screenshots. Or try the examples in the "demos" subdirectory. + +For a presentation highlighting this package, compile and run the program found in the "demos/presentation" subdirectory. + +## Projects using `tview` + +- [K9s - Kubernetes CLI](https://github.com/derailed/k9s) +- [IRCCloud Terminal Client](https://github.com/termoose/irccloud) +- [Window manager for `tview`](https://github.com/epiclabs-io/winman) +- [CLI bookmark manager](https://github.com/Endi1/drawer) +- [A caving database interface written in Go](https://github.com/IdlePhysicist/cave-logger) +- [Interactive file browse and exec any command.](https://github.com/bannzai/itree) +- [A complete TUI for LDAP](https://github.com/Macmod/godap) +- [A simple CRM](https://github.com/broadcastle/crm) +- [Terminal UI for todist](https://github.com/cyberdummy/todoista) +- [Graphical kubectl wrapper](https://github.com/dcaiafa/kpick) +- [Decred Decentralized Exchange ](https://github.com/decred/dcrdex) +- [A CLI file browser for Raspberry PI](https://github.com/destinmoulton/pixi) +- [A tool to manage projects.](https://github.com/divramod/dp) +- [A simple app for BMI monitoring](https://github.com/erleene/go-bmi) +- [Stream TIDAL from command line](https://github.com/godsic/vibe) +- [Secure solution for fully decentralized password management](https://github.com/guillaumemichel/passtor/) +- [A growing collection of convenient little tools to work with systemd services](https://github.com/muesli/service-tools/) +- [A terminal based browser for Redis written in Go](https://github.com/nitishm/redis-terminal) +- [First project for the Computer Networks course.](https://github.com/pablogadhi/XMPPClient) +- [Test your typing speed in the terminal!](https://github.com/shilangyu/typer-go) +- [TUI Client for Docker](https://github.com/skanehira/docui) +- [SSH client using certificates signed by HashiCorp Vault](https://github.com/stephane-martin/vssh) +- [VMware vCenter Text UI](https://github.com/thebsdbox/vctui) +- [Bookmarks on terminal](https://github.com/tryffel/bookmarker) +- [A UDP testing utility](https://github.com/vaelen/udp-tester) +- [A simple Kanban board for your terminal](https://github.com/witchard/toukan) +- [The personal information dashboard for your terminal. ](https://github.com/wtfutil/wtf) +- [MySQL database to Golang struct](https://github.com/xxjwxc/gormt) +- [Discord, TUI and SIXEL.](https://gitlab.com/diamondburned/6cord) +- [A CLI Audio Player](https://www.github.com/dhulihan/grump) +- [GLab, a GitLab CLI tool](https://gitlab.com/profclems/glab) +- [Browse your AWS ECS Clusters in the Terminal](https://github.com/swartzrock/ecsview) +- [The CLI Task Manager for Geeks](https://github.com/ajaxray/geek-life) +- [Fast disk usage analyzer written in Go](https://github.com/dundee/gdu) +- [Multiplayer Chess On Terminal](https://github.com/qnkhuat/gochess) +- [Scriptable TUI music player](https://github.com/issadarkthing/gomu) +- [MangaDesk : TUI Client for downloading manga to your computer](https://github.com/darylhjd/mangadesk) +- [Go How Much? a Crypto coin price tracking from terminal](https://github.com/ledongthuc/gohowmuch) +- [dbui: Universal CLI for Database Connections](https://github.com/KenanBek/dbui) +- [ssmbrowse: Simple and elegant cli AWS SSM parameter browser](https://github.com/bnaydenov/ssmbrowse) +- [gobit: binance intelligence terminal](https://github.com/infl00p/gobit) +- [viddy: A modern watch command](https://github.com/sachaos/viddy) +- [s3surfer: CLI tool for browsing S3 bucket and download objects interactively](https://github.com/hirose31/s3surfer) +- [libgen-tui: A terminal UI for downloading books from Library Genesis](https://github.com/audstanley/libgen-tui) +- [kubectl-lazy: kubectl plugin to easy to view pod](https://github.com/togettoyou/kubectl-lazy) +- [podman-tui: podman user interface](https://github.com/containers/podman-tui) +- [tvxwidgets: tview extra widgets](https://github.com/navidys/tvxwidgets) +- [Domino card game on terminal](https://github.com/gusti-andika/card-domino.git) +- [goaround: Query stackoverflow API and get results on terminal](https://github.com/glendsoza/goaround) +- [resto: a CLI app can send pretty HTTP & API requests with TUI](https://github.com/abdfnx/resto) +- [twad: a WAD launcher for the terminal](https://github.com/zmnpl/twad) +- [pacseek: A TUI for searching and installing Arch Linux packages](https://github.com/moson-mo/pacseek) +- [7GUIs demo](https://github.com/letientai299/7guis/tree/master/tui) +- [tuihub: A utility hub/dashboard for personal use](https://github.com/ashis0013/tuihub) +- [l'oggo: A terminal app for structured log streaming (GCP stack driver, k8s, local streaming)](https://github.com/aurc/loggo) +- [reminder: Terminal based interactive app for organising tasks with minimal efforts.](https://github.com/goyalmunish/reminder) +- [tufw: A terminal UI for ufw.](https://github.com/peltho/tufw) +- [gh: the GitHub CLI](https://github.com/cli/cli) +- [piptui: Terminal UI to manage pip packages](https://github.com/glendsoza/piptui/) +- [cross-clipboard: A cross-platform clipboard sharing](https://github.com/ntsd/cross-clipboard) +- [tui-deck: nextcloud deck frontend](https://github.com/mebitek/tui-deck) +- [ktop: A top-like tool for your Kubernetes clusters](https://github.com/vladimirvivien/ktop) +- [blimp: UI for weather, network latency, application status, & more](https://github.com/merlinfuchs/blimp) +- [Curly - A simple TUI leveraging curl to test endpoints](https://github.com/migcaraballo/curly) +- [amtui: Alertmanager TUI](https://github.com/pehlicd/amtui) +- [A TUI CLI manager](https://github.com/costa86/cli-manager) +- [PrivateBTC](https://github.com/adrianbrad/privatebtc) +- [play: A TUI playground to experiment with your favorite programs, such as grep, sed, awk, jq and yq](https://github.com/paololazzari/play) +- [gorest: Enjoy making HTTP requests in your terminal, just like you do in Insomnia.](https://github.com/NathanFirmo/gorest) +- [Terminal-based application to listen Radio Stations around the world!](https://github.com/vergonha/garden-tui) +- [ntui: A TUI to manage Hashicorp Nomad clusters](https://github.com/SHAPPY0/ntui) +- [lazysql: A cross-platform TUI database management tool written in Go](https://github.com/jorgerojas26/lazysql) +- [redis-tui: A Redis Text-based UI client in CLI](https://github.com/mylxsw/redis-tui) +- [fen: File manager](https://github.com/kivattt/fen) +- [sqltui: A terminal UI to operate sql and nosql databases](https://github.com/LinPr/sqltui) +- [DBee: Simple database browser](https://github.com/murat-cileli/dbee) +- [oddshub: A TUI for sports betting odds](https://github.com/dos-2/oddshub) +- [envolve: Terminal based interactive app for manage enviroment variables](https://github.com/erdemkosk/envolve) +- [zfs-file-history: Terminal UI for inspecting and restoring file history on ZFS snapshots](https://github.com/markusressel/zfs-file-history) +- [fan2go-tui: Terminal UI for fan2go](https://github.com/markusressel/fan2go-tui) +- [NatsDash: Terminal UI for NATS Jetstream](https://nats-dash-gui.returnzero.win/) +- [tuissh: A terminal UI to manage ssh connections](https://github.com/linuxexam/tuissh) +- [chiko: Ultimate Beauty TUI gRPC Client](https://github.com/felangga/chiko) +- [kmip-explorer: Browse & manage your KMIP objects from the terminal](https://github.com/phsym/kmip-explorer) +- [stui: Slurm TUI for managing HPC clusters](https://github.com/antvirf/stui) +- [nerdlog: Fast, remote-first, multi-host log viewer with timeline histogram](https://github.com/dimonomid/nerdlog) + +## Documentation + +Refer to https://pkg.go.dev/github.com/rivo/tview for the package's documentation. Also check out the [Wiki](https://github.com/rivo/tview/wiki). + +## Dependencies + +This package is based on [github.com/gdamore/tcell](https://github.com/gdamore/tcell) (and its dependencies) as well as on [github.com/rivo/uniseg](https://github.com/rivo/uniseg). + +## Sponsor this Project + +[Become a Sponsor on GitHub](https://github.com/sponsors/rivo?metadata_source=tview_readme) to further this project! + +## Backwards-Compatibility + +I try really hard to keep this project backwards compatible. Your software should not break when you upgrade `tview`. But this also means that some of its shortcomings that were present in the initial versions will remain. Having said that, backwards compatibility may still break when: + +- a new version of an imported package (most likely [`tcell`](https://github.com/gdamore/tcell)) changes in such a way that forces me to make changes in `tview` as well, +- I fix something that I consider a bug, rather than a feature, something that does not work as originally intended, +- I make changes to "internal" interfaces such as [`Primitive`](https://pkg.go.dev/github.com/rivo/tview#Primitive). You shouldn't need these interfaces unless you're writing your own primitives for `tview`. (Yes, I realize these are public interfaces. This has advantages as well as disadvantages. For the time being, it is what it is.) + +## Your Feedback + +Add your issue here on GitHub. Feel free to get in touch if you have any questions. + +## Code of Conduct + +We follow Golang's Code of Conduct which you can find [here](https://golang.org/conduct). diff --git a/vendor/github.com/rivo/tview/ansi.go b/vendor/github.com/rivo/tview/ansi.go new file mode 100644 index 00000000..53bccd10 --- /dev/null +++ b/vendor/github.com/rivo/tview/ansi.go @@ -0,0 +1,283 @@ +package tview + +import ( + "bytes" + "fmt" + "io" + "strconv" + "strings" +) + +// The states of the ANSI escape code parser. +const ( + ansiText = iota + ansiEscape + ansiSubstring + ansiControlSequence +) + +// ansi is a io.Writer which translates ANSI escape codes into tview color +// tags. +type ansi struct { + io.Writer + + // Reusable buffers. + buffer *bytes.Buffer // The entire output text of one Write(). + csiParameter, csiIntermediate *bytes.Buffer // Partial CSI strings. + attributes string // The buffer's current text attributes (a tview attribute string). + + // The current state of the parser. One of the ansi constants. + state int +} + +// ANSIWriter returns an io.Writer which translates any ANSI escape codes +// written to it into tview style tags. Other escape codes don't have an effect +// and are simply removed. The translated text is written to the provided +// writer. +func ANSIWriter(writer io.Writer) io.Writer { + return &ansi{ + Writer: writer, + buffer: new(bytes.Buffer), + csiParameter: new(bytes.Buffer), + csiIntermediate: new(bytes.Buffer), + state: ansiText, + } +} + +// Write parses the given text as a string of runes, translates ANSI escape +// codes to style tags and writes them to the output writer. +func (a *ansi) Write(text []byte) (int, error) { + defer func() { + a.buffer.Reset() + }() + + for _, r := range string(text) { + switch a.state { + + // We just entered an escape sequence. + case ansiEscape: + switch r { + case '[': // Control Sequence Introducer. + a.csiParameter.Reset() + a.csiIntermediate.Reset() + a.state = ansiControlSequence + case 'c': // Reset. + fmt.Fprint(a.buffer, "[-:-:-]") + a.state = ansiText + case 'P', ']', 'X', '^', '_': // Substrings and commands. + a.state = ansiSubstring + default: // Ignore. + a.state = ansiText + } + + // CSI Sequences. + case ansiControlSequence: + switch { + case r >= 0x30 && r <= 0x3f: // Parameter bytes. + if _, err := a.csiParameter.WriteRune(r); err != nil { + return 0, err + } + case r >= 0x20 && r <= 0x2f: // Intermediate bytes. + if _, err := a.csiIntermediate.WriteRune(r); err != nil { + return 0, err + } + case r >= 0x40 && r <= 0x7e: // Final byte. + switch r { + case 'E': // Next line. + count, _ := strconv.Atoi(a.csiParameter.String()) + if count == 0 { + count = 1 + } + fmt.Fprint(a.buffer, strings.Repeat("\n", count)) + case 'm': // Select Graphic Rendition. + var background, foreground string + params := a.csiParameter.String() + fields := strings.Split(params, ";") + if len(params) == 0 || fields[0] == "" || fields[0] == "0" { + // Reset. + foreground = "-" + background = "-" + a.attributes = "-" + } + lookupColor := func(colorNumber int) string { + if colorNumber < 0 || colorNumber > 15 { + return "black" + } + return []string{ + "black", + "maroon", + "green", + "olive", + "navy", + "purple", + "teal", + "silver", + "gray", + "red", + "lime", + "yellow", + "blue", + "fuchsia", + "aqua", + "white", + }[colorNumber] + } + FieldLoop: + for index, field := range fields { + switch field { + case "1", "01": + if !strings.ContainsRune(a.attributes, 'b') { + a.attributes += "b" + } + case "2", "02": + if !strings.ContainsRune(a.attributes, 'd') { + a.attributes += "d" + } + case "3", "03": + if !strings.ContainsRune(a.attributes, 'i') { + a.attributes += "i" + } + case "4", "04": + if !strings.ContainsRune(a.attributes, 'u') { + a.attributes += "u" + } + case "5", "05": + if !strings.ContainsRune(a.attributes, 'l') { + a.attributes += "l" + } + case "7", "07": + if !strings.ContainsRune(a.attributes, 'r') { + a.attributes += "r" + } + case "9", "09": + if !strings.ContainsRune(a.attributes, 's') { + a.attributes += "s" + } + case "22": + if i := strings.IndexRune(a.attributes, 'b'); i >= 0 { + a.attributes = a.attributes[:i] + a.attributes[i+1:] + } + if i := strings.IndexRune(a.attributes, 'd'); i >= 0 { + a.attributes = a.attributes[:i] + a.attributes[i+1:] + } + case "23": + if i := strings.IndexRune(a.attributes, 'i'); i >= 0 { + a.attributes = a.attributes[:i] + a.attributes[i+1:] + } + case "24": + if i := strings.IndexRune(a.attributes, 'u'); i >= 0 { + a.attributes = a.attributes[:i] + a.attributes[i+1:] + } + case "25": + if i := strings.IndexRune(a.attributes, 'l'); i >= 0 { + a.attributes = a.attributes[:i] + a.attributes[i+1:] + } + case "27": + if i := strings.IndexRune(a.attributes, 'r'); i >= 0 { + a.attributes = a.attributes[:i] + a.attributes[i+1:] + } + case "29": + if i := strings.IndexRune(a.attributes, 's'); i >= 0 { + a.attributes = a.attributes[:i] + a.attributes[i+1:] + } + case "30", "31", "32", "33", "34", "35", "36", "37": + colorNumber, _ := strconv.Atoi(field) + foreground = lookupColor(colorNumber - 30) + case "39": + foreground = "-" + case "40", "41", "42", "43", "44", "45", "46", "47": + colorNumber, _ := strconv.Atoi(field) + background = lookupColor(colorNumber - 40) + case "49": + background = "-" + case "90", "91", "92", "93", "94", "95", "96", "97": + colorNumber, _ := strconv.Atoi(field) + foreground = lookupColor(colorNumber - 82) + case "100", "101", "102", "103", "104", "105", "106", "107": + colorNumber, _ := strconv.Atoi(field) + background = lookupColor(colorNumber - 92) + case "38", "48": + var color string + if len(fields) > index+1 { + if fields[index+1] == "5" && len(fields) > index+2 { // 8-bit colors. + colorNumber, _ := strconv.Atoi(fields[index+2]) + if colorNumber <= 15 { + color = lookupColor(colorNumber) + } else if colorNumber <= 231 { + red := (colorNumber - 16) / 36 + green := ((colorNumber - 16) / 6) % 6 + blue := (colorNumber - 16) % 6 + color = fmt.Sprintf("#%02x%02x%02x", 255*red/5, 255*green/5, 255*blue/5) + } else if colorNumber <= 255 { + grey := 255 * (colorNumber - 232) / 23 + color = fmt.Sprintf("#%02x%02x%02x", grey, grey, grey) + } + } else if fields[index+1] == "2" && len(fields) > index+4 { // 24-bit colors. + red, _ := strconv.Atoi(fields[index+2]) + green, _ := strconv.Atoi(fields[index+3]) + blue, _ := strconv.Atoi(fields[index+4]) + color = fmt.Sprintf("#%02x%02x%02x", red, green, blue) + } + } + if len(color) > 0 { + if field == "38" { + foreground = color + } else { + background = color + } + } + break FieldLoop + } + } + var colon string + if len(a.attributes) > 1 && a.attributes[0] == '-' { + a.attributes = a.attributes[1:] + } + if len(a.attributes) > 0 { + colon = ":" + } + if len(foreground) > 0 || len(background) > 0 || len(a.attributes) > 0 { + fmt.Fprintf(a.buffer, "[%s:%s%s%s]", foreground, background, colon, a.attributes) + } + } + a.state = ansiText + default: // Undefined byte. + a.state = ansiText // Abort CSI. + } + + // We just entered a substring/command sequence. + case ansiSubstring: + if r == 27 { // Most likely the end of the substring. + a.state = ansiEscape + } // Ignore all other characters. + + // "ansiText" and all others. + default: + if r == 27 { + // This is the start of an escape sequence. + a.state = ansiEscape + } else { + // Just a regular rune. Send to buffer. + if _, err := a.buffer.WriteRune(r); err != nil { + return 0, err + } + } + } + } + + // Write buffer to target writer. + n, err := a.buffer.WriteTo(a.Writer) + if err != nil { + return int(n), err + } + return len(text), nil +} + +// TranslateANSI replaces ANSI escape sequences found in the provided string +// with tview's style tags and returns the resulting string. +func TranslateANSI(text string) string { + var buffer bytes.Buffer + writer := ANSIWriter(&buffer) + writer.Write([]byte(text)) + return buffer.String() +} diff --git a/vendor/github.com/rivo/tview/application.go b/vendor/github.com/rivo/tview/application.go new file mode 100644 index 00000000..3c5fde84 --- /dev/null +++ b/vendor/github.com/rivo/tview/application.go @@ -0,0 +1,899 @@ +package tview + +import ( + "strings" + "sync" + "time" + + "github.com/gdamore/tcell/v2" +) + +const ( + // The size of the event/update/redraw channels. + queueSize = 100 + + // The minimum time between two consecutive redraws. + redrawPause = 50 * time.Millisecond +) + +// DoubleClickInterval specifies the maximum time between clicks to register a +// double click rather than click. +var DoubleClickInterval = 500 * time.Millisecond + +// MouseAction indicates one of the actions the mouse is logically doing. +type MouseAction int16 + +// Available mouse actions. +const ( + MouseMove MouseAction = iota + MouseLeftDown + MouseLeftUp + MouseLeftClick + MouseLeftDoubleClick + MouseMiddleDown + MouseMiddleUp + MouseMiddleClick + MouseMiddleDoubleClick + MouseRightDown + MouseRightUp + MouseRightClick + MouseRightDoubleClick + MouseScrollUp + MouseScrollDown + MouseScrollLeft + MouseScrollRight + + // The following special value will not be provided as a mouse action but + // indicate that an overridden mouse event was consumed. See + // [Box.SetMouseCapture] for details. + MouseConsumed +) + +// queuedUpdate represented the execution of f queued by +// Application.QueueUpdate(). If "done" is not nil, it receives exactly one +// element after f has executed. +type queuedUpdate struct { + f func() + done chan struct{} +} + +// Application represents the top node of an application. +// +// It is not strictly required to use this class as none of the other classes +// depend on it. However, it provides useful tools to set up an application and +// plays nicely with all widgets. +// +// The following command displays a primitive p on the screen until Ctrl-C is +// pressed: +// +// if err := tview.NewApplication().SetRoot(p, true).Run(); err != nil { +// panic(err) +// } +type Application struct { + sync.RWMutex + + // The application's screen. Apart from Run(), this variable should never be + // set directly. Always use the screenReplacement channel after calling + // Fini(), to set a new screen (or nil to stop the application). + screen tcell.Screen + + // The application's title. If not empty, it will be set on every new screen + // that is added. + title string + + // The primitive which currently has the keyboard focus. + focus Primitive + + // The root primitive to be seen on the screen. + root Primitive + + // Whether or not the application resizes the root primitive. + rootFullscreen bool + + // Set to true if mouse events are enabled. + enableMouse bool + + // Set to true if paste events are enabled. + enablePaste bool + + // An optional capture function which receives a key event and returns the + // event to be forwarded to the default input handler (nil if nothing should + // be forwarded). + inputCapture func(event *tcell.EventKey) *tcell.EventKey + + // An optional callback function which is invoked just before the root + // primitive is drawn. + beforeDraw func(screen tcell.Screen) bool + + // An optional callback function which is invoked after the root primitive + // was drawn. + afterDraw func(screen tcell.Screen) + + // Used to send screen events from separate goroutine to main event loop + events chan tcell.Event + + // Functions queued from goroutines, used to serialize updates to primitives. + updates chan queuedUpdate + + // An object that the screen variable will be set to after Fini() was called. + // Use this channel to set a new screen object for the application + // (screen.Init() and draw() will be called implicitly). A value of nil will + // stop the application. + screenReplacement chan tcell.Screen + + // An optional capture function which receives a mouse event and returns the + // event to be forwarded to the default mouse handler (nil if nothing should + // be forwarded). + mouseCapture func(event *tcell.EventMouse, action MouseAction) (*tcell.EventMouse, MouseAction) + + mouseCapturingPrimitive Primitive // A Primitive returned by a MouseHandler which will capture future mouse events. + lastMouseX, lastMouseY int // The last position of the mouse. + mouseDownX, mouseDownY int // The position of the mouse when its button was last pressed. + lastMouseClick time.Time // The time when a mouse button was last clicked. + lastMouseButtons tcell.ButtonMask // The last mouse button state. +} + +// NewApplication creates and returns a new application. +func NewApplication() *Application { + return &Application{ + events: make(chan tcell.Event, queueSize), + updates: make(chan queuedUpdate, queueSize), + screenReplacement: make(chan tcell.Screen, 1), + } +} + +// SetInputCapture sets a function which captures all key events before they are +// forwarded to the key event handler of the primitive which currently has +// focus. This function can then choose to forward that key event (or a +// different one) by returning it or stop the key event processing by returning +// nil. +// +// The only default global key event is Ctrl-C which stops the application. It +// requires special handling: +// +// - If you do not wish to change the default behavior, return the original +// event object passed to your input capture function. +// - If you wish to block Ctrl-C from any functionality, return nil. +// - If you do not wish Ctrl-C to stop the application but still want to +// forward the Ctrl-C event to primitives down the hierarchy, return a new +// key event with the same key and modifiers, e.g. +// tcell.NewEventKey(tcell.KeyCtrlC, 0, tcell.ModNone). +// +// Pasted key events are not forwarded to the input capture function if pasting +// is enabled (see [Application.EnablePaste]). +func (a *Application) SetInputCapture(capture func(event *tcell.EventKey) *tcell.EventKey) *Application { + a.inputCapture = capture + return a +} + +// GetInputCapture returns the function installed with SetInputCapture() or nil +// if no such function has been installed. +func (a *Application) GetInputCapture() func(event *tcell.EventKey) *tcell.EventKey { + return a.inputCapture +} + +// SetMouseCapture sets a function which captures mouse events (consisting of +// the original tcell mouse event and the semantic mouse action) before they are +// forwarded to the appropriate mouse event handler. This function can then +// choose to forward that event (or a different one) by returning it or stop +// the event processing by returning a nil mouse event. In such a case, the +// event is considered consumed and the screen will be redrawn. +func (a *Application) SetMouseCapture(capture func(event *tcell.EventMouse, action MouseAction) (*tcell.EventMouse, MouseAction)) *Application { + a.mouseCapture = capture + return a +} + +// GetMouseCapture returns the function installed with SetMouseCapture() or nil +// if no such function has been installed. +func (a *Application) GetMouseCapture() func(event *tcell.EventMouse, action MouseAction) (*tcell.EventMouse, MouseAction) { + return a.mouseCapture +} + +// SetScreen allows you to provide your own tcell.Screen object. For most +// applications, this is not needed and you should be familiar with +// tcell.Screen when using this function. As the tcell.Screen interface may +// change in the future, you may need to update your code when this package +// updates to a new tcell version. +// +// This function is typically called before the first call to Run(). Init() need +// not be called on the screen. +func (a *Application) SetScreen(screen tcell.Screen) *Application { + if screen == nil { + return a // Invalid input. Do nothing. + } + + a.Lock() + if a.screen == nil { + // Run() has not been called yet. + a.screen = screen + a.Unlock() + screen.Init() + return a + } + + // Run() is already in progress. Exchange screen. + oldScreen := a.screen + a.Unlock() + oldScreen.Fini() + a.screenReplacement <- screen + + return a +} + +// SetTitle sets the title of the terminal window, to the extent that the +// terminal supports it. A non-empty title will be set on every new tcell.Screen +// that is created by or added to this application. +func (a *Application) SetTitle(title string) *Application { + a.Lock() + defer a.Unlock() + a.title = title + if a.screen != nil { + a.screen.SetTitle(title) + } + return a +} + +// EnableMouse enables mouse events or disables them (if "false" is provided). +func (a *Application) EnableMouse(enable bool) *Application { + a.Lock() + defer a.Unlock() + if enable != a.enableMouse && a.screen != nil { + if enable { + a.screen.EnableMouse() + } else { + a.screen.DisableMouse() + } + } + a.enableMouse = enable + return a +} + +// EnablePaste enables the capturing of paste events or disables them (if +// "false" is provided). This must be supported by the terminal. +// +// Widgets won't interpret paste events for navigation or selection purposes. +// Paste events are typically only used to insert a block of text into an +// [InputField] or a [TextArea]. +func (a *Application) EnablePaste(enable bool) *Application { + a.Lock() + defer a.Unlock() + if enable != a.enablePaste && a.screen != nil { + if enable { + a.screen.EnablePaste() + } else { + a.screen.DisablePaste() + } + } + a.enablePaste = enable + return a +} + +// Run starts the application and thus the event loop. This function returns +// when [Application.Stop] was called. +// +// Note that while an application is running, it fully claims stdin, stdout, and +// stderr. If you use these standard streams, they may not work as expected. +// Consider stopping the application first or suspending it (using +// [Application.Suspend]) if you have to interact with the standard streams, for +// example when needing to print a call stack during a panic. +func (a *Application) Run() error { + var ( + err, appErr error + lastRedraw time.Time // The time the screen was last redrawn. + redrawTimer *time.Timer // A timer to schedule the next redraw. + ) + a.Lock() + + // Make a screen if there is none yet. + if a.screen == nil { + a.screen, err = tcell.NewScreen() + if err != nil { + a.Unlock() + return err + } + if err = a.screen.Init(); err != nil { + a.Unlock() + return err + } + if a.enableMouse { + a.screen.EnableMouse() + } else { + a.screen.DisableMouse() + } + if a.enablePaste { + a.screen.EnablePaste() + } else { + a.screen.DisablePaste() + } + if a.title != "" { + a.screen.SetTitle(a.title) + } + } + + // We catch panics to clean up because they mess up the terminal. + defer func() { + if p := recover(); p != nil { + if a.screen != nil { + a.screen.Fini() + } + panic(p) + } + }() + + // Draw the screen for the first time. + a.Unlock() + a.draw() + + // Separate loop to wait for screen events. + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + for { + a.RLock() + screen := a.screen + a.RUnlock() + if screen == nil { + // We have no screen. Let's stop. + a.QueueEvent(nil) + break + } + + // Wait for next event and queue it. + event := screen.PollEvent() + if event != nil { + // Regular event. Queue. + a.QueueEvent(event) + continue + } + + // A screen was finalized (event is nil). Wait for a new screen. + screen = <-a.screenReplacement + if screen == nil { + // No new screen. We're done. + a.QueueEvent(nil) // Stop the event loop. + return + } + + // We have a new screen. Keep going. + a.Lock() + a.screen = screen + enableMouse := a.enableMouse + enablePaste := a.enablePaste + a.Unlock() + + // Initialize and draw this screen. + if err := screen.Init(); err != nil { + panic(err) + } + if enableMouse { + screen.EnableMouse() + } else { + screen.DisableMouse() + } + if enablePaste { + screen.EnablePaste() + } else { + screen.DisablePaste() + } + if a.title != "" { + screen.SetTitle(a.title) + } + a.draw() + } + }() + + // Start event loop. + var ( + pasteBuffer strings.Builder + pasting bool // Set to true while we receive paste key events. + ) +EventLoop: + for { + select { + // If we received an event, handle it. + case event := <-a.events: + if event == nil { + break EventLoop + } + + switch event := event.(type) { + case *tcell.EventKey: + // If we are pasting, collect runes, nothing else. + if pasting { + switch event.Key() { + case tcell.KeyRune: + pasteBuffer.WriteRune(event.Rune()) + case tcell.KeyEnter: + pasteBuffer.WriteRune('\n') + case tcell.KeyTab: + pasteBuffer.WriteRune('\t') + } + break + } + + a.RLock() + root := a.root + inputCapture := a.inputCapture + a.RUnlock() + + // Intercept keys. + var draw bool + originalEvent := event + if inputCapture != nil { + event = inputCapture(event) + if event == nil { + a.draw() + break // Don't forward event. + } + draw = true + } + + // Ctrl-C closes the application. + if event == originalEvent && event.Key() == tcell.KeyCtrlC { + a.Stop() + break + } + + // Pass other key events to the root primitive. + if root != nil && root.HasFocus() { + if handler := root.InputHandler(); handler != nil { + handler(event, func(p Primitive) { + a.SetFocus(p) + }) + draw = true + } + } + + // Redraw. + if draw { + a.draw() + } + case *tcell.EventPaste: + if !a.enablePaste { + break + } + if event.Start() { + pasting = true + pasteBuffer.Reset() + } else if event.End() { + pasting = false + a.RLock() + root := a.root + a.RUnlock() + if root != nil && root.HasFocus() && pasteBuffer.Len() > 0 { + // Pass paste event to the root primitive. + if handler := root.PasteHandler(); handler != nil { + handler(pasteBuffer.String(), func(p Primitive) { + a.SetFocus(p) + }) + } + + // Redraw. + a.draw() + } + } + case *tcell.EventResize: + if time.Since(lastRedraw) < redrawPause { + if redrawTimer != nil { + redrawTimer.Stop() + } + redrawTimer = time.AfterFunc(redrawPause, func() { + a.events <- event + }) + } + a.RLock() + screen := a.screen + a.RUnlock() + if screen == nil { + break + } + lastRedraw = time.Now() + screen.Clear() + a.draw() + case *tcell.EventMouse: + consumed, isMouseDownAction := a.fireMouseActions(event) + if consumed { + a.draw() + } + a.lastMouseButtons = event.Buttons() + if isMouseDownAction { + a.mouseDownX, a.mouseDownY = event.Position() + } + case *tcell.EventError: + appErr = event + a.Stop() + } + + // If we have updates, now is the time to execute them. + case update := <-a.updates: + update.f() + if update.done != nil { + update.done <- struct{}{} + } + } + } + + // Wait for the event loop to finish. + wg.Wait() + a.screen = nil + + return appErr +} + +// fireMouseActions analyzes the provided mouse event, derives mouse actions +// from it and then forwards them to the corresponding primitives. +func (a *Application) fireMouseActions(event *tcell.EventMouse) (consumed, isMouseDownAction bool) { + // We want to relay follow-up events to the same target primitive. + var targetPrimitive Primitive + + // Helper function to fire a mouse action. + fire := func(action MouseAction) { + switch action { + case MouseLeftDown, MouseMiddleDown, MouseRightDown: + isMouseDownAction = true + } + + // Intercept event. + if a.mouseCapture != nil { + event, action = a.mouseCapture(event, action) + if event == nil { + consumed = true + return // Don't forward event. + } + } + + // Determine the target primitive. + var primitive, capturingPrimitive Primitive + if a.mouseCapturingPrimitive != nil { + primitive = a.mouseCapturingPrimitive + targetPrimitive = a.mouseCapturingPrimitive + } else if targetPrimitive != nil { + primitive = targetPrimitive + } else { + primitive = a.root + } + if primitive != nil { + if handler := primitive.MouseHandler(); handler != nil { + var wasConsumed bool + wasConsumed, capturingPrimitive = handler(action, event, func(p Primitive) { + a.SetFocus(p) + }) + if wasConsumed { + consumed = true + } + } + } + a.mouseCapturingPrimitive = capturingPrimitive + } + + x, y := event.Position() + buttons := event.Buttons() + clickMoved := x != a.mouseDownX || y != a.mouseDownY + buttonChanges := buttons ^ a.lastMouseButtons + + if x != a.lastMouseX || y != a.lastMouseY { + fire(MouseMove) + a.lastMouseX = x + a.lastMouseY = y + } + + for _, buttonEvent := range []struct { + button tcell.ButtonMask + down, up, click, dclick MouseAction + }{ + {tcell.ButtonPrimary, MouseLeftDown, MouseLeftUp, MouseLeftClick, MouseLeftDoubleClick}, + {tcell.ButtonMiddle, MouseMiddleDown, MouseMiddleUp, MouseMiddleClick, MouseMiddleDoubleClick}, + {tcell.ButtonSecondary, MouseRightDown, MouseRightUp, MouseRightClick, MouseRightDoubleClick}, + } { + if buttonChanges&buttonEvent.button != 0 { + if buttons&buttonEvent.button != 0 { + fire(buttonEvent.down) + } else { + fire(buttonEvent.up) // A user override might set event to nil. + if !clickMoved && event != nil { + if a.lastMouseClick.Add(DoubleClickInterval).Before(time.Now()) { + fire(buttonEvent.click) + a.lastMouseClick = time.Now() + } else { + fire(buttonEvent.dclick) + a.lastMouseClick = time.Time{} // reset + } + } + } + } + } + + for _, wheelEvent := range []struct { + button tcell.ButtonMask + action MouseAction + }{ + {tcell.WheelUp, MouseScrollUp}, + {tcell.WheelDown, MouseScrollDown}, + {tcell.WheelLeft, MouseScrollLeft}, + {tcell.WheelRight, MouseScrollRight}} { + if buttons&wheelEvent.button != 0 { + fire(wheelEvent.action) + } + } + + return consumed, isMouseDownAction +} + +// Stop stops the application, causing Run() to return. +func (a *Application) Stop() { + a.Lock() + defer a.Unlock() + screen := a.screen + if screen == nil { + return + } + a.screen = nil + screen.Fini() + a.screenReplacement <- nil +} + +// Suspend temporarily suspends the application by exiting terminal UI mode and +// invoking the provided function "f". When "f" returns, terminal UI mode is +// entered again and the application resumes. +// +// A return value of true indicates that the application was suspended and "f" +// was called. If false is returned, the application was already suspended, +// terminal UI mode was not exited, and "f" was not called. +func (a *Application) Suspend(f func()) bool { + a.RLock() + screen := a.screen + a.RUnlock() + if screen == nil { + return false // Screen has not yet been initialized. + } + + // Enter suspended mode. + if err := screen.Suspend(); err != nil { + return false // Suspension failed. + } + + // Wait for "f" to return. + f() + + // If the screen object has changed in the meantime, we need to do more. + a.RLock() + defer a.RUnlock() + if a.screen != screen { + // Calling Stop() while in suspend mode currently still leads to a + // panic, see https://github.com/gdamore/tcell/issues/440. + screen.Fini() + if a.screen == nil { + return true // If stop was called (a.screen is nil), we're done already. + } + } else { + // It hasn't changed. Resume. + screen.Resume() // Not much we can do in case of an error. + } + + // Continue application loop. + return true +} + +// Draw refreshes the screen (during the next update cycle). It calls the Draw() +// function of the application's root primitive and then syncs the screen +// buffer. It is almost never necessary to call this function. It can actually +// deadlock your application if you call it from the main thread (e.g. in a +// callback function of a widget). Please see +// https://github.com/rivo/tview/wiki/Concurrency for details. +func (a *Application) Draw() *Application { + a.QueueUpdate(func() { + a.draw() + }) + return a +} + +// ForceDraw refreshes the screen immediately. Use this function with caution as +// it may lead to race conditions with updates to primitives in other +// goroutines. It is always preferable to call [Application.Draw] instead. +// Never call this function from a goroutine. +// +// It is safe to call this function during queued updates and direct event +// handling. +func (a *Application) ForceDraw() *Application { + return a.draw() +} + +// draw actually does what Draw() promises to do. +func (a *Application) draw() *Application { + a.Lock() + defer a.Unlock() + + screen := a.screen + root := a.root + fullscreen := a.rootFullscreen + before := a.beforeDraw + after := a.afterDraw + + // Maybe we're not ready yet or not anymore. + if screen == nil || root == nil { + return a + } + + // Resize if requested. + if fullscreen { // root is not nil here. + width, height := screen.Size() + root.SetRect(0, 0, width, height) + } + + // Clear screen to remove unwanted artifacts from the previous cycle. + screen.Clear() + + // Call before handler if there is one. + if before != nil { + if before(screen) { + screen.Show() + return a + } + } + + // Draw all primitives. + root.Draw(screen) + + // Call after handler if there is one. + if after != nil { + after(screen) + } + + // Sync screen. + screen.Show() + + return a +} + +// Sync forces a full re-sync of the screen buffer with the actual screen during +// the next event cycle. This is useful for when the terminal screen is +// corrupted so you may want to offer your users a keyboard shortcut to refresh +// the screen. +func (a *Application) Sync() *Application { + a.updates <- queuedUpdate{f: func() { + a.RLock() + screen := a.screen + a.RUnlock() + if screen == nil { + return + } + screen.Sync() + }} + return a +} + +// SetBeforeDrawFunc installs a callback function which is invoked just before +// the root primitive is drawn during screen updates. If the function returns +// true, drawing will not continue, i.e. the root primitive will not be drawn +// (and an after-draw-handler will not be called). +// +// Note that the screen is not cleared by the application. To clear the screen, +// you may call screen.Clear(). +// +// Provide nil to uninstall the callback function. +func (a *Application) SetBeforeDrawFunc(handler func(screen tcell.Screen) bool) *Application { + a.beforeDraw = handler + return a +} + +// GetBeforeDrawFunc returns the callback function installed with +// SetBeforeDrawFunc() or nil if none has been installed. +func (a *Application) GetBeforeDrawFunc() func(screen tcell.Screen) bool { + return a.beforeDraw +} + +// SetAfterDrawFunc installs a callback function which is invoked after the root +// primitive was drawn during screen updates. +// +// Provide nil to uninstall the callback function. +func (a *Application) SetAfterDrawFunc(handler func(screen tcell.Screen)) *Application { + a.afterDraw = handler + return a +} + +// GetAfterDrawFunc returns the callback function installed with +// SetAfterDrawFunc() or nil if none has been installed. +func (a *Application) GetAfterDrawFunc() func(screen tcell.Screen) { + return a.afterDraw +} + +// SetRoot sets the root primitive for this application. If "fullscreen" is set +// to true, the root primitive's position will be changed to fill the screen. +// +// This function must be called at least once or nothing will be displayed when +// the application starts. +// +// It also calls SetFocus() on the primitive. +func (a *Application) SetRoot(root Primitive, fullscreen bool) *Application { + a.Lock() + a.root = root + a.rootFullscreen = fullscreen + if a.screen != nil { + a.screen.Clear() + } + a.Unlock() + + a.SetFocus(root) + + return a +} + +// ResizeToFullScreen resizes the given primitive such that it fills the entire +// screen. +func (a *Application) ResizeToFullScreen(p Primitive) *Application { + a.RLock() + width, height := a.screen.Size() + a.RUnlock() + p.SetRect(0, 0, width, height) + return a +} + +// SetFocus sets the focus to a new primitive. All key events will be directed +// down the hierarchy (starting at the root) until a primitive handles them, +// which per default goes towards the focused primitive. +// +// Blur() will be called on the previously focused primitive. Focus() will be +// called on the new primitive. +func (a *Application) SetFocus(p Primitive) *Application { + a.Lock() + if a.focus != nil { + a.focus.Blur() + } + a.focus = p + if a.screen != nil { + a.screen.HideCursor() + } + a.Unlock() + if p != nil { + p.Focus(func(p Primitive) { + a.SetFocus(p) + }) + } + + return a +} + +// GetFocus returns the primitive which has the current focus. If none has it, +// nil is returned. +func (a *Application) GetFocus() Primitive { + a.RLock() + defer a.RUnlock() + return a.focus +} + +// QueueUpdate is used to synchronize access to primitives from non-main +// goroutines. The provided function will be executed as part of the event loop +// and thus will not cause race conditions with other such update functions or +// the Draw() function. +// +// Note that Draw() is not implicitly called after the execution of f as that +// may not be desirable. You can call Draw() from f if the screen should be +// refreshed after each update. Alternatively, use QueueUpdateDraw() to follow +// up with an immediate refresh of the screen. +// +// This function returns after f has executed. +func (a *Application) QueueUpdate(f func()) *Application { + ch := make(chan struct{}) + a.updates <- queuedUpdate{f: f, done: ch} + <-ch + return a +} + +// QueueUpdateDraw works like QueueUpdate() except it refreshes the screen +// immediately after executing f. +func (a *Application) QueueUpdateDraw(f func()) *Application { + a.QueueUpdate(func() { + f() + a.draw() + }) + return a +} + +// QueueEvent sends an event to the Application event loop. +// +// It is not recommended for event to be nil. +func (a *Application) QueueEvent(event tcell.Event) *Application { + a.events <- event + return a +} diff --git a/vendor/github.com/rivo/tview/borders.go b/vendor/github.com/rivo/tview/borders.go new file mode 100644 index 00000000..946c8783 --- /dev/null +++ b/vendor/github.com/rivo/tview/borders.go @@ -0,0 +1,45 @@ +package tview + +// Borders defines various borders used when primitives are drawn. +// These may be changed to accommodate a different look and feel. +var Borders = struct { + Horizontal rune + Vertical rune + TopLeft rune + TopRight rune + BottomLeft rune + BottomRight rune + + LeftT rune + RightT rune + TopT rune + BottomT rune + Cross rune + + HorizontalFocus rune + VerticalFocus rune + TopLeftFocus rune + TopRightFocus rune + BottomLeftFocus rune + BottomRightFocus rune +}{ + Horizontal: BoxDrawingsLightHorizontal, + Vertical: BoxDrawingsLightVertical, + TopLeft: BoxDrawingsLightDownAndRight, + TopRight: BoxDrawingsLightDownAndLeft, + BottomLeft: BoxDrawingsLightUpAndRight, + BottomRight: BoxDrawingsLightUpAndLeft, + + LeftT: BoxDrawingsLightVerticalAndRight, + RightT: BoxDrawingsLightVerticalAndLeft, + TopT: BoxDrawingsLightDownAndHorizontal, + BottomT: BoxDrawingsLightUpAndHorizontal, + Cross: BoxDrawingsLightVerticalAndHorizontal, + + HorizontalFocus: BoxDrawingsDoubleHorizontal, + VerticalFocus: BoxDrawingsDoubleVertical, + TopLeftFocus: BoxDrawingsDoubleDownAndRight, + TopRightFocus: BoxDrawingsDoubleDownAndLeft, + BottomLeftFocus: BoxDrawingsDoubleUpAndRight, + BottomRightFocus: BoxDrawingsDoubleUpAndLeft, +} diff --git a/vendor/github.com/rivo/tview/box.go b/vendor/github.com/rivo/tview/box.go new file mode 100644 index 00000000..c05994cc --- /dev/null +++ b/vendor/github.com/rivo/tview/box.go @@ -0,0 +1,486 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// Box implements the Primitive interface with an empty background and optional +// elements such as a border and a title. Box itself does not hold any content +// but serves as the superclass of all other primitives. Subclasses add their +// own content, typically (but not necessarily) keeping their content within the +// box's rectangle. +// +// Box provides a number of utility functions available to all primitives. +// +// See https://github.com/rivo/tview/wiki/Box for an example. +type Box struct { + // The position of the rect. + x, y, width, height int + + // The inner rect reserved for the box's content. + innerX, innerY, innerWidth, innerHeight int + + // Border padding. + paddingTop, paddingBottom, paddingLeft, paddingRight int + + // The box's background color. + backgroundColor tcell.Color + + // If set to true, the background of this box is not cleared while drawing. + dontClear bool + + // Whether or not a border is drawn, reducing the box's space for content by + // two in width and height. + border bool + + // The border style. + borderStyle tcell.Style + + // The title. Only visible if there is a border, too. + title string + + // The color of the title. + titleColor tcell.Color + + // The alignment of the title. + titleAlign int + + // Whether or not this box has focus. This is typically ignored for + // container primitives (e.g. Flex, Grid, Pages), as they will delegate + // focus to their children. + hasFocus bool + + // Optional callback functions invoked when the primitive receives or loses + // focus. + focus, blur func() + + // An optional capture function which receives a key event and returns the + // event to be forwarded to the primitive's default input handler (nil if + // nothing should be forwarded). + inputCapture func(event *tcell.EventKey) *tcell.EventKey + + // An optional function which is called before the box is drawn. + draw func(screen tcell.Screen, x, y, width, height int) (int, int, int, int) + + // An optional capture function which receives a mouse event and returns the + // event to be forwarded to the primitive's default mouse event handler (at + // least one nil if nothing should be forwarded). + mouseCapture func(action MouseAction, event *tcell.EventMouse) (MouseAction, *tcell.EventMouse) +} + +// NewBox returns a Box without a border. +func NewBox() *Box { + b := &Box{ + width: 15, + height: 10, + innerX: -1, // Mark as uninitialized. + backgroundColor: Styles.PrimitiveBackgroundColor, + borderStyle: tcell.StyleDefault.Foreground(Styles.BorderColor).Background(Styles.PrimitiveBackgroundColor), + titleColor: Styles.TitleColor, + titleAlign: AlignCenter, + } + return b +} + +// SetBorderPadding sets the size of the borders around the box content. +func (b *Box) SetBorderPadding(top, bottom, left, right int) *Box { + b.paddingTop, b.paddingBottom, b.paddingLeft, b.paddingRight = top, bottom, left, right + return b +} + +// GetRect returns the current position of the rectangle, x, y, width, and +// height. +func (b *Box) GetRect() (int, int, int, int) { + return b.x, b.y, b.width, b.height +} + +// GetInnerRect returns the position of the inner rectangle (x, y, width, +// height), without the border and without any padding. Width and height values +// will clamp to 0 and thus never be negative. +func (b *Box) GetInnerRect() (int, int, int, int) { + if b.innerX >= 0 { + return b.innerX, b.innerY, b.innerWidth, b.innerHeight + } + x, y, width, height := b.GetRect() + if b.border { + x++ + y++ + width -= 2 + height -= 2 + } + x, y, width, height = x+b.paddingLeft, + y+b.paddingTop, + width-b.paddingLeft-b.paddingRight, + height-b.paddingTop-b.paddingBottom + if width < 0 { + width = 0 + } + if height < 0 { + height = 0 + } + return x, y, width, height +} + +// SetRect sets a new position of the primitive. Note that this has no effect +// if this primitive is part of a layout (e.g. Flex, Grid) or if it was added +// like this: +// +// application.SetRoot(p, true) +func (b *Box) SetRect(x, y, width, height int) { + b.x = x + b.y = y + b.width = width + b.height = height + b.innerX = -1 // Mark inner rect as uninitialized. +} + +// SetDrawFunc sets a callback function which is invoked after the box primitive +// has been drawn. This allows you to add a more individual style to the box +// (and all primitives which extend it). +// +// The function is provided with the box's dimensions (set via SetRect()). It +// must return the box's inner dimensions (x, y, width, height) which will be +// returned by GetInnerRect(), used by descendent primitives to draw their own +// content. +func (b *Box) SetDrawFunc(handler func(screen tcell.Screen, x, y, width, height int) (int, int, int, int)) *Box { + b.draw = handler + return b +} + +// GetDrawFunc returns the callback function which was installed with +// SetDrawFunc() or nil if no such function has been installed. +func (b *Box) GetDrawFunc() func(screen tcell.Screen, x, y, width, height int) (int, int, int, int) { + return b.draw +} + +// WrapInputHandler wraps an input handler (see [Box.InputHandler]) with the +// functionality to capture input (see [Box.SetInputCapture]) before passing it +// on to the provided (default) input handler. +// +// This is only meant to be used by subclassing primitives. +func (b *Box) WrapInputHandler(inputHandler func(*tcell.EventKey, func(p Primitive))) func(*tcell.EventKey, func(p Primitive)) { + return func(event *tcell.EventKey, setFocus func(p Primitive)) { + if b.inputCapture != nil { + event = b.inputCapture(event) + } + if event != nil && inputHandler != nil { + inputHandler(event, setFocus) + } + } +} + +// InputHandler returns nil. Box has no default input handling. +func (b *Box) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return b.WrapInputHandler(nil) +} + +// WrapPasteHandler wraps a paste handler (see [Box.PasteHandler]). +func (b *Box) WrapPasteHandler(pasteHandler func(string, func(p Primitive))) func(string, func(p Primitive)) { + return func(text string, setFocus func(p Primitive)) { + if pasteHandler != nil { + pasteHandler(text, setFocus) + } + } +} + +// PasteHandler returns nil. Box has no default paste handling. +func (b *Box) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return b.WrapPasteHandler(nil) +} + +// SetInputCapture installs a function which captures key events before they are +// forwarded to the primitive's default key event handler. This function can +// then choose to forward that key event (or a different one) to the default +// handler by returning it. If nil is returned, the default handler will not +// be called. +// +// Providing a nil handler will remove a previously existing handler. +// +// This function can also be used on container primitives (like Flex, Grid, or +// Form) as keyboard events will be handed down until they are handled. +// +// Pasted key events are not forwarded to the input capture function if pasting +// is enabled (see [Application.EnablePaste]). +func (b *Box) SetInputCapture(capture func(event *tcell.EventKey) *tcell.EventKey) *Box { + b.inputCapture = capture + return b +} + +// GetInputCapture returns the function installed with SetInputCapture() or nil +// if no such function has been installed. +func (b *Box) GetInputCapture() func(event *tcell.EventKey) *tcell.EventKey { + return b.inputCapture +} + +// WrapMouseHandler wraps a mouse event handler (see [Box.MouseHandler]) with the +// functionality to capture mouse events (see [Box.SetMouseCapture]) before passing +// them on to the provided (default) event handler. +// +// This is only meant to be used by subclassing primitives. +func (b *Box) WrapMouseHandler(mouseHandler func(MouseAction, *tcell.EventMouse, func(p Primitive)) (bool, Primitive)) func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if b.mouseCapture != nil { + action, event = b.mouseCapture(action, event) + } + if event == nil { + if action == MouseConsumed { + consumed = true + } + } else if mouseHandler != nil { + consumed, capture = mouseHandler(action, event, setFocus) + } + return + } +} + +// MouseHandler returns nil. Box has no default mouse handling. +func (b *Box) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return b.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if action == MouseLeftDown && b.InRect(event.Position()) { + setFocus(b) + consumed = true + } + return + }) +} + +// SetMouseCapture sets a function which captures mouse events (consisting of +// the original tcell mouse event and the semantic mouse action) before they are +// forwarded to the primitive's default mouse event handler. This function can +// then choose to forward that event (or a different one) by returning it or +// returning a nil mouse event, in which case the default handler will not be +// called. +// +// When a nil event is returned, the returned mouse action value may be set to +// [MouseConsumed] to indicate that the event was consumed and the screen should +// be redrawn. Any other value will not cause a redraw. +// +// Providing a nil handler will remove a previously existing handler. +// +// Note that mouse events are ignored completely if the application has not been +// enabled for mouse events (see [Application.EnableMouse]), which is the +// default. +func (b *Box) SetMouseCapture(capture func(action MouseAction, event *tcell.EventMouse) (MouseAction, *tcell.EventMouse)) *Box { + b.mouseCapture = capture + return b +} + +// InRect returns true if the given coordinate is within the bounds of the box's +// rectangle. +func (b *Box) InRect(x, y int) bool { + rectX, rectY, width, height := b.GetRect() + return x >= rectX && x < rectX+width && y >= rectY && y < rectY+height +} + +// InInnerRect returns true if the given coordinate is within the bounds of the +// box's inner rectangle (within the border and padding). +func (b *Box) InInnerRect(x, y int) bool { + rectX, rectY, width, height := b.GetInnerRect() + return x >= rectX && x < rectX+width && y >= rectY && y < rectY+height +} + +// GetMouseCapture returns the function installed with SetMouseCapture() or nil +// if no such function has been installed. +func (b *Box) GetMouseCapture() func(action MouseAction, event *tcell.EventMouse) (MouseAction, *tcell.EventMouse) { + return b.mouseCapture +} + +// SetBackgroundColor sets the box's background color. +func (b *Box) SetBackgroundColor(color tcell.Color) *Box { + b.backgroundColor = color + b.borderStyle = b.borderStyle.Background(color) + return b +} + +// SetBorder sets the flag indicating whether or not the box should have a +// border. +func (b *Box) SetBorder(show bool) *Box { + b.border = show + return b +} + +// SetBorderStyle sets the box's border style. +func (b *Box) SetBorderStyle(style tcell.Style) *Box { + b.borderStyle = style + return b +} + +// SetBorderColor sets the box's border color. +func (b *Box) SetBorderColor(color tcell.Color) *Box { + b.borderStyle = b.borderStyle.Foreground(color) + return b +} + +// SetBorderAttributes sets the border's style attributes. You can combine +// different attributes using bitmask operations: +// +// box.SetBorderAttributes(tcell.AttrItalic | tcell.AttrBold) +func (b *Box) SetBorderAttributes(attr tcell.AttrMask) *Box { + b.borderStyle = b.borderStyle.Attributes(attr) + return b +} + +// GetBorderAttributes returns the border's style attributes. +func (b *Box) GetBorderAttributes() tcell.AttrMask { + _, _, attr := b.borderStyle.Decompose() + return attr +} + +// GetBorderColor returns the box's border color. +func (b *Box) GetBorderColor() tcell.Color { + color, _, _ := b.borderStyle.Decompose() + return color +} + +// GetBackgroundColor returns the box's background color. +func (b *Box) GetBackgroundColor() tcell.Color { + return b.backgroundColor +} + +// SetTitle sets the box's title. +func (b *Box) SetTitle(title string) *Box { + b.title = title + return b +} + +// GetTitle returns the box's current title. +func (b *Box) GetTitle() string { + return b.title +} + +// SetTitleColor sets the box's title color. +func (b *Box) SetTitleColor(color tcell.Color) *Box { + b.titleColor = color + return b +} + +// SetTitleAlign sets the alignment of the title, one of AlignLeft, AlignCenter, +// or AlignRight. +func (b *Box) SetTitleAlign(align int) *Box { + b.titleAlign = align + return b +} + +// Draw draws this primitive onto the screen. +func (b *Box) Draw(screen tcell.Screen) { + b.DrawForSubclass(screen, b) +} + +// DrawForSubclass draws this box under the assumption that primitive p is a +// subclass of this box. This is needed e.g. to draw proper box frames which +// depend on the subclass's focus. +// +// Only call this function from your own custom primitives. It is not needed in +// applications that have no custom primitives. +func (b *Box) DrawForSubclass(screen tcell.Screen, p Primitive) { + // Don't draw anything if there is no space. + if b.width <= 0 || b.height <= 0 { + return + } + + // Fill background. + background := tcell.StyleDefault.Background(b.backgroundColor) + if !b.dontClear { + for y := b.y; y < b.y+b.height; y++ { + for x := b.x; x < b.x+b.width; x++ { + screen.SetContent(x, y, ' ', nil, background) + } + } + } + + // Draw border. + if b.border && b.width >= 2 && b.height >= 2 { + var vertical, horizontal, topLeft, topRight, bottomLeft, bottomRight rune + if p.HasFocus() { + horizontal = Borders.HorizontalFocus + vertical = Borders.VerticalFocus + topLeft = Borders.TopLeftFocus + topRight = Borders.TopRightFocus + bottomLeft = Borders.BottomLeftFocus + bottomRight = Borders.BottomRightFocus + } else { + horizontal = Borders.Horizontal + vertical = Borders.Vertical + topLeft = Borders.TopLeft + topRight = Borders.TopRight + bottomLeft = Borders.BottomLeft + bottomRight = Borders.BottomRight + } + for x := b.x + 1; x < b.x+b.width-1; x++ { + screen.SetContent(x, b.y, horizontal, nil, b.borderStyle) + screen.SetContent(x, b.y+b.height-1, horizontal, nil, b.borderStyle) + } + for y := b.y + 1; y < b.y+b.height-1; y++ { + screen.SetContent(b.x, y, vertical, nil, b.borderStyle) + screen.SetContent(b.x+b.width-1, y, vertical, nil, b.borderStyle) + } + screen.SetContent(b.x, b.y, topLeft, nil, b.borderStyle) + screen.SetContent(b.x+b.width-1, b.y, topRight, nil, b.borderStyle) + screen.SetContent(b.x, b.y+b.height-1, bottomLeft, nil, b.borderStyle) + screen.SetContent(b.x+b.width-1, b.y+b.height-1, bottomRight, nil, b.borderStyle) + + // Draw title. + if b.title != "" && b.width >= 4 { + printed, _ := Print(screen, b.title, b.x+1, b.y, b.width-2, b.titleAlign, b.titleColor) + if len(b.title)-printed > 0 && printed > 0 { + xEllipsis := b.x + b.width - 2 + if b.titleAlign == AlignRight { + xEllipsis = b.x + 1 + } + _, _, style, _ := screen.GetContent(xEllipsis, b.y) + fg, _, _ := style.Decompose() + Print(screen, string(SemigraphicsHorizontalEllipsis), xEllipsis, b.y, 1, AlignLeft, fg) + } + } + } + + // Call custom draw function. + if b.draw != nil { + b.innerX, b.innerY, b.innerWidth, b.innerHeight = b.draw(screen, b.x, b.y, b.width, b.height) + } else { + // Remember the inner rect. + b.innerX = -1 + b.innerX, b.innerY, b.innerWidth, b.innerHeight = b.GetInnerRect() + } +} + +// SetFocusFunc sets a callback function which is invoked when this primitive +// receives focus. Container primitives such as [Flex] or [Grid] may not be +// notified if one of their descendents receive focus directly. +// +// Set to nil to remove the callback function. +func (b *Box) SetFocusFunc(callback func()) *Box { + b.focus = callback + return b +} + +// SetBlurFunc sets a callback function which is invoked when this primitive +// loses focus. This does not apply to container primitives such as [Flex] or +// [Grid]. +// +// Set to nil to remove the callback function. +func (b *Box) SetBlurFunc(callback func()) *Box { + b.blur = callback + return b +} + +// Focus is called when this primitive receives focus. +func (b *Box) Focus(delegate func(p Primitive)) { + b.hasFocus = true + if b.focus != nil { + b.focus() + } +} + +// Blur is called when this primitive loses focus. +func (b *Box) Blur() { + if b.blur != nil { + b.blur() + } + b.hasFocus = false +} + +// HasFocus returns whether or not this primitive has focus. +func (b *Box) HasFocus() bool { + return b.hasFocus +} diff --git a/vendor/github.com/rivo/tview/button.go b/vendor/github.com/rivo/tview/button.go new file mode 100644 index 00000000..5ad241ae --- /dev/null +++ b/vendor/github.com/rivo/tview/button.go @@ -0,0 +1,199 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// Button is labeled box that triggers an action when selected. +// +// See https://github.com/rivo/tview/wiki/Button for an example. +type Button struct { + *Box + + // If set to true, the button cannot be activated. + disabled bool + + // The text to be displayed inside the button. + text string + + // The button's style (when deactivated). + style tcell.Style + + // The button's style (when activated). + activatedStyle tcell.Style + + // The button's style (when disabled). + disabledStyle tcell.Style + + // An optional function which is called when the button was selected. + selected func() + + // An optional function which is called when the user leaves the button. A + // key is provided indicating which key was pressed to leave (tab or + // backtab). + exit func(tcell.Key) +} + +// NewButton returns a new input field. +func NewButton(label string) *Button { + box := NewBox() + box.SetRect(0, 0, TaggedStringWidth(label)+4, 1) + return &Button{ + Box: box, + text: label, + style: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.PrimaryTextColor), + activatedStyle: tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.InverseTextColor), + disabledStyle: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.ContrastSecondaryTextColor), + } +} + +// SetLabel sets the button text. +func (b *Button) SetLabel(label string) *Button { + b.text = label + return b +} + +// GetLabel returns the button text. +func (b *Button) GetLabel() string { + return b.text +} + +// SetLabelColor sets the color of the button text. +func (b *Button) SetLabelColor(color tcell.Color) *Button { + b.style = b.style.Foreground(color) + return b +} + +// SetStyle sets the style of the button used when it is not focused. +func (b *Button) SetStyle(style tcell.Style) *Button { + b.style = style + return b +} + +// SetLabelColorActivated sets the color of the button text when the button is +// in focus. +func (b *Button) SetLabelColorActivated(color tcell.Color) *Button { + b.activatedStyle = b.activatedStyle.Foreground(color) + return b +} + +// SetBackgroundColorActivated sets the background color of the button text when +// the button is in focus. +func (b *Button) SetBackgroundColorActivated(color tcell.Color) *Button { + b.activatedStyle = b.activatedStyle.Background(color) + return b +} + +// SetActivatedStyle sets the style of the button used when it is focused. +func (b *Button) SetActivatedStyle(style tcell.Style) *Button { + b.activatedStyle = style + return b +} + +// SetDisabledStyle sets the style of the button used when it is disabled. +func (b *Button) SetDisabledStyle(style tcell.Style) *Button { + b.disabledStyle = style + return b +} + +// SetDisabled sets whether or not the button is disabled. Disabled buttons +// cannot be activated. +// +// If the button is part of a form, you should set focus to the form itself +// after calling this function to set focus to the next non-disabled form item. +func (b *Button) SetDisabled(disabled bool) *Button { + b.disabled = disabled + return b +} + +// IsDisabled returns whether or not the button is disabled. +func (b *Button) IsDisabled() bool { + return b.disabled +} + +// SetSelectedFunc sets a handler which is called when the button was selected. +func (b *Button) SetSelectedFunc(handler func()) *Button { + b.selected = handler + return b +} + +// SetExitFunc sets a handler which is called when the user leaves the button. +// The callback function is provided with the key that was pressed, which is one +// of the following: +// +// - KeyEscape: Leaving the button with no specific direction. +// - KeyTab: Move to the next field. +// - KeyBacktab: Move to the previous field. +func (b *Button) SetExitFunc(handler func(key tcell.Key)) *Button { + b.exit = handler + return b +} + +// Draw draws this primitive onto the screen. +func (b *Button) Draw(screen tcell.Screen) { + // Draw the box. + style := b.style + if b.disabled { + style = b.disabledStyle + } + if b.HasFocus() && !b.disabled { + style = b.activatedStyle + } + _, backgroundColor, _ := style.Decompose() + b.SetBackgroundColor(backgroundColor) + b.Box.DrawForSubclass(screen, b) + + // Draw label. + x, y, width, height := b.GetInnerRect() + if width > 0 && height > 0 { + y = y + height/2 + printWithStyle(screen, b.text, x, y, 0, width, AlignCenter, style, true) + } +} + +// InputHandler returns the handler for this primitive. +func (b *Button) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return b.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if b.disabled { + return + } + + // Process key event. + switch key := event.Key(); key { + case tcell.KeyEnter: // Selected. + if b.selected != nil { + b.selected() + } + case tcell.KeyBacktab, tcell.KeyTab, tcell.KeyEscape: // Leave. No action. + if b.exit != nil { + b.exit(key) + } + } + }) +} + +// MouseHandler returns the mouse handler for this primitive. +func (b *Button) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return b.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if b.disabled { + return false, nil + } + + if !b.InRect(event.Position()) { + return false, nil + } + + // Process mouse event. + if action == MouseLeftDown { + setFocus(b) + consumed = true + } else if action == MouseLeftClick { + if b.selected != nil { + b.selected() + } + consumed = true + } + + return + }) +} diff --git a/vendor/github.com/rivo/tview/checkbox.go b/vendor/github.com/rivo/tview/checkbox.go new file mode 100644 index 00000000..d7b3142d --- /dev/null +++ b/vendor/github.com/rivo/tview/checkbox.go @@ -0,0 +1,338 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// Checkbox implements a simple box for boolean values which can be checked and +// unchecked. +// +// See https://github.com/rivo/tview/wiki/Checkbox for an example. +type Checkbox struct { + *Box + + // Whether or not this checkbox is disabled/read-only. + disabled bool + + // Whether or not this box is checked. + checked bool + + // The text to be displayed before the input area. + label string + + // The screen width of the label area. A value of 0 means use the width of + // the label text. + labelWidth int + + // The label style. + labelStyle tcell.Style + + // The style of the unchecked checkbox. + uncheckedStyle tcell.Style + + // The style of the checked checkbox. + checkedStyle tcell.Style + + // Teh style of the checkbox when it is currently focused. + focusStyle tcell.Style + + // The string used to display an unchecked box. + uncheckedString string + + // The string used to display a checked box. + checkedString string + + // An optional function which is called when the user changes the checked + // state of this checkbox. + changed func(checked bool) + + // An optional function which is called when the user indicated that they + // are done entering text. The key which was pressed is provided (tab, + // shift-tab, or escape). + done func(tcell.Key) + + // A callback function set by the Form class and called when the user leaves + // this form item. + finished func(tcell.Key) +} + +// NewCheckbox returns a new input field. +func NewCheckbox() *Checkbox { + return &Checkbox{ + Box: NewBox(), + labelStyle: tcell.StyleDefault.Foreground(Styles.SecondaryTextColor), + uncheckedStyle: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.PrimaryTextColor), + checkedStyle: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.PrimaryTextColor), + focusStyle: tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.ContrastBackgroundColor), + uncheckedString: " ", + checkedString: "X", + } +} + +// SetChecked sets the state of the checkbox. This also triggers the "changed" +// callback if the state changes with this call. +func (c *Checkbox) SetChecked(checked bool) *Checkbox { + if c.checked != checked { + if c.changed != nil { + c.changed(checked) + } + c.checked = checked + } + return c +} + +// IsChecked returns whether or not the box is checked. +func (c *Checkbox) IsChecked() bool { + return c.checked +} + +// SetLabel sets the text to be displayed before the input area. +func (c *Checkbox) SetLabel(label string) *Checkbox { + c.label = label + return c +} + +// GetLabel returns the text to be displayed before the input area. +func (c *Checkbox) GetLabel() string { + return c.label +} + +// SetLabelWidth sets the screen width of the label. A value of 0 will cause the +// primitive to use the width of the label string. +func (c *Checkbox) SetLabelWidth(width int) *Checkbox { + c.labelWidth = width + return c +} + +// SetLabelColor sets the color of the label. +func (c *Checkbox) SetLabelColor(color tcell.Color) *Checkbox { + c.labelStyle = c.labelStyle.Foreground(color) + return c +} + +// SetLabelStyle sets the style of the label. +func (c *Checkbox) SetLabelStyle(style tcell.Style) *Checkbox { + c.labelStyle = style + return c +} + +// SetFieldBackgroundColor sets the background color of the input area. +func (c *Checkbox) SetFieldBackgroundColor(color tcell.Color) *Checkbox { + c.uncheckedStyle = c.uncheckedStyle.Background(color) + c.checkedStyle = c.checkedStyle.Background(color) + c.focusStyle = c.focusStyle.Foreground(color) + return c +} + +// SetFieldTextColor sets the text color of the input area. +func (c *Checkbox) SetFieldTextColor(color tcell.Color) *Checkbox { + c.uncheckedStyle = c.uncheckedStyle.Foreground(color) + c.checkedStyle = c.checkedStyle.Foreground(color) + c.focusStyle = c.focusStyle.Background(color) + return c +} + +// SetUncheckedStyle sets the style of the unchecked checkbox. +func (c *Checkbox) SetUncheckedStyle(style tcell.Style) *Checkbox { + c.uncheckedStyle = style + return c +} + +// SetCheckedStyle sets the style of the checked checkbox. +func (c *Checkbox) SetCheckedStyle(style tcell.Style) *Checkbox { + c.checkedStyle = style + return c +} + +// SetActivatedStyle sets the style of the checkbox when it is currently +// focused. +func (c *Checkbox) SetActivatedStyle(style tcell.Style) *Checkbox { + c.focusStyle = style + return c +} + +// SetCheckedString sets the string to be displayed when the checkbox is +// checked (defaults to "X"). The string may contain color tags (consider +// adapting the checkbox's various styles accordingly). See [Escape] in +// case you want to display square brackets. +func (c *Checkbox) SetCheckedString(checked string) *Checkbox { + c.checkedString = checked + return c +} + +// SetUncheckedString sets the string to be displayed when the checkbox is +// not checked (defaults to the empty space " "). The string may contain color +// tags (consider adapting the checkbox's various styles accordingly). See +// [Escape] in case you want to display square brackets. +func (c *Checkbox) SetUncheckedString(unchecked string) *Checkbox { + c.uncheckedString = unchecked + return c +} + +// SetFormAttributes sets attributes shared by all form items. +func (c *Checkbox) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) FormItem { + c.labelWidth = labelWidth + c.SetLabelColor(labelColor) + c.backgroundColor = bgColor + c.SetFieldTextColor(fieldTextColor) + c.SetFieldBackgroundColor(fieldBgColor) + return c +} + +// GetFieldWidth returns this primitive's field width. +func (c *Checkbox) GetFieldWidth() int { + return 1 +} + +// GetFieldHeight returns this primitive's field height. +func (c *Checkbox) GetFieldHeight() int { + return 1 +} + +// SetDisabled sets whether or not the item is disabled / read-only. +func (c *Checkbox) SetDisabled(disabled bool) FormItem { + c.disabled = disabled + if c.finished != nil { + c.finished(-1) + } + return c +} + +// SetChangedFunc sets a handler which is called when the checked state of this +// checkbox was changed. The handler function receives the new state. +func (c *Checkbox) SetChangedFunc(handler func(checked bool)) *Checkbox { + c.changed = handler + return c +} + +// SetDoneFunc sets a handler which is called when the user is done using the +// checkbox. The callback function is provided with the key that was pressed, +// which is one of the following: +// +// - KeyEscape: Abort text input. +// - KeyTab: Move to the next field. +// - KeyBacktab: Move to the previous field. +func (c *Checkbox) SetDoneFunc(handler func(key tcell.Key)) *Checkbox { + c.done = handler + return c +} + +// SetFinishedFunc sets a callback invoked when the user leaves this form item. +func (c *Checkbox) SetFinishedFunc(handler func(key tcell.Key)) FormItem { + c.finished = handler + return c +} + +// Focus is called when this primitive receives focus. +func (c *Checkbox) Focus(delegate func(p Primitive)) { + // If we're part of a form and this item is disabled, there's nothing the + // user can do here so we're finished. + if c.finished != nil && c.disabled { + c.finished(-1) + return + } + + c.Box.Focus(delegate) +} + +// Draw draws this primitive onto the screen. +func (c *Checkbox) Draw(screen tcell.Screen) { + c.Box.DrawForSubclass(screen, c) + + // Prepare + x, y, width, height := c.GetInnerRect() + rightLimit := x + width + if height < 1 || rightLimit <= x { + return + } + + // Draw label. + _, labelBg, _ := c.labelStyle.Decompose() + if c.labelWidth > 0 { + labelWidth := c.labelWidth + if labelWidth > width { + labelWidth = width + } + printWithStyle(screen, c.label, x, y, 0, labelWidth, AlignLeft, c.labelStyle, labelBg == tcell.ColorDefault) + x += labelWidth + width -= labelWidth + } else { + _, _, drawnWidth := printWithStyle(screen, c.label, x, y, 0, width, AlignLeft, c.labelStyle, labelBg == tcell.ColorDefault) + x += drawnWidth + width -= drawnWidth + } + + // Draw checkbox. + str := c.uncheckedString + style := c.uncheckedStyle + if c.checked { + str = c.checkedString + style = c.checkedStyle + } + if c.disabled { + style = style.Background(c.backgroundColor) + } + if c.HasFocus() { + style = c.focusStyle + } + printWithStyle(screen, str, x, y, 0, width, AlignLeft, style, c.disabled) +} + +// InputHandler returns the handler for this primitive. +func (c *Checkbox) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return c.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if c.disabled { + return + } + + // Process key event. + switch key := event.Key(); key { + case tcell.KeyRune, tcell.KeyEnter: // Check. + if key == tcell.KeyRune && event.Rune() != ' ' { + break + } + c.checked = !c.checked + if c.changed != nil { + c.changed(c.checked) + } + case tcell.KeyTab, tcell.KeyBacktab, tcell.KeyEscape: // We're done. + if c.done != nil { + c.done(key) + } + if c.finished != nil { + c.finished(key) + } + } + }) +} + +// MouseHandler returns the mouse handler for this primitive. +func (c *Checkbox) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return c.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if c.disabled { + return false, nil + } + + x, y := event.Position() + _, rectY, _, _ := c.GetInnerRect() + if !c.InRect(x, y) { + return false, nil + } + + // Process mouse event. + if y == rectY { + if action == MouseLeftDown { + setFocus(c) + consumed = true + } else if action == MouseLeftClick { + c.checked = !c.checked + if c.changed != nil { + c.changed(c.checked) + } + consumed = true + } + } + + return + }) +} diff --git a/vendor/github.com/rivo/tview/doc.go b/vendor/github.com/rivo/tview/doc.go new file mode 100644 index 00000000..b4ddbc66 --- /dev/null +++ b/vendor/github.com/rivo/tview/doc.go @@ -0,0 +1,224 @@ +/* +Package tview implements rich widgets for terminal based user interfaces. The +widgets provided with this package are useful for data exploration and data +entry. + +# Widgets + +The package implements the following widgets: + + - [TextView]: A scrollable window that display multi-colored text. Text may + also be highlighted. + - [TextArea]: An editable multi-line text area. + - [Table]: A scrollable display of tabular data. Table cells, rows, or columns + may also be highlighted. + - [TreeView]: A scrollable display for hierarchical data. Tree nodes can be + highlighted, collapsed, expanded, and more. + - [List]: A navigable text list with optional keyboard shortcuts. + - [InputField]: One-line input fields to enter text. + - [DropDown]: Drop-down selection fields. + - [Checkbox]: Selectable checkbox for boolean values. + - [Image]: Displays images. + - [Button]: Buttons which get activated when the user selects them. + - [Form]: Forms composed of input fields, drop down selections, checkboxes, + and buttons. + - [Modal]: A centered window with a text message and one or more buttons. + - [Grid]: A grid based layout manager. + - [Flex]: A Flexbox based layout manager. + - [Pages]: A page based layout manager. + +The package also provides Application which is used to poll the event queue and +draw widgets on screen. + +# Hello World + +The following is a very basic example showing a box with the title "Hello, +world!": + + package main + + import ( + "github.com/rivo/tview" + ) + + func main() { + box := tview.NewBox().SetBorder(true).SetTitle("Hello, world!") + if err := tview.NewApplication().SetRoot(box, true).Run(); err != nil { + panic(err) + } + } + +First, we create a box primitive with a border and a title. Then we create an +application, set the box as its root primitive, and run the event loop. The +application exits when the application's [Application.Stop] function is called +or when Ctrl-C is pressed. + +# More Demos + +You will find more demos in the "demos" subdirectory. It also contains a +presentation (written using tview) which gives an overview of the different +widgets and how they can be used. + +# Styles, Colors, and Hyperlinks + +Throughout this package, styles are specified using the [tcell.Style] type. +Styles specify colors with the [tcell.Color] type. Functions such as +[tcell.GetColor], [tcell.NewHexColor], and [tcell.NewRGBColor] can be used to +create colors from W3C color names or RGB values. The [tcell.Style] type also +allows you to specify text attributes such as "bold" or "italic" or a URL +which some terminals use to display hyperlinks. + +Almost all strings which are displayed may contain style tags. A style tag's +content is always wrapped in square brackets. In its simplest form, a style tag +specifies the foreground color of the text. Colors in these tags are W3C color +names or six hexadecimal digits following a hash tag. Examples: + + This is a [red]warning[white]! + The sky is [#8080ff]blue[#ffffff]. + +A style tag changes the style of the characters following that style tag. There +is no style stack and no nesting of style tags. + +Style tags are used in almost everything from box titles, list text, form item +labels, to table cells. In a [TextView], this functionality has to be switched +on explicitly. See the [TextView] documentation for more information. + +A style tag's full format looks like this: + + [:::] + +Each of the four fields can be left blank and trailing fields can be omitted. +(Empty square brackets "[]", however, are not considered style tags.) Fields +that are not specified will be left unchanged. A field with just a dash ("-") +means "reset to default". + +You can specify the following flags to turn on certain attributes (some flags +may not be supported by your terminal): + + l: blink + b: bold + i: italic + d: dim + r: reverse (switch foreground and background color) + u: underline + s: strike-through + +Use uppercase letters to turn off the corresponding attribute, for example, +"B" to turn off bold. Uppercase letters have no effect if the attribute was not +previously set. + +Setting a URL allows you to turn a piece of text into a hyperlink in some +terminals. Specify a dash ("-") to specify the end of the hyperlink. Hyperlinks +must only contain single-byte characters (e.g. ASCII) and they may not contain +bracket characters ("[" or "]"). + +Examples: + + [yellow]Yellow text + [yellow:red]Yellow text on red background + [:red]Red background, text color unchanged + [yellow::u]Yellow text underlined + [::bl]Bold, blinking text + [::-]Colors unchanged, flags reset + [-]Reset foreground color + [::i]Italic and [::I]not italic + Click [:::https://example.com]here[:::-] for example.com. + Send an email to [:::mailto:her@example.com]her/[:::mail:him@example.com]him/[:::mail:them@example.com]them[:::-]. + [-:-:-:-]Reset everything + [:]No effect + []Not a valid style tag, will print square brackets as they are + +In the rare event that you want to display a string such as "[red]" or +"[#00ff1a]" without applying its effect, you need to put an opening square +bracket before the closing square bracket. Note that the text inside the +brackets will be matched less strictly than region or colors tags. I.e. any +character that may be used in color or region tags will be recognized. Examples: + + [red[] will be output as [red] + ["123"[] will be output as ["123"] + [#6aff00[[] will be output as [#6aff00[] + [a#"[[[] will be output as [a#"[[] + [] will be output as [] (see style tags above) + [[] will be output as [[] (not an escaped tag) + +You can use the Escape() function to insert brackets automatically where needed. + +# Styles + +When primitives are instantiated, they are initialized with colors taken from +the global [Styles] variable. You may change this variable to adapt the look and +feel of the primitives to your preferred style. + +Note that most terminals will not report information about their color theme. +This package therefore does not support using the terminal's color theme. The +default style is a dark theme and you must change the [Styles] variable to +switch to a light (or other) theme. + +# Unicode Support + +This package supports all unicode characters supported by your terminal. + +# Mouse Support + +If your terminal supports mouse events, you can enable mouse support for your +application by calling [Application.EnableMouse]. Note that this may interfere +with your terminal's default mouse behavior. Mouse support is disabled by +default. + +# Concurrency + +Many functions in this package are not thread-safe. For many applications, this +is not an issue: If your code makes changes in response to key events, the +corresponding callback function will execute in the main goroutine and thus will +not cause any race conditions. (Exceptions to this are documented.) + +If you access your primitives from other goroutines, however, you will need to +synchronize execution. The easiest way to do this is to call +[Application.QueueUpdate] or [Application.QueueUpdateDraw] (see the function +documentation for details): + + go func() { + app.QueueUpdateDraw(func() { + table.SetCellSimple(0, 0, "Foo bar") + }) + }() + +One exception to this is the io.Writer interface implemented by [TextView]. You +can safely write to a [TextView] from any goroutine. See the [TextView] +documentation for details. + +You can also call [Application.Draw] from any goroutine without having to wrap +it in [Application.QueueUpdate]. And, as mentioned above, key event callbacks +are executed in the main goroutine and thus should not use +[Application.QueueUpdate] as that may lead to deadlocks. It is also not +necessary to call [Application.Draw] from such callbacks as it will be called +automatically. + +# Type Hierarchy + +All widgets listed above contain the [Box] type. All of [Box]'s functions are +therefore available for all widgets, too. Please note that if you are using the +functions of [Box] on a subclass, they will return a *Box, not the subclass. +This is a Golang limitation. So while tview supports method chaining in many +places, these chains must be broken when using [Box]'s functions. Example: + + // This will cause "textArea" to be an empty Box. + textArea := tview.NewTextArea(). + SetMaxLength(256). + SetPlaceholder("Enter text here"). + SetBorder(true) + +You will need to call [Box.SetBorder] separately: + + textArea := tview.NewTextArea(). + SetMaxLength(256). + SetPlaceholder("Enter text here") + texArea.SetBorder(true) + +All widgets also implement the [Primitive] interface. + +The tview package's rendering is based on version 2 of +https://github.com/gdamore/tcell. It uses types and constants from that package +(e.g. colors, styles, and keyboard values). +*/ +package tview diff --git a/vendor/github.com/rivo/tview/dropdown.go b/vendor/github.com/rivo/tview/dropdown.go new file mode 100644 index 00000000..415bee79 --- /dev/null +++ b/vendor/github.com/rivo/tview/dropdown.go @@ -0,0 +1,741 @@ +package tview + +import ( + "regexp" + "strings" + + "github.com/gdamore/tcell/v2" +) + +// dropDownOption is one option that can be selected in a drop-down primitive. +type dropDownOption struct { + Text string // The text to be displayed in the drop-down. + Selected func() // The (optional) callback for when this option was selected. +} + +// DropDown implements a selection widget whose options become visible in a +// drop-down list when activated. +// +// See https://github.com/rivo/tview/wiki/DropDown for an example. +type DropDown struct { + *Box + + // Whether or not this drop-down is disabled/read-only. + disabled bool + + // The options from which the user can choose. + options []*dropDownOption + + // Strings to be placed before and after each drop-down option. + optionPrefix, optionSuffix string + + // The index of the currently selected option. Negative if no option is + // currently selected. + currentOption int + + // Strings to be placed before and after the current option. + currentOptionPrefix, currentOptionSuffix string + + // The text to be displayed when no option has yet been selected. + noSelection string + + // Set to true if the options are visible and selectable. + open bool + + // The input field containing the entered prefix for the current selection. + // This is only visible when the drop-down is open. It never receives focus, + // however. And it only receives events, we never call its Draw method. + prefix *InputField + + // The list element for the options. + list *List + + // The text to be displayed before the input area. + label string + + // The label style. + labelStyle tcell.Style + + // The field style. + fieldStyle tcell.Style + + // The style of the field when it is focused and the drop-down is closed. + focusedStyle tcell.Style + + // The style of the field when it is disabled. + disabledStyle tcell.Style + + // The style of the prefix. + prefixStyle tcell.Style + + // The screen width of the label area. A value of 0 means use the width of + // the label text. + labelWidth int + + // The screen width of the input area. A value of 0 means extend as much as + // possible. + fieldWidth int + + // An optional function which is called when the user indicated that they + // are done selecting options. The key which was pressed is provided (tab, + // shift-tab, or escape). + done func(tcell.Key) + + // A callback function set by the Form class and called when the user leaves + // this form item. + finished func(tcell.Key) + + // A callback function which is called when the user changes the drop-down's + // selection. + selected func(text string, index int) + + dragging bool // Set to true when mouse dragging is in progress. +} + +// NewDropDown returns a new drop-down. +func NewDropDown() *DropDown { + list := NewList() + list.ShowSecondaryText(false). + SetMainTextStyle(tcell.StyleDefault.Background(Styles.MoreContrastBackgroundColor).Foreground(Styles.PrimitiveBackgroundColor)). + SetSelectedStyle(tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.PrimitiveBackgroundColor)). + SetHighlightFullLine(true). + SetBackgroundColor(Styles.MoreContrastBackgroundColor) + + prefix := NewInputField() + + box := NewBox() + d := &DropDown{ + Box: box, + currentOption: -1, + list: list, + prefix: prefix, + labelStyle: tcell.StyleDefault.Foreground(Styles.SecondaryTextColor), + fieldStyle: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.PrimaryTextColor), + focusedStyle: tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.ContrastBackgroundColor), + disabledStyle: tcell.StyleDefault.Background(box.backgroundColor).Foreground(Styles.SecondaryTextColor), + prefixStyle: tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.ContrastBackgroundColor), + } + + return d +} + +// SetCurrentOption sets the index of the currently selected option. This may +// be a negative value to indicate that no option is currently selected. Calling +// this function will also trigger the "selected" callback (if there is one). +func (d *DropDown) SetCurrentOption(index int) *DropDown { + if index >= 0 && index < len(d.options) { + d.currentOption = index + d.list.SetCurrentItem(index) + if d.selected != nil { + d.selected(d.options[index].Text, index) + } + if d.options[index].Selected != nil { + d.options[index].Selected() + } + } else { + d.currentOption = -1 + d.list.SetCurrentItem(0) // Set to 0 because -1 means "last item". + if d.selected != nil { + d.selected("", -1) + } + } + return d +} + +// GetCurrentOption returns the index of the currently selected option as well +// as its text. If no option was selected, -1 and an empty string is returned. +func (d *DropDown) GetCurrentOption() (int, string) { + var text string + if d.currentOption >= 0 && d.currentOption < len(d.options) { + text = d.options[d.currentOption].Text + } + return d.currentOption, text +} + +// SetTextOptions sets the text to be placed before and after each drop-down +// option (prefix/suffix), the text placed before and after the currently +// selected option (currentPrefix/currentSuffix) as well as the text to be +// displayed when no option is currently selected. Per default, all of these +// strings are empty. +func (d *DropDown) SetTextOptions(prefix, suffix, currentPrefix, currentSuffix, noSelection string) *DropDown { + d.currentOptionPrefix = currentPrefix + d.currentOptionSuffix = currentSuffix + d.noSelection = noSelection + d.optionPrefix = prefix + d.optionSuffix = suffix + for index := 0; index < d.list.GetItemCount(); index++ { + d.list.SetItemText(index, prefix+d.options[index].Text+suffix, "") + } + return d +} + +// SetUseStyleTags sets a flag that determines whether tags found in the option +// texts are interpreted as tview tags. By default, this flag is enabled (for +// backwards compatibility reasons). +func (d *DropDown) SetUseStyleTags(useStyleTags bool) *DropDown { + d.list.SetUseStyleTags(useStyleTags, useStyleTags) + return d +} + +// SetLabel sets the text to be displayed before the input area. +func (d *DropDown) SetLabel(label string) *DropDown { + d.label = label + return d +} + +// GetLabel returns the text to be displayed before the input area. +func (d *DropDown) GetLabel() string { + return d.label +} + +// SetLabelWidth sets the screen width of the label. A value of 0 will cause the +// primitive to use the width of the label string. +func (d *DropDown) SetLabelWidth(width int) *DropDown { + d.labelWidth = width + return d +} + +// SetLabelColor sets the color of the label. +func (d *DropDown) SetLabelColor(color tcell.Color) *DropDown { + d.labelStyle = d.labelStyle.Foreground(color) + return d +} + +// SetLabelStyle sets the style of the label. +func (d *DropDown) SetLabelStyle(style tcell.Style) *DropDown { + d.labelStyle = style + return d +} + +// SetFieldBackgroundColor sets the background color of the selected field. +// This also overrides the prefix background color. +func (d *DropDown) SetFieldBackgroundColor(color tcell.Color) *DropDown { + d.fieldStyle = d.fieldStyle.Background(color) + d.prefix.SetFieldBackgroundColor(color) + return d +} + +// SetFieldTextColor sets the text color of the options area. +func (d *DropDown) SetFieldTextColor(color tcell.Color) *DropDown { + d.fieldStyle = d.fieldStyle.Foreground(color) + return d +} + +// SetFieldStyle sets the style of the options area. +func (d *DropDown) SetFieldStyle(style tcell.Style) *DropDown { + d.fieldStyle = style + return d +} + +// SetFocusedStyle sets the style of the options area when the drop-down is +// focused and closed. +func (d *DropDown) SetFocusedStyle(style tcell.Style) *DropDown { + d.focusedStyle = style + return d +} + +// SetDisabledStyle sets the style of the options area when the drop-down is +// disabled. +func (d *DropDown) SetDisabledStyle(style tcell.Style) *DropDown { + d.disabledStyle = style + return d +} + +// SetPrefixTextColor sets the color of the prefix string. The prefix string is +// shown when the user starts typing text, which directly selects the first +// option that starts with the typed string. +func (d *DropDown) SetPrefixTextColor(color tcell.Color) *DropDown { + d.prefixStyle = d.prefixStyle.Foreground(color) + return d +} + +// SetPrefixStyle sets the style of the prefix string. The prefix string is +// shown when the user starts typing text, which directly selects the first +// option that starts with the typed string. +func (d *DropDown) SetPrefixStyle(style tcell.Style) *DropDown { + d.prefixStyle = style + return d +} + +// SetListStyles sets the styles of the items in the drop-down list (unselected +// as well as selected items). Style attributes are currently ignored but may be +// used in the future. +func (d *DropDown) SetListStyles(unselected, selected tcell.Style) *DropDown { + d.list.SetMainTextStyle(unselected).SetSelectedStyle(selected) + _, bg, _ := unselected.Decompose() + d.list.SetBackgroundColor(bg) + return d +} + +// SetFormAttributes sets attributes shared by all form items. +func (d *DropDown) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) FormItem { + d.labelWidth = labelWidth + d.SetLabelColor(labelColor) + d.SetBackgroundColor(bgColor) + d.SetFieldStyle(tcell.StyleDefault.Foreground(fieldTextColor).Background(fieldBgColor)) + return d +} + +// SetFieldWidth sets the screen width of the options area. A value of 0 means +// extend to as long as the longest option text. +func (d *DropDown) SetFieldWidth(width int) *DropDown { + d.fieldWidth = width + return d +} + +// GetFieldWidth returns this primitive's field screen width. +func (d *DropDown) GetFieldWidth() int { + if d.fieldWidth > 0 { + return d.fieldWidth + } + fieldWidth := 0 + for _, option := range d.options { + width := TaggedStringWidth(option.Text) + if width > fieldWidth { + fieldWidth = width + } + } + return fieldWidth +} + +// GetFieldHeight returns this primitive's field height. +func (d *DropDown) GetFieldHeight() int { + return 1 +} + +// SetDisabled sets whether or not the item is disabled / read-only. +func (d *DropDown) SetDisabled(disabled bool) FormItem { + d.disabled = disabled + if d.finished != nil { + d.finished(-1) + } + return d +} + +// AddOption adds a new selectable option to this drop-down. The "selected" +// callback is called when this option was selected. It may be nil. +func (d *DropDown) AddOption(text string, selected func()) *DropDown { + d.options = append(d.options, &dropDownOption{Text: text, Selected: selected}) + d.list.AddItem(d.optionPrefix+text+d.optionSuffix, "", 0, nil) + return d +} + +// SetOptions replaces all current options with the ones provided and installs +// one callback function which is called when one of the options is selected. +// It will be called with the option's text and its index into the options +// slice. The "selected" parameter may be nil. +func (d *DropDown) SetOptions(texts []string, selected func(text string, index int)) *DropDown { + d.list.Clear() + d.options = nil + for _, text := range texts { + d.AddOption(text, nil) + } + d.selected = selected + return d +} + +// GetOptionCount returns the number of options in the drop-down. +func (d *DropDown) GetOptionCount() int { + return len(d.options) +} + +// RemoveOption removes the specified option from the drop-down. Panics if the +// index is out of range. If the currently selected option is removed, no option +// will be selected. +func (d *DropDown) RemoveOption(index int) *DropDown { + if index == d.currentOption { + d.currentOption = -1 + } + d.options = append(d.options[:index], d.options[index+1:]...) + d.list.RemoveItem(index) + return d +} + +// SetSelectedFunc sets a handler which is called when the user changes the +// drop-down's option. This handler will be called in addition and prior to +// an option's optional individual handler. The handler is provided with the +// selected option's text and index. If "no option" was selected, these values +// are an empty string and -1. +func (d *DropDown) SetSelectedFunc(handler func(text string, index int)) *DropDown { + d.selected = handler + return d +} + +// SetDoneFunc sets a handler which is called when the user is done selecting +// options. The callback function is provided with the key that was pressed, +// which is one of the following: +// +// - KeyEscape: Abort selection. +// - KeyTab: Move to the next field. +// - KeyBacktab: Move to the previous field. +func (d *DropDown) SetDoneFunc(handler func(key tcell.Key)) *DropDown { + d.done = handler + return d +} + +// SetFinishedFunc sets a callback invoked when the user leaves this form item. +func (d *DropDown) SetFinishedFunc(handler func(key tcell.Key)) FormItem { + d.finished = handler + return d +} + +// Draw draws this primitive onto the screen. +func (d *DropDown) Draw(screen tcell.Screen) { + d.Box.DrawForSubclass(screen, d) + + // Prepare. + x, y, width, height := d.GetInnerRect() + rightLimit := x + width + if height < 1 || rightLimit <= x { + return + } + useStyleTags, _ := d.list.GetUseStyleTags() + + // Draw label. + if d.labelWidth > 0 { + labelWidth := d.labelWidth + if labelWidth > rightLimit-x { + labelWidth = rightLimit - x + } + printWithStyle(screen, d.label, x, y, 0, labelWidth, AlignLeft, d.labelStyle, true) + x += labelWidth + } else { + _, _, drawnWidth := printWithStyle(screen, d.label, x, y, 0, rightLimit-x, AlignLeft, d.labelStyle, true) + x += drawnWidth + } + + // What's the longest option text? + maxWidth := 0 + for _, option := range d.options { + str := d.optionPrefix + option.Text + d.optionSuffix + if !useStyleTags { + str = Escape(str) + } + strWidth := TaggedStringWidth(str) + if strWidth > maxWidth { + maxWidth = strWidth + } + str = d.currentOptionPrefix + option.Text + d.currentOptionSuffix + if !useStyleTags { + str = Escape(str) + } + strWidth = TaggedStringWidth(str) + if strWidth > maxWidth { + maxWidth = strWidth + } + } + + // Draw selection area. + fieldWidth := d.fieldWidth + if fieldWidth == 0 { + fieldWidth = maxWidth + if d.currentOption < 0 { + noSelectionWidth := TaggedStringWidth(d.noSelection) + if noSelectionWidth > fieldWidth { + fieldWidth = noSelectionWidth + } + } else if d.currentOption < len(d.options) { + currentOptionWidth := TaggedStringWidth(d.currentOptionPrefix + d.options[d.currentOption].Text + d.currentOptionSuffix) + if currentOptionWidth > fieldWidth { + fieldWidth = currentOptionWidth + } + } + } + if rightLimit-x < fieldWidth { + fieldWidth = rightLimit - x + } + fieldStyle := d.fieldStyle + if d.disabled { + fieldStyle = d.disabledStyle + } else if d.HasFocus() && !d.open { + fieldStyle = d.focusedStyle + } + for index := 0; index < fieldWidth; index++ { + screen.SetContent(x+index, y, ' ', nil, fieldStyle) + } + + // Draw selected text. + prefix := Escape(d.prefix.GetText()) + if d.HasFocus() && d.open && len(prefix) > 0 { + // The drop-down is open and we have an input prefix. + // Draw current option prefix first. + currentOptionPrefix := d.currentOptionPrefix + currentOptionSuffix := d.currentOptionSuffix + if !useStyleTags { + currentOptionPrefix = Escape(currentOptionPrefix) + currentOptionSuffix = Escape(currentOptionSuffix) + } + _, _, copWidth := printWithStyle(screen, currentOptionPrefix, x, y, 0, fieldWidth, AlignLeft, d.fieldStyle, false) + if copWidth < fieldWidth { + // Then draw the prefix. + _, _, prefixWidth := printWithStyle(screen, prefix, x+copWidth, y, 0, fieldWidth-copWidth, AlignLeft, d.prefixStyle, false) + if copWidth+prefixWidth < fieldWidth { + // Then the current option remainder. + var corWidth int + currentItem := d.list.GetCurrentItem() + if currentItem >= 0 && currentItem < len(d.options) { + text := d.options[currentItem].Text + if !useStyleTags { + text = Escape(text) + } + _, _, corWidth = printWithStyle(screen, text, x+copWidth+prefixWidth, y, prefixWidth, fieldWidth-copWidth-prefixWidth, AlignLeft, d.fieldStyle, false) + } + if copWidth+prefixWidth+corWidth < fieldWidth { + // And finally the current option suffix. + printWithStyle(screen, currentOptionSuffix, x+copWidth+prefixWidth+corWidth, y, 0, fieldWidth-copWidth-prefixWidth-corWidth, AlignLeft, d.fieldStyle, false) + } + } + } + } else { + // The drop-down is closed. Just draw the selected option. + text := d.noSelection + if d.currentOption >= 0 && d.currentOption < len(d.options) { + text = d.currentOptionPrefix + d.options[d.currentOption].Text + d.currentOptionSuffix + } + if !useStyleTags { + text = Escape(text) + } + printWithStyle(screen, text, x, y, 0, fieldWidth, AlignLeft, fieldStyle, false) + } + + // Draw options list. + if d.HasFocus() && d.open { + lx := x + ly := y + 1 + lwidth := maxWidth + lheight := len(d.options) + swidth, sheight := screen.Size() + // We prefer to align the left sides of the list and the main widget, but + // if there is no space to the right, then shift the list to the left. + if lx+lwidth >= swidth { + lx = swidth - lwidth + if lx < 0 { + lx = 0 + } + } + // We prefer to drop down but if there is no space, maybe drop up? + if ly+lheight >= sheight && ly-2 > lheight-ly { + ly = y - lheight + if ly < 0 { + ly = 0 + } + } + if ly+lheight >= sheight { + lheight = sheight - ly + } + d.list.SetRect(lx, ly, lwidth, lheight) + d.list.Draw(screen) + } +} + +// InputHandler returns the handler for this primitive. +func (d *DropDown) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return d.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if d.disabled { + return + } + + // Process key event. + switch key := event.Key(); key { + case tcell.KeyDown, tcell.KeyUp, tcell.KeyHome, tcell.KeyEnd, tcell.KeyPgDn, tcell.KeyPgUp: + // Open the list and forward the event to it. + d.openList(setFocus) + if handler := d.list.InputHandler(); handler != nil { + handler(event, setFocus) + } + d.prefix.SetText("") + case tcell.KeyEnter: + // If the list is closed, open it. Otherwise, forward the event to + // it. + if !d.open { + d.openList(setFocus) + } else if handler := d.list.InputHandler(); handler != nil { + handler(event, setFocus) + } + case tcell.KeyEscape, tcell.KeyTab, tcell.KeyBacktab: + // Done selecting. + if d.done != nil { + d.done(key) + } + if d.finished != nil { + d.finished(key) + } + d.closeList(setFocus) + default: + // Pass other key events to the input field. + if handler := d.prefix.InputHandler(); handler != nil { + handler(event, setFocus) + } + d.evalPrefix() + d.openList(setFocus) + } + }) +} + +// evalPrefix selects an item in the drop-down list based on the current prefix. +func (d *DropDown) evalPrefix() { + prefix := strings.ToLower(d.prefix.GetText()) + if len(prefix) == 0 { + return + } + useStyleTags, _ := d.list.GetUseStyleTags() + for index, option := range d.options { + text := option.Text + if useStyleTags { + text = stripTags(text) + } + if strings.HasPrefix(strings.ToLower(text), prefix) { + d.list.SetCurrentItem(index) + return + } + } +} + +// openList hands control over to the embedded List primitive. +func (d *DropDown) openList(setFocus func(Primitive)) { + if d.open { + return + } + + d.open = true + + d.list.SetSelectedFunc(func(index int, mainText, secondaryText string, shortcut rune) { + if d.dragging { + return // If we're dragging the mouse, we don't want to trigger any events. + } + + // An option was selected. Close the list again. + d.currentOption = index + d.closeList(setFocus) + + // Clear the prefix input field. + d.prefix.SetText("") + + // Trigger "selected" event. + currentOption := d.options[d.currentOption] + if d.selected != nil { + d.selected(currentOption.Text, d.currentOption) + } + if currentOption.Selected != nil { + currentOption.Selected() + } + }).SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + switch key := event.Key(); key { + case tcell.KeyDown, tcell.KeyUp, tcell.KeyPgDn, tcell.KeyPgUp, tcell.KeyHome, tcell.KeyEnd, tcell.KeyEnter: // Basic list navigation. + break + case tcell.KeyEscape: // Abort selection. + d.closeList(setFocus) + return nil + default: // All other keys are passed to the input field. + if handler := d.prefix.InputHandler(); handler != nil { + handler(event, setFocus) + } + return nil + } + + return event + }) + + setFocus(d.list) +} + +// closeList closes the embedded List element by hiding it and removing focus +// from it. +func (d *DropDown) closeList(setFocus func(Primitive)) { + d.open = false + if d.list.HasFocus() { + setFocus(d) + } +} + +// IsOpen returns true if the drop-down list is currently open. +func (d *DropDown) IsOpen() bool { + return d.open +} + +// Focus is called by the application when the primitive receives focus. +func (d *DropDown) Focus(delegate func(p Primitive)) { + // If we're part of a form and this item is disabled, there's nothing the + // user can do here so we're finished. + if d.finished != nil && d.disabled { + d.finished(-1) + return + } + + if d.open { + delegate(d.list) + } else { + d.Box.Focus(delegate) + } +} + +// HasFocus returns whether or not this primitive has focus. +func (d *DropDown) HasFocus() bool { + if d.open { + return d.list.HasFocus() + } + return d.Box.HasFocus() +} + +// MouseHandler returns the mouse handler for this primitive. +func (d *DropDown) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return d.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if d.disabled { + return false, nil + } + + // Was the mouse event in the drop-down box itself (or on its label)? + x, y := event.Position() + inRect := d.InInnerRect(x, y) + if !d.open && !inRect { + return d.InRect(x, y), nil // No, and it's not expanded either. Ignore. + } + + // As long as the drop-down is open, we capture all mouse events. + if d.open { + capture = d + } + + switch action { + case MouseLeftDown: + consumed = d.open || inRect + capture = d + if !d.open { + d.openList(setFocus) + d.dragging = true + } else if consumed, _ := d.list.MouseHandler()(MouseLeftClick, event, setFocus); !consumed { + d.closeList(setFocus) // Close drop-down if clicked outside of it. + } + case MouseMove: + if d.dragging { + // We pretend it's a left click so we can see the selection during + // dragging. Because we don't act upon it, it's not a problem. + d.list.MouseHandler()(MouseLeftClick, event, setFocus) + consumed = true + } + case MouseLeftUp: + if d.dragging { + d.dragging = false + d.list.MouseHandler()(MouseLeftClick, event, setFocus) + consumed = true + } + } + + return + }) +} + +// PasteHandler returns the handler for this primitive. +func (d *DropDown) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return d.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + if !d.open || d.disabled { + return + } + + // Strip any newline characters (simple version). + pastedText = regexp.MustCompile(`\r?\n`).ReplaceAllString(pastedText, "") + + // Forward the pasted text to the input field. + d.prefix.PasteHandler()(pastedText, setFocus) + }) +} diff --git a/vendor/github.com/rivo/tview/flex.go b/vendor/github.com/rivo/tview/flex.go new file mode 100644 index 00000000..e8713eb2 --- /dev/null +++ b/vendor/github.com/rivo/tview/flex.go @@ -0,0 +1,275 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// Flex directions. +const ( + // One item per row. + FlexRow = 0 + // One item per column. + FlexColumn = 1 + // As defined in CSS, items distributed along a row. + FlexRowCSS = 1 + // As defined in CSS, items distributed within a column. + FlexColumnCSS = 0 +) + +// flexItem holds layout options for one item. +type flexItem struct { + Item Primitive // The item to be positioned. May be nil for an empty item. + FixedSize int // The item's fixed size which may not be changed, 0 if it has no fixed size. + Proportion int // The item's proportion. + Focus bool // Whether or not this item attracts the layout's focus. +} + +// Flex is a basic implementation of the Flexbox layout. The contained +// primitives are arranged horizontally or vertically. The way they are +// distributed along that dimension depends on their layout settings, which is +// either a fixed length or a proportional length. See AddItem() for details. +// +// See https://github.com/rivo/tview/wiki/Flex for an example. +type Flex struct { + *Box + + // The items to be positioned. + items []*flexItem + + // FlexRow or FlexColumn. + direction int + + // If set to true, Flex will use the entire screen as its available space + // instead its box dimensions. + fullScreen bool +} + +// NewFlex returns a new flexbox layout container with no primitives and its +// direction set to FlexColumn. To add primitives to this layout, see AddItem(). +// To change the direction, see SetDirection(). +// +// Note that Box, the superclass of Flex, will not clear its contents so that +// any nil flex items will leave their background unchanged. To clear a Flex's +// background before any items are drawn, set it to a box with the desired +// color: +// +// flex.Box = NewBox() +func NewFlex() *Flex { + f := &Flex{ + direction: FlexColumn, + } + f.Box = NewBox() + f.Box.dontClear = true + return f +} + +// SetDirection sets the direction in which the contained primitives are +// distributed. This can be either FlexColumn (default) or FlexRow. Note that +// these are the opposite of what you would expect coming from CSS. You may also +// use FlexColumnCSS or FlexRowCSS, to remain in line with the CSS definition. +func (f *Flex) SetDirection(direction int) *Flex { + f.direction = direction + return f +} + +// SetFullScreen sets the flag which, when true, causes the flex layout to use +// the entire screen space instead of whatever size it is currently assigned to. +func (f *Flex) SetFullScreen(fullScreen bool) *Flex { + f.fullScreen = fullScreen + return f +} + +// AddItem adds a new item to the container. The "fixedSize" argument is a width +// or height that may not be changed by the layout algorithm. A value of 0 means +// that its size is flexible and may be changed. The "proportion" argument +// defines the relative size of the item compared to other flexible-size items. +// For example, items with a proportion of 2 will be twice as large as items +// with a proportion of 1. The proportion must be at least 1 if fixedSize == 0 +// (ignored otherwise). +// +// If "focus" is set to true, the item will receive focus when the Flex +// primitive receives focus. If multiple items have the "focus" flag set to +// true, the first one will receive focus. +// +// You can provide a nil value for the primitive. This will still consume screen +// space but nothing will be drawn. +func (f *Flex) AddItem(item Primitive, fixedSize, proportion int, focus bool) *Flex { + f.items = append(f.items, &flexItem{Item: item, FixedSize: fixedSize, Proportion: proportion, Focus: focus}) + return f +} + +// RemoveItem removes all items for the given primitive from the container, +// keeping the order of the remaining items intact. +func (f *Flex) RemoveItem(p Primitive) *Flex { + for index := len(f.items) - 1; index >= 0; index-- { + if f.items[index].Item == p { + f.items = append(f.items[:index], f.items[index+1:]...) + } + } + return f +} + +// GetItemCount returns the number of items in this container. +func (f *Flex) GetItemCount() int { + return len(f.items) +} + +// GetItem returns the primitive at the given index, starting with 0 for the +// first primitive in this container. +// +// This function will panic for out of range indices. +func (f *Flex) GetItem(index int) Primitive { + return f.items[index].Item +} + +// Clear removes all items from the container. +func (f *Flex) Clear() *Flex { + f.items = nil + return f +} + +// ResizeItem sets a new size for the item(s) with the given primitive. If there +// are multiple Flex items with the same primitive, they will all receive the +// same size. For details regarding the size parameters, see AddItem(). +func (f *Flex) ResizeItem(p Primitive, fixedSize, proportion int) *Flex { + for _, item := range f.items { + if item.Item == p { + item.FixedSize = fixedSize + item.Proportion = proportion + } + } + return f +} + +// Draw draws this primitive onto the screen. +func (f *Flex) Draw(screen tcell.Screen) { + f.Box.DrawForSubclass(screen, f) + + // Calculate size and position of the items. + + // Do we use the entire screen? + if f.fullScreen { + width, height := screen.Size() + f.SetRect(0, 0, width, height) + } + + // How much space can we distribute? + x, y, width, height := f.GetInnerRect() + var proportionSum int + distSize := width + if f.direction == FlexRow { + distSize = height + } + for _, item := range f.items { + if item.FixedSize > 0 { + distSize -= item.FixedSize + } else { + proportionSum += item.Proportion + } + } + + // Calculate positions and draw items. + pos := x + if f.direction == FlexRow { + pos = y + } + for _, item := range f.items { + size := item.FixedSize + if size <= 0 { + if proportionSum > 0 { + size = distSize * item.Proportion / proportionSum + distSize -= size + proportionSum -= item.Proportion + } else { + size = 0 + } + } + if item.Item != nil { + if f.direction == FlexColumn { + item.Item.SetRect(pos, y, size, height) + } else { + item.Item.SetRect(x, pos, width, size) + } + } + pos += size + + if item.Item != nil { + if item.Item.HasFocus() { + defer item.Item.Draw(screen) + } else { + item.Item.Draw(screen) + } + } + } +} + +// Focus is called when this primitive receives focus. +func (f *Flex) Focus(delegate func(p Primitive)) { + for _, item := range f.items { + if item.Item != nil && item.Focus { + delegate(item.Item) + return + } + } + f.Box.Focus(delegate) +} + +// HasFocus returns whether or not this primitive has focus. +func (f *Flex) HasFocus() bool { + for _, item := range f.items { + if item.Item != nil && item.Item.HasFocus() { + return true + } + } + return f.Box.HasFocus() +} + +// MouseHandler returns the mouse handler for this primitive. +func (f *Flex) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return f.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if !f.InRect(event.Position()) { + return false, nil + } + + // Pass mouse events along to the first child item that takes it. + for _, item := range f.items { + if item.Item == nil { + continue + } + consumed, capture = item.Item.MouseHandler()(action, event, setFocus) + if consumed { + return + } + } + + return + }) +} + +// InputHandler returns the handler for this primitive. +func (f *Flex) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return f.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + for _, item := range f.items { + if item.Item != nil && item.Item.HasFocus() { + if handler := item.Item.InputHandler(); handler != nil { + handler(event, setFocus) + return + } + } + } + }) +} + +// PasteHandler returns the handler for this primitive. +func (f *Flex) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return f.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + for _, item := range f.items { + if item.Item != nil && item.Item.HasFocus() { + if handler := item.Item.PasteHandler(); handler != nil { + handler(pastedText, setFocus) + return + } + } + } + }) +} diff --git a/vendor/github.com/rivo/tview/form.go b/vendor/github.com/rivo/tview/form.go new file mode 100644 index 00000000..af46f532 --- /dev/null +++ b/vendor/github.com/rivo/tview/form.go @@ -0,0 +1,896 @@ +package tview + +import ( + "image" + + "github.com/gdamore/tcell/v2" +) + +var ( + // DefaultFormFieldWidth is the default field screen width of form elements + // whose field width is flexible (0). This is used in the Form class for + // horizontal layouts. + DefaultFormFieldWidth = 10 + + // DefaultFormFieldHeight is the default field height of multi-line form + // elements whose field height is flexible (0). + DefaultFormFieldHeight = 5 +) + +// FormItem is the interface all form items must implement to be able to be +// included in a form. +type FormItem interface { + Primitive + + // GetLabel returns the item's label text. + GetLabel() string + + // SetFormAttributes sets a number of item attributes at once. + SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) FormItem + + // GetFieldWidth returns the width of the form item's field (the area which + // is manipulated by the user) in number of screen cells. A value of 0 + // indicates the field width is flexible and may use as much space as + // required. + GetFieldWidth() int + + // GetFieldHeight returns the height of the form item's field (the area which + // is manipulated by the user). This value must be greater than 0. + GetFieldHeight() int + + // SetFinishedFunc sets the handler function for when the user finished + // entering data into the item. The handler may receive events for the + // Enter key (we're done), the Escape key (cancel input), the Tab key (move + // to next field), the Backtab key (move to previous field), or a negative + // value, indicating that the action for the last known key should be + // repeated. + SetFinishedFunc(handler func(key tcell.Key)) FormItem + + // SetDisabled sets whether or not the item is disabled / read-only. A form + // must have at least one item that is not disabled. + SetDisabled(disabled bool) FormItem +} + +// Form allows you to combine multiple one-line form elements into a vertical +// or horizontal layout. Form elements include types such as InputField or +// Checkbox. These elements can be optionally followed by one or more buttons +// for which you can define form-wide actions (e.g. Save, Clear, Cancel). +// +// See https://github.com/rivo/tview/wiki/Form for an example. +type Form struct { + *Box + + // The items of the form (one row per item). + items []FormItem + + // The buttons of the form. + buttons []*Button + + // If set to true, instead of position items and buttons from top to bottom, + // they are positioned from left to right. + horizontal bool + + // The alignment of the buttons. + buttonsAlign int + + // The number of empty cells between items. + itemPadding int + + // The index of the item or button which has focus. (Items are counted first, + // buttons are counted last.) This is only used when the form itself receives + // focus so that the last element that had focus keeps it. + focusedElement int + + // The label color. + labelColor tcell.Color + + // The style of the input area. + fieldStyle tcell.Style + + // The style of the buttons when they are not focused. + buttonStyle tcell.Style + + // The style of the buttons when they are focused. + buttonActivatedStyle tcell.Style + + // The style of the buttons when they are disabled. + buttonDisabledStyle tcell.Style + + // The last (valid) key that wsa sent to a "finished" handler or -1 if no + // such key is known yet. + lastFinishedKey tcell.Key + + // An optional function which is called when the user hits Escape. + cancel func() +} + +// NewForm returns a new form. +func NewForm() *Form { + box := NewBox().SetBorderPadding(1, 1, 1, 1) + + f := &Form{ + Box: box, + itemPadding: 1, + labelColor: Styles.SecondaryTextColor, + fieldStyle: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.PrimaryTextColor), + buttonStyle: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.PrimaryTextColor), + buttonActivatedStyle: tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.ContrastBackgroundColor), + buttonDisabledStyle: tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.ContrastSecondaryTextColor), + lastFinishedKey: tcell.KeyTab, // To skip over inactive elements at the beginning of the form. + } + + return f +} + +// SetItemPadding sets the number of empty rows between form items for vertical +// layouts and the number of empty cells between form items for horizontal +// layouts. +func (f *Form) SetItemPadding(padding int) *Form { + f.itemPadding = padding + return f +} + +// SetHorizontal sets the direction the form elements are laid out. If set to +// true, instead of positioning them from top to bottom (the default), they are +// positioned from left to right, moving into the next row if there is not +// enough space. +func (f *Form) SetHorizontal(horizontal bool) *Form { + f.horizontal = horizontal + return f +} + +// SetLabelColor sets the color of the labels. +func (f *Form) SetLabelColor(color tcell.Color) *Form { + f.labelColor = color + return f +} + +// SetFieldBackgroundColor sets the background color of the input areas. +func (f *Form) SetFieldBackgroundColor(color tcell.Color) *Form { + f.fieldStyle = f.fieldStyle.Background(color) + return f +} + +// SetFieldTextColor sets the text color of the input areas. +func (f *Form) SetFieldTextColor(color tcell.Color) *Form { + f.fieldStyle = f.fieldStyle.Foreground(color) + return f +} + +// SetFieldStyle sets the style of the input areas. Attributes are currently +// still ignored to maintain backwards compatibility. +func (f *Form) SetFieldStyle(style tcell.Style) *Form { + f.fieldStyle = style + return f +} + +// SetButtonsAlign sets how the buttons align horizontally, one of AlignLeft +// (the default), AlignCenter, and AlignRight. This is only +func (f *Form) SetButtonsAlign(align int) *Form { + f.buttonsAlign = align + return f +} + +// SetButtonBackgroundColor sets the background color of the buttons. This is +// also the text color of the buttons when they are focused. +func (f *Form) SetButtonBackgroundColor(color tcell.Color) *Form { + f.buttonStyle = f.buttonStyle.Background(color) + f.buttonActivatedStyle = f.buttonActivatedStyle.Foreground(color) + return f +} + +// SetButtonTextColor sets the color of the button texts. This is also the +// background of the buttons when they are focused. +func (f *Form) SetButtonTextColor(color tcell.Color) *Form { + f.buttonStyle = f.buttonStyle.Foreground(color) + f.buttonActivatedStyle = f.buttonActivatedStyle.Background(color) + return f +} + +// SetButtonStyle sets the style of the buttons when they are not focused. +func (f *Form) SetButtonStyle(style tcell.Style) *Form { + f.buttonStyle = style + return f +} + +// SetButtonActivatedStyle sets the style of the buttons when they are focused. +func (f *Form) SetButtonActivatedStyle(style tcell.Style) *Form { + f.buttonActivatedStyle = style + return f +} + +// SetButtonDisabledStyle sets the style of the buttons when they are disabled. +func (f *Form) SetButtonDisabledStyle(style tcell.Style) *Form { + f.buttonDisabledStyle = style + return f +} + +// SetFocus shifts the focus to the form element with the given index, counting +// non-button items first and buttons last. Note that this index is only used +// when the form itself receives focus. +func (f *Form) SetFocus(index int) *Form { + var current, future int + for itemIndex, item := range f.items { + if itemIndex == index { + future = itemIndex + } + if item.HasFocus() { + current = itemIndex + } + } + for buttonIndex, button := range f.buttons { + if buttonIndex+len(f.items) == index { + future = buttonIndex + len(f.items) + } + if button.HasFocus() { + current = buttonIndex + len(f.items) + } + } + var focus func(p Primitive) + focus = func(p Primitive) { + p.Focus(focus) + } + if current != future { + if current >= 0 && current < len(f.items) { + f.items[current].Blur() + } else if current >= len(f.items) && current < len(f.items)+len(f.buttons) { + f.buttons[current-len(f.items)].Blur() + } + if future >= 0 && future < len(f.items) { + focus(f.items[future]) + } else if future >= len(f.items) && future < len(f.items)+len(f.buttons) { + focus(f.buttons[future-len(f.items)]) + } + } + f.focusedElement = future + return f +} + +// AddTextArea adds a text area to the form. It has a label, an optional initial +// text, a size (width and height) referring to the actual input area (a +// fieldWidth of 0 extends it as far right as possible, a fieldHeight of 0 will +// cause it to be [DefaultFormFieldHeight]), and a maximum number of bytes of +// text allowed (0 means no limit). +// +// The optional callback function is invoked when the content of the text area +// has changed. Note that especially for larger texts, this is an expensive +// operation due to technical constraints of the [TextArea] primitive (every key +// stroke leads to a new reallocation of the entire text). +func (f *Form) AddTextArea(label, text string, fieldWidth, fieldHeight, maxLength int, changed func(text string)) *Form { + if fieldHeight == 0 { + fieldHeight = DefaultFormFieldHeight + } + textArea := NewTextArea(). + SetLabel(label). + SetSize(fieldHeight, fieldWidth). + SetMaxLength(maxLength) + if text != "" { + textArea.SetText(text, true) + } + if changed != nil { + textArea.SetChangedFunc(func() { + changed(textArea.GetText()) + }) + } + f.items = append(f.items, textArea) + return f +} + +// AddTextView adds a text view to the form. It has a label and text, a size +// (width and height) referring to the actual text element (a fieldWidth of 0 +// extends it as far right as possible, a fieldHeight of 0 will cause it to be +// [DefaultFormFieldHeight]), a flag to turn on/off dynamic colors, and a flag +// to turn on/off scrolling. If scrolling is turned off, the text view will not +// receive focus. +func (f *Form) AddTextView(label, text string, fieldWidth, fieldHeight int, dynamicColors, scrollable bool) *Form { + if fieldHeight == 0 { + fieldHeight = DefaultFormFieldHeight + } + textArea := NewTextView(). + SetLabel(label). + SetSize(fieldHeight, fieldWidth). + SetDynamicColors(dynamicColors). + SetScrollable(scrollable). + SetText(text) + f.items = append(f.items, textArea) + return f +} + +// AddInputField adds an input field to the form. It has a label, an optional +// initial value, a field width (a value of 0 extends it as far as possible), +// an optional accept function to validate the item's value (set to nil to +// accept any text), and an (optional) callback function which is invoked when +// the input field's text has changed. +func (f *Form) AddInputField(label, value string, fieldWidth int, accept func(textToCheck string, lastChar rune) bool, changed func(text string)) *Form { + f.items = append(f.items, NewInputField(). + SetLabel(label). + SetText(value). + SetFieldWidth(fieldWidth). + SetAcceptanceFunc(accept). + SetChangedFunc(changed)) + return f +} + +// AddPasswordField adds a password field to the form. This is similar to an +// input field except that the user's input not shown. Instead, a "mask" +// character is displayed. The password field has a label, an optional initial +// value, a field width (a value of 0 extends it as far as possible), and an +// (optional) callback function which is invoked when the input field's text has +// changed. +func (f *Form) AddPasswordField(label, value string, fieldWidth int, mask rune, changed func(text string)) *Form { + if mask == 0 { + mask = '*' + } + f.items = append(f.items, NewInputField(). + SetLabel(label). + SetText(value). + SetFieldWidth(fieldWidth). + SetMaskCharacter(mask). + SetChangedFunc(changed)) + return f +} + +// AddDropDown adds a drop-down element to the form. It has a label, options, +// and an (optional) callback function which is invoked when an option was +// selected. The initial option may be a negative value to indicate that no +// option is currently selected. +func (f *Form) AddDropDown(label string, options []string, initialOption int, selected func(option string, optionIndex int)) *Form { + f.items = append(f.items, NewDropDown(). + SetLabel(label). + SetOptions(options, selected). + SetCurrentOption(initialOption)) + return f +} + +// AddCheckbox adds a checkbox to the form. It has a label, an initial state, +// and an (optional) callback function which is invoked when the state of the +// checkbox was changed by the user. +func (f *Form) AddCheckbox(label string, checked bool, changed func(checked bool)) *Form { + f.items = append(f.items, NewCheckbox(). + SetLabel(label). + SetChecked(checked). + SetChangedFunc(changed)) + return f +} + +// AddImage adds an image to the form. It has a label and the image will fit in +// the specified width and height (its aspect ratio is preserved). See +// [Image.SetColors] for a description of the "colors" parameter. Images are not +// interactive and are skipped over in a form. The "width" value may be 0 +// (adjust dynamically) but "height" should generally be a positive value. +func (f *Form) AddImage(label string, image image.Image, width, height, colors int) *Form { + f.items = append(f.items, NewImage(). + SetLabel(label). + SetImage(image). + SetSize(height, width). + SetAlign(AlignTop, AlignLeft). + SetColors(colors)) + return f +} + +// AddButton adds a new button to the form. The "selected" function is called +// when the user selects this button. It may be nil. +func (f *Form) AddButton(label string, selected func()) *Form { + f.buttons = append(f.buttons, NewButton(label).SetSelectedFunc(selected)) + return f +} + +// GetButton returns the button at the specified 0-based index. Note that +// buttons have been specially prepared for this form and modifying some of +// their attributes may have unintended side effects. +func (f *Form) GetButton(index int) *Button { + return f.buttons[index] +} + +// RemoveButton removes the button at the specified position, starting with 0 +// for the button that was added first. +func (f *Form) RemoveButton(index int) *Form { + f.buttons = append(f.buttons[:index], f.buttons[index+1:]...) + return f +} + +// GetButtonCount returns the number of buttons in this form. +func (f *Form) GetButtonCount() int { + return len(f.buttons) +} + +// GetButtonIndex returns the index of the button with the given label, starting +// with 0 for the button that was added first. If no such label was found, -1 +// is returned. +func (f *Form) GetButtonIndex(label string) int { + for index, button := range f.buttons { + if button.GetLabel() == label { + return index + } + } + return -1 +} + +// Clear removes all input elements from the form, including the buttons if +// specified. +func (f *Form) Clear(includeButtons bool) *Form { + f.items = nil + if includeButtons { + f.ClearButtons() + } + f.focusedElement = 0 + return f +} + +// ClearButtons removes all buttons from the form. +func (f *Form) ClearButtons() *Form { + f.buttons = nil + return f +} + +// AddFormItem adds a new item to the form. This can be used to add your own +// objects to the form. Note, however, that the Form class will override some +// of its attributes to make it work in the form context. Specifically, these +// are: +// +// - The label width +// - The label color +// - The background color +// - The field text color +// - The field background color +func (f *Form) AddFormItem(item FormItem) *Form { + f.items = append(f.items, item) + return f +} + +// GetFormItemCount returns the number of items in the form (not including the +// buttons). +func (f *Form) GetFormItemCount() int { + return len(f.items) +} + +// GetFormItem returns the form item at the given position, starting with index +// 0. Elements are referenced in the order they were added. Buttons are not +// included. +func (f *Form) GetFormItem(index int) FormItem { + return f.items[index] +} + +// RemoveFormItem removes the form element at the given position, starting with +// index 0. Elements are referenced in the order they were added. Buttons are +// not included. +func (f *Form) RemoveFormItem(index int) *Form { + f.items = append(f.items[:index], f.items[index+1:]...) + return f +} + +// GetFormItemByLabel returns the first form element with the given label. If +// no such element is found, nil is returned. Buttons are not searched and will +// therefore not be returned. +func (f *Form) GetFormItemByLabel(label string) FormItem { + for _, item := range f.items { + if item.GetLabel() == label { + return item + } + } + return nil +} + +// GetFormItemIndex returns the index of the first form element with the given +// label. If no such element is found, -1 is returned. Buttons are not searched +// and will therefore not be returned. +func (f *Form) GetFormItemIndex(label string) int { + for index, item := range f.items { + if item.GetLabel() == label { + return index + } + } + return -1 +} + +// GetFocusedItemIndex returns the indices of the form element or button which +// currently has focus. If they don't, -1 is returned respectively. +func (f *Form) GetFocusedItemIndex() (formItem, button int) { + index := f.focusIndex() + if index < 0 { + return -1, -1 + } + if index < len(f.items) { + return index, -1 + } + return -1, index - len(f.items) +} + +// SetCancelFunc sets a handler which is called when the user hits the Escape +// key. +func (f *Form) SetCancelFunc(callback func()) *Form { + f.cancel = callback + return f +} + +// Draw draws this primitive onto the screen. +func (f *Form) Draw(screen tcell.Screen) { + f.Box.DrawForSubclass(screen, f) + + // Determine the actual item that has focus. + if index := f.focusIndex(); index >= 0 { + f.focusedElement = index + } + + // Determine the dimensions. + x, y, width, height := f.GetInnerRect() + topLimit := y + bottomLimit := y + height + rightLimit := x + width + startX := x + + // Find the longest label. + var maxLabelWidth int + for _, item := range f.items { + labelWidth := TaggedStringWidth(item.GetLabel()) + if labelWidth > maxLabelWidth { + maxLabelWidth = labelWidth + } + } + maxLabelWidth++ // Add one space. + + // Calculate positions of form items. + type position struct{ x, y, width, height int } + positions := make([]position, len(f.items)+len(f.buttons)) + var ( + focusedPosition position + lineHeight = 1 + ) + for index, item := range f.items { + // Calculate the space needed. + labelWidth := TaggedStringWidth(item.GetLabel()) + var itemWidth int + if f.horizontal { + fieldWidth := item.GetFieldWidth() + if fieldWidth <= 0 { + fieldWidth = DefaultFormFieldWidth + } + labelWidth++ + itemWidth = labelWidth + fieldWidth + } else { + // We want all fields to align vertically. + labelWidth = maxLabelWidth + itemWidth = width + } + itemHeight := item.GetFieldHeight() + if itemHeight <= 0 { + itemHeight = DefaultFormFieldHeight + } + + // Advance to next line if there is no space. + if f.horizontal && x+labelWidth+1 >= rightLimit { + x = startX + y += lineHeight + 1 + lineHeight = itemHeight + } + + // Update line height. + if itemHeight > lineHeight { + lineHeight = itemHeight + } + + // Adjust the item's attributes. + if x+itemWidth >= rightLimit { + itemWidth = rightLimit - x + } + fieldTextColor, fieldBackgroundColor, _ := f.fieldStyle.Decompose() + item.SetFormAttributes( + labelWidth, + f.labelColor, + f.backgroundColor, + fieldTextColor, + fieldBackgroundColor, + ) + + // Save position. + positions[index].x = x + positions[index].y = y + positions[index].width = itemWidth + positions[index].height = itemHeight + if item.HasFocus() { + focusedPosition = positions[index] + } + + // Advance to next item. + if f.horizontal { + x += itemWidth + f.itemPadding + } else { + y += itemHeight + f.itemPadding + } + } + + // How wide are the buttons? + buttonWidths := make([]int, len(f.buttons)) + buttonsWidth := 0 + for index, button := range f.buttons { + w := TaggedStringWidth(button.GetLabel()) + 4 + buttonWidths[index] = w + buttonsWidth += w + 1 + } + buttonsWidth-- + + // Where do we place them? + if !f.horizontal && x+buttonsWidth < rightLimit { + if f.buttonsAlign == AlignRight { + x = rightLimit - buttonsWidth + } else if f.buttonsAlign == AlignCenter { + x = (x + rightLimit - buttonsWidth) / 2 + } + + // In vertical layouts, buttons always appear after an empty line. + if f.itemPadding == 0 { + y++ + } + } + + // Calculate positions of buttons. + for index, button := range f.buttons { + space := rightLimit - x + buttonWidth := buttonWidths[index] + if f.horizontal { + if space < buttonWidth-4 { + x = startX + y += lineHeight + 1 + space = width + lineHeight = 1 + } + } else { + if space < 1 { + break // No space for this button anymore. + } + } + if buttonWidth > space { + buttonWidth = space + } + button.SetStyle(f.buttonStyle). + SetActivatedStyle(f.buttonActivatedStyle). + SetDisabledStyle(f.buttonDisabledStyle) + + buttonIndex := index + len(f.items) + positions[buttonIndex].x = x + positions[buttonIndex].y = y + positions[buttonIndex].width = buttonWidth + positions[buttonIndex].height = 1 + + if button.HasFocus() { + focusedPosition = positions[buttonIndex] + } + + x += buttonWidth + 1 + } + + // Determine vertical offset based on the position of the focused item. + var offset int + if focusedPosition.y+focusedPosition.height > bottomLimit { + offset = focusedPosition.y + focusedPosition.height - bottomLimit + if focusedPosition.y-offset < topLimit { + offset = focusedPosition.y - topLimit + } + } + + // Draw items. + for index, item := range f.items { + // Set position. + y := positions[index].y - offset + height := positions[index].height + item.SetRect(positions[index].x, y, positions[index].width, height) + + // Is this item visible? + if y+height <= topLimit || y >= bottomLimit { + continue + } + + // Draw items with focus last (in case of overlaps). + if item.HasFocus() { + defer item.Draw(screen) + } else { + item.Draw(screen) + } + } + + // Draw buttons. + for index, button := range f.buttons { + // Set position. + buttonIndex := index + len(f.items) + y := positions[buttonIndex].y - offset + height := positions[buttonIndex].height + button.SetRect(positions[buttonIndex].x, y, positions[buttonIndex].width, height) + + // Is this button visible? + if y+height <= topLimit || y >= bottomLimit { + continue + } + + // Draw button. + button.Draw(screen) + } +} + +// Focus is called by the application when the primitive receives focus. +func (f *Form) Focus(delegate func(p Primitive)) { + // Hand on the focus to one of our child elements. + if f.focusedElement < 0 || f.focusedElement >= len(f.items)+len(f.buttons) { + f.focusedElement = 0 + } + var handler func(key tcell.Key) + handler = func(key tcell.Key) { + if key >= 0 { + f.lastFinishedKey = key + } + switch key { + case tcell.KeyTab, tcell.KeyEnter: + f.focusedElement++ + f.Focus(delegate) + case tcell.KeyBacktab: + f.focusedElement-- + if f.focusedElement < 0 { + f.focusedElement = len(f.items) + len(f.buttons) - 1 + } + f.Focus(delegate) + case tcell.KeyEscape: + if f.cancel != nil { + f.cancel() + } else { + f.focusedElement = 0 + f.Focus(delegate) + } + default: + if key < 0 && f.lastFinishedKey >= 0 { + // Repeat the last action. + handler(f.lastFinishedKey) + } + } + } + + // Track whether a form item has focus. + var itemFocused bool + f.hasFocus = false + + // Set the handler and focus for all items and buttons. + for index, button := range f.buttons { + button.SetExitFunc(handler) + if f.focusedElement == index+len(f.items) { + if button.IsDisabled() { + f.focusedElement++ + if f.focusedElement >= len(f.items)+len(f.buttons) { + f.focusedElement = 0 + } + continue + } + + itemFocused = true + func(b *Button) { // Wrapping might not be necessary anymore in future Go versions. + defer delegate(b) + }(button) + } + } + for index, item := range f.items { + item.SetFinishedFunc(handler) + if f.focusedElement == index { + itemFocused = true + func(i FormItem) { // Wrapping might not be necessary anymore in future Go versions. + defer delegate(i) + }(item) + } + } + + // If no item was focused, focus the form itself. + if !itemFocused { + f.Box.Focus(delegate) + } +} + +// HasFocus returns whether or not this primitive has focus. +func (f *Form) HasFocus() bool { + if f.focusIndex() >= 0 { + return true + } + return f.Box.HasFocus() +} + +// focusIndex returns the index of the currently focused item, counting form +// items first, then buttons. A negative value indicates that no containeed item +// has focus. +func (f *Form) focusIndex() int { + for index, item := range f.items { + if item.HasFocus() { + return index + } + } + for index, button := range f.buttons { + if button.HasFocus() { + return len(f.items) + index + } + } + return -1 +} + +// MouseHandler returns the mouse handler for this primitive. +func (f *Form) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return f.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + // At the end, update f.focusedElement and prepare current item/button. + defer func() { + if consumed { + index := f.focusIndex() + if index >= 0 { + f.focusedElement = index + } + } + }() + + // Determine items to pass mouse events to. + for _, item := range f.items { + // Exclude TextView items from mouse-down events as they are + // read-only items and thus should not be focused. + if _, ok := item.(*TextView); ok && action == MouseLeftDown { + continue + } + + consumed, capture = item.MouseHandler()(action, event, setFocus) + if consumed { + return + } + } + for _, button := range f.buttons { + consumed, capture = button.MouseHandler()(action, event, setFocus) + if consumed { + return + } + } + + // A mouse down anywhere else will return the focus to the last selected + // element. + if action == MouseLeftDown && f.InRect(event.Position()) { + f.Focus(setFocus) + consumed = true + } + + return + }) +} + +// InputHandler returns the handler for this primitive. +func (f *Form) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return f.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + for _, item := range f.items { + if item != nil && item.HasFocus() { + if handler := item.InputHandler(); handler != nil { + handler(event, setFocus) + return + } + } + } + + for _, button := range f.buttons { + if button.HasFocus() { + if handler := button.InputHandler(); handler != nil { + handler(event, setFocus) + return + } + } + } + }) +} + +// PasteHandler returns the handler for this primitive. +func (f *Form) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return f.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + for _, item := range f.items { + if item != nil && item.HasFocus() { + if handler := item.PasteHandler(); handler != nil { + handler(pastedText, setFocus) + return + } + } + } + + for _, button := range f.buttons { + if button.HasFocus() { + if handler := button.PasteHandler(); handler != nil { + handler(pastedText, setFocus) + return + } + } + } + }) +} diff --git a/vendor/github.com/rivo/tview/frame.go b/vendor/github.com/rivo/tview/frame.go new file mode 100644 index 00000000..fe2160e3 --- /dev/null +++ b/vendor/github.com/rivo/tview/frame.go @@ -0,0 +1,235 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// frameText holds information about a line of text shown in the frame. +type frameText struct { + Text string // The text to be displayed. + Header bool // true = place in header, false = place in footer. + Align int // One of the Align constants. + Color tcell.Color // The text color. +} + +// Frame is a wrapper which adds space around another primitive. In addition, +// the top area (header) and the bottom area (footer) may also contain text. +// +// See https://github.com/rivo/tview/wiki/Frame for an example. +type Frame struct { + *Box + + // The contained primitive. May be nil. + primitive Primitive + + // The lines of text to be displayed. + text []*frameText + + // Border spacing. + top, bottom, header, footer, left, right int + + // Keep a reference in case we need it when we change the primitive. + setFocus func(p Primitive) +} + +// NewFrame returns a new frame around the given primitive. The primitive's +// size will be changed to fit within this frame. The primitive may be nil, in +// which case no other primitive is embedded in the frame. +func NewFrame(primitive Primitive) *Frame { + box := NewBox() + + f := &Frame{ + Box: box, + primitive: primitive, + top: 1, + bottom: 1, + header: 1, + footer: 1, + left: 1, + right: 1, + } + + return f +} + +// SetPrimitive replaces the contained primitive with the given one. To remove +// a primitive, set it to nil. +func (f *Frame) SetPrimitive(p Primitive) *Frame { + var hasFocus bool + if f.primitive != nil { + hasFocus = f.primitive.HasFocus() + } + f.primitive = p + if hasFocus && f.setFocus != nil { + f.setFocus(p) // Restore focus. + } + return f +} + +// GetPrimitive returns the primitive contained in this frame. +func (f *Frame) GetPrimitive() Primitive { + return f.primitive +} + +// AddText adds text to the frame. Set "header" to true if the text is to appear +// in the header, above the contained primitive. Set it to false for it to +// appear in the footer, below the contained primitive. "align" must be one of +// the Align constants. Rows in the header are printed top to bottom, rows in +// the footer are printed bottom to top. Note that long text can overlap as +// different alignments will be placed on the same row. +func (f *Frame) AddText(text string, header bool, align int, color tcell.Color) *Frame { + f.text = append(f.text, &frameText{ + Text: text, + Header: header, + Align: align, + Color: color, + }) + return f +} + +// Clear removes all text from the frame. +func (f *Frame) Clear() *Frame { + f.text = nil + return f +} + +// SetBorders sets the width of the frame borders as well as "header" and +// "footer", the vertical space between the header and footer text and the +// contained primitive (does not apply if there is no text). +func (f *Frame) SetBorders(top, bottom, header, footer, left, right int) *Frame { + f.top, f.bottom, f.header, f.footer, f.left, f.right = top, bottom, header, footer, left, right + return f +} + +// Draw draws this primitive onto the screen. +func (f *Frame) Draw(screen tcell.Screen) { + f.Box.DrawForSubclass(screen, f) + + // Calculate start positions. + x, top, width, height := f.GetInnerRect() + bottom := top + height - 1 + x += f.left + top += f.top + bottom -= f.bottom + width -= f.left + f.right + if width <= 0 || top >= bottom { + return // No space left. + } + + // Draw text. + var rows [6]int // top-left, top-center, top-right, bottom-left, bottom-center, bottom-right. + topMax := top + bottomMin := bottom + for _, text := range f.text { + // Where do we place this text? + var y int + if text.Header { + y = top + rows[text.Align] + rows[text.Align]++ + if y >= bottomMin { + continue + } + if y+1 > topMax { + topMax = y + 1 + } + } else { + y = bottom - rows[3+text.Align] + rows[3+text.Align]++ + if y <= topMax { + continue + } + if y-1 < bottomMin { + bottomMin = y - 1 + } + } + + // Draw text. + Print(screen, text.Text, x, y, width, text.Align, text.Color) + } + + // Set the size of the contained primitive. + if f.primitive != nil { + if topMax > top { + top = topMax + f.header + } + if bottomMin < bottom { + bottom = bottomMin - f.footer + } + if top > bottom { + return // No space for the primitive. + } + f.primitive.SetRect(x, top, width, bottom+1-top) + + // Finally, draw the contained primitive. + f.primitive.Draw(screen) + } +} + +// Focus is called when this primitive receives focus. +func (f *Frame) Focus(delegate func(p Primitive)) { + f.setFocus = delegate + if f.primitive != nil { + delegate(f.primitive) + } else { + f.Box.Focus(delegate) + } +} + +// HasFocus returns whether or not this primitive has focus. +func (f *Frame) HasFocus() bool { + if f.primitive == nil { + return f.Box.HasFocus() + } + return f.primitive.HasFocus() +} + +// MouseHandler returns the mouse handler for this primitive. +func (f *Frame) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return f.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if !f.InRect(event.Position()) { + return false, nil + } + + // Pass mouse events on to contained primitive. + if f.primitive != nil { + consumed, capture = f.primitive.MouseHandler()(action, event, setFocus) + if consumed { + return true, capture + } + } + + // Clicking on the frame parts. + if action == MouseLeftDown { + setFocus(f) + consumed = true + } + + return + }) +} + +// InputHandler returns the handler for this primitive. +func (f *Frame) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return f.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if f.primitive == nil { + return + } + if handler := f.primitive.InputHandler(); handler != nil { + handler(event, setFocus) + return + } + }) +} + +// PasteHandler returns the handler for this primitive. +func (f *Frame) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return f.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + if f.primitive == nil { + return + } + if handler := f.primitive.PasteHandler(); handler != nil { + handler(pastedText, setFocus) + return + } + }) +} diff --git a/vendor/github.com/rivo/tview/grid.go b/vendor/github.com/rivo/tview/grid.go new file mode 100644 index 00000000..d7028bfa --- /dev/null +++ b/vendor/github.com/rivo/tview/grid.go @@ -0,0 +1,717 @@ +package tview + +import ( + "math" + + "github.com/gdamore/tcell/v2" +) + +// gridItem represents one primitive and its possible position on a grid. +type gridItem struct { + Item Primitive // The item to be positioned. May be nil for an empty item. + Row, Column int // The top-left grid cell where the item is placed. + Width, Height int // The number of rows and columns the item occupies. + MinGridWidth, MinGridHeight int // The minimum grid width/height for which this item is visible. + Focus bool // Whether or not this item attracts the layout's focus. + + visible bool // Whether or not this item was visible the last time the grid was drawn. + x, y, w, h int // The last position of the item relative to the top-left corner of the grid. Undefined if visible is false. +} + +// Grid is an implementation of a grid-based layout. It works by defining the +// size of the rows and columns, then placing primitives into the grid. +// +// Some settings can lead to the grid exceeding its available space. SetOffset() +// can then be used to scroll in steps of rows and columns. These offset values +// can also be controlled with the arrow keys (or the "g","G", "j", "k", "h", +// and "l" keys) while the grid has focus and none of its contained primitives +// do. +// +// See https://github.com/rivo/tview/wiki/Grid for an example. +type Grid struct { + *Box + + // The items to be positioned. + items []*gridItem + + // The definition of the rows and columns of the grid. See + // [Grid.SetRows] / [Grid.SetColumns] for details. + rows, columns []int + + // The minimum sizes for rows and columns. + minWidth, minHeight int + + // The size of the gaps between neighboring primitives. This is automatically + // set to 1 if borders is true. + gapRows, gapColumns int + + // The number of rows and columns skipped before drawing the top-left corner + // of the grid. + rowOffset, columnOffset int + + // Whether or not borders are drawn around grid items. If this is set to true, + // a gap size of 1 is automatically assumed (which is filled with the border + // graphics). + borders bool + + // The color of the borders around grid items. + bordersColor tcell.Color +} + +// NewGrid returns a new grid-based layout container with no initial primitives. +// +// Note that Box, the superclass of Grid, will be transparent so that any grid +// areas not covered by any primitives will leave their background unchanged. To +// clear a Grid's background before any items are drawn, reset its Box to one +// with the desired color: +// +// grid.Box = NewBox() +func NewGrid() *Grid { + g := &Grid{ + bordersColor: Styles.GraphicsColor, + } + g.Box = NewBox() + g.Box.dontClear = true + return g +} + +// SetColumns defines how the columns of the grid are distributed. Each value +// defines the size of one column, starting with the leftmost column. Values +// greater than 0 represent absolute column widths (gaps not included). Values +// less than or equal to 0 represent proportional column widths or fractions of +// the remaining free space, where 0 is treated the same as -1. That is, a +// column with a value of -3 will have three times the width of a column with a +// value of -1 (or 0). The minimum width set with SetMinSize() is always +// observed. +// +// Primitives may extend beyond the columns defined explicitly with this +// function. A value of 0 is assumed for any undefined column. In fact, if you +// never call this function, all columns occupied by primitives will have the +// same width. On the other hand, unoccupied columns defined with this function +// will always take their place. +// +// Assuming a total width of the grid of 100 cells and a minimum width of 0, the +// following call will result in columns with widths of 30, 10, 15, 15, and 30 +// cells: +// +// grid.SetColumns(30, 10, -1, -1, -2) +// +// If a primitive were then placed in the 6th and 7th column, the resulting +// widths would be: 30, 10, 10, 10, 20, 10, and 10 cells. +// +// If you then called SetMinSize() as follows: +// +// grid.SetMinSize(15, 20) +// +// The resulting widths would be: 30, 15, 15, 15, 20, 15, and 15 cells, a total +// of 125 cells, 25 cells wider than the available grid width. +func (g *Grid) SetColumns(columns ...int) *Grid { + g.columns = columns + return g +} + +// SetRows defines how the rows of the grid are distributed. These values behave +// the same as the column values provided with [Grid.SetColumns], see there +// for a definition and examples. +// +// The provided values correspond to row heights, the first value defining +// the height of the topmost row. +func (g *Grid) SetRows(rows ...int) *Grid { + g.rows = rows + return g +} + +// SetSize is a shortcut for [Grid.SetRows] and [Grid.SetColumns] where +// all row and column values are set to the given size values. See +// [Grid.SetColumns] for details on sizes. +func (g *Grid) SetSize(numRows, numColumns, rowSize, columnSize int) *Grid { + g.rows = make([]int, numRows) + for index := range g.rows { + g.rows[index] = rowSize + } + g.columns = make([]int, numColumns) + for index := range g.columns { + g.columns[index] = columnSize + } + return g +} + +// SetMinSize sets an absolute minimum width for rows and an absolute minimum +// height for columns. Panics if negative values are provided. +func (g *Grid) SetMinSize(row, column int) *Grid { + if row < 0 || column < 0 { + panic("Invalid minimum row/column size") + } + g.minHeight, g.minWidth = row, column + return g +} + +// SetGap sets the size of the gaps between neighboring primitives on the grid. +// If borders are drawn (see SetBorders()), these values are ignored and a gap +// of 1 is assumed. Panics if negative values are provided. +func (g *Grid) SetGap(row, column int) *Grid { + if row < 0 || column < 0 { + panic("Invalid gap size") + } + g.gapRows, g.gapColumns = row, column + return g +} + +// SetBorders sets whether or not borders are drawn around grid items. Setting +// this value to true will cause the gap values (see SetGap()) to be ignored and +// automatically assumed to be 1 where the border graphics are drawn. +func (g *Grid) SetBorders(borders bool) *Grid { + g.borders = borders + return g +} + +// SetBordersColor sets the color of the item borders. +func (g *Grid) SetBordersColor(color tcell.Color) *Grid { + g.bordersColor = color + return g +} + +// AddItem adds a primitive and its position to the grid. The top-left corner +// of the primitive will be located in the top-left corner of the grid cell at +// the given row and column and will span "rowSpan" rows and "colSpan" columns. +// For example, for a primitive to occupy rows 2, 3, and 4 and columns 5 and 6: +// +// grid.AddItem(p, 2, 5, 3, 2, 0, 0, true) +// +// If rowSpan or colSpan is 0, the primitive will not be drawn. +// +// You can add the same primitive multiple times with different grid positions. +// The minGridWidth and minGridHeight values will then determine which of those +// positions will be used. This is similar to CSS media queries. These minimum +// values refer to the overall size of the grid. If multiple items for the same +// primitive apply, the one with the highest minimum value (width or height, +// whatever is higher) will be used, or the primitive added last if those values +// are the same. Example: +// +// grid.AddItem(p, 0, 0, 0, 0, 0, 0, true). // Hide in small grids. +// AddItem(p, 0, 0, 1, 2, 100, 0, true). // One-column layout for medium grids. +// AddItem(p, 1, 1, 3, 2, 300, 0, true) // Multi-column layout for large grids. +// +// To use the same grid layout for all sizes, simply set minGridWidth and +// minGridHeight to 0. +// +// If the item's focus is set to true, it will receive focus when the grid +// receives focus. If there are multiple items with a true focus flag, the last +// visible one that was added will receive focus. +func (g *Grid) AddItem(p Primitive, row, column, rowSpan, colSpan, minGridHeight, minGridWidth int, focus bool) *Grid { + g.items = append(g.items, &gridItem{ + Item: p, + Row: row, + Column: column, + Height: rowSpan, + Width: colSpan, + MinGridHeight: minGridHeight, + MinGridWidth: minGridWidth, + Focus: focus, + }) + return g +} + +// RemoveItem removes all items for the given primitive from the grid, keeping +// the order of the remaining items intact. +func (g *Grid) RemoveItem(p Primitive) *Grid { + for index := len(g.items) - 1; index >= 0; index-- { + if g.items[index].Item == p { + g.items = append(g.items[:index], g.items[index+1:]...) + } + } + return g +} + +// Clear removes all items from the grid. +func (g *Grid) Clear() *Grid { + g.items = nil + return g +} + +// SetOffset sets the number of rows and columns which are skipped before +// drawing the first grid cell in the top-left corner. As the grid will never +// completely move off the screen, these values may be adjusted the next time +// the grid is drawn. The actual position of the grid may also be adjusted such +// that contained primitives that have focus remain visible. +func (g *Grid) SetOffset(rows, columns int) *Grid { + g.rowOffset, g.columnOffset = rows, columns + return g +} + +// GetOffset returns the current row and column offset (see SetOffset() for +// details). +func (g *Grid) GetOffset() (rows, columns int) { + return g.rowOffset, g.columnOffset +} + +// Focus is called when this primitive receives focus. +func (g *Grid) Focus(delegate func(p Primitive)) { + for _, item := range g.items { + if item.Focus { + delegate(item.Item) + return + } + } + g.Box.Focus(delegate) +} + +// HasFocus returns whether or not this primitive has focus. +func (g *Grid) HasFocus() bool { + for _, item := range g.items { + if item.visible && item.Item.HasFocus() { + return true + } + } + return g.Box.HasFocus() +} + +// Draw draws this primitive onto the screen. +func (g *Grid) Draw(screen tcell.Screen) { + g.Box.DrawForSubclass(screen, g) + x, y, width, height := g.GetInnerRect() + screenWidth, screenHeight := screen.Size() + + // Make a list of items which apply. + items := make([]*gridItem, 0, len(g.items)) +ItemLoop: + for _, item := range g.items { + item.visible = false + if item.Item == nil || item.Width <= 0 || item.Height <= 0 || width < item.MinGridWidth || height < item.MinGridHeight { + continue // Disqualified. + } + + // Check for overlaps and multiple layouts of the same item. + for index, existing := range items { + // Do they overlap or are identical? + if item.Item != existing.Item && + (item.Row >= existing.Row+existing.Height || item.Row+item.Height <= existing.Row || + item.Column >= existing.Column+existing.Width || item.Column+item.Width <= existing.Column) { + continue // They don't and aren't. + } + + // What's their minimum size? + itemMin := item.MinGridWidth + if item.MinGridHeight > itemMin { + itemMin = item.MinGridHeight + } + existingMin := existing.MinGridWidth + if existing.MinGridHeight > existingMin { + existingMin = existing.MinGridHeight + } + + // Which one is more important? + if itemMin < existingMin { + continue ItemLoop // This one isn't. Drop it. + } + items[index] = item // This one is. Replace the other. + continue ItemLoop + } + + // This item will be visible. + items = append(items, item) + } + + // How many rows and columns do we have? + rows := len(g.rows) + columns := len(g.columns) + for _, item := range items { + rowEnd := item.Row + item.Height + if rowEnd > rows { + rows = rowEnd + } + columnEnd := item.Column + item.Width + if columnEnd > columns { + columns = columnEnd + } + } + if rows == 0 || columns == 0 { + return // No content. + } + + // Where are they located? + rowPos := make([]int, rows) + rowHeight := make([]int, rows) + columnPos := make([]int, columns) + columnWidth := make([]int, columns) + + // How much space do we distribute? + remainingWidth := width + remainingHeight := height + proportionalWidth := 0 + proportionalHeight := 0 + for index, row := range g.rows { + if row > 0 { + if row < g.minHeight { + row = g.minHeight + } + remainingHeight -= row + rowHeight[index] = row + } else if row == 0 { + proportionalHeight++ + } else { + proportionalHeight += -row + } + } + for index, column := range g.columns { + if column > 0 { + if column < g.minWidth { + column = g.minWidth + } + remainingWidth -= column + columnWidth[index] = column + } else if column == 0 { + proportionalWidth++ + } else { + proportionalWidth += -column + } + } + if g.borders { + remainingHeight -= rows + 1 + remainingWidth -= columns + 1 + } else { + remainingHeight -= (rows - 1) * g.gapRows + remainingWidth -= (columns - 1) * g.gapColumns + } + if rows > len(g.rows) { + proportionalHeight += rows - len(g.rows) + } + if columns > len(g.columns) { + proportionalWidth += columns - len(g.columns) + } + + // Distribute proportional rows/columns. + for index := 0; index < rows; index++ { + row := 0 + if index < len(g.rows) { + row = g.rows[index] + } + if row > 0 { + continue // Not proportional. We already know the width. + } else if row == 0 { + row = 1 + } else { + row = -row + } + rowAbs := row * remainingHeight / proportionalHeight + remainingHeight -= rowAbs + proportionalHeight -= row + if rowAbs < g.minHeight { + rowAbs = g.minHeight + } + rowHeight[index] = rowAbs + } + for index := 0; index < columns; index++ { + column := 0 + if index < len(g.columns) { + column = g.columns[index] + } + if column > 0 { + continue // Not proportional. We already know the height. + } else if column == 0 { + column = 1 + } else { + column = -column + } + columnAbs := column * remainingWidth / proportionalWidth + remainingWidth -= columnAbs + proportionalWidth -= column + if columnAbs < g.minWidth { + columnAbs = g.minWidth + } + columnWidth[index] = columnAbs + } + + // Calculate row/column positions. + var columnX, rowY int + if g.borders { + columnX++ + rowY++ + } + for index, row := range rowHeight { + rowPos[index] = rowY + gap := g.gapRows + if g.borders { + gap = 1 + } + rowY += row + gap + } + for index, column := range columnWidth { + columnPos[index] = columnX + gap := g.gapColumns + if g.borders { + gap = 1 + } + columnX += column + gap + } + + // Calculate primitive positions. + var focus *gridItem // The item which has focus. + for _, item := range items { + px := columnPos[item.Column] + py := rowPos[item.Row] + var pw, ph int + for index := 0; index < item.Height; index++ { + ph += rowHeight[item.Row+index] + } + for index := 0; index < item.Width; index++ { + pw += columnWidth[item.Column+index] + } + if g.borders { + pw += item.Width - 1 + ph += item.Height - 1 + } else { + pw += (item.Width - 1) * g.gapColumns + ph += (item.Height - 1) * g.gapRows + } + item.x, item.y, item.w, item.h = px, py, pw, ph + item.visible = true + if item.Item.HasFocus() { + focus = item + } + } + + // Calculate screen offsets. + var offsetX, offsetY int + add := 1 + if !g.borders { + add = g.gapRows + } + for index, height := range rowHeight { + if index >= g.rowOffset { + break + } + offsetY += height + add + } + if !g.borders { + add = g.gapColumns + } + for index, width := range columnWidth { + if index >= g.columnOffset { + break + } + offsetX += width + add + } + + // The focused item must be within the visible area. + if focus != nil { + if focus.y+focus.h-offsetY >= height { + offsetY = focus.y - height + focus.h + } + if focus.y-offsetY < 0 { + offsetY = focus.y + } + if focus.x+focus.w-offsetX >= width { + offsetX = focus.x - width + focus.w + } + if focus.x-offsetX < 0 { + offsetX = focus.x + } + } + + // Adjust row/column offsets based on this value. + var from, to int + for index, pos := range rowPos { + if pos-offsetY < 0 { + from = index + 1 + } + if pos-offsetY < height { + to = index + } + } + if g.rowOffset < from { + g.rowOffset = from + } + if g.rowOffset > to { + g.rowOffset = to + } + from, to = 0, 0 + for index, pos := range columnPos { + if pos-offsetX < 0 { + from = index + 1 + } + if pos-offsetX < width { + to = index + } + } + if g.columnOffset < from { + g.columnOffset = from + } + if g.columnOffset > to { + g.columnOffset = to + } + + // Draw primitives and borders. + borderStyle := tcell.StyleDefault.Background(g.backgroundColor).Foreground(g.bordersColor) + for _, item := range items { + // Final primitive position. + if !item.visible { + continue + } + item.x -= offsetX + item.y -= offsetY + if item.x >= width || item.x+item.w <= 0 || item.y >= height || item.y+item.h <= 0 { + item.visible = false + continue + } + if item.x+item.w > width { + item.w = width - item.x + } + if item.y+item.h > height { + item.h = height - item.y + } + if item.x < 0 { + item.w += item.x + item.x = 0 + } + if item.y < 0 { + item.h += item.y + item.y = 0 + } + if item.w <= 0 || item.h <= 0 { + item.visible = false + continue + } + item.x += x + item.y += y + item.Item.SetRect(item.x, item.y, item.w, item.h) + + // Draw primitive. + if item == focus { + defer item.Item.Draw(screen) + } else { + item.Item.Draw(screen) + } + + // Draw border around primitive. + if g.borders { + for bx := item.x; bx < item.x+item.w; bx++ { // Top/bottom lines. + if bx < 0 || bx >= screenWidth { + continue + } + by := item.y - 1 + if by >= 0 && by < screenHeight { + PrintJoinedSemigraphics(screen, bx, by, Borders.Horizontal, borderStyle) + } + by = item.y + item.h + if by >= 0 && by < screenHeight { + PrintJoinedSemigraphics(screen, bx, by, Borders.Horizontal, borderStyle) + } + } + for by := item.y; by < item.y+item.h; by++ { // Left/right lines. + if by < 0 || by >= screenHeight { + continue + } + bx := item.x - 1 + if bx >= 0 && bx < screenWidth { + PrintJoinedSemigraphics(screen, bx, by, Borders.Vertical, borderStyle) + } + bx = item.x + item.w + if bx >= 0 && bx < screenWidth { + PrintJoinedSemigraphics(screen, bx, by, Borders.Vertical, borderStyle) + } + } + bx, by := item.x-1, item.y-1 // Top-left corner. + if bx >= 0 && bx < screenWidth && by >= 0 && by < screenHeight { + PrintJoinedSemigraphics(screen, bx, by, Borders.TopLeft, borderStyle) + } + bx, by = item.x+item.w, item.y-1 // Top-right corner. + if bx >= 0 && bx < screenWidth && by >= 0 && by < screenHeight { + PrintJoinedSemigraphics(screen, bx, by, Borders.TopRight, borderStyle) + } + bx, by = item.x-1, item.y+item.h // Bottom-left corner. + if bx >= 0 && bx < screenWidth && by >= 0 && by < screenHeight { + PrintJoinedSemigraphics(screen, bx, by, Borders.BottomLeft, borderStyle) + } + bx, by = item.x+item.w, item.y+item.h // Bottom-right corner. + if bx >= 0 && bx < screenWidth && by >= 0 && by < screenHeight { + PrintJoinedSemigraphics(screen, bx, by, Borders.BottomRight, borderStyle) + } + } + } +} + +// MouseHandler returns the mouse handler for this primitive. +func (g *Grid) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return g.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if !g.InRect(event.Position()) { + return false, nil + } + + // Pass mouse events along to the first child item that takes it. + for _, item := range g.items { + if item.Item == nil { + continue + } + consumed, capture = item.Item.MouseHandler()(action, event, setFocus) + if consumed { + return + } + } + + return + }) +} + +// InputHandler returns the handler for this primitive. +func (g *Grid) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return g.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if !g.hasFocus { + // Pass event on to child primitive. + for _, item := range g.items { + if item != nil && item.Item.HasFocus() { + if handler := item.Item.InputHandler(); handler != nil { + handler(event, setFocus) + return + } + } + } + return + } + + // Process our own key events if we have direct focus. + switch event.Key() { + case tcell.KeyRune: + switch event.Rune() { + case 'g': + g.rowOffset, g.columnOffset = 0, 0 + case 'G': + g.rowOffset = math.MaxInt32 + case 'j': + g.rowOffset++ + case 'k': + g.rowOffset-- + case 'h': + g.columnOffset-- + case 'l': + g.columnOffset++ + } + case tcell.KeyHome: + g.rowOffset, g.columnOffset = 0, 0 + case tcell.KeyEnd: + g.rowOffset = math.MaxInt32 + case tcell.KeyUp: + g.rowOffset-- + case tcell.KeyDown: + g.rowOffset++ + case tcell.KeyLeft: + g.columnOffset-- + case tcell.KeyRight: + g.columnOffset++ + } + }) +} + +// PasteHandler returns the handler for this primitive. +func (g *Grid) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return g.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + for _, item := range g.items { + if item != nil && item.Item.HasFocus() { + if handler := item.Item.PasteHandler(); handler != nil { + handler(pastedText, setFocus) + return + } + } + } + }) +} diff --git a/vendor/github.com/rivo/tview/image.go b/vendor/github.com/rivo/tview/image.go new file mode 100644 index 00000000..53a74889 --- /dev/null +++ b/vendor/github.com/rivo/tview/image.go @@ -0,0 +1,764 @@ +package tview + +import ( + "image" + "math" + + "github.com/gdamore/tcell/v2" +) + +// Types of dithering applied to images. +const ( + DitheringNone = iota // No dithering. + DitheringFloydSteinberg // Floyd-Steinberg dithering (the default). +) + +// The number of colors supported by true color terminals (R*G*B = 256*256*256). +const TrueColor = 16777216 + +// This map describes what each block element looks like. A 1 bit represents a +// pixel that is drawn, a 0 bit represents a pixel that is not drawn. The least +// significant bit is the top left pixel, the most significant bit is the bottom +// right pixel, moving row by row from left to right, top to bottom. +var blockElements = map[rune]uint64{ + BlockLowerOneEighthBlock: 0b1111111100000000000000000000000000000000000000000000000000000000, + BlockLowerOneQuarterBlock: 0b1111111111111111000000000000000000000000000000000000000000000000, + BlockLowerThreeEighthsBlock: 0b1111111111111111111111110000000000000000000000000000000000000000, + BlockLowerHalfBlock: 0b1111111111111111111111111111111100000000000000000000000000000000, + BlockLowerFiveEighthsBlock: 0b1111111111111111111111111111111111111111000000000000000000000000, + BlockLowerThreeQuartersBlock: 0b1111111111111111111111111111111111111111111111110000000000000000, + BlockLowerSevenEighthsBlock: 0b1111111111111111111111111111111111111111111111111111111100000000, + BlockLeftSevenEighthsBlock: 0b0111111101111111011111110111111101111111011111110111111101111111, + BlockLeftThreeQuartersBlock: 0b0011111100111111001111110011111100111111001111110011111100111111, + BlockLeftFiveEighthsBlock: 0b0001111100011111000111110001111100011111000111110001111100011111, + BlockLeftHalfBlock: 0b0000111100001111000011110000111100001111000011110000111100001111, + BlockLeftThreeEighthsBlock: 0b0000011100000111000001110000011100000111000001110000011100000111, + BlockLeftOneQuarterBlock: 0b0000001100000011000000110000001100000011000000110000001100000011, + BlockLeftOneEighthBlock: 0b0000000100000001000000010000000100000001000000010000000100000001, + BlockQuadrantLowerLeft: 0b0000111100001111000011110000111100000000000000000000000000000000, + BlockQuadrantLowerRight: 0b1111000011110000111100001111000000000000000000000000000000000000, + BlockQuadrantUpperLeft: 0b0000000000000000000000000000000000001111000011110000111100001111, + BlockQuadrantUpperRight: 0b0000000000000000000000000000000011110000111100001111000011110000, + BlockQuadrantUpperLeftAndLowerRight: 0b1111000011110000111100001111000000001111000011110000111100001111, +} + +// pixel represents a character on screen used to draw part of an image. +type pixel struct { + style tcell.Style + element rune // The block element. +} + +// Image implements a widget that displays one image. The original image +// (specified with [Image.SetImage]) is resized according to the specified size +// (see [Image.SetSize]), using the specified number of colors (see +// [Image.SetColors]), while applying dithering if necessary (see +// [Image.SetDithering]). +// +// Images are approximated by graphical characters in the terminal. The +// resolution is therefore limited by the number and type of characters that can +// be drawn in the terminal and the colors available in the terminal. The +// quality of the final image also depends on the terminal's font and spacing +// settings, none of which are under the control of this package. Results may +// vary. +type Image struct { + *Box + + // The image to be displayed. If nil, the widget will be empty. + image image.Image + + // The size of the image. If a value is 0, the corresponding size is chosen + // automatically based on the other size while preserving the image's aspect + // ratio. If both are 0, the image uses as much space as possible. A + // negative value represents a percentage, e.g. -50 means 50% of the + // available space. + width, height int + + // The number of colors to use. If 0, the number of colors is chosen based + // on the terminal's capabilities. + colors int + + // The dithering algorithm to use, one of the constants starting with + // "ImageDithering". + dithering int + + // The width of a terminal's cell divided by its height. + aspectRatio float64 + + // Horizontal and vertical alignment, one of the "Align" constants. + alignHorizontal, alignVertical int + + // The text to be displayed before the image. + label string + + // The label style. + labelStyle tcell.Style + + // The screen width of the label area. A value of 0 means use the width of + // the label text. + labelWidth int + + // The actual image size (in cells) when it was drawn the last time. + lastWidth, lastHeight int + + // The actual image (in cells) when it was drawn the last time. The size of + // this slice is lastWidth * lastHeight, indexed by y*lastWidth + x. + pixels []pixel + + // A callback function set by the Form class and called when the user leaves + // this form item. + finished func(tcell.Key) +} + +// NewImage returns a new image widget with an empty image (use [Image.SetImage] +// to specify the image to be displayed). The image will use the widget's entire +// available space. The dithering algorithm is set to Floyd-Steinberg dithering. +// The terminal's cell aspect ratio defaults to 0.5. +func NewImage() *Image { + return &Image{ + Box: NewBox(), + dithering: DitheringFloydSteinberg, + aspectRatio: 0.5, + alignHorizontal: AlignCenter, + alignVertical: AlignCenter, + } +} + +// SetImage sets the image to be displayed. If nil, the widget will be empty. +func (i *Image) SetImage(image image.Image) *Image { + i.image = image + i.lastWidth, i.lastHeight = 0, 0 + return i +} + +// SetSize sets the size of the image. Positive values refer to cells in the +// terminal. Negative values refer to a percentage of the available space (e.g. +// -50 means 50%). A value of 0 means that the corresponding size is chosen +// automatically based on the other size while preserving the image's aspect +// ratio. If both are 0, the image uses as much space as possible while still +// preserving the aspect ratio. +func (i *Image) SetSize(rows, columns int) *Image { + i.width = columns + i.height = rows + return i +} + +// SetColors sets the number of colors to use. This should be the number of +// colors supported by the terminal. If 0, the number of colors is chosen based +// on the TERM environment variable (which may or may not be reliable). +// +// Only the values 0, 2, 8, 256, and 16777216 ([TrueColor]) are supported. Other +// values will be rounded up to the next supported value, to a maximum of +// 16777216. +// +// The effect of using more colors than supported by the terminal is undefined. +func (i *Image) SetColors(colors int) *Image { + i.colors = colors + i.lastWidth, i.lastHeight = 0, 0 + return i +} + +// GetColors returns the number of colors that will be used while drawing the +// image. This is one of the values listed in [Image.SetColors], except 0 which +// will be replaced by the actual number of colors used. +func (i *Image) GetColors() int { + switch { + case i.colors == 0: + return availableColors + case i.colors <= 2: + return 2 + case i.colors <= 8: + return 8 + case i.colors <= 256: + return 256 + } + return TrueColor +} + +// SetDithering sets the dithering algorithm to use, one of the constants +// starting with "Dithering", for example [DitheringFloydSteinberg] (the +// default). Dithering is not applied when rendering in true-color. +func (i *Image) SetDithering(dithering int) *Image { + i.dithering = dithering + i.lastWidth, i.lastHeight = 0, 0 + return i +} + +// SetAspectRatio sets the width of a terminal's cell divided by its height. +// You may change the default of 0.5 if your terminal / font has a different +// aspect ratio. This is used to calculate the size of the image if the +// specified width or height is 0. The function will panic if the aspect ratio +// is 0 or less. +func (i *Image) SetAspectRatio(aspectRatio float64) *Image { + if aspectRatio <= 0 { + panic("aspect ratio must be greater than 0") + } + i.aspectRatio = aspectRatio + i.lastWidth, i.lastHeight = 0, 0 + return i +} + +// SetAlign sets the vertical and horizontal alignment of the image within the +// widget's space. The possible values are [AlignTop], [AlignCenter], and +// [AlignBottom] for vertical alignment and [AlignLeft], [AlignCenter], and +// [AlignRight] for horizontal alignment. The default is [AlignCenter] for both +// (or [AlignTop] and [AlignLeft] if the image is part of a [Form]). +func (i *Image) SetAlign(vertical, horizontal int) *Image { + i.alignHorizontal = horizontal + i.alignVertical = vertical + return i +} + +// SetLabel sets the text to be displayed before the image. +func (i *Image) SetLabel(label string) *Image { + i.label = label + return i +} + +// GetLabel returns the text to be displayed before the image. +func (i *Image) GetLabel() string { + return i.label +} + +// SetLabelWidth sets the screen width of the label. A value of 0 will cause the +// primitive to use the width of the label string. +func (i *Image) SetLabelWidth(width int) *Image { + i.labelWidth = width + return i +} + +// GetFieldWidth returns this primitive's field width. This is the image's width +// or, if the width is 0 or less, the proportional width of the image based on +// its height as returned by [Image.GetFieldHeight]. If there is no image, 0 is +// returned. +func (i *Image) GetFieldWidth() int { + if i.width <= 0 { + if i.image == nil { + return 0 + } + bounds := i.image.Bounds() + height := i.GetFieldHeight() + return bounds.Dx() * height / bounds.Dy() + } + return i.width +} + +// GetFieldHeight returns this primitive's field height. This is the image's +// height or 8 if the height is 0 or less. +func (i *Image) GetFieldHeight() int { + if i.height <= 0 { + return 8 + } + return i.height +} + +// SetDisabled sets whether or not the item is disabled / read-only. +func (i *Image) SetDisabled(disabled bool) FormItem { + return i // Images are always read-only. +} + +// SetFormAttributes sets attributes shared by all form items. +func (i *Image) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) FormItem { + i.labelWidth = labelWidth + i.backgroundColor = bgColor + i.SetLabelStyle(tcell.StyleDefault.Foreground(labelColor).Background(bgColor)) + i.lastWidth, i.lastHeight = 0, 0 + return i +} + +// SetLabelStyle sets the style of the label. +func (i *Image) SetLabelStyle(style tcell.Style) *Image { + i.labelStyle = style + return i +} + +// GetLabelStyle returns the style of the label. +func (i *Image) GetLabelStyle() tcell.Style { + return i.labelStyle +} + +// SetFinishedFunc sets a callback invoked when the user leaves this form item. +func (i *Image) SetFinishedFunc(handler func(key tcell.Key)) FormItem { + i.finished = handler + return i +} + +// Focus is called when this primitive receives focus. +func (i *Image) Focus(delegate func(p Primitive)) { + // If we're part of a form, there's nothing the user can do here so we're + // finished. + if i.finished != nil { + i.finished(-1) + return + } + + i.Box.Focus(delegate) +} + +// render re-populates the [Image.pixels] slice based on the current settings, +// if [Image.lastWidth] and [Image.lastHeight] don't match the current image's +// size. It also sets the new image size in these two variables. +func (i *Image) render() { + // If there is no image, there are no pixels. + if i.image == nil { + i.pixels = nil + return + } + + // Calculate the new (terminal-space) image size. + bounds := i.image.Bounds() + imageWidth, imageHeight := bounds.Dx(), bounds.Dy() + if i.aspectRatio != 1.0 { + imageWidth = int(float64(imageWidth) / i.aspectRatio) + } + width, height := i.width, i.height + _, _, innerWidth, innerHeight := i.GetInnerRect() + if i.labelWidth > 0 { + innerWidth -= i.labelWidth + } else { + innerWidth -= TaggedStringWidth(i.label) + } + if innerWidth <= 0 { + i.pixels = nil + return + } + if width == 0 && height == 0 { + // Use all available space. + width, height = innerWidth, innerHeight + if adjustedWidth := imageWidth * height / imageHeight; adjustedWidth < width { + width = adjustedWidth + } else { + height = imageHeight * width / imageWidth + } + } else { + // Turn percentages into absolute values. + if width < 0 { + width = innerWidth * -width / 100 + } + if height < 0 { + height = innerHeight * -height / 100 + } + if width == 0 { + // Adjust the width. + width = imageWidth * height / imageHeight + } else if height == 0 { + // Adjust the height. + height = imageHeight * width / imageWidth + } + } + if width <= 0 || height <= 0 { + i.pixels = nil + return + } + + // If nothing has changed, we're done. + if i.lastWidth == width && i.lastHeight == height { + return + } + i.lastWidth, i.lastHeight = width, height // This could still be larger than the available space but that's ok for now. + + // Generate the initial pixels by resizing the image (8x8 per cell). + pixels := i.resize() + + // Turn them into block elements with background/foreground colors. + i.stamp(pixels) +} + +// resize resizes the image to the current size and returns the result as a +// slice of pixels. It is assumed that [Image.lastWidth] (w) and +// [Image.lastHeight] (h) are positive, non-zero values, and the slice has a +// size of 64*w*h, with each pixel being represented by 3 float64 values in the +// range of 0-1. The factor of 64 is due to the fact that we calculate 8x8 +// pixels per cell. +func (i *Image) resize() [][3]float64 { + // Because most of the time, we will be downsizing the image, we don't even + // attempt to do any fancy interpolation. For each target pixel, we + // calculate a weighted average of the source pixels using their coverage + // area. + + bounds := i.image.Bounds() + srcWidth, srcHeight := bounds.Dx(), bounds.Dy() + tgtWidth, tgtHeight := i.lastWidth*8, i.lastHeight*8 + coverageWidth, coverageHeight := float64(tgtWidth)/float64(srcWidth), float64(tgtHeight)/float64(srcHeight) + pixels := make([][3]float64, tgtWidth*tgtHeight) + weights := make([]float64, tgtWidth*tgtHeight) + for srcY := bounds.Min.Y; srcY < bounds.Max.Y; srcY++ { + for srcX := bounds.Min.X; srcX < bounds.Max.X; srcX++ { + r32, g32, b32, _ := i.image.At(srcX, srcY).RGBA() + r, g, b := float64(r32)/0xffff, float64(g32)/0xffff, float64(b32)/0xffff + + // Iterate over all target pixels. Outer loop is Y. + startY := float64(srcY-bounds.Min.Y) * coverageHeight + endY := startY + coverageHeight + fromY, toY := int(startY), int(endY) + for tgtY := fromY; tgtY <= toY && tgtY < tgtHeight; tgtY++ { + coverageY := 1.0 + if tgtY == fromY { + coverageY -= math.Mod(startY, 1.0) + } + if tgtY == toY { + coverageY -= 1.0 - math.Mod(endY, 1.0) + } + + // Inner loop is X. + startX := float64(srcX-bounds.Min.X) * coverageWidth + endX := startX + coverageWidth + fromX, toX := int(startX), int(endX) + for tgtX := fromX; tgtX <= toX && tgtX < tgtWidth; tgtX++ { + coverageX := 1.0 + if tgtX == fromX { + coverageX -= math.Mod(startX, 1.0) + } + if tgtX == toX { + coverageX -= 1.0 - math.Mod(endX, 1.0) + } + + // Add a weighted contribution to the target pixel. + index := tgtY*tgtWidth + tgtX + coverage := coverageX * coverageY + pixels[index][0] += r * coverage + pixels[index][1] += g * coverage + pixels[index][2] += b * coverage + weights[index] += coverage + } + } + } + } + + // Normalize the pixels. + for index, weight := range weights { + if weight > 0 { + pixels[index][0] /= weight + pixels[index][1] /= weight + pixels[index][2] /= weight + } + } + + return pixels +} + +// stamp takes the pixels generated by [Image.resize] and populates the +// [Image.pixels] slice accordingly. +func (i *Image) stamp(resized [][3]float64) { + // For each 8x8 pixel block, we find the best block element to represent it, + // given the available colors. + i.pixels = make([]pixel, i.lastWidth*i.lastHeight) + colors := i.GetColors() + for row := 0; row < i.lastHeight; row++ { + for col := 0; col < i.lastWidth; col++ { + // Calculate an error for each potential block element + color. Keep + // the one with the lowest error. + + // Note that the values in "resize" may lie outside [0, 1] due to + // the error distribution during dithering. + + minMSE := math.MaxFloat64 // Mean squared error. + var final [64][3]float64 // The final pixel values. + for element, bits := range blockElements { + // Calculate the average color for the pixels covered by the set + // bits and unset bits. + var ( + bg, fg [3]float64 + setBits float64 + bit uint64 = 1 + ) + for y := 0; y < 8; y++ { + for x := 0; x < 8; x++ { + index := (row*8+y)*i.lastWidth*8 + (col*8 + x) + if bits&bit != 0 { + fg[0] += resized[index][0] + fg[1] += resized[index][1] + fg[2] += resized[index][2] + setBits++ + } else { + bg[0] += resized[index][0] + bg[1] += resized[index][1] + bg[2] += resized[index][2] + } + bit <<= 1 + } + } + for ch := 0; ch < 3; ch++ { + fg[ch] /= setBits + if fg[ch] < 0 { + fg[ch] = 0 + } else if fg[ch] > 1 { + fg[ch] = 1 + } + bg[ch] /= 64 - setBits + if bg[ch] < 0 { + bg[ch] = 0 + } + if bg[ch] > 1 { + bg[ch] = 1 + } + } + + // Quantize to the nearest acceptable color. + for _, color := range []*[3]float64{&fg, &bg} { + if colors == 2 { + // Monochrome. The following weights correspond better + // to human perception than the arithmetic mean. + gray := 0.299*color[0] + 0.587*color[1] + 0.114*color[2] + if gray < 0.5 { + *color = [3]float64{0, 0, 0} + } else { + *color = [3]float64{1, 1, 1} + } + } else { + for index, ch := range color { + switch { + case colors == 8: + // Colors vary wildly for each terminal. Expect + // suboptimal results. + if ch < 0.5 { + color[index] = 0 + } else { + color[index] = 1 + } + case colors == 256: + color[index] = math.Round(ch*6) / 6 + } + } + } + } + + // Calculate the error (and the final pixel values). + var ( + mse float64 + values [64][3]float64 + valuesIndex int + ) + bit = 1 + for y := 0; y < 8; y++ { + for x := 0; x < 8; x++ { + if bits&bit != 0 { + values[valuesIndex] = fg + } else { + values[valuesIndex] = bg + } + index := (row*8+y)*i.lastWidth*8 + (col*8 + x) + for ch := 0; ch < 3; ch++ { + err := resized[index][ch] - values[valuesIndex][ch] + mse += err * err + } + bit <<= 1 + valuesIndex++ + } + } + + // Do we have a better match? + if mse < minMSE { + // Yes. Save it. + minMSE = mse + final = values + index := row*i.lastWidth + col + i.pixels[index].element = element + i.pixels[index].style = tcell.StyleDefault. + Foreground(tcell.NewRGBColor(int32(math.Min(255, fg[0]*255)), int32(math.Min(255, fg[1]*255)), int32(math.Min(255, fg[2]*255)))). + Background(tcell.NewRGBColor(int32(math.Min(255, bg[0]*255)), int32(math.Min(255, bg[1]*255)), int32(math.Min(255, bg[2]*255)))) + } + } + + // Check if there is a shade block which results in a smaller error. + + // What's the overall average color? + var avg [3]float64 + for y := 0; y < 8; y++ { + for x := 0; x < 8; x++ { + index := (row*8+y)*i.lastWidth*8 + (col*8 + x) + for ch := 0; ch < 3; ch++ { + avg[ch] += resized[index][ch] / 64 + } + } + } + for ch := 0; ch < 3; ch++ { + if avg[ch] < 0 { + avg[ch] = 0 + } else if avg[ch] > 1 { + avg[ch] = 1 + } + } + + // Quantize and choose shade element. + element := BlockFullBlock + var fg, bg tcell.Color + shades := []rune{' ', BlockLightShade, BlockMediumShade, BlockDarkShade, BlockFullBlock} + if colors == 2 { + // Monochrome. + gray := 0.299*avg[0] + 0.587*avg[1] + 0.114*avg[2] // See above for details. + shade := int(math.Round(gray * 4)) + element = shades[shade] + for ch := 0; ch < 3; ch++ { + avg[ch] = float64(shade) / 4 + } + bg = tcell.ColorBlack + fg = tcell.ColorWhite + } else if colors == TrueColor { + // True color. + fg = tcell.NewRGBColor(int32(math.Min(255, avg[0]*255)), int32(math.Min(255, avg[1]*255)), int32(math.Min(255, avg[2]*255))) + bg = fg + } else { + // 8 or 256 colors. + steps := 1.0 + if colors == 256 { + steps = 6.0 + } + var ( + lo, hi, pos [3]float64 + shade float64 + ) + for ch := 0; ch < 3; ch++ { + lo[ch] = math.Floor(avg[ch]*steps) / steps + hi[ch] = math.Ceil(avg[ch]*steps) / steps + if r := hi[ch] - lo[ch]; r > 0 { + pos[ch] = (avg[ch] - lo[ch]) / r + if math.Abs(pos[ch]-0.5) < math.Abs(shade-0.5) { + shade = pos[ch] + } + } + } + shade = math.Round(shade * 4) + element = shades[int(shade)] + shade /= 4 + for ch := 0; ch < 3; ch++ { // Find the closest channel value. + best := math.Abs(avg[ch] - (lo[ch] + (hi[ch]-lo[ch])*shade)) // Start shade from lo to hi. + if value := math.Abs(avg[ch] - (hi[ch] - (hi[ch]-lo[ch])*shade)); value < best { + best = value // Swap lo and hi. + lo[ch], hi[ch] = hi[ch], lo[ch] + } + if value := math.Abs(avg[ch] - lo[ch]); value < best { + best = value // Use lo. + hi[ch] = lo[ch] + } + if value := math.Abs(avg[ch] - hi[ch]); value < best { + lo[ch] = hi[ch] // Use hi. + } + avg[ch] = lo[ch] + (hi[ch]-lo[ch])*shade // Quantize. + } + bg = tcell.NewRGBColor(int32(math.Min(255, lo[0]*255)), int32(math.Min(255, lo[1]*255)), int32(math.Min(255, lo[2]*255))) + fg = tcell.NewRGBColor(int32(math.Min(255, hi[0]*255)), int32(math.Min(255, hi[1]*255)), int32(math.Min(255, hi[2]*255))) + } + + // Calculate the error (and the final pixel values). + var ( + mse float64 + values [64][3]float64 + valuesIndex int + ) + for y := 0; y < 8; y++ { + for x := 0; x < 8; x++ { + index := (row*8+y)*i.lastWidth*8 + (col*8 + x) + for ch := 0; ch < 3; ch++ { + err := resized[index][ch] - avg[ch] + mse += err * err + } + values[valuesIndex] = avg + valuesIndex++ + } + } + + // Is this shade element better than the block element? + if mse < minMSE { + // Yes. Save it. + final = values + index := row*i.lastWidth + col + i.pixels[index].element = element + i.pixels[index].style = tcell.StyleDefault.Foreground(fg).Background(bg) + } + + // Apply dithering. + if colors < TrueColor && i.dithering == DitheringFloydSteinberg { + // The dithering mask determines how the error is distributed. + // Each element has three values: dx, dy, and weight (in 16th). + var mask = [4][3]int{ + {1, 0, 7}, + {-1, 1, 3}, + {0, 1, 5}, + {1, 1, 1}, + } + + // We dither the 8x8 block as a 2x2 block, transferring errors + // to its 2x2 neighbors. + for ch := 0; ch < 3; ch++ { + for y := 0; y < 2; y++ { + for x := 0; x < 2; x++ { + // What's the error for this 4x4 block? + var err float64 + for dy := 0; dy < 4; dy++ { + for dx := 0; dx < 4; dx++ { + err += (final[(y*4+dy)*8+(x*4+dx)][ch] - resized[(row*8+(y*4+dy))*i.lastWidth*8+(col*8+(x*4+dx))][ch]) / 16 + } + } + + // Distribute it to the 2x2 neighbors. + for _, dist := range mask { + for dy := 0; dy < 4; dy++ { + for dx := 0; dx < 4; dx++ { + targetX, targetY := (x+dist[0])*4+dx, (y+dist[1])*4+dy + if targetX < 0 || col*8+targetX >= i.lastWidth*8 || targetY < 0 || row*8+targetY >= i.lastHeight*8 { + continue + } + resized[(row*8+targetY)*i.lastWidth*8+(col*8+targetX)][ch] -= err * float64(dist[2]) / 16 + } + } + } + } + } + } + } + } + } +} + +// Draw draws this primitive onto the screen. +func (i *Image) Draw(screen tcell.Screen) { + i.DrawForSubclass(screen, i) + + // Regenerate image if necessary. + i.render() + + // Draw label. + viewX, viewY, viewWidth, viewHeight := i.GetInnerRect() + _, labelBg, _ := i.labelStyle.Decompose() + if i.labelWidth > 0 { + labelWidth := i.labelWidth + if labelWidth > viewWidth { + labelWidth = viewWidth + } + printWithStyle(screen, i.label, viewX, viewY, 0, labelWidth, AlignLeft, i.labelStyle, labelBg == tcell.ColorDefault) + viewX += labelWidth + viewWidth -= labelWidth + } else { + _, _, drawnWidth := printWithStyle(screen, i.label, viewX, viewY, 0, viewWidth, AlignLeft, i.labelStyle, labelBg == tcell.ColorDefault) + viewX += drawnWidth + viewWidth -= drawnWidth + } + + // Determine image placement. + x, y, width, height := viewX, viewY, i.lastWidth, i.lastHeight + if i.alignHorizontal == AlignCenter { + x += (viewWidth - width) / 2 + } else if i.alignHorizontal == AlignRight { + x += viewWidth - width + } + if i.alignVertical == AlignCenter { + y += (viewHeight - height) / 2 + } else if i.alignVertical == AlignBottom { + y += viewHeight - height + } + + // Draw the image. + for row := 0; row < height; row++ { + if y+row < viewY || y+row >= viewY+viewHeight { + continue + } + for col := 0; col < width; col++ { + if x+col < viewX || x+col >= viewX+viewWidth { + continue + } + + index := row*width + col + screen.SetContent(x+col, y+row, i.pixels[index].element, nil, i.pixels[index].style) + } + } +} diff --git a/vendor/github.com/rivo/tview/inputfield.go b/vendor/github.com/rivo/tview/inputfield.go new file mode 100644 index 00000000..f5439343 --- /dev/null +++ b/vendor/github.com/rivo/tview/inputfield.go @@ -0,0 +1,717 @@ +package tview + +import ( + "math" + "strconv" + "strings" + "sync" + + "github.com/gdamore/tcell/v2" + "github.com/rivo/uniseg" +) + +const ( + AutocompletedNavigate = iota // The user navigated the autocomplete list (using the errow keys). + AutocompletedTab // The user selected an autocomplete entry using the tab key. + AutocompletedEnter // The user selected an autocomplete entry using the enter key. + AutocompletedClick // The user selected an autocomplete entry by clicking the mouse button on it. +) + +// Predefined InputField acceptance functions. +var ( + // InputFieldInteger accepts integers. + InputFieldInteger = func(text string, ch rune) bool { + if text == "-" { + return true + } + _, err := strconv.Atoi(text) + return err == nil + } + + // InputFieldFloat accepts floating-point numbers. + InputFieldFloat = func(text string, ch rune) bool { + if text == "-" || text == "." || text == "-." { + return true + } + _, err := strconv.ParseFloat(text, 64) + return err == nil + } + + // InputFieldMaxLength returns an input field accept handler which accepts + // input strings up to a given length. Use it like this: + // + // inputField.SetAcceptanceFunc(InputFieldMaxLength(10)) // Accept up to 10 characters. + InputFieldMaxLength = func(maxLength int) func(text string, ch rune) bool { + return func(text string, ch rune) bool { + return len([]rune(text)) <= maxLength + } + } +) + +// InputField is a one-line box into which the user can enter text. Use +// [InputField.SetAcceptanceFunc] to accept or reject input, +// [InputField.SetChangedFunc] to listen for changes, and +// [InputField.SetMaskCharacter] to hide input from onlookers (e.g. for password +// input). +// +// The input field also has an optional autocomplete feature. It is initialized +// by the [InputField.SetAutocompleteFunc] function. For more control over the +// autocomplete drop-down's behavior, you can also set the +// [InputField.SetAutocompletedFunc]. +// +// Navigation and editing is the same as for a [TextArea], with the following +// exceptions: +// +// - Tab, BackTab, Enter, Escape: Finish editing. +// +// Note that while pressing Tab or Enter is intercepted by the input field, it +// is possible to paste such characters into the input field, possibly resulting +// in multi-line input. You can use [InputField.SetAcceptanceFunc] to prevent +// this. +// +// If autocomplete functionality is configured: +// +// - Down arrow: Open the autocomplete drop-down. +// - Tab, Enter: Select the current autocomplete entry. +// +// See https://github.com/rivo/tview/wiki/InputField for an example. +type InputField struct { + *Box + + // The text area providing the core functionality of the input field. + textArea *TextArea + + // The screen width of the input area. A value of 0 means extend as much as + // possible. + fieldWidth int + + // An optional autocomplete function which receives the current text of the + // input field and returns a slice of strings to be displayed in a drop-down + // selection. + autocomplete func(text string) []string + + // The List object which shows the selectable autocomplete entries. If not + // nil, the list's main texts represent the current autocomplete entries. + autocompleteList *List + autocompleteListMutex sync.Mutex + + // The styles of the autocomplete entries. + autocompleteStyles struct { + main tcell.Style + selected tcell.Style + background tcell.Color + useTags bool + } + + // An optional function which is called when the user selects an + // autocomplete entry. The text and index of the selected entry (within the + // list) is provided, as well as the user action causing the selection (one + // of the "Autocompleted" values). The function should return true if the + // autocomplete list should be closed. If nil, the input field will be + // updated automatically when the user navigates the autocomplete list. + autocompleted func(text string, index int, source int) bool + + // An optional function which may reject the last character that was entered. + accept func(text string, ch rune) bool + + // An optional function which is called when the input has changed. + changed func(text string) + + // An optional function which is called when the user indicated that they + // are done entering text. The key which was pressed is provided (tab, + // shift-tab, enter, or escape). + done func(tcell.Key) + + // A callback function set by the Form class and called when the user leaves + // this form item. + finished func(tcell.Key) +} + +// NewInputField returns a new input field. +func NewInputField() *InputField { + i := &InputField{ + Box: NewBox(), + textArea: NewTextArea().SetWrap(false), + } + i.textArea.SetChangedFunc(func() { + if i.changed != nil { + i.changed(i.textArea.GetText()) + } + }).SetFocusFunc(func() { + // Forward focus event to the input field. + if i.Box.focus != nil { + i.Box.focus() + } + }) + i.textArea.textStyle = tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.PrimaryTextColor) + i.textArea.placeholderStyle = tcell.StyleDefault.Background(Styles.ContrastBackgroundColor).Foreground(Styles.ContrastSecondaryTextColor) + i.autocompleteStyles.main = tcell.StyleDefault.Background(Styles.MoreContrastBackgroundColor).Foreground(Styles.PrimitiveBackgroundColor) + i.autocompleteStyles.selected = tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.PrimitiveBackgroundColor) + i.autocompleteStyles.background = Styles.MoreContrastBackgroundColor + i.autocompleteStyles.useTags = true + return i +} + +// SetText sets the current text of the input field. This can be undone by the +// user. Calling this function will also trigger a "changed" event. +func (i *InputField) SetText(text string) *InputField { + i.textArea.Replace(0, i.textArea.GetTextLength(), text) + return i +} + +// GetText returns the current text of the input field. +func (i *InputField) GetText() string { + return i.textArea.GetText() +} + +// SetLabel sets the text to be displayed before the input area. +func (i *InputField) SetLabel(label string) *InputField { + i.textArea.SetLabel(label) + return i +} + +// GetLabel returns the text to be displayed before the input area. +func (i *InputField) GetLabel() string { + return i.textArea.GetLabel() +} + +// SetLabelWidth sets the screen width of the label. A value of 0 will cause the +// primitive to use the width of the label string. +func (i *InputField) SetLabelWidth(width int) *InputField { + i.textArea.SetLabelWidth(width) + return i +} + +// SetPlaceholder sets the text to be displayed when the input text is empty. +func (i *InputField) SetPlaceholder(text string) *InputField { + i.textArea.SetPlaceholder(text) + return i +} + +// SetLabelColor sets the text color of the label. +func (i *InputField) SetLabelColor(color tcell.Color) *InputField { + i.textArea.SetLabelStyle(i.textArea.GetLabelStyle().Foreground(color)) + return i +} + +// SetLabelStyle sets the style of the label. +func (i *InputField) SetLabelStyle(style tcell.Style) *InputField { + i.textArea.SetLabelStyle(style) + return i +} + +// GetLabelStyle returns the style of the label. +func (i *InputField) GetLabelStyle() tcell.Style { + return i.textArea.GetLabelStyle() +} + +// SetFieldBackgroundColor sets the background color of the input area. +func (i *InputField) SetFieldBackgroundColor(color tcell.Color) *InputField { + i.textArea.SetTextStyle(i.textArea.GetTextStyle().Background(color)) + return i +} + +// SetFieldTextColor sets the text color of the input area. +func (i *InputField) SetFieldTextColor(color tcell.Color) *InputField { + i.textArea.SetTextStyle(i.textArea.GetTextStyle().Foreground(color)) + return i +} + +// SetFieldStyle sets the style of the input area (when no placeholder is +// shown). +func (i *InputField) SetFieldStyle(style tcell.Style) *InputField { + i.textArea.SetTextStyle(style) + return i +} + +// GetFieldStyle returns the style of the input area (when no placeholder is +// shown). +func (i *InputField) GetFieldStyle() tcell.Style { + return i.textArea.GetTextStyle() +} + +// SetPlaceholderTextColor sets the text color of placeholder text. +func (i *InputField) SetPlaceholderTextColor(color tcell.Color) *InputField { + i.textArea.SetPlaceholderStyle(i.textArea.GetPlaceholderStyle().Foreground(color)) + return i +} + +// SetPlaceholderStyle sets the style of the input area (when a placeholder is +// shown). +func (i *InputField) SetPlaceholderStyle(style tcell.Style) *InputField { + i.textArea.SetPlaceholderStyle(style) + return i +} + +// GetPlaceholderStyle returns the style of the input area (when a placeholder +// is shown). +func (i *InputField) GetPlaceholderStyle() tcell.Style { + return i.textArea.GetPlaceholderStyle() +} + +// SetAutocompleteStyles sets the colors and style of the autocomplete entries. +// For details, see [List.SetMainTextStyle], [List.SetSelectedStyle], and +// [Box.SetBackgroundColor]. +func (i *InputField) SetAutocompleteStyles(background tcell.Color, main, selected tcell.Style) *InputField { + i.autocompleteStyles.background = background + i.autocompleteStyles.main = main + i.autocompleteStyles.selected = selected + return i +} + +// SetAutocompleteUseTags sets whether or not the autocomplete entries may +// contain style tags affecting their appearance. The default is true. +func (i *InputField) SetAutocompleteUseTags(useTags bool) *InputField { + i.autocompleteStyles.useTags = useTags + return i +} + +// SetFormAttributes sets attributes shared by all form items. +func (i *InputField) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) FormItem { + i.textArea.SetFormAttributes(labelWidth, labelColor, bgColor, fieldTextColor, fieldBgColor) + return i +} + +// SetFieldWidth sets the screen width of the input area. A value of 0 means +// extend as much as possible. +func (i *InputField) SetFieldWidth(width int) *InputField { + i.fieldWidth = width + return i +} + +// GetFieldWidth returns this primitive's field width. +func (i *InputField) GetFieldWidth() int { + return i.fieldWidth +} + +// GetFieldHeight returns this primitive's field height. +func (i *InputField) GetFieldHeight() int { + return 1 +} + +// SetDisabled sets whether or not the item is disabled / read-only. +func (i *InputField) SetDisabled(disabled bool) FormItem { + i.textArea.SetDisabled(disabled) + if i.finished != nil { + i.finished(-1) + } + return i +} + +// SetMaskCharacter sets a character that masks user input on a screen. A value +// of 0 disables masking. +func (i *InputField) SetMaskCharacter(mask rune) *InputField { + if mask == 0 { + i.textArea.setTransform(nil) + return i + } + maskStr := string(mask) + maskWidth := uniseg.StringWidth(maskStr) + i.textArea.setTransform(func(cluster, rest string, boundaries int) (newCluster string, newBoundaries int) { + return maskStr, maskWidth << uniseg.ShiftWidth + }) + return i +} + +// SetAutocompleteFunc sets an autocomplete callback function which may return +// strings to be selected from a drop-down based on the current text of the +// input field. The drop-down appears only if len(entries) > 0. The callback is +// invoked in this function and whenever the current text changes or when +// [InputField.Autocomplete] is called. Entries are cleared when the user +// selects an entry or presses Escape. +func (i *InputField) SetAutocompleteFunc(callback func(currentText string) (entries []string)) *InputField { + i.autocomplete = callback + i.Autocomplete() + return i +} + +// SetAutocompletedFunc sets a callback function which is invoked when the user +// selects an entry from the autocomplete drop-down list. The function is passed +// the text of the selected entry (stripped of any style tags), the index of the +// entry, and the user action that caused the selection, for example +// [AutocompletedNavigate]. It returns true if the autocomplete drop-down should +// be closed after the callback returns or false if it should remain open, in +// which case [InputField.Autocomplete] is called to update the drop-down's +// contents. +// +// If no such callback is set (or nil is provided), the input field will be +// updated with the selection any time the user navigates the autocomplete +// drop-down list. So this function essentially gives you more control over the +// autocomplete functionality. +func (i *InputField) SetAutocompletedFunc(autocompleted func(text string, index int, source int) bool) *InputField { + i.autocompleted = autocompleted + return i +} + +// Autocomplete invokes the autocomplete callback (if there is one, see +// [InputField.SetAutocompleteFunc]). If the length of the returned autocomplete +// entries slice is greater than 0, the input field will present the user with a +// corresponding drop-down list the next time the input field is drawn. +// +// It is safe to call this function from any goroutine. Note that the input +// field is not redrawn automatically unless called from the main goroutine +// (e.g. in response to events). +func (i *InputField) Autocomplete() *InputField { + i.autocompleteListMutex.Lock() + defer i.autocompleteListMutex.Unlock() + if i.autocomplete == nil { + return i + } + + // Do we have any autocomplete entries? + text := i.textArea.GetText() + entries := i.autocomplete(text) + if len(entries) == 0 { + // No entries, no list. + i.autocompleteList = nil + return i + } + + // Make a list if we have none. + if i.autocompleteList == nil { + i.autocompleteList = NewList() + i.autocompleteList.ShowSecondaryText(false). + SetMainTextStyle(i.autocompleteStyles.main). + SetSelectedStyle(i.autocompleteStyles.selected). + SetUseStyleTags(i.autocompleteStyles.useTags, i.autocompleteStyles.useTags). + SetHighlightFullLine(true). + SetBackgroundColor(i.autocompleteStyles.background) + } + + // Fill it with the entries. + currentIndex := i.autocompleteList.GetCurrentItem() + var currentSelection string + if currentIndex >= 0 && currentIndex < i.autocompleteList.GetItemCount() { + currentSelection, _ = i.autocompleteList.GetItemText(currentIndex) + } + currentEntry := -1 + suffixLength := math.MaxInt + i.autocompleteList.Clear() + for index, entry := range entries { + i.autocompleteList.AddItem(entry, "", 0, nil) + if currentSelection != "" && entry == currentSelection { + currentEntry = index + } + if currentSelection == "" && strings.HasPrefix(entry, text) && len(entry)-len(text) < suffixLength { + currentEntry = index + suffixLength = len(text) - len(entry) + } + } + + // Set the selection if we have one. + if currentEntry >= 0 { + i.autocompleteList.SetCurrentItem(currentEntry) + } + + return i +} + +// SetAcceptanceFunc sets a handler which may reject the last character that was +// entered, by returning false. The handler receives the text as it would be +// after the change and the last character entered. If the handler is nil, all +// input is accepted. The function is only called when a single rune is inserted +// at the current cursor position. +// +// This package defines a number of variables prefixed with InputField which may +// be used for common input (e.g. numbers, maximum text length). See for example +// [InputFieldInteger]. +// +// When text is pasted, lastChar is 0. +func (i *InputField) SetAcceptanceFunc(handler func(textToCheck string, lastChar rune) bool) *InputField { + i.accept = handler + return i +} + +// SetChangedFunc sets a handler which is called whenever the text of the input +// field has changed. It receives the current text (after the change). +func (i *InputField) SetChangedFunc(handler func(text string)) *InputField { + i.changed = handler + return i +} + +// SetDoneFunc sets a handler which is called when the user is done entering +// text. The callback function is provided with the key that was pressed, which +// is one of the following: +// +// - KeyEnter: Done entering text. +// - KeyEscape: Abort text input. +// - KeyTab: Move to the next field. +// - KeyBacktab: Move to the previous field. +func (i *InputField) SetDoneFunc(handler func(key tcell.Key)) *InputField { + i.done = handler + return i +} + +// SetFinishedFunc sets a callback invoked when the user leaves this form item. +func (i *InputField) SetFinishedFunc(handler func(key tcell.Key)) FormItem { + i.finished = handler + return i +} + +// Focus is called when this primitive receives focus. +func (i *InputField) Focus(delegate func(p Primitive)) { + // If we're part of a form and this item is disabled, there's nothing the + // user can do here so we're finished. + if i.finished != nil && i.textArea.GetDisabled() { + i.finished(-1) + return + } + + i.Box.Focus(delegate) +} + +// HasFocus returns whether or not this primitive has focus. +func (i *InputField) HasFocus() bool { + return i.textArea.HasFocus() || i.Box.HasFocus() +} + +// Blur is called when this primitive loses focus. +func (i *InputField) Blur() { + i.textArea.Blur() + i.Box.Blur() + i.autocompleteList = nil // Hide the autocomplete drop-down. +} + +// Draw draws this primitive onto the screen. +func (i *InputField) Draw(screen tcell.Screen) { + i.Box.DrawForSubclass(screen, i) + + // Prepare + x, y, width, height := i.GetInnerRect() + if height < 1 || width < 1 { + return + } + + // Resize text area. + labelWidth := i.textArea.GetLabelWidth() + if labelWidth == 0 { + labelWidth = TaggedStringWidth(i.textArea.GetLabel()) + } + fieldWidth := i.fieldWidth + if fieldWidth == 0 { + fieldWidth = width - labelWidth + } + i.textArea.SetRect(x, y, labelWidth+fieldWidth, 1) + i.textArea.setMinCursorPadding(fieldWidth-1, 1) + + // Draw text area. + i.textArea.hasFocus = i.HasFocus() // Force cursor positioning. + i.textArea.Draw(screen) + + // Draw autocomplete list. + i.autocompleteListMutex.Lock() + defer i.autocompleteListMutex.Unlock() + if i.autocompleteList != nil && i.HasFocus() { + // How much space do we need? + lheight := i.autocompleteList.GetItemCount() + lwidth := 0 + for index := 0; index < lheight; index++ { + entry, _ := i.autocompleteList.GetItemText(index) + width := TaggedStringWidth(entry) + if width > lwidth { + lwidth = width + } + } + + // We prefer to drop down but if there is no space, maybe drop up? + lx := x + labelWidth + ly := y + 1 + _, sheight := screen.Size() + if ly+lheight >= sheight && ly-2 > lheight-ly { + ly = y - lheight + if ly < 0 { + ly = 0 + } + } + if ly+lheight >= sheight { + lheight = sheight - ly + } + i.autocompleteList.SetRect(lx, ly, lwidth, lheight) + i.autocompleteList.Draw(screen) + } +} + +// InputHandler returns the handler for this primitive. +func (i *InputField) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return i.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if i.textArea.GetDisabled() { + return + } + + // Trigger changed events. + var skipAutocomplete bool + currentText := i.textArea.GetText() + defer func() { + if skipAutocomplete { + return + } + if i.textArea.GetText() != currentText { + i.Autocomplete() + } + }() + + // If we have an autocomplete list, there are certain keys we will + // forward to it. + i.autocompleteListMutex.Lock() + defer i.autocompleteListMutex.Unlock() + if i.autocompleteList != nil { + i.autocompleteList.SetChangedFunc(nil) + i.autocompleteList.SetSelectedFunc(nil) + switch key := event.Key(); key { + case tcell.KeyEscape: // Close the list. + i.autocompleteList = nil + return + case tcell.KeyEnter, tcell.KeyTab: // Intentional selection. + index := i.autocompleteList.GetCurrentItem() + text, _ := i.autocompleteList.GetItemText(index) + if i.autocompleted != nil { + source := AutocompletedEnter + if key == tcell.KeyTab { + source = AutocompletedTab + } + if i.autocompleted(stripTags(text), index, source) { + i.autocompleteList = nil + currentText = i.GetText() + } + } else { + i.SetText(text) + skipAutocomplete = true + i.autocompleteList = nil + } + return + case tcell.KeyDown, tcell.KeyUp, tcell.KeyPgDn, tcell.KeyPgUp: + i.autocompleteList.SetChangedFunc(func(index int, text, secondaryText string, shortcut rune) { + text = stripTags(text) + if i.autocompleted != nil { + if i.autocompleted(text, index, AutocompletedNavigate) { + i.autocompleteList = nil + currentText = i.GetText() + } + } else { + i.SetText(text) + currentText = stripTags(text) // We want to keep the autocomplete list open and unchanged. + } + }) + i.autocompleteList.InputHandler()(event, setFocus) + return + } + } + + // Finish up. + finish := func(key tcell.Key) { + if i.done != nil { + i.done(key) + } + if i.finished != nil { + i.finished(key) + } + } + + // Process special key events for the input field. + switch key := event.Key(); key { + case tcell.KeyDown: + i.autocompleteListMutex.Unlock() // We're still holding a lock. + i.Autocomplete() + i.autocompleteListMutex.Lock() + case tcell.KeyEnter, tcell.KeyEscape, tcell.KeyTab, tcell.KeyBacktab: + finish(key) + case tcell.KeyCtrlV: + if i.accept != nil && !i.accept(i.textArea.getTextBeforeCursor()+i.textArea.GetClipboardText()+i.textArea.getTextAfterCursor(), 0) { + return + } + i.textArea.InputHandler()(event, setFocus) + case tcell.KeyRune: + if event.Modifiers()&tcell.ModAlt == 0 && i.accept != nil { + // Check if this rune is accepted. + r := event.Rune() + if !i.accept(i.textArea.getTextBeforeCursor()+string(r)+i.textArea.getTextAfterCursor(), r) { + return + } + } + fallthrough + default: + // Forward other key events to the text area. + i.textArea.InputHandler()(event, setFocus) + } + }) +} + +// MouseHandler returns the mouse handler for this primitive. +func (i *InputField) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return i.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if i.textArea.GetDisabled() { + return false, nil + } + + var skipAutocomplete bool + currentText := i.GetText() + defer func() { + if skipAutocomplete { + return + } + if i.textArea.GetText() != currentText { + i.Autocomplete() + } + }() + + // If we have an autocomplete list, forward the mouse event to it. + i.autocompleteListMutex.Lock() + defer i.autocompleteListMutex.Unlock() + if i.autocompleteList != nil { + i.autocompleteList.SetChangedFunc(nil) + i.autocompleteList.SetSelectedFunc(func(index int, text, secondaryText string, shortcut rune) { + text = stripTags(text) + if i.autocompleted != nil { + if i.autocompleted(text, index, AutocompletedClick) { + i.autocompleteList = nil + currentText = i.GetText() + } + return + } + i.SetText(text) + skipAutocomplete = true + i.autocompleteList = nil + }) + if consumed, _ = i.autocompleteList.MouseHandler()(action, event, setFocus); consumed { + setFocus(i) + return + } + } + + // Is mouse event within the input field? + x, y := event.Position() + if !i.InRect(x, y) { + return false, nil + } + + // Forward mouse event to the text area. + consumed, capture = i.textArea.MouseHandler()(action, event, setFocus) + + return + }) +} + +// PasteHandler returns the handler for this primitive. +func (i *InputField) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return i.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + // Input field may be disabled. + if i.textArea.GetDisabled() { + return + } + + // The autocomplete drop down may be open. + i.autocompleteListMutex.Lock() + defer i.autocompleteListMutex.Unlock() + if i.autocompleteList != nil { + return + } + + // We may not accept this text. + if i.accept != nil && !i.accept(i.textArea.getTextBeforeCursor()+pastedText+i.textArea.getTextAfterCursor(), 0) { + return + } + + // Forward the pasted text to the text area. + i.textArea.PasteHandler()(pastedText, setFocus) + }) +} diff --git a/vendor/github.com/rivo/tview/list.go b/vendor/github.com/rivo/tview/list.go new file mode 100644 index 00000000..b084811f --- /dev/null +++ b/vendor/github.com/rivo/tview/list.go @@ -0,0 +1,779 @@ +package tview + +import ( + "fmt" + "strings" + + "github.com/gdamore/tcell/v2" +) + +// listItem represents one item in a List. +type listItem struct { + MainText string // The main text of the list item. + SecondaryText string // A secondary text to be shown underneath the main text. + Shortcut rune // The key to select the list item directly, 0 if there is no shortcut. + Selected func() // The optional function which is called when the item is selected. +} + +// List displays rows of items, each of which can be selected. List items can be +// shown as a single line or as two lines. They can be selected by pressing +// their assigned shortcut key, navigating to them and pressing Enter, or +// clicking on them with the mouse. The following key binds are available: +// +// - Down arrow / tab: Move down one item. +// - Up arrow / backtab: Move up one item. +// - Home: Move to the first item. +// - End: Move to the last item. +// - Page down: Move down one page. +// - Page up: Move up one page. +// - Enter / Space: Select the current item. +// - Right / left: Scroll horizontally. Only if the list is wider than the +// available space. +// +// By default, list item texts can contain style tags. Use +// [List.SetUseStyleTags] to disable this feature. +// +// See [List.SetChangedFunc] for a way to be notified when the user navigates +// to a list item. See [List.SetSelectedFunc] for a way to be notified when a +// list item was selected. +// +// See https://github.com/rivo/tview/wiki/List for an example. +type List struct { + *Box + + // The items of the list. + items []*listItem + + // The index of the currently selected item. + currentItem int + + // Whether or not to show the secondary item texts. + showSecondaryText bool + + // The item main text style. + mainTextStyle tcell.Style + + // The item secondary text style. + secondaryTextStyle tcell.Style + + // The item shortcut text style. + shortcutStyle tcell.Style + + // The style for selected items. + selectedStyle tcell.Style + + // If true, the selection is only shown when the list has focus. + selectedFocusOnly bool + + // If true, the entire row is highlighted when selected. + highlightFullLine bool + + // Whether or not style tags can be used in the main text. + mainStyleTags bool + + // Whether or not style tags can be used in the secondary text. + secondaryStyleTags bool + + // Whether or not navigating the list will wrap around. + wrapAround bool + + // The number of list items skipped at the top before the first item is + // drawn. + itemOffset int + + // The number of cells skipped on the left side of an item text. Shortcuts + // are not affected. + horizontalOffset int + + // An optional function which is called when the user has navigated to a + // list item. + changed func(index int, mainText, secondaryText string, shortcut rune) + + // An optional function which is called when a list item was selected. This + // function will be called even if the list item defines its own callback. + selected func(index int, mainText, secondaryText string, shortcut rune) + + // An optional function which is called when the user presses the Escape key. + done func() +} + +// NewList returns a new list. +func NewList() *List { + return &List{ + Box: NewBox(), + showSecondaryText: true, + wrapAround: true, + mainTextStyle: tcell.StyleDefault.Foreground(Styles.PrimaryTextColor).Background(Styles.PrimitiveBackgroundColor), + secondaryTextStyle: tcell.StyleDefault.Foreground(Styles.TertiaryTextColor).Background(Styles.PrimitiveBackgroundColor), + shortcutStyle: tcell.StyleDefault.Foreground(Styles.SecondaryTextColor).Background(Styles.PrimitiveBackgroundColor), + selectedStyle: tcell.StyleDefault.Foreground(Styles.PrimitiveBackgroundColor).Background(Styles.PrimaryTextColor), + mainStyleTags: true, + secondaryStyleTags: true, + } +} + +// SetCurrentItem sets the currently selected item by its index, starting at 0 +// for the first item. If a negative index is provided, items are referred to +// from the back (-1 = last item, -2 = second-to-last item, and so on). Out of +// range indices are clamped to the beginning/end. +// +// Calling this function triggers a "changed" event if the selection changes. +func (l *List) SetCurrentItem(index int) *List { + if index < 0 { + index = len(l.items) + index + } + if index >= len(l.items) { + index = len(l.items) - 1 + } + if index < 0 { + index = 0 + } + + if index != l.currentItem && l.changed != nil { + item := l.items[index] + l.changed(index, item.MainText, item.SecondaryText, item.Shortcut) + } + + l.currentItem = index + + return l +} + +// GetCurrentItem returns the index of the currently selected list item, +// starting at 0 for the first item. +func (l *List) GetCurrentItem() int { + return l.currentItem +} + +// SetOffset sets the number of items to be skipped (vertically) as well as the +// number of cells skipped horizontally when the list is drawn. Note that one +// item corresponds to two rows when there are secondary texts. Shortcuts are +// always drawn. +// +// These values may change when the list is drawn to ensure the currently +// selected item is visible and item texts move out of view. Users can also +// modify these values by interacting with the list. +func (l *List) SetOffset(items, horizontal int) *List { + l.itemOffset = items + l.horizontalOffset = horizontal + return l +} + +// GetOffset returns the number of items skipped while drawing, as well as the +// number of cells item text is moved to the left. See also SetOffset() for more +// information on these values. +func (l *List) GetOffset() (int, int) { + return l.itemOffset, l.horizontalOffset +} + +// RemoveItem removes the item with the given index (starting at 0) from the +// list. If a negative index is provided, items are referred to from the back +// (-1 = last item, -2 = second-to-last item, and so on). Out of range indices +// are clamped to the beginning/end, i.e. unless the list is empty, an item is +// always removed. +// +// The currently selected item is shifted accordingly. If it is the one that is +// removed, a "changed" event is fired, unless no items are left. +func (l *List) RemoveItem(index int) *List { + if len(l.items) == 0 { + return l + } + + // Adjust index. + if index < 0 { + index = len(l.items) + index + } + if index >= len(l.items) { + index = len(l.items) - 1 + } + if index < 0 { + index = 0 + } + + // Remove item. + l.items = append(l.items[:index], l.items[index+1:]...) + + // If there is nothing left, we're done. + if len(l.items) == 0 { + return l + } + + // Shift current item. + previousCurrentItem := l.currentItem + if l.currentItem > index || l.currentItem == len(l.items) { + l.currentItem-- + } + + // Fire "changed" event for removed items. + if previousCurrentItem == index && l.changed != nil { + item := l.items[l.currentItem] + l.changed(l.currentItem, item.MainText, item.SecondaryText, item.Shortcut) + } + + return l +} + +// SetMainTextColor sets the color of the items' main text. +func (l *List) SetMainTextColor(color tcell.Color) *List { + l.mainTextStyle = l.mainTextStyle.Foreground(color) + return l +} + +// SetMainTextStyle sets the style of the items' main text. Note that the +// background color is ignored in order not to override the background color of +// the list itself. +func (l *List) SetMainTextStyle(style tcell.Style) *List { + l.mainTextStyle = style + return l +} + +// SetSecondaryTextColor sets the color of the items' secondary text. +func (l *List) SetSecondaryTextColor(color tcell.Color) *List { + l.secondaryTextStyle = l.secondaryTextStyle.Foreground(color) + return l +} + +// SetSecondaryTextStyle sets the style of the items' secondary text. Note that +// the background color is ignored in order not to override the background color +// of the list itself. +func (l *List) SetSecondaryTextStyle(style tcell.Style) *List { + l.secondaryTextStyle = style + return l +} + +// SetShortcutColor sets the color of the items' shortcut. +func (l *List) SetShortcutColor(color tcell.Color) *List { + l.shortcutStyle = l.shortcutStyle.Foreground(color) + return l +} + +// SetShortcutStyle sets the style of the items' shortcut. Note that the +// background color is ignored in order not to override the background color of +// the list itself. +func (l *List) SetShortcutStyle(style tcell.Style) *List { + l.shortcutStyle = style + return l +} + +// SetSelectedTextColor sets the text color of selected items. Note that the +// color of main text characters that are different from the main text color +// (e.g. style tags) is maintained. +func (l *List) SetSelectedTextColor(color tcell.Color) *List { + l.selectedStyle = l.selectedStyle.Foreground(color) + return l +} + +// SetSelectedBackgroundColor sets the background color of selected items. +func (l *List) SetSelectedBackgroundColor(color tcell.Color) *List { + l.selectedStyle = l.selectedStyle.Background(color) + return l +} + +// SetSelectedStyle sets the style of the selected items. Note that the color of +// main text characters that are different from the main text color (e.g. color +// tags) is maintained. +func (l *List) SetSelectedStyle(style tcell.Style) *List { + l.selectedStyle = style + return l +} + +// SetUseStyleTags sets a flag which determines whether style tags are used in +// the main and secondary texts. The default is true. +func (l *List) SetUseStyleTags(mainStyleTags, secondaryStyleTags bool) *List { + l.mainStyleTags = mainStyleTags + l.secondaryStyleTags = secondaryStyleTags + return l +} + +// GetUseStyleTags returns whether style tags are used in the main and secondary +// texts. +func (l *List) GetUseStyleTags() (mainStyleTags, secondaryStyleTags bool) { + return l.mainStyleTags, l.secondaryStyleTags +} + +// SetSelectedFocusOnly sets a flag which determines when the currently selected +// list item is highlighted. If set to true, selected items are only highlighted +// when the list has focus. If set to false, they are always highlighted. +func (l *List) SetSelectedFocusOnly(focusOnly bool) *List { + l.selectedFocusOnly = focusOnly + return l +} + +// SetHighlightFullLine sets a flag which determines whether the colored +// background of selected items spans the entire width of the view. If set to +// true, the highlight spans the entire view. If set to false, only the text of +// the selected item from beginning to end is highlighted. +func (l *List) SetHighlightFullLine(highlight bool) *List { + l.highlightFullLine = highlight + return l +} + +// ShowSecondaryText determines whether or not to show secondary item texts. +func (l *List) ShowSecondaryText(show bool) *List { + l.showSecondaryText = show + return l +} + +// SetWrapAround sets the flag that determines whether navigating the list will +// wrap around. That is, navigating downwards on the last item will move the +// selection to the first item (similarly in the other direction). If set to +// false, the selection won't change when navigating downwards on the last item +// or navigating upwards on the first item. +func (l *List) SetWrapAround(wrapAround bool) *List { + l.wrapAround = wrapAround + return l +} + +// SetChangedFunc sets the function which is called when the user navigates to +// a list item. The function receives the item's index in the list of items +// (starting with 0), its main text, secondary text, and its shortcut rune. +// +// This function is also called when the first item is added or when +// SetCurrentItem() is called. +func (l *List) SetChangedFunc(handler func(index int, mainText string, secondaryText string, shortcut rune)) *List { + l.changed = handler + return l +} + +// SetSelectedFunc sets the function which is called when the user selects a +// list item by pressing Enter on the current selection. The function receives +// the item's index in the list of items (starting with 0), its main text, +// secondary text, and its shortcut rune. +func (l *List) SetSelectedFunc(handler func(int, string, string, rune)) *List { + l.selected = handler + return l +} + +// GetSelectedFunc returns the function set with [List.SetSelectedFunc] or nil +// if no such function was set. +func (l *List) GetSelectedFunc() func(int, string, string, rune) { + return l.selected +} + +// SetDoneFunc sets a function which is called when the user presses the Escape +// key. +func (l *List) SetDoneFunc(handler func()) *List { + l.done = handler + return l +} + +// AddItem calls [List.InsertItem] with an index of -1. +func (l *List) AddItem(mainText, secondaryText string, shortcut rune, selected func()) *List { + l.InsertItem(-1, mainText, secondaryText, shortcut, selected) + return l +} + +// InsertItem adds a new item to the list at the specified index. An index of 0 +// will insert the item at the beginning, an index of 1 before the second item, +// and so on. An index of [List.GetItemCount] or higher will insert the item at +// the end of the list. Negative indices are also allowed: An index of -1 will +// insert the item at the end of the list, an index of -2 before the last item, +// and so on. An index of -GetItemCount()-1 or lower will insert the item at the +// beginning. +// +// An item has a main text which will be highlighted when selected. It also has +// a secondary text which is shown underneath the main text (if it is set to +// visible) but which may remain empty. +// +// The shortcut is a key binding. If the specified rune is entered, the item +// is selected immediately. Set to 0 for no binding. +// +// The "selected" callback will be invoked when the user selects the item. You +// may provide nil if no such callback is needed or if all events are handled +// through the selected callback set with [List.SetSelectedFunc]. +// +// The currently selected item will shift its position accordingly. If the list +// was previously empty, a "changed" event is fired because the new item becomes +// selected. +func (l *List) InsertItem(index int, mainText, secondaryText string, shortcut rune, selected func()) *List { + item := &listItem{ + MainText: mainText, + SecondaryText: secondaryText, + Shortcut: shortcut, + Selected: selected, + } + + // Shift index to range. + if index < 0 { + index = len(l.items) + index + 1 + } + if index < 0 { + index = 0 + } else if index > len(l.items) { + index = len(l.items) + } + + // Shift current item. + if l.currentItem < len(l.items) && l.currentItem >= index { + l.currentItem++ + } + + // Insert item (make space for the new item, then shift and insert). + l.items = append(l.items, nil) + if index < len(l.items)-1 { // -1 because l.items has already grown by one item. + copy(l.items[index+1:], l.items[index:]) + } + l.items[index] = item + + // Fire a "change" event for the first item in the list. + if len(l.items) == 1 && l.changed != nil { + item := l.items[0] + l.changed(0, item.MainText, item.SecondaryText, item.Shortcut) + } + + return l +} + +// GetItemCount returns the number of items in the list. +func (l *List) GetItemCount() int { + return len(l.items) +} + +// GetItemSelectedFunc returns the function which is called when the user +// selects the item with the given index, if such a function was set. If no +// function was set, nil is returned. Panics if the index is out of range. +func (l *List) GetItemSelectedFunc(index int) func() { + return l.items[index].Selected +} + +// GetItemText returns an item's texts (main and secondary). Panics if the index +// is out of range. +func (l *List) GetItemText(index int) (main, secondary string) { + return l.items[index].MainText, l.items[index].SecondaryText +} + +// SetItemText sets an item's main and secondary text. Panics if the index is +// out of range. +func (l *List) SetItemText(index int, main, secondary string) *List { + item := l.items[index] + item.MainText = main + item.SecondaryText = secondary + return l +} + +// FindItems searches the main and secondary texts for the given strings and +// returns a list of item indices in which those strings are found. One of the +// two search strings may be empty, it will then be ignored. Indices are always +// returned in ascending order. +// +// If mustContainBoth is set to true, mainSearch must be contained in the main +// text AND secondarySearch must be contained in the secondary text. If it is +// false, only one of the two search strings must be contained. +// +// Set ignoreCase to true for case-insensitive search. +func (l *List) FindItems(mainSearch, secondarySearch string, mustContainBoth, ignoreCase bool) (indices []int) { + if mainSearch == "" && secondarySearch == "" { + return + } + + if ignoreCase { + mainSearch = strings.ToLower(mainSearch) + secondarySearch = strings.ToLower(secondarySearch) + } + + for index, item := range l.items { + mainText := item.MainText + secondaryText := item.SecondaryText + if ignoreCase { + mainText = strings.ToLower(mainText) + secondaryText = strings.ToLower(secondaryText) + } + + // strings.Contains() always returns true for a "" search. + mainContained := strings.Contains(mainText, mainSearch) + secondaryContained := strings.Contains(secondaryText, secondarySearch) + if mustContainBoth && mainContained && secondaryContained || + !mustContainBoth && (mainSearch != "" && mainContained || secondarySearch != "" && secondaryContained) { + indices = append(indices, index) + } + } + + return +} + +// Clear removes all items from the list. +func (l *List) Clear() *List { + l.items = nil + l.currentItem = 0 + return l +} + +// Draw draws this primitive onto the screen. +func (l *List) Draw(screen tcell.Screen) { + l.Box.DrawForSubclass(screen, l) + + // Determine the dimensions. + x, y, width, height := l.GetInnerRect() + bottomLimit := y + height + _, totalHeight := screen.Size() + if bottomLimit > totalHeight { + bottomLimit = totalHeight + } + + // Adjust offsets to keep the current item in view. + if height == 0 { + return + } + if l.currentItem < l.itemOffset { + l.itemOffset = l.currentItem + } else if l.showSecondaryText { + if 2*(l.currentItem-l.itemOffset) >= height-1 { + l.itemOffset = (2*l.currentItem + 3 - height) / 2 + } + } else { + if l.currentItem-l.itemOffset >= height { + l.itemOffset = l.currentItem + 1 - height + } + } + if l.horizontalOffset < 0 { + l.horizontalOffset = 0 + } + + // Do we show any shortcuts? + var showShortcuts bool + for _, item := range l.items { + if item.Shortcut != 0 { + showShortcuts = true + x += 4 + width -= 4 + break + } + } + + // Draw the list items. + var maxWidth int // The maximum printed item width. + for index, item := range l.items { + if index < l.itemOffset { + continue + } + + if y >= bottomLimit { + break + } + + // Shortcuts. + if showShortcuts && item.Shortcut != 0 { + printWithStyle(screen, fmt.Sprintf("(%s)", string(item.Shortcut)), x-5, y, 0, 4, AlignRight, l.shortcutStyle, false) + } + + // Main text. + selected := index == l.currentItem && (!l.selectedFocusOnly || l.HasFocus()) + style := l.mainTextStyle + if selected { + style = l.selectedStyle + } + mainText := item.MainText + if !l.mainStyleTags { + mainText = Escape(mainText) + } + _, _, printedWidth := printWithStyle(screen, mainText, x, y, l.horizontalOffset, width, AlignLeft, style, false) + if printedWidth > maxWidth { + maxWidth = printedWidth + } + + // Draw until the end of the line if requested. + if selected && l.highlightFullLine { + for bx := printedWidth; bx < width; bx++ { + screen.SetContent(x+bx, y, ' ', nil, style) + } + } + + y++ + if y >= bottomLimit { + break + } + + // Secondary text. + if l.showSecondaryText { + secondaryText := item.SecondaryText + if !l.secondaryStyleTags { + secondaryText = Escape(secondaryText) + } + _, _, printedWidth := printWithStyle(screen, secondaryText, x, y, l.horizontalOffset, width, AlignLeft, l.secondaryTextStyle, false) + if printedWidth > maxWidth { + maxWidth = printedWidth + } + y++ + } + } + + // We don't want the item text to get out of view. If the horizontal offset + // is too high, we reset it and redraw. (That should be about as efficient + // as calculating everything up front.) + if l.horizontalOffset > 0 && maxWidth < width { + l.horizontalOffset -= width - maxWidth + l.Draw(screen) + } +} + +// InputHandler returns the handler for this primitive. +func (l *List) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return l.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if event.Key() == tcell.KeyEscape { + if l.done != nil { + l.done() + } + return + } else if len(l.items) == 0 { + return + } + + previousItem := l.currentItem + + switch key := event.Key(); key { + case tcell.KeyTab, tcell.KeyDown: + l.currentItem++ + case tcell.KeyBacktab, tcell.KeyUp: + l.currentItem-- + case tcell.KeyRight: + l.horizontalOffset += 2 // We shift by 2 to account for two-cell characters. + case tcell.KeyLeft: + l.horizontalOffset -= 2 + case tcell.KeyHome: + l.currentItem = 0 + case tcell.KeyEnd: + l.currentItem = len(l.items) - 1 + case tcell.KeyPgDn: + _, _, _, height := l.GetInnerRect() + l.currentItem += height + if l.currentItem >= len(l.items) { + l.currentItem = len(l.items) - 1 + } + case tcell.KeyPgUp: + _, _, _, height := l.GetInnerRect() + l.currentItem -= height + if l.currentItem < 0 { + l.currentItem = 0 + } + case tcell.KeyEnter: + if l.currentItem >= 0 && l.currentItem < len(l.items) { + item := l.items[l.currentItem] + if item.Selected != nil { + item.Selected() + } + if l.selected != nil { + l.selected(l.currentItem, item.MainText, item.SecondaryText, item.Shortcut) + } + } + case tcell.KeyRune: + ch := event.Rune() + if ch != ' ' { + // It's not a space bar. Is it a shortcut? + var found bool + for index, item := range l.items { + if item.Shortcut == ch { + // We have a shortcut. + found = true + l.currentItem = index + break + } + } + if !found { + break + } + } + item := l.items[l.currentItem] + if item.Selected != nil { + item.Selected() + } + if l.selected != nil { + l.selected(l.currentItem, item.MainText, item.SecondaryText, item.Shortcut) + } + } + + if l.currentItem < 0 { + if l.wrapAround { + l.currentItem = len(l.items) - 1 + } else { + l.currentItem = 0 + } + } else if l.currentItem >= len(l.items) { + if l.wrapAround { + l.currentItem = 0 + } else { + l.currentItem = len(l.items) - 1 + } + } + + if l.currentItem != previousItem && l.currentItem < len(l.items) { + if l.changed != nil { + item := l.items[l.currentItem] + l.changed(l.currentItem, item.MainText, item.SecondaryText, item.Shortcut) + } + } + }) +} + +// indexAtPoint returns the index of the list item found at the given position +// or a negative value if there is no such list item. +func (l *List) indexAtPoint(x, y int) int { + rectX, rectY, width, height := l.GetInnerRect() + if rectX < 0 || rectX >= rectX+width || y < rectY || y >= rectY+height { + return -1 + } + + index := y - rectY + if l.showSecondaryText { + index /= 2 + } + index += l.itemOffset + + if index >= len(l.items) { + return -1 + } + return index +} + +// MouseHandler returns the mouse handler for this primitive. +func (l *List) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return l.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if !l.InRect(event.Position()) { + return false, nil + } + + // Process mouse event. + switch action { + case MouseLeftClick: + setFocus(l) + index := l.indexAtPoint(event.Position()) + if index != -1 { + item := l.items[index] + if item.Selected != nil { + item.Selected() + } + if l.selected != nil { + l.selected(index, item.MainText, item.SecondaryText, item.Shortcut) + } + if index != l.currentItem { + if l.changed != nil { + l.changed(index, item.MainText, item.SecondaryText, item.Shortcut) + } + } + l.currentItem = index + } + consumed = true + case MouseScrollUp: + if l.itemOffset > 0 { + l.itemOffset-- + } + consumed = true + case MouseScrollDown: + lines := len(l.items) - l.itemOffset + if l.showSecondaryText { + lines *= 2 + } + if _, _, _, height := l.GetInnerRect(); lines > height { + l.itemOffset++ + } + consumed = true + case MouseScrollLeft: + l.horizontalOffset-- + consumed = true + case MouseScrollRight: + l.horizontalOffset++ + consumed = true + } + + return + }) +} diff --git a/vendor/github.com/rivo/tview/modal.go b/vendor/github.com/rivo/tview/modal.go new file mode 100644 index 00000000..d12eb91a --- /dev/null +++ b/vendor/github.com/rivo/tview/modal.go @@ -0,0 +1,214 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// Modal is a centered message window used to inform the user or prompt them +// for an immediate decision. It needs to have at least one button (added via +// [Modal.AddButtons]) or it will never disappear. +// +// See https://github.com/rivo/tview/wiki/Modal for an example. +type Modal struct { + *Box + + // The frame embedded in the modal. + frame *Frame + + // The form embedded in the modal's frame. + form *Form + + // The message text (original, not word-wrapped). + text string + + // The text color. + textColor tcell.Color + + // The optional callback for when the user clicked one of the buttons. It + // receives the index of the clicked button and the button's label. + done func(buttonIndex int, buttonLabel string) +} + +// NewModal returns a new modal message window. +func NewModal() *Modal { + m := &Modal{ + Box: NewBox().SetBorder(true).SetBackgroundColor(Styles.ContrastBackgroundColor), + textColor: Styles.PrimaryTextColor, + } + m.form = NewForm(). + SetButtonsAlign(AlignCenter). + SetButtonBackgroundColor(Styles.PrimitiveBackgroundColor). + SetButtonTextColor(Styles.PrimaryTextColor) + m.form.SetBackgroundColor(Styles.ContrastBackgroundColor).SetBorderPadding(0, 0, 0, 0) + m.form.SetCancelFunc(func() { + if m.done != nil { + m.done(-1, "") + } + }) + m.frame = NewFrame(m.form).SetBorders(0, 0, 1, 0, 0, 0) + m.frame.SetBackgroundColor(Styles.ContrastBackgroundColor). + SetBorderPadding(1, 1, 1, 1) + return m +} + +// SetBackgroundColor sets the color of the modal frame background. +func (m *Modal) SetBackgroundColor(color tcell.Color) *Modal { + m.form.SetBackgroundColor(color) + m.frame.SetBackgroundColor(color) + return m +} + +// SetTextColor sets the color of the message text. +func (m *Modal) SetTextColor(color tcell.Color) *Modal { + m.textColor = color + return m +} + +// SetButtonBackgroundColor sets the background color of the buttons. +func (m *Modal) SetButtonBackgroundColor(color tcell.Color) *Modal { + m.form.SetButtonBackgroundColor(color) + return m +} + +// SetButtonTextColor sets the color of the button texts. +func (m *Modal) SetButtonTextColor(color tcell.Color) *Modal { + m.form.SetButtonTextColor(color) + return m +} + +// SetButtonStyle sets the style of the buttons when they are not focused. +func (m *Modal) SetButtonStyle(style tcell.Style) *Modal { + m.form.SetButtonStyle(style) + return m +} + +// SetButtonActivatedStyle sets the style of the buttons when they are focused. +func (m *Modal) SetButtonActivatedStyle(style tcell.Style) *Modal { + m.form.SetButtonActivatedStyle(style) + return m +} + +// SetDoneFunc sets a handler which is called when one of the buttons was +// pressed. It receives the index of the button as well as its label text. The +// handler is also called when the user presses the Escape key. The index will +// then be negative and the label text an empty string. +func (m *Modal) SetDoneFunc(handler func(buttonIndex int, buttonLabel string)) *Modal { + m.done = handler + return m +} + +// SetText sets the message text of the window. The text may contain line +// breaks but style tag states will not transfer to following lines. Note that +// words are wrapped, too, based on the final size of the window. +func (m *Modal) SetText(text string) *Modal { + m.text = text + return m +} + +// AddButtons adds buttons to the window. There must be at least one button and +// a "done" handler so the window can be closed again. +func (m *Modal) AddButtons(labels []string) *Modal { + for index, label := range labels { + func(i int, l string) { + m.form.AddButton(label, func() { + if m.done != nil { + m.done(i, l) + } + }) + button := m.form.GetButton(m.form.GetButtonCount() - 1) + button.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + switch event.Key() { + case tcell.KeyDown, tcell.KeyRight: + return tcell.NewEventKey(tcell.KeyTab, 0, tcell.ModNone) + case tcell.KeyUp, tcell.KeyLeft: + return tcell.NewEventKey(tcell.KeyBacktab, 0, tcell.ModNone) + } + return event + }) + }(index, label) + } + return m +} + +// ClearButtons removes all buttons from the window. +func (m *Modal) ClearButtons() *Modal { + m.form.ClearButtons() + return m +} + +// SetFocus shifts the focus to the button with the given index. +func (m *Modal) SetFocus(index int) *Modal { + m.form.SetFocus(index) + return m +} + +// Focus is called when this primitive receives focus. +func (m *Modal) Focus(delegate func(p Primitive)) { + delegate(m.form) +} + +// HasFocus returns whether or not this primitive has focus. +func (m *Modal) HasFocus() bool { + return m.form.HasFocus() +} + +// Draw draws this primitive onto the screen. +func (m *Modal) Draw(screen tcell.Screen) { + // Calculate the width of this modal. + buttonsWidth := 0 + for _, button := range m.form.buttons { + buttonsWidth += TaggedStringWidth(button.text) + 4 + 2 + } + buttonsWidth -= 2 + screenWidth, screenHeight := screen.Size() + width := screenWidth / 3 + if width < buttonsWidth { + width = buttonsWidth + } + // width is now without the box border. + + // Reset the text and find out how wide it is. + m.frame.Clear() + lines := WordWrap(m.text, width) + for _, line := range lines { + m.frame.AddText(line, true, AlignCenter, m.textColor) + } + + // Set the modal's position and size. + height := len(lines) + 6 + width += 4 + x := (screenWidth - width) / 2 + y := (screenHeight - height) / 2 + m.SetRect(x, y, width, height) + + // Draw the frame. + m.Box.DrawForSubclass(screen, m) + x, y, width, height = m.GetInnerRect() + m.frame.SetRect(x, y, width, height) + m.frame.Draw(screen) +} + +// MouseHandler returns the mouse handler for this primitive. +func (m *Modal) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return m.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + // Pass mouse events on to the form. + consumed, capture = m.form.MouseHandler()(action, event, setFocus) + if !consumed && action == MouseLeftDown && m.InRect(event.Position()) { + setFocus(m) + consumed = true + } + return + }) +} + +// InputHandler returns the handler for this primitive. +func (m *Modal) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return m.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if m.frame.HasFocus() { + if handler := m.frame.InputHandler(); handler != nil { + handler(event, setFocus) + return + } + } + }) +} diff --git a/vendor/github.com/rivo/tview/pages.go b/vendor/github.com/rivo/tview/pages.go new file mode 100644 index 00000000..d2b6dbd3 --- /dev/null +++ b/vendor/github.com/rivo/tview/pages.go @@ -0,0 +1,354 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// page represents one page of a Pages object. +type page struct { + Name string // The page's name. + Item Primitive // The page's primitive. + Resize bool // Whether or not to resize the page when it is drawn. + Visible bool // Whether or not this page is visible. +} + +// Pages is a container for other primitives laid out on top of each other, +// overlapping or not. It is often used as the application's root primitive. It +// allows to easily switch the visibility of the contained primitives. +// +// See https://github.com/rivo/tview/wiki/Pages for an example. +type Pages struct { + *Box + + // The contained pages. (Visible) pages are drawn from back to front. + pages []*page + + // We keep a reference to the function which allows us to set the focus to + // a newly visible page. + setFocus func(p Primitive) + + // An optional handler which is called whenever the visibility or the order of + // pages changes. + changed func() +} + +// NewPages returns a new Pages object. +func NewPages() *Pages { + p := &Pages{ + Box: NewBox(), + } + return p +} + +// SetChangedFunc sets a handler which is called whenever the visibility or the +// order of any visible pages changes. This can be used to redraw the pages. +func (p *Pages) SetChangedFunc(handler func()) *Pages { + p.changed = handler + return p +} + +// GetPageCount returns the number of pages currently stored in this object. +func (p *Pages) GetPageCount() int { + return len(p.pages) +} + +// GetPageNames returns all page names ordered from front to back, +// optionally limited to visible pages. +func (p *Pages) GetPageNames(visibleOnly bool) []string { + var names []string + for index := len(p.pages) - 1; index >= 0; index-- { + if !visibleOnly || p.pages[index].Visible { + names = append(names, p.pages[index].Name) + } + } + return names +} + +// AddPage adds a new page with the given name and primitive. If there was +// previously a page with the same name, it is overwritten. Leaving the name +// empty may cause conflicts in other functions so you should always specify a +// non-empty name. +// +// Visible pages will be drawn in the order they were added (unless that order +// was changed in one of the other functions). If "resize" is set to true, the +// primitive will be set to the size available to the [Pages] primitive whenever +// the pages are drawn. +func (p *Pages) AddPage(name string, item Primitive, resize, visible bool) *Pages { + hasFocus := p.HasFocus() + for index, pg := range p.pages { + if pg.Name == name { + p.pages = append(p.pages[:index], p.pages[index+1:]...) + break + } + } + p.pages = append(p.pages, &page{Item: item, Name: name, Resize: resize, Visible: visible}) + if p.changed != nil { + p.changed() + } + if hasFocus { + p.Focus(p.setFocus) + } + return p +} + +// AddAndSwitchToPage calls AddPage(), then SwitchToPage() on that newly added +// page. +func (p *Pages) AddAndSwitchToPage(name string, item Primitive, resize bool) *Pages { + p.AddPage(name, item, resize, true) + p.SwitchToPage(name) + return p +} + +// RemovePage removes the page with the given name. If that page was the only +// visible page, visibility is assigned to the last page. +func (p *Pages) RemovePage(name string) *Pages { + var isVisible bool + hasFocus := p.HasFocus() + for index, page := range p.pages { + if page.Name == name { + isVisible = page.Visible + p.pages = append(p.pages[:index], p.pages[index+1:]...) + if page.Visible && p.changed != nil { + p.changed() + } + break + } + } + if isVisible { + for index, page := range p.pages { + if index < len(p.pages)-1 { + if page.Visible { + break // There is a remaining visible page. + } + } else { + page.Visible = true // We need at least one visible page. + } + } + } + if hasFocus { + p.Focus(p.setFocus) + } + return p +} + +// HasPage returns true if a page with the given name exists in this object. +func (p *Pages) HasPage(name string) bool { + for _, page := range p.pages { + if page.Name == name { + return true + } + } + return false +} + +// ShowPage sets a page's visibility to "true" (in addition to any other pages +// which are already visible). +func (p *Pages) ShowPage(name string) *Pages { + for _, page := range p.pages { + if page.Name == name { + page.Visible = true + if p.changed != nil { + p.changed() + } + break + } + } + if p.HasFocus() { + p.Focus(p.setFocus) + } + return p +} + +// HidePage sets a page's visibility to "false". +func (p *Pages) HidePage(name string) *Pages { + for _, page := range p.pages { + if page.Name == name { + page.Visible = false + if p.changed != nil { + p.changed() + } + break + } + } + if p.HasFocus() { + p.Focus(p.setFocus) + } + return p +} + +// SwitchToPage sets a page's visibility to "true" and all other pages' +// visibility to "false". +func (p *Pages) SwitchToPage(name string) *Pages { + for _, page := range p.pages { + if page.Name == name { + page.Visible = true + } else { + page.Visible = false + } + } + if p.changed != nil { + p.changed() + } + if p.HasFocus() { + p.Focus(p.setFocus) + } + return p +} + +// SendToFront changes the order of the pages such that the page with the given +// name comes last, causing it to be drawn last with the next update (if +// visible). +func (p *Pages) SendToFront(name string) *Pages { + for index, page := range p.pages { + if page.Name == name { + if index < len(p.pages)-1 { + p.pages = append(append(p.pages[:index], p.pages[index+1:]...), page) + } + if page.Visible && p.changed != nil { + p.changed() + } + break + } + } + if p.HasFocus() { + p.Focus(p.setFocus) + } + return p +} + +// SendToBack changes the order of the pages such that the page with the given +// name comes first, causing it to be drawn first with the next update (if +// visible). +func (p *Pages) SendToBack(name string) *Pages { + for index, pg := range p.pages { + if pg.Name == name { + if index > 0 { + p.pages = append(append([]*page{pg}, p.pages[:index]...), p.pages[index+1:]...) + } + if pg.Visible && p.changed != nil { + p.changed() + } + break + } + } + if p.HasFocus() { + p.Focus(p.setFocus) + } + return p +} + +// GetFrontPage returns the front-most visible page. If there are no visible +// pages, ("", nil) is returned. +func (p *Pages) GetFrontPage() (name string, item Primitive) { + for index := len(p.pages) - 1; index >= 0; index-- { + if p.pages[index].Visible { + return p.pages[index].Name, p.pages[index].Item + } + } + return +} + +// GetPage returns the page with the given name. If no such page exists, nil is +// returned. +func (p *Pages) GetPage(name string) Primitive { + for _, page := range p.pages { + if page.Name == name { + return page.Item + } + } + return nil +} + +// HasFocus returns whether or not this primitive has focus. +func (p *Pages) HasFocus() bool { + for _, page := range p.pages { + if page.Item.HasFocus() { + return true + } + } + return p.Box.HasFocus() +} + +// Focus is called by the application when the primitive receives focus. +func (p *Pages) Focus(delegate func(p Primitive)) { + if delegate == nil { + return // We cannot delegate so we cannot focus. + } + p.setFocus = delegate + var topItem Primitive + for _, page := range p.pages { + if page.Visible { + topItem = page.Item + } + } + if topItem != nil { + delegate(topItem) + } else { + p.Box.Focus(delegate) + } +} + +// Draw draws this primitive onto the screen. +func (p *Pages) Draw(screen tcell.Screen) { + p.Box.DrawForSubclass(screen, p) + for _, page := range p.pages { + if !page.Visible { + continue + } + if page.Resize { + x, y, width, height := p.GetInnerRect() + page.Item.SetRect(x, y, width, height) + } + page.Item.Draw(screen) + } +} + +// MouseHandler returns the mouse handler for this primitive. +func (p *Pages) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return p.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if !p.InRect(event.Position()) { + return false, nil + } + + // Pass mouse events along to the last visible page item that takes it. + for index := len(p.pages) - 1; index >= 0; index-- { + page := p.pages[index] + if page.Visible { + consumed, capture = page.Item.MouseHandler()(action, event, setFocus) + if consumed { + return + } + } + } + + return + }) +} + +// InputHandler returns the handler for this primitive. +func (p *Pages) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return p.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + for _, page := range p.pages { + if page.Item.HasFocus() { + if handler := page.Item.InputHandler(); handler != nil { + handler(event, setFocus) + return + } + } + } + }) +} + +// PasteHandler returns the handler for this primitive. +func (p *Pages) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return p.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + for _, page := range p.pages { + if page.Item.HasFocus() { + if handler := page.Item.PasteHandler(); handler != nil { + handler(pastedText, setFocus) + return + } + } + } + }) +} diff --git a/vendor/github.com/rivo/tview/primitive.go b/vendor/github.com/rivo/tview/primitive.go new file mode 100644 index 00000000..6badaeea --- /dev/null +++ b/vendor/github.com/rivo/tview/primitive.go @@ -0,0 +1,69 @@ +package tview + +import "github.com/gdamore/tcell/v2" + +// Primitive is the top-most interface for all graphical primitives. +type Primitive interface { + // Draw draws this primitive onto the screen. Implementers can call the + // screen's ShowCursor() function but should only do so when they have focus. + // (They will need to keep track of this themselves.) + Draw(screen tcell.Screen) + + // GetRect returns the current position of the primitive, x, y, width, and + // height. + GetRect() (int, int, int, int) + + // SetRect sets a new position of the primitive. + SetRect(x, y, width, height int) + + // InputHandler returns a handler which receives key events when it has focus. + // It is called by the Application class. + // + // A value of nil may also be returned, in which case this primitive cannot + // receive focus and will not process any key events. + // + // The handler will receive the key event and a function that allows it to + // set the focus to a different primitive, so that future key events are sent + // to that primitive. + // + // The Application's Draw() function will be called automatically after the + // handler returns. + // + // The Box class provides functionality to intercept keyboard input. If you + // subclass from Box, it is recommended that you wrap your handler using + // Box.WrapInputHandler() so you inherit that functionality. + InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) + + // Focus is called by the application when the primitive receives focus. + // Implementers may call delegate() to pass the focus on to another primitive. + Focus(delegate func(p Primitive)) + + // HasFocus determines if the primitive has focus. This function must return + // true also if one of this primitive's child elements has focus. + HasFocus() bool + + // Blur is called by the application when the primitive loses focus. + Blur() + + // MouseHandler returns a handler which receives mouse events. + // It is called by the Application class. + // + // A value of nil may also be returned to stop the downward propagation of + // mouse events. + // + // The Box class provides functionality to intercept mouse events. If you + // subclass from Box, it is recommended that you wrap your handler using + // Box.WrapMouseHandler() so you inherit that functionality. + MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) + + // PasteHandler returns a handler which receives pasted text. + // It is called by the Application class. + // + // A value of nil may also be returned to stop the downward propagation of + // paste events. + // + // The Box class may provide functionality to intercept paste events in the + // future. If you subclass from Box, it is recommended that you wrap your + // handler using Box.WrapPasteHandler() so you inherit that functionality. + PasteHandler() func(text string, setFocus func(p Primitive)) +} diff --git a/vendor/github.com/rivo/tview/semigraphics.go b/vendor/github.com/rivo/tview/semigraphics.go new file mode 100644 index 00000000..a05880a5 --- /dev/null +++ b/vendor/github.com/rivo/tview/semigraphics.go @@ -0,0 +1,328 @@ +package tview + +import "github.com/gdamore/tcell/v2" + +// Semigraphics provides an easy way to access unicode characters for drawing. +// +// Named like the unicode characters, 'Semigraphics'-prefix used if unicode block +// isn't prefixed itself. +const ( + // Block: General Punctuation U+2000-U+206F (http://unicode.org/charts/PDF/U2000.pdf) + SemigraphicsHorizontalEllipsis rune = '\u2026' // … + + // Block: Box Drawing U+2500-U+257F (http://unicode.org/charts/PDF/U2500.pdf) + BoxDrawingsLightHorizontal rune = '\u2500' // ─ + BoxDrawingsHeavyHorizontal rune = '\u2501' // ━ + BoxDrawingsLightVertical rune = '\u2502' // │ + BoxDrawingsHeavyVertical rune = '\u2503' // ┃ + BoxDrawingsLightTripleDashHorizontal rune = '\u2504' // ┄ + BoxDrawingsHeavyTripleDashHorizontal rune = '\u2505' // ┅ + BoxDrawingsLightTripleDashVertical rune = '\u2506' // ┆ + BoxDrawingsHeavyTripleDashVertical rune = '\u2507' // ┇ + BoxDrawingsLightQuadrupleDashHorizontal rune = '\u2508' // ┈ + BoxDrawingsHeavyQuadrupleDashHorizontal rune = '\u2509' // ┉ + BoxDrawingsLightQuadrupleDashVertical rune = '\u250a' // ┊ + BoxDrawingsHeavyQuadrupleDashVertical rune = '\u250b' // ┋ + BoxDrawingsLightDownAndRight rune = '\u250c' // ┌ + BoxDrawingsDownLightAndRightHeavy rune = '\u250d' // ┍ + BoxDrawingsDownHeavyAndRightLight rune = '\u250e' // ┎ + BoxDrawingsHeavyDownAndRight rune = '\u250f' // ┏ + BoxDrawingsLightDownAndLeft rune = '\u2510' // ┐ + BoxDrawingsDownLightAndLeftHeavy rune = '\u2511' // ┑ + BoxDrawingsDownHeavyAndLeftLight rune = '\u2512' // ┒ + BoxDrawingsHeavyDownAndLeft rune = '\u2513' // ┓ + BoxDrawingsLightUpAndRight rune = '\u2514' // └ + BoxDrawingsUpLightAndRightHeavy rune = '\u2515' // ┕ + BoxDrawingsUpHeavyAndRightLight rune = '\u2516' // ┖ + BoxDrawingsHeavyUpAndRight rune = '\u2517' // ┗ + BoxDrawingsLightUpAndLeft rune = '\u2518' // ┘ + BoxDrawingsUpLightAndLeftHeavy rune = '\u2519' // ┙ + BoxDrawingsUpHeavyAndLeftLight rune = '\u251a' // ┚ + BoxDrawingsHeavyUpAndLeft rune = '\u251b' // ┛ + BoxDrawingsLightVerticalAndRight rune = '\u251c' // ├ + BoxDrawingsVerticalLightAndRightHeavy rune = '\u251d' // ┝ + BoxDrawingsUpHeavyAndRightDownLight rune = '\u251e' // ┞ + BoxDrawingsDownHeavyAndRightUpLight rune = '\u251f' // ┟ + BoxDrawingsVerticalHeavyAndRightLight rune = '\u2520' // ┠ + BoxDrawingsDownLightAndRightUpHeavy rune = '\u2521' // ┡ + BoxDrawingsUpLightAndRightDownHeavy rune = '\u2522' // ┢ + BoxDrawingsHeavyVerticalAndRight rune = '\u2523' // ┣ + BoxDrawingsLightVerticalAndLeft rune = '\u2524' // ┤ + BoxDrawingsVerticalLightAndLeftHeavy rune = '\u2525' // ┥ + BoxDrawingsUpHeavyAndLeftDownLight rune = '\u2526' // ┦ + BoxDrawingsDownHeavyAndLeftUpLight rune = '\u2527' // ┧ + BoxDrawingsVerticalHeavyAndLeftLight rune = '\u2528' // ┨ + BoxDrawingsDownLightAndLeftUpHeavy rune = '\u2529' // ┨ + BoxDrawingsUpLightAndLeftDownHeavy rune = '\u252a' // ┪ + BoxDrawingsHeavyVerticalAndLeft rune = '\u252b' // ┫ + BoxDrawingsLightDownAndHorizontal rune = '\u252c' // ┬ + BoxDrawingsLeftHeavyAndRightDownLight rune = '\u252d' // ┭ + BoxDrawingsRightHeavyAndLeftDownLight rune = '\u252e' // ┮ + BoxDrawingsDownLightAndHorizontalHeavy rune = '\u252f' // ┯ + BoxDrawingsDownHeavyAndHorizontalLight rune = '\u2530' // ┰ + BoxDrawingsRightLightAndLeftDownHeavy rune = '\u2531' // ┱ + BoxDrawingsLeftLightAndRightDownHeavy rune = '\u2532' // ┲ + BoxDrawingsHeavyDownAndHorizontal rune = '\u2533' // ┳ + BoxDrawingsLightUpAndHorizontal rune = '\u2534' // ┴ + BoxDrawingsLeftHeavyAndRightUpLight rune = '\u2535' // ┵ + BoxDrawingsRightHeavyAndLeftUpLight rune = '\u2536' // ┶ + BoxDrawingsUpLightAndHorizontalHeavy rune = '\u2537' // ┷ + BoxDrawingsUpHeavyAndHorizontalLight rune = '\u2538' // ┸ + BoxDrawingsRightLightAndLeftUpHeavy rune = '\u2539' // ┹ + BoxDrawingsLeftLightAndRightUpHeavy rune = '\u253a' // ┺ + BoxDrawingsHeavyUpAndHorizontal rune = '\u253b' // ┻ + BoxDrawingsLightVerticalAndHorizontal rune = '\u253c' // ┼ + BoxDrawingsLeftHeavyAndRightVerticalLight rune = '\u253d' // ┽ + BoxDrawingsRightHeavyAndLeftVerticalLight rune = '\u253e' // ┾ + BoxDrawingsVerticalLightAndHorizontalHeavy rune = '\u253f' // ┿ + BoxDrawingsUpHeavyAndDownHorizontalLight rune = '\u2540' // ╀ + BoxDrawingsDownHeavyAndUpHorizontalLight rune = '\u2541' // ╁ + BoxDrawingsVerticalHeavyAndHorizontalLight rune = '\u2542' // ╂ + BoxDrawingsLeftUpHeavyAndRightDownLight rune = '\u2543' // ╃ + BoxDrawingsRightUpHeavyAndLeftDownLight rune = '\u2544' // ╄ + BoxDrawingsLeftDownHeavyAndRightUpLight rune = '\u2545' // ╅ + BoxDrawingsRightDownHeavyAndLeftUpLight rune = '\u2546' // ╆ + BoxDrawingsDownLightAndUpHorizontalHeavy rune = '\u2547' // ╇ + BoxDrawingsUpLightAndDownHorizontalHeavy rune = '\u2548' // ╈ + BoxDrawingsRightLightAndLeftVerticalHeavy rune = '\u2549' // ╉ + BoxDrawingsLeftLightAndRightVerticalHeavy rune = '\u254a' // ╊ + BoxDrawingsHeavyVerticalAndHorizontal rune = '\u254b' // ╋ + BoxDrawingsLightDoubleDashHorizontal rune = '\u254c' // ╌ + BoxDrawingsHeavyDoubleDashHorizontal rune = '\u254d' // ╍ + BoxDrawingsLightDoubleDashVertical rune = '\u254e' // ╎ + BoxDrawingsHeavyDoubleDashVertical rune = '\u254f' // ╏ + BoxDrawingsDoubleHorizontal rune = '\u2550' // ═ + BoxDrawingsDoubleVertical rune = '\u2551' // ║ + BoxDrawingsDownSingleAndRightDouble rune = '\u2552' // ╒ + BoxDrawingsDownDoubleAndRightSingle rune = '\u2553' // ╓ + BoxDrawingsDoubleDownAndRight rune = '\u2554' // ╔ + BoxDrawingsDownSingleAndLeftDouble rune = '\u2555' // ╕ + BoxDrawingsDownDoubleAndLeftSingle rune = '\u2556' // ╖ + BoxDrawingsDoubleDownAndLeft rune = '\u2557' // ╗ + BoxDrawingsUpSingleAndRightDouble rune = '\u2558' // ╘ + BoxDrawingsUpDoubleAndRightSingle rune = '\u2559' // ╙ + BoxDrawingsDoubleUpAndRight rune = '\u255a' // ╚ + BoxDrawingsUpSingleAndLeftDouble rune = '\u255b' // ╛ + BoxDrawingsUpDoubleAndLeftSingle rune = '\u255c' // ╜ + BoxDrawingsDoubleUpAndLeft rune = '\u255d' // ╝ + BoxDrawingsVerticalSingleAndRightDouble rune = '\u255e' // ╞ + BoxDrawingsVerticalDoubleAndRightSingle rune = '\u255f' // ╟ + BoxDrawingsDoubleVerticalAndRight rune = '\u2560' // ╠ + BoxDrawingsVerticalSingleAndLeftDouble rune = '\u2561' // ╡ + BoxDrawingsVerticalDoubleAndLeftSingle rune = '\u2562' // ╢ + BoxDrawingsDoubleVerticalAndLeft rune = '\u2563' // ╣ + BoxDrawingsDownSingleAndHorizontalDouble rune = '\u2564' // ╤ + BoxDrawingsDownDoubleAndHorizontalSingle rune = '\u2565' // ╥ + BoxDrawingsDoubleDownAndHorizontal rune = '\u2566' // ╦ + BoxDrawingsUpSingleAndHorizontalDouble rune = '\u2567' // ╧ + BoxDrawingsUpDoubleAndHorizontalSingle rune = '\u2568' // ╨ + BoxDrawingsDoubleUpAndHorizontal rune = '\u2569' // ╩ + BoxDrawingsVerticalSingleAndHorizontalDouble rune = '\u256a' // ╪ + BoxDrawingsVerticalDoubleAndHorizontalSingle rune = '\u256b' // ╫ + BoxDrawingsDoubleVerticalAndHorizontal rune = '\u256c' // ╬ + BoxDrawingsLightArcDownAndRight rune = '\u256d' // ╭ + BoxDrawingsLightArcDownAndLeft rune = '\u256e' // ╮ + BoxDrawingsLightArcUpAndLeft rune = '\u256f' // ╯ + BoxDrawingsLightArcUpAndRight rune = '\u2570' // ╰ + BoxDrawingsLightDiagonalUpperRightToLowerLeft rune = '\u2571' // ╱ + BoxDrawingsLightDiagonalUpperLeftToLowerRight rune = '\u2572' // ╲ + BoxDrawingsLightDiagonalCross rune = '\u2573' // ╳ + BoxDrawingsLightLeft rune = '\u2574' // ╴ + BoxDrawingsLightUp rune = '\u2575' // ╵ + BoxDrawingsLightRight rune = '\u2576' // ╶ + BoxDrawingsLightDown rune = '\u2577' // ╷ + BoxDrawingsHeavyLeft rune = '\u2578' // ╸ + BoxDrawingsHeavyUp rune = '\u2579' // ╹ + BoxDrawingsHeavyRight rune = '\u257a' // ╺ + BoxDrawingsHeavyDown rune = '\u257b' // ╻ + BoxDrawingsLightLeftAndHeavyRight rune = '\u257c' // ╼ + BoxDrawingsLightUpAndHeavyDown rune = '\u257d' // ╽ + BoxDrawingsHeavyLeftAndLightRight rune = '\u257e' // ╾ + BoxDrawingsHeavyUpAndLightDown rune = '\u257f' // ╿ + + // Block Elements. + BlockUpperHalfBlock rune = '\u2580' // ▀ + BlockLowerOneEighthBlock rune = '\u2581' // ▁ + BlockLowerOneQuarterBlock rune = '\u2582' // ▂ + BlockLowerThreeEighthsBlock rune = '\u2583' // ▃ + BlockLowerHalfBlock rune = '\u2584' // ▄ + BlockLowerFiveEighthsBlock rune = '\u2585' // ▅ + BlockLowerThreeQuartersBlock rune = '\u2586' // ▆ + BlockLowerSevenEighthsBlock rune = '\u2587' // ▇ + BlockFullBlock rune = '\u2588' // █ + BlockLeftSevenEighthsBlock rune = '\u2589' // ▉ + BlockLeftThreeQuartersBlock rune = '\u258A' // ▊ + BlockLeftFiveEighthsBlock rune = '\u258B' // ▋ + BlockLeftHalfBlock rune = '\u258C' // ▌ + BlockLeftThreeEighthsBlock rune = '\u258D' // ▍ + BlockLeftOneQuarterBlock rune = '\u258E' // ▎ + BlockLeftOneEighthBlock rune = '\u258F' // ▏ + BlockRightHalfBlock rune = '\u2590' // ▐ + BlockLightShade rune = '\u2591' // ░ + BlockMediumShade rune = '\u2592' // ▒ + BlockDarkShade rune = '\u2593' // ▓ + BlockUpperOneEighthBlock rune = '\u2594' // ▔ + BlockRightOneEighthBlock rune = '\u2595' // ▕ + BlockQuadrantLowerLeft rune = '\u2596' // ▖ + BlockQuadrantLowerRight rune = '\u2597' // ▗ + BlockQuadrantUpperLeft rune = '\u2598' // ▘ + BlockQuadrantUpperLeftAndLowerLeftAndLowerRight rune = '\u2599' // ▙ + BlockQuadrantUpperLeftAndLowerRight rune = '\u259A' // ▚ + BlockQuadrantUpperLeftAndUpperRightAndLowerLeft rune = '\u259B' // ▛ + BlockQuadrantUpperLeftAndUpperRightAndLowerRight rune = '\u259C' // ▜ + BlockQuadrantUpperRight rune = '\u259D' // ▝ + BlockQuadrantUpperRightAndLowerLeft rune = '\u259E' // ▞ + BlockQuadrantUpperRightAndLowerLeftAndLowerRight rune = '\u259F' // ▟ +) + +// SemigraphicJoints is a map for joining semigraphic (or otherwise) runes. +// So far only light lines are supported but if you want to change the border +// styling you need to provide the joints, too. +// The matching will be sorted ascending by rune value, so you don't need to +// provide all rune combinations, +// e.g. (─) + (│) = (┼) will also match (│) + (─) = (┼) +var SemigraphicJoints = map[string]rune{ + // (─) + (│) = (┼) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVertical}): BoxDrawingsLightVerticalAndHorizontal, + // (─) + (┌) = (┬) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndRight}): BoxDrawingsLightDownAndHorizontal, + // (─) + (┐) = (┬) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightDownAndHorizontal, + // (─) + (└) = (┴) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndRight}): BoxDrawingsLightUpAndHorizontal, + // (─) + (┘) = (┴) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightUpAndHorizontal, + // (─) + (├) = (┼) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal, + // (─) + (┤) = (┼) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal, + // (─) + (┬) = (┬) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal, + // (─) + (┴) = (┴) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal, + // (─) + (┼) = (┼) + string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (│) + (┌) = (├) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndRight}): BoxDrawingsLightVerticalAndRight, + // (│) + (┐) = (┤) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightVerticalAndLeft, + // (│) + (└) = (├) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndRight, + // (│) + (┘) = (┤) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndLeft, + // (│) + (├) = (├) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight, + // (│) + (┤) = (┤) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft, + // (│) + (┬) = (┼) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (│) + (┴) = (┼) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (│) + (┼) = (┼) + string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (┌) + (┐) = (┬) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightDownAndHorizontal, + // (┌) + (└) = (├) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndRight, + // (┌) + (┘) = (┼) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndHorizontal, + // (┌) + (├) = (├) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight, + // (┌) + (┤) = (┼) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal, + // (┌) + (┬) = (┬) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal, + // (┌) + (┴) = (┼) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (┌) + (┴) = (┼) + string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (┐) + (└) = (┼) + string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndHorizontal, + // (┐) + (┘) = (┤) + string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndLeft, + // (┐) + (├) = (┼) + string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal, + // (┐) + (┤) = (┤) + string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft, + // (┐) + (┬) = (┬) + string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal, + // (┐) + (┴) = (┼) + string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (┐) + (┼) = (┼) + string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (└) + (┘) = (┴) + string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightUpAndHorizontal, + // (└) + (├) = (├) + string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight, + // (└) + (┤) = (┼) + string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal, + // (└) + (┬) = (┼) + string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (└) + (┴) = (┴) + string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal, + // (└) + (┼) = (┼) + string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (┘) + (├) = (┼) + string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal, + // (┘) + (┤) = (┤) + string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft, + // (┘) + (┬) = (┼) + string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (┘) + (┴) = (┴) + string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal, + // (┘) + (┼) = (┼) + string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (├) + (┤) = (┼) + string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal, + // (├) + (┬) = (┼) + string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (├) + (┴) = (┼) + string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (├) + (┼) = (┼) + string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (┤) + (┬) = (┼) + string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (┤) + (┴) = (┼) + string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (┤) + (┼) = (┼) + string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (┬) + (┴) = (┼) + string([]rune{BoxDrawingsLightDownAndHorizontal, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + // (┬) + (┼) = (┼) + string([]rune{BoxDrawingsLightDownAndHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, + + // (┴) + (┼) = (┼) + string([]rune{BoxDrawingsLightUpAndHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal, +} + +// PrintJoinedSemigraphics prints a semigraphics rune into the screen at the given +// position with the given style, joining it with any existing semigraphics +// rune.At this point, only regular single line borders are supported. +func PrintJoinedSemigraphics(screen tcell.Screen, x, y int, ch rune, style tcell.Style) { + previous, _, _, _ := screen.GetContent(x, y) + + // What's the resulting rune? + var result rune + if ch == previous { + result = ch + } else { + if ch < previous { + previous, ch = ch, previous + } + result = SemigraphicJoints[string([]rune{previous, ch})] + } + if result == 0 { + result = ch + } + + // We only print something if we have something. + screen.SetContent(x, y, result, nil, style) +} diff --git a/vendor/github.com/rivo/tview/strings.go b/vendor/github.com/rivo/tview/strings.go new file mode 100644 index 00000000..1c13fe23 --- /dev/null +++ b/vendor/github.com/rivo/tview/strings.go @@ -0,0 +1,634 @@ +package tview + +import ( + "math/rand" + "regexp" + "strconv" + "strings" + "unicode/utf8" + + "github.com/gdamore/tcell/v2" + "github.com/rivo/uniseg" +) + +// escapedTagPattern matches an escaped tag, e.g. "[red[]", at the beginning of +// a string. +var escapedTagPattern = regexp.MustCompile(`^\[[^\[\]]+\[+\]`) + +// stepOptions is a bit field of options for [step]. A value of 0 results in +// [step] having the same behavior as uniseg.Step, i.e. no tview-related parsing +// is performed. +type stepOptions int + +// Bit fields for [stepOptions]. +const ( + stepOptionsNone stepOptions = 0 + stepOptionsStyle stepOptions = 1 << iota // Parse style tags. + stepOptionsRegion // Parse region tags. +) + +// stepState represents the current state of the parser implemented in [step]. +type stepState struct { + unisegState int // The state of the uniseg parser. + boundaries int // Information about boundaries, as returned by uniseg.Step. + style tcell.Style // The current style. + region string // The current region. + escapedTagState int // States for parsing escaped tags (defined in [step]). + grossLength int // The length of the cluster, including any tags not returned. + + // The styles for the initial call to [step]. + initialForeground tcell.Color + initialBackground tcell.Color + initialAttributes tcell.AttrMask +} + +// IsWordBoundary returns true if the boundary between the returned grapheme +// cluster and the one following it is a word boundary. +func (s *stepState) IsWordBoundary() bool { + return s.boundaries&uniseg.MaskWord != 0 +} + +// IsSentenceBoundary returns true if the boundary between the returned grapheme +// cluster and the one following it is a sentence boundary. +func (s *stepState) IsSentenceBoundary() bool { + return s.boundaries&uniseg.MaskSentence != 0 +} + +// LineBreak returns whether the string can be broken into the next line after +// the returned grapheme cluster. If optional is true, the line break is +// optional. If false, the line break is mandatory, e.g. after a newline +// character. +func (s *stepState) LineBreak() (lineBreak, optional bool) { + switch s.boundaries & uniseg.MaskLine { + case uniseg.LineCanBreak: + return true, true + case uniseg.LineMustBreak: + return true, false + } + return false, false // uniseg.LineDontBreak. +} + +// Width returns the grapheme cluster's width in cells. +func (s *stepState) Width() int { + return s.boundaries >> uniseg.ShiftWidth +} + +// GrossLength returns the grapheme cluster's length in bytes, including any +// tags that were parsed but not explicitly returned. +func (s *stepState) GrossLength() int { + return s.grossLength +} + +// Style returns the style for the grapheme cluster. +func (s *stepState) Style() tcell.Style { + return s.style +} + +// step uses uniseg.Step to iterate over the grapheme clusters of a string but +// (optionally) also parses the string for style or region tags. +// +// This function can be called consecutively to extract all grapheme clusters +// from str, without returning any contained (parsed) tags. The return values +// are the first grapheme cluster, the remaining string, and the new state. Pass +// the remaining string and the returned state to the next call. If the rest +// string is empty, parsing is complete. Call the returned state's methods for +// boundary and cluster width information. +// +// The returned cluster may be empty if the given string consists of only +// (parsed) tags. The boundary and width information will be meaningless in +// this case but the style will describe the style at the end of the string. +// +// Pass nil for state on the first call. This will assume an initial style with +// [Styles.PrimitiveBackgroundColor] as the background color and +// [Styles.PrimaryTextColor] as the text color, no current region. If you want +// to start with a different style or region, you can set the state accordingly +// but you must then set [state.unisegState] to -1. +// +// There is no need to call uniseg.HasTrailingLineBreakInString on the last +// non-empty cluster as this function will do this for you and adjust the +// returned boundaries accordingly. +func step(str string, state *stepState, opts stepOptions) (cluster, rest string, newState *stepState) { + // Set up initial state. + if state == nil { + state = &stepState{ + unisegState: -1, + style: tcell.StyleDefault.Background(Styles.PrimitiveBackgroundColor).Foreground(Styles.PrimaryTextColor), + } + } + if state.unisegState < 0 { + state.initialForeground, state.initialBackground, state.initialAttributes = state.style.Decompose() + } + if len(str) == 0 { + newState = state + return + } + + // Get a grapheme cluster. + preState := state.unisegState + cluster, rest, state.boundaries, state.unisegState = uniseg.StepString(str, preState) + state.grossLength = len(cluster) + if rest == "" { + if !uniseg.HasTrailingLineBreakInString(cluster) { + state.boundaries &^= uniseg.MaskLine + } + } + + // Parse tags. + if opts != 0 { + const ( + etNone int = iota + etStart + etChar + etClosing + ) + + // Finite state machine for escaped tags. + switch state.escapedTagState { + case etStart: + if cluster[0] == '[' || cluster[0] == ']' { // Invalid escaped tag. + state.escapedTagState = etNone + } else { // Other characters are allowed. + state.escapedTagState = etChar + } + case etChar: + if cluster[0] == ']' { // In theory, this should not happen. + state.escapedTagState = etNone + } else if cluster[0] == '[' { // Starting closing sequence. + // Swallow the first one. + cluster, rest, state.boundaries, state.unisegState = uniseg.StepString(rest, preState) + state.grossLength += len(cluster) + if cluster[0] == ']' { + state.escapedTagState = etNone + } else { + state.escapedTagState = etClosing + } + } // More characters. Remain in etChar. + case etClosing: + if cluster[0] != '[' { + state.escapedTagState = etNone + } + } + + // Regular tags. + if state.escapedTagState == etNone { + if cluster[0] == '[' { + // We've already opened a tag. Parse it. + length, style, region := parseTag(str, state) + if length > 0 { + state.style = style + state.region = region + cluster, rest, state.boundaries, state.unisegState = uniseg.StepString(str[length:], preState) + state.grossLength = len(cluster) + length + if rest == "" { + if !uniseg.HasTrailingLineBreakInString(cluster) { + state.boundaries &^= uniseg.MaskLine + } + } + } + // Is this an escaped tag? + if escapedTagPattern.MatchString(str[length:]) { + state.escapedTagState = etStart + } + } + if len(rest) > 0 && rest[0] == '[' { + // A tag might follow the cluster. If so, we need to fix the state + // for the boundaries to be correct. + if length, _, _ := parseTag(rest, state); length > 0 { + if len(rest) > length { + _, l := utf8.DecodeRuneInString(rest[length:]) + cluster += rest[length : length+l] + } + var taglessRest string + cluster, taglessRest, state.boundaries, state.unisegState = uniseg.StepString(cluster, preState) + if taglessRest == "" { + if !uniseg.HasTrailingLineBreakInString(cluster) { + state.boundaries &^= uniseg.MaskLine + } + } + } + } + } + } + + newState = state + return +} + +// parseTag parses str for consecutive style and/or region tags, assuming that +// str starts with the opening bracket for the first tag. It returns the string +// length of all valid tags (0 if the first tag is not valid) and the updated +// style and region for valid tags (based on the provided state). +func parseTag(str string, state *stepState) (length int, style tcell.Style, region string) { + // Automata states for parsing tags. + const ( + tagStateNone = iota + tagStateDoneTag + tagStateStart + tagStateRegionStart + tagStateEndForeground + tagStateStartBackground + tagStateNumericForeground + tagStateNameForeground + tagStateEndBackground + tagStateStartAttributes + tagStateNumericBackground + tagStateNameBackground + tagStateAttributes + tagStateRegionEnd + tagStateRegionName + tagStateEndAttributes + tagStateStartURL + tagStateEndURL + tagStateURL + ) + + // Helper function which checks if the given byte is one of a list of + // characters, including letters and digits. + isOneOf := func(b byte, chars string) bool { + if b >= 'a' && b <= 'z' || b >= 'A' && b <= 'Z' || b >= '0' && b <= '9' { + return true + } + return strings.IndexByte(chars, b) >= 0 + } + + // Attribute map. + attrs := map[byte]tcell.AttrMask{ + 'B': tcell.AttrBold, + 'I': tcell.AttrItalic, + 'L': tcell.AttrBlink, + 'D': tcell.AttrDim, + 'S': tcell.AttrStrikeThrough, + 'R': tcell.AttrReverse, + } + + var ( + tagState, tagLength int + tempStr strings.Builder + ) + tStyle := state.style + tRegion := state.region + + // Process state transitions. + for len(str) > 0 { + ch := str[0] + str = str[1:] + tagLength++ + + // Transition. + switch tagState { + case tagStateNone: + if ch == '[' { // Start of a tag. + tagState = tagStateStart + } else { // Not a tag. We're done. + return + } + case tagStateStart: + switch { + case ch == '"': // Start of a region tag. + tempStr.Reset() + tagState = tagStateRegionStart + case !isOneOf(ch, "#:-"): // Invalid style tag. + return + case ch == '-': // Reset foreground color. + tStyle = tStyle.Foreground(state.initialForeground) + tagState = tagStateEndForeground + case ch == ':': // No foreground color. + tagState = tagStateStartBackground + default: + tempStr.Reset() + tempStr.WriteByte(ch) + if ch == '#' { // Numeric foreground color. + tagState = tagStateNumericForeground + } else { // Letters or numbers. + tagState = tagStateNameForeground + } + } + case tagStateEndForeground: + switch ch { + case ']': // End of tag. + tagState = tagStateDoneTag + case ':': + tagState = tagStateStartBackground + default: // Invalid tag. + return + } + case tagStateNumericForeground: + if ch == ']' || ch == ':' { + if tempStr.Len() != 7 { // Must be #rrggbb. + return + } + tStyle = tStyle.Foreground(tcell.GetColor(tempStr.String())) + } + switch { + case ch == ']': // End of tag. + tagState = tagStateDoneTag + case ch == ':': // Start of background color. + tagState = tagStateStartBackground + case strings.IndexByte("0123456789abcdefABCDEF", ch) >= 0: // Hex digit. + tempStr.WriteByte(ch) + tagState = tagStateNumericForeground + default: // Invalid tag. + return + } + case tagStateNameForeground: + if ch == ']' || ch == ':' { + name := tempStr.String() + if name[0] >= '0' && name[0] <= '9' { // Must not start with a digit. + return + } + tStyle = tStyle.Foreground(tcell.ColorNames[name]) + } + switch { + case !isOneOf(ch, "]:"): // Invalid tag. + return + case ch == ']': // End of tag. + tagState = tagStateDoneTag + case ch == ':': // Start of background color. + tagState = tagStateStartBackground + default: // Letters or numbers. + tempStr.WriteByte(ch) + } + case tagStateStartBackground: + switch { + case !isOneOf(ch, "#:-]"): // Invalid style tag. + return + case ch == ']': // End of tag. + tagState = tagStateDoneTag + case ch == '-': // Reset background color. + tStyle = tStyle.Background(state.initialBackground) + tagState = tagStateEndBackground + case ch == ':': // No background color. + tagState = tagStateStartAttributes + default: + tempStr.Reset() + tempStr.WriteByte(ch) + if ch == '#' { // Numeric background color. + tagState = tagStateNumericBackground + } else { // Letters or numbers. + tagState = tagStateNameBackground + } + } + case tagStateEndBackground: + switch ch { + case ']': // End of tag. + tagState = tagStateDoneTag + case ':': // Start of attributes. + tagState = tagStateStartAttributes + default: // Invalid tag. + return + } + case tagStateNumericBackground: + if ch == ']' || ch == ':' { + if tempStr.Len() != 7 { // Must be #rrggbb. + return + } + tStyle = tStyle.Background(tcell.GetColor(tempStr.String())) + } + if ch == ']' { // End of tag. + tagState = tagStateDoneTag + } else if ch == ':' { // Start of attributes. + tagState = tagStateStartAttributes + } else if strings.IndexByte("0123456789abcdefABCDEF", ch) >= 0 { // Hex digit. + tempStr.WriteByte(ch) + tagState = tagStateNumericBackground + } else { // Invalid tag. + return + } + case tagStateNameBackground: + if ch == ']' || ch == ':' { + name := tempStr.String() + if name[0] >= '0' && name[0] <= '9' { // Must not start with a digit. + return + } + tStyle = tStyle.Background(tcell.ColorNames[name]) + } + switch { + case !isOneOf(ch, "]:"): // Invalid tag. + return + case ch == ']': // End of tag. + tagState = tagStateDoneTag + case ch == ':': // Start of background color. + tagState = tagStateStartAttributes + default: // Letters or numbers. + tempStr.WriteByte(ch) + } + case tagStateStartAttributes: + switch { + case ch == ']': // End of tag. + tagState = tagStateDoneTag + case ch == '-': // Reset attributes. + tStyle = tStyle.Attributes(state.initialAttributes) + tagState = tagStateEndAttributes + case ch == ':': // Start of URL. + tagState = tagStateStartURL + case strings.IndexByte("buildsrBUILDSR", ch) >= 0: // Attribute tag. + tempStr.Reset() + tempStr.WriteByte(ch) + tagState = tagStateAttributes + default: // Invalid tag. + return + } + case tagStateAttributes: + if ch == ']' || ch == ':' { + flags := tempStr.String() + _, _, a := tStyle.Decompose() + for index := 0; index < len(flags); index++ { + ch := flags[index] + switch { + case ch == 'u': + tStyle = tStyle.Underline(true) + case ch == 'U': + tStyle = tStyle.Underline(false) + case ch >= 'a' && ch <= 'z': + a |= attrs[ch-('a'-'A')] + default: + a &^= attrs[ch] + } + } + tStyle = tStyle.Attributes(a) + } + switch { + case ch == ']': // End of tag. + tagState = tagStateDoneTag + case ch == ':': // Start of URL. + tagState = tagStateStartURL + case strings.IndexByte("buildsrBUILDSR", ch) >= 0: // Attribute tag. + tempStr.WriteByte(ch) + default: // Invalid tag. + return + } + case tagStateEndAttributes: + switch ch { + case ']': // End of tag. + tagState = tagStateDoneTag + case ':': // Start of URL. + tagState = tagStateStartURL + default: // Invalid tag. + return + } + case tagStateStartURL: + switch ch { + case ']': // End of tag. + tagState = tagStateDoneTag + case '-': // Reset URL. + tStyle = tStyle.Url("").UrlId("") + tagState = tagStateEndURL + default: // URL character. + tempStr.Reset() + tempStr.WriteByte(ch) + tStyle = tStyle.UrlId(strconv.Itoa(int(rand.Uint32()))) // Generate a unique ID for this URL. + tagState = tagStateURL + } + case tagStateEndURL: + if ch == ']' { // End of tag. + tagState = tagStateDoneTag + } else { // Invalid tag. + return + } + case tagStateURL: + if ch == ']' { // End of tag. + tStyle = tStyle.Url(tempStr.String()) + tagState = tagStateDoneTag + } else { // URL character. + tempStr.WriteByte(ch) + } + case tagStateRegionStart: + switch { + case ch == '"': // End of region tag. + tagState = tagStateRegionEnd + case isOneOf(ch, "_,;: -."): // Region name. + tempStr.WriteByte(ch) + tagState = tagStateRegionName + default: // Invalid tag. + return + } + case tagStateRegionEnd: + if ch == ']' { // End of tag. + tRegion = tempStr.String() + tagState = tagStateDoneTag + } else { // Invalid tag. + return + } + case tagStateRegionName: + switch { + case ch == '"': // End of region tag. + tagState = tagStateRegionEnd + case isOneOf(ch, "_,;: -."): // Region name. + tempStr.WriteByte(ch) + default: // Invalid tag. + return + } + } + + // The last transition led to a tag end. Make the tag permanent. + if tagState == tagStateDoneTag { + length, style, region = tagLength, tStyle, tRegion + tagState = tagStateNone // Reset state. + } + } + + return +} + +// TaggedStringWidth returns the width of the given string needed to print it on +// screen. The text may contain style tags which are not counted. +func TaggedStringWidth(text string) (width int) { + var state *stepState + for len(text) > 0 { + _, text, state = step(text, state, stepOptionsStyle) + width += state.Width() + } + return +} + +// WordWrap splits a text such that each resulting line does not exceed the +// given screen width. Split points are determined using the algorithm described +// in [Unicode Standard Annex #14]. +// +// This function considers style tags to have no width. +// +// [Unicode Standard Annex #14]: https://www.unicode.org/reports/tr14/ +func WordWrap(text string, width int) (lines []string) { + if width <= 0 { + return + } + + var ( + state *stepState + lineWidth, lineLength, lastOption, lastOptionWidth int + ) + str := text + for len(str) > 0 { + // Parse the next character. + _, str, state = step(str, state, stepOptionsStyle) + cWidth := state.Width() + + // Would it exceed the line width? + if lineWidth+cWidth > width { + if lastOptionWidth == 0 { + // No split point so far. Just split at the current position. + lines = append(lines, text[:lineLength]) + text = text[lineLength:] + lineWidth, lineLength, lastOption, lastOptionWidth = 0, 0, 0, 0 + } else { + // Split at the last split point. + lines = append(lines, text[:lastOption]) + text = text[lastOption:] + lineWidth -= lastOptionWidth + lineLength -= lastOption + lastOption, lastOptionWidth = 0, 0 + } + } + + // Move ahead. + lineWidth += cWidth + lineLength += state.GrossLength() + + // Check for split points. + if lineBreak, optional := state.LineBreak(); lineBreak { + if optional { + // Remember this split point. + lastOption = lineLength + lastOptionWidth = lineWidth + } else { + // We must split here. + lines = append(lines, strings.TrimRight(text[:lineLength], "\n\r")) + text = text[lineLength:] + lineWidth, lineLength, lastOption, lastOptionWidth = 0, 0, 0, 0 + } + } + } + lines = append(lines, text) + + return +} + +// Escape escapes the given text such that color and/or region tags are not +// recognized and substituted by the print functions of this package. For +// example, to include a tag-like string in a box title or in a TextView: +// +// box.SetTitle(tview.Escape("[squarebrackets]")) +// fmt.Fprint(textView, tview.Escape(`["quoted"]`)) +func Escape(text string) string { + return escapePattern.ReplaceAllString(text, "$1[]") +} + +// Unescape unescapes text previously escaped with [Escape]. +func Unescape(text string) string { + return unescapePattern.ReplaceAllString(text, "$1]") +} + +// stripTags strips style tags from the given string. (Region tags are not +// stripped.) +func stripTags(text string) string { + var ( + str strings.Builder + state *stepState + ) + for len(text) > 0 { + var c string + c, text, state = step(text, state, stepOptionsStyle) + str.WriteString(c) + } + return str.String() +} diff --git a/vendor/github.com/rivo/tview/styles.go b/vendor/github.com/rivo/tview/styles.go new file mode 100644 index 00000000..1a6f07e2 --- /dev/null +++ b/vendor/github.com/rivo/tview/styles.go @@ -0,0 +1,35 @@ +package tview + +import "github.com/gdamore/tcell/v2" + +// Theme defines the colors used when primitives are initialized. +type Theme struct { + PrimitiveBackgroundColor tcell.Color // Main background color for primitives. + ContrastBackgroundColor tcell.Color // Background color for contrasting elements. + MoreContrastBackgroundColor tcell.Color // Background color for even more contrasting elements. + BorderColor tcell.Color // Box borders. + TitleColor tcell.Color // Box titles. + GraphicsColor tcell.Color // Graphics. + PrimaryTextColor tcell.Color // Primary text. + SecondaryTextColor tcell.Color // Secondary text (e.g. labels). + TertiaryTextColor tcell.Color // Tertiary text (e.g. subtitles, notes). + InverseTextColor tcell.Color // Text on primary-colored backgrounds. + ContrastSecondaryTextColor tcell.Color // Secondary text on ContrastBackgroundColor-colored backgrounds. +} + +// Styles defines the theme for applications. The default is for a black +// background and some basic colors: black, white, yellow, green, cyan, and +// blue. +var Styles = Theme{ + PrimitiveBackgroundColor: tcell.ColorBlack, + ContrastBackgroundColor: tcell.ColorBlue, + MoreContrastBackgroundColor: tcell.ColorGreen, + BorderColor: tcell.ColorWhite, + TitleColor: tcell.ColorWhite, + GraphicsColor: tcell.ColorWhite, + PrimaryTextColor: tcell.ColorWhite, + SecondaryTextColor: tcell.ColorYellow, + TertiaryTextColor: tcell.ColorGreen, + InverseTextColor: tcell.ColorBlue, + ContrastSecondaryTextColor: tcell.ColorNavy, +} diff --git a/vendor/github.com/rivo/tview/table.go b/vendor/github.com/rivo/tview/table.go new file mode 100644 index 00000000..c04fc400 --- /dev/null +++ b/vendor/github.com/rivo/tview/table.go @@ -0,0 +1,1725 @@ +package tview + +import ( + "sort" + + "github.com/gdamore/tcell/v2" + colorful "github.com/lucasb-eyer/go-colorful" +) + +// TableCell represents one cell inside a Table. You can instantiate this type +// directly but all colors (background and text) will be set to their default +// which is black. +type TableCell struct { + // The reference object. + Reference interface{} + + // The text to be displayed in the table cell. + Text string + + // The alignment of the cell text. One of AlignLeft (default), AlignCenter, + // or AlignRight. + Align int + + // The maximum width of the cell in screen space. This is used to give a + // column a maximum width. Any cell text whose screen width exceeds this width + // is cut off. Set to 0 if there is no maximum width. + MaxWidth int + + // If the total table width is less than the available width, this value is + // used to add extra width to a column. See SetExpansion() for details. + Expansion int + + // The color of the cell text. You should not use this anymore, it is only + // here for backwards compatibility. Use the Style field instead. + Color tcell.Color + + // The background color of the cell. You should not use this anymore, it is + // only here for backwards compatibility. Use the Style field instead. + BackgroundColor tcell.Color + + // The style attributes of the cell. You should not use this anymore, it is + // only here for backwards compatibility. Use the Style field instead. + Attributes tcell.AttrMask + + // The style of the cell. If this is uninitialized (tcell.StyleDefault), the + // Color and BackgroundColor fields are used instead. + Style tcell.Style + + // The style of the cell when it is selected. If this is uninitialized + // (tcell.StyleDefault), the table's selected style is used instead. If that + // is uninitialized as well, the cell's background and text color are + // swapped. + SelectedStyle tcell.Style + + // If set to true, the BackgroundColor is not used and the cell will have + // the background color of the table. + Transparent bool + + // If set to true, this cell cannot be selected. + NotSelectable bool + + // An optional handler for mouse clicks. This also fires if the cell is not + // selectable. If true is returned, no additional "selected" event is fired + // on selectable cells. + Clicked func() bool + + // The position and width of the cell the last time table was drawn. + x, y, width int +} + +// NewTableCell returns a new table cell with sensible defaults. That is, left +// aligned text with the primary text color (see Styles) and a transparent +// background (using the background of the Table). +func NewTableCell(text string) *TableCell { + return &TableCell{ + Text: text, + Align: AlignLeft, + Style: tcell.StyleDefault.Foreground(Styles.PrimaryTextColor).Background(Styles.PrimitiveBackgroundColor), + Transparent: true, + } +} + +// SetText sets the cell's text. +func (c *TableCell) SetText(text string) *TableCell { + c.Text = text + return c +} + +// SetAlign sets the cell's text alignment, one of AlignLeft, AlignCenter, or +// AlignRight. +func (c *TableCell) SetAlign(align int) *TableCell { + c.Align = align + return c +} + +// SetMaxWidth sets maximum width of the cell in screen space. This is used to +// give a column a maximum width. Any cell text whose screen width exceeds this +// width is cut off. Set to 0 if there is no maximum width. +func (c *TableCell) SetMaxWidth(maxWidth int) *TableCell { + c.MaxWidth = maxWidth + return c +} + +// SetExpansion sets the value by which the column of this cell expands if the +// available width for the table is more than the table width (prior to applying +// this expansion value). This is a proportional value. The amount of unused +// horizontal space is divided into widths to be added to each column. How much +// extra width a column receives depends on the expansion value: A value of 0 +// (the default) will not cause the column to increase in width. Other values +// are proportional, e.g. a value of 2 will cause a column to grow by twice +// the amount of a column with a value of 1. +// +// Since this value affects an entire column, the maximum over all visible cells +// in that column is used. +// +// This function panics if a negative value is provided. +func (c *TableCell) SetExpansion(expansion int) *TableCell { + if expansion < 0 { + panic("Table cell expansion values may not be negative") + } + c.Expansion = expansion + return c +} + +// SetTextColor sets the cell's text color. +func (c *TableCell) SetTextColor(color tcell.Color) *TableCell { + if c.Style == tcell.StyleDefault { + c.Color = color + } else { + c.Style = c.Style.Foreground(color) + } + return c +} + +// SetBackgroundColor sets the cell's background color. This will also cause the +// cell's Transparent flag to be set to "false". +func (c *TableCell) SetBackgroundColor(color tcell.Color) *TableCell { + if c.Style == tcell.StyleDefault { + c.BackgroundColor = color + } else { + c.Style = c.Style.Background(color) + } + c.Transparent = false + return c +} + +// SetTransparency sets the background transparency of this cell. A value of +// "true" will cause the cell to use the table's background color. A value of +// "false" will cause it to use its own background color. +func (c *TableCell) SetTransparency(transparent bool) *TableCell { + c.Transparent = transparent + return c +} + +// SetAttributes sets the cell's text attributes. You can combine different +// attributes using bitmask operations: +// +// cell.SetAttributes(tcell.AttrItalic | tcell.AttrBold) +func (c *TableCell) SetAttributes(attr tcell.AttrMask) *TableCell { + if c.Style == tcell.StyleDefault { + c.Attributes = attr + } else { + c.Style = c.Style.Attributes(attr) + } + return c +} + +// SetStyle sets the cell's style (foreground color, background color, and +// attributes) all at once. +func (c *TableCell) SetStyle(style tcell.Style) *TableCell { + c.Style = style + return c +} + +// SetSelectedStyle sets the cell's style when it is selected. If this is +// uninitialized (tcell.StyleDefault), the table's selected style is used +// instead. If that is uninitialized as well, the cell's background and text +// color are swapped. +func (c *TableCell) SetSelectedStyle(style tcell.Style) *TableCell { + c.SelectedStyle = style + return c +} + +// SetSelectable sets whether or not this cell can be selected by the user. +func (c *TableCell) SetSelectable(selectable bool) *TableCell { + c.NotSelectable = !selectable + return c +} + +// SetReference allows you to store a reference of any type in this cell. This +// will allow you to establish a mapping between the cell and your +// actual data. +func (c *TableCell) SetReference(reference interface{}) *TableCell { + c.Reference = reference + return c +} + +// GetReference returns this cell's reference object. +func (c *TableCell) GetReference() interface{} { + return c.Reference +} + +// GetLastPosition returns the position of the table cell the last time it was +// drawn on screen. If the cell is not on screen, the return values are +// undefined. +// +// Because the Table class will attempt to keep selected cells on screen, this +// function is most useful in response to a "selected" event (see +// SetSelectedFunc()) or a "selectionChanged" event (see +// SetSelectionChangedFunc()). +func (c *TableCell) GetLastPosition() (x, y, width int) { + return c.x, c.y, c.width +} + +// SetClickedFunc sets a handler which fires when this cell is clicked. This is +// independent of whether the cell is selectable or not. But for selectable +// cells, if the function returns "true", the "selected" event is not fired. +func (c *TableCell) SetClickedFunc(clicked func() bool) *TableCell { + c.Clicked = clicked + return c +} + +// TableContent defines a Table's data. You may replace a Table's default +// implementation with your own using the Table.SetContent() function. This will +// allow you to turn Table into a view of your own data structure. The +// Table.Draw() function, which is called when the screen is updated, will then +// use the (read-only) functions of this interface to update the table. The +// write functions are only called when the corresponding functions of Table are +// called. +// +// The interface's read-only functions are not called concurrently by the +// package (provided that users of the package don't call Table.Draw() in a +// separate goroutine, which would be uncommon and is not encouraged). +type TableContent interface { + // Return the cell at the given position or nil if there is no cell. The + // row and column arguments start at 0 and end at what GetRowCount() and + // GetColumnCount() return, minus 1. + GetCell(row, column int) *TableCell + + // Return the total number of rows in the table. + GetRowCount() int + + // Return the total number of columns in the table. + GetColumnCount() int + + // The following functions are provided for completeness reasons as the + // original Table implementation was not read-only. If you do not wish to + // forward modifying operations to your data, you may opt to leave these + // functions empty. To make this easier, you can include the + // TableContentReadOnly type in your struct. See also the + // demos/table/virtualtable example. + + // Set the cell at the given position to the provided cell. + SetCell(row, column int, cell *TableCell) + + // Remove the row at the given position by shifting all following rows up + // by one. Out of range positions may be ignored. + RemoveRow(row int) + + // Remove the column at the given position by shifting all following columns + // left by one. Out of range positions may be ignored. + RemoveColumn(column int) + + // Insert a new empty row at the given position by shifting all rows at that + // position and below down by one. Implementers may decide what to do with + // out of range positions. + InsertRow(row int) + + // Insert a new empty column at the given position by shifting all columns + // at that position and to the right by one to the right. Implementers may + // decide what to do with out of range positions. + InsertColumn(column int) + + // Remove all table data. + Clear() +} + +// TableContentReadOnly is an empty struct which implements the write operations +// of the TableContent interface. None of the implemented functions do anything. +// You can embed this struct into your own structs to free yourself from having +// to implement the empty write functions of TableContent. See +// demos/table/virtualtable for an example. +type TableContentReadOnly struct{} + +// SetCell does not do anything. +func (t TableContentReadOnly) SetCell(row, column int, cell *TableCell) { + // nop. +} + +// RemoveRow does not do anything. +func (t TableContentReadOnly) RemoveRow(row int) { + // nop. +} + +// RemoveColumn does not do anything. +func (t TableContentReadOnly) RemoveColumn(column int) { + // nop. +} + +// InsertRow does not do anything. +func (t TableContentReadOnly) InsertRow(row int) { + // nop. +} + +// InsertColumn does not do anything. +func (t TableContentReadOnly) InsertColumn(column int) { + // nop. +} + +// Clear does not do anything. +func (t TableContentReadOnly) Clear() { + // nop. +} + +// tableDefaultContent implements the default TableContent interface for the +// Table class. +type tableDefaultContent struct { + // The cells of the table. Rows first, then columns. + cells [][]*TableCell + + // The rightmost column in the data set. + lastColumn int +} + +// Clear clears all data. +func (t *tableDefaultContent) Clear() { + t.cells = nil + t.lastColumn = -1 +} + +// SetCell sets a cell's content. +func (t *tableDefaultContent) SetCell(row, column int, cell *TableCell) { + if row >= len(t.cells) { + t.cells = append(t.cells, make([][]*TableCell, row-len(t.cells)+1)...) + } + rowLen := len(t.cells[row]) + if column >= rowLen { + t.cells[row] = append(t.cells[row], make([]*TableCell, column-rowLen+1)...) + for c := rowLen; c < column; c++ { + t.cells[row][c] = &TableCell{} + } + } + t.cells[row][column] = cell + if column > t.lastColumn { + t.lastColumn = column + } +} + +// RemoveRow removes a row from the data. +func (t *tableDefaultContent) RemoveRow(row int) { + if row < 0 || row >= len(t.cells) { + return + } + t.cells = append(t.cells[:row], t.cells[row+1:]...) +} + +// RemoveColumn removes a column from the data. +func (t *tableDefaultContent) RemoveColumn(column int) { + for row := range t.cells { + if column < 0 || column >= len(t.cells[row]) { + continue + } + t.cells[row] = append(t.cells[row][:column], t.cells[row][column+1:]...) + } + if column >= 0 && column <= t.lastColumn { + t.lastColumn-- + } +} + +// InsertRow inserts a new row at the given position. +func (t *tableDefaultContent) InsertRow(row int) { + if row >= len(t.cells) { + return + } + t.cells = append(t.cells, nil) // Extend by one. + copy(t.cells[row+1:], t.cells[row:]) // Shift down. + t.cells[row] = nil // New row is uninitialized. +} + +// InsertColumn inserts a new column at the given position. +func (t *tableDefaultContent) InsertColumn(column int) { + for row := range t.cells { + if column >= len(t.cells[row]) { + continue + } + t.cells[row] = append(t.cells[row], nil) // Extend by one. + copy(t.cells[row][column+1:], t.cells[row][column:]) // Shift to the right. + t.cells[row][column] = &TableCell{} // New element is an uninitialized table cell. + } +} + +// GetCell returns the cell at the given position. +func (t *tableDefaultContent) GetCell(row, column int) *TableCell { + if row < 0 || column < 0 || row >= len(t.cells) || column >= len(t.cells[row]) { + return nil + } + return t.cells[row][column] +} + +// GetRowCount returns the number of rows in the data set. +func (t *tableDefaultContent) GetRowCount() int { + return len(t.cells) +} + +// GetColumnCount returns the number of columns in the data set. +func (t *tableDefaultContent) GetColumnCount() int { + if len(t.cells) == 0 { + return 0 + } + return t.lastColumn + 1 +} + +// Table visualizes two-dimensional data consisting of rows and columns. Each +// Table cell is defined via [Table.SetCell] by the [TableCell] type. They can +// be added dynamically to the table and changed any time. +// +// The most compact display of a table is without borders. Each row will then +// occupy one row on screen and columns are separated by the rune defined via +// [Table.SetSeparator] (a space character by default). +// +// When borders are turned on (via [Table.SetBorders]), each table cell is +// surrounded by lines. Therefore one table row will require two rows on screen. +// +// Columns will use as much horizontal space as they need. You can constrain +// their size with the [TableCell.MaxWidth] parameter of the [TableCell] type. +// +// # Fixed Columns +// +// You can define fixed rows and rolumns via [Table.SetFixed]. They will always +// stay in their place, even when the table is scrolled. Fixed rows are always +// the top rows. Fixed columns are always the leftmost columns. +// +// # Selections +// +// You can call [Table.SetSelectable] to set columns and/or rows to +// "selectable". If the flag is set only for columns, entire columns can be +// selected by the user. If it is set only for rows, entire rows can be +// selected. If both flags are set, individual cells can be selected. The +// "selected" handler set via [Table.SetSelectedFunc] is invoked when the user +// presses Enter on a selection. +// +// # Navigation +// +// If the table extends beyond the available space, it can be navigated with +// key bindings similar to Vim: +// +// - h, left arrow: Move left by one column. +// - l, right arrow: Move right by one column. +// - j, down arrow: Move down by one row. +// - k, up arrow: Move up by one row. +// - g, home: Move to the top. +// - G, end: Move to the bottom. +// - Ctrl-F, page down: Move down by one page. +// - Ctrl-B, page up: Move up by one page. +// +// When there is no selection, this affects the entire table (except for fixed +// rows and columns). When there is a selection, the user moves the selection. +// The class will attempt to keep the selection from moving out of the screen. +// +// Use [Box.SetInputCapture] to override or modify keyboard input. +// +// See https://github.com/rivo/tview/wiki/Table for an example. +type Table struct { + *Box + + // Whether or not this table has borders around each cell. + borders bool + + // The color of the borders or the separator. + bordersColor tcell.Color + + // If there are no borders, the column separator. + separator rune + + // The table's data structure. + content TableContent + + // If true, when calculating the widths of the columns, all rows are evaluated + // instead of only the visible ones. + evaluateAllRows bool + + // The number of fixed rows / columns. + fixedRows, fixedColumns int + + // Whether or not rows or columns can be selected. If both are set to true, + // cells can be selected. + rowsSelectable, columnsSelectable bool + + // The currently selected row and column. + selectedRow, selectedColumn int + + // A temporary flag which causes the next call to Draw() to force the + // current selection to remain visible. It is set to false afterwards. + clampToSelection bool + + // If set to true, moving the selection will wrap around horizontally (last + // to first column and vice versa) or vertically (last to first row and vice + // versa). + wrapHorizontally, wrapVertically bool + + // The number of rows/columns by which the table is scrolled down/to the + // right. + rowOffset, columnOffset int + + // If set to true, the table's last row will always be visible. + trackEnd bool + + // The number of visible rows the last time the table was drawn. + visibleRows int + + // The indices of the visible columns as of the last time the table was drawn. + visibleColumnIndices []int + + // The net widths of the visible columns as of the last time the table was + // drawn. + visibleColumnWidths []int + + // The style of the selected rows. If this value is the empty struct, + // selected rows are simply inverted. + selectedStyle tcell.Style + + // An optional function which gets called when the user presses Enter on a + // selected cell. If entire rows selected, the column value is undefined. + // Likewise for entire columns. + selected func(row, column int) + + // An optional function which gets called when the user changes the selection. + // If entire rows selected, the column value is undefined. + // Likewise for entire columns. + selectionChanged func(row, column int) + + // An optional function which gets called when the user presses Escape, Tab, + // or Backtab. Also when the user presses Enter if nothing is selectable. + done func(key tcell.Key) +} + +// NewTable returns a new table. +func NewTable() *Table { + t := &Table{ + Box: NewBox(), + bordersColor: Styles.GraphicsColor, + separator: ' ', + } + t.SetContent(nil) + return t +} + +// SetContent sets a new content type for this table. This allows you to back +// the table by a data structure of your own, for example one that cannot be +// fully held in memory. For details, see the TableContent interface +// documentation. +// +// A value of nil will return the table to its default implementation where all +// of its table cells are kept in memory. +func (t *Table) SetContent(content TableContent) *Table { + if content != nil { + t.content = content + } else { + t.content = &tableDefaultContent{ + lastColumn: -1, + } + } + return t +} + +// Clear removes all table data. +func (t *Table) Clear() *Table { + t.content.Clear() + return t +} + +// SetBorders sets whether or not each cell in the table is surrounded by a +// border. +func (t *Table) SetBorders(show bool) *Table { + t.borders = show + return t +} + +// SetBordersColor sets the color of the cell borders. +func (t *Table) SetBordersColor(color tcell.Color) *Table { + t.bordersColor = color + return t +} + +// SetSelectedStyle sets a specific style for selected cells. If no such style +// is set, the cell's background and text color are swapped. If a cell defines +// its own selected style, that will be used instead. +// +// To reset a previous setting to its default, make the following call: +// +// table.SetSelectedStyle(tcell.StyleDefault) +func (t *Table) SetSelectedStyle(style tcell.Style) *Table { + t.selectedStyle = style + return t +} + +// SetSeparator sets the character used to fill the space between two +// neighboring cells. This is a space character ' ' per default but you may +// want to set it to Borders.Vertical (or any other rune) if the column +// separation should be more visible. If cell borders are activated, this is +// ignored. +// +// Separators have the same color as borders. +func (t *Table) SetSeparator(separator rune) *Table { + t.separator = separator + return t +} + +// SetFixed sets the number of fixed rows and columns which are always visible +// even when the rest of the cells are scrolled out of view. Rows are always the +// top-most ones. Columns are always the left-most ones. +func (t *Table) SetFixed(rows, columns int) *Table { + t.fixedRows, t.fixedColumns = rows, columns + return t +} + +// SetSelectable sets the flags which determine what can be selected in a table. +// There are three selection modi: +// +// - rows = false, columns = false: Nothing can be selected. +// - rows = true, columns = false: Rows can be selected. +// - rows = false, columns = true: Columns can be selected. +// - rows = true, columns = true: Individual cells can be selected. +func (t *Table) SetSelectable(rows, columns bool) *Table { + t.rowsSelectable, t.columnsSelectable = rows, columns + return t +} + +// GetSelectable returns what can be selected in a table. Refer to +// SetSelectable() for details. +func (t *Table) GetSelectable() (rows, columns bool) { + return t.rowsSelectable, t.columnsSelectable +} + +// GetSelection returns the position of the current selection. +// If entire rows are selected, the column index is undefined. +// Likewise for entire columns. +func (t *Table) GetSelection() (row, column int) { + return t.selectedRow, t.selectedColumn +} + +// Select sets the selected cell. Depending on the selection settings +// specified via SetSelectable(), this may be an entire row or column, or even +// ignored completely. The "selection changed" event is fired if such a callback +// is available (even if the selection ends up being the same as before and even +// if cells are not selectable). +func (t *Table) Select(row, column int) *Table { + t.selectedRow, t.selectedColumn = row, column + t.clampToSelection = true + if t.selectionChanged != nil { + t.selectionChanged(row, column) + } + return t +} + +// SetOffset sets how many rows and columns should be skipped when drawing the +// table. This is useful for large tables that do not fit on the screen. +// Navigating a selection can change these values. +// +// Fixed rows and columns are never skipped. +func (t *Table) SetOffset(row, column int) *Table { + t.rowOffset, t.columnOffset = row, column + t.trackEnd = false + return t +} + +// GetOffset returns the current row and column offset. This indicates how many +// rows and columns the table is scrolled down and to the right. +func (t *Table) GetOffset() (row, column int) { + return t.rowOffset, t.columnOffset +} + +// SetEvaluateAllRows sets a flag which determines the rows to be evaluated when +// calculating the widths of the table's columns. When false, only visible rows +// are evaluated. When true, all rows in the table are evaluated. +// +// Set this flag to true to avoid shifting column widths when the table is +// scrolled. (May come with a performance penalty for large tables.) +// +// Use with caution on very large tables, especially those not backed by the +// default TableContent data structure. +func (t *Table) SetEvaluateAllRows(all bool) *Table { + t.evaluateAllRows = all + return t +} + +// SetSelectedFunc sets a handler which is called whenever the user presses the +// Enter key on a selected cell/row/column. The handler receives the position of +// the selection and its cell contents. If entire rows are selected, the column +// index is undefined. Likewise for entire columns. +func (t *Table) SetSelectedFunc(handler func(row, column int)) *Table { + t.selected = handler + return t +} + +// SetSelectionChangedFunc sets a handler which is called whenever the current +// selection changes. The handler receives the position of the new selection. +// If entire rows are selected, the column index is undefined. Likewise for +// entire columns. +func (t *Table) SetSelectionChangedFunc(handler func(row, column int)) *Table { + t.selectionChanged = handler + return t +} + +// SetDoneFunc sets a handler which is called whenever the user presses the +// Escape, Tab, or Backtab key. If nothing is selected, it is also called when +// user presses the Enter key (because pressing Enter on a selection triggers +// the "selected" handler set via SetSelectedFunc()). +func (t *Table) SetDoneFunc(handler func(key tcell.Key)) *Table { + t.done = handler + return t +} + +// SetCell sets the content of a cell the specified position. It is ok to +// directly instantiate a TableCell object. If the cell has content, at least +// the Text and Color fields should be set. +// +// Note that setting cells in previously unknown rows and columns will +// automatically extend the internal table representation with empty TableCell +// objects, e.g. starting with a row of 100,000 will immediately create 100,000 +// empty rows. +// +// To avoid unnecessary garbage collection, fill columns from left to right. +func (t *Table) SetCell(row, column int, cell *TableCell) *Table { + t.content.SetCell(row, column, cell) + return t +} + +// SetCellSimple calls SetCell() with the given text, left-aligned, in white. +func (t *Table) SetCellSimple(row, column int, text string) *Table { + t.SetCell(row, column, NewTableCell(text)) + return t +} + +// GetCell returns the contents of the cell at the specified position. A valid +// TableCell object is always returned but it will be uninitialized if the cell +// was not previously set. Such an uninitialized object will not automatically +// be inserted. Therefore, repeated calls to this function may return different +// pointers for uninitialized cells. +func (t *Table) GetCell(row, column int) *TableCell { + cell := t.content.GetCell(row, column) + if cell == nil { + cell = &TableCell{} + } + return cell +} + +// RemoveRow removes the row at the given position from the table. If there is +// no such row, this has no effect. +func (t *Table) RemoveRow(row int) *Table { + t.content.RemoveRow(row) + return t +} + +// RemoveColumn removes the column at the given position from the table. If +// there is no such column, this has no effect. +func (t *Table) RemoveColumn(column int) *Table { + t.content.RemoveColumn(column) + return t +} + +// InsertRow inserts a row before the row with the given index. Cells on the +// given row and below will be shifted to the bottom by one row. If "row" is +// equal or larger than the current number of rows, this function has no effect. +func (t *Table) InsertRow(row int) *Table { + t.content.InsertRow(row) + return t +} + +// InsertColumn inserts a column before the column with the given index. Cells +// in the given column and to its right will be shifted to the right by one +// column. Rows that have fewer initialized cells than "column" will remain +// unchanged. +func (t *Table) InsertColumn(column int) *Table { + t.content.InsertColumn(column) + return t +} + +// GetRowCount returns the number of rows in the table. +func (t *Table) GetRowCount() int { + return t.content.GetRowCount() +} + +// GetColumnCount returns the (maximum) number of columns in the table. +func (t *Table) GetColumnCount() int { + return t.content.GetColumnCount() +} + +// CellAt returns the row and column located at the given screen coordinates. +// Each returned value may be negative if there is no row and/or cell. This +// function will also process coordinates outside the table's inner rectangle so +// callers will need to check for bounds themselves. +// +// The layout of the table when it was last drawn is used so if anything has +// changed in the meantime, the results may not be reliable. +func (t *Table) CellAt(x, y int) (row, column int) { + rectX, rectY, _, _ := t.GetInnerRect() + + // Determine row as seen on screen. + if t.borders { + row = (y - rectY - 1) / 2 + } else { + row = y - rectY + } + + // Respect fixed rows and row offset. + if row >= 0 { + if row >= t.fixedRows { + row += t.rowOffset + } + if row >= t.content.GetRowCount() { + row = -1 + } + } + + // Saerch for the clicked column. + column = -1 + if x >= rectX { + columnX := rectX + if t.borders { + columnX++ + } + for index, width := range t.visibleColumnWidths { + columnX += width + 1 + if x < columnX { + column = t.visibleColumnIndices[index] + break + } + } + } + + return +} + +// ScrollToBeginning scrolls the table to the beginning to that the top left +// corner of the table is shown. Note that this position may be corrected if +// there is a selection. +func (t *Table) ScrollToBeginning() *Table { + t.trackEnd = false + t.columnOffset = 0 + t.rowOffset = 0 + return t +} + +// ScrollToEnd scrolls the table to the beginning to that the bottom left corner +// of the table is shown. Adding more rows to the table will cause it to +// automatically scroll with the new data. Note that this position may be +// corrected if there is a selection. +func (t *Table) ScrollToEnd() *Table { + t.trackEnd = true + t.columnOffset = 0 + t.rowOffset = t.content.GetRowCount() + return t +} + +// SetWrapSelection determines whether a selection wraps vertically or +// horizontally when moved. Vertically wrapping selections will jump from the +// last selectable row to the first selectable row and vice versa. Horizontally +// wrapping selections will jump from the last selectable column to the first +// selectable column (on the next selectable row) or from the first selectable +// column to the last selectable column (on the previous selectable row). If set +// to false, the selection is not moved when it is already on the first/last +// selectable row/column. +// +// The default is for both values to be false. +func (t *Table) SetWrapSelection(vertical, horizontal bool) *Table { + t.wrapHorizontally = horizontal + t.wrapVertically = vertical + return t +} + +// Draw draws this primitive onto the screen. +func (t *Table) Draw(screen tcell.Screen) { + t.Box.DrawForSubclass(screen, t) + + // What's our available screen space? + _, totalHeight := screen.Size() + x, y, width, height := t.GetInnerRect() + netWidth := width + if t.borders { + t.visibleRows = height / 2 + netWidth -= 2 + } else { + t.visibleRows = height + } + + // If this cell is not selectable, find the next one. + rowCount, columnCount := t.content.GetRowCount(), t.content.GetColumnCount() + if t.rowsSelectable || t.columnsSelectable { + if t.selectedColumn < 0 { + t.selectedColumn = 0 + } + if t.selectedRow < 0 { + t.selectedRow = 0 + } + for t.selectedRow < rowCount { + cell := t.content.GetCell(t.selectedRow, t.selectedColumn) + if cell != nil && !cell.NotSelectable { + break + } + t.selectedColumn++ + if t.selectedColumn > columnCount-1 { + t.selectedColumn = 0 + t.selectedRow++ + } + } + } + + // Clamp row offsets if requested. + defer func() { + t.clampToSelection = false // Only once. + }() + if t.clampToSelection && t.rowsSelectable { + if t.selectedRow >= t.fixedRows && t.selectedRow < t.fixedRows+t.rowOffset { + t.rowOffset = t.selectedRow - t.fixedRows + t.trackEnd = false + } + if t.borders { + if t.selectedRow+1-t.rowOffset >= height/2 { + t.rowOffset = t.selectedRow + 1 - height/2 + t.trackEnd = false + } + } else { + if t.selectedRow+1-t.rowOffset >= height { + t.rowOffset = t.selectedRow + 1 - height + t.trackEnd = false + } + } + } + if t.rowOffset < 0 { + t.rowOffset = 0 + } + if t.borders { + if rowCount-t.rowOffset < height/2 { + t.trackEnd = true + } + } else { + if rowCount-t.rowOffset < height { + t.trackEnd = true + } + } + if t.trackEnd { + if t.borders { + t.rowOffset = rowCount - height/2 + } else { + t.rowOffset = rowCount - height + } + } + if t.rowOffset < 0 { + t.rowOffset = 0 + } + + // Avoid invalid column offsets. + if t.columnOffset >= columnCount-t.fixedColumns { + t.columnOffset = columnCount - t.fixedColumns - 1 + } + if t.columnOffset < 0 { + t.columnOffset = 0 + } + + // Determine the indices of the rows which fit on the screen. + var ( + rows, allRows []int + tableHeight int + ) + rowStep := 1 + if t.borders { + rowStep = 2 // With borders, every table row takes two screen rows. + } + if t.evaluateAllRows { + allRows = make([]int, rowCount) + for row := 0; row < rowCount; row++ { + allRows[row] = row + } + } + indexRow := func(row int) bool { // Determine if this row is visible, store its index. + if tableHeight >= height { + return false + } + rows = append(rows, row) + tableHeight += rowStep + return true + } + for row := 0; row < t.fixedRows && row < rowCount; row++ { // Do the fixed rows first. + if !indexRow(row) { + break + } + } + for row := t.fixedRows + t.rowOffset; row < rowCount; row++ { // Then the remaining rows. + if !indexRow(row) { + break + } + } + + // Determine the columns' indices, widths, and expansion values that fit on + // the screen. + var ( + tableWidth, expansionTotal int + columns, widths, expansions []int + ) + includesSelection := !t.clampToSelection || !t.columnsSelectable + + // Helper function that evaluates one column. Returns true if the column + // didn't fit at all. + indexColumn := func(column int) bool { + if netWidth == 0 || tableWidth >= netWidth { + return true + } + + var maxWidth, expansion int + evaluationRows := rows + if t.evaluateAllRows { + evaluationRows = allRows + } + for _, row := range evaluationRows { + if cell := t.content.GetCell(row, column); cell != nil { + cellWidth := TaggedStringWidth(cell.Text) + if cell.MaxWidth > 0 && cell.MaxWidth < cellWidth { + cellWidth = cell.MaxWidth + } + if cellWidth > maxWidth { + maxWidth = cellWidth + } + if cell.Expansion > expansion { + expansion = cell.Expansion + } + } + } + clampedMaxWidth := maxWidth + if tableWidth+maxWidth > netWidth { + clampedMaxWidth = netWidth - tableWidth + } + columns = append(columns, column) + widths = append(widths, clampedMaxWidth) + expansions = append(expansions, expansion) + tableWidth += clampedMaxWidth + 1 + expansionTotal += expansion + if t.columnsSelectable && t.clampToSelection && column == t.selectedColumn { + // We want selections to appear fully. + includesSelection = clampedMaxWidth == maxWidth + } + + return false + } + + // Helper function that evaluates multiple columns, starting at "start" and + // at most ending at "maxEnd". Returns first column not included anymore (or + // -1 if all are included). + indexColumns := func(start, maxEnd int) int { + if start == maxEnd { + return -1 + } + + if start < maxEnd { + // Forward-evaluate columns. + for column := start; column < maxEnd; column++ { + if indexColumn(column) { + return column + } + } + return -1 + } + + // Backward-evaluate columns. + startLen := len(columns) + defer func() { + // Because we went backwards, we must reverse the partial slices. + for i, j := startLen, len(columns)-1; i < j; i, j = i+1, j-1 { + columns[i], columns[j] = columns[j], columns[i] + widths[i], widths[j] = widths[j], widths[i] + expansions[i], expansions[j] = expansions[j], expansions[i] + } + }() + for column := start; column >= maxEnd; column-- { + if indexColumn(column) { + return column + } + } + return -1 + } + + // Reset the table to only its fixed columns. + var fixedTableWidth, fixedExpansionTotal int + resetColumns := func() { + tableWidth = fixedTableWidth + expansionTotal = fixedExpansionTotal + columns = columns[:t.fixedColumns] + widths = widths[:t.fixedColumns] + expansions = expansions[:t.fixedColumns] + } + + // Add fixed columns. + if indexColumns(0, t.fixedColumns) < 0 { + fixedTableWidth = tableWidth + fixedExpansionTotal = expansionTotal + + // Add unclamped columns. + if column := indexColumns(t.fixedColumns+t.columnOffset, columnCount); !includesSelection || column < 0 && t.columnOffset > 0 { + // Offset is not optimal. Try again. + if !includesSelection { + // Clamp to selection. + resetColumns() + if t.selectedColumn <= t.fixedColumns+t.columnOffset { + // It's on the left. Start with the selection. + t.columnOffset = t.selectedColumn - t.fixedColumns + indexColumns(t.fixedColumns+t.columnOffset, columnCount) + } else { + // It's on the right. End with the selection. + if column := indexColumns(t.selectedColumn, t.fixedColumns); column >= 0 { + t.columnOffset = column + 1 - t.fixedColumns + } else { + t.columnOffset = 0 + } + } + } else if tableWidth < netWidth { + // Don't waste space. Try to fit as much on screen as possible. + resetColumns() + if column := indexColumns(columnCount-1, t.fixedColumns); column >= 0 { + t.columnOffset = column + 1 - t.fixedColumns + } else { + t.columnOffset = 0 + } + } + } + } + + // If we have space left, distribute it. + if tableWidth < netWidth { + toDistribute := netWidth - tableWidth + for index, expansion := range expansions { + if expansionTotal <= 0 { + break + } + expWidth := toDistribute * expansion / expansionTotal + widths[index] += expWidth + toDistribute -= expWidth + expansionTotal -= expansion + } + } + + // Helper function which draws border runes. + borderStyle := tcell.StyleDefault.Background(t.backgroundColor).Foreground(t.bordersColor) + drawBorder := func(colX, rowY int, ch rune) { + screen.SetContent(x+colX, y+rowY, ch, nil, borderStyle) + } + + // Draw the cells (and borders). + var columnX int + if t.borders { + columnX++ + } + for columnIndex, column := range columns { + columnWidth := widths[columnIndex] + for rowY, row := range rows { + if t.borders { + // Draw borders. + rowY *= 2 + for pos := 0; pos < columnWidth && columnX+pos < width; pos++ { + drawBorder(columnX+pos, rowY, Borders.Horizontal) + } + ch := Borders.Cross + if row == 0 { + if column == 0 { + ch = Borders.TopLeft + } else { + ch = Borders.TopT + } + } else if column == 0 { + ch = Borders.LeftT + } + drawBorder(columnX-1, rowY, ch) + rowY++ + if rowY >= height || y+rowY >= totalHeight { + break // No space for the text anymore. + } + drawBorder(columnX-1, rowY, Borders.Vertical) + } else if columnIndex < len(columns)-1 { + // Draw separator. + drawBorder(columnX+columnWidth, rowY, t.separator) + } + + // Get the cell. + cell := t.content.GetCell(row, column) + if cell == nil { + continue + } + + // Draw text. + finalWidth := columnWidth + if columnX+columnWidth >= width { + finalWidth = width - columnX + } + cell.x, cell.y, cell.width = x+columnX, y+rowY, finalWidth + style := cell.Style + if style == tcell.StyleDefault { + style = tcell.StyleDefault.Background(cell.BackgroundColor).Foreground(cell.Color).Attributes(cell.Attributes) + } + start, end, _ := printWithStyle(screen, cell.Text, x+columnX, y+rowY, 0, finalWidth, cell.Align, style, true) + printed := end - start + if TaggedStringWidth(cell.Text)-printed > 0 && printed > 0 { + _, _, style, _ := screen.GetContent(x+columnX+finalWidth-1, y+rowY) + printWithStyle(screen, string(SemigraphicsHorizontalEllipsis), x+columnX+finalWidth-1, y+rowY, 0, 1, AlignLeft, style, false) + } + } + + // Draw bottom border. + if rowY := 2 * len(rows); t.borders && rowY > 0 && rowY < height { + for pos := 0; pos < columnWidth && columnX+1+pos < width; pos++ { + drawBorder(columnX+pos, rowY, Borders.Horizontal) + } + ch := Borders.Cross + if rows[len(rows)-1] == rowCount-1 { + if column == 0 { + ch = Borders.BottomLeft + } else { + ch = Borders.BottomT + } + } else if column == 0 { + ch = Borders.BottomLeft + } + drawBorder(columnX-1, rowY, ch) + } + + columnX += columnWidth + 1 + } + + // Draw right border. + columnX-- + if t.borders && len(rows) > 0 && len(columns) > 0 && columnX < width { + lastColumn := columns[len(columns)-1] == columnCount-1 + for rowY := range rows { + rowY *= 2 + if rowY+1 < height { + drawBorder(columnX, rowY+1, Borders.Vertical) + } + ch := Borders.Cross + if rowY == 0 { + if lastColumn { + ch = Borders.TopRight + } else { + ch = Borders.TopT + } + } else if lastColumn { + ch = Borders.RightT + } + drawBorder(columnX, rowY, ch) + } + if rowY := 2 * len(rows); rowY < height { + ch := Borders.BottomT + if lastColumn { + ch = Borders.BottomRight + } + drawBorder(columnX, rowY, ch) + } + } + + // Helper function which colors the background of a box. + // backgroundTransparent == true => Don't modify background color (when invert == false). + // textTransparent == true => Don't modify text color (when invert == false). + // attr == 0 => Don't change attributes. + // invert == true => Ignore attr, set text to backgroundColor or t.backgroundColor; + // set background to textColor. + colorBackground := func(fromX, fromY, w, h int, backgroundColor, textColor tcell.Color, backgroundTransparent, textTransparent bool, attr tcell.AttrMask, invert bool) { + for by := 0; by < h && fromY+by < y+height; by++ { + for bx := 0; bx < w && fromX+bx < x+width; bx++ { + m, c, style, _ := screen.GetContent(fromX+bx, fromY+by) + fg, bg, a := style.Decompose() + if invert { + style = style.Background(textColor).Foreground(backgroundColor) + } else { + if !backgroundTransparent { + bg = backgroundColor + } + if !textTransparent { + fg = textColor + } + if attr != 0 { + a = attr + } + style = style.Background(bg).Foreground(fg).Attributes(a) + } + screen.SetContent(fromX+bx, fromY+by, m, c, style) + } + } + } + + // Color the cell backgrounds. To avoid undesirable artefacts, we combine + // the drawing of a cell by background color, selected cells last. + type cellInfo struct { + x, y, w, h int + cell *TableCell + selected bool + } + cellsByBackgroundColor := make(map[tcell.Color][]*cellInfo) + var backgroundColors []tcell.Color + for rowY, row := range rows { + columnX := 0 + rowSelected := t.rowsSelectable && !t.columnsSelectable && row == t.selectedRow + for columnIndex, column := range columns { + columnWidth := widths[columnIndex] + cell := t.content.GetCell(row, column) + if cell == nil { + continue + } + bx, by, bw, bh := x+columnX, y+rowY, columnWidth+1, 1 + if t.borders { + by = y + rowY*2 + bw++ + bh = 3 + } + columnSelected := t.columnsSelectable && !t.rowsSelectable && column == t.selectedColumn + cellSelected := !cell.NotSelectable && (columnSelected || rowSelected || t.rowsSelectable && t.columnsSelectable && column == t.selectedColumn && row == t.selectedRow) + backgroundColor := cell.BackgroundColor + if cell.Style != tcell.StyleDefault { + _, backgroundColor, _ = cell.Style.Decompose() + } + entries, ok := cellsByBackgroundColor[backgroundColor] + cellsByBackgroundColor[backgroundColor] = append(entries, &cellInfo{ + x: bx, + y: by, + w: bw, + h: bh, + cell: cell, + selected: cellSelected, + }) + if !ok { + backgroundColors = append(backgroundColors, backgroundColor) + } + columnX += columnWidth + 1 + } + } + sort.Slice(backgroundColors, func(i int, j int) bool { + // Draw brightest colors last (i.e. on top). + r, g, b := backgroundColors[i].RGB() + c := colorful.Color{R: float64(r) / 255, G: float64(g) / 255, B: float64(b) / 255} + _, _, li := c.Hcl() + r, g, b = backgroundColors[j].RGB() + c = colorful.Color{R: float64(r) / 255, G: float64(g) / 255, B: float64(b) / 255} + _, _, lj := c.Hcl() + return li < lj + }) + for _, bgColor := range backgroundColors { + entries := cellsByBackgroundColor[bgColor] + for _, info := range entries { + textColor := info.cell.Color + if info.cell.Style != tcell.StyleDefault { + textColor, _, _ = info.cell.Style.Decompose() + } + if info.selected { + if info.cell.SelectedStyle != tcell.StyleDefault { + selFg, selBg, selAttr := info.cell.SelectedStyle.Decompose() + defer colorBackground(info.x, info.y, info.w, info.h, selBg, selFg, false, false, selAttr, false) + } else if t.selectedStyle != tcell.StyleDefault { + selFg, selBg, selAttr := t.selectedStyle.Decompose() + defer colorBackground(info.x, info.y, info.w, info.h, selBg, selFg, false, false, selAttr, false) + } else { + defer colorBackground(info.x, info.y, info.w, info.h, bgColor, textColor, false, false, 0, true) + } + } else { + colorBackground(info.x, info.y, info.w, info.h, bgColor, textColor, info.cell.Transparent, true, 0, false) + } + } + } + + // Remember column infos. + t.visibleColumnIndices, t.visibleColumnWidths = columns, widths +} + +// InputHandler returns the handler for this primitive. +func (t *Table) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + key := event.Key() + + if (!t.rowsSelectable && !t.columnsSelectable && key == tcell.KeyEnter) || + key == tcell.KeyEscape || + key == tcell.KeyTab || + key == tcell.KeyBacktab { + if t.done != nil { + t.done(key) + } + return + } + + // Movement functions. + previouslySelectedRow, previouslySelectedColumn := t.selectedRow, t.selectedColumn + lastColumn := t.content.GetColumnCount() - 1 + rowCount := t.content.GetRowCount() + if rowCount == 0 { + return // No movement on empty tables. + } + var ( + // Move the selection forward, don't go beyond final cell, return + // true if a selection was found. + forward = func(finalRow, finalColumn int) bool { + row, column := t.selectedRow, t.selectedColumn + for { + // Stop if the current selection is fine. + cell := t.content.GetCell(row, column) + if cell != nil && !cell.NotSelectable { + t.selectedRow, t.selectedColumn = row, column + return true + } + + // If we reached the final cell, stop. + if row == finalRow && column == finalColumn { + return false + } + + // Move forward. + column++ + if column > lastColumn { + column = 0 + row++ + if row >= rowCount { + row = 0 + } + } + } + } + + // Move the selection backwards, don't go beyond final cell, return + // true if a selection was found. + backwards = func(finalRow, finalColumn int) bool { + row, column := t.selectedRow, t.selectedColumn + for { + // Stop if the current selection is fine. + cell := t.content.GetCell(row, column) + if cell != nil && !cell.NotSelectable { + t.selectedRow, t.selectedColumn = row, column + return true + } + + // If we reached the final cell, stop. + if row == finalRow && column == finalColumn { + return false + } + + // Move backwards. + column-- + if column < 0 { + column = lastColumn + row-- + if row < 0 { + row = rowCount - 1 + } + } + } + } + + home = func() { + if t.rowsSelectable { + t.selectedRow = 0 + t.selectedColumn = 0 + forward(rowCount-1, lastColumn) + t.clampToSelection = true + } else { + t.trackEnd = false + t.rowOffset = 0 + t.columnOffset = 0 + } + } + + end = func() { + if t.rowsSelectable { + t.selectedRow = rowCount - 1 + t.selectedColumn = lastColumn + backwards(0, 0) + t.clampToSelection = true + } else { + t.trackEnd = true + t.columnOffset = 0 + } + } + + down = func() { + if t.rowsSelectable { + row, column := t.selectedRow, t.selectedColumn + t.selectedRow++ + if t.selectedRow >= rowCount { + if t.wrapVertically { + t.selectedRow = 0 + } else { + t.selectedRow = rowCount - 1 + } + } + finalRow, finalColumn := rowCount-1, lastColumn + if t.wrapVertically { + finalRow = row + finalColumn = column + } + if !forward(finalRow, finalColumn) { + backwards(row, column) + } + t.clampToSelection = true + } else { + t.rowOffset++ + } + } + + up = func() { + if t.rowsSelectable { + row, column := t.selectedRow, t.selectedColumn + t.selectedRow-- + if t.selectedRow < 0 { + if t.wrapVertically { + t.selectedRow = rowCount - 1 + } else { + t.selectedRow = 0 + } + } + finalRow, finalColumn := 0, 0 + if t.wrapVertically { + finalRow = row + finalColumn = column + } + if !backwards(finalRow, finalColumn) { + forward(row, column) + } + t.clampToSelection = true + } else { + t.trackEnd = false + t.rowOffset-- + } + } + + left = func() { + if t.columnsSelectable { + row, column := t.selectedRow, t.selectedColumn + t.selectedColumn-- + if t.selectedColumn < 0 { + if t.wrapHorizontally { + t.selectedColumn = lastColumn + t.selectedRow-- + if t.selectedRow < 0 { + if t.wrapVertically { + t.selectedRow = rowCount - 1 + } else { + t.selectedColumn = 0 + t.selectedRow = 0 + } + } + } else { + t.selectedColumn = 0 + } + } + finalRow, finalColumn := row, column + if !t.wrapHorizontally { + finalColumn = 0 + } else if !t.wrapVertically { + finalRow = 0 + finalColumn = 0 + } + if !backwards(finalRow, finalColumn) { + forward(row, column) + } + t.clampToSelection = true + } else { + t.columnOffset-- + } + } + + right = func() { + if t.columnsSelectable { + row, column := t.selectedRow, t.selectedColumn + t.selectedColumn++ + if t.selectedColumn > lastColumn { + if t.wrapHorizontally { + t.selectedColumn = 0 + t.selectedRow++ + if t.selectedRow >= rowCount { + if t.wrapVertically { + t.selectedRow = 0 + } else { + t.selectedColumn = lastColumn + t.selectedRow = rowCount - 1 + } + } + } else { + t.selectedColumn = lastColumn + } + } + finalRow, finalColumn := row, column + if !t.wrapHorizontally { + finalColumn = lastColumn + } else if !t.wrapVertically { + finalRow = rowCount - 1 + finalColumn = lastColumn + } + if !forward(finalRow, finalColumn) { + backwards(row, column) + } + t.clampToSelection = true + } else { + t.columnOffset++ + } + } + + pageDown = func() { + offsetAmount := t.visibleRows - t.fixedRows + if offsetAmount < 0 { + offsetAmount = 0 + } + if t.rowsSelectable { + row, column := t.selectedRow, t.selectedColumn + t.selectedRow += offsetAmount + if t.selectedRow >= rowCount { + t.selectedRow = rowCount - 1 + } + finalRow, finalColumn := rowCount-1, lastColumn + if !forward(finalRow, finalColumn) { + backwards(row, column) + } + t.clampToSelection = true + } else { + t.rowOffset += offsetAmount + } + } + + pageUp = func() { + offsetAmount := t.visibleRows - t.fixedRows + if offsetAmount < 0 { + offsetAmount = 0 + } + if t.rowsSelectable { + row, column := t.selectedRow, t.selectedColumn + t.selectedRow -= offsetAmount + if t.selectedRow < 0 { + t.selectedRow = 0 + } + finalRow, finalColumn := 0, 0 + if !backwards(finalRow, finalColumn) { + forward(row, column) + } + t.clampToSelection = true + } else { + t.trackEnd = false + t.rowOffset -= offsetAmount + } + } + ) + + switch key { + case tcell.KeyRune: + switch event.Rune() { + case 'g': + home() + case 'G': + end() + case 'j': + down() + case 'k': + up() + case 'h': + left() + case 'l': + right() + } + case tcell.KeyHome: + home() + case tcell.KeyEnd: + end() + case tcell.KeyUp: + up() + case tcell.KeyDown: + down() + case tcell.KeyLeft: + left() + case tcell.KeyRight: + right() + case tcell.KeyPgDn, tcell.KeyCtrlF: + pageDown() + case tcell.KeyPgUp, tcell.KeyCtrlB: + pageUp() + case tcell.KeyEnter: + if (t.rowsSelectable || t.columnsSelectable) && t.selected != nil { + t.selected(t.selectedRow, t.selectedColumn) + } + } + + // If the selection has changed, notify the handler. + if t.selectionChanged != nil && + (t.rowsSelectable && previouslySelectedRow != t.selectedRow || + t.columnsSelectable && previouslySelectedColumn != t.selectedColumn) { + t.selectionChanged(t.selectedRow, t.selectedColumn) + } + }) +} + +// MouseHandler returns the mouse handler for this primitive. +func (t *Table) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return t.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + x, y := event.Position() + if !t.InRect(x, y) { + return false, nil + } + + switch action { + case MouseLeftDown: + setFocus(t) + consumed = true + case MouseLeftClick: + selectEvent := true + row, column := t.CellAt(x, y) + cell := t.content.GetCell(row, column) + if cell != nil && cell.Clicked != nil { + if noSelect := cell.Clicked(); noSelect { + selectEvent = false + } + } + if selectEvent && (t.rowsSelectable || t.columnsSelectable) { + t.Select(row, column) + } + consumed = true + case MouseScrollUp: + t.trackEnd = false + t.rowOffset-- + consumed = true + case MouseScrollDown: + t.rowOffset++ + consumed = true + } + + return + }) +} diff --git a/vendor/github.com/rivo/tview/textarea.go b/vendor/github.com/rivo/tview/textarea.go new file mode 100644 index 00000000..3f61ca80 --- /dev/null +++ b/vendor/github.com/rivo/tview/textarea.go @@ -0,0 +1,2447 @@ +package tview + +import ( + "math" + "strings" + "unicode" + "unicode/utf8" + + "github.com/gdamore/tcell/v2" + "github.com/rivo/uniseg" +) + +const ( + // The minimum capacity of the text area's piece chain slice. + pieceChainMinCap = 10 + + // The minimum capacity of the text area's edit buffer. + editBufferMinCap = 200 + + // The maximum number of bytes making up a grapheme cluster. In theory, this + // could be longer but it would be highly unusual. + maxGraphemeClusterSize = 40 + + // The default value for the [TextArea.minCursorPrefix] variable. + minCursorPrefixDefault = 5 + + // The default value for the [TextArea.minCursorSuffix] variable. + minCursorSuffixDefault = 3 +) + +// Types of user actions on a text area. +type taAction int + +const ( + taActionOther taAction = iota + taActionTypeSpace // Typing a space character. + taActionTypeNonSpace // Typing a non-space character. + taActionBackspace // Deleting the previous character. + taActionDelete // Deleting the next character. +) + +// NewLine is the string sequence to be inserted when hitting the Enter key in a +// TextArea. The default is "\n" but you may change it to "\r\n" if required. +var NewLine = "\n" + +// textAreaSpan represents a range of text in a text area. The text area widget +// roughly follows the concept of Piece Chains outlined in +// http://www.catch22.net/tuts/neatpad/piece-chains with some modifications. +// This type represents a "span" (or "piece") and thus refers to a subset of the +// text in the editor as part of a doubly-linked list. +// +// In most places where we reference a position in the text, we use a +// three-element int array. The first element is the index of the referenced +// span in the piece chain. The second element is the offset into the span's +// referenced text (relative to the span's start), its value is always >= 0 and +// < span.length. The third element is the state of the text parser at that +// position. +// +// A range of text is represented by a span range which is a starting position +// (3-int array) and an ending position (3-int array). The starting position +// references the first character of the range, the ending position references +// the position after the last character of the range. The end of the text is +// therefore always [3]int{1, 0, 0}, position 0 of the ending sentinel. +// +// Sentinel spans are dummy spans not referring to any text. There are always +// two sentinel spans: the starting span at index 0 of the [TextArea.spans] +// slice and the ending span at index 1. +type textAreaSpan struct { + // Links to the previous and next textAreaSpan objects as indices into the + // [TextArea.spans] slice. The sentinel spans (index 0 and 1) have -1 as + // their previous or next links, respectively. + previous, next int + + // The start index and the length of the text segment this span represents. + // If "length" is negative, the span represents a substring of + // [TextArea.initialText] and the actual length is its absolute value. If it + // is positive, the span represents a substring of [TextArea.editText]. For + // the sentinel spans (index 0 and 1), both values will be 0. Others will + // never have a zero length. + offset, length int +} + +// textAreaUndoItem represents an undoable edit to the text area. It describes +// the two spans wrapping a text change. +type textAreaUndoItem struct { + before, after int // The index of the copied "before" and "after" spans into the "spans" slice. + originalBefore, originalAfter int // The original indices of the "before" and "after" spans. + pos [3]int // The cursor position to be assumed after applying an undo. + length int // The total text length at the time the undo item was created. + continuation bool // If true, this item is a continuation of the previous undo item. It is handled together with all other undo items in the same continuation sequence. +} + +// TextArea implements a simple text editor for multi-line text. Multi-color +// text is not supported. Word-wrapping is enabled by default but can be turned +// off or be changed to character-wrapping. +// +// # Navigation and Editing +// +// A text area is always in editing mode and no other mode exists. The following +// keys can be used to move the cursor (subject to what the user's terminal +// supports and how it is configured): +// +// - Left arrow: Move left. +// - Right arrow: Move right. +// - Down arrow: Move down. +// - Up arrow: Move up. +// - Ctrl-A, Home: Move to the beginning of the current line. +// - Ctrl-E, End: Move to the end of the current line. +// - Ctrl-F, page down: Move down by one page. +// - Ctrl-B, page up: Move up by one page. +// - Alt-Up arrow: Scroll the page up, leaving the cursor in its position. +// - Alt-Down arrow: Scroll the page down, leaving the cursor in its position. +// - Alt-Left arrow: Scroll the page to the left, leaving the cursor in its +// position. Ignored if wrapping is enabled. +// - Alt-Right arrow: Scroll the page to the right, leaving the cursor in its +// position. Ignored if wrapping is enabled. +// - Alt-B, Ctrl-Left arrow: Jump to the beginning of the current or previous +// word. +// - Alt-F, Ctrl-Right arrow: Jump to the end of the current or next word. +// +// Words are defined according to [Unicode Standard Annex #29]. We skip any +// words that contain only spaces or punctuation. +// +// Entering a character will insert it at the current cursor location. +// Subsequent characters are shifted accordingly. If the cursor is outside the +// visible area, any changes to the text will move it into the visible area. The +// following keys can also be used to modify the text: +// +// - Enter: Insert a newline character (see [NewLine]). +// - Tab: Insert a tab character (\t). It will be rendered like [TabSize] +// spaces. (This may eventually be changed to behave like regular tabs.) +// - Ctrl-H, Backspace: Delete one character to the left of the cursor. +// - Ctrl-D, Delete: Delete the character under the cursor (or the first +// character on the next line if the cursor is at the end of a line). +// - Alt-Backspace: Delete the word to the left of the cursor. +// - Ctrl-K: Delete everything under and to the right of the cursor until the +// next newline character. +// - Ctrl-W: Delete from the start of the current word to the left of the +// cursor. +// - Ctrl-U: Delete the current line, i.e. everything after the last newline +// character before the cursor up until the next newline character. This may +// span multiple visible rows if wrapping is enabled. +// +// Text can be selected by moving the cursor while holding the Shift key, to the +// extent that this is supported by the user's terminal. The Ctrl-L key can be +// used to select the entire text. (Ctrl-A already binds to the "Home" key.) +// +// When text is selected: +// +// - Entering a character will replace the selected text with the new +// character. +// - Backspace, delete, Ctrl-H, Ctrl-D: Delete the selected text. +// - Ctrl-Q: Copy the selected text into the clipboard, unselect the text. +// - Ctrl-X: Copy the selected text into the clipboard and delete it. +// - Ctrl-V: Replace the selected text with the clipboard text. If no text is +// selected, the clipboard text will be inserted at the cursor location. +// +// The Ctrl-Q key was chosen for the "copy" function because the Ctrl-C key is +// the default key to stop the application. If your application frees up the +// global Ctrl-C key and you want to bind it to the "copy to clipboard" +// function, you may use [Box.SetInputCapture] to override the Ctrl-Q key to +// implement copying to the clipboard. Note that using your terminal's / +// operating system's key bindings for copy+paste functionality may not have the +// expected effect as tview will not be able to handle these keys. Pasting text +// using your operating system's or terminal's own methods may be very slow as +// each character will be pasted individually. However, some terminals support +// pasting text blocks which is supported by the text area, see +// [Application.EnablePaste] for details. +// +// The default clipboard is an internal text buffer local to this text area +// instance, i.e. the operating system's clipboard is not used. If you want to +// implement your own clipboard (or make use of your operating system's +// clipboard), you can use [TextArea.SetClipboard] which provides all the +// functionality needed to implement your own clipboard. +// +// The text area also supports Undo: +// +// - Ctrl-Z: Undo the last change. +// - Ctrl-Y: Redo the last Undo change. +// +// Undo does not affect the clipboard. +// +// If the mouse is enabled, the following actions are available: +// +// - Left click: Move the cursor to the clicked position or to the end of the +// line if past the last character. +// - Left double-click: Select the word under the cursor. +// - Left click while holding the Shift key: Select text. +// - Scroll wheel: Scroll the text. +// +// [Unicode Standard Annex #29]: https://unicode.org/reports/tr29/ +type TextArea struct { + *Box + + // Whether or not this text area is disabled/read-only. + disabled bool + + // The size of the text area. If set to 0, the text area will use the entire + // available space. + width, height int + + // The text to be shown in the text area when it is empty. + placeholder string + + // The label text shown, usually when part of a form. + label string + + // The width of the text area's label. + labelWidth int + + // Styles: + + // The label style. + labelStyle tcell.Style + + // The style of the text. Background colors different from the Box's + // background color may lead to unwanted artefacts. + textStyle tcell.Style + + // The style of the selected text. + selectedStyle tcell.Style + + // The style of the placeholder text. + placeholderStyle tcell.Style + + // Text manipulation related fields: + + // The text area's text prior to any editing. It is referenced by spans with + // a negative length. + initialText string + + // Any text that's been added by the user at some point. We only ever append + // to this buffer. It is referenced by spans with a positive length. + editText strings.Builder + + // The total length of all text in the text area. + length int + + // The maximum number of bytes allowed in the text area. If 0, there is no + // limit. + maxLength int + + // The piece chain. The first two spans are sentinel spans which don't + // reference anything and always remain in the same place. Spans are never + // deleted from this slice. + spans []textAreaSpan + + // An optional function which transforms grapheme clusters. This can be used + // to hide characters from the screen while preserving the original text. + transform func(cluster, rest string, boundaries int) (newCluster string, newBoundaries int) + + // Display, navigation, and cursor related fields: + + // If set to true, lines that are longer than the available width are + // wrapped onto the next line. If set to false, any characters beyond the + // available width are discarded. + wrap bool + + // If set to true and if wrap is also true, lines are split at spaces or + // after punctuation characters. + wordWrap bool + + // The index of the first line shown in the text area. + rowOffset int + + // The number of cells to be skipped on each line (not used in wrap mode). + columnOffset int + + // The inner height and width of the text area the last time it was drawn. + lastHeight, lastWidth int + + // The width of the currently known widest line, as determined by + // [TextArea.extendLines]. + widestLine int + + // Text positions and states of the start of lines. Each element is a span + // position (see [textAreaSpan]). Not all lines of the text may be contained + // at any time, extend as needed with the [TextArea.extendLines] function. + lineStarts [][3]int + + // The cursor always points to the next position where a new character would + // be placed. The selection start is the same as the cursor as long as there + // is no selection. When there is one, the selection is between + // selectionStart and cursor. + cursor, selectionStart struct { + // The row and column in screen space but relative to the start of the + // text which may be outside the text area's box. The column value may + // be larger than where the cursor actually is if the line the cursor + // is on is shorter. The actualColumn is the position as it is seen on + // screen. These three values may not be determined yet, in which case + // the row is negative. + row, column, actualColumn int + + // The textAreaSpan position with state for the actual next character. + pos [3]int + } + + // The minimum width of text (if available) to be shown left of the cursor. + minCursorPrefix int + + // The minimum width of text (if available) to be shown right of the cursor. + minCursorSuffix int + + // Set to true when the mouse is dragging to select text. + dragging bool + + // Clipboard related fields: + + // The internal clipboard. + clipboard string + + // The function to call when the user copies/cuts a text selection to the + // clipboard. + copyToClipboard func(string) + + // The function to call when the user pastes text from the clipboard. + pasteFromClipboard func() string + + // Undo/redo related fields: + + // The last action performed by the user. + lastAction taAction + + // The undo stack's items. Each item is a copy of the span before the + // modified span range and a copy of the span after the modified span range. + // To undo an action, the two referenced spans are put back into their + // original place. Undos and redos decrease or increase the nextUndo value. + // Thus, the next undo action is not always the last item. + undoStack []textAreaUndoItem + + // The current undo/redo position on the undo stack. If no undo or redo has + // been performed yet, this is the same as len(undoStack). + nextUndo int + + // Event handlers: + + // An optional function which is called when the input has changed. + changed func() + + // An optional function which is called when the position of the cursor or + // the selection has changed. + moved func() + + // A callback function set by the Form class and called when the user leaves + // this form item. + finished func(tcell.Key) +} + +// NewTextArea returns a new text area. Use [TextArea.SetText] to set the +// initial text. +func NewTextArea() *TextArea { + t := &TextArea{ + Box: NewBox(), + wrap: true, + wordWrap: true, + placeholderStyle: tcell.StyleDefault.Background(Styles.PrimitiveBackgroundColor).Foreground(Styles.TertiaryTextColor), + labelStyle: tcell.StyleDefault.Foreground(Styles.SecondaryTextColor), + textStyle: tcell.StyleDefault.Background(Styles.PrimitiveBackgroundColor).Foreground(Styles.PrimaryTextColor), + selectedStyle: tcell.StyleDefault.Background(Styles.PrimaryTextColor).Foreground(Styles.PrimitiveBackgroundColor), + spans: make([]textAreaSpan, 2, pieceChainMinCap), // We reserve some space to avoid reallocations right when editing starts. + lastAction: taActionOther, + minCursorPrefix: minCursorPrefixDefault, + minCursorSuffix: minCursorSuffixDefault, + lastWidth: math.MaxInt / 2, // We need this so some functions work before the first draw. + lastHeight: 1, + } + t.editText.Grow(editBufferMinCap) + t.spans[0] = textAreaSpan{previous: -1, next: 1} + t.spans[1] = textAreaSpan{previous: 0, next: -1} + t.cursor.pos = [3]int{1, 0, -1} + t.selectionStart = t.cursor + t.SetClipboard(nil, nil) + + return t +} + +// SetText sets the text of the text area. All existing text is deleted and +// replaced with the new text. Any edits are discarded, no undos are available. +// This function is typically only used to initialize the text area with a text +// after it has been created. To clear the text area's text (again, no undos), +// provide an empty string. +// +// If cursorAtTheEnd is false, the cursor is placed at the start of the text. If +// it is true, it is placed at the end of the text. For very long texts, placing +// the cursor at the end can be an expensive operation because the entire text +// needs to be parsed and laid out. +// +// If you want to set text and preserve undo functionality, use +// [TextArea.Replace] instead. +func (t *TextArea) SetText(text string, cursorAtTheEnd bool) *TextArea { + t.spans = t.spans[:2] + t.initialText = text + t.editText.Reset() + t.lineStarts = nil + t.length = len(text) + t.rowOffset = 0 + t.columnOffset = 0 + t.reset() + t.cursor.row, t.cursor.actualColumn, t.cursor.column = 0, 0, 0 + t.cursor.pos = [3]int{1, 0, -1} + t.undoStack = t.undoStack[:0] + t.nextUndo = 0 + + if len(text) > 0 { + t.spans = append(t.spans, textAreaSpan{ + previous: 0, + next: 1, + offset: 0, + length: -len(text), + }) + t.spans[0].next = 2 + t.spans[1].previous = 2 + if cursorAtTheEnd { + t.cursor.row = -1 + if t.lastWidth > 0 { + t.findCursor(true, 0) + } + } else { + t.cursor.pos = [3]int{2, 0, -1} + } + } else { + t.spans[0].next = 1 + t.spans[1].previous = 0 + } + t.selectionStart = t.cursor + + if t.changed != nil { + t.changed() + } + + if t.lastWidth > 0 && t.moved != nil { + t.moved() + } + + return t +} + +// GetText returns the entire text of the text area. Note that this will newly +// allocate the entire text. +func (t *TextArea) GetText() string { + if t.length == 0 { + return "" + } + + var text strings.Builder + text.Grow(t.length) + spanIndex := t.spans[0].next + for spanIndex != 1 { + span := &t.spans[spanIndex] + if span.length < 0 { + text.WriteString(t.initialText[span.offset : span.offset-span.length]) + } else { + text.WriteString(t.editText.String()[span.offset : span.offset+span.length]) + } + spanIndex = t.spans[spanIndex].next + } + + return text.String() +} + +// getTextBeforeCursor returns the text of the text area up until the cursor. +// Note that this will result in a new allocation for the returned text. +func (t *TextArea) getTextBeforeCursor() string { + if t.length == 0 || t.cursor.pos[0] == t.spans[0].next && t.cursor.pos[1] == 0 { + return "" + } + + var text strings.Builder + spanIndex := t.spans[0].next + for spanIndex != 1 { + span := &t.spans[spanIndex] + length := span.length + if length < 0 { + if t.cursor.pos[0] == spanIndex { + length = -t.cursor.pos[1] + } + text.WriteString(t.initialText[span.offset : span.offset-length]) + } else { + if t.cursor.pos[0] == spanIndex { + length = t.cursor.pos[1] + } + text.WriteString(t.editText.String()[span.offset : span.offset+length]) + } + if t.cursor.pos[0] == spanIndex { + break + } + spanIndex = t.spans[spanIndex].next + } + + return text.String() +} + +// getTextAfterCursor returns the text of the text area after the cursor. Note +// that this will result in a new allocation for the returned text. +func (t *TextArea) getTextAfterCursor() string { + if t.length == 0 || t.cursor.pos[0] == 1 { + return "" + } + + var text strings.Builder + spanIndex := t.cursor.pos[0] + cursorOffset := t.cursor.pos[1] + for spanIndex != 1 { + span := &t.spans[spanIndex] + length := span.length + if length < 0 { + text.WriteString(t.initialText[span.offset+cursorOffset : span.offset-length]) + } else { + text.WriteString(t.editText.String()[span.offset+cursorOffset : span.offset+length]) + } + spanIndex = t.spans[spanIndex].next + cursorOffset = 0 + } + + return text.String() +} + +// HasSelection returns whether the selected text is non-empty. +func (t *TextArea) HasSelection() bool { + return t.selectionStart != t.cursor +} + +// GetSelection returns the currently selected text and its start and end +// positions within the entire text as a half-open interval. If the returned +// text is an empty string, the start and end positions are the same and can be +// interpreted as the cursor position. +// +// Calling this function will result in string allocations as well as a search +// for text positions. This is expensive if the text has been edited extensively +// already. Use [TextArea.HasSelection] first if you are only interested in +// selected text. +func (t *TextArea) GetSelection() (text string, start int, end int) { + from, to := t.selectionStart.pos, t.cursor.pos + if t.cursor.row < t.selectionStart.row || (t.cursor.row == t.selectionStart.row && t.cursor.actualColumn < t.selectionStart.actualColumn) { + from, to = to, from + } + + if from[0] == 1 { + start = t.length + } + if to[0] == 1 { + end = t.length + } + + var ( + index int + selection strings.Builder + inside bool + ) + for span := t.spans[0].next; span != 1; span = t.spans[span].next { + var spanText string + length := t.spans[span].length + if length < 0 { + length = -length + spanText = t.initialText + } else { + spanText = t.editText.String() + } + spanText = spanText[t.spans[span].offset : t.spans[span].offset+length] + + if from[0] == span && to[0] == span { + if from != to { + selection.WriteString(spanText[from[1]:to[1]]) + } + start = index + from[1] + end = index + to[1] + break + } else if from[0] == span { + if from != to { + selection.WriteString(spanText[from[1]:]) + } + start = index + from[1] + inside = true + } else if to[0] == span { + if from != to { + selection.WriteString(spanText[:to[1]]) + } + end = index + to[1] + break + } else if inside && from != to { + selection.WriteString(spanText) + } + + index += length + } + + if selection.Len() != 0 { + text = selection.String() + } + return +} + +// GetCursor returns the current cursor position where the first character of +// the entire text is in row 0, column 0. If the user has selected text, the +// "from" values will refer to the beginning of the selection and the "to" +// values to the end of the selection (exclusive). They are the same if there +// is no selection. +func (t *TextArea) GetCursor() (fromRow, fromColumn, toRow, toColumn int) { + fromRow, fromColumn = t.selectionStart.row, t.selectionStart.actualColumn + toRow, toColumn = t.cursor.row, t.cursor.actualColumn + if toRow < fromRow || (toRow == fromRow && toColumn < fromColumn) { + fromRow, fromColumn, toRow, toColumn = toRow, toColumn, fromRow, fromColumn + } + if t.length > 0 && t.wrap && fromColumn >= t.lastWidth { // This happens when a row has text all the way until the end, pushing the cursor outside the viewport. + fromRow++ + fromColumn = 0 + } + if t.length > 0 && t.wrap && toColumn >= t.lastWidth { + toRow++ + toColumn = 0 + } + return +} + +// GetTextLength returns the string length of the text in the text area. +func (t *TextArea) GetTextLength() int { + return t.length +} + +// Replace replaces a section of the text with new text. The start and end +// positions refer to index positions within the entire text string (as a +// half-open interval). They may be the same, in which case text is inserted at +// the given position. If the text is an empty string, text between start and +// end is deleted. Index positions will be shifted to line up with character +// boundaries. A "changed" event will be triggered. +// +// Previous selections are cleared. The cursor will be located at the end of the +// replaced text. Scroll offsets will not be changed. A "moved" event will be +// triggered. +// +// The effects of this function can be undone (and redone) by the user. +func (t *TextArea) Replace(start, end int, text string) *TextArea { + t.Select(start, end) + row := t.selectionStart.row + t.cursor.pos = t.replace(t.selectionStart.pos, t.cursor.pos, text, false) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(false, row) + t.selectionStart = t.cursor + if t.moved != nil { + t.moved() + } + // The "changed" event will have been triggered by the "replace" function. + return t +} + +// Select selects a section of the text. The start and end positions refer to +// index positions within the entire text string (as a half-open interval). They +// may be the same, in which case the cursor is placed at the given position. +// Any previous selection is removed. Scroll offsets will be preserved. +// +// Index positions will be shifted to line up with character boundaries. +func (t *TextArea) Select(start, end int) *TextArea { + oldFrom, oldTo := t.selectionStart, t.cursor + defer func() { + if (oldFrom != t.selectionStart || oldTo != t.cursor) && t.moved != nil { + t.moved() + } + }() + + // Clamp input values. + if start < 0 { + start = 0 + } + if start > t.length { + start = t.length + } + if end < 0 { + end = 0 + } + if end > t.length { + end = t.length + } + if end < start { + start, end = end, start + } + + // Find the cursor positions. + var row, index int + t.cursor.row, t.cursor.pos = -1, [3]int{1, 0, -1} + t.selectionStart = t.cursor +RowLoop: + for { + if row >= len(t.lineStarts) { + t.extendLines(t.lastWidth, row) + if row >= len(t.lineStarts) { + break + } + } + + // Check the spans of this row. + pos := t.lineStarts[row] + var ( + next [3]int + lineIndex int + ) + if row+1 < len(t.lineStarts) { + next = t.lineStarts[row+1] + } else { + next = [3]int{1, 0, -1} + } + for { + if pos[0] == next[0] { + if start >= index+lineIndex && start < index+lineIndex+next[1]-pos[1] || + end >= index+lineIndex && end < index+lineIndex+next[1]-pos[1] || + next[0] == 1 && (start == t.length || end == t.length) { // Special case for the end of the text. + break + } + index += lineIndex + next[1] - pos[1] + row++ + continue RowLoop // Move on to the next row. + } else { + length := t.spans[pos[0]].length + if length < 0 { + length = -length + } + if start >= index+lineIndex && start < index+lineIndex+length-pos[1] || + end >= index+lineIndex && end < index+lineIndex+length-pos[1] || + next[0] == 1 && (start == t.length || end == t.length) { // Special case for the end of the text. + break + } + lineIndex += length - pos[1] + pos[0], pos[1] = t.spans[pos[0]].next, 0 + } + } + + // One of the indices is in this row. Step through it. + pos = t.lineStarts[row] + endPos := pos + var ( + cluster, text string + column, width int + ) + for pos != next { + if t.selectionStart.row < 0 && start <= index { + t.selectionStart.row, t.selectionStart.column, t.selectionStart.actualColumn = row, column, column + t.selectionStart.pos = pos + } + if t.cursor.row < 0 && end <= index { + t.cursor.row, t.cursor.column, t.cursor.actualColumn = row, column, column + t.cursor.pos = pos + break RowLoop + } + cluster, text, _, width, pos, endPos = t.step(text, pos, endPos) + index += len(cluster) + column += width + } + row++ + } + + if t.cursor.row < 0 { + t.findCursor(false, 0) // This only happens if we couldn't find the locations above. + t.selectionStart = t.cursor + } + + return t +} + +// SetWrap sets the flag that, if true, leads to lines that are longer than the +// available width being wrapped onto the next line. If false, any characters +// beyond the available width are not displayed. +func (t *TextArea) SetWrap(wrap bool) *TextArea { + if t.wrap != wrap { + t.wrap = wrap + t.reset() + } + return t +} + +// SetWordWrap sets the flag that causes lines that are longer than the +// available width to be wrapped onto the next line at spaces or after +// punctuation marks (according to [Unicode Standard Annex #14]). This flag is +// ignored if the flag set with [TextArea.SetWrap] is false. The text area's +// default is word-wrapping. +// +// [Unicode Standard Annex #14]: https://www.unicode.org/reports/tr14/ +func (t *TextArea) SetWordWrap(wrapOnWords bool) *TextArea { + if t.wordWrap != wrapOnWords { + t.wordWrap = wrapOnWords + t.reset() + } + return t +} + +// SetPlaceholder sets the text to be displayed when the text area is empty. +func (t *TextArea) SetPlaceholder(placeholder string) *TextArea { + t.placeholder = placeholder + return t +} + +// SetLabel sets the text to be displayed before the text area. +func (t *TextArea) SetLabel(label string) *TextArea { + t.label = label + return t +} + +// GetLabel returns the text to be displayed before the text area. +func (t *TextArea) GetLabel() string { + return t.label +} + +// SetLabelWidth sets the screen width of the label. A value of 0 will cause the +// primitive to use the width of the label string. +func (t *TextArea) SetLabelWidth(width int) *TextArea { + t.labelWidth = width + return t +} + +// GetLabelWidth returns the screen width of the label. +func (t *TextArea) GetLabelWidth() int { + return t.labelWidth +} + +// SetSize sets the screen size of the input element of the text area. The input +// element is always located next to the label which is always located in the +// top left corner. If any of the values are 0 or larger than the available +// space, the available space will be used. +func (t *TextArea) SetSize(rows, columns int) *TextArea { + t.width = columns + t.height = rows + return t +} + +// GetFieldWidth returns this primitive's field width. +func (t *TextArea) GetFieldWidth() int { + return t.width +} + +// GetFieldHeight returns this primitive's field height. +func (t *TextArea) GetFieldHeight() int { + return t.height +} + +// SetDisabled sets whether or not the item is disabled / read-only. +func (t *TextArea) SetDisabled(disabled bool) FormItem { + t.disabled = disabled + if t.finished != nil { + t.finished(-1) + } + return t +} + +// GetDisabled returns whether or not the item is disabled / read-only. +func (t *TextArea) GetDisabled() bool { + return t.disabled +} + +// SetMaxLength sets the maximum number of bytes allowed in the text area. A +// value of 0 means there is no limit. If the text area currently contains more +// bytes than this, it may violate this constraint. +func (t *TextArea) SetMaxLength(maxLength int) *TextArea { + t.maxLength = maxLength + return t +} + +// setMinCursorPadding sets a minimum width to be reserved left and right of the +// cursor. This is ignored if wrapping is enabled. +func (t *TextArea) setMinCursorPadding(prefix, suffix int) *TextArea { + t.minCursorPrefix = prefix + t.minCursorSuffix = suffix + return t +} + +// SetLabelStyle sets the style of the label. +func (t *TextArea) SetLabelStyle(style tcell.Style) *TextArea { + t.labelStyle = style + return t +} + +// GetLabelStyle returns the style of the label. +func (t *TextArea) GetLabelStyle() tcell.Style { + return t.labelStyle +} + +// SetTextStyle sets the style of the text. +func (t *TextArea) SetTextStyle(style tcell.Style) *TextArea { + t.textStyle = style + return t +} + +// GetTextStyle returns the style of the text. +func (t *TextArea) GetTextStyle() tcell.Style { + return t.textStyle +} + +// SetSelectedStyle sets the style of the selected text. +func (t *TextArea) SetSelectedStyle(style tcell.Style) *TextArea { + t.selectedStyle = style + return t +} + +// SetPlaceholderStyle sets the style of the placeholder text. +func (t *TextArea) SetPlaceholderStyle(style tcell.Style) *TextArea { + t.placeholderStyle = style + return t +} + +// GetPlaceholderStyle returns the style of the placeholder text. +func (t *TextArea) GetPlaceholderStyle() tcell.Style { + return t.placeholderStyle +} + +// GetOffset returns the text's offset, that is, the number of rows and columns +// skipped during drawing at the top or on the left, respectively. Note that the +// column offset is ignored if wrapping is enabled. +func (t *TextArea) GetOffset() (row, column int) { + return t.rowOffset, t.columnOffset +} + +// SetOffset sets the text's offset, that is, the number of rows and columns +// skipped during drawing at the top or on the left, respectively. If wrapping +// is enabled, the column offset is ignored. These values may get adjusted +// automatically to ensure that some text is always visible. +func (t *TextArea) SetOffset(row, column int) *TextArea { + t.rowOffset, t.columnOffset = row, column + return t +} + +// SetClipboard allows you to implement your own clipboard by providing a +// function that is called when the user wishes to store text in the clipboard +// (copyToClipboard) and a function that is called when the user wishes to +// retrieve text from the clipboard (pasteFromClipboard). +// +// Providing nil values will cause the default clipboard implementation to be +// used. Note that the default clipboard is local to this text area instance. +// Copying text to other widgets will not work. +func (t *TextArea) SetClipboard(copyToClipboard func(string), pasteFromClipboard func() string) *TextArea { + t.copyToClipboard = copyToClipboard + if t.copyToClipboard == nil { + t.copyToClipboard = func(text string) { + t.clipboard = text + } + } + + t.pasteFromClipboard = pasteFromClipboard + if t.pasteFromClipboard == nil { + t.pasteFromClipboard = func() string { + return t.clipboard + } + } + + return t +} + +// GetClipboardText returns the current text of the clipboard by calling the +// pasteFromClipboard function set with [TextArea.SetClipboard]. +func (t *TextArea) GetClipboardText() string { + return t.pasteFromClipboard() +} + +// SetChangedFunc sets a handler which is called whenever the text of the text +// area has changed. +func (t *TextArea) SetChangedFunc(handler func()) *TextArea { + t.changed = handler + return t +} + +// SetMovedFunc sets a handler which is called whenever the cursor position or +// the text selection has changed. +func (t *TextArea) SetMovedFunc(handler func()) *TextArea { + t.moved = handler + return t +} + +// SetFinishedFunc sets a callback invoked when the user leaves this form item. +func (t *TextArea) SetFinishedFunc(handler func(key tcell.Key)) FormItem { + t.finished = handler + return t +} + +// Focus is called when this primitive receives focus. +func (t *TextArea) Focus(delegate func(p Primitive)) { + // If we're part of a form and this item is disabled, there's nothing the + // user can do here so we're finished. + if t.finished != nil && t.disabled { + t.finished(-1) + return + } + + t.Box.Focus(delegate) +} + +// SetFormAttributes sets attributes shared by all form items. +func (t *TextArea) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) FormItem { + t.labelWidth = labelWidth + t.backgroundColor = bgColor + t.labelStyle = t.labelStyle.Foreground(labelColor) + t.textStyle = tcell.StyleDefault.Foreground(fieldTextColor).Background(fieldBgColor) + return t +} + +// replace deletes a range of text and inserts the given text at that position. +// If the resulting text would exceed the maximum length, the function does not +// do anything. The function returns the end position of the deleted/inserted +// range. +// +// The function can hang if "deleteStart" is located after "deleteEnd". +// +// Undo events are always generated unless continuation is true and text is +// either appended to the end of a span or a span is shortened at the beginning +// or the end (and nothing else). +// +// This function only modifies [TextArea.lineStarts] to update span references +// but does not change it to reflect the new layout. +// +// A "changed" event will be triggered. +func (t *TextArea) replace(deleteStart, deleteEnd [3]int, insert string, continuation bool) [3]int { + // Maybe nothing needs to be done? + if deleteStart == deleteEnd && insert == "" || t.maxLength > 0 && len(insert) > 0 && t.length+len(insert) >= t.maxLength { + return deleteEnd + } + + // Notify at the end. + if t.changed != nil { + defer t.changed() + } + + // Handle a few cases where we don't put anything onto the undo stack for + // increased efficiency. + if continuation { + // Same action as the one before. An undo item was already generated for + // this block of (same) actions. We're also only changing one character. + switch { + case insert == "" && deleteStart[1] != 0 && deleteEnd[1] == 0: + // Simple backspace. Just shorten this span. + length := t.spans[deleteStart[0]].length + if length < 0 { + t.length -= -length - deleteStart[1] + length = -deleteStart[1] + } else { + t.length -= length - deleteStart[1] + length = deleteStart[1] + } + t.spans[deleteStart[0]].length = length + return deleteEnd + case insert == "" && deleteStart[1] == 0 && deleteEnd[1] != 0: + // Simple delete. Just clip the beginning of this span. + t.spans[deleteEnd[0]].offset += deleteEnd[1] + if t.spans[deleteEnd[0]].length < 0 { + t.spans[deleteEnd[0]].length += deleteEnd[1] + } else { + t.spans[deleteEnd[0]].length -= deleteEnd[1] + } + t.length -= deleteEnd[1] + deleteEnd[1] = 0 + return deleteEnd + case insert != "" && deleteStart == deleteEnd && deleteEnd[1] == 0: + previous := t.spans[deleteStart[0]].previous + bufferSpan := t.spans[previous] + if bufferSpan.length > 0 && bufferSpan.offset+bufferSpan.length == t.editText.Len() { + // Typing individual characters. Simply extend the edit buffer. + length, _ := t.editText.WriteString(insert) + t.spans[previous].length += length + t.length += length + return deleteEnd + } + } + } + + // All other cases generate an undo item. + before := t.spans[deleteStart[0]].previous + after := deleteEnd[0] + if deleteEnd[1] > 0 { + after = t.spans[deleteEnd[0]].next + } + t.undoStack = t.undoStack[:t.nextUndo] + t.undoStack = append(t.undoStack, textAreaUndoItem{ + before: len(t.spans), + after: len(t.spans) + 1, + originalBefore: before, + originalAfter: after, + length: t.length, + pos: t.cursor.pos, + continuation: continuation, + }) + t.spans = append(t.spans, t.spans[before]) + t.spans = append(t.spans, t.spans[after]) + t.nextUndo++ + + // Adjust total text length by subtracting everything between "before" and + // "after". Inserted spans will be added back. + for index := deleteStart[0]; index != after; index = t.spans[index].next { + if t.spans[index].length < 0 { + t.length += t.spans[index].length + } else { + t.length -= t.spans[index].length + } + } + t.spans[before].next = after + t.spans[after].previous = before + + // We go from left to right, connecting new spans as needed. We update + // "before" as the span to connect new spans to. + + // If we start deleting in the middle of a span, connect a partial span. + if deleteStart[1] != 0 { + span := textAreaSpan{ + previous: before, + next: after, + offset: t.spans[deleteStart[0]].offset, + length: deleteStart[1], + } + if t.spans[deleteStart[0]].length < 0 { + span.length = -span.length + } + t.length += deleteStart[1] // This was previously subtracted. + t.spans[before].next = len(t.spans) + t.spans[after].previous = len(t.spans) + before = len(t.spans) + for row, lineStart := range t.lineStarts { // Also redirect line starts until the end of this new span. + if lineStart[0] == deleteStart[0] { + if lineStart[1] >= deleteStart[1] { + t.lineStarts = t.lineStarts[:row] // Everything else is unknown at this point. + break + } + t.lineStarts[row][0] = len(t.spans) + } + } + t.spans = append(t.spans, span) + } + + // If we insert text, connect a new span. + if insert != "" { + span := textAreaSpan{ + previous: before, + next: after, + offset: t.editText.Len(), + } + span.length, _ = t.editText.WriteString(insert) + t.length += span.length + t.spans[before].next = len(t.spans) + t.spans[after].previous = len(t.spans) + before = len(t.spans) + t.spans = append(t.spans, span) + } + + // If we stop deleting in the middle of a span, connect a partial span. + if deleteEnd[1] != 0 { + span := textAreaSpan{ + previous: before, + next: after, + offset: t.spans[deleteEnd[0]].offset + deleteEnd[1], + } + length := t.spans[deleteEnd[0]].length + if length < 0 { + span.length = length + deleteEnd[1] + t.length -= span.length // This was previously subtracted. + } else { + span.length = length - deleteEnd[1] + t.length += span.length // This was previously subtracted. + } + t.spans[before].next = len(t.spans) + t.spans[after].previous = len(t.spans) + deleteEnd[0], deleteEnd[1] = len(t.spans), 0 + t.spans = append(t.spans, span) + } + + return deleteEnd +} + +// Draw draws this primitive onto the screen. +func (t *TextArea) Draw(screen tcell.Screen) { + t.Box.DrawForSubclass(screen, t) + + // Prepare + x, y, width, height := t.GetInnerRect() + if width <= 0 || height <= 0 { + return // We have no space for anything. + } + columnOffset := t.columnOffset + if t.wrap { + columnOffset = 0 + } + + // Draw label. + _, labelBg, _ := t.labelStyle.Decompose() + if t.labelWidth > 0 { + labelWidth := t.labelWidth + if labelWidth > width { + labelWidth = width + } + printWithStyle(screen, t.label, x, y, 0, labelWidth, AlignLeft, t.labelStyle, labelBg == tcell.ColorDefault) + x += labelWidth + width -= labelWidth + } else { + _, _, drawnWidth := printWithStyle(screen, t.label, x, y, 0, width, AlignLeft, t.labelStyle, labelBg == tcell.ColorDefault) + x += drawnWidth + width -= drawnWidth + } + + // What's the space for the input element? + if t.width > 0 && t.width < width { + width = t.width + } + if t.height > 0 && t.height < height { + height = t.height + } + if width <= 0 { + return // No space left for the text area. + } + + // Draw the input element if necessary. + _, bg, _ := t.textStyle.Decompose() + if t.disabled { + bg = t.backgroundColor + } + if bg != t.backgroundColor { + for row := 0; row < height; row++ { + for column := 0; column < width; column++ { + screen.SetContent(x+column, y+row, ' ', nil, t.textStyle) + } + } + } + + // Show/hide the cursor at the end. + defer func() { + if t.HasFocus() { + row, column := t.cursor.row, t.cursor.actualColumn + if t.length > 0 && t.wrap && column >= t.lastWidth { // This happens when a row has text all the way until the end, pushing the cursor outside the viewport. + row++ + column = 0 + } + if row >= 0 && + row-t.rowOffset >= 0 && row-t.rowOffset < height && + column-columnOffset >= 0 && column-columnOffset < width { + screen.ShowCursor(x+column-columnOffset, y+row-t.rowOffset) + } else { + screen.HideCursor() + } + } + }() + + // No text, show placeholder. + if t.length == 0 { + t.lastHeight, t.lastWidth = height, width + t.cursor.row, t.cursor.column, t.cursor.actualColumn, t.cursor.pos = 0, 0, 0, [3]int{1, 0, -1} + t.rowOffset, t.columnOffset = 0, 0 + if len(t.placeholder) > 0 { + t.drawPlaceholder(screen, x, y, width, height) + } + return // We're done already. + } + + // Make sure the visible lines are broken over. + firstDrawing := t.lastWidth == 0 + if t.lastWidth != width && t.lineStarts != nil { + t.reset() + } + t.lastHeight, t.lastWidth = height, width + t.extendLines(width, t.rowOffset+height) + if len(t.lineStarts) <= t.rowOffset { + return // It's scrolled out of view. + } + + // If the cursor position is unknown, find it. This usually only happens + // before the screen is drawn for the first time. + if t.cursor.row < 0 { + t.findCursor(true, 0) + if t.selectionStart.row < 0 { + t.selectionStart = t.cursor + } + if firstDrawing && t.moved != nil { + t.moved() + } + } + + // Print the text. + var cluster, text string + line := t.rowOffset + pos := t.lineStarts[line] + endPos := pos + posX, posY := 0, 0 + for pos[0] != 1 { + var clusterWidth int + cluster, text, _, clusterWidth, pos, endPos = t.step(text, pos, endPos) + + // Prepare drawing. + runes := []rune(cluster) + style := t.selectedStyle + fromRow, fromColumn := t.cursor.row, t.cursor.actualColumn + toRow, toColumn := t.selectionStart.row, t.selectionStart.actualColumn + if fromRow > toRow || fromRow == toRow && fromColumn > toColumn { + fromRow, fromColumn, toRow, toColumn = toRow, toColumn, fromRow, fromColumn + } + if toRow < line || + toRow == line && toColumn <= posX || + fromRow > line || + fromRow == line && fromColumn > posX { + style = t.textStyle + if t.disabled { + style = style.Background(t.backgroundColor) + } + } + + // Selected tabs are a bit special. + if cluster == "\t" && style == t.selectedStyle { + for colX := 0; colX < clusterWidth && posX+colX-columnOffset < width; colX++ { + screen.SetContent(x+posX+colX-columnOffset, y+posY, ' ', nil, style) + } + } + + // Draw character. + if posX+clusterWidth-columnOffset <= width && posX-columnOffset >= 0 && clusterWidth > 0 { + screen.SetContent(x+posX-columnOffset, y+posY, runes[0], runes[1:], style) + } + + // Advance. + posX += clusterWidth + if line+1 < len(t.lineStarts) && t.lineStarts[line+1] == pos { + // We must break over. + posY++ + if posY >= height { + break // Done. + } + posX = 0 + line++ + } + } +} + +// drawPlaceholder draws the placeholder text into the given rectangle. It does +// not do anything if the text area already contains text or if there is no +// placeholder text. +func (t *TextArea) drawPlaceholder(screen tcell.Screen, x, y, width, height int) { + // We use a TextView to draw the placeholder. It will take care of word + // wrapping etc. + textView := NewTextView(). + SetText(t.placeholder). + SetTextStyle(t.placeholderStyle) + textView.SetRect(x, y, width, height) + textView.Draw(screen) +} + +// reset resets many of the local variables of the text area because they cannot +// be used anymore and must be recalculated, typically after the text area's +// size has changed. +func (t *TextArea) reset() { + t.truncateLines(0) + if t.wrap { + t.cursor.row = -1 + t.selectionStart.row = -1 + } + t.widestLine = 0 +} + +// extendLines traverses the current text and extends [TextArea.lineStarts] such +// that it describes at least maxLines+1 lines (or less if the text is shorter). +// Text is laid out for the given width while respecting the wrapping settings. +// It is assumed that if [TextArea.lineStarts] already has entries, they obey +// the same rules. +// +// If width is 0, nothing happens. +func (t *TextArea) extendLines(width, maxLines int) { + if width <= 0 { + return + } + + // Start with the first span. + if len(t.lineStarts) == 0 { + if len(t.spans) > 2 { + t.lineStarts = append(t.lineStarts, [3]int{t.spans[0].next, 0, -1}) + } else { + return // No text. + } + } + + // Determine starting positions and starting spans. + pos := t.lineStarts[len(t.lineStarts)-1] // The starting position is the last known line. + endPos := pos + var ( + cluster, text string + lineWidth, clusterWidth, boundaries int + lastGraphemeBreak, lastLineBreak [3]int + widthSinceLineBreak int + ) + for pos[0] != 1 { + // Get the next grapheme cluster. + cluster, text, boundaries, clusterWidth, pos, endPos = t.step(text, pos, endPos) + lineWidth += clusterWidth + widthSinceLineBreak += clusterWidth + + // Any line breaks? + if !t.wrap || lineWidth <= width { + if boundaries&uniseg.MaskLine == uniseg.LineMustBreak && (len(text) > 0 || uniseg.HasTrailingLineBreakInString(cluster)) { + // We must break over. + t.lineStarts = append(t.lineStarts, pos) + if lineWidth > t.widestLine { + t.widestLine = lineWidth + } + lineWidth = 0 + lastGraphemeBreak = [3]int{} + lastLineBreak = [3]int{} + widthSinceLineBreak = 0 + if len(t.lineStarts) > maxLines { + break // We have enough lines, we can stop. + } + continue + } + } else { // t.wrap && lineWidth > width + if !t.wordWrap || lastLineBreak == [3]int{} { + if lastGraphemeBreak != [3]int{} { // We have at least one character on each line. + // Break after last grapheme. + t.lineStarts = append(t.lineStarts, lastGraphemeBreak) + if lineWidth > t.widestLine { + t.widestLine = lineWidth + } + lineWidth = clusterWidth + lastLineBreak = [3]int{} + } + } else { // t.wordWrap && lastLineBreak != [3]int{} + // Break after last line break opportunity. + t.lineStarts = append(t.lineStarts, lastLineBreak) + if lineWidth > t.widestLine { + t.widestLine = lineWidth + } + lineWidth = widthSinceLineBreak + lastLineBreak = [3]int{} + } + } + + // Analyze break opportunities. + if boundaries&uniseg.MaskLine == uniseg.LineCanBreak { + lastLineBreak = pos + widthSinceLineBreak = 0 + } + lastGraphemeBreak = pos + + // Can we stop? + if len(t.lineStarts) > maxLines { + break + } + } + + if lineWidth > t.widestLine { + t.widestLine = lineWidth + } +} + +// truncateLines truncates the trailing lines of the [TextArea.lineStarts] +// slice such that len(lineStarts) <= fromLine. If fromLine is negative, a value +// of 0 is assumed. If it is greater than the length of lineStarts, nothing +// happens. +func (t *TextArea) truncateLines(fromLine int) { + if fromLine < 0 { + fromLine = 0 + } + if fromLine < len(t.lineStarts) { + t.lineStarts = t.lineStarts[:fromLine] + } +} + +// findCursor determines the cursor position if its "row" value is < 0 +// (=unknown) but only its span position ("pos" value) is known. If the cursor +// position is already known (row >= 0), it can also be used to modify row and +// column offsets such that the cursor is visible during the next call to +// [TextArea.Draw], by setting "clamp" to true. +// +// To determine the cursor position, "startRow" helps reduce processing time by +// indicating the lowest row in which searching should start. Set this to 0 if +// you don't have any information where the cursor might be (but know that this +// is expensive for long texts). +// +// The cursor's desired column will be set to its actual column. +func (t *TextArea) findCursor(clamp bool, startRow int) { + defer func() { + t.cursor.column = t.cursor.actualColumn + }() + + if !clamp && t.cursor.row >= 0 || t.lastWidth <= 0 { + return // Nothing to do. + } + + // Clamp to viewport. + if clamp && t.cursor.row >= 0 { + cursorRow := t.cursor.row + if t.wrap && t.cursor.actualColumn >= t.lastWidth { + cursorRow++ // A row can push the cursor just outside the viewport. It will wrap onto the next line. + } + if cursorRow < t.rowOffset { + // We're above the viewport. + t.rowOffset = cursorRow + } else if cursorRow >= t.rowOffset+t.lastHeight { + // We're below the viewport. + t.rowOffset = cursorRow - t.lastHeight + 1 + if t.rowOffset >= len(t.lineStarts) { + t.extendLines(t.lastWidth, t.rowOffset) + if t.rowOffset >= len(t.lineStarts) { + t.rowOffset = len(t.lineStarts) - 1 + if t.rowOffset < 0 { + t.rowOffset = 0 + } + } + } + } + if !t.wrap { + if t.cursor.actualColumn < t.columnOffset+t.minCursorPrefix { + // We're left of the viewport. + t.columnOffset = t.cursor.actualColumn - t.minCursorPrefix + if t.columnOffset < 0 { + t.columnOffset = 0 + } + } else if t.cursor.actualColumn >= t.columnOffset+t.lastWidth-t.minCursorSuffix { + // We're right of the viewport. + t.columnOffset = t.cursor.actualColumn - t.lastWidth + t.minCursorSuffix + if t.columnOffset >= t.widestLine { + t.columnOffset = t.widestLine - 1 + if t.columnOffset < 0 { + t.columnOffset = 0 + } + } + } + } + return + } + + // The screen position of the cursor is unknown. Find it. This can be + // expensive. First, find the row. + row := startRow + if row < 0 { + row = 0 + } +RowLoop: + for { + // Examine the current row. + if row+1 >= len(t.lineStarts) { + t.extendLines(t.lastWidth, row+1) + } + if row >= len(t.lineStarts) { + t.cursor.row, t.cursor.actualColumn, t.cursor.pos = row, 0, [3]int{1, 0, -1} + break // It's the end of the text. + } + + // Check this row's spans to see if the cursor is in this row. + pos := t.lineStarts[row] + for pos[0] != 1 { + if row+1 >= len(t.lineStarts) { + break // It's the last row so the cursor must be in this row. + } + if t.cursor.pos[0] == pos[0] { + // The cursor is in this span. + if t.lineStarts[row+1][0] == pos[0] { + // The next row starts with the same span. + if t.cursor.pos[1] >= t.lineStarts[row+1][1] { + // The cursor is not in this row. + row++ + continue RowLoop + } else { + // The cursor is in this row. + break + } + } else { + // The next row starts with a different span. The cursor + // must be in this row. + break + } + } else { + // The cursor is in a different span. + if t.lineStarts[row+1][0] == pos[0] { + // The next row starts with the same span. This row is + // irrelevant. + row++ + continue RowLoop + } else { + // The next row starts with a different span. Move towards it. + pos = [3]int{t.spans[pos[0]].next, 0, -1} + } + } + } + + // Try to find the screen position in this row. + pos = t.lineStarts[row] + endPos := pos + column := 0 + var text string + for { + if pos[0] == 1 || t.cursor.pos[0] == pos[0] && t.cursor.pos[1] == pos[1] { + // We found the position. We're done. + t.cursor.row, t.cursor.actualColumn, t.cursor.pos = row, column, pos + break RowLoop + } + var clusterWidth int + _, text, _, clusterWidth, pos, endPos = t.step(text, pos, endPos) + if row+1 < len(t.lineStarts) && t.lineStarts[row+1] == pos { + // We reached the end of the line. Go to the next one. + row++ + continue RowLoop + } + column += clusterWidth + } + } + + if clamp && t.cursor.row >= 0 { + // We know the position now. Adapt offsets. + t.findCursor(true, startRow) + } +} + +// setTransform sets the transform function to be used when drawing the text. +// This function is called for each grapheme cluster and can be used to modify +// the cluster, the cluster's screen width, and the cluster's boundaries. The +// function is called with the original cluster, the rest of the text, the +// original cluster's width, and the original cluster's boundaries. The function +// must return the new cluster, the new width, and the new boundaries. This only +// affects the drawing of the text, not the text content itself. The boundaries +// values correspond to the values returned by +// [github.com/rivo/uniseg.StepString]. +func (t *TextArea) setTransform(transform func(cluster, rest string, boundaries int) (newCluster string, newBoundaries int)) { + t.transform = transform +} + +// step is similar to [github.com/rivo/uniseg.StepString] but it iterates over +// the piece chain, starting with "pos", a span position plus state (which may +// be -1 for the start of the text). The returned "boundaries" value is the same +// value returned by [github.com/rivo/uniseg.StepString], "width" is the screen +// width of the grapheme. The "pos" and "endPos" positions refer to the start +// and the end of the "text" string, respectively. For the first call, text may +// be empty and pos/endPos may be the same. For consecutive calls, provide +// "rest" as the text and "newPos" and "newEndPos" as the new positions/states. +// An empty "rest" string indicates the end of the text. The "endPos" state is +// irrelevant. +func (t *TextArea) step(text string, pos, endPos [3]int) (cluster, rest string, boundaries, width int, newPos, newEndPos [3]int) { + if pos[0] == 1 { + return // We're already past the end. + } + + // We want to make sure we have a text at least the size of a grapheme + // cluster. + span := t.spans[pos[0]] + if len(text) < maxGraphemeClusterSize && + (span.length < 0 && -span.length-pos[1] >= maxGraphemeClusterSize || + span.length > 0 && t.spans[pos[0]].length-pos[1] >= maxGraphemeClusterSize) { + // We can use a substring of one span. + if span.length < 0 { + text = t.initialText[span.offset+pos[1] : span.offset-span.length] + } else { + text = t.editText.String()[span.offset+pos[1] : span.offset+span.length] + } + endPos = [3]int{span.next, 0, -1} + } else { + // We have to compose the text from multiple spans. + for len(text) < maxGraphemeClusterSize && endPos[0] != 1 { + endSpan := t.spans[endPos[0]] + var moreText string + if endSpan.length < 0 { + moreText = t.initialText[endSpan.offset+endPos[1] : endSpan.offset-endSpan.length] + } else { + moreText = t.editText.String()[endSpan.offset+endPos[1] : endSpan.offset+endSpan.length] + } + if len(moreText) > maxGraphemeClusterSize { + moreText = moreText[:maxGraphemeClusterSize] + } + text += moreText + endPos[1] += len(moreText) + if endPos[1] >= endSpan.length { + endPos[0], endPos[1] = endSpan.next, 0 + } + } + } + + // Run the grapheme cluster iterator. + cluster, text, boundaries, pos[2] = uniseg.StepString(text, pos[2]) + pos[1] += len(cluster) + for pos[0] != 1 && (span.length < 0 && pos[1] >= -span.length || span.length >= 0 && pos[1] >= span.length) { + pos[0] = span.next + if span.length < 0 { + pos[1] += span.length + } else { + pos[1] -= span.length + } + span = t.spans[pos[0]] + } + + if t.transform != nil { + cluster, boundaries = t.transform(cluster, text, boundaries) + } + + if cluster == "\t" { + width = TabSize + } else { + width = boundaries >> uniseg.ShiftWidth + } + + return cluster, text, boundaries, width, pos, endPos +} + +// moveCursor sets the cursor's screen position and span position for the given +// row and column which are screen space coordinates relative to the top-left +// corner of the text area's full text (visible or not). The column value may be +// negative, in which case, the cursor will be placed at the end of the line. +// The cursor's actual position will be aligned with a grapheme cluster +// boundary. The next call to [TextArea.Draw] will attempt to keep the cursor in +// the viewport. +func (t *TextArea) moveCursor(row, column int) { + // Are we within the range of rows? + if len(t.lineStarts) <= row { + // No. Extent the line buffer. + t.extendLines(t.lastWidth, row) + } + if len(t.lineStarts) == 0 { + return // No lines. Nothing to do. + } + if row < 0 { + // We're at the start of the text. + row = 0 + column = 0 + } else if row >= len(t.lineStarts) { + // We're already past the end. + row = len(t.lineStarts) - 1 + column = -1 + } + + // Iterate through this row until we find the position. + t.cursor.row, t.cursor.actualColumn = row, 0 + if t.wrap { + t.cursor.actualColumn = 0 + } + pos := t.lineStarts[row] + endPos := pos + var text string + for pos[0] != 1 { + var clusterWidth int + oldPos := pos // We may have to revert to this position. + _, text, _, clusterWidth, pos, endPos = t.step(text, pos, endPos) + if len(t.lineStarts) > row+1 && pos == t.lineStarts[row+1] || // We've reached the end of the line. + column >= 0 && t.cursor.actualColumn+clusterWidth > column { // We're past the requested column. + pos = oldPos + break + } + t.cursor.actualColumn += clusterWidth + } + + if column < 0 { + t.cursor.column = t.cursor.actualColumn + } else { + t.cursor.column = column + } + t.cursor.pos = pos + t.findCursor(true, row) +} + +// moveWordRight moves the cursor to the end of the current or next word. If +// after is set to true, the cursor will be placed after the word. If false, the +// cursor will be placed on the last character of the word. If clamp is set to +// true, the cursor will be visible during the next call to [TextArea.Draw]. +func (t *TextArea) moveWordRight(after, clamp bool) { + // Because we rely on clampToCursor to calculate the new screen position, + // this is an expensive operation for large texts. + pos := t.cursor.pos + endPos := pos + var ( + cluster, text string + inWord bool + ) + for pos[0] != 0 { + var boundaries int + oldPos := pos + cluster, text, boundaries, _, pos, endPos = t.step(text, pos, endPos) + if oldPos == t.cursor.pos { + continue // Skip the first character. + } + firstRune, _ := utf8.DecodeRuneInString(cluster) + if !unicode.IsSpace(firstRune) && !unicode.IsPunct(firstRune) { + inWord = true + } + if inWord && boundaries&uniseg.MaskWord != 0 { + if !after { + pos = oldPos + } + break + } + } + startRow := t.cursor.row + t.cursor.row, t.cursor.column, t.cursor.actualColumn = -1, 0, 0 + t.cursor.pos = pos + t.findCursor(clamp, startRow) +} + +// moveWordLeft moves the cursor to the beginning of the current or previous +// word. If clamp is true, the cursor will be visible during the next call to +// [TextArea.Draw]. +func (t *TextArea) moveWordLeft(clamp bool) { + // We go back row by row, trying to find the last word boundary before the + // cursor. + row := t.cursor.row + if row+1 < len(t.lineStarts) { + t.extendLines(t.lastWidth, row+1) + } + if row >= len(t.lineStarts) { + row = len(t.lineStarts) - 1 + } + for row >= 0 { + pos := t.lineStarts[row] + endPos := pos + var lastWordBoundary [3]int + var ( + cluster, text string + inWord bool + boundaries int + ) + for pos[0] != 1 && pos != t.cursor.pos { + oldBoundaries := boundaries + oldPos := pos + cluster, text, boundaries, _, pos, endPos = t.step(text, pos, endPos) + firstRune, _ := utf8.DecodeRuneInString(cluster) + wordRune := !unicode.IsSpace(firstRune) && !unicode.IsPunct(firstRune) + if oldBoundaries&uniseg.MaskWord != 0 { + if pos != t.cursor.pos && !inWord && wordRune { + // A boundary transitioning from a space/punctuation word to + // a letter word. + lastWordBoundary = oldPos + } + inWord = false + } + if wordRune { + inWord = true + } + } + if lastWordBoundary[0] != 0 { + // We found something. + t.cursor.pos = lastWordBoundary + break + } + row-- + } + if row < 0 { + // We didn't find anything. We're at the start of the text. + t.cursor.pos = [3]int{t.spans[0].next, 0, -1} + row = 0 + } + t.cursor.row, t.cursor.column, t.cursor.actualColumn = -1, 0, 0 + t.findCursor(clamp, row) +} + +// deleteLine deletes all characters between the last newline before the cursor +// and the next newline after the cursor (inclusive). +func (t *TextArea) deleteLine() { + // We go back row by row, trying to find the last mandatory line break + // before the cursor. + startRow := t.cursor.row + if t.cursor.actualColumn == 0 && t.cursor.pos[0] == 1 { + startRow-- // If we're at the very end, delete the row before. + } + if startRow+1 < len(t.lineStarts) { + t.extendLines(t.lastWidth, startRow+1) + } + if len(t.lineStarts) == 0 { + return // Nothing to delete. + } + if startRow >= len(t.lineStarts) { + startRow = len(t.lineStarts) - 1 + } + for startRow >= 0 { + // What's the last rune before the start of the line? + pos := t.lineStarts[startRow] + span := t.spans[pos[0]] + var text string + if pos[1] > 0 { + // Extract text from this span. + if span.length < 0 { + text = t.initialText + } else { + text = t.editText.String() + } + text = text[:span.offset+pos[1]] + } else { + // Extract text from the previous span. + if span.previous != 0 { + span = t.spans[span.previous] + if span.length < 0 { + text = t.initialText[:span.offset-span.length] + } else { + text = t.editText.String()[:span.offset+span.length] + } + } + } + if uniseg.HasTrailingLineBreakInString(text) { + // The row before this one ends with a mandatory line break. This is + // the first line we will delete. + break + } + startRow-- + } + if startRow < 0 { + // We didn't find anything. It'll be the first line. + startRow = 0 + } + + // Find the next line break after the cursor. + pos := t.cursor.pos + endPos := pos + var cluster, text string + for pos[0] != 1 { + cluster, text, _, _, pos, endPos = t.step(text, pos, endPos) + if uniseg.HasTrailingLineBreakInString(cluster) { + break + } + } + + // Delete the text. + t.cursor.pos = t.replace(t.lineStarts[startRow], pos, "", false) + t.cursor.row = -1 + t.truncateLines(startRow) + t.findCursor(true, startRow) +} + +// getSelection returns the current selection as span locations where the first +// returned location is always before or the same as the second returned +// location. This assumes that the cursor and selection positions are known. The +// third return value is the starting row of the selection. +func (t *TextArea) getSelection() ([3]int, [3]int, int) { + from := t.selectionStart.pos + to := t.cursor.pos + row := t.selectionStart.row + if t.cursor.row < t.selectionStart.row || + (t.cursor.row == t.selectionStart.row && t.cursor.actualColumn < t.selectionStart.actualColumn) { + from, to = to, from + row = t.cursor.row + } + return from, to, row +} + +// getSelectedText returns the text of the current selection. +func (t *TextArea) getSelectedText() string { + var text strings.Builder + + from, to, _ := t.getSelection() + for from[0] != to[0] { + span := t.spans[from[0]] + if span.length < 0 { + text.WriteString(t.initialText[span.offset+from[1] : span.offset-span.length]) + } else { + text.WriteString(t.editText.String()[span.offset+from[1] : span.offset+span.length]) + } + from[0], from[1] = span.next, 0 + } + if from[0] != 1 && from[1] < to[1] { + span := t.spans[from[0]] + if span.length < 0 { + text.WriteString(t.initialText[span.offset+from[1] : span.offset+to[1]]) + } else { + text.WriteString(t.editText.String()[span.offset+from[1] : span.offset+to[1]]) + } + } + + return text.String() +} + +// InputHandler returns the handler for this primitive. +func (t *TextArea) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + if t.disabled { + return + } + + // All actions except a few specific ones are "other" actions. + newLastAction := taActionOther + defer func() { + t.lastAction = newLastAction + }() + + // Trigger a "moved" event if requested. + if t.moved != nil { + selectionStart, cursor := t.selectionStart, t.cursor + defer func() { + if selectionStart != t.selectionStart || cursor != t.cursor { + t.moved() + } + }() + } + + // Process the different key events. + switch key := event.Key(); key { + case tcell.KeyLeft: // Move one grapheme cluster to the left. + if event.Modifiers()&tcell.ModAlt == 0 { + // Regular movement. + if event.Modifiers()&tcell.ModShift == 0 && t.selectionStart.pos != t.cursor.pos { + // Move to the start of the selection. + if t.selectionStart.row < t.cursor.row || (t.selectionStart.row == t.cursor.row && t.selectionStart.actualColumn < t.cursor.actualColumn) { + t.cursor = t.selectionStart + } + t.findCursor(true, t.cursor.row) + } else if event.Modifiers()&tcell.ModMeta != 0 || event.Modifiers()&tcell.ModCtrl != 0 { + // This captures Ctrl-Left on some systems. + t.moveWordLeft(event.Modifiers()&tcell.ModShift != 0) + } else if t.cursor.actualColumn == 0 { + // Move to the end of the previous row. + if t.cursor.row > 0 { + t.moveCursor(t.cursor.row-1, -1) + } + } else { + // Move one grapheme cluster to the left. + t.moveCursor(t.cursor.row, t.cursor.actualColumn-1) + } + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + } else if !t.wrap { // This doesn't work on all terminals. + // Just scroll. + t.columnOffset-- + if t.columnOffset < 0 { + t.columnOffset = 0 + } + } + case tcell.KeyRight: // Move one grapheme cluster to the right. + if event.Modifiers()&tcell.ModAlt == 0 { + // Regular movement. + if event.Modifiers()&tcell.ModShift == 0 && t.selectionStart.pos != t.cursor.pos { + // Move to the end of the selection. + if t.selectionStart.row > t.cursor.row || (t.selectionStart.row == t.cursor.row && t.selectionStart.actualColumn > t.cursor.actualColumn) { + t.cursor = t.selectionStart + } + t.findCursor(true, t.cursor.row) + } else if t.cursor.pos[0] != 1 { + if event.Modifiers()&tcell.ModMeta != 0 || event.Modifiers()&tcell.ModCtrl != 0 { + // This captures Ctrl-Right on some systems. + t.moveWordRight(event.Modifiers()&tcell.ModShift != 0, true) + } else { + // Move one grapheme cluster to the right. + var clusterWidth int + _, _, _, clusterWidth, t.cursor.pos, _ = t.step("", t.cursor.pos, t.cursor.pos) + if len(t.lineStarts) <= t.cursor.row+1 { + t.extendLines(t.lastWidth, t.cursor.row+1) + } + if t.cursor.row+1 < len(t.lineStarts) && t.lineStarts[t.cursor.row+1] == t.cursor.pos { + // We've reached the end of the line. + t.cursor.row++ + t.cursor.actualColumn = 0 + t.cursor.column = 0 + t.findCursor(true, t.cursor.row) + } else { + // Move one character to the right. + t.moveCursor(t.cursor.row, t.cursor.actualColumn+clusterWidth) + } + } + } + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + } else if !t.wrap { // This doesn't work on all terminals. + // Just scroll. + t.columnOffset++ + if t.columnOffset >= t.widestLine { + t.columnOffset = t.widestLine - 1 + if t.columnOffset < 0 { + t.columnOffset = 0 + } + } + } + case tcell.KeyDown: // Move one row down. + if event.Modifiers()&tcell.ModAlt == 0 { + // Regular movement. + column := t.cursor.column + t.moveCursor(t.cursor.row+1, t.cursor.column) + t.cursor.column = column + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + } else { + // Just scroll. + t.rowOffset++ + if t.rowOffset >= len(t.lineStarts) { + t.extendLines(t.lastWidth, t.rowOffset) + if t.rowOffset >= len(t.lineStarts) { + t.rowOffset = len(t.lineStarts) - 1 + if t.rowOffset < 0 { + t.rowOffset = 0 + } + } + } + } + case tcell.KeyUp: // Move one row up. + if event.Modifiers()&tcell.ModAlt == 0 { + // Regular movement. + column := t.cursor.column + t.moveCursor(t.cursor.row-1, t.cursor.column) + t.cursor.column = column + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + } else { + // Just scroll. + t.rowOffset-- + if t.rowOffset < 0 { + t.rowOffset = 0 + } + } + case tcell.KeyHome, tcell.KeyCtrlA: // Move to the start of the line. + t.moveCursor(t.cursor.row, 0) + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + case tcell.KeyEnd, tcell.KeyCtrlE: // Move to the end of the line. + t.moveCursor(t.cursor.row, -1) + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + case tcell.KeyPgDn, tcell.KeyCtrlF: // Move one page down. + column := t.cursor.column + t.moveCursor(t.cursor.row+t.lastHeight, t.cursor.column) + t.cursor.column = column + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + case tcell.KeyPgUp, tcell.KeyCtrlB: // Move one page up. + column := t.cursor.column + t.moveCursor(t.cursor.row-t.lastHeight, t.cursor.column) + t.cursor.column = column + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + case tcell.KeyEnter: // Insert a newline. + from, to, row := t.getSelection() + t.cursor.pos = t.replace(from, to, NewLine, t.lastAction == taActionTypeSpace) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + newLastAction = taActionTypeSpace + case tcell.KeyTab: // Insert a tab character. It will be rendered as TabSize spaces. + // But forwarding takes precedence. + if t.finished != nil { + t.finished(key) + return + } + + from, to, row := t.getSelection() + t.cursor.pos = t.replace(from, to, "\t", t.lastAction == taActionTypeSpace) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + newLastAction = taActionTypeSpace + case tcell.KeyBacktab, tcell.KeyEscape: // Only used in forms. + if t.finished != nil { + t.finished(key) + return + } + case tcell.KeyRune: + if event.Modifiers()&tcell.ModAlt > 0 { + // We accept some Alt- key combinations. + switch event.Rune() { + case 'f': + if event.Modifiers()&tcell.ModShift == 0 { + t.moveWordRight(false, true) + t.selectionStart = t.cursor + } else { + t.moveWordRight(true, true) + } + case 'b': + t.moveWordLeft(true) + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + } + } else { + // Other keys are simply accepted as regular characters. + r := event.Rune() + from, to, row := t.getSelection() + newLastAction = taActionTypeNonSpace + if unicode.IsSpace(r) { + newLastAction = taActionTypeSpace + } + t.cursor.pos = t.replace(from, to, string(r), newLastAction == t.lastAction || t.lastAction == taActionTypeNonSpace && newLastAction == taActionTypeSpace) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + } + case tcell.KeyBackspace, tcell.KeyBackspace2: // Delete backwards. tcell.KeyBackspace is the same as tcell.CtrlH. + from, to, row := t.getSelection() + if from != to { + // Simply delete the current selection. + t.cursor.pos = t.replace(from, to, "", false) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + break + } + + beforeCursor := t.cursor + if event.Modifiers()&tcell.ModAlt == 0 { + // Move the cursor back by one grapheme cluster. + if t.cursor.actualColumn == 0 { + // Move to the end of the previous row. + if t.cursor.row > 0 { + t.moveCursor(t.cursor.row-1, -1) + } + } else { + // Move one grapheme cluster to the left. + t.moveCursor(t.cursor.row, t.cursor.actualColumn-1) + } + newLastAction = taActionBackspace + } else { + // Move the cursor back by one word. + t.moveWordLeft(false) + } + + // Remove that last grapheme cluster. + if t.cursor.pos != beforeCursor.pos { + t.cursor, beforeCursor = beforeCursor, t.cursor // So we put the right position on the stack. + t.cursor.pos = t.replace(beforeCursor.pos, t.cursor.pos, "", t.lastAction == taActionBackspace) // Delete the character. + t.cursor.row = -1 + t.truncateLines(beforeCursor.row - 1) + t.findCursor(true, beforeCursor.row-1) + } + t.selectionStart = t.cursor + case tcell.KeyDelete, tcell.KeyCtrlD: // Delete forward. + from, to, row := t.getSelection() + if from != to { + // Simply delete the current selection. + t.cursor.pos = t.replace(from, to, "", false) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + break + } + + if t.cursor.pos[0] != 1 { + _, _, _, _, endPos, _ := t.step("", t.cursor.pos, t.cursor.pos) + t.cursor.pos = t.replace(t.cursor.pos, endPos, "", t.lastAction == taActionDelete) // Delete the character. + t.cursor.pos[2] = endPos[2] + t.truncateLines(t.cursor.row - 1) + t.findCursor(true, t.cursor.row) + newLastAction = taActionDelete + } + t.selectionStart = t.cursor + case tcell.KeyCtrlK: // Delete everything under and to the right of the cursor until before the next newline character. + pos := t.cursor.pos + endPos := pos + var cluster, text string + for pos[0] != 1 { + var boundaries int + oldPos := pos + cluster, text, boundaries, _, pos, endPos = t.step(text, pos, endPos) + if boundaries&uniseg.MaskLine == uniseg.LineMustBreak { + if uniseg.HasTrailingLineBreakInString(cluster) { + pos = oldPos + } + break + } + } + t.cursor.pos = t.replace(t.cursor.pos, pos, "", false) + row := t.cursor.row + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + case tcell.KeyCtrlW: // Delete from the start of the current word to the left of the cursor. + pos := t.cursor.pos + t.moveWordLeft(true) + t.cursor.pos = t.replace(t.cursor.pos, pos, "", false) + row := t.cursor.row - 1 + t.cursor.row = -1 + t.truncateLines(row) + t.findCursor(true, row) + t.selectionStart = t.cursor + case tcell.KeyCtrlU: // Delete the current line. + t.deleteLine() + t.selectionStart = t.cursor + case tcell.KeyCtrlL: // Select everything. + t.selectionStart.row, t.selectionStart.column, t.selectionStart.actualColumn = 0, 0, 0 + t.selectionStart.pos = [3]int{t.spans[0].next, 0, -1} + row := t.cursor.row + t.cursor.row = -1 + t.cursor.pos = [3]int{1, 0, -1} + t.findCursor(false, row) + case tcell.KeyCtrlQ: // Copy to clipboard. + if t.cursor != t.selectionStart { + t.copyToClipboard(t.getSelectedText()) + t.selectionStart = t.cursor + } + case tcell.KeyCtrlX: // Cut to clipboard. + if t.cursor != t.selectionStart { + t.copyToClipboard(t.getSelectedText()) + from, to, row := t.getSelection() + t.cursor.pos = t.replace(from, to, "", false) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + } + case tcell.KeyCtrlV: // Paste from clipboard. + from, to, row := t.getSelection() + t.cursor.pos = t.replace(from, to, t.pasteFromClipboard(), false) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + case tcell.KeyCtrlZ: // Undo. + if t.nextUndo <= 0 { + break + } + for t.nextUndo > 0 { + t.nextUndo-- + undo := t.undoStack[t.nextUndo] + t.spans[undo.originalBefore], t.spans[undo.before] = t.spans[undo.before], t.spans[undo.originalBefore] + t.spans[undo.originalAfter], t.spans[undo.after] = t.spans[undo.after], t.spans[undo.originalAfter] + t.cursor.pos, t.undoStack[t.nextUndo].pos = undo.pos, t.cursor.pos + t.length, t.undoStack[t.nextUndo].length = undo.length, t.length + if !undo.continuation { + break + } + } + t.cursor.row = -1 + t.truncateLines(0) // This is why Undo is expensive for large texts. (t.lineStarts can get largely unusable after an undo.) + t.findCursor(true, 0) + t.selectionStart = t.cursor + if t.changed != nil { + defer t.changed() + } + case tcell.KeyCtrlY: // Redo. + if t.nextUndo >= len(t.undoStack) { + break + } + for t.nextUndo < len(t.undoStack) { + undo := t.undoStack[t.nextUndo] + t.spans[undo.originalBefore], t.spans[undo.before] = t.spans[undo.before], t.spans[undo.originalBefore] + t.spans[undo.originalAfter], t.spans[undo.after] = t.spans[undo.after], t.spans[undo.originalAfter] + t.cursor.pos, t.undoStack[t.nextUndo].pos = undo.pos, t.cursor.pos + t.length, t.undoStack[t.nextUndo].length = undo.length, t.length + t.nextUndo++ + if t.nextUndo < len(t.undoStack) && !t.undoStack[t.nextUndo].continuation { + break + } + } + t.cursor.row = -1 + t.truncateLines(0) // This is why Redo is expensive for large texts. (t.lineStarts can get largely unusable after an undo.) + t.findCursor(true, 0) + t.selectionStart = t.cursor + if t.changed != nil { + defer t.changed() + } + } + }) +} + +// MouseHandler returns the mouse handler for this primitive. +func (t *TextArea) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return t.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + if t.disabled { + return false, nil + } + + x, y := event.Position() + rectX, rectY, _, _ := t.GetInnerRect() + if !t.InRect(x, y) { + return false, nil + } + + // Trigger a "moved" event at the end if requested. + if t.moved != nil { + selectionStart, cursor := t.selectionStart, t.cursor + defer func() { + if selectionStart != t.selectionStart || cursor != t.cursor { + t.moved() + } + }() + } + + // Turn mouse coordinates into text coordinates. + labelWidth := t.labelWidth + if labelWidth == 0 && t.label != "" { + labelWidth = TaggedStringWidth(t.label) + } + column := x - rectX - labelWidth + row := y - rectY + if !t.wrap { + column += t.columnOffset + } + row += t.rowOffset + + // Process mouse actions. + switch action { + case MouseLeftDown: + t.moveCursor(row, column) + if event.Modifiers()&tcell.ModShift == 0 { + t.selectionStart = t.cursor + } + setFocus(t) + consumed = true + capture = t + t.dragging = true + case MouseMove: + if !t.dragging { + break + } + t.moveCursor(row, column) + consumed = true + case MouseLeftUp: + t.moveCursor(row, column) + consumed = true + capture = nil + t.dragging = false + case MouseLeftDoubleClick: // Select word. + // Left down/up was already triggered so we are at the correct + // position. + t.moveWordLeft(false) + t.selectionStart = t.cursor + t.moveWordRight(true, false) + consumed = true + case MouseScrollUp: + if t.rowOffset > 0 { + t.rowOffset-- + } + consumed = true + case MouseScrollDown: + t.rowOffset++ + if t.rowOffset >= len(t.lineStarts) { + t.rowOffset = len(t.lineStarts) - 1 + if t.rowOffset < 0 { + t.rowOffset = 0 + } + } + consumed = true + case MouseScrollLeft: + if t.columnOffset > 0 { + t.columnOffset-- + } + consumed = true + case MouseScrollRight: + t.columnOffset++ + if t.columnOffset >= t.widestLine { + t.columnOffset = t.widestLine - 1 + if t.columnOffset < 0 { + t.columnOffset = 0 + } + } + consumed = true + } + + return + }) +} + +// PasteHandler returns the handler for this primitive. +func (t *TextArea) PasteHandler() func(pastedText string, setFocus func(p Primitive)) { + return t.WrapPasteHandler(func(pastedText string, setFocus func(p Primitive)) { + from, to, row := t.getSelection() + t.cursor.pos = t.replace(from, to, pastedText, false) + t.cursor.row = -1 + t.truncateLines(row - 1) + t.findCursor(true, row) + t.selectionStart = t.cursor + }) +} diff --git a/vendor/github.com/rivo/tview/textview.go b/vendor/github.com/rivo/tview/textview.go new file mode 100644 index 00000000..56427040 --- /dev/null +++ b/vendor/github.com/rivo/tview/textview.go @@ -0,0 +1,1446 @@ +package tview + +import ( + "math" + "strings" + "sync" + + "github.com/gdamore/tcell/v2" + colorful "github.com/lucasb-eyer/go-colorful" +) + +// TabSize is the number of spaces with which a tab character will be replaced. +var TabSize = 4 + +// textViewLine contains information about a line displayed in the text view. +type textViewLine struct { + offset int // The string position in the buffer where this line starts. + width int // The screen width of this line. + length int // The string length (in bytes) of this line. + state *stepState // The parser state at the beginning of the line, before parsing the first character. + regions map[string][2]int // The start and end columns of all regions in this line. Only valid for visible lines. May be nil. +} + +// TextViewWriter is a writer that can be used to write to and clear a TextView +// in batches, i.e. multiple writes with the lock only being acquired once. Don't +// instantiated this class directly but use the TextView's BatchWriter method +// instead. +type TextViewWriter struct { + t *TextView +} + +// Close implements io.Closer for the writer by unlocking the original TextView. +func (w TextViewWriter) Close() error { + w.t.Unlock() + return nil +} + +// Clear removes all text from the buffer. +func (w TextViewWriter) Clear() { + w.t.clear() +} + +// Write implements the io.Writer interface. It behaves like the TextView's +// Write() method except that it does not acquire the lock. +func (w TextViewWriter) Write(p []byte) (n int, err error) { + return w.t.write(p) +} + +// HasFocus returns whether the underlying TextView has focus. +func (w TextViewWriter) HasFocus() bool { + return w.t.hasFocus +} + +// TextView is a component to display read-only text. While the text to be +// displayed can be changed or appended to, there is no functionality that +// allows the user to edit it. For that, [TextArea] should be used. +// +// TextView implements the io.Writer interface so you can stream text to it, +// appending to the existing text. This does not trigger a redraw automatically +// but if a handler is installed via [TextView.SetChangedFunc], you can cause it +// to be redrawn. (See [TextView.SetChangedFunc] for more details.) +// +// Tab characters advance the text to the next tab stop at every [TabSize] +// screen columns, but only if the text is left-aligned. If the text is centered +// or right-aligned, tab characters are simply replaced with [TabSize] spaces. +// +// Word wrapping is enabled by default. Use [TextView.SetWrap] and +// [TextView.SetWordWrap] to change this. +// +// # Navigation +// +// If the text view is set to be scrollable (which is the default), text is kept +// in a buffer which may be larger than the screen and can be navigated +// with Vim-like key binds: +// +// - h, left arrow: Move left. +// - l, right arrow: Move right. +// - j, down arrow: Move down. +// - k, up arrow: Move up. +// - g, home: Move to the top. +// - G, end: Move to the bottom. +// - Ctrl-F, page down: Move down by one page. +// - Ctrl-B, page up: Move up by one page. +// +// If the text is not scrollable, any text above the top visible line is +// discarded. This can be useful when you want to continuously stream text to +// the text view and only keep the latest lines. +// +// Use [Box.SetInputCapture] to override or modify keyboard input. +// +// # Styles / Colors +// +// If dynamic colors are enabled via [TextView.SetDynamicColors], text style can +// be changed dynamically by embedding color strings in square brackets. This +// works the same way as anywhere else. See the package documentation for more +// information. +// +// # Regions and Highlights +// +// If regions are enabled via [TextView.SetRegions], you can define text regions +// within the text and assign region IDs to them. Text regions start with region +// tags. Region tags are square brackets that contain a region ID in double +// quotes, for example: +// +// We define a ["rg"]region[""] here. +// +// A text region ends with the next region tag. Tags with no region ID ([""]) +// don't start new regions. They can therefore be used to mark the end of a +// region. Region IDs must satisfy the following regular expression: +// +// [a-zA-Z0-9_,;: \-\.]+ +// +// Regions can be highlighted by calling the [TextView.Highlight] function with +// one or more region IDs. This can be used to display search results, for +// example. +// +// The [TextView.ScrollToHighlight] function can be used to jump to the +// currently highlighted region once when the text view is drawn the next time. +// +// # Large Texts +// +// The text view can handle reasonably large texts. It will parse the text as +// needed. For optimal performance, it is best to access or display parts of the +// text very far down only if really needed. For example, call +// [TextView.ScrollToBeginning] before adding the text to the text view, to +// avoid scrolling the text all the way to the bottom, forcing a full-text +// parse. +// +// For even larger texts or "infinite" streams of text such as log files, you +// should consider using [TextView.SetMaxLines] to limit the number of lines in +// the text view buffer. Or disable the text view's scrollability altogether +// (using [TextView.SetScrollable]). This will cause the text view to discard +// lines moving out of the visible area at the top. +// +// See https://github.com/rivo/tview/wiki/TextView for an example. +type TextView struct { + sync.Mutex + *Box + + // The size of the text area. If set to 0, the text view will use the entire + // available space. + width, height int + + // The text buffer. + text strings.Builder + + // The line index. It is valid at any time but may not contain trailing + // lines which are not visible. + lineIndex []*textViewLine + + // The screen width of the longest line in the index. + longestLine int + + // Regions mapped by their ID to the line where they start. Regions which + // cannot be found in [TextView.lineIndex] are not contained. + regions map[string]int + + // The label text shown, usually when part of a form. + label string + + // The width of the text area's label. + labelWidth int + + // The label style. + labelStyle tcell.Style + + // The text alignment, one of AlignLeft, AlignCenter, or AlignRight. + align int + + // Currently highlighted regions. + highlights map[string]struct{} + + // The last width for which the current text view was drawn. + lastWidth int + + // The height of the content the last time the text view was drawn. + pageSize int + + // The index of the first line shown in the text view. + lineOffset int + + // If set to true, the text view will always remain at the end of the + // content when text is added. + trackEnd bool + + // The width of the characters to be skipped on each line (not used in wrap + // mode). + columnOffset int + + // The maximum number of lines kept in the line index, effectively the + // latest word-wrapped lines. Ignored if 0. + maxLines int + + // If set to true, the text view will keep a buffer of text which can be + // navigated when the text is longer than what fits into the box. + scrollable bool + + // If set to true, lines that are longer than the available width are + // wrapped onto the next line. If set to false, any characters beyond the + // available width are discarded. + wrap bool + + // If set to true and if wrap is also true, Unicode line breaking is + // applied. + wordWrap bool + + // The (starting) style of the text. This also defines the background color + // of the main text element. + textStyle tcell.Style + + // Whether or not style tags are used. + styleTags bool + + // Whether or not region tags are used. + regionTags bool + + // A temporary flag which, when true, will automatically bring the current + // highlight(s) into the visible screen the next time the text view is + // drawn. + scrollToHighlights bool + + // If true, setting new highlights will be a XOR instead of an overwrite + // operation. + toggleHighlights bool + + // An optional function which is called when the content of the text view + // has changed. + changed func() + + // An optional function which is called when the user presses one of the + // following keys: Escape, Enter, Tab, Backtab. + done func(tcell.Key) + + // An optional function which is called when one or more regions were + // highlighted. + highlighted func(added, removed, remaining []string) + + // A callback function set by the Form class and called when the user leaves + // this form item. + finished func(tcell.Key) +} + +// NewTextView returns a new text view. +func NewTextView() *TextView { + return &TextView{ + Box: NewBox(), + labelStyle: tcell.StyleDefault.Foreground(Styles.SecondaryTextColor), + highlights: make(map[string]struct{}), + lineOffset: -1, + scrollable: true, + align: AlignLeft, + wrap: true, + wordWrap: true, + textStyle: tcell.StyleDefault.Background(Styles.PrimitiveBackgroundColor).Foreground(Styles.PrimaryTextColor), + regionTags: false, + styleTags: false, + } +} + +// SetLabel sets the text to be displayed before the text view. +func (t *TextView) SetLabel(label string) *TextView { + t.label = label + return t +} + +// GetLabel returns the text to be displayed before the text view. +func (t *TextView) GetLabel() string { + return t.label +} + +// SetLabelWidth sets the screen width of the label. A value of 0 will cause the +// primitive to use the width of the label string. +func (t *TextView) SetLabelWidth(width int) *TextView { + t.labelWidth = width + return t +} + +// SetSize sets the screen size of the main text element of the text view. This +// element is always located next to the label which is always located in the +// top left corner. If any of the values are 0 or larger than the available +// space, the available space will be used. +func (t *TextView) SetSize(rows, columns int) *TextView { + t.width = columns + t.height = rows + return t +} + +// GetFieldWidth returns this primitive's field width. +func (t *TextView) GetFieldWidth() int { + return t.width +} + +// GetFieldHeight returns this primitive's field height. +func (t *TextView) GetFieldHeight() int { + return t.height +} + +// SetDisabled sets whether or not the item is disabled / read-only. +func (t *TextView) SetDisabled(disabled bool) FormItem { + return t // Text views are always read-only. +} + +// SetScrollable sets the flag that decides whether or not the text view is +// scrollable. If false, text that moves above the text view's top row will be +// permanently deleted. +func (t *TextView) SetScrollable(scrollable bool) *TextView { + t.scrollable = scrollable + if !scrollable { + t.trackEnd = true + } + return t +} + +// SetWrap sets the flag that, if true, leads to lines that are longer than the +// available width being wrapped onto the next line. If false, any characters +// beyond the available width are not displayed. +func (t *TextView) SetWrap(wrap bool) *TextView { + if t.wrap != wrap { + t.resetIndex() // This invalidates the entire index. + } + t.wrap = wrap + return t +} + +// SetWordWrap sets the flag that, if true and if the "wrap" flag is also true +// (see [TextView.SetWrap]), wraps according to [Unicode Standard Annex #14]. +// +// This flag is ignored if the "wrap" flag is false. +func (t *TextView) SetWordWrap(wrapOnWords bool) *TextView { + if t.wrap && t.wordWrap != wrapOnWords { + t.resetIndex() // This invalidates the entire index. + } + t.wordWrap = wrapOnWords + return t +} + +// SetMaxLines sets the maximum number of lines for this text view. Lines at the +// beginning of the text will be discarded when the text view is drawn, so as to +// remain below this value. Only lines above the first visible line are removed. +// +// Broken-over lines via word/character wrapping are counted individually. +// +// Note that [TextView.GetText] will return the shortened text. +// +// A value of 0 (the default) will keep all lines in place. +func (t *TextView) SetMaxLines(maxLines int) *TextView { + t.maxLines = maxLines + return t +} + +// SetTextAlign sets the text alignment within the text view. This must be +// either AlignLeft, AlignCenter, or AlignRight. +func (t *TextView) SetTextAlign(align int) *TextView { + t.align = align + return t +} + +// SetTextColor sets the initial color of the text. +func (t *TextView) SetTextColor(color tcell.Color) *TextView { + t.textStyle = t.textStyle.Foreground(color) + t.resetIndex() + return t +} + +// SetBackgroundColor overrides its implementation in Box to set the background +// color of this primitive. For backwards compatibility reasons, it also sets +// the background color of the main text element. +func (t *TextView) SetBackgroundColor(color tcell.Color) *Box { + t.Box.SetBackgroundColor(color) + t.textStyle = t.textStyle.Background(color) + t.resetIndex() + return t.Box +} + +// SetTextStyle sets the initial style of the text. This style's background +// color also determines the background color of the main text element. +func (t *TextView) SetTextStyle(style tcell.Style) *TextView { + t.textStyle = style + t.resetIndex() + return t +} + +// SetText sets the text of this text view to the provided string. Previously +// contained text will be removed. As with writing to the text view io.Writer +// interface directly, this does not trigger an automatic redraw but it will +// trigger the "changed" callback if one is set. +func (t *TextView) SetText(text string) *TextView { + t.Lock() + defer t.Unlock() + t.text.Reset() + t.text.WriteString(text) + t.resetIndex() + if t.changed != nil { + go t.changed() + } + return t +} + +// GetText returns the current text of this text view. If "stripAllTags" is set +// to true, any region/style tags are stripped from the text. Note that any text +// that has been discarded due to [TextView.SetMaxLines] or +// [TextView.SetScrollable] will not be part of the returned text. +func (t *TextView) GetText(stripAllTags bool) string { + if !stripAllTags || (!t.styleTags && !t.regionTags) { + return t.text.String() + } + + var ( + str strings.Builder + state *stepState + text = t.text.String() + opts stepOptions + ch string + ) + if t.styleTags { + opts = stepOptionsStyle + } + if t.regionTags { + opts |= stepOptionsRegion + } + for len(text) > 0 { + ch, text, state = step(text, state, opts) + str.WriteString(ch) + } + return str.String() +} + +// GetOriginalLineCount returns the number of lines in the original text buffer, +// without applying any wrapping. This is an expensive call as it needs to +// iterate over the entire text. Note that any text that has been discarded due +// to [TextView.SetMaxLines] or [TextView.SetScrollable] will not be part of the +// count. +func (t *TextView) GetOriginalLineCount() int { + if t.text.Len() == 0 { + return 0 + } + + var ( + state *stepState + str = t.text.String() + lines int = 1 + ) + for len(str) > 0 { + _, str, state = step(str, state, stepOptionsNone) + if lineBreak, optional := state.LineBreak(); lineBreak && !optional { + lines++ + } + } + + return lines +} + +// GetWrappedLineCount returns the number of lines in the text view, taking +// wrapping into account (if activated). This is an even more expensive call +// than [TextView.GetOriginalLineCount] as it needs to parse the text until the +// end and calculate the line breaks. It will also allocate memory for each +// line. Note that any text that has been discarded due to +// [TextView.SetMaxLines] or [TextView.SetScrollable] will not be part of the +// count. Calling this method before the text view was drawn for the first time +// will assume no wrapping. +func (t *TextView) GetWrappedLineCount() int { + t.parseAhead(t.width, func(int, *textViewLine) bool { + return false + }) + return len(t.lineIndex) +} + +// SetDynamicColors sets the flag that allows the text color to be changed +// dynamically with style tags. See class description for details. +func (t *TextView) SetDynamicColors(dynamic bool) *TextView { + if t.styleTags != dynamic { + t.resetIndex() // This invalidates the entire index. + } + t.styleTags = dynamic + return t +} + +// SetRegions sets the flag that allows to define regions in the text. See class +// description for details. +func (t *TextView) SetRegions(regions bool) *TextView { + if t.regionTags != regions { + t.resetIndex() // This invalidates the entire index. + } + t.regionTags = regions + return t +} + +// SetChangedFunc sets a handler function which is called when the text of the +// text view has changed. This is useful when text is written to this +// [io.Writer] in a separate goroutine. Doing so does not automatically cause +// the screen to be refreshed so you may want to use the "changed" handler to +// redraw the screen. +// +// Note that to avoid race conditions or deadlocks, there are a few rules you +// should follow: +// +// - You can call [Application.Draw] from this handler. +// - You can call [TextView.HasFocus] from this handler. +// - During the execution of this handler, access to any other variables from +// this primitive or any other primitive must be queued using +// [Application.QueueUpdate]. +// +// See package description for details on dealing with concurrency. +func (t *TextView) SetChangedFunc(handler func()) *TextView { + t.changed = handler + return t +} + +// SetDoneFunc sets a handler which is called when the user presses on the +// following keys: Escape, Enter, Tab, Backtab. The key is passed to the +// handler. +func (t *TextView) SetDoneFunc(handler func(key tcell.Key)) *TextView { + t.done = handler + return t +} + +// SetHighlightedFunc sets a handler which is called when the list of currently +// highlighted regions change. It receives a list of region IDs which were newly +// highlighted, those that are not highlighted anymore, and those that remain +// highlighted. +// +// Note that because regions are only determined when drawing the text view, +// this function can only fire for regions that have existed when the text view +// was last drawn. +func (t *TextView) SetHighlightedFunc(handler func(added, removed, remaining []string)) *TextView { + t.highlighted = handler + return t +} + +// SetFinishedFunc sets a callback invoked when the user leaves this form item. +func (t *TextView) SetFinishedFunc(handler func(key tcell.Key)) FormItem { + t.finished = handler + return t +} + +// SetFormAttributes sets attributes shared by all form items. +func (t *TextView) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) FormItem { + t.labelWidth = labelWidth + t.backgroundColor = bgColor + t.labelStyle = t.labelStyle.Foreground(labelColor) + // We ignore the field background color because this is a read-only element. + t.textStyle = tcell.StyleDefault.Foreground(fieldTextColor).Background(bgColor) + return t +} + +// ScrollTo scrolls to the specified row and column (both starting with 0). +func (t *TextView) ScrollTo(row, column int) *TextView { + if !t.scrollable { + return t + } + t.lineOffset = row + t.columnOffset = column + t.trackEnd = false + return t +} + +// ScrollToBeginning scrolls to the top left corner of the text if the text view +// is scrollable. +func (t *TextView) ScrollToBeginning() *TextView { + if !t.scrollable { + return t + } + t.trackEnd = false + t.lineOffset = 0 + t.columnOffset = 0 + return t +} + +// ScrollToEnd scrolls to the bottom left corner of the text if the text view +// is scrollable. Adding new rows to the end of the text view will cause it to +// scroll with the new data. +func (t *TextView) ScrollToEnd() *TextView { + if !t.scrollable { + return t + } + t.trackEnd = true + t.columnOffset = 0 + return t +} + +// GetScrollOffset returns the number of rows and columns that are skipped at +// the top left corner when the text view has been scrolled. +func (t *TextView) GetScrollOffset() (row, column int) { + return t.lineOffset, t.columnOffset +} + +// Clear removes all text from the buffer. This triggers the "changed" callback. +func (t *TextView) Clear() *TextView { + t.Lock() + defer t.Unlock() + t.clear() + if t.changed != nil { + go t.changed() + } + return t +} + +// clear is the internal implementation of clear. It is used by TextViewWriter +// and anywhere that we need to perform a write without locking the buffer. +func (t *TextView) clear() { + t.text.Reset() + t.resetIndex() +} + +// Highlight specifies which regions should be highlighted. If highlight +// toggling is set to true (see [TextView.SetToggleHighlights]), the highlight +// of the provided regions is toggled (i.e. highlighted regions are +// un-highlighted and vice versa). If toggling is set to false, the provided +// regions are highlighted and all other regions will not be highlighted (you +// may also provide nil to turn off all highlights). +// +// For more information on regions, see class description. Empty region strings +// or regions not contained in the text are ignored. +// +// Text in highlighted regions will be drawn inverted, i.e. with their +// background and foreground colors swapped. +// +// If toggling is set to false, clicking outside of any region will remove all +// highlights. +// +// This function is expensive if a specified region is in a part of the text +// that has not yet been parsed. +func (t *TextView) Highlight(regionIDs ...string) *TextView { + // Make sure we know these regions. + t.parseAhead(t.lastWidth, func(lineNumber int, line *textViewLine) bool { + for _, regionID := range regionIDs { + if _, ok := t.regions[regionID]; !ok { + return false + } + } + return true + }) + + // Remove unknown regions. + newRegions := make([]string, 0, len(regionIDs)) + for _, regionID := range regionIDs { + if _, ok := t.regions[regionID]; ok { + newRegions = append(newRegions, regionID) + } + } + regionIDs = newRegions + + // Toggle highlights. + if t.toggleHighlights { + var newIDs []string + HighlightLoop: + for regionID := range t.highlights { + for _, id := range regionIDs { + if regionID == id { + continue HighlightLoop + } + } + newIDs = append(newIDs, regionID) + } + for _, regionID := range regionIDs { + if _, ok := t.highlights[regionID]; !ok { + newIDs = append(newIDs, regionID) + } + } + regionIDs = newIDs + } // Now we have a list of region IDs that end up being highlighted. + + // Determine added and removed regions. + var added, removed, remaining []string + if t.highlighted != nil { + for _, regionID := range regionIDs { + if _, ok := t.highlights[regionID]; ok { + remaining = append(remaining, regionID) + delete(t.highlights, regionID) + } else { + added = append(added, regionID) + } + } + for regionID := range t.highlights { + removed = append(removed, regionID) + } + } + + // Make new selection. + t.highlights = make(map[string]struct{}) + for _, id := range regionIDs { + if id == "" { + continue + } + t.highlights[id] = struct{}{} + } + + // Notify. + if t.highlighted != nil && (len(added) > 0 || len(removed) > 0) { + t.highlighted(added, removed, remaining) + } + + return t +} + +// GetHighlights returns the IDs of all currently highlighted regions. +func (t *TextView) GetHighlights() (regionIDs []string) { + for id := range t.highlights { + regionIDs = append(regionIDs, id) + } + return +} + +// SetToggleHighlights sets a flag to determine how regions are highlighted. +// When set to true, the [TextView.Highlight] function (or a mouse click) will +// toggle the provided/selected regions. When set to false, [TextView.Highlight] +// (or a mouse click) will simply highlight the provided regions. +func (t *TextView) SetToggleHighlights(toggle bool) *TextView { + t.toggleHighlights = toggle + return t +} + +// ScrollToHighlight will cause the visible area to be scrolled so that the +// highlighted regions appear in the visible area of the text view. This +// repositioning happens the next time the text view is drawn. It happens only +// once so you will need to call this function repeatedly to always keep +// highlighted regions in view. +// +// Nothing happens if there are no highlighted regions or if the text view is +// not scrollable. +func (t *TextView) ScrollToHighlight() *TextView { + if len(t.highlights) == 0 || !t.scrollable || !t.regionTags { + return t + } + t.scrollToHighlights = true + t.trackEnd = false + return t +} + +// GetRegionText returns the text of the first region with the given ID. If +// dynamic colors are enabled, style tags are stripped from the text. +// +// If the region does not exist or if regions are turned off, an empty string +// is returned. +// +// This function can be expensive if the specified region is way beyond the +// visible area of the text view as the text needs to be parsed until the region +// can be found, or if the region does not contain any text. +func (t *TextView) GetRegionText(regionID string) string { + if !t.regionTags || regionID == "" { + return "" + } + + // Parse until we find the region. + lineNumber, ok := t.regions[regionID] + if !ok { + lineNumber = -1 + t.parseAhead(t.lastWidth, func(number int, line *textViewLine) bool { + lineNumber, ok = t.regions[regionID] + return ok + }) + if lineNumber < 0 { + return "" // We couldn't find this region. + } + } + + // Extract text from region. + var ( + line = t.lineIndex[lineNumber] + text = t.text.String()[line.offset:] + st = *line.state + state = &st + options = stepOptionsRegion + regionText strings.Builder + ) + if t.styleTags { + options |= stepOptionsStyle + } + for len(text) > 0 { + var ch string + ch, text, state = step(text, state, options) + if state.region == regionID { + regionText.WriteString(ch) + } else if regionText.Len() > 0 { + break + } + } + + return regionText.String() +} + +// Focus is called when this primitive receives focus. +func (t *TextView) Focus(delegate func(p Primitive)) { + // Implemented here with locking because this is used by layout primitives. + t.Lock() + defer t.Unlock() + + // But if we're part of a form and not scrollable, there's nothing the user + // can do here so we're finished. + if t.finished != nil && !t.scrollable { + t.finished(-1) + return + } + + t.Box.Focus(delegate) +} + +// HasFocus returns whether or not this primitive has focus. +func (t *TextView) HasFocus() bool { + // Implemented here with locking because this may be used in the "changed" + // callback. + t.Lock() + defer t.Unlock() + return t.Box.HasFocus() +} + +// Write lets us implement the io.Writer interface. +func (t *TextView) Write(p []byte) (n int, err error) { + t.Lock() + defer t.Unlock() + + return t.write(p) +} + +// write is the internal implementation of Write. It is used by [TextViewWriter] +// and anywhere that we need to perform a write without locking the buffer. +func (t *TextView) write(p []byte) (n int, err error) { + // Notify at the end. + changed := t.changed + if changed != nil { + defer func() { + // We always call the "changed" function in a separate goroutine to avoid + // deadlocks. + go changed() + }() + } + + return t.text.Write(p) +} + +// BatchWriter returns a new writer that can be used to write into the buffer +// but without Locking/Unlocking the buffer on every write, as [TextView.Write] +// and [TextView.Clear] do. The lock will be acquired once when BatchWriter is +// called, and will be released when the returned writer is closed. Example: +// +// tv := tview.NewTextView() +// w := tv.BatchWriter() +// defer w.Close() +// w.Clear() +// fmt.Fprintln(w, "To sit in solemn silence") +// fmt.Fprintln(w, "on a dull, dark, dock") +// fmt.Println(tv.GetText(false)) +// +// Note that using the batch writer requires you to manage any issues that may +// arise from concurrency yourself. See package description for details on +// dealing with concurrency. +func (t *TextView) BatchWriter() TextViewWriter { + t.Lock() + return TextViewWriter{ + t: t, + } +} + +// resetIndex resets all indexed data, including the line index. +func (t *TextView) resetIndex() { + t.lineIndex = nil + t.regions = make(map[string]int) + t.longestLine = 0 +} + +// parseAhead parses the text buffer starting at the last line in +// [TextView.lineIndex] until either the end of the buffer or until stop returns +// true for the last complete line that was parsed. If wrapping is enabled, +// width will be used as the available screen width. If width is 0, it is +// assumed that there is no wrapping. This can happen when this function is +// called before the first time [TextView.Draw] is called. +// +// There is no guarantee that stop will ever be called. +// +// The function adds entries to the [TextView.lineIndex] slice and the +// [TextView.regions] map and adjusts [TextView.longestLine]. +func (t *TextView) parseAhead(width int, stop func(lineNumber int, line *textViewLine) bool) { + if t.text.Len() == 0 { + return // No text. Nothing to parse. + } + + // If width is 0, make it infinite. + if width == 0 { + width = math.MaxInt + } + + // What kind of tags do we scan for? + var options stepOptions + if t.styleTags { + options |= stepOptionsStyle + } + if t.regionTags { + options |= stepOptionsRegion + } + + // Start parsing at the last line in the index. + var lastLine *textViewLine + str := t.text.String() + if len(t.lineIndex) == 0 { + // Insert the first line. + lastLine = &textViewLine{ + state: &stepState{ + unisegState: -1, + style: t.textStyle, + }, + } + t.lineIndex = append(t.lineIndex, lastLine) + } else { + // Reset the last line. + lastLine = t.lineIndex[len(t.lineIndex)-1] + lastLine.width = 0 + lastLine.length = 0 + str = str[lastLine.offset:] + } + + // Parse. + var ( + lastOption int // Text index of the last optional split point. + lastOptionWidth int // Line width at last optional split point. + lastOptionState *stepState // State at last optional split point. + leftPos int // The current position in the line (only for left-alignment). + offset = lastLine.offset // Text index of the current position. + st = *lastLine.state // Current state. + state = &st // Pointer to current state. + ) + for len(str) > 0 { + var c string + region := state.region + c, str, state = step(str, state, options) + w := state.Width() + if c == "\t" { + if t.align == AlignLeft { + w = TabSize - leftPos%TabSize + } else { + w = TabSize + } + } + length := state.GrossLength() + + // Would it exceed the line width? + if t.wrap && lastLine.width+w > width { + if lastOptionWidth == 0 { + // No split point so far. Just split at the current position. + if stop(len(t.lineIndex)-1, lastLine) { + return + } + st := *state + lastLine = &textViewLine{ + offset: offset, + state: &st, + } + lastOption, lastOptionWidth, leftPos = 0, 0, 0 + } else { + // Split at the last split point. + newLine := &textViewLine{ + offset: lastLine.offset + lastOption, + width: lastLine.width - lastOptionWidth, + length: lastLine.length - lastOption, + state: lastOptionState, + } + lastLine.width = lastOptionWidth + lastLine.length = lastOption + if stop(len(t.lineIndex)-1, lastLine) { + return + } + lastLine = newLine + lastOption, lastOptionWidth = 0, 0 + leftPos -= lastOptionWidth + } + t.lineIndex = append(t.lineIndex, lastLine) + } + + // Move ahead. + lastLine.width += w + lastLine.length += length + offset += length + leftPos += w + + // Do we have a new longest line? + if lastLine.width > t.longestLine { + t.longestLine = lastLine.width + } + + // Check for split points. + if lineBreak, optional := state.LineBreak(); lineBreak { + if optional { + if t.wrap && t.wordWrap { + // Remember this split point. + lastOption = offset - lastLine.offset + lastOptionWidth = lastLine.width + st := *state + lastOptionState = &st + } + } else { + // We must split here. + if stop(len(t.lineIndex)-1, lastLine) { + return + } + st := *state + lastLine = &textViewLine{ + offset: offset, + state: &st, + } + t.lineIndex = append(t.lineIndex, lastLine) + lastOption, lastOptionWidth, leftPos = 0, 0, 0 + } + } + + // Add new regions if any. + if t.regionTags && state.region != "" && state.region != region { + if _, ok := t.regions[state.region]; !ok { + t.regions[state.region] = len(t.lineIndex) - 1 + } + } + } +} + +// Draw draws this primitive onto the screen. +func (t *TextView) Draw(screen tcell.Screen) { + t.Box.DrawForSubclass(screen, t) + t.Lock() + defer t.Unlock() + + // Get the available size. + x, y, width, height := t.GetInnerRect() + t.pageSize = height + + // Draw label. + _, labelBg, _ := t.labelStyle.Decompose() + if t.labelWidth > 0 { + labelWidth := t.labelWidth + if labelWidth > width { + labelWidth = width + } + printWithStyle(screen, t.label, x, y, 0, labelWidth, AlignLeft, t.labelStyle, labelBg == tcell.ColorDefault) + x += labelWidth + width -= labelWidth + } else { + _, _, drawnWidth := printWithStyle(screen, t.label, x, y, 0, width, AlignLeft, t.labelStyle, labelBg == tcell.ColorDefault) + x += drawnWidth + width -= drawnWidth + } + + // What's the space for the text element? + if t.width > 0 && t.width < width { + width = t.width + } + if t.height > 0 && t.height < height { + height = t.height + } + if width <= 0 { + return // No space left for the text area. + } + + // Draw the text element if necessary. + _, bg, _ := t.textStyle.Decompose() + if bg != t.backgroundColor { + for row := 0; row < height; row++ { + for column := 0; column < width; column++ { + screen.SetContent(x+column, y+row, ' ', nil, t.textStyle) + } + } + } + + // If the width has changed, we need to reindex. + if width != t.lastWidth && t.wrap { + t.resetIndex() + } + t.lastWidth = width + + // What are our parse options? + var options stepOptions + if t.styleTags { + options |= stepOptionsStyle + } + if t.regionTags { + options |= stepOptionsRegion + } + + // Scroll to highlighted regions. + if t.regionTags && t.scrollToHighlights { + // Make sure we know all highlighted regions. + t.parseAhead(width, func(lineNumber int, line *textViewLine) bool { + for regionID := range t.highlights { + if _, ok := t.regions[regionID]; !ok { + return false + } + t.highlights[regionID] = struct{}{} + } + return true + }) + + // What is the line range for all highlighted regions? + var ( + firstRegion string + fromHighlight, toHighlight int + ) + for regionID := range t.highlights { + // We can safely assume that the region is known. + line := t.regions[regionID] + if firstRegion == "" || line > toHighlight { + toHighlight = line + } + if firstRegion == "" || line < fromHighlight { + fromHighlight = line + firstRegion = regionID + } + } + if firstRegion != "" { + // Do we fit the entire height? + if toHighlight-fromHighlight+1 < height { + // Yes, let's center the highlights. + t.lineOffset = (fromHighlight + toHighlight - height) / 2 + } else { + // No, let's move to the start of the highlights. + t.lineOffset = fromHighlight + } + + // If the highlight is too far to the right, move it to the middle. + if t.wrap { + // Find the first highlight's column in screen space. + line := t.lineIndex[fromHighlight] + st := *line.state + state := &st + str := t.text.String()[line.offset:] + var posHighlight int + for len(str) > 0 && posHighlight < line.width && state.region != firstRegion { + _, str, state = step(str, state, options) + posHighlight += state.Width() + } + + if posHighlight-t.columnOffset > 3*width/4 { + t.columnOffset = posHighlight - width/2 + } + + // If the highlight is off-screen on the left, move it on-screen. + if posHighlight-t.columnOffset < 0 { + t.columnOffset = posHighlight - width/4 + } + } + } + } + t.scrollToHighlights = false + + // Make sure our index has enough lines. + t.parseAhead(width, func(lineNumber int, line *textViewLine) bool { + return lineNumber >= t.lineOffset+height + }) + + // Adjust line offset. + if t.trackEnd { + t.parseAhead(width, func(lineNumber int, line *textViewLine) bool { + return false + }) + t.lineOffset = len(t.lineIndex) - height + } + if t.lineOffset > len(t.lineIndex)-height { + t.lineOffset = len(t.lineIndex) - height + } + if t.lineOffset < 0 { + t.lineOffset = 0 + } + + // Adjust column offset. + if t.align == AlignLeft || t.align == AlignRight { + if t.columnOffset+width > t.longestLine { + t.columnOffset = t.longestLine - width + } + if t.columnOffset < 0 { + t.columnOffset = 0 + } + } else { // AlignCenter. + half := (t.longestLine - width) / 2 + if half > 0 { + if t.columnOffset > half { + t.columnOffset = half + } + if t.columnOffset < -half { + t.columnOffset = -half + } + } else { + t.columnOffset = 0 + } + } + + // Draw visible lines. + for line := t.lineOffset; line < len(t.lineIndex); line++ { + // Are we done? + if line-t.lineOffset >= height { + break + } + + info := t.lineIndex[line] + info.regions = nil + + // Determine starting point of the text and the screen. + var skipWidth, xPos int + switch t.align { + case AlignLeft: + skipWidth = t.columnOffset + case AlignCenter: + skipWidth = t.columnOffset + (info.width-width)/2 + if skipWidth < 0 { + skipWidth = 0 + xPos = (width-info.width)/2 - t.columnOffset + } + case AlignRight: + maxWidth := width + if t.longestLine > width { + maxWidth = t.longestLine + } + skipWidth = t.columnOffset - (maxWidth - info.width) + if skipWidth < 0 { + skipWidth = 0 + xPos = maxWidth - info.width - t.columnOffset + } + } + + // Draw the line text. + str := t.text.String()[info.offset:] + st := *info.state + state := &st + var processed int + for len(str) > 0 && xPos < width && processed < info.length { + var ch string + ch, str, state = step(str, state, options) + w := state.Width() + if ch == "\t" { + if t.align == AlignLeft { + w = TabSize - xPos%TabSize + } else { + w = TabSize + } + } + processed += state.GrossLength() + + // Don't draw anything while we skip characters. + if skipWidth > 0 { + skipWidth -= w + continue + } + + // Draw this character. + if w > 0 { + style := state.Style() + + // Do we highlight this character? + var highlighted bool + if state.region != "" { + if _, ok := t.highlights[state.region]; ok { + highlighted = true + } + } + if highlighted { + fg, bg, _ := style.Decompose() + if bg == t.backgroundColor { + r, g, b := fg.RGB() + c := colorful.Color{R: float64(r) / 255, G: float64(g) / 255, B: float64(b) / 255} + _, _, li := c.Hcl() + if li < .5 { + bg = tcell.ColorWhite + } else { + bg = tcell.ColorBlack + } + } + style = style.Background(fg).Foreground(bg) + } + + // Paint on screen. + for offset := w - 1; offset >= 0; offset-- { + runes := []rune(ch) + if offset == 0 { + screen.SetContent(x+xPos+offset, y+line-t.lineOffset, runes[0], runes[1:], style) + } else { + screen.SetContent(x+xPos+offset, y+line-t.lineOffset, ' ', nil, style) + } + } + + // Register this region. + if state.region != "" { + if info.regions == nil { + info.regions = make(map[string][2]int) + } + fromTo, ok := info.regions[state.region] + if !ok { + fromTo = [2]int{xPos, xPos + w} + } else { + if xPos < fromTo[0] { + fromTo[0] = xPos + } + if xPos+w > fromTo[1] { + fromTo[1] = xPos + w + } + } + info.regions[state.region] = fromTo + } + } + + xPos += w + } + } + + // If this view is not scrollable, we'll purge the buffer of lines that have + // scrolled out of view. + var purgeStart int + if !t.scrollable && t.lineOffset > 0 { + purgeStart = t.lineOffset + } + + // If we reached the maximum number of lines, we'll purge the buffer of the + // oldest lines. + if t.maxLines > 0 && len(t.lineIndex) > t.maxLines { + purgeStart = len(t.lineIndex) - t.maxLines + } + + // Purge. + if purgeStart > 0 && purgeStart < len(t.lineIndex) { + newText := t.text.String()[t.lineIndex[purgeStart].offset:] + t.text.Reset() + t.text.WriteString(newText) + t.resetIndex() + t.lineOffset = 0 + } +} + +// InputHandler returns the handler for this primitive. +func (t *TextView) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + key := event.Key() + + if key == tcell.KeyEscape || key == tcell.KeyEnter || key == tcell.KeyTab || key == tcell.KeyBacktab { + if t.done != nil { + t.done(key) + } + if t.finished != nil { + t.finished(key) + } + return + } + + if !t.scrollable { + return + } + + switch key { + case tcell.KeyRune: + switch event.Rune() { + case 'g': // Home. + t.trackEnd = false + t.lineOffset = 0 + t.columnOffset = 0 + case 'G': // End. + t.trackEnd = true + t.columnOffset = 0 + case 'j': // Down. + t.lineOffset++ + case 'k': // Up. + t.trackEnd = false + t.lineOffset-- + case 'h': // Left. + t.columnOffset-- + case 'l': // Right. + t.columnOffset++ + } + case tcell.KeyHome: + t.trackEnd = false + t.lineOffset = 0 + t.columnOffset = 0 + case tcell.KeyEnd: + t.trackEnd = true + t.columnOffset = 0 + case tcell.KeyUp: + t.trackEnd = false + t.lineOffset-- + case tcell.KeyDown: + t.lineOffset++ + case tcell.KeyLeft: + t.columnOffset-- + case tcell.KeyRight: + t.columnOffset++ + case tcell.KeyPgDn, tcell.KeyCtrlF: + t.lineOffset += t.pageSize + case tcell.KeyPgUp, tcell.KeyCtrlB: + t.trackEnd = false + t.lineOffset -= t.pageSize + } + }) +} + +// MouseHandler returns the mouse handler for this primitive. +func (t *TextView) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return t.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + x, y := event.Position() + if !t.InRect(x, y) { + return false, nil + } + + rectX, rectY, width, height := t.GetInnerRect() + switch action { + case MouseLeftDown: + setFocus(t) + consumed = true + case MouseLeftClick: + if t.regionTags && t.InInnerRect(x, y) { + // Find a region to highlight. + x -= rectX + y -= rectY + var highlightedID string + if y+t.lineOffset < len(t.lineIndex) { + line := t.lineIndex[y+t.lineOffset] + for regionID, fromTo := range line.regions { + if x >= fromTo[0] && x < fromTo[1] { + highlightedID = regionID + break + } + } + } + if highlightedID != "" { + t.Highlight(highlightedID) + } else if !t.toggleHighlights { + t.Highlight() + } + } + consumed = true + case MouseScrollUp: + if !t.scrollable { + break + } + t.trackEnd = false + t.lineOffset-- + consumed = true + case MouseScrollDown: + if !t.scrollable { + break + } + t.lineOffset++ + if len(t.lineIndex)-t.lineOffset < height { + // If we scroll to the end, turn on tracking. + t.parseAhead(width, func(lineNumber int, line *textViewLine) bool { + return len(t.lineIndex)-t.lineOffset < height + }) + if len(t.lineIndex)-t.lineOffset < height { + t.trackEnd = true + } + } + consumed = true + } + + return + }) +} diff --git a/vendor/github.com/rivo/tview/treeview.go b/vendor/github.com/rivo/tview/treeview.go new file mode 100644 index 00000000..0bf76f44 --- /dev/null +++ b/vendor/github.com/rivo/tview/treeview.go @@ -0,0 +1,910 @@ +package tview + +import ( + "github.com/gdamore/tcell/v2" +) + +// Tree navigation events. +const ( + treeNone int = iota + treeHome + treeEnd + treeMove + treeParent + treeChild + treeScroll // Move without changing the selection, even when off screen. +) + +// TreeNode represents one node in a tree view. +type TreeNode struct { + // The reference object. + reference interface{} + + // This node's child nodes. + children []*TreeNode + + // The item's text. + text string + + // The text style. + textStyle tcell.Style + + // The style of selected text. + selectedTextStyle tcell.Style + + // Whether or not this node can be selected. + selectable bool + + // Whether or not this node's children should be displayed. + expanded bool + + // The additional horizontal indent of this node's text. + indent int + + // An optional function which is called when the user selects this node. + selected func() + + // The hierarchy level (0 for the root, 1 for its children, and so on). This + // is only up to date immediately after a call to process() (e.g. via + // Draw()). + level int + + // Temporary member variables. + parent *TreeNode // The parent node (nil for the root). + graphicsX int // The x-coordinate of the left-most graphics rune. + textX int // The x-coordinate of the first rune of the text. +} + +// NewTreeNode returns a new tree node. +func NewTreeNode(text string) *TreeNode { + return &TreeNode{ + text: text, + textStyle: tcell.StyleDefault.Foreground(Styles.PrimaryTextColor).Background(Styles.PrimitiveBackgroundColor), + selectedTextStyle: tcell.StyleDefault.Foreground(Styles.PrimitiveBackgroundColor).Background(Styles.PrimaryTextColor), + indent: 2, + expanded: true, + selectable: true, + } +} + +// Walk traverses this node's subtree in depth-first, pre-order (NLR) order and +// calls the provided callback function on each traversed node (which includes +// this node) with the traversed node and its parent node (nil for this node). +// The callback returns whether traversal should continue with the traversed +// node's child nodes (true) or not recurse any deeper (false). +func (n *TreeNode) Walk(callback func(node, parent *TreeNode) bool) *TreeNode { + n.parent = nil + nodes := []*TreeNode{n} + for len(nodes) > 0 { + // Pop the top node and process it. + node := nodes[len(nodes)-1] + nodes = nodes[:len(nodes)-1] + if !callback(node, node.parent) { + // Don't add any children. + continue + } + + // Add children in reverse order. + for index := len(node.children) - 1; index >= 0; index-- { + node.children[index].parent = node + nodes = append(nodes, node.children[index]) + } + } + + return n +} + +// SetReference allows you to store a reference of any type in this node. This +// will allow you to establish a mapping between the TreeView hierarchy and your +// internal tree structure. +func (n *TreeNode) SetReference(reference interface{}) *TreeNode { + n.reference = reference + return n +} + +// GetReference returns this node's reference object. +func (n *TreeNode) GetReference() interface{} { + return n.reference +} + +// SetChildren sets this node's child nodes. +func (n *TreeNode) SetChildren(childNodes []*TreeNode) *TreeNode { + n.children = childNodes + return n +} + +// GetText returns this node's text. +func (n *TreeNode) GetText() string { + return n.text +} + +// GetChildren returns this node's children. +func (n *TreeNode) GetChildren() []*TreeNode { + return n.children +} + +// ClearChildren removes all child nodes from this node. +func (n *TreeNode) ClearChildren() *TreeNode { + n.children = nil + return n +} + +// AddChild adds a new child node to this node. +func (n *TreeNode) AddChild(node *TreeNode) *TreeNode { + n.children = append(n.children, node) + return n +} + +// RemoveChild removes a child node from this node. If the child node cannot be +// found, nothing happens. +func (n *TreeNode) RemoveChild(node *TreeNode) *TreeNode { + for index, child := range n.children { + if child == node { + n.children = append(n.children[:index], n.children[index+1:]...) + break + } + } + return n +} + +// SetSelectable sets a flag indicating whether this node can be selected by +// the user. +func (n *TreeNode) SetSelectable(selectable bool) *TreeNode { + n.selectable = selectable + return n +} + +// SetSelectedFunc sets a function which is called when the user selects this +// node by hitting Enter when it is selected. +func (n *TreeNode) SetSelectedFunc(handler func()) *TreeNode { + n.selected = handler + return n +} + +// SetExpanded sets whether or not this node's child nodes should be displayed. +func (n *TreeNode) SetExpanded(expanded bool) *TreeNode { + n.expanded = expanded + return n +} + +// Expand makes the child nodes of this node appear. +func (n *TreeNode) Expand() *TreeNode { + n.expanded = true + return n +} + +// Collapse makes the child nodes of this node disappear. +func (n *TreeNode) Collapse() *TreeNode { + n.expanded = false + return n +} + +// ExpandAll expands this node and all descendent nodes. +func (n *TreeNode) ExpandAll() *TreeNode { + n.Walk(func(node, parent *TreeNode) bool { + node.expanded = true + return true + }) + return n +} + +// CollapseAll collapses this node and all descendent nodes. +func (n *TreeNode) CollapseAll() *TreeNode { + n.Walk(func(node, parent *TreeNode) bool { + node.expanded = false + return true + }) + return n +} + +// IsExpanded returns whether the child nodes of this node are visible. +func (n *TreeNode) IsExpanded() bool { + return n.expanded +} + +// SetText sets the node's text which is displayed. +func (n *TreeNode) SetText(text string) *TreeNode { + n.text = text + return n +} + +// GetColor returns the node's text color. +func (n *TreeNode) GetColor() tcell.Color { + color, _, _ := n.textStyle.Decompose() + return color +} + +// SetColor sets the node's text color. For compatibility reasons, this also +// sets the background color of the selected text style. For more control over +// styles, use [TreeNode.SetTextStyle] and [TreeNode.SetSelectedTextStyle]. +func (n *TreeNode) SetColor(color tcell.Color) *TreeNode { + n.textStyle = n.textStyle.Foreground(color) + n.selectedTextStyle = n.selectedTextStyle.Background(color) + return n +} + +// SetTextStyle sets the text style for this node. +func (n *TreeNode) SetTextStyle(style tcell.Style) *TreeNode { + n.textStyle = style + return n +} + +// GetTextStyle returns the text style for this node. +func (n *TreeNode) GetTextStyle() tcell.Style { + return n.textStyle +} + +// SetSelectedTextStyle sets the text style for this node when it is selected. +func (n *TreeNode) SetSelectedTextStyle(style tcell.Style) *TreeNode { + n.selectedTextStyle = style + return n +} + +// GetSelectedTextStyle returns the text style for this node when it is +// selected. +func (n *TreeNode) GetSelectedTextStyle() tcell.Style { + return n.selectedTextStyle +} + +// SetIndent sets an additional indentation for this node's text. A value of 0 +// keeps the text as far left as possible with a minimum of line graphics. Any +// value greater than that moves the text to the right. +func (n *TreeNode) SetIndent(indent int) *TreeNode { + n.indent = indent + return n +} + +// GetLevel returns the node's level within the hierarchy, where 0 corresponds +// to the root node, 1 corresponds to its children, and so on. This is only +// guaranteed to be up to date immediately after the tree that contains this +// node is drawn. +func (n *TreeNode) GetLevel() int { + return n.level +} + +// TreeView displays tree structures. A tree consists of nodes (TreeNode +// objects) where each node has zero or more child nodes and exactly one parent +// node (except for the root node which has no parent node). +// +// The SetRoot() function is used to specify the root of the tree. Other nodes +// are added locally to the root node or any of its descendents. See the +// TreeNode documentation for details on node attributes. (You can use +// SetReference() to store a reference to nodes of your own tree structure.) +// +// Nodes can be selected by calling SetCurrentNode(). The user can navigate the +// selection or the tree by using the following keys: +// +// - j, down arrow, right arrow: Move (the selection) down by one node. +// - k, up arrow, left arrow: Move (the selection) up by one node. +// - g, home: Move (the selection) to the top. +// - G, end: Move (the selection) to the bottom. +// - J: Move (the selection) up one level (if that node is selectable). +// - K: Move (the selection) to the last node one level down (if any). +// - Ctrl-F, page down: Move (the selection) down by one page. +// - Ctrl-B, page up: Move (the selection) up by one page. +// +// Selected nodes can trigger the "selected" callback when the user hits Enter. +// +// The root node corresponds to level 0, its children correspond to level 1, +// their children to level 2, and so on. Per default, the first level that is +// displayed is 0, i.e. the root node. You can call SetTopLevel() to hide +// levels. +// +// If graphics are turned on (see SetGraphics()), lines indicate the tree's +// hierarchy. Alternative (or additionally), you can set different prefixes +// using SetPrefixes() for different levels, for example to display hierarchical +// bullet point lists. +// +// See https://github.com/rivo/tview/wiki/TreeView for an example. +type TreeView struct { + *Box + + // The root node. + root *TreeNode + + // The currently selected node or nil if no node is selected. + currentNode *TreeNode + + // The last note that was selected or nil of there is no such node. + lastNode *TreeNode + + // The movement to be performed during the call to Draw(), one of the + // constants defined above. + movement int + + // The number of nodes to move down or up, when movement is treeMove, + // excluding non-selectable nodes for selection movement, including them for + // scrolling. + step int + + // The top hierarchical level shown. (0 corresponds to the root level.) + topLevel int + + // Strings drawn before the nodes, based on their level. + prefixes []string + + // Vertical scroll offset. + offsetY int + + // If set to true, all node texts will be aligned horizontally. + align bool + + // If set to true, the tree structure is drawn using lines. + graphics bool + + // The color of the lines. + graphicsColor tcell.Color + + // An optional function which is called when the user has navigated to a new + // tree node. + changed func(node *TreeNode) + + // An optional function which is called when a tree item was selected. + selected func(node *TreeNode) + + // An optional function which is called when the user moves away from this + // primitive. + done func(key tcell.Key) + + // The visible nodes, top-down, as set by process(). + nodes []*TreeNode + + // Temporarily set to true while we know that the tree has not changed and + // therefore does not need to be reprocessed. + stableNodes bool +} + +// NewTreeView returns a new tree view. +func NewTreeView() *TreeView { + return &TreeView{ + Box: NewBox(), + graphics: true, + graphicsColor: Styles.GraphicsColor, + } +} + +// SetRoot sets the root node of the tree. +func (t *TreeView) SetRoot(root *TreeNode) *TreeView { + t.root = root + return t +} + +// GetRoot returns the root node of the tree. If no such node was previously +// set, nil is returned. +func (t *TreeView) GetRoot() *TreeNode { + return t.root +} + +// SetCurrentNode sets the currently selected node. Provide nil to clear all +// selections. Selected nodes must be visible and selectable, or else the +// selection will be changed to the top-most selectable and visible node. +// +// This function does NOT trigger the "changed" callback because the actual node +// that will be selected is not known until the tree is drawn. Triggering the +// "changed" callback is thus deferred until the next call to [TreeView.Draw]. +func (t *TreeView) SetCurrentNode(node *TreeNode) *TreeView { + t.currentNode = node + return t +} + +// GetCurrentNode returns the currently selected node or nil of no node is +// currently selected. +func (t *TreeView) GetCurrentNode() *TreeNode { + return t.currentNode +} + +// GetPath returns all nodes located on the path from the root to the given +// node, including the root and the node itself. If there is no root node, nil +// is returned. If there are multiple paths to the node, a random one is chosen +// and returned. +func (t *TreeView) GetPath(node *TreeNode) []*TreeNode { + if t.root == nil { + return nil + } + + var f func(current *TreeNode, path []*TreeNode) []*TreeNode + f = func(current *TreeNode, path []*TreeNode) []*TreeNode { + if current == node { + return path + } + + for _, child := range current.children { + newPath := make([]*TreeNode, len(path), len(path)+1) + copy(newPath, path) + if p := f(child, append(newPath, child)); p != nil { + return p + } + } + + return nil + } + + return f(t.root, []*TreeNode{t.root}) +} + +// SetTopLevel sets the first tree level that is visible with 0 referring to the +// root, 1 to the root's child nodes, and so on. Nodes above the top level are +// not displayed. +func (t *TreeView) SetTopLevel(topLevel int) *TreeView { + t.topLevel = topLevel + return t +} + +// SetPrefixes defines the strings drawn before the nodes' texts. This is a +// slice of strings where each element corresponds to a node's hierarchy level, +// i.e. 0 for the root, 1 for the root's children, and so on (levels will +// cycle). +// +// For example, to display a hierarchical list with bullet points: +// +// treeView.SetGraphics(false). +// SetPrefixes([]string{"* ", "- ", "x "}) +// +// Deeper levels will cycle through the prefixes. +func (t *TreeView) SetPrefixes(prefixes []string) *TreeView { + t.prefixes = prefixes + return t +} + +// SetAlign controls the horizontal alignment of the node texts. If set to true, +// all texts except that of top-level nodes will be placed in the same column. +// If set to false, they will indent with the hierarchy. +func (t *TreeView) SetAlign(align bool) *TreeView { + t.align = align + return t +} + +// SetGraphics sets a flag which determines whether or not line graphics are +// drawn to illustrate the tree's hierarchy. +func (t *TreeView) SetGraphics(showGraphics bool) *TreeView { + t.graphics = showGraphics + return t +} + +// SetGraphicsColor sets the colors of the lines used to draw the tree structure. +func (t *TreeView) SetGraphicsColor(color tcell.Color) *TreeView { + t.graphicsColor = color + return t +} + +// SetChangedFunc sets the function which is called when the currently selected +// node changes, for example when the user navigates to a new tree node. +func (t *TreeView) SetChangedFunc(handler func(node *TreeNode)) *TreeView { + t.changed = handler + return t +} + +// SetSelectedFunc sets the function which is called when the user selects a +// node by pressing Enter on the current selection. +func (t *TreeView) SetSelectedFunc(handler func(node *TreeNode)) *TreeView { + t.selected = handler + return t +} + +// GetSelectedFunc returns the function set with [TreeView.SetSelectedFunc] +// or nil if no such function has been set. +func (t *TreeView) GetSelectedFunc() func(node *TreeNode) { + return t.selected +} + +// SetDoneFunc sets a handler which is called whenever the user presses the +// Escape, Tab, or Backtab key. +func (t *TreeView) SetDoneFunc(handler func(key tcell.Key)) *TreeView { + t.done = handler + return t +} + +// GetScrollOffset returns the number of node rows that were skipped at the top +// of the tree view. Note that when the user navigates the tree view, this value +// is only updated after the tree view has been redrawn. +func (t *TreeView) GetScrollOffset() int { + return t.offsetY +} + +// GetRowCount returns the number of "visible" nodes. This includes nodes which +// fall outside the tree view's box but notably does not include the children +// of collapsed nodes. Note that this value is only up to date after the tree +// view has been drawn. +func (t *TreeView) GetRowCount() int { + return len(t.nodes) +} + +// Move moves the selection (if a node is currently selected) or scrolls the +// tree view (if there is no selection), by the given offset (positive values to +// move/scroll down, negative values to move/scroll up). For selection changes, +// the offset refers to the number selectable, visible nodes. For scrolling, the +// offset refers to the number of visible nodes. +// +// If the offset is 0, nothing happens. +func (t *TreeView) Move(offset int) *TreeView { + if offset == 0 { + return t + } + t.movement = treeMove + t.step = offset + t.process(false) + return t +} + +// process builds the visible tree, populates the "nodes" slice, and processes +// pending movement actions. Set "drawingAfter" to true if you know that +// [TreeView.Draw] will be called immediately after this function (to avoid +// having [TreeView.Draw] call it again). +func (t *TreeView) process(drawingAfter bool) { + t.stableNodes = drawingAfter + _, _, _, height := t.GetInnerRect() + + // Determine visible nodes and their placement. + t.nodes = nil + if t.root == nil { + return + } + parentSelectedIndex, selectedIndex, topLevelGraphicsX := -1, -1, -1 + var graphicsOffset, maxTextX int + if t.graphics { + graphicsOffset = 1 + } + t.root.Walk(func(node, parent *TreeNode) bool { + // Set node attributes. + node.parent = parent + if parent == nil { + node.level = 0 + node.graphicsX = 0 + node.textX = 0 + } else { + node.level = parent.level + 1 + node.graphicsX = parent.textX + node.textX = node.graphicsX + graphicsOffset + node.indent + } + if !t.graphics && t.align { + // Without graphics, we align nodes on the first column. + node.textX = 0 + } + if node.level == t.topLevel { + // No graphics for top level nodes. + node.graphicsX = 0 + node.textX = 0 + } + + // Add the node to the list. + if node.level >= t.topLevel { + // This node will be visible. + if node.textX > maxTextX { + maxTextX = node.textX + } + if node == t.currentNode && node.selectable { + selectedIndex = len(t.nodes) + + // Also find parent node. + for index := len(t.nodes) - 1; index >= 0; index-- { + if t.nodes[index] == parent && t.nodes[index].selectable { + parentSelectedIndex = index + break + } + } + } + + // Maybe we want to skip this level. + if t.topLevel == node.level && (topLevelGraphicsX < 0 || node.graphicsX < topLevelGraphicsX) { + topLevelGraphicsX = node.graphicsX + } + + t.nodes = append(t.nodes, node) + } + + // Recurse if desired. + return node.expanded + }) + + // Post-process positions. + for _, node := range t.nodes { + // If text must align, we correct the positions. + if t.align && node.level > t.topLevel { + node.textX = maxTextX + } + + // If we skipped levels, shift to the left. + if topLevelGraphicsX > 0 { + node.graphicsX -= topLevelGraphicsX + node.textX -= topLevelGraphicsX + } + } + + // Process selection. (Also trigger events if necessary.) + if selectedIndex >= 0 { + // Move the selection. + switch t.movement { + case treeMove: + for t.step < 0 { // Going up. + index := selectedIndex + for index > 0 { + index-- + if t.nodes[index].selectable { + selectedIndex = index + break + } + } + t.step++ + } + for t.step > 0 { // Going down. + index := selectedIndex + for index < len(t.nodes)-1 { + index++ + if t.nodes[index].selectable { + selectedIndex = index + break + } + } + t.step-- + } + case treeParent: + if parentSelectedIndex >= 0 { + selectedIndex = parentSelectedIndex + } + case treeChild: + index := selectedIndex + for index < len(t.nodes)-1 { + index++ + if t.nodes[index].selectable && t.nodes[index].parent == t.nodes[selectedIndex] { + selectedIndex = index + } + } + } + t.currentNode = t.nodes[selectedIndex] + + // Move selection into viewport. + if t.movement != treeScroll { + if selectedIndex-t.offsetY >= height { + t.offsetY = selectedIndex - height + 1 + } + if selectedIndex < t.offsetY { + t.offsetY = selectedIndex + } + if t.movement != treeHome && t.movement != treeEnd { + // treeScroll, treeHome, and treeEnd are handled by Draw(). + t.movement = treeNone + t.step = 0 + } + } + } else { + // If selection is not visible or selectable, select the first candidate. + if t.currentNode != nil { + for index, node := range t.nodes { + if node.selectable { + selectedIndex = index + t.currentNode = node + break + } + } + } + if selectedIndex < 0 { + t.currentNode = nil + } + } + + // Trigger "changed" callback. + if t.changed != nil && t.currentNode != nil && t.currentNode != t.lastNode { + t.changed(t.currentNode) + } + t.lastNode = t.currentNode +} + +// Draw draws this primitive onto the screen. +func (t *TreeView) Draw(screen tcell.Screen) { + t.Box.DrawForSubclass(screen, t) + if t.root == nil { + return + } + _, totalHeight := screen.Size() + + if !t.stableNodes { + t.process(false) + } else { + t.stableNodes = false + } + + // Scroll the tree, t.movement is treeNone after process() when there is a + // selection, except for treeScroll, treeHome, and treeEnd. + x, y, width, height := t.GetInnerRect() + switch t.movement { + case treeMove, treeScroll: + t.offsetY += t.step + case treeHome: + t.offsetY = 0 + case treeEnd: + t.offsetY = len(t.nodes) + } + t.movement = treeNone + + // Fix invalid offsets. + if t.offsetY >= len(t.nodes)-height { + t.offsetY = len(t.nodes) - height + } + if t.offsetY < 0 { + t.offsetY = 0 + } + + // Draw the tree. + posY := y + lineStyle := tcell.StyleDefault.Background(t.backgroundColor).Foreground(t.graphicsColor) + for index, node := range t.nodes { + // Skip invisible parts. + if posY >= y+height+1 || posY >= totalHeight { + break + } + if index < t.offsetY { + continue + } + + // Draw the graphics. + if t.graphics { + // Draw ancestor branches. + ancestor := node.parent + for ancestor != nil && ancestor.parent != nil && ancestor.parent.level >= t.topLevel { + if ancestor.graphicsX >= width { + continue + } + + // Draw a branch if this ancestor is not a last child. + if ancestor.parent.children[len(ancestor.parent.children)-1] != ancestor { + if posY-1 >= y && ancestor.textX > ancestor.graphicsX { + PrintJoinedSemigraphics(screen, x+ancestor.graphicsX, posY-1, Borders.Vertical, lineStyle) + } + if posY < y+height { + screen.SetContent(x+ancestor.graphicsX, posY, Borders.Vertical, nil, lineStyle) + } + } + ancestor = ancestor.parent + } + + if node.textX > node.graphicsX && node.graphicsX < width { + // Connect to the node above. + if posY-1 >= y && t.nodes[index-1].graphicsX <= node.graphicsX && t.nodes[index-1].textX > node.graphicsX { + PrintJoinedSemigraphics(screen, x+node.graphicsX, posY-1, Borders.TopLeft, lineStyle) + } + + // Join this node. + if posY < y+height { + screen.SetContent(x+node.graphicsX, posY, Borders.BottomLeft, nil, lineStyle) + for pos := node.graphicsX + 1; pos < node.textX && pos < width; pos++ { + screen.SetContent(x+pos, posY, Borders.Horizontal, nil, lineStyle) + } + } + } + } + + // Draw the prefix and the text. + if node.textX < width && posY < y+height { + // Prefix. + var prefixWidth int + if len(t.prefixes) > 0 { + _, _, prefixWidth = printWithStyle(screen, t.prefixes[(node.level-t.topLevel)%len(t.prefixes)], x+node.textX, posY, 0, width-node.textX, AlignLeft, node.textStyle, true) + } + + // Text. + if node.textX+prefixWidth < width { + style := node.textStyle + if node == t.currentNode { + style = node.selectedTextStyle + } + printWithStyle(screen, node.text, x+node.textX+prefixWidth, posY, 0, width-node.textX-prefixWidth, AlignLeft, style, false) + } + } + + // Advance. + posY++ + } +} + +// InputHandler returns the handler for this primitive. +func (t *TreeView) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { + return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { + selectNode := func() { + node := t.currentNode + if node != nil { + if t.selected != nil { + t.selected(node) + } + if node.selected != nil { + node.selected() + } + } + } + + // Because the tree is flattened into a list only at drawing time, we also + // postpone the (selection) movement to drawing time. + switch key := event.Key(); key { + case tcell.KeyTab, tcell.KeyBacktab, tcell.KeyEscape: + if t.done != nil { + t.done(key) + } + case tcell.KeyDown, tcell.KeyRight: + t.movement = treeMove + t.step = 1 + case tcell.KeyUp, tcell.KeyLeft: + t.movement = treeMove + t.step = -1 + case tcell.KeyHome: + t.movement = treeHome + case tcell.KeyEnd: + t.movement = treeEnd + case tcell.KeyPgDn, tcell.KeyCtrlF: + _, _, _, height := t.GetInnerRect() + t.movement = treeMove + t.step = height + case tcell.KeyPgUp, tcell.KeyCtrlB: + _, _, _, height := t.GetInnerRect() + t.movement = treeMove + t.step = -height + case tcell.KeyRune: + switch event.Rune() { + case 'g': + t.movement = treeHome + case 'G': + t.movement = treeEnd + case 'j': + t.movement = treeMove + t.step = 1 + case 'J': + t.movement = treeChild + case 'k': + t.movement = treeMove + t.step = -1 + case 'K': + t.movement = treeParent + case ' ': + selectNode() + } + case tcell.KeyEnter: + selectNode() + } + + t.process(true) + }) +} + +// MouseHandler returns the mouse handler for this primitive. +func (t *TreeView) MouseHandler() func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + return t.WrapMouseHandler(func(action MouseAction, event *tcell.EventMouse, setFocus func(p Primitive)) (consumed bool, capture Primitive) { + x, y := event.Position() + if !t.InRect(x, y) { + return false, nil + } + + switch action { + case MouseLeftDown: + setFocus(t) + consumed = true + case MouseLeftClick: + _, rectY, _, _ := t.GetInnerRect() + y += t.offsetY - rectY + if y >= 0 && y < len(t.nodes) { + node := t.nodes[y] + if node.selectable { + previousNode := t.currentNode + t.currentNode = node + if previousNode != node && t.changed != nil { + t.changed(node) + } + if t.selected != nil { + t.selected(node) + } + if node.selected != nil { + node.selected() + } + } + } + consumed = true + case MouseScrollUp: + t.movement = treeScroll + t.step = -1 + consumed = true + case MouseScrollDown: + t.movement = treeScroll + t.step = 1 + consumed = true + } + + return + }) +} diff --git a/vendor/github.com/rivo/tview/tview.gif b/vendor/github.com/rivo/tview/tview.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae9ed3a605484e5984eca2182558755f91ab1605 GIT binary patch literal 973384 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

(buYG?Krec+Nt9P??=s=@&np9HWhV`Sm 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¬@>Pixm~Hu&L*Uyp6LM7i{K}2I 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ℜ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

bK&UjnaRfu4C| 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 z zv~ryRJ$3!S%8;bxt4ZfkZ=^c_^FIrm?mGGwt8X)sdd0tFoW-`dq@j&fX?^qSqKn-1WtWQ_RwWHGl4i$x;+qf-4~B#VuZ;%L zV(u#HGU{Csg9E{aDBNQp*pr*wU$(xg5o5`s13P_xK6Tj^k9)8gLNihQ>t}x;J^sA+ z+IKpY-dzt5-Rn4I^CEBb$2zp#ZOAb@YMGlkn8~1m@o7NU+E{V~&e5m;BY<{9p0=(E}R{evsTR?*kO~oxQR21 zC^HA;n>(SC4zI-yT;9cT|MCpMl?*}l+ds-m^sM9cyhK_FCh{7Gm!(Mujl=CYVsy4x zO4AyR60#l=6wWu4P7j~HNaf*#90`Jo=ki!Y5$maqd^R2URwE~y4(q966Vpn#Vs^G_ zK1_&RN5qn&?tWa!(SnR-2U+V$w~2OgiFLi%fHq%H#vz?ynIlt}6|l7xXb>$Q34uB~pwEkPJe$G0%}EoPtYWIBOQq-q&11!(1WNd9qstONZfP{<+x{g2 z3rtX6h$Ye(pM)%fNPsigZDY(c0QlvRt_g~~w?=DU%ul!lFB>e9d#Bn02Z&|P-=^|6 zkXU!sc;RyDei;*^&yjSp5d^FNK%X5n+e+udjCm?TREr}kjKYJ3 zSCfqS68UDfIZdD@1X4#t6vSNaqNrTUWB>xS&`m3R5)O*(Rr!S=mgu93YM`@@w|~d zB3_rN9IGnBW;wRd*CYu;JOXTG_k}Z4BmI5yH(;#9DHx;*qL{tekuXWT0rGT@IJv<%hX!QR`6qdUFOsYE-S0LRym0Res`>3Pu(?PW*;9m z%8Y{v7JVqIm{_XQ^9e!HsH5P#>tFiqM>D>eNork-x`0qEed5GHc9tql^=3RsW4UmE z)4x=~^#HIy;RTECv8ga=ZxDIQ{wJfr+<`p;zrtJ8*aR;Lug0Nh zN>|tP+((O4XS1hofjc|Ts&>djt%@nr4qT#P$Z{`tFpxW?OMdb&i>C0?^L7@El_Yc~ zt8RAJls-Mk{VN{G7|qFOz8#c$shYw%^@@|xaW9*BPTPf-I(R>W8JMk>oyZ*6z`*|M z@Qo4m{H+SGcu|nq5v;6O5a?c&LCcn?5m}Ey+=|0_h8JMb^g9mLU}Q3GJo#+yXja$P z2`;me*Lil`>$6-M=cnQ=ZrYvA=QG<8Bp<1AfEI8-6AH1zp=rQEK0NycwmRyJRp%I+ zcUoPHD$^OwNRo3Nv*%2)^{d#`X`Eu3Z4-&LX&I9-6DCR;%5b0TQ_p5X)0!>p9zj-M zlC-)2CP;!`U+fGGAwWXb#)vS^VwU5wQs2!|{{(Ez1JL_N=&Lj`gvWXNc~)HV`udIk zFYI1dK!c4P85#;lPBmmgwS95JHYb8N+JMgU3Z2vl?o^Pw!6eNie7gAIwq)>OIr&*E zmLr9$n0QfDdF4-C3j3V+zAISK)KEd1k8mrm2b;GC{<5=ktUCnJ zo7A31pK%KuVpBODf|*;ruE{!JjX7FOXe=P&Q_Np-7ANx|Un@Y{cb+tpM3iG@PD+bT zr1ESpzYLZKQGzFI>Uc)&=$C6e>FQ9`2%fBXyC*EaMxLiC&W&0cU(=%AaFXeASDXr| zX%{P~Q?msDJe{gZpC%sYcu8I9Nf!McJE@ifA^@LI4s@Dwa`RcgSwOa_I_=TJg)PP| zU?e!Drp=2w3`P;W3#@pFgIE7k2c4Ty!=-~I&0Kcc6jz8riwDBevhZ5$!71dvzd4^G zAc>tePl{Hax!f9dfRpz(XOwD}P0ik|&o55f@>YYV)zQrjnaGbb%^X#EHI5>gXweoc zp4fwqR4(!7TyUo^rx|5YKC0wB+ar9MF**t!MZb=Hlra_6WyFiBr5};Wfj>k)NAPQJ z-_Bg)3FDqbiQS&>;H^xZ?TyqN7s{ATRTahXMuAJ0RC#7XnJ$`=-fz#`+U^Y(uwOcP zwBNP+ZuVse3*eyHC$PK^%I>*@27-b8ExJZ;>^zv9^`IKHd-%x(aN>#mo2zE zgvusxkycxcpJ@1P-vHi}=!CYa#?;uN4K>6XWz)NbCs(OqNBP2i==bu#W zgJslS-f4f4%v&`uo%E0^Hp#5=&jc%n+uvlZ!J0~M{pvllsxWHQTeJ7)56CvdgLq-* z2Qq~QvDz1u2~XMJL--}^Zb9G!Bi`m0SpKE{D5{V1;-jO-H*%M28tuSf_bp5Wa>Il6 zW^1%g4GOBtw47}TZNA2#?LIqNyil`H1+bQNc&fuyC8%c^&8%g8tbz%OP-9mA`)IMrz^O>uX^49rxdT%I;Z#?~P8VP4wql22d_GD%8(nbXF<%3-p6 zU{JgJCCo_!$~q+gIiB)^y1`Jr${gUv~Z}Hf4*pM(=e@-P=yvBmwtvcyXDLoWUxXR%w|;b}5#@R~NnA!UTi< z((iS;%nyxh$xn*8#)w%um{dHck zKOy-|ukE3&VDR#kZm^6Rdhh>vZlXVbFH@^DsKyohaJm!{s<$Kt!ku~#GW4lGWL6}&%h z=tNoZYv;xBhEDqaO5ucLwQVb46VXW+T6@|)|AA6(0xyg@{mUKMU=?w6;NA9MP(N}_ zF`m6WE&EwM-SH1MWf_xW21-ohUL%05+YI53nWCBHoJ~Tk@Fh$XIlcx;Jvi(&cT2z) z{CqqwTyM(WqN<2yK;o(`%YMIfr}uo^#DYvM6Pbe7nfUwUuSF&>=v;{8Ce&QLkalS! zmzVFj4vf;}HHtZck0)2!f4R<~&yG4?>U1F!0cjmz_f#(-=358=C?o~^Wu<0;h?3u! z|07!r#U@}`1YSNv7;{vFP!ng{*~M~%VVOy`3Ut7DhHbyf^&Rw0`-^dooPt$7*NlHW z$pg*w+4HIecS81Z=u%eK@*c5&pV5cK|H~QRZg>wavy(|mlZ`vD?|22E4$fiYRM_5n2-Y~tMmybA}B*Kku0bg|NVFC+WG%l6NB!H=D2ybo1z9aB zM$=keiOQumY5_y$3l9*Q68;J}8{=9_%lUsmDeu133A(Ny1(8% zftoEmVyJ4~C-=x%e~tU032zz>q-6g~{B8Mu;zDrS-aXUb#&4QOb-CVdO?da%NJ+gZ z;?G9$Y)_7Y+1~#_DV0Sbn=C~zRdY;#tv6Ak%@hvzsD257{MXDCykV)Sdk@C zLy$5>DJoeFFOO9nvvS)13SYjJb?Gw2)i3Dpw|fpY?4&Ubf=r9r2F3E)S%+~LZPeI1 zfVKvusGV2yR@ERv7Kj2XC{5)y-7gd-a_)i6hYPfQxXiZ$E)vA5LX+ceFkpcG0LR=y zcD}4Ai+Dz*>w2qKFUe6?_@n_9>KY{RH5 zqD~5)qsb9dT)y$Fy^RUQ?@DS*HY49SOo-i$i(!Z!;0>$i_#dda<*O+cOKYygh8gU%&T4M788o ze;6vdUbzcI6r1DlU>8p$GI3TlBeZjfB^~9_gyJxYIEz zukV-Et}mY*koTe_wB3;c{CT@Hqs&h;eXP5mJH1Sc%Ga>kcyFOmA^y)5QB4fPNh(f8`SC5c$`*zCDA!7 z@RIiPIF6Y-T59`xK7EF`FWO^TNLqV zh+2=Pe1Eg<9WuLU)DqmPF|I5b^deyVx$Ft23`Np2@FbM^-~UzDz5g@){|y}9kzs5! zIUf_l9Mh<1Z!Y{N9m5_c7nJca#c7G;C zWHw7u;zQ3-e~t{n_e*B%lk{|9`yhogG=h94oPx{<9v9FvEKE`Zq>ax2^{QN1m z&534ckSHem++U=uj(WfPr1;$ZSP228HN5EzSN@Qt4&Kvaz|j_hGb}>^(kmtvxrH*R zbq=0zP(gnEif7}1pMI;z)~!Yk7ZKS|P44S>%?%9yWp@JKq@F1vtE!2>scn&^4V=&( zY1KYlyq)L-fpXZ761t#CsysHe5t}4s*e2%OBBF{cpWiNHoBC6(OGP@Ga<39;W(wZ6 zdoY>TgkK=;5wX3N)qo>3;*5SqN)81Q;O9ox7gKXn!=BmEwR zxzT*kSUqouGxqehZVdHLUXIG2g)6mP^yP@Gcjm4y2AX!cQOOAw8Nhe7k8#_f+#()} z1?{KHwa8P$?hf8OgMV72GmndMc))5JsA+r_Lapqr-7Jy}K3lFUtqrdqRF^CqW?m1> znn*Rdu8!3}%tNG>#9v z#O-FJ-s~nc0XDEntg9`pnid9V22}u zFVm(1x8I0!feb^?ayl9!V*o^%r^8F2!LRVKRKtj`*YAwuc zV=th@%DC28k*k_pF3p&I`pt!nD_Ii06~br-TaR>UZ9f+qw^OB4QPPkak-| zdLSh=Z~~83q2U2#yEe>bn8+B_uo|aabeD4n8fr$baWab$Gj8TNx zWTtvYFNJ}4q6$GRL&8kNDYVy)Ie;)A9qZj{hxIDg6SDEOyD$bWBMT%3Ze@2 zVFz)f(l2|Zlbj+|?1xbDv3U>V#)u3^_3$0HnobN+ngLLW+WFhUY&l{qhlybBOIszG z_tPY^ccdJCleLqWv)izhnWtUgFsXR9OZE-GP*$egj#hfBvuR}>=>k0j!o)$DL3Ts= zA!??(eRVTX%~2g^sDlOg!fiBvS6l?QiR0-4Nty_>-1@PnJtC2VZ*3gv^3IzEio2fX zF{ZT-tkz>8zA8bo*rVc_+H_Sa|0JdnjgFMpIe2&iJHy`P{ z__va7TIg^zc+w+t#vQ@dH57w_&7K>RV)MmE#FJWw4l9?c*@1SbENq}`QoSU{Dc+Lo z3)bT`qx`cKG^Z)5z_E>M{=Yk_?x#p}^r82QFtIaXnZmGTAzBUs9)W@~wd}x~TDGqP zxMQVWSDZU#PiShz>x|iKrU-_byV|tQFFZWIqIKcN!wZ{Q3?UXn0-vyzm7t7I)MO>< zfs=*09e1 zX*x|u+*D=D<`t8>xMK0m+iQZpqgcqPna%XQ`|J6(?uzK`KluF3Y&f`J?nbChS&;n79YAx%@eDd;sl@r=` zI^9oBvh5$Z2aaaU9s%2+D$rkV0DAMjhKH%20W&t`?~r!UyBh|aH>8b3Llz^*t@qWg zt<@T2`c``)#d5Wy^GGo>n5a`SE{EkJq;B)_vJgVJ+%sq#^q1Ue$OPQ?y%jKB%0L!N zfLN1uYT!L`#=#Par8{4QB%>(kznPG3ttw*K)4jUYn__7%`$hD*c_;m!! zYHOTuzLTW9-ZgEC1#kEq#a2fmDNGzJMKGirbe(4Spu3{nBUP*2JJWDui?u(>N|^FL z`jJPKR8c1I4)5ExI&<*72srLqo#_1P5vzgL#7mnO6+bk43PDU69XnP^U!5;!&(FiL z0g%iOq>IX@@wUe}Wc5L()MfVLE{ApVjyn-bmG2AN8*;D|_^ZV7-lOd}-0RL9Us_;` zG~0nFdyBlWH8uD?5C$fS1Cn)iUJy58R}z`&k>al#`G`k?T;7R=WXgZ+&HWVXEl4&4 z-#gGoX>?+IV%aFn;99as)MZSeHhi?%Rv_QhERbS6Iw6eZq4y&?obo)qSw}7v3@T3m zU(aSrjb}t_-V_;o>v*(P!MGnqYsL)og@MV;R{2&_K-QFrcKd(Vaa6QfJ z*xbU+baoC*l6^1)#|^#jp8m6NB3Cp?e!6G}BjEe;dr}Tu#|d_JmQoc5e-ix3sR6hc z0>b9q2XqjnhU}Ka6Oij+hlmpC`Yl*61;#vTmQm^)Kf-ndw-;}ruWda=V#r`!QW`Gl8nT1jL9P_)X90EVSk@mm$xHWuvgZVmZY}{ z&rIy5HpI|wMVUtXZTd9fY^W?&w^5Gg0B#dU9UNIml*P}Cgd^k_@Z%eEzym%Gjt+qwW}sw4<%^Ez?#4~W21gt z5x`(=L^EpLP_2=E2*j^8nCwnBJR_8Z_#PFmWo&)Q6p3~ogYUD3_*x4OU1-%EZ$~cLD^u|t|}<= zk)kMK${Zzbbykq?yc%F^O<}-KjuWy{5%fjZH9(Zh5%%^tN=in>CnG415kpavKxASl3|&ZYP#Y~LvX}{h z@&LlaAQ?z9EDi#pF#IidnE03>*w623B?~S|hz)j;)n{iKgoUBx60xo{C?G7Z$omt- zhUIQ!SHAiUEnuMf+OCo)l|G1>qljApyYuVYo?|$b*R2tg8FF&`Rj1;0D{r92=eN_S z^oK}B!9Gxkj+E?O2bgR}9y|Y_iYN+!p{xpzt~=9psZM8IfT63Wv!>8U4hDI^*pCiE zyCi`-7)qNiQq-I6;hRwZbk{+fRqj4c-W#ec?KcT9Z!$$f3m_bOMyZv59=yjR=Y^yr z#}>T~(|GarJG-@B%enx5;0(22~tBD z?JpFxth>Hy1;&4n;AGhRA#qRHpnrRCPjyDi4*2{bftI$_=iTZ~K@=?}a#9c!KvY%D zrFwiYwcP{7zr85jf&tfbTSpx!YA;S*za=ERwoVcl9ZZrN4-&?`=T_bNwd~=8BH-e5 z=g1r}nUefVt&ZtwxH(iw4?8snJ zSWOryV~KKJRf!eE5}Jc3apo5YXTSHO|?p8T_H8~ovOL&M;njdTM(`Qz`e$hMIyucpr@{uFN1&|NyV-v}M(&??Mu>C`SU z=_`bZl)1dtn-Kety6|tzzqAxP+(Px{cqUwzlK7`llyHF z5bw_aGZZFEz5$SYAW2louA0?fM9bFsuc6?jKOwoJbg0bpX~^5of5M)=Ef-tQ_?C}7 z4SrLKl%HN4uZ{RO>{;=)KJMGcx36peH59~@>2;NYu;-TJU{PJwTzlp=`+WNIe+-2k z$KQ25f4bOPV3n@y@S^&|8wJg$f5M*8OYgetYgeb({|$T2akF)O zdK#YpYbe}xeEAH&s{QGV9i}N|G}Gc8Q9p-a)q+>n1)Sf&i=NmbY&38c2W-X z&2e)-_WqjZ(USMM-mxFvU-wPXUdRi~J+^Qo_(93S&Cr?;3%4TLv=?v3Xb#!$fxUEH zWNs`!_usQRt&J@Jg+hW0naZU>_cC-2u6J4AUnw7DxD)rGnIka9_>a#|}+VJt! zm%r>-mw}#nU0?N$tQmvECW+9`O}>5%-R3VZUw>}F+7P~Qa2}yXjBfApFKvpamcO*C zrV^gq^2-SQ+JP5@Jv%W!UVnXU*iQJ?Wilc#6#4~|2QV+?^m>i=5eH+t+#0dF4NVGZ+$iff7b>*!vB6B4SM|d$K_{OXR#% zlW<8wU90uFwbz|9)DzE-?A-L3k%I`EDXD?QClDHTyEY4V2%g2^B02Vpn^J-CPBX0Vg^Iyf8(HDkF8c04BnpAH}uLL?xgc= totalHeight { + return 0, 0, 0 + } + + // If we don't overwrite the background, we use the default color. + if maintainBackground { + style = style.Background(tcell.ColorDefault) + } + + // Skip beginning and measure width. + var textWidth int + state := &stepState{ + unisegState: -1, + style: style, + } + newState := *state + str := text + for len(str) > 0 { + _, str, state = step(str, state, stepOptionsStyle) + if skipWidth > 0 { + skipWidth -= state.Width() + text = str + newState = *state + start += state.GrossLength() + } else { + textWidth += state.Width() + } + } + state = &newState + + // Reduce all alignments to AlignLeft. + if align == AlignRight { + // Chop off characters on the left until it fits. + for len(text) > 0 && textWidth > maxWidth { + _, text, state = step(text, state, stepOptionsStyle) + textWidth -= state.Width() + start += state.GrossLength() + } + x, maxWidth = x+maxWidth-textWidth, textWidth + } else if align == AlignCenter { + // Chop off characters on the left until it fits. + subtracted := (textWidth - maxWidth) / 2 + for len(text) > 0 && subtracted > 0 { + _, text, state = step(text, state, stepOptionsStyle) + subtracted -= state.Width() + textWidth -= state.Width() + start += state.GrossLength() + } + if textWidth < maxWidth { + x, maxWidth = x+maxWidth/2-textWidth/2, textWidth + } + } + + // Draw left-aligned text. + end = start + rightBorder := x + maxWidth + for len(text) > 0 && x < rightBorder && x < totalWidth { + var c string + c, text, state = step(text, state, stepOptionsStyle) + if c == "" { + break // We don't care about the style at the end. + } + width := state.Width() + + if width > 0 { + finalStyle := state.Style() + if maintainBackground { + _, backgroundColor, _ := finalStyle.Decompose() + if backgroundColor == tcell.ColorDefault { + _, _, existingStyle, _ := screen.GetContent(x, y) + _, background, _ := existingStyle.Decompose() + finalStyle = finalStyle.Background(background) + } + } + for offset := width - 1; offset >= 0; offset-- { + // To avoid undesired effects, we populate all cells. + runes := []rune(c) + if offset == 0 { + screen.SetContent(x+offset, y, runes[0], runes[1:], finalStyle) + } else { + screen.SetContent(x+offset, y, ' ', nil, finalStyle) + } + } + } + + x += width + end += state.GrossLength() + printedWidth += width + } + + return +} + +// PrintSimple prints white text to the screen at the given position. +func PrintSimple(screen tcell.Screen, text string, x, y int) { + Print(screen, text, x, y, math.MaxInt32, AlignLeft, Styles.PrimaryTextColor) +} diff --git a/vendor/golang.org/x/sys/plan9/asm.s b/vendor/golang.org/x/sys/plan9/asm.s new file mode 100644 index 00000000..06449ebf --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm.s @@ -0,0 +1,8 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +TEXT ·use(SB),NOSPLIT,$0 + RET diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_386.s b/vendor/golang.org/x/sys/plan9/asm_plan9_386.s new file mode 100644 index 00000000..bc5cab1f --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm_plan9_386.s @@ -0,0 +1,30 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// +// System call support for 386, Plan 9 +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-32 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-44 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-36 + JMP syscall·seek(SB) + +TEXT ·exit(SB),NOSPLIT,$4-4 + JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s b/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s new file mode 100644 index 00000000..d3448e67 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s @@ -0,0 +1,30 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// +// System call support for amd64, Plan 9 +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-64 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-88 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-56 + JMP syscall·seek(SB) + +TEXT ·exit(SB),NOSPLIT,$8-8 + JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_arm.s b/vendor/golang.org/x/sys/plan9/asm_plan9_arm.s new file mode 100644 index 00000000..afb7c0a9 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm_plan9_arm.s @@ -0,0 +1,25 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// System call support for plan9 on arm + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-32 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-44 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-36 + JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/const_plan9.go b/vendor/golang.org/x/sys/plan9/const_plan9.go new file mode 100644 index 00000000..b4e85a3a --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/const_plan9.go @@ -0,0 +1,70 @@ +package plan9 + +// Plan 9 Constants + +// Open modes +const ( + O_RDONLY = 0 + O_WRONLY = 1 + O_RDWR = 2 + O_TRUNC = 16 + O_CLOEXEC = 32 + O_EXCL = 0x1000 +) + +// Rfork flags +const ( + RFNAMEG = 1 << 0 + RFENVG = 1 << 1 + RFFDG = 1 << 2 + RFNOTEG = 1 << 3 + RFPROC = 1 << 4 + RFMEM = 1 << 5 + RFNOWAIT = 1 << 6 + RFCNAMEG = 1 << 10 + RFCENVG = 1 << 11 + RFCFDG = 1 << 12 + RFREND = 1 << 13 + RFNOMNT = 1 << 14 +) + +// Qid.Type bits +const ( + QTDIR = 0x80 + QTAPPEND = 0x40 + QTEXCL = 0x20 + QTMOUNT = 0x10 + QTAUTH = 0x08 + QTTMP = 0x04 + QTFILE = 0x00 +) + +// Dir.Mode bits +const ( + DMDIR = 0x80000000 + DMAPPEND = 0x40000000 + DMEXCL = 0x20000000 + DMMOUNT = 0x10000000 + DMAUTH = 0x08000000 + DMTMP = 0x04000000 + DMREAD = 0x4 + DMWRITE = 0x2 + DMEXEC = 0x1 +) + +const ( + STATMAX = 65535 + ERRMAX = 128 + STATFIXLEN = 49 +) + +// Mount and bind flags +const ( + MREPL = 0x0000 + MBEFORE = 0x0001 + MAFTER = 0x0002 + MORDER = 0x0003 + MCREATE = 0x0004 + MCACHE = 0x0010 + MMASK = 0x0017 +) diff --git a/vendor/golang.org/x/sys/plan9/dir_plan9.go b/vendor/golang.org/x/sys/plan9/dir_plan9.go new file mode 100644 index 00000000..0955e0c5 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/dir_plan9.go @@ -0,0 +1,212 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Plan 9 directory marshalling. See intro(5). + +package plan9 + +import "errors" + +var ( + ErrShortStat = errors.New("stat buffer too short") + ErrBadStat = errors.New("malformed stat buffer") + ErrBadName = errors.New("bad character in file name") +) + +// A Qid represents a 9P server's unique identification for a file. +type Qid struct { + Path uint64 // the file server's unique identification for the file + Vers uint32 // version number for given Path + Type uint8 // the type of the file (plan9.QTDIR for example) +} + +// A Dir contains the metadata for a file. +type Dir struct { + // system-modified data + Type uint16 // server type + Dev uint32 // server subtype + + // file data + Qid Qid // unique id from server + Mode uint32 // permissions + Atime uint32 // last read time + Mtime uint32 // last write time + Length int64 // file length + Name string // last element of path + Uid string // owner name + Gid string // group name + Muid string // last modifier name +} + +var nullDir = Dir{ + Type: ^uint16(0), + Dev: ^uint32(0), + Qid: Qid{ + Path: ^uint64(0), + Vers: ^uint32(0), + Type: ^uint8(0), + }, + Mode: ^uint32(0), + Atime: ^uint32(0), + Mtime: ^uint32(0), + Length: ^int64(0), +} + +// Null assigns special "don't touch" values to members of d to +// avoid modifying them during plan9.Wstat. +func (d *Dir) Null() { *d = nullDir } + +// Marshal encodes a 9P stat message corresponding to d into b +// +// If there isn't enough space in b for a stat message, ErrShortStat is returned. +func (d *Dir) Marshal(b []byte) (n int, err error) { + n = STATFIXLEN + len(d.Name) + len(d.Uid) + len(d.Gid) + len(d.Muid) + if n > len(b) { + return n, ErrShortStat + } + + for _, c := range d.Name { + if c == '/' { + return n, ErrBadName + } + } + + b = pbit16(b, uint16(n)-2) + b = pbit16(b, d.Type) + b = pbit32(b, d.Dev) + b = pbit8(b, d.Qid.Type) + b = pbit32(b, d.Qid.Vers) + b = pbit64(b, d.Qid.Path) + b = pbit32(b, d.Mode) + b = pbit32(b, d.Atime) + b = pbit32(b, d.Mtime) + b = pbit64(b, uint64(d.Length)) + b = pstring(b, d.Name) + b = pstring(b, d.Uid) + b = pstring(b, d.Gid) + b = pstring(b, d.Muid) + + return n, nil +} + +// UnmarshalDir decodes a single 9P stat message from b and returns the resulting Dir. +// +// If b is too small to hold a valid stat message, ErrShortStat is returned. +// +// If the stat message itself is invalid, ErrBadStat is returned. +func UnmarshalDir(b []byte) (*Dir, error) { + if len(b) < STATFIXLEN { + return nil, ErrShortStat + } + size, buf := gbit16(b) + if len(b) != int(size)+2 { + return nil, ErrBadStat + } + b = buf + + var d Dir + d.Type, b = gbit16(b) + d.Dev, b = gbit32(b) + d.Qid.Type, b = gbit8(b) + d.Qid.Vers, b = gbit32(b) + d.Qid.Path, b = gbit64(b) + d.Mode, b = gbit32(b) + d.Atime, b = gbit32(b) + d.Mtime, b = gbit32(b) + + n, b := gbit64(b) + d.Length = int64(n) + + var ok bool + if d.Name, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Uid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Gid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Muid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + + return &d, nil +} + +// pbit8 copies the 8-bit number v to b and returns the remaining slice of b. +func pbit8(b []byte, v uint8) []byte { + b[0] = byte(v) + return b[1:] +} + +// pbit16 copies the 16-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit16(b []byte, v uint16) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + return b[2:] +} + +// pbit32 copies the 32-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit32(b []byte, v uint32) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + return b[4:] +} + +// pbit64 copies the 64-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit64(b []byte, v uint64) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) + return b[8:] +} + +// pstring copies the string s to b, prepending it with a 16-bit length in little-endian order, and +// returning the remaining slice of b.. +func pstring(b []byte, s string) []byte { + b = pbit16(b, uint16(len(s))) + n := copy(b, s) + return b[n:] +} + +// gbit8 reads an 8-bit number from b and returns it with the remaining slice of b. +func gbit8(b []byte) (uint8, []byte) { + return uint8(b[0]), b[1:] +} + +// gbit16 reads a 16-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit16(b []byte) (uint16, []byte) { + return uint16(b[0]) | uint16(b[1])<<8, b[2:] +} + +// gbit32 reads a 32-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit32(b []byte) (uint32, []byte) { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24, b[4:] +} + +// gbit64 reads a 64-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit64(b []byte) (uint64, []byte) { + lo := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + hi := uint32(b[4]) | uint32(b[5])<<8 | uint32(b[6])<<16 | uint32(b[7])<<24 + return uint64(lo) | uint64(hi)<<32, b[8:] +} + +// gstring reads a string from b, prefixed with a 16-bit length in little-endian order. +// It returns the string with the remaining slice of b and a boolean. If the length is +// greater than the number of bytes in b, the boolean will be false. +func gstring(b []byte) (string, []byte, bool) { + n, b := gbit16(b) + if int(n) > len(b) { + return "", b, false + } + return string(b[:n]), b[n:], true +} diff --git a/vendor/golang.org/x/sys/plan9/env_plan9.go b/vendor/golang.org/x/sys/plan9/env_plan9.go new file mode 100644 index 00000000..8f191800 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/env_plan9.go @@ -0,0 +1,31 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Plan 9 environment variables. + +package plan9 + +import ( + "syscall" +) + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/vendor/golang.org/x/sys/plan9/errors_plan9.go b/vendor/golang.org/x/sys/plan9/errors_plan9.go new file mode 100644 index 00000000..65fe74d3 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/errors_plan9.go @@ -0,0 +1,50 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package plan9 + +import "syscall" + +// Constants +const ( + // Invented values to support what package os expects. + O_CREAT = 0x02000 + O_APPEND = 0x00400 + O_NOCTTY = 0x00000 + O_NONBLOCK = 0x00000 + O_SYNC = 0x00000 + O_ASYNC = 0x00000 + + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 +) + +// Errors +var ( + EINVAL = syscall.NewError("bad arg in system call") + ENOTDIR = syscall.NewError("not a directory") + EISDIR = syscall.NewError("file is a directory") + ENOENT = syscall.NewError("file does not exist") + EEXIST = syscall.NewError("file already exists") + EMFILE = syscall.NewError("no free file descriptors") + EIO = syscall.NewError("i/o error") + ENAMETOOLONG = syscall.NewError("file name too long") + EINTR = syscall.NewError("interrupted") + EPERM = syscall.NewError("permission denied") + EBUSY = syscall.NewError("no free devices") + ETIMEDOUT = syscall.NewError("connection timed out") + EPLAN9 = syscall.NewError("not supported by plan 9") + + // The following errors do not correspond to any + // Plan 9 system messages. Invented to support + // what package os and others expect. + EACCES = syscall.NewError("access permission denied") + EAFNOSUPPORT = syscall.NewError("address family not supported by protocol") +) diff --git a/vendor/golang.org/x/sys/plan9/mkall.sh b/vendor/golang.org/x/sys/plan9/mkall.sh new file mode 100644 index 00000000..1650fbcc --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/mkall.sh @@ -0,0 +1,150 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# The plan9 package provides access to the raw system call +# interface of the underlying operating system. Porting Go to +# a new architecture/operating system combination requires +# some manual effort, though there are tools that automate +# much of the process. The auto-generated files have names +# beginning with z. +# +# This script runs or (given -n) prints suggested commands to generate z files +# for the current system. Running those commands is not automatic. +# This script is documentation more than anything else. +# +# * asm_${GOOS}_${GOARCH}.s +# +# This hand-written assembly file implements system call dispatch. +# There are three entry points: +# +# func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); +# func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# +# The first and second are the standard ones; they differ only in +# how many arguments can be passed to the kernel. +# The third is for low-level use by the ForkExec wrapper; +# unlike the first two, it does not call into the scheduler to +# let it know that a system call is running. +# +# * syscall_${GOOS}.go +# +# This hand-written Go file implements system calls that need +# special handling and lists "//sys" comments giving prototypes +# for ones that can be auto-generated. Mksyscall reads those +# comments to generate the stubs. +# +# * syscall_${GOOS}_${GOARCH}.go +# +# Same as syscall_${GOOS}.go except that it contains code specific +# to ${GOOS} on one particular architecture. +# +# * types_${GOOS}.c +# +# This hand-written C file includes standard C headers and then +# creates typedef or enum names beginning with a dollar sign +# (use of $ in variable names is a gcc extension). The hardest +# part about preparing this file is figuring out which headers to +# include and which symbols need to be #defined to get the +# actual data structures that pass through to the kernel system calls. +# Some C libraries present alternate versions for binary compatibility +# and translate them on the way in and out of system calls, but +# there is almost always a #define that can get the real ones. +# See types_darwin.c and types_linux.c for examples. +# +# * zerror_${GOOS}_${GOARCH}.go +# +# This machine-generated file defines the system's error numbers, +# error strings, and signal numbers. The generator is "mkerrors.sh". +# Usually no arguments are needed, but mkerrors.sh will pass its +# arguments on to godefs. +# +# * zsyscall_${GOOS}_${GOARCH}.go +# +# Generated by mksyscall.pl; see syscall_${GOOS}.go above. +# +# * zsysnum_${GOOS}_${GOARCH}.go +# +# Generated by mksysnum_${GOOS}. +# +# * ztypes_${GOOS}_${GOARCH}.go +# +# Generated by godefs; see types_${GOOS}.c above. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="go run mksyscall.go" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +plan9_386) + mkerrors= + mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,386" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +plan9_amd64) + mkerrors= + mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,amd64" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +plan9_arm) + mkerrors= + mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,arm" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + plan9) + syscall_goos="syscall_$GOOS.go" + if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go |gofmt >ztypes_$GOOSARCH.go"; fi +) | $run diff --git a/vendor/golang.org/x/sys/plan9/mkerrors.sh b/vendor/golang.org/x/sys/plan9/mkerrors.sh new file mode 100644 index 00000000..526d04ab --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/mkerrors.sh @@ -0,0 +1,246 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +CC=${CC:-gcc} + +uname=$(uname) + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package plan9 + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFP][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// Code generated by the command above; DO NOT EDIT.' +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +int errors[] = { +" + for i in $errors + do + echo -E ' '$i, + done + + echo -E " +}; + +int signals[] = { +" + for i in $signals + do + echo -E ' '$i, + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +intcmp(const void *a, const void *b) +{ + return *(int*)a - *(int*)b; +} + +int +main(void) +{ + int i, j, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errors = [...]string {\n"); + qsort(errors, nelem(errors), sizeof errors[0], intcmp); + for(i=0; i 0 && errors[i-1] == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signals = [...]string {\n"); + qsort(signals, nelem(signals), sizeof signals[0], intcmp); + for(i=0; i 0 && signals[i-1] == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh b/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh new file mode 100644 index 00000000..3c3ab058 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +COMMAND="mksysnum_plan9.sh $@" + +cat <= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/vendor/golang.org/x/sys/plan9/syscall.go b/vendor/golang.org/x/sys/plan9/syscall.go new file mode 100644 index 00000000..d631fd66 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/syscall.go @@ -0,0 +1,109 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build plan9 + +// Package plan9 contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.ErrorString. +package plan9 // import "golang.org/x/sys/plan9" + +import ( + "bytes" + "strings" + "unsafe" +) + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + if strings.IndexByte(s, 0) != -1 { + return nil, EINVAL + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// ByteSliceToString returns a string form of the text represented by the slice s, with a terminating NUL and any +// bytes after the NUL removed. +func ByteSliceToString(s []byte) string { + if i := bytes.IndexByte(s, 0); i != -1 { + s = s[:i] + } + return string(s) +} + +// BytePtrToString takes a pointer to a sequence of text and returns the corresponding string. +// If the pointer is nil, it returns the empty string. It assumes that the text sequence is terminated +// at a zero byte; if the zero byte is not present, the program may crash. +func BytePtrToString(p *byte) string { + if p == nil { + return "" + } + if *p == 0 { + return "" + } + + // Find NUL terminator. + n := 0 + for ptr := unsafe.Pointer(p); *(*byte)(ptr) != 0; n++ { + ptr = unsafe.Pointer(uintptr(ptr) + 1) + } + + return string(unsafe.Slice(p, n)) +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} + +// use is a no-op, but the compiler cannot see that it is. +// Calling use(p) ensures that p is kept live until that point. +// +//go:noescape +func use(p unsafe.Pointer) diff --git a/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/vendor/golang.org/x/sys/plan9/syscall_plan9.go new file mode 100644 index 00000000..d079d811 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/syscall_plan9.go @@ -0,0 +1,361 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Plan 9 system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package plan9 + +import ( + "bytes" + "syscall" + "unsafe" +) + +// A Note is a string describing a process note. +// It implements the os.Signal interface. +type Note string + +func (n Note) Signal() {} + +func (n Note) String() string { + return string(n) +} + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + +func atoi(b []byte) (n uint) { + n = 0 + for i := 0; i < len(b); i++ { + n = n*10 + uint(b[i]-'0') + } + return +} + +func cstring(s []byte) string { + i := bytes.IndexByte(s, 0) + if i == -1 { + i = len(s) + } + return string(s[:i]) +} + +func errstr() string { + var buf [ERRMAX]byte + + RawSyscall(SYS_ERRSTR, uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), 0) + + buf[len(buf)-1] = 0 + return cstring(buf[:]) +} + +// Implemented in assembly to import from runtime. +func exit(code int) + +func Exit(code int) { exit(code) } + +func readnum(path string) (uint, error) { + var b [12]byte + + fd, e := Open(path, O_RDONLY) + if e != nil { + return 0, e + } + defer Close(fd) + + n, e := Pread(fd, b[:], 0) + + if e != nil { + return 0, e + } + + m := 0 + for ; m < n && b[m] == ' '; m++ { + } + + return atoi(b[m : n-1]), nil +} + +func Getpid() (pid int) { + n, _ := readnum("#c/pid") + return int(n) +} + +func Getppid() (ppid int) { + n, _ := readnum("#c/ppid") + return int(n) +} + +func Read(fd int, p []byte) (n int, err error) { + return Pread(fd, p, -1) +} + +func Write(fd int, p []byte) (n int, err error) { + return Pwrite(fd, p, -1) +} + +var ioSync int64 + +//sys fd2path(fd int, buf []byte) (err error) + +func Fd2path(fd int) (path string, err error) { + var buf [512]byte + + e := fd2path(fd, buf[:]) + if e != nil { + return "", e + } + return cstring(buf[:]), nil +} + +//sys pipe(p *[2]int32) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return syscall.ErrorString("bad arg in system call") + } + var pp [2]int32 + err = pipe(&pp) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, e := seek(0, fd, offset, whence) + + if newoffset == -1 { + err = syscall.ErrorString(e) + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + fd, err := Create(path, O_RDONLY, DMDIR|mode) + + if fd != -1 { + Close(fd) + } + + return +} + +type Waitmsg struct { + Pid int + Time [3]uint32 + Msg string +} + +func (w Waitmsg) Exited() bool { return true } +func (w Waitmsg) Signaled() bool { return false } + +func (w Waitmsg) ExitStatus() int { + if len(w.Msg) == 0 { + // a normal exit returns no message + return 0 + } + return 1 +} + +//sys await(s []byte) (n int, err error) + +func Await(w *Waitmsg) (err error) { + var buf [512]byte + var f [5][]byte + + n, err := await(buf[:]) + + if err != nil || w == nil { + return + } + + nf := 0 + p := 0 + for i := 0; i < n && nf < len(f)-1; i++ { + if buf[i] == ' ' { + f[nf] = buf[p:i] + p = i + 1 + nf++ + } + } + f[nf] = buf[p:] + nf++ + + if nf != len(f) { + return syscall.ErrorString("invalid wait message") + } + w.Pid = int(atoi(f[0])) + w.Time[0] = uint32(atoi(f[1])) + w.Time[1] = uint32(atoi(f[2])) + w.Time[2] = uint32(atoi(f[3])) + w.Msg = cstring(f[4]) + if w.Msg == "''" { + // await() returns '' for no error + w.Msg = "" + } + return +} + +func Unmount(name, old string) (err error) { + fixwd() + oldp, err := BytePtrFromString(old) + if err != nil { + return err + } + oldptr := uintptr(unsafe.Pointer(oldp)) + + var r0 uintptr + var e syscall.ErrorString + + // bind(2) man page: If name is zero, everything bound or mounted upon old is unbound or unmounted. + if name == "" { + r0, _, e = Syscall(SYS_UNMOUNT, _zero, oldptr, 0) + } else { + namep, err := BytePtrFromString(name) + if err != nil { + return err + } + r0, _, e = Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(namep)), oldptr, 0) + } + + if int32(r0) == -1 { + err = e + } + return +} + +func Fchdir(fd int) (err error) { + path, err := Fd2path(fd) + + if err != nil { + return + } + + return Chdir(path) +} + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +func nsec() int64 { + var scratch int64 + + r0, _, _ := Syscall(SYS_NSEC, uintptr(unsafe.Pointer(&scratch)), 0, 0) + // TODO(aram): remove hack after I fix _nsec in the pc64 kernel. + if r0 == 0 { + return scratch + } + return int64(r0) +} + +func Gettimeofday(tv *Timeval) error { + nsec := nsec() + *tv = NsecToTimeval(nsec) + return nil +} + +func Getpagesize() int { return 0x1000 } + +func Getegid() (egid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getuid() (uid int) { return -1 } + +func Getgroups() (gids []int, err error) { + return make([]int, 0), nil +} + +//sys open(path string, mode int) (fd int, err error) + +func Open(path string, mode int) (fd int, err error) { + fixwd() + return open(path, mode) +} + +//sys create(path string, mode int, perm uint32) (fd int, err error) + +func Create(path string, mode int, perm uint32) (fd int, err error) { + fixwd() + return create(path, mode, perm) +} + +//sys remove(path string) (err error) + +func Remove(path string) error { + fixwd() + return remove(path) +} + +//sys stat(path string, edir []byte) (n int, err error) + +func Stat(path string, edir []byte) (n int, err error) { + fixwd() + return stat(path, edir) +} + +//sys bind(name string, old string, flag int) (err error) + +func Bind(name string, old string, flag int) (err error) { + fixwd() + return bind(name, old, flag) +} + +//sys mount(fd int, afd int, old string, flag int, aname string) (err error) + +func Mount(fd int, afd int, old string, flag int, aname string) (err error) { + fixwd() + return mount(fd, afd, old, flag, aname) +} + +//sys wstat(path string, edir []byte) (err error) + +func Wstat(path string, edir []byte) (err error) { + fixwd() + return wstat(path, edir) +} + +//sys chdir(path string) (err error) +//sys Dup(oldfd int, newfd int) (fd int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys Close(fd int) (err error) +//sys Fstat(fd int, edir []byte) (n int, err error) +//sys Fwstat(fd int, edir []byte) (err error) diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go new file mode 100644 index 00000000..f780d5c8 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go @@ -0,0 +1,284 @@ +// go run mksyscall.go -l32 -plan9 -tags plan9,386 syscall_plan9.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build plan9 && 386 + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go new file mode 100644 index 00000000..7de61065 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go @@ -0,0 +1,284 @@ +// go run mksyscall.go -l32 -plan9 -tags plan9,amd64 syscall_plan9.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build plan9 && amd64 + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go new file mode 100644 index 00000000..ea85780f --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go @@ -0,0 +1,284 @@ +// go run mksyscall.go -l32 -plan9 -tags plan9,arm syscall_plan9.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build plan9 && arm + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go b/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go new file mode 100644 index 00000000..22e8abd4 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go @@ -0,0 +1,49 @@ +// mksysnum_plan9.sh /opt/plan9/sys/src/libc/9syscall/sys.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package plan9 + +const ( + SYS_SYSR1 = 0 + SYS_BIND = 2 + SYS_CHDIR = 3 + SYS_CLOSE = 4 + SYS_DUP = 5 + SYS_ALARM = 6 + SYS_EXEC = 7 + SYS_EXITS = 8 + SYS_FAUTH = 10 + SYS_SEGBRK = 12 + SYS_OPEN = 14 + SYS_OSEEK = 16 + SYS_SLEEP = 17 + SYS_RFORK = 19 + SYS_PIPE = 21 + SYS_CREATE = 22 + SYS_FD2PATH = 23 + SYS_BRK_ = 24 + SYS_REMOVE = 25 + SYS_NOTIFY = 28 + SYS_NOTED = 29 + SYS_SEGATTACH = 30 + SYS_SEGDETACH = 31 + SYS_SEGFREE = 32 + SYS_SEGFLUSH = 33 + SYS_RENDEZVOUS = 34 + SYS_UNMOUNT = 35 + SYS_SEMACQUIRE = 37 + SYS_SEMRELEASE = 38 + SYS_SEEK = 39 + SYS_FVERSION = 40 + SYS_ERRSTR = 41 + SYS_STAT = 42 + SYS_FSTAT = 43 + SYS_WSTAT = 44 + SYS_FWSTAT = 45 + SYS_MOUNT = 46 + SYS_AWAIT = 47 + SYS_PREAD = 50 + SYS_PWRITE = 51 + SYS_TSEMACQUIRE = 52 + SYS_NSEC = 53 +) diff --git a/vendor/golang.org/x/term/CONTRIBUTING.md b/vendor/golang.org/x/term/CONTRIBUTING.md new file mode 100644 index 00000000..d0485e88 --- /dev/null +++ b/vendor/golang.org/x/term/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. diff --git a/vendor/golang.org/x/term/LICENSE b/vendor/golang.org/x/term/LICENSE new file mode 100644 index 00000000..2a7cf70d --- /dev/null +++ b/vendor/golang.org/x/term/LICENSE @@ -0,0 +1,27 @@ +Copyright 2009 The Go Authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/term/PATENTS b/vendor/golang.org/x/term/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/golang.org/x/term/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/term/README.md b/vendor/golang.org/x/term/README.md new file mode 100644 index 00000000..05ff623f --- /dev/null +++ b/vendor/golang.org/x/term/README.md @@ -0,0 +1,16 @@ +# Go terminal/console support + +[![Go Reference](https://pkg.go.dev/badge/golang.org/x/term.svg)](https://pkg.go.dev/golang.org/x/term) + +This repository provides Go terminal and console support packages. + +## Report Issues / Send Patches + +This repository uses Gerrit for code changes. To learn how to submit changes to +this repository, see https://go.dev/doc/contribute. + +The git repository is https://go.googlesource.com/term. + +The main issue tracker for the term repository is located at +https://go.dev/issues. Prefix your issue with "x/term:" in the +subject line, so it is easy to find. diff --git a/vendor/golang.org/x/term/codereview.cfg b/vendor/golang.org/x/term/codereview.cfg new file mode 100644 index 00000000..3f8b14b6 --- /dev/null +++ b/vendor/golang.org/x/term/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/term/term.go b/vendor/golang.org/x/term/term.go new file mode 100644 index 00000000..1a40d101 --- /dev/null +++ b/vendor/golang.org/x/term/term.go @@ -0,0 +1,60 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package term provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := term.MakeRaw(int(os.Stdin.Fd())) +// if err != nil { +// panic(err) +// } +// defer term.Restore(int(os.Stdin.Fd()), oldState) +// +// Note that on non-Unix systems os.Stdin.Fd() may not be 0. +package term + +// State contains the state of a terminal. +type State struct { + state +} + +// IsTerminal returns whether the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + return isTerminal(fd) +} + +// MakeRaw puts the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + return makeRaw(fd) +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + return getState(fd) +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, oldState *State) error { + return restore(fd, oldState) +} + +// GetSize returns the visible dimensions of the given terminal. +// +// These dimensions don't include any scrollback buffer height. +func GetSize(fd int) (width, height int, err error) { + return getSize(fd) +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + return readPassword(fd) +} diff --git a/vendor/golang.org/x/term/term_plan9.go b/vendor/golang.org/x/term/term_plan9.go new file mode 100644 index 00000000..21afa55c --- /dev/null +++ b/vendor/golang.org/x/term/term_plan9.go @@ -0,0 +1,42 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package term + +import ( + "fmt" + "runtime" + + "golang.org/x/sys/plan9" +) + +type state struct{} + +func isTerminal(fd int) bool { + path, err := plan9.Fd2path(fd) + if err != nil { + return false + } + return path == "/dev/cons" || path == "/mnt/term/dev/cons" +} + +func makeRaw(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func getState(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func restore(fd int, state *State) error { + return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func getSize(fd int) (width, height int, err error) { + return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func readPassword(fd int) ([]byte, error) { + return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} diff --git a/vendor/golang.org/x/term/term_unix.go b/vendor/golang.org/x/term/term_unix.go new file mode 100644 index 00000000..1ad0ddfe --- /dev/null +++ b/vendor/golang.org/x/term/term_unix.go @@ -0,0 +1,91 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos + +package term + +import ( + "golang.org/x/sys/unix" +) + +type state struct { + termios unix.Termios +} + +func isTerminal(fd int) bool { + _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + return err == nil +} + +func makeRaw(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + oldState := State{state{termios: *termios}} + + // This attempts to replicate the behaviour documented for cfmakeraw in + // the termios(3) manpage. + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil { + return nil, err + } + + return &oldState, nil +} + +func getState(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + return &State{state{termios: *termios}}, nil +} + +func restore(fd int, state *State) error { + return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) +} + +func getSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return 0, 0, err + } + return int(ws.Col), int(ws.Row), nil +} + +// passwordReader is an io.Reader that reads from a specific file descriptor. +type passwordReader int + +func (r passwordReader) Read(buf []byte) (int, error) { + return unix.Read(int(r), buf) +} + +func readPassword(fd int) ([]byte, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + newState := *termios + newState.Lflag &^= unix.ECHO + newState.Lflag |= unix.ICANON | unix.ISIG + newState.Iflag |= unix.ICRNL + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil { + return nil, err + } + + defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) + + return readPasswordLine(passwordReader(fd)) +} diff --git a/vendor/golang.org/x/term/term_unix_bsd.go b/vendor/golang.org/x/term/term_unix_bsd.go new file mode 100644 index 00000000..9dbf5462 --- /dev/null +++ b/vendor/golang.org/x/term/term_unix_bsd.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin || dragonfly || freebsd || netbsd || openbsd + +package term + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TIOCGETA +const ioctlWriteTermios = unix.TIOCSETA diff --git a/vendor/golang.org/x/term/term_unix_other.go b/vendor/golang.org/x/term/term_unix_other.go new file mode 100644 index 00000000..1b36de79 --- /dev/null +++ b/vendor/golang.org/x/term/term_unix_other.go @@ -0,0 +1,12 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || linux || solaris || zos + +package term + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS +const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/golang.org/x/term/term_unsupported.go b/vendor/golang.org/x/term/term_unsupported.go new file mode 100644 index 00000000..3c409e58 --- /dev/null +++ b/vendor/golang.org/x/term/term_unsupported.go @@ -0,0 +1,38 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !zos && !windows && !solaris && !plan9 + +package term + +import ( + "fmt" + "runtime" +) + +type state struct{} + +func isTerminal(fd int) bool { + return false +} + +func makeRaw(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func getState(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func restore(fd int, state *State) error { + return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func getSize(fd int) (width, height int, err error) { + return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +func readPassword(fd int) ([]byte, error) { + return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} diff --git a/vendor/golang.org/x/term/term_windows.go b/vendor/golang.org/x/term/term_windows.go new file mode 100644 index 00000000..0ddd81c0 --- /dev/null +++ b/vendor/golang.org/x/term/term_windows.go @@ -0,0 +1,82 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package term + +import ( + "os" + + "golang.org/x/sys/windows" +) + +type state struct { + mode uint32 +} + +func isTerminal(fd int) bool { + var st uint32 + err := windows.GetConsoleMode(windows.Handle(fd), &st) + return err == nil +} + +// This is intended to be used on a console input handle. +// See https://learn.microsoft.com/en-us/windows/console/setconsolemode +func makeRaw(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT) + raw |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT + if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { + return nil, err + } + return &State{state{st}}, nil +} + +func getState(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + return &State{state{st}}, nil +} + +func restore(fd int, state *State) error { + return windows.SetConsoleMode(windows.Handle(fd), state.mode) +} + +func getSize(fd int) (width, height int, err error) { + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { + return 0, 0, err + } + return int(info.Window.Right - info.Window.Left + 1), int(info.Window.Bottom - info.Window.Top + 1), nil +} + +func readPassword(fd int) ([]byte, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + old := st + + st &^= (windows.ENABLE_ECHO_INPUT | windows.ENABLE_LINE_INPUT) + st |= (windows.ENABLE_PROCESSED_OUTPUT | windows.ENABLE_PROCESSED_INPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { + return nil, err + } + + defer windows.SetConsoleMode(windows.Handle(fd), old) + + var h windows.Handle + p, _ := windows.GetCurrentProcess() + if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { + return nil, err + } + + f := os.NewFile(uintptr(h), "stdin") + defer f.Close() + return readPasswordLine(f) +} diff --git a/vendor/golang.org/x/term/terminal.go b/vendor/golang.org/x/term/terminal.go new file mode 100644 index 00000000..bddb2e2a --- /dev/null +++ b/vendor/golang.org/x/term/terminal.go @@ -0,0 +1,1048 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package term + +import ( + "bytes" + "fmt" + "io" + "runtime" + "strconv" + "sync" + "unicode/utf8" +) + +// EscapeCodes contains escape sequences that can be written to the terminal in +// order to achieve different styles of text. +type EscapeCodes struct { + // Foreground colors + Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte + + // Reset all attributes + Reset []byte +} + +var vt100EscapeCodes = EscapeCodes{ + Black: []byte{keyEscape, '[', '3', '0', 'm'}, + Red: []byte{keyEscape, '[', '3', '1', 'm'}, + Green: []byte{keyEscape, '[', '3', '2', 'm'}, + Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, + Blue: []byte{keyEscape, '[', '3', '4', 'm'}, + Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, + Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, + White: []byte{keyEscape, '[', '3', '7', 'm'}, + + Reset: []byte{keyEscape, '[', '0', 'm'}, +} + +// A History provides a (possibly bounded) queue of input lines read by [Terminal.ReadLine]. +type History interface { + // Add will be called by [Terminal.ReadLine] to add + // a new, most recent entry to the history. + // It is allowed to drop any entry, including + // the entry being added (e.g., if it's deemed an invalid entry), + // the least-recent entry (e.g., to keep the history bounded), + // or any other entry. + Add(entry string) + + // Len returns the number of entries in the history. + Len() int + + // At returns an entry from the history. + // Index 0 is the most-recently added entry and + // index Len()-1 is the least-recently added entry. + // If index is < 0 or >= Len(), it panics. + At(idx int) string +} + +// Terminal contains the state for running a VT100 terminal that is capable of +// reading lines of input. +type Terminal struct { + // AutoCompleteCallback, if non-null, is called for each keypress with + // the full input line and the current position of the cursor (in + // bytes, as an index into |line|). If it returns ok=false, the key + // press is processed normally. Otherwise it returns a replacement line + // and the new cursor position. + // + // This will be disabled during ReadPassword. + AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) + + // Escape contains a pointer to the escape codes for this terminal. + // It's always a valid pointer, although the escape codes themselves + // may be empty if the terminal doesn't support them. + Escape *EscapeCodes + + // lock protects the terminal and the state in this object from + // concurrent processing of a key press and a Write() call. + lock sync.Mutex + + c io.ReadWriter + prompt []rune + + // line is the current line being entered. + line []rune + // pos is the logical position of the cursor in line + pos int + // echo is true if local echo is enabled + echo bool + // pasteActive is true iff there is a bracketed paste operation in + // progress. + pasteActive bool + + // cursorX contains the current X value of the cursor where the left + // edge is 0. cursorY contains the row number where the first row of + // the current line is 0. + cursorX, cursorY int + // maxLine is the greatest value of cursorY so far. + maxLine int + + termWidth, termHeight int + + // outBuf contains the terminal data to be sent. + outBuf []byte + // remainder contains the remainder of any partial key sequences after + // a read. It aliases into inBuf. + remainder []byte + inBuf [256]byte + + // History records and retrieves lines of input read by [ReadLine] which + // a user can retrieve and navigate using the up and down arrow keys. + // + // It is not safe to call ReadLine concurrently with any methods on History. + // + // [NewTerminal] sets this to a default implementation that records the + // last 100 lines of input. + History History + // historyIndex stores the currently accessed history entry, where zero + // means the immediately previous entry. + historyIndex int + // When navigating up and down the history it's possible to return to + // the incomplete, initial line. That value is stored in + // historyPending. + historyPending string +} + +// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is +// a local terminal, that terminal must first have been put into raw mode. +// prompt is a string that is written at the start of each input line (i.e. +// "> "). +func NewTerminal(c io.ReadWriter, prompt string) *Terminal { + return &Terminal{ + Escape: &vt100EscapeCodes, + c: c, + prompt: []rune(prompt), + termWidth: 80, + termHeight: 24, + echo: true, + historyIndex: -1, + History: &stRingBuffer{}, + } +} + +const ( + keyCtrlC = 3 + keyCtrlD = 4 + keyCtrlU = 21 + keyEnter = '\r' + keyLF = '\n' + keyEscape = 27 + keyBackspace = 127 + keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota + keyUp + keyDown + keyLeft + keyRight + keyAltLeft + keyAltRight + keyHome + keyEnd + keyDeleteWord + keyDeleteLine + keyClearScreen + keyPasteStart + keyPasteEnd +) + +var ( + crlf = []byte{'\r', '\n'} + pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} + pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} +) + +// bytesToKey tries to parse a key sequence from b. If successful, it returns +// the key and the remainder of the input. Otherwise it returns utf8.RuneError. +func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { + if len(b) == 0 { + return utf8.RuneError, nil + } + + if !pasteActive { + switch b[0] { + case 1: // ^A + return keyHome, b[1:] + case 2: // ^B + return keyLeft, b[1:] + case 5: // ^E + return keyEnd, b[1:] + case 6: // ^F + return keyRight, b[1:] + case 8: // ^H + return keyBackspace, b[1:] + case 11: // ^K + return keyDeleteLine, b[1:] + case 12: // ^L + return keyClearScreen, b[1:] + case 23: // ^W + return keyDeleteWord, b[1:] + case 14: // ^N + return keyDown, b[1:] + case 16: // ^P + return keyUp, b[1:] + } + } + + if b[0] != keyEscape { + if !utf8.FullRune(b) { + return utf8.RuneError, b + } + r, l := utf8.DecodeRune(b) + return r, b[l:] + } + + if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { + switch b[2] { + case 'A': + return keyUp, b[3:] + case 'B': + return keyDown, b[3:] + case 'C': + return keyRight, b[3:] + case 'D': + return keyLeft, b[3:] + case 'H': + return keyHome, b[3:] + case 'F': + return keyEnd, b[3:] + } + } + + if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { + switch b[5] { + case 'C': + return keyAltRight, b[6:] + case 'D': + return keyAltLeft, b[6:] + } + } + + if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { + return keyPasteStart, b[6:] + } + + if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { + return keyPasteEnd, b[6:] + } + + // If we get here then we have a key that we don't recognise, or a + // partial sequence. It's not clear how one should find the end of a + // sequence without knowing them all, but it seems that [a-zA-Z~] only + // appears at the end of a sequence. + for i, c := range b[0:] { + if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { + return keyUnknown, b[i+1:] + } + } + + return utf8.RuneError, b +} + +// queue appends data to the end of t.outBuf +func (t *Terminal) queue(data []rune) { + t.outBuf = append(t.outBuf, []byte(string(data))...) +} + +var space = []rune{' '} + +func isPrintable(key rune) bool { + isInSurrogateArea := key >= 0xd800 && key <= 0xdbff + return key >= 32 && !isInSurrogateArea +} + +// moveCursorToPos appends data to t.outBuf which will move the cursor to the +// given, logical position in the text. +func (t *Terminal) moveCursorToPos(pos int) { + if !t.echo { + return + } + + x := visualLength(t.prompt) + pos + y := x / t.termWidth + x = x % t.termWidth + + up := 0 + if y < t.cursorY { + up = t.cursorY - y + } + + down := 0 + if y > t.cursorY { + down = y - t.cursorY + } + + left := 0 + if x < t.cursorX { + left = t.cursorX - x + } + + right := 0 + if x > t.cursorX { + right = x - t.cursorX + } + + t.cursorX = x + t.cursorY = y + t.move(up, down, left, right) +} + +func (t *Terminal) move(up, down, left, right int) { + m := []rune{} + + // 1 unit up can be expressed as ^[[A or ^[A + // 5 units up can be expressed as ^[[5A + + if up == 1 { + m = append(m, keyEscape, '[', 'A') + } else if up > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(up))...) + m = append(m, 'A') + } + + if down == 1 { + m = append(m, keyEscape, '[', 'B') + } else if down > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(down))...) + m = append(m, 'B') + } + + if right == 1 { + m = append(m, keyEscape, '[', 'C') + } else if right > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(right))...) + m = append(m, 'C') + } + + if left == 1 { + m = append(m, keyEscape, '[', 'D') + } else if left > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(left))...) + m = append(m, 'D') + } + + t.queue(m) +} + +func (t *Terminal) clearLineToRight() { + op := []rune{keyEscape, '[', 'K'} + t.queue(op) +} + +const maxLineLength = 4096 + +func (t *Terminal) setLine(newLine []rune, newPos int) { + if t.echo { + t.moveCursorToPos(0) + t.writeLine(newLine) + for i := len(newLine); i < len(t.line); i++ { + t.writeLine(space) + } + t.moveCursorToPos(newPos) + } + t.line = newLine + t.pos = newPos +} + +func (t *Terminal) advanceCursor(places int) { + t.cursorX += places + t.cursorY += t.cursorX / t.termWidth + if t.cursorY > t.maxLine { + t.maxLine = t.cursorY + } + t.cursorX = t.cursorX % t.termWidth + + if places > 0 && t.cursorX == 0 { + // Normally terminals will advance the current position + // when writing a character. But that doesn't happen + // for the last character in a line. However, when + // writing a character (except a new line) that causes + // a line wrap, the position will be advanced two + // places. + // + // So, if we are stopping at the end of a line, we + // need to write a newline so that our cursor can be + // advanced to the next line. + t.outBuf = append(t.outBuf, '\r', '\n') + } +} + +func (t *Terminal) eraseNPreviousChars(n int) { + if n == 0 { + return + } + + if t.pos < n { + n = t.pos + } + t.pos -= n + t.moveCursorToPos(t.pos) + + copy(t.line[t.pos:], t.line[n+t.pos:]) + t.line = t.line[:len(t.line)-n] + if t.echo { + t.writeLine(t.line[t.pos:]) + for i := 0; i < n; i++ { + t.queue(space) + } + t.advanceCursor(n) + t.moveCursorToPos(t.pos) + } +} + +// countToLeftWord returns then number of characters from the cursor to the +// start of the previous word. +func (t *Terminal) countToLeftWord() int { + if t.pos == 0 { + return 0 + } + + pos := t.pos - 1 + for pos > 0 { + if t.line[pos] != ' ' { + break + } + pos-- + } + for pos > 0 { + if t.line[pos] == ' ' { + pos++ + break + } + pos-- + } + + return t.pos - pos +} + +// countToRightWord returns then number of characters from the cursor to the +// start of the next word. +func (t *Terminal) countToRightWord() int { + pos := t.pos + for pos < len(t.line) { + if t.line[pos] == ' ' { + break + } + pos++ + } + for pos < len(t.line) { + if t.line[pos] != ' ' { + break + } + pos++ + } + return pos - t.pos +} + +// visualLength returns the number of visible glyphs in s. +func visualLength(runes []rune) int { + inEscapeSeq := false + length := 0 + + for _, r := range runes { + switch { + case inEscapeSeq: + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { + inEscapeSeq = false + } + case r == '\x1b': + inEscapeSeq = true + default: + length++ + } + } + + return length +} + +// histroryAt unlocks the terminal and relocks it while calling History.At. +func (t *Terminal) historyAt(idx int) (string, bool) { + t.lock.Unlock() // Unlock to avoid deadlock if History methods use the output writer. + defer t.lock.Lock() // panic in At (or Len) protection. + if idx < 0 || idx >= t.History.Len() { + return "", false + } + return t.History.At(idx), true +} + +// historyAdd unlocks the terminal and relocks it while calling History.Add. +func (t *Terminal) historyAdd(entry string) { + t.lock.Unlock() // Unlock to avoid deadlock if History methods use the output writer. + defer t.lock.Lock() // panic in Add protection. + t.History.Add(entry) +} + +// handleKey processes the given key and, optionally, returns a line of text +// that the user has entered. +func (t *Terminal) handleKey(key rune) (line string, ok bool) { + if t.pasteActive && key != keyEnter && key != keyLF { + t.addKeyToLine(key) + return + } + + switch key { + case keyBackspace: + if t.pos == 0 { + return + } + t.eraseNPreviousChars(1) + case keyAltLeft: + // move left by a word. + t.pos -= t.countToLeftWord() + t.moveCursorToPos(t.pos) + case keyAltRight: + // move right by a word. + t.pos += t.countToRightWord() + t.moveCursorToPos(t.pos) + case keyLeft: + if t.pos == 0 { + return + } + t.pos-- + t.moveCursorToPos(t.pos) + case keyRight: + if t.pos == len(t.line) { + return + } + t.pos++ + t.moveCursorToPos(t.pos) + case keyHome: + if t.pos == 0 { + return + } + t.pos = 0 + t.moveCursorToPos(t.pos) + case keyEnd: + if t.pos == len(t.line) { + return + } + t.pos = len(t.line) + t.moveCursorToPos(t.pos) + case keyUp: + entry, ok := t.historyAt(t.historyIndex + 1) + if !ok { + return "", false + } + if t.historyIndex == -1 { + t.historyPending = string(t.line) + } + t.historyIndex++ + runes := []rune(entry) + t.setLine(runes, len(runes)) + case keyDown: + switch t.historyIndex { + case -1: + return + case 0: + runes := []rune(t.historyPending) + t.setLine(runes, len(runes)) + t.historyIndex-- + default: + entry, ok := t.historyAt(t.historyIndex - 1) + if ok { + t.historyIndex-- + runes := []rune(entry) + t.setLine(runes, len(runes)) + } + } + case keyEnter, keyLF: + t.moveCursorToPos(len(t.line)) + t.queue([]rune("\r\n")) + line = string(t.line) + ok = true + t.line = t.line[:0] + t.pos = 0 + t.cursorX = 0 + t.cursorY = 0 + t.maxLine = 0 + case keyDeleteWord: + // Delete zero or more spaces and then one or more characters. + t.eraseNPreviousChars(t.countToLeftWord()) + case keyDeleteLine: + // Delete everything from the current cursor position to the + // end of line. + for i := t.pos; i < len(t.line); i++ { + t.queue(space) + t.advanceCursor(1) + } + t.line = t.line[:t.pos] + t.moveCursorToPos(t.pos) + case keyCtrlD: + // Erase the character under the current position. + // The EOF case when the line is empty is handled in + // readLine(). + if t.pos < len(t.line) { + t.pos++ + t.eraseNPreviousChars(1) + } + case keyCtrlU: + t.eraseNPreviousChars(t.pos) + case keyClearScreen: + // Erases the screen and moves the cursor to the home position. + t.queue([]rune("\x1b[2J\x1b[H")) + t.queue(t.prompt) + t.cursorX, t.cursorY = 0, 0 + t.advanceCursor(visualLength(t.prompt)) + t.setLine(t.line, t.pos) + default: + if t.AutoCompleteCallback != nil { + prefix := string(t.line[:t.pos]) + suffix := string(t.line[t.pos:]) + + t.lock.Unlock() + newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) + t.lock.Lock() + + if completeOk { + t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) + return + } + } + if !isPrintable(key) { + return + } + if len(t.line) == maxLineLength { + return + } + t.addKeyToLine(key) + } + return +} + +// addKeyToLine inserts the given key at the current position in the current +// line. +func (t *Terminal) addKeyToLine(key rune) { + if len(t.line) == cap(t.line) { + newLine := make([]rune, len(t.line), 2*(1+len(t.line))) + copy(newLine, t.line) + t.line = newLine + } + t.line = t.line[:len(t.line)+1] + copy(t.line[t.pos+1:], t.line[t.pos:]) + t.line[t.pos] = key + if t.echo { + t.writeLine(t.line[t.pos:]) + } + t.pos++ + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) writeLine(line []rune) { + for len(line) != 0 { + remainingOnLine := t.termWidth - t.cursorX + todo := len(line) + if todo > remainingOnLine { + todo = remainingOnLine + } + t.queue(line[:todo]) + t.advanceCursor(visualLength(line[:todo])) + line = line[todo:] + } +} + +// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. +func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { + for len(buf) > 0 { + i := bytes.IndexByte(buf, '\n') + todo := len(buf) + if i >= 0 { + todo = i + } + + var nn int + nn, err = w.Write(buf[:todo]) + n += nn + if err != nil { + return n, err + } + buf = buf[todo:] + + if i >= 0 { + if _, err = w.Write(crlf); err != nil { + return n, err + } + n++ + buf = buf[1:] + } + } + + return n, nil +} + +func (t *Terminal) Write(buf []byte) (n int, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + if t.cursorX == 0 && t.cursorY == 0 { + // This is the easy case: there's nothing on the screen that we + // have to move out of the way. + return writeWithCRLF(t.c, buf) + } + + // We have a prompt and possibly user input on the screen. We + // have to clear it first. + t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) + t.cursorX = 0 + t.clearLineToRight() + + for t.cursorY > 0 { + t.move(1 /* up */, 0, 0, 0) + t.cursorY-- + t.clearLineToRight() + } + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + + if n, err = writeWithCRLF(t.c, buf); err != nil { + return + } + + t.writeLine(t.prompt) + if t.echo { + t.writeLine(t.line) + } + + t.moveCursorToPos(t.pos) + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + return +} + +// ReadPassword temporarily changes the prompt and reads a password, without +// echo, from the terminal. +// +// The AutoCompleteCallback is disabled during this call. +func (t *Terminal) ReadPassword(prompt string) (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + oldPrompt := t.prompt + t.prompt = []rune(prompt) + t.echo = false + oldAutoCompleteCallback := t.AutoCompleteCallback + t.AutoCompleteCallback = nil + defer func() { + t.AutoCompleteCallback = oldAutoCompleteCallback + }() + + line, err = t.readLine() + + t.prompt = oldPrompt + t.echo = true + + return +} + +// ReadLine returns a line of input from the terminal. +func (t *Terminal) ReadLine() (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + return t.readLine() +} + +func (t *Terminal) readLine() (line string, err error) { + // t.lock must be held at this point + + if t.cursorX == 0 && t.cursorY == 0 { + t.writeLine(t.prompt) + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + } + + lineIsPasted := t.pasteActive + + for { + rest := t.remainder + lineOk := false + for !lineOk { + var key rune + key, rest = bytesToKey(rest, t.pasteActive) + if key == utf8.RuneError { + break + } + if !t.pasteActive { + if key == keyCtrlD { + if len(t.line) == 0 { + return "", io.EOF + } + } + if key == keyCtrlC { + return "", io.EOF + } + if key == keyPasteStart { + t.pasteActive = true + if len(t.line) == 0 { + lineIsPasted = true + } + continue + } + } else if key == keyPasteEnd { + t.pasteActive = false + continue + } + if !t.pasteActive { + lineIsPasted = false + } + // If we have CR, consume LF if present (CRLF sequence) to avoid returning an extra empty line. + if key == keyEnter && len(rest) > 0 && rest[0] == keyLF { + rest = rest[1:] + } + line, lineOk = t.handleKey(key) + } + if len(rest) > 0 { + n := copy(t.inBuf[:], rest) + t.remainder = t.inBuf[:n] + } else { + t.remainder = nil + } + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + if lineOk { + if t.echo { + t.historyIndex = -1 + t.historyAdd(line) + } + if lineIsPasted { + err = ErrPasteIndicator + } + return + } + + // t.remainder is a slice at the beginning of t.inBuf + // containing a partial key sequence + readBuf := t.inBuf[len(t.remainder):] + var n int + + t.lock.Unlock() + n, err = t.c.Read(readBuf) + t.lock.Lock() + + if err != nil { + return + } + + t.remainder = t.inBuf[:n+len(t.remainder)] + } +} + +// SetPrompt sets the prompt to be used when reading subsequent lines. +func (t *Terminal) SetPrompt(prompt string) { + t.lock.Lock() + defer t.lock.Unlock() + + t.prompt = []rune(prompt) +} + +func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { + // Move cursor to column zero at the start of the line. + t.move(t.cursorY, 0, t.cursorX, 0) + t.cursorX, t.cursorY = 0, 0 + t.clearLineToRight() + for t.cursorY < numPrevLines { + // Move down a line + t.move(0, 1, 0, 0) + t.cursorY++ + t.clearLineToRight() + } + // Move back to beginning. + t.move(t.cursorY, 0, 0, 0) + t.cursorX, t.cursorY = 0, 0 + + t.queue(t.prompt) + t.advanceCursor(visualLength(t.prompt)) + t.writeLine(t.line) + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) SetSize(width, height int) error { + t.lock.Lock() + defer t.lock.Unlock() + + if width == 0 { + width = 1 + } + + oldWidth := t.termWidth + t.termWidth, t.termHeight = width, height + + switch { + case width == oldWidth: + // If the width didn't change then nothing else needs to be + // done. + return nil + case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: + // If there is nothing on current line and no prompt printed, + // just do nothing + return nil + case width < oldWidth: + // Some terminals (e.g. xterm) will truncate lines that were + // too long when shinking. Others, (e.g. gnome-terminal) will + // attempt to wrap them. For the former, repainting t.maxLine + // works great, but that behaviour goes badly wrong in the case + // of the latter because they have doubled every full line. + + // We assume that we are working on a terminal that wraps lines + // and adjust the cursor position based on every previous line + // wrapping and turning into two. This causes the prompt on + // xterms to move upwards, which isn't great, but it avoids a + // huge mess with gnome-terminal. + if t.cursorX >= t.termWidth { + t.cursorX = t.termWidth - 1 + } + t.cursorY *= 2 + t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) + case width > oldWidth: + // If the terminal expands then our position calculations will + // be wrong in the future because we think the cursor is + // |t.pos| chars into the string, but there will be a gap at + // the end of any wrapped line. + // + // But the position will actually be correct until we move, so + // we can move back to the beginning and repaint everything. + t.clearAndRepaintLinePlusNPrevious(t.maxLine) + } + + _, err := t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + return err +} + +type pasteIndicatorError struct{} + +func (pasteIndicatorError) Error() string { + return "terminal: ErrPasteIndicator not correctly handled" +} + +// ErrPasteIndicator may be returned from ReadLine as the error, in addition +// to valid line data. It indicates that bracketed paste mode is enabled and +// that the returned line consists only of pasted data. Programs may wish to +// interpret pasted data more literally than typed data. +var ErrPasteIndicator = pasteIndicatorError{} + +// SetBracketedPasteMode requests that the terminal bracket paste operations +// with markers. Not all terminals support this but, if it is supported, then +// enabling this mode will stop any autocomplete callback from running due to +// pastes. Additionally, any lines that are completely pasted will be returned +// from ReadLine with the error set to ErrPasteIndicator. +func (t *Terminal) SetBracketedPasteMode(on bool) { + if on { + io.WriteString(t.c, "\x1b[?2004h") + } else { + io.WriteString(t.c, "\x1b[?2004l") + } +} + +// stRingBuffer is a ring buffer of strings. +type stRingBuffer struct { + // entries contains max elements. + entries []string + max int + // head contains the index of the element most recently added to the ring. + head int + // size contains the number of elements in the ring. + size int +} + +func (s *stRingBuffer) Add(a string) { + if s.entries == nil { + const defaultNumEntries = 100 + s.entries = make([]string, defaultNumEntries) + s.max = defaultNumEntries + } + + s.head = (s.head + 1) % s.max + s.entries[s.head] = a + if s.size < s.max { + s.size++ + } +} + +func (s *stRingBuffer) Len() int { + return s.size +} + +// At returns the value passed to the nth previous call to Add. +// If n is zero then the immediately prior value is returned, if one, then the +// next most recent, and so on. If such an element doesn't exist then ok is +// false. +func (s *stRingBuffer) At(n int) string { + if n < 0 || n >= s.size { + panic(fmt.Sprintf("term: history index [%d] out of range [0,%d)", n, s.size)) + } + index := s.head - n + if index < 0 { + index += s.max + } + return s.entries[index] +} + +// readPasswordLine reads from reader until it finds \n or io.EOF. +// The slice returned does not include the \n. +// readPasswordLine also ignores any \r it finds. +// Windows uses \r as end of line. So, on Windows, readPasswordLine +// reads until it finds \r and ignores any \n it finds during processing. +func readPasswordLine(reader io.Reader) ([]byte, error) { + var buf [1]byte + var ret []byte + + for { + n, err := reader.Read(buf[:]) + if n > 0 { + switch buf[0] { + case '\b': + if len(ret) > 0 { + ret = ret[:len(ret)-1] + } + case '\n': + if runtime.GOOS != "windows" { + return ret, nil + } + // otherwise ignore \n + case '\r': + if runtime.GOOS == "windows" { + return ret, nil + } + // otherwise ignore \r + default: + ret = append(ret, buf[0]) + } + continue + } + if err != nil { + if err == io.EOF && len(ret) > 0 { + return ret, nil + } + return ret, err + } + } +} diff --git a/vendor/golang.org/x/text/encoding/encoding.go b/vendor/golang.org/x/text/encoding/encoding.go new file mode 100644 index 00000000..a0bd7cd4 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/encoding.go @@ -0,0 +1,335 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package encoding defines an interface for character encodings, such as Shift +// JIS and Windows 1252, that can convert to and from UTF-8. +// +// Encoding implementations are provided in other packages, such as +// golang.org/x/text/encoding/charmap and +// golang.org/x/text/encoding/japanese. +package encoding // import "golang.org/x/text/encoding" + +import ( + "errors" + "io" + "strconv" + "unicode/utf8" + + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// TODO: +// - There seems to be some inconsistency in when decoders return errors +// and when not. Also documentation seems to suggest they shouldn't return +// errors at all (except for UTF-16). +// - Encoders seem to rely on or at least benefit from the input being in NFC +// normal form. Perhaps add an example how users could prepare their output. + +// Encoding is a character set encoding that can be transformed to and from +// UTF-8. +type Encoding interface { + // NewDecoder returns a Decoder. + NewDecoder() *Decoder + + // NewEncoder returns an Encoder. + NewEncoder() *Encoder +} + +// A Decoder converts bytes to UTF-8. It implements transform.Transformer. +// +// Transforming source bytes that are not of that encoding will not result in an +// error per se. Each byte that cannot be transcoded will be represented in the +// output by the UTF-8 encoding of '\uFFFD', the replacement rune. +type Decoder struct { + transform.Transformer + + // This forces external creators of Decoders to use names in struct + // initializers, allowing for future extendibility without having to break + // code. + _ struct{} +} + +// Bytes converts the given encoded bytes to UTF-8. It returns the converted +// bytes or nil, err if any error occurred. +func (d *Decoder) Bytes(b []byte) ([]byte, error) { + b, _, err := transform.Bytes(d, b) + if err != nil { + return nil, err + } + return b, nil +} + +// String converts the given encoded string to UTF-8. It returns the converted +// string or "", err if any error occurred. +func (d *Decoder) String(s string) (string, error) { + s, _, err := transform.String(d, s) + if err != nil { + return "", err + } + return s, nil +} + +// Reader wraps another Reader to decode its bytes. +// +// The Decoder may not be used for any other operation as long as the returned +// Reader is in use. +func (d *Decoder) Reader(r io.Reader) io.Reader { + return transform.NewReader(r, d) +} + +// An Encoder converts bytes from UTF-8. It implements transform.Transformer. +// +// Each rune that cannot be transcoded will result in an error. In this case, +// the transform will consume all source byte up to, not including the offending +// rune. Transforming source bytes that are not valid UTF-8 will be replaced by +// `\uFFFD`. To return early with an error instead, use transform.Chain to +// preprocess the data with a UTF8Validator. +type Encoder struct { + transform.Transformer + + // This forces external creators of Encoders to use names in struct + // initializers, allowing for future extendibility without having to break + // code. + _ struct{} +} + +// Bytes converts bytes from UTF-8. It returns the converted bytes or nil, err if +// any error occurred. +func (e *Encoder) Bytes(b []byte) ([]byte, error) { + b, _, err := transform.Bytes(e, b) + if err != nil { + return nil, err + } + return b, nil +} + +// String converts a string from UTF-8. It returns the converted string or +// "", err if any error occurred. +func (e *Encoder) String(s string) (string, error) { + s, _, err := transform.String(e, s) + if err != nil { + return "", err + } + return s, nil +} + +// Writer wraps another Writer to encode its UTF-8 output. +// +// The Encoder may not be used for any other operation as long as the returned +// Writer is in use. +func (e *Encoder) Writer(w io.Writer) io.Writer { + return transform.NewWriter(w, e) +} + +// ASCIISub is the ASCII substitute character, as recommended by +// https://unicode.org/reports/tr36/#Text_Comparison +const ASCIISub = '\x1a' + +// Nop is the nop encoding. Its transformed bytes are the same as the source +// bytes; it does not replace invalid UTF-8 sequences. +var Nop Encoding = nop{} + +type nop struct{} + +func (nop) NewDecoder() *Decoder { + return &Decoder{Transformer: transform.Nop} +} +func (nop) NewEncoder() *Encoder { + return &Encoder{Transformer: transform.Nop} +} + +// Replacement is the replacement encoding. Decoding from the replacement +// encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to +// the replacement encoding yields the same as the source bytes except that +// invalid UTF-8 is converted to '\uFFFD'. +// +// It is defined at http://encoding.spec.whatwg.org/#replacement +var Replacement Encoding = replacement{} + +type replacement struct{} + +func (replacement) NewDecoder() *Decoder { + return &Decoder{Transformer: replacementDecoder{}} +} + +func (replacement) NewEncoder() *Encoder { + return &Encoder{Transformer: replacementEncoder{}} +} + +func (replacement) ID() (mib identifier.MIB, other string) { + return identifier.Replacement, "" +} + +type replacementDecoder struct{ transform.NopResetter } + +func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if len(dst) < 3 { + return 0, 0, transform.ErrShortDst + } + if atEOF { + const fffd = "\ufffd" + dst[0] = fffd[0] + dst[1] = fffd[1] + dst[2] = fffd[2] + nDst = 3 + } + return nDst, len(src), nil +} + +type replacementEncoder struct{ transform.NopResetter } + +func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + r = '\ufffd' + } + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + return nDst, nSrc, err +} + +// HTMLEscapeUnsupported wraps encoders to replace source runes outside the +// repertoire of the destination encoding with HTML escape sequences. +// +// This wrapper exists to comply to URL and HTML forms requiring a +// non-terminating legacy encoder. The produced sequences may lead to data +// loss as they are indistinguishable from legitimate input. To avoid this +// issue, use UTF-8 encodings whenever possible. +func HTMLEscapeUnsupported(e *Encoder) *Encoder { + return &Encoder{Transformer: &errorHandler{e, errorToHTML}} +} + +// ReplaceUnsupported wraps encoders to replace source runes outside the +// repertoire of the destination encoding with an encoding-specific +// replacement. +// +// This wrapper is only provided for backwards compatibility and legacy +// handling. Its use is strongly discouraged. Use UTF-8 whenever possible. +func ReplaceUnsupported(e *Encoder) *Encoder { + return &Encoder{Transformer: &errorHandler{e, errorToReplacement}} +} + +type errorHandler struct { + *Encoder + handler func(dst []byte, r rune, err repertoireError) (n int, ok bool) +} + +// TODO: consider making this error public in some form. +type repertoireError interface { + Replacement() byte +} + +func (h errorHandler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + nDst, nSrc, err = h.Transformer.Transform(dst, src, atEOF) + for err != nil { + rerr, ok := err.(repertoireError) + if !ok { + return nDst, nSrc, err + } + r, sz := utf8.DecodeRune(src[nSrc:]) + n, ok := h.handler(dst[nDst:], r, rerr) + if !ok { + return nDst, nSrc, transform.ErrShortDst + } + err = nil + nDst += n + if nSrc += sz; nSrc < len(src) { + var dn, sn int + dn, sn, err = h.Transformer.Transform(dst[nDst:], src[nSrc:], atEOF) + nDst += dn + nSrc += sn + } + } + return nDst, nSrc, err +} + +func errorToHTML(dst []byte, r rune, err repertoireError) (n int, ok bool) { + buf := [8]byte{} + b := strconv.AppendUint(buf[:0], uint64(r), 10) + if n = len(b) + len("&#;"); n >= len(dst) { + return 0, false + } + dst[0] = '&' + dst[1] = '#' + dst[copy(dst[2:], b)+2] = ';' + return n, true +} + +func errorToReplacement(dst []byte, r rune, err repertoireError) (n int, ok bool) { + if len(dst) == 0 { + return 0, false + } + dst[0] = err.Replacement() + return 1, true +} + +// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8. +var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8") + +// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first +// input byte that is not valid UTF-8. +var UTF8Validator transform.Transformer = utf8Validator{} + +type utf8Validator struct{ transform.NopResetter } + +func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := len(src) + if n > len(dst) { + n = len(dst) + } + for i := 0; i < n; { + if c := src[i]; c < utf8.RuneSelf { + dst[i] = c + i++ + continue + } + _, size := utf8.DecodeRune(src[i:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + err = ErrInvalidUTF8 + if !atEOF && !utf8.FullRune(src[i:]) { + err = transform.ErrShortSrc + } + return i, i, err + } + if i+size > len(dst) { + return i, i, transform.ErrShortDst + } + for ; size > 0; size-- { + dst[i] = src[i] + i++ + } + } + if len(src) > len(dst) { + err = transform.ErrShortDst + } + return n, n, err +} diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go new file mode 100644 index 00000000..5c9b85c2 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go @@ -0,0 +1,81 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run gen.go + +// Package identifier defines the contract between implementations of Encoding +// and Index by defining identifiers that uniquely identify standardized coded +// character sets (CCS) and character encoding schemes (CES), which we will +// together refer to as encodings, for which Encoding implementations provide +// converters to and from UTF-8. This package is typically only of concern to +// implementers of Indexes and Encodings. +// +// One part of the identifier is the MIB code, which is defined by IANA and +// uniquely identifies a CCS or CES. Each code is associated with data that +// references authorities, official documentation as well as aliases and MIME +// names. +// +// Not all CESs are covered by the IANA registry. The "other" string that is +// returned by ID can be used to identify other character sets or versions of +// existing ones. +// +// It is recommended that each package that provides a set of Encodings provide +// the All and Common variables to reference all supported encodings and +// commonly used subset. This allows Index implementations to include all +// available encodings without explicitly referencing or knowing about them. +package identifier + +// Note: this package is internal, but could be made public if there is a need +// for writing third-party Indexes and Encodings. + +// References: +// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt +// - http://www.iana.org/assignments/character-sets/character-sets.xhtml +// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib +// - http://www.ietf.org/rfc/rfc2978.txt +// - https://www.unicode.org/reports/tr22/ +// - http://www.w3.org/TR/encoding/ +// - https://encoding.spec.whatwg.org/ +// - https://encoding.spec.whatwg.org/encodings.json +// - https://tools.ietf.org/html/rfc6657#section-5 + +// Interface can be implemented by Encodings to define the CCS or CES for which +// it implements conversions. +type Interface interface { + // ID returns an encoding identifier. Exactly one of the mib and other + // values should be non-zero. + // + // In the usual case it is only necessary to indicate the MIB code. The + // other string can be used to specify encodings for which there is no MIB, + // such as "x-mac-dingbat". + // + // The other string may only contain the characters a-z, A-Z, 0-9, - and _. + ID() (mib MIB, other string) + + // NOTE: the restrictions on the encoding are to allow extending the syntax + // with additional information such as versions, vendors and other variants. +} + +// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds +// some identifiers for some encodings that are not covered by the IANA +// standard. +// +// See http://www.iana.org/assignments/ianacharset-mib. +type MIB uint16 + +// These additional MIB types are not defined in IANA. They are added because +// they are common and defined within the text repo. +const ( + // Unofficial marks the start of encodings not registered by IANA. + Unofficial MIB = 10000 + iota + + // Replacement is the WhatWG replacement encoding. + Replacement + + // XUserDefined is the code for x-user-defined. + XUserDefined + + // MacintoshCyrillic is the code for x-mac-cyrillic. + MacintoshCyrillic +) diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go new file mode 100644 index 00000000..351fb86e --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go @@ -0,0 +1,1627 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package identifier + +const ( + // ASCII is the MIB identifier with IANA name US-ASCII (MIME: US-ASCII). + // + // ANSI X3.4-1986 + // Reference: RFC2046 + ASCII MIB = 3 + + // ISOLatin1 is the MIB identifier with IANA name ISO_8859-1:1987 (MIME: ISO-8859-1). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin1 MIB = 4 + + // ISOLatin2 is the MIB identifier with IANA name ISO_8859-2:1987 (MIME: ISO-8859-2). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin2 MIB = 5 + + // ISOLatin3 is the MIB identifier with IANA name ISO_8859-3:1988 (MIME: ISO-8859-3). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin3 MIB = 6 + + // ISOLatin4 is the MIB identifier with IANA name ISO_8859-4:1988 (MIME: ISO-8859-4). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin4 MIB = 7 + + // ISOLatinCyrillic is the MIB identifier with IANA name ISO_8859-5:1988 (MIME: ISO-8859-5). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinCyrillic MIB = 8 + + // ISOLatinArabic is the MIB identifier with IANA name ISO_8859-6:1987 (MIME: ISO-8859-6). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinArabic MIB = 9 + + // ISOLatinGreek is the MIB identifier with IANA name ISO_8859-7:1987 (MIME: ISO-8859-7). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1947 + // Reference: RFC1345 + ISOLatinGreek MIB = 10 + + // ISOLatinHebrew is the MIB identifier with IANA name ISO_8859-8:1988 (MIME: ISO-8859-8). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinHebrew MIB = 11 + + // ISOLatin5 is the MIB identifier with IANA name ISO_8859-9:1989 (MIME: ISO-8859-9). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin5 MIB = 12 + + // ISOLatin6 is the MIB identifier with IANA name ISO-8859-10 (MIME: ISO-8859-10). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin6 MIB = 13 + + // ISOTextComm is the MIB identifier with IANA name ISO_6937-2-add. + // + // ISO-IR: International Register of Escape Sequences and ISO 6937-2:1983 + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOTextComm MIB = 14 + + // HalfWidthKatakana is the MIB identifier with IANA name JIS_X0201. + // + // JIS X 0201-1976. One byte only, this is equivalent to + // JIS/Roman (similar to ASCII) plus eight-bit half-width + // Katakana + // Reference: RFC1345 + HalfWidthKatakana MIB = 15 + + // JISEncoding is the MIB identifier with IANA name JIS_Encoding. + // + // JIS X 0202-1991. Uses ISO 2022 escape sequences to + // shift code sets as documented in JIS X 0202-1991. + JISEncoding MIB = 16 + + // ShiftJIS is the MIB identifier with IANA name Shift_JIS (MIME: Shift_JIS). + // + // This charset is an extension of csHalfWidthKatakana by + // adding graphic characters in JIS X 0208. The CCS's are + // JIS X0201:1997 and JIS X0208:1997. The + // complete definition is shown in Appendix 1 of JIS + // X0208:1997. + // This charset can be used for the top-level media type "text". + ShiftJIS MIB = 17 + + // EUCPkdFmtJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Packed_Format_for_Japanese (MIME: EUC-JP). + // + // Standardized by OSF, UNIX International, and UNIX Systems + // Laboratories Pacific. Uses ISO 2022 rules to select + // code set 0: US-ASCII (a single 7-bit byte set) + // code set 1: JIS X0208-1990 (a double 8-bit byte set) + // restricted to A0-FF in both bytes + // code set 2: Half Width Katakana (a single 7-bit byte set) + // requiring SS2 as the character prefix + // code set 3: JIS X0212-1990 (a double 7-bit byte set) + // restricted to A0-FF in both bytes + // requiring SS3 as the character prefix + EUCPkdFmtJapanese MIB = 18 + + // EUCFixWidJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Fixed_Width_for_Japanese. + // + // Used in Japan. Each character is 2 octets. + // code set 0: US-ASCII (a single 7-bit byte set) + // 1st byte = 00 + // 2nd byte = 20-7E + // code set 1: JIS X0208-1990 (a double 7-bit byte set) + // restricted to A0-FF in both bytes + // code set 2: Half Width Katakana (a single 7-bit byte set) + // 1st byte = 00 + // 2nd byte = A0-FF + // code set 3: JIS X0212-1990 (a double 7-bit byte set) + // restricted to A0-FF in + // the first byte + // and 21-7E in the second byte + EUCFixWidJapanese MIB = 19 + + // ISO4UnitedKingdom is the MIB identifier with IANA name BS_4730. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO4UnitedKingdom MIB = 20 + + // ISO11SwedishForNames is the MIB identifier with IANA name SEN_850200_C. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO11SwedishForNames MIB = 21 + + // ISO15Italian is the MIB identifier with IANA name IT. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO15Italian MIB = 22 + + // ISO17Spanish is the MIB identifier with IANA name ES. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO17Spanish MIB = 23 + + // ISO21German is the MIB identifier with IANA name DIN_66003. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO21German MIB = 24 + + // ISO60Norwegian1 is the MIB identifier with IANA name NS_4551-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO60Norwegian1 MIB = 25 + + // ISO69French is the MIB identifier with IANA name NF_Z_62-010. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO69French MIB = 26 + + // ISO10646UTF1 is the MIB identifier with IANA name ISO-10646-UTF-1. + // + // Universal Transfer Format (1), this is the multibyte + // encoding, that subsets ASCII-7. It does not have byte + // ordering issues. + ISO10646UTF1 MIB = 27 + + // ISO646basic1983 is the MIB identifier with IANA name ISO_646.basic:1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO646basic1983 MIB = 28 + + // INVARIANT is the MIB identifier with IANA name INVARIANT. + // + // Reference: RFC1345 + INVARIANT MIB = 29 + + // ISO2IntlRefVersion is the MIB identifier with IANA name ISO_646.irv:1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO2IntlRefVersion MIB = 30 + + // NATSSEFI is the MIB identifier with IANA name NATS-SEFI. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSSEFI MIB = 31 + + // NATSSEFIADD is the MIB identifier with IANA name NATS-SEFI-ADD. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSSEFIADD MIB = 32 + + // NATSDANO is the MIB identifier with IANA name NATS-DANO. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSDANO MIB = 33 + + // NATSDANOADD is the MIB identifier with IANA name NATS-DANO-ADD. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSDANOADD MIB = 34 + + // ISO10Swedish is the MIB identifier with IANA name SEN_850200_B. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO10Swedish MIB = 35 + + // KSC56011987 is the MIB identifier with IANA name KS_C_5601-1987. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + KSC56011987 MIB = 36 + + // ISO2022KR is the MIB identifier with IANA name ISO-2022-KR (MIME: ISO-2022-KR). + // + // rfc1557 (see also KS_C_5601-1987) + // Reference: RFC1557 + ISO2022KR MIB = 37 + + // EUCKR is the MIB identifier with IANA name EUC-KR (MIME: EUC-KR). + // + // rfc1557 (see also KS_C_5861-1992) + // Reference: RFC1557 + EUCKR MIB = 38 + + // ISO2022JP is the MIB identifier with IANA name ISO-2022-JP (MIME: ISO-2022-JP). + // + // rfc1468 (see also rfc2237 ) + // Reference: RFC1468 + ISO2022JP MIB = 39 + + // ISO2022JP2 is the MIB identifier with IANA name ISO-2022-JP-2 (MIME: ISO-2022-JP-2). + // + // rfc1554 + // Reference: RFC1554 + ISO2022JP2 MIB = 40 + + // ISO13JISC6220jp is the MIB identifier with IANA name JIS_C6220-1969-jp. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO13JISC6220jp MIB = 41 + + // ISO14JISC6220ro is the MIB identifier with IANA name JIS_C6220-1969-ro. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO14JISC6220ro MIB = 42 + + // ISO16Portuguese is the MIB identifier with IANA name PT. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO16Portuguese MIB = 43 + + // ISO18Greek7Old is the MIB identifier with IANA name greek7-old. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO18Greek7Old MIB = 44 + + // ISO19LatinGreek is the MIB identifier with IANA name latin-greek. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO19LatinGreek MIB = 45 + + // ISO25French is the MIB identifier with IANA name NF_Z_62-010_(1973). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO25French MIB = 46 + + // ISO27LatinGreek1 is the MIB identifier with IANA name Latin-greek-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO27LatinGreek1 MIB = 47 + + // ISO5427Cyrillic is the MIB identifier with IANA name ISO_5427. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO5427Cyrillic MIB = 48 + + // ISO42JISC62261978 is the MIB identifier with IANA name JIS_C6226-1978. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO42JISC62261978 MIB = 49 + + // ISO47BSViewdata is the MIB identifier with IANA name BS_viewdata. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO47BSViewdata MIB = 50 + + // ISO49INIS is the MIB identifier with IANA name INIS. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO49INIS MIB = 51 + + // ISO50INIS8 is the MIB identifier with IANA name INIS-8. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO50INIS8 MIB = 52 + + // ISO51INISCyrillic is the MIB identifier with IANA name INIS-cyrillic. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO51INISCyrillic MIB = 53 + + // ISO54271981 is the MIB identifier with IANA name ISO_5427:1981. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO54271981 MIB = 54 + + // ISO5428Greek is the MIB identifier with IANA name ISO_5428:1980. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO5428Greek MIB = 55 + + // ISO57GB1988 is the MIB identifier with IANA name GB_1988-80. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO57GB1988 MIB = 56 + + // ISO58GB231280 is the MIB identifier with IANA name GB_2312-80. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO58GB231280 MIB = 57 + + // ISO61Norwegian2 is the MIB identifier with IANA name NS_4551-2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO61Norwegian2 MIB = 58 + + // ISO70VideotexSupp1 is the MIB identifier with IANA name videotex-suppl. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO70VideotexSupp1 MIB = 59 + + // ISO84Portuguese2 is the MIB identifier with IANA name PT2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO84Portuguese2 MIB = 60 + + // ISO85Spanish2 is the MIB identifier with IANA name ES2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO85Spanish2 MIB = 61 + + // ISO86Hungarian is the MIB identifier with IANA name MSZ_7795.3. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO86Hungarian MIB = 62 + + // ISO87JISX0208 is the MIB identifier with IANA name JIS_C6226-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO87JISX0208 MIB = 63 + + // ISO88Greek7 is the MIB identifier with IANA name greek7. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO88Greek7 MIB = 64 + + // ISO89ASMO449 is the MIB identifier with IANA name ASMO_449. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO89ASMO449 MIB = 65 + + // ISO90 is the MIB identifier with IANA name iso-ir-90. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO90 MIB = 66 + + // ISO91JISC62291984a is the MIB identifier with IANA name JIS_C6229-1984-a. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO91JISC62291984a MIB = 67 + + // ISO92JISC62991984b is the MIB identifier with IANA name JIS_C6229-1984-b. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO92JISC62991984b MIB = 68 + + // ISO93JIS62291984badd is the MIB identifier with IANA name JIS_C6229-1984-b-add. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO93JIS62291984badd MIB = 69 + + // ISO94JIS62291984hand is the MIB identifier with IANA name JIS_C6229-1984-hand. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO94JIS62291984hand MIB = 70 + + // ISO95JIS62291984handadd is the MIB identifier with IANA name JIS_C6229-1984-hand-add. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO95JIS62291984handadd MIB = 71 + + // ISO96JISC62291984kana is the MIB identifier with IANA name JIS_C6229-1984-kana. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO96JISC62291984kana MIB = 72 + + // ISO2033 is the MIB identifier with IANA name ISO_2033-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO2033 MIB = 73 + + // ISO99NAPLPS is the MIB identifier with IANA name ANSI_X3.110-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO99NAPLPS MIB = 74 + + // ISO102T617bit is the MIB identifier with IANA name T.61-7bit. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO102T617bit MIB = 75 + + // ISO103T618bit is the MIB identifier with IANA name T.61-8bit. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO103T618bit MIB = 76 + + // ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic. + // + // ISO registry + ISO111ECMACyrillic MIB = 77 + + // ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO121Canadian1 MIB = 78 + + // ISO122Canadian2 is the MIB identifier with IANA name CSA_Z243.4-1985-2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO122Canadian2 MIB = 79 + + // ISO123CSAZ24341985gr is the MIB identifier with IANA name CSA_Z243.4-1985-gr. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO123CSAZ24341985gr MIB = 80 + + // ISO88596E is the MIB identifier with IANA name ISO_8859-6-E (MIME: ISO-8859-6-E). + // + // rfc1556 + // Reference: RFC1556 + ISO88596E MIB = 81 + + // ISO88596I is the MIB identifier with IANA name ISO_8859-6-I (MIME: ISO-8859-6-I). + // + // rfc1556 + // Reference: RFC1556 + ISO88596I MIB = 82 + + // ISO128T101G2 is the MIB identifier with IANA name T.101-G2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO128T101G2 MIB = 83 + + // ISO88598E is the MIB identifier with IANA name ISO_8859-8-E (MIME: ISO-8859-8-E). + // + // rfc1556 + // Reference: RFC1556 + ISO88598E MIB = 84 + + // ISO88598I is the MIB identifier with IANA name ISO_8859-8-I (MIME: ISO-8859-8-I). + // + // rfc1556 + // Reference: RFC1556 + ISO88598I MIB = 85 + + // ISO139CSN369103 is the MIB identifier with IANA name CSN_369103. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO139CSN369103 MIB = 86 + + // ISO141JUSIB1002 is the MIB identifier with IANA name JUS_I.B1.002. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO141JUSIB1002 MIB = 87 + + // ISO143IECP271 is the MIB identifier with IANA name IEC_P27-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO143IECP271 MIB = 88 + + // ISO146Serbian is the MIB identifier with IANA name JUS_I.B1.003-serb. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO146Serbian MIB = 89 + + // ISO147Macedonian is the MIB identifier with IANA name JUS_I.B1.003-mac. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO147Macedonian MIB = 90 + + // ISO150GreekCCITT is the MIB identifier with IANA name greek-ccitt. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO150GreekCCITT MIB = 91 + + // ISO151Cuba is the MIB identifier with IANA name NC_NC00-10:81. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO151Cuba MIB = 92 + + // ISO6937Add is the MIB identifier with IANA name ISO_6937-2-25. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO6937Add MIB = 93 + + // ISO153GOST1976874 is the MIB identifier with IANA name GOST_19768-74. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO153GOST1976874 MIB = 94 + + // ISO8859Supp is the MIB identifier with IANA name ISO_8859-supp. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO8859Supp MIB = 95 + + // ISO10367Box is the MIB identifier with IANA name ISO_10367-box. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO10367Box MIB = 96 + + // ISO158Lap is the MIB identifier with IANA name latin-lap. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO158Lap MIB = 97 + + // ISO159JISX02121990 is the MIB identifier with IANA name JIS_X0212-1990. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO159JISX02121990 MIB = 98 + + // ISO646Danish is the MIB identifier with IANA name DS_2089. + // + // Danish Standard, DS 2089, February 1974 + // Reference: RFC1345 + ISO646Danish MIB = 99 + + // USDK is the MIB identifier with IANA name us-dk. + // + // Reference: RFC1345 + USDK MIB = 100 + + // DKUS is the MIB identifier with IANA name dk-us. + // + // Reference: RFC1345 + DKUS MIB = 101 + + // KSC5636 is the MIB identifier with IANA name KSC5636. + // + // Reference: RFC1345 + KSC5636 MIB = 102 + + // Unicode11UTF7 is the MIB identifier with IANA name UNICODE-1-1-UTF-7. + // + // rfc1642 + // Reference: RFC1642 + Unicode11UTF7 MIB = 103 + + // ISO2022CN is the MIB identifier with IANA name ISO-2022-CN. + // + // rfc1922 + // Reference: RFC1922 + ISO2022CN MIB = 104 + + // ISO2022CNEXT is the MIB identifier with IANA name ISO-2022-CN-EXT. + // + // rfc1922 + // Reference: RFC1922 + ISO2022CNEXT MIB = 105 + + // UTF8 is the MIB identifier with IANA name UTF-8. + // + // rfc3629 + // Reference: RFC3629 + UTF8 MIB = 106 + + // ISO885913 is the MIB identifier with IANA name ISO-8859-13. + // + // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-13 https://www.iana.org/assignments/charset-reg/ISO-8859-13 + ISO885913 MIB = 109 + + // ISO885914 is the MIB identifier with IANA name ISO-8859-14. + // + // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-14 + ISO885914 MIB = 110 + + // ISO885915 is the MIB identifier with IANA name ISO-8859-15. + // + // ISO + // Please see: https://www.iana.org/assignments/charset-reg/ISO-8859-15 + ISO885915 MIB = 111 + + // ISO885916 is the MIB identifier with IANA name ISO-8859-16. + // + // ISO + ISO885916 MIB = 112 + + // GBK is the MIB identifier with IANA name GBK. + // + // Chinese IT Standardization Technical Committee + // Please see: https://www.iana.org/assignments/charset-reg/GBK + GBK MIB = 113 + + // GB18030 is the MIB identifier with IANA name GB18030. + // + // Chinese IT Standardization Technical Committee + // Please see: https://www.iana.org/assignments/charset-reg/GB18030 + GB18030 MIB = 114 + + // OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15 + OSDEBCDICDF0415 MIB = 115 + + // OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV + OSDEBCDICDF03IRV MIB = 116 + + // OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1 + OSDEBCDICDF041 MIB = 117 + + // ISO115481 is the MIB identifier with IANA name ISO-11548-1. + // + // See https://www.iana.org/assignments/charset-reg/ISO-11548-1 + ISO115481 MIB = 118 + + // KZ1048 is the MIB identifier with IANA name KZ-1048. + // + // See https://www.iana.org/assignments/charset-reg/KZ-1048 + KZ1048 MIB = 119 + + // Unicode is the MIB identifier with IANA name ISO-10646-UCS-2. + // + // the 2-octet Basic Multilingual Plane, aka Unicode + // this needs to specify network byte order: the standard + // does not specify (it is a 16-bit integer space) + Unicode MIB = 1000 + + // UCS4 is the MIB identifier with IANA name ISO-10646-UCS-4. + // + // the full code space. (same comment about byte order, + // these are 31-bit numbers. + UCS4 MIB = 1001 + + // UnicodeASCII is the MIB identifier with IANA name ISO-10646-UCS-Basic. + // + // ASCII subset of Unicode. Basic Latin = collection 1 + // See ISO 10646, Appendix A + UnicodeASCII MIB = 1002 + + // UnicodeLatin1 is the MIB identifier with IANA name ISO-10646-Unicode-Latin1. + // + // ISO Latin-1 subset of Unicode. Basic Latin and Latin-1 + // Supplement = collections 1 and 2. See ISO 10646, + // Appendix A. See rfc1815 . + UnicodeLatin1 MIB = 1003 + + // UnicodeJapanese is the MIB identifier with IANA name ISO-10646-J-1. + // + // ISO 10646 Japanese, see rfc1815 . + UnicodeJapanese MIB = 1004 + + // UnicodeIBM1261 is the MIB identifier with IANA name ISO-Unicode-IBM-1261. + // + // IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261 + UnicodeIBM1261 MIB = 1005 + + // UnicodeIBM1268 is the MIB identifier with IANA name ISO-Unicode-IBM-1268. + // + // IBM Latin-4 Extended Presentation Set, GCSGID: 1268 + UnicodeIBM1268 MIB = 1006 + + // UnicodeIBM1276 is the MIB identifier with IANA name ISO-Unicode-IBM-1276. + // + // IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276 + UnicodeIBM1276 MIB = 1007 + + // UnicodeIBM1264 is the MIB identifier with IANA name ISO-Unicode-IBM-1264. + // + // IBM Arabic Presentation Set, GCSGID: 1264 + UnicodeIBM1264 MIB = 1008 + + // UnicodeIBM1265 is the MIB identifier with IANA name ISO-Unicode-IBM-1265. + // + // IBM Hebrew Presentation Set, GCSGID: 1265 + UnicodeIBM1265 MIB = 1009 + + // Unicode11 is the MIB identifier with IANA name UNICODE-1-1. + // + // rfc1641 + // Reference: RFC1641 + Unicode11 MIB = 1010 + + // SCSU is the MIB identifier with IANA name SCSU. + // + // SCSU See https://www.iana.org/assignments/charset-reg/SCSU + SCSU MIB = 1011 + + // UTF7 is the MIB identifier with IANA name UTF-7. + // + // rfc2152 + // Reference: RFC2152 + UTF7 MIB = 1012 + + // UTF16BE is the MIB identifier with IANA name UTF-16BE. + // + // rfc2781 + // Reference: RFC2781 + UTF16BE MIB = 1013 + + // UTF16LE is the MIB identifier with IANA name UTF-16LE. + // + // rfc2781 + // Reference: RFC2781 + UTF16LE MIB = 1014 + + // UTF16 is the MIB identifier with IANA name UTF-16. + // + // rfc2781 + // Reference: RFC2781 + UTF16 MIB = 1015 + + // CESU8 is the MIB identifier with IANA name CESU-8. + // + // https://www.unicode.org/reports/tr26 + CESU8 MIB = 1016 + + // UTF32 is the MIB identifier with IANA name UTF-32. + // + // https://www.unicode.org/reports/tr19/ + UTF32 MIB = 1017 + + // UTF32BE is the MIB identifier with IANA name UTF-32BE. + // + // https://www.unicode.org/reports/tr19/ + UTF32BE MIB = 1018 + + // UTF32LE is the MIB identifier with IANA name UTF-32LE. + // + // https://www.unicode.org/reports/tr19/ + UTF32LE MIB = 1019 + + // BOCU1 is the MIB identifier with IANA name BOCU-1. + // + // https://www.unicode.org/notes/tn6/ + BOCU1 MIB = 1020 + + // UTF7IMAP is the MIB identifier with IANA name UTF-7-IMAP. + // + // Note: This charset is used to encode Unicode in IMAP mailbox names; + // see section 5.1.3 of rfc3501 . It should never be used + // outside this context. A name has been assigned so that charset processing + // implementations can refer to it in a consistent way. + UTF7IMAP MIB = 1021 + + // Windows30Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.0-Latin-1. + // + // Extended ISO 8859-1 Latin-1 for Windows 3.0. + // PCL Symbol Set id: 9U + Windows30Latin1 MIB = 2000 + + // Windows31Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.1-Latin-1. + // + // Extended ISO 8859-1 Latin-1 for Windows 3.1. + // PCL Symbol Set id: 19U + Windows31Latin1 MIB = 2001 + + // Windows31Latin2 is the MIB identifier with IANA name ISO-8859-2-Windows-Latin-2. + // + // Extended ISO 8859-2. Latin-2 for Windows 3.1. + // PCL Symbol Set id: 9E + Windows31Latin2 MIB = 2002 + + // Windows31Latin5 is the MIB identifier with IANA name ISO-8859-9-Windows-Latin-5. + // + // Extended ISO 8859-9. Latin-5 for Windows 3.1 + // PCL Symbol Set id: 5T + Windows31Latin5 MIB = 2003 + + // HPRoman8 is the MIB identifier with IANA name hp-roman8. + // + // LaserJet IIP Printer User's Manual, + // HP part no 33471-90901, Hewlet-Packard, June 1989. + // Reference: RFC1345 + HPRoman8 MIB = 2004 + + // AdobeStandardEncoding is the MIB identifier with IANA name Adobe-Standard-Encoding. + // + // PostScript Language Reference Manual + // PCL Symbol Set id: 10J + AdobeStandardEncoding MIB = 2005 + + // VenturaUS is the MIB identifier with IANA name Ventura-US. + // + // Ventura US. ASCII plus characters typically used in + // publishing, like pilcrow, copyright, registered, trade mark, + // section, dagger, and double dagger in the range A0 (hex) + // to FF (hex). + // PCL Symbol Set id: 14J + VenturaUS MIB = 2006 + + // VenturaInternational is the MIB identifier with IANA name Ventura-International. + // + // Ventura International. ASCII plus coded characters similar + // to Roman8. + // PCL Symbol Set id: 13J + VenturaInternational MIB = 2007 + + // DECMCS is the MIB identifier with IANA name DEC-MCS. + // + // VAX/VMS User's Manual, + // Order Number: AI-Y517A-TE, April 1986. + // Reference: RFC1345 + DECMCS MIB = 2008 + + // PC850Multilingual is the MIB identifier with IANA name IBM850. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC850Multilingual MIB = 2009 + + // PC8DanishNorwegian is the MIB identifier with IANA name PC8-Danish-Norwegian. + // + // PC Danish Norwegian + // 8-bit PC set for Danish Norwegian + // PCL Symbol Set id: 11U + PC8DanishNorwegian MIB = 2012 + + // PC862LatinHebrew is the MIB identifier with IANA name IBM862. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC862LatinHebrew MIB = 2013 + + // PC8Turkish is the MIB identifier with IANA name PC8-Turkish. + // + // PC Latin Turkish. PCL Symbol Set id: 9T + PC8Turkish MIB = 2014 + + // IBMSymbols is the MIB identifier with IANA name IBM-Symbols. + // + // Presentation Set, CPGID: 259 + IBMSymbols MIB = 2015 + + // IBMThai is the MIB identifier with IANA name IBM-Thai. + // + // Presentation Set, CPGID: 838 + IBMThai MIB = 2016 + + // HPLegal is the MIB identifier with IANA name HP-Legal. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 1U + HPLegal MIB = 2017 + + // HPPiFont is the MIB identifier with IANA name HP-Pi-font. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 15U + HPPiFont MIB = 2018 + + // HPMath8 is the MIB identifier with IANA name HP-Math8. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 8M + HPMath8 MIB = 2019 + + // HPPSMath is the MIB identifier with IANA name Adobe-Symbol-Encoding. + // + // PostScript Language Reference Manual + // PCL Symbol Set id: 5M + HPPSMath MIB = 2020 + + // HPDesktop is the MIB identifier with IANA name HP-DeskTop. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 7J + HPDesktop MIB = 2021 + + // VenturaMath is the MIB identifier with IANA name Ventura-Math. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 6M + VenturaMath MIB = 2022 + + // MicrosoftPublishing is the MIB identifier with IANA name Microsoft-Publishing. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 6J + MicrosoftPublishing MIB = 2023 + + // Windows31J is the MIB identifier with IANA name Windows-31J. + // + // Windows Japanese. A further extension of Shift_JIS + // to include NEC special characters (Row 13), NEC + // selection of IBM extensions (Rows 89 to 92), and IBM + // extensions (Rows 115 to 119). The CCS's are + // JIS X0201:1997, JIS X0208:1997, and these extensions. + // This charset can be used for the top-level media type "text", + // but it is of limited or specialized use (see rfc2278 ). + // PCL Symbol Set id: 19K + Windows31J MIB = 2024 + + // GB2312 is the MIB identifier with IANA name GB2312 (MIME: GB2312). + // + // Chinese for People's Republic of China (PRC) mixed one byte, + // two byte set: + // 20-7E = one byte ASCII + // A1-FE = two byte PRC Kanji + // See GB 2312-80 + // PCL Symbol Set Id: 18C + GB2312 MIB = 2025 + + // Big5 is the MIB identifier with IANA name Big5 (MIME: Big5). + // + // Chinese for Taiwan Multi-byte set. + // PCL Symbol Set Id: 18T + Big5 MIB = 2026 + + // Macintosh is the MIB identifier with IANA name macintosh. + // + // The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991 + // Reference: RFC1345 + Macintosh MIB = 2027 + + // IBM037 is the MIB identifier with IANA name IBM037. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM037 MIB = 2028 + + // IBM038 is the MIB identifier with IANA name IBM038. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM038 MIB = 2029 + + // IBM273 is the MIB identifier with IANA name IBM273. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM273 MIB = 2030 + + // IBM274 is the MIB identifier with IANA name IBM274. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM274 MIB = 2031 + + // IBM275 is the MIB identifier with IANA name IBM275. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM275 MIB = 2032 + + // IBM277 is the MIB identifier with IANA name IBM277. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM277 MIB = 2033 + + // IBM278 is the MIB identifier with IANA name IBM278. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM278 MIB = 2034 + + // IBM280 is the MIB identifier with IANA name IBM280. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM280 MIB = 2035 + + // IBM281 is the MIB identifier with IANA name IBM281. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM281 MIB = 2036 + + // IBM284 is the MIB identifier with IANA name IBM284. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM284 MIB = 2037 + + // IBM285 is the MIB identifier with IANA name IBM285. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM285 MIB = 2038 + + // IBM290 is the MIB identifier with IANA name IBM290. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM290 MIB = 2039 + + // IBM297 is the MIB identifier with IANA name IBM297. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM297 MIB = 2040 + + // IBM420 is the MIB identifier with IANA name IBM420. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990, + // IBM NLS RM p 11-11 + // Reference: RFC1345 + IBM420 MIB = 2041 + + // IBM423 is the MIB identifier with IANA name IBM423. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM423 MIB = 2042 + + // IBM424 is the MIB identifier with IANA name IBM424. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM424 MIB = 2043 + + // PC8CodePage437 is the MIB identifier with IANA name IBM437. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC8CodePage437 MIB = 2011 + + // IBM500 is the MIB identifier with IANA name IBM500. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM500 MIB = 2044 + + // IBM851 is the MIB identifier with IANA name IBM851. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM851 MIB = 2045 + + // PCp852 is the MIB identifier with IANA name IBM852. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PCp852 MIB = 2010 + + // IBM855 is the MIB identifier with IANA name IBM855. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM855 MIB = 2046 + + // IBM857 is the MIB identifier with IANA name IBM857. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM857 MIB = 2047 + + // IBM860 is the MIB identifier with IANA name IBM860. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM860 MIB = 2048 + + // IBM861 is the MIB identifier with IANA name IBM861. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM861 MIB = 2049 + + // IBM863 is the MIB identifier with IANA name IBM863. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM863 MIB = 2050 + + // IBM864 is the MIB identifier with IANA name IBM864. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM864 MIB = 2051 + + // IBM865 is the MIB identifier with IANA name IBM865. + // + // IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987) + // Reference: RFC1345 + IBM865 MIB = 2052 + + // IBM868 is the MIB identifier with IANA name IBM868. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM868 MIB = 2053 + + // IBM869 is the MIB identifier with IANA name IBM869. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM869 MIB = 2054 + + // IBM870 is the MIB identifier with IANA name IBM870. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM870 MIB = 2055 + + // IBM871 is the MIB identifier with IANA name IBM871. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM871 MIB = 2056 + + // IBM880 is the MIB identifier with IANA name IBM880. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM880 MIB = 2057 + + // IBM891 is the MIB identifier with IANA name IBM891. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM891 MIB = 2058 + + // IBM903 is the MIB identifier with IANA name IBM903. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM903 MIB = 2059 + + // IBBM904 is the MIB identifier with IANA name IBM904. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBBM904 MIB = 2060 + + // IBM905 is the MIB identifier with IANA name IBM905. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM905 MIB = 2061 + + // IBM918 is the MIB identifier with IANA name IBM918. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM918 MIB = 2062 + + // IBM1026 is the MIB identifier with IANA name IBM1026. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM1026 MIB = 2063 + + // IBMEBCDICATDE is the MIB identifier with IANA name EBCDIC-AT-DE. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + IBMEBCDICATDE MIB = 2064 + + // EBCDICATDEA is the MIB identifier with IANA name EBCDIC-AT-DE-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICATDEA MIB = 2065 + + // EBCDICCAFR is the MIB identifier with IANA name EBCDIC-CA-FR. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICCAFR MIB = 2066 + + // EBCDICDKNO is the MIB identifier with IANA name EBCDIC-DK-NO. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICDKNO MIB = 2067 + + // EBCDICDKNOA is the MIB identifier with IANA name EBCDIC-DK-NO-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICDKNOA MIB = 2068 + + // EBCDICFISE is the MIB identifier with IANA name EBCDIC-FI-SE. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFISE MIB = 2069 + + // EBCDICFISEA is the MIB identifier with IANA name EBCDIC-FI-SE-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFISEA MIB = 2070 + + // EBCDICFR is the MIB identifier with IANA name EBCDIC-FR. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFR MIB = 2071 + + // EBCDICIT is the MIB identifier with IANA name EBCDIC-IT. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICIT MIB = 2072 + + // EBCDICPT is the MIB identifier with IANA name EBCDIC-PT. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICPT MIB = 2073 + + // EBCDICES is the MIB identifier with IANA name EBCDIC-ES. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICES MIB = 2074 + + // EBCDICESA is the MIB identifier with IANA name EBCDIC-ES-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICESA MIB = 2075 + + // EBCDICESS is the MIB identifier with IANA name EBCDIC-ES-S. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICESS MIB = 2076 + + // EBCDICUK is the MIB identifier with IANA name EBCDIC-UK. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICUK MIB = 2077 + + // EBCDICUS is the MIB identifier with IANA name EBCDIC-US. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICUS MIB = 2078 + + // Unknown8BiT is the MIB identifier with IANA name UNKNOWN-8BIT. + // + // Reference: RFC1428 + Unknown8BiT MIB = 2079 + + // Mnemonic is the MIB identifier with IANA name MNEMONIC. + // + // rfc1345 , also known as "mnemonic+ascii+38" + // Reference: RFC1345 + Mnemonic MIB = 2080 + + // Mnem is the MIB identifier with IANA name MNEM. + // + // rfc1345 , also known as "mnemonic+ascii+8200" + // Reference: RFC1345 + Mnem MIB = 2081 + + // VISCII is the MIB identifier with IANA name VISCII. + // + // rfc1456 + // Reference: RFC1456 + VISCII MIB = 2082 + + // VIQR is the MIB identifier with IANA name VIQR. + // + // rfc1456 + // Reference: RFC1456 + VIQR MIB = 2083 + + // KOI8R is the MIB identifier with IANA name KOI8-R (MIME: KOI8-R). + // + // rfc1489 , based on GOST-19768-74, ISO-6937/8, + // INIS-Cyrillic, ISO-5427. + // Reference: RFC1489 + KOI8R MIB = 2084 + + // HZGB2312 is the MIB identifier with IANA name HZ-GB-2312. + // + // rfc1842 , rfc1843 rfc1843 rfc1842 + HZGB2312 MIB = 2085 + + // IBM866 is the MIB identifier with IANA name IBM866. + // + // IBM NLDG Volume 2 (SE09-8002-03) August 1994 + IBM866 MIB = 2086 + + // PC775Baltic is the MIB identifier with IANA name IBM775. + // + // HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996 + PC775Baltic MIB = 2087 + + // KOI8U is the MIB identifier with IANA name KOI8-U. + // + // rfc2319 + // Reference: RFC2319 + KOI8U MIB = 2088 + + // IBM00858 is the MIB identifier with IANA name IBM00858. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM00858 + IBM00858 MIB = 2089 + + // IBM00924 is the MIB identifier with IANA name IBM00924. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM00924 + IBM00924 MIB = 2090 + + // IBM01140 is the MIB identifier with IANA name IBM01140. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01140 + IBM01140 MIB = 2091 + + // IBM01141 is the MIB identifier with IANA name IBM01141. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01141 + IBM01141 MIB = 2092 + + // IBM01142 is the MIB identifier with IANA name IBM01142. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01142 + IBM01142 MIB = 2093 + + // IBM01143 is the MIB identifier with IANA name IBM01143. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01143 + IBM01143 MIB = 2094 + + // IBM01144 is the MIB identifier with IANA name IBM01144. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01144 + IBM01144 MIB = 2095 + + // IBM01145 is the MIB identifier with IANA name IBM01145. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01145 + IBM01145 MIB = 2096 + + // IBM01146 is the MIB identifier with IANA name IBM01146. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01146 + IBM01146 MIB = 2097 + + // IBM01147 is the MIB identifier with IANA name IBM01147. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01147 + IBM01147 MIB = 2098 + + // IBM01148 is the MIB identifier with IANA name IBM01148. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01148 + IBM01148 MIB = 2099 + + // IBM01149 is the MIB identifier with IANA name IBM01149. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01149 + IBM01149 MIB = 2100 + + // Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS. + // + // See https://www.iana.org/assignments/charset-reg/Big5-HKSCS + Big5HKSCS MIB = 2101 + + // IBM1047 is the MIB identifier with IANA name IBM1047. + // + // IBM1047 (EBCDIC Latin 1/Open Systems) https://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf + IBM1047 MIB = 2102 + + // PTCP154 is the MIB identifier with IANA name PTCP154. + // + // See https://www.iana.org/assignments/charset-reg/PTCP154 + PTCP154 MIB = 2103 + + // Amiga1251 is the MIB identifier with IANA name Amiga-1251. + // + // See https://www.amiga.ultranet.ru/Amiga-1251.html + Amiga1251 MIB = 2104 + + // KOI7switched is the MIB identifier with IANA name KOI7-switched. + // + // See https://www.iana.org/assignments/charset-reg/KOI7-switched + KOI7switched MIB = 2105 + + // BRF is the MIB identifier with IANA name BRF. + // + // See https://www.iana.org/assignments/charset-reg/BRF + BRF MIB = 2106 + + // TSCII is the MIB identifier with IANA name TSCII. + // + // See https://www.iana.org/assignments/charset-reg/TSCII + TSCII MIB = 2107 + + // CP51932 is the MIB identifier with IANA name CP51932. + // + // See https://www.iana.org/assignments/charset-reg/CP51932 + CP51932 MIB = 2108 + + // Windows874 is the MIB identifier with IANA name windows-874. + // + // See https://www.iana.org/assignments/charset-reg/windows-874 + Windows874 MIB = 2109 + + // Windows1250 is the MIB identifier with IANA name windows-1250. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1250 + Windows1250 MIB = 2250 + + // Windows1251 is the MIB identifier with IANA name windows-1251. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1251 + Windows1251 MIB = 2251 + + // Windows1252 is the MIB identifier with IANA name windows-1252. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1252 + Windows1252 MIB = 2252 + + // Windows1253 is the MIB identifier with IANA name windows-1253. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1253 + Windows1253 MIB = 2253 + + // Windows1254 is the MIB identifier with IANA name windows-1254. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1254 + Windows1254 MIB = 2254 + + // Windows1255 is the MIB identifier with IANA name windows-1255. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1255 + Windows1255 MIB = 2255 + + // Windows1256 is the MIB identifier with IANA name windows-1256. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1256 + Windows1256 MIB = 2256 + + // Windows1257 is the MIB identifier with IANA name windows-1257. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1257 + Windows1257 MIB = 2257 + + // Windows1258 is the MIB identifier with IANA name windows-1258. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1258 + Windows1258 MIB = 2258 + + // TIS620 is the MIB identifier with IANA name TIS-620. + // + // Thai Industrial Standards Institute (TISI) + TIS620 MIB = 2259 + + // CP50220 is the MIB identifier with IANA name CP50220. + // + // See https://www.iana.org/assignments/charset-reg/CP50220 + CP50220 MIB = 2260 +) diff --git a/vendor/modules.txt b/vendor/modules.txt index 9d379013..e9dde212 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -23,6 +23,7 @@ github.com/cespare/xxhash/v2 github.com/chzyer/readline # github.com/cloudbase/garm-provider-common v0.1.7 ## explicit; go 1.23.0 +github.com/cloudbase/garm-provider-common/cloudconfig github.com/cloudbase/garm-provider-common/defaults github.com/cloudbase/garm-provider-common/errors github.com/cloudbase/garm-provider-common/execution/common @@ -36,6 +37,49 @@ github.com/davecgh/go-spew/spew # github.com/felixge/httpsnoop v1.0.4 ## explicit; go 1.13 github.com/felixge/httpsnoop +# github.com/gdamore/encoding v1.0.1 +## explicit; go 1.9 +github.com/gdamore/encoding +# github.com/gdamore/tcell/v2 v2.9.0 +## explicit; go 1.23.0 +github.com/gdamore/tcell/v2 +github.com/gdamore/tcell/v2/terminfo +github.com/gdamore/tcell/v2/terminfo/a/aixterm +github.com/gdamore/tcell/v2/terminfo/a/alacritty +github.com/gdamore/tcell/v2/terminfo/a/ansi +github.com/gdamore/tcell/v2/terminfo/b/beterm +github.com/gdamore/tcell/v2/terminfo/base +github.com/gdamore/tcell/v2/terminfo/c/cygwin +github.com/gdamore/tcell/v2/terminfo/d/dtterm +github.com/gdamore/tcell/v2/terminfo/dynamic +github.com/gdamore/tcell/v2/terminfo/e/emacs +github.com/gdamore/tcell/v2/terminfo/extended +github.com/gdamore/tcell/v2/terminfo/f/foot +github.com/gdamore/tcell/v2/terminfo/g/gnome +github.com/gdamore/tcell/v2/terminfo/h/hpterm +github.com/gdamore/tcell/v2/terminfo/k/konsole +github.com/gdamore/tcell/v2/terminfo/k/kterm +github.com/gdamore/tcell/v2/terminfo/l/linux +github.com/gdamore/tcell/v2/terminfo/p/pcansi +github.com/gdamore/tcell/v2/terminfo/r/rxvt +github.com/gdamore/tcell/v2/terminfo/s/screen +github.com/gdamore/tcell/v2/terminfo/s/simpleterm +github.com/gdamore/tcell/v2/terminfo/s/sun +github.com/gdamore/tcell/v2/terminfo/t/tmux +github.com/gdamore/tcell/v2/terminfo/v/vt100 +github.com/gdamore/tcell/v2/terminfo/v/vt102 +github.com/gdamore/tcell/v2/terminfo/v/vt220 +github.com/gdamore/tcell/v2/terminfo/v/vt320 +github.com/gdamore/tcell/v2/terminfo/v/vt400 +github.com/gdamore/tcell/v2/terminfo/v/vt420 +github.com/gdamore/tcell/v2/terminfo/v/vt52 +github.com/gdamore/tcell/v2/terminfo/w/wy50 +github.com/gdamore/tcell/v2/terminfo/w/wy60 +github.com/gdamore/tcell/v2/terminfo/w/wy99_ansi +github.com/gdamore/tcell/v2/terminfo/x/xfce +github.com/gdamore/tcell/v2/terminfo/x/xterm +github.com/gdamore/tcell/v2/terminfo/x/xterm_ghostty +github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty # github.com/go-logr/logr v1.4.3 ## explicit; go 1.18 github.com/go-logr/logr @@ -164,6 +208,9 @@ github.com/jinzhu/now # github.com/josharian/intern v1.0.0 ## explicit; go 1.5 github.com/josharian/intern +# github.com/lucasb-eyer/go-colorful v1.2.0 +## explicit; go 1.12 +github.com/lucasb-eyer/go-colorful # github.com/mailru/easyjson v0.9.0 ## explicit; go 1.20 github.com/mailru/easyjson @@ -238,6 +285,9 @@ github.com/prometheus/common/model github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util +# github.com/rivo/tview v0.42.0 +## explicit; go 1.18 +github.com/rivo/tview # github.com/rivo/uniseg v0.4.7 ## explicit; go 1.18 github.com/rivo/uniseg @@ -323,11 +373,17 @@ golang.org/x/sync/errgroup # golang.org/x/sys v0.36.0 ## explicit; go 1.24.0 golang.org/x/sys/cpu +golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows +# golang.org/x/term v0.35.0 +## explicit; go 1.24.0 +golang.org/x/term # golang.org/x/text v0.29.0 ## explicit; go 1.24.0 golang.org/x/text/cases +golang.org/x/text/encoding +golang.org/x/text/encoding/internal/identifier golang.org/x/text/internal golang.org/x/text/internal/language golang.org/x/text/internal/language/compact diff --git a/webapp/assets/_app/immutable/assets/0.CP-xI7De.css b/webapp/assets/_app/immutable/assets/0.CP-xI7De.css new file mode 100644 index 00000000..51720517 --- /dev/null +++ b/webapp/assets/_app/immutable/assets/0.CP-xI7De.css @@ -0,0 +1 @@ +/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-50:oklch(98% .016 73.684);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-900:oklch(35.9% .144 278.697);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-20{top:calc(var(--spacing)*20)}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-full{right:100%}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1{left:calc(var(--spacing)*1)}.left-1\/2{left:50%}.left-full{left:100%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.col-span-2{grid-column:span 2/span 2}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.container\!{width:100%!important}@media (min-width:640px){.container\!{max-width:640px!important}}@media (min-width:768px){.container\!{max-width:768px!important}}@media (min-width:1024px){.container\!{max-width:1024px!important}}@media (min-width:1280px){.container\!{max-width:1280px!important}}@media (min-width:1536px){.container\!{max-width:1536px!important}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.-mr-0\.5{margin-right:calc(var(--spacing)*-.5)}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-12{margin-right:calc(var(--spacing)*-12)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-2\.5{margin-right:calc(var(--spacing)*2.5)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-0\.5{margin-left:calc(var(--spacing)*-.5)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.h-0{height:calc(var(--spacing)*0)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-24{height:calc(var(--spacing)*24)}.h-48{height:calc(var(--spacing)*48)}.h-full{height:100%}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[90vh\]{max-height:90vh}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-64{width:calc(var(--spacing)*64)}.w-80{width:calc(var(--spacing)*80)}.w-96{width:calc(var(--spacing)*96)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize\!{resize:both!important}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing)*0)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}:where(.-space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(-1px*var(--tw-space-y-reverse));margin-block-end:calc(-1px*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{-moz-column-gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*4)}:where(.-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px*var(--tw-space-x-reverse));margin-inline-end:calc(-1px*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-6{row-gap:calc(var(--spacing)*6)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-600{border-color:var(--color-gray-600)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-yellow-300{border-color:var(--color-yellow-300)}.border-t-gray-900{border-top-color:var(--color-gray-900)}.border-r-gray-900{border-right-color:var(--color-gray-900)}.border-b-gray-900{border-bottom-color:var(--color-gray-900)}.border-l-gray-900{border-left-color:var(--color-gray-900)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-900{background-color:var(--color-red-900)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-7{padding-inline:calc(var(--spacing)*7)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-20{padding-top:calc(var(--spacing)*20)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.text-black{color:var(--color-black)}.text-blue-400{color:var(--color-blue-400)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-indigo-600{color:var(--color-indigo-600)}.text-orange-700{color:var(--color-orange-700)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-blue-600\/20{--tw-ring-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.ring-blue-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.ring-gray-600\/20{--tw-ring-color:#4a556533}@supports (color:color-mix(in lab,red,red)){.ring-gray-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-600)20%,transparent)}}.ring-green-200{--tw-ring-color:var(--color-green-200)}.ring-green-600\/20{--tw-ring-color:#00a54433}@supports (color:color-mix(in lab,red,red)){.ring-green-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-600)20%,transparent)}}.ring-orange-600\/20{--tw-ring-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.ring-orange-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-600)20%,transparent)}}.ring-purple-600\/20{--tw-ring-color:#9810fa33}@supports (color:color-mix(in lab,red,red)){.ring-purple-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-600)20%,transparent)}}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-red-600\/20{--tw-ring-color:#e4001433}@supports (color:color-mix(in lab,red,red)){.ring-red-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-600)20%,transparent)}}.ring-yellow-200{--tw-ring-color:var(--color-yellow-200)}.ring-yellow-600\/20{--tw-ring-color:#cd890033}@supports (color:color-mix(in lab,red,red)){.ring-yellow-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-600)20%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-900:hover{color:var(--color-blue-900)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-green-500:hover{color:var(--color-green-500)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-indigo-900:hover{color:var(--color-indigo-900)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-900:hover{color:var(--color-red-900)}.hover\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\:text-yellow-500:hover{color:var(--color-yellow-500)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:z-10:focus{z-index:10}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:bg-red-200:focus{background-color:var(--color-red-200)}.focus\:placeholder-gray-400:focus::-moz-placeholder{color:var(--color-gray-400)}.focus\:placeholder-gray-400:focus::placeholder{color:var(--color-gray-400)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-400:disabled{background-color:var(--color-gray-400)}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:bg-gray-400:disabled:hover{background-color:var(--color-gray-400)}}@media (min-width:640px){.sm\:mx-auto{margin-inline:auto}.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:ml-4{margin-left:calc(var(--spacing)*4)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-full{width:100%}.sm\:max-w-md{max-width:var(--container-md)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:px-10{padding-inline:calc(var(--spacing)*10)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:768px){.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.md\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}}@media (min-width:1024px){.lg\:fixed{position:fixed}.lg\:inset-y-0{inset-block:calc(var(--spacing)*0)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-64{width:calc(var(--spacing)*64)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:pt-6{padding-top:calc(var(--spacing)*6)}.lg\:pl-64{padding-left:calc(var(--spacing)*64)}}.dark .dark\:block{display:block}.dark .dark\:hidden{display:none}:where(.dark .dark\:divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}.dark .dark\:border-blue-700{border-color:var(--color-blue-700)}.dark .dark\:border-blue-800{border-color:var(--color-blue-800)}.dark .dark\:border-gray-600{border-color:var(--color-gray-600)}.dark .dark\:border-gray-700{border-color:var(--color-gray-700)}.dark .dark\:border-green-700{border-color:var(--color-green-700)}.dark .dark\:border-red-500{border-color:var(--color-red-500)}.dark .dark\:border-red-600{border-color:var(--color-red-600)}.dark .dark\:border-red-700{border-color:var(--color-red-700)}.dark .dark\:border-red-800{border-color:var(--color-red-800)}.dark .dark\:border-yellow-600{border-color:var(--color-yellow-600)}.dark .dark\:border-yellow-700{border-color:var(--color-yellow-700)}.dark .dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark .dark\:bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.dark .dark\:bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark .dark\:bg-blue-800{background-color:var(--color-blue-800)}.dark .dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark .dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900)50%,transparent)}}.dark .dark\:bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-500\/10{background-color:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.dark .dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark .dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark .dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark .dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark .dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark .dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.dark .dark\:bg-green-900{background-color:var(--color-green-900)}.dark .dark\:bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900)50%,transparent)}}.dark .dark\:bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.dark .dark\:bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.dark .dark\:bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.dark .dark\:bg-red-700{background-color:var(--color-red-700)}.dark .dark\:bg-red-800{background-color:var(--color-red-800)}.dark .dark\:bg-red-900{background-color:var(--color-red-900)}.dark .dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark .dark\:bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.dark .dark\:bg-yellow-900{background-color:var(--color-yellow-900)}.dark .dark\:bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900)20%,transparent)}}.dark .dark\:from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:text-blue-100{color:var(--color-blue-100)}.dark .dark\:text-blue-200{color:var(--color-blue-200)}.dark .dark\:text-blue-300{color:var(--color-blue-300)}.dark .dark\:text-blue-400{color:var(--color-blue-400)}.dark .dark\:text-gray-200{color:var(--color-gray-200)}.dark .dark\:text-gray-300{color:var(--color-gray-300)}.dark .dark\:text-gray-400{color:var(--color-gray-400)}.dark .dark\:text-gray-500{color:var(--color-gray-500)}.dark .dark\:text-green-200{color:var(--color-green-200)}.dark .dark\:text-green-300{color:var(--color-green-300)}.dark .dark\:text-green-400{color:var(--color-green-400)}.dark .dark\:text-indigo-400{color:var(--color-indigo-400)}.dark .dark\:text-orange-400{color:var(--color-orange-400)}.dark .dark\:text-purple-400{color:var(--color-purple-400)}.dark .dark\:text-red-100{color:var(--color-red-100)}.dark .dark\:text-red-200{color:var(--color-red-200)}.dark .dark\:text-red-300{color:var(--color-red-300)}.dark .dark\:text-red-400{color:var(--color-red-400)}.dark .dark\:text-white{color:var(--color-white)}.dark .dark\:text-yellow-200{color:var(--color-yellow-200)}.dark .dark\:text-yellow-300{color:var(--color-yellow-300)}.dark .dark\:text-yellow-400{color:var(--color-yellow-400)}.dark .dark\:placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-400::placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.dark .dark\:placeholder-gray-500::placeholder{color:var(--color-gray-500)}.dark .dark\:ring-blue-400\/20{--tw-ring-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.dark .dark\:ring-blue-400\/30{--tw-ring-color:#54a2ff4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)30%,transparent)}}.dark .dark\:ring-blue-500\/20{--tw-ring-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.dark .dark\:ring-gray-400\/20{--tw-ring-color:#99a1af33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)20%,transparent)}}.dark .dark\:ring-gray-400\/30{--tw-ring-color:#99a1af4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)30%,transparent)}}.dark .dark\:ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.dark .dark\:ring-green-400\/20{--tw-ring-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-400)20%,transparent)}}.dark .dark\:ring-green-400\/30{--tw-ring-color:#05df724d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-green-400)30%,transparent)}}.dark .dark\:ring-green-500\/20{--tw-ring-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.dark .dark\:ring-orange-500\/20{--tw-ring-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-orange-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.dark .dark\:ring-purple-500\/20{--tw-ring-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-purple-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.dark .dark\:ring-red-400\/20{--tw-ring-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-400)20%,transparent)}}.dark .dark\:ring-red-400\/30{--tw-ring-color:#ff65684d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-red-400)30%,transparent)}}.dark .dark\:ring-red-500\/20{--tw-ring-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark .dark\:ring-yellow-400\/30{--tw-ring-color:#fac8004d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-yellow-400)30%,transparent)}}.dark .dark\:ring-yellow-500\/20{--tw-ring-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}@media (hover:hover){.dark .dark\:hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.dark .dark\:hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.dark .dark\:hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.dark .dark\:hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.dark .dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark .dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark .dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark .dark\:hover\:bg-red-700:hover{background-color:var(--color-red-700)}.dark .dark\:hover\:bg-red-800:hover{background-color:var(--color-red-800)}.dark .dark\:hover\:text-blue-300:hover{color:var(--color-blue-300)}.dark .dark\:hover\:text-gray-100:hover{color:var(--color-gray-100)}.dark .dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark .dark\:hover\:text-green-300:hover{color:var(--color-green-300)}.dark .dark\:hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.dark .dark\:hover\:text-red-300:hover{color:var(--color-red-300)}.dark .dark\:hover\:text-white:hover{color:var(--color-white)}}.dark .dark\:focus\:bg-red-700:focus{background-color:var(--color-red-700)}.dark .dark\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/webapp/assets/_app/immutable/assets/0.pWW488Rd.css b/webapp/assets/_app/immutable/assets/0.pWW488Rd.css deleted file mode 100644 index 362cac43..00000000 --- a/webapp/assets/_app/immutable/assets/0.pWW488Rd.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-50:oklch(98% .016 73.684);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-900:oklch(35.9% .144 278.697);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-full{right:100%}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-full{left:100%}.z-0{z-index:0}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.-mr-0\.5{margin-right:calc(var(--spacing)*-.5)}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-12{margin-right:calc(var(--spacing)*-12)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-2\.5{margin-right:calc(var(--spacing)*2.5)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-0\.5{margin-left:calc(var(--spacing)*-.5)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0{height:calc(var(--spacing)*0)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-24{height:calc(var(--spacing)*24)}.h-48{height:calc(var(--spacing)*48)}.h-full{height:100%}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[90vh\]{max-height:90vh}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-64{width:calc(var(--spacing)*64)}.w-80{width:calc(var(--spacing)*80)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing)*0)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}:where(.-space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(-1px*var(--tw-space-y-reverse));margin-block-end:calc(-1px*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{-moz-column-gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*4)}:where(.-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px*var(--tw-space-x-reverse));margin-inline-end:calc(-1px*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-6{row-gap:calc(var(--spacing)*6)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-gray-900{border-top-color:var(--color-gray-900)}.border-r-gray-900{border-right-color:var(--color-gray-900)}.border-b-gray-900{border-bottom-color:var(--color-gray-900)}.border-l-gray-900{border-left-color:var(--color-gray-900)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-900{background-color:var(--color-red-900)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-20{padding-top:calc(var(--spacing)*20)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.text-black{color:var(--color-black)}.text-blue-400{color:var(--color-blue-400)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-indigo-600{color:var(--color-indigo-600)}.text-orange-700{color:var(--color-orange-700)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-blue-600\/20{--tw-ring-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.ring-blue-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.ring-gray-600\/20{--tw-ring-color:#4a556533}@supports (color:color-mix(in lab,red,red)){.ring-gray-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-600)20%,transparent)}}.ring-green-200{--tw-ring-color:var(--color-green-200)}.ring-green-600\/20{--tw-ring-color:#00a54433}@supports (color:color-mix(in lab,red,red)){.ring-green-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-600)20%,transparent)}}.ring-orange-600\/20{--tw-ring-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.ring-orange-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-600)20%,transparent)}}.ring-purple-600\/20{--tw-ring-color:#9810fa33}@supports (color:color-mix(in lab,red,red)){.ring-purple-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-600)20%,transparent)}}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-red-600\/20{--tw-ring-color:#e4001433}@supports (color:color-mix(in lab,red,red)){.ring-red-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-600)20%,transparent)}}.ring-yellow-200{--tw-ring-color:var(--color-yellow-200)}.ring-yellow-600\/20{--tw-ring-color:#cd890033}@supports (color:color-mix(in lab,red,red)){.ring-yellow-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-600)20%,transparent)}}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-green-500:hover{color:var(--color-green-500)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-indigo-900:hover{color:var(--color-indigo-900)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-900:hover{color:var(--color-red-900)}.hover\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\:text-yellow-500:hover{color:var(--color-yellow-500)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:z-10:focus{z-index:10}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:bg-red-200:focus{background-color:var(--color-red-200)}.focus\:placeholder-gray-400:focus::-moz-placeholder{color:var(--color-gray-400)}.focus\:placeholder-gray-400:focus::placeholder{color:var(--color-gray-400)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-400:disabled{background-color:var(--color-gray-400)}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:bg-gray-400:disabled:hover{background-color:var(--color-gray-400)}}@media (min-width:640px){.sm\:mx-auto{margin-inline:auto}.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:ml-4{margin-left:calc(var(--spacing)*4)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-full{width:100%}.sm\:max-w-md{max-width:var(--container-md)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:px-10{padding-inline:calc(var(--spacing)*10)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:768px){.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.md\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}}@media (min-width:1024px){.lg\:fixed{position:fixed}.lg\:inset-y-0{inset-block:calc(var(--spacing)*0)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-64{width:calc(var(--spacing)*64)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:pt-6{padding-top:calc(var(--spacing)*6)}.lg\:pl-64{padding-left:calc(var(--spacing)*64)}}.dark .dark\:block{display:block}.dark .dark\:hidden{display:none}:where(.dark .dark\:divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}.dark .dark\:border-blue-700{border-color:var(--color-blue-700)}.dark .dark\:border-blue-800{border-color:var(--color-blue-800)}.dark .dark\:border-gray-600{border-color:var(--color-gray-600)}.dark .dark\:border-gray-700{border-color:var(--color-gray-700)}.dark .dark\:border-green-700{border-color:var(--color-green-700)}.dark .dark\:border-red-500{border-color:var(--color-red-500)}.dark .dark\:border-red-600{border-color:var(--color-red-600)}.dark .dark\:border-red-700{border-color:var(--color-red-700)}.dark .dark\:border-red-800{border-color:var(--color-red-800)}.dark .dark\:border-yellow-700{border-color:var(--color-yellow-700)}.dark .dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark .dark\:bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.dark .dark\:bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark .dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark .dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900)50%,transparent)}}.dark .dark\:bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-500\/10{background-color:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.dark .dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark .dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark .dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark .dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark .dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark .dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.dark .dark\:bg-green-900{background-color:var(--color-green-900)}.dark .dark\:bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900)50%,transparent)}}.dark .dark\:bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.dark .dark\:bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.dark .dark\:bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.dark .dark\:bg-red-700{background-color:var(--color-red-700)}.dark .dark\:bg-red-800{background-color:var(--color-red-800)}.dark .dark\:bg-red-900{background-color:var(--color-red-900)}.dark .dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark .dark\:bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.dark .dark\:bg-yellow-900{background-color:var(--color-yellow-900)}.dark .dark\:bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900)20%,transparent)}}.dark .dark\:from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:text-blue-200{color:var(--color-blue-200)}.dark .dark\:text-blue-300{color:var(--color-blue-300)}.dark .dark\:text-blue-400{color:var(--color-blue-400)}.dark .dark\:text-gray-200{color:var(--color-gray-200)}.dark .dark\:text-gray-300{color:var(--color-gray-300)}.dark .dark\:text-gray-400{color:var(--color-gray-400)}.dark .dark\:text-gray-500{color:var(--color-gray-500)}.dark .dark\:text-green-200{color:var(--color-green-200)}.dark .dark\:text-green-300{color:var(--color-green-300)}.dark .dark\:text-green-400{color:var(--color-green-400)}.dark .dark\:text-indigo-400{color:var(--color-indigo-400)}.dark .dark\:text-orange-400{color:var(--color-orange-400)}.dark .dark\:text-purple-400{color:var(--color-purple-400)}.dark .dark\:text-red-100{color:var(--color-red-100)}.dark .dark\:text-red-200{color:var(--color-red-200)}.dark .dark\:text-red-300{color:var(--color-red-300)}.dark .dark\:text-red-400{color:var(--color-red-400)}.dark .dark\:text-white{color:var(--color-white)}.dark .dark\:text-yellow-200{color:var(--color-yellow-200)}.dark .dark\:text-yellow-300{color:var(--color-yellow-300)}.dark .dark\:text-yellow-400{color:var(--color-yellow-400)}.dark .dark\:placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-400::placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.dark .dark\:placeholder-gray-500::placeholder{color:var(--color-gray-500)}.dark .dark\:ring-blue-400\/20{--tw-ring-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.dark .dark\:ring-blue-400\/30{--tw-ring-color:#54a2ff4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)30%,transparent)}}.dark .dark\:ring-blue-500\/20{--tw-ring-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.dark .dark\:ring-gray-400\/20{--tw-ring-color:#99a1af33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)20%,transparent)}}.dark .dark\:ring-gray-400\/30{--tw-ring-color:#99a1af4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)30%,transparent)}}.dark .dark\:ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.dark .dark\:ring-green-400\/20{--tw-ring-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-400)20%,transparent)}}.dark .dark\:ring-green-400\/30{--tw-ring-color:#05df724d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-green-400)30%,transparent)}}.dark .dark\:ring-green-500\/20{--tw-ring-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.dark .dark\:ring-orange-500\/20{--tw-ring-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-orange-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.dark .dark\:ring-purple-500\/20{--tw-ring-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-purple-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.dark .dark\:ring-red-400\/20{--tw-ring-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-400)20%,transparent)}}.dark .dark\:ring-red-400\/30{--tw-ring-color:#ff65684d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-red-400)30%,transparent)}}.dark .dark\:ring-red-500\/20{--tw-ring-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark .dark\:ring-yellow-400\/30{--tw-ring-color:#fac8004d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-yellow-400)30%,transparent)}}.dark .dark\:ring-yellow-500\/20{--tw-ring-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}@media (hover:hover){.dark .dark\:hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.dark .dark\:hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.dark .dark\:hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.dark .dark\:hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.dark .dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark .dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark .dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark .dark\:hover\:bg-red-700:hover{background-color:var(--color-red-700)}.dark .dark\:hover\:bg-red-800:hover{background-color:var(--color-red-800)}.dark .dark\:hover\:text-blue-300:hover{color:var(--color-blue-300)}.dark .dark\:hover\:text-gray-100:hover{color:var(--color-gray-100)}.dark .dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark .dark\:hover\:text-green-300:hover{color:var(--color-green-300)}.dark .dark\:hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.dark .dark\:hover\:text-red-300:hover{color:var(--color-red-300)}.dark .dark\:hover\:text-white:hover{color:var(--color-white)}}.dark .dark\:focus\:bg-red-700:focus{background-color:var(--color-red-700)}.dark .dark\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/webapp/assets/_app/immutable/assets/_layout.CP-xI7De.css b/webapp/assets/_app/immutable/assets/_layout.CP-xI7De.css new file mode 100644 index 00000000..51720517 --- /dev/null +++ b/webapp/assets/_app/immutable/assets/_layout.CP-xI7De.css @@ -0,0 +1 @@ +/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-50:oklch(98% .016 73.684);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-900:oklch(35.9% .144 278.697);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-20{top:calc(var(--spacing)*20)}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-full{right:100%}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1{left:calc(var(--spacing)*1)}.left-1\/2{left:50%}.left-full{left:100%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.col-span-2{grid-column:span 2/span 2}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.container\!{width:100%!important}@media (min-width:640px){.container\!{max-width:640px!important}}@media (min-width:768px){.container\!{max-width:768px!important}}@media (min-width:1024px){.container\!{max-width:1024px!important}}@media (min-width:1280px){.container\!{max-width:1280px!important}}@media (min-width:1536px){.container\!{max-width:1536px!important}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.-mr-0\.5{margin-right:calc(var(--spacing)*-.5)}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-12{margin-right:calc(var(--spacing)*-12)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-2\.5{margin-right:calc(var(--spacing)*2.5)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-0\.5{margin-left:calc(var(--spacing)*-.5)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.h-0{height:calc(var(--spacing)*0)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-24{height:calc(var(--spacing)*24)}.h-48{height:calc(var(--spacing)*48)}.h-full{height:100%}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[90vh\]{max-height:90vh}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-64{width:calc(var(--spacing)*64)}.w-80{width:calc(var(--spacing)*80)}.w-96{width:calc(var(--spacing)*96)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize\!{resize:both!important}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing)*0)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}:where(.-space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(-1px*var(--tw-space-y-reverse));margin-block-end:calc(-1px*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{-moz-column-gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*4)}:where(.-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px*var(--tw-space-x-reverse));margin-inline-end:calc(-1px*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-6{row-gap:calc(var(--spacing)*6)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-600{border-color:var(--color-gray-600)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-yellow-300{border-color:var(--color-yellow-300)}.border-t-gray-900{border-top-color:var(--color-gray-900)}.border-r-gray-900{border-right-color:var(--color-gray-900)}.border-b-gray-900{border-bottom-color:var(--color-gray-900)}.border-l-gray-900{border-left-color:var(--color-gray-900)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-900{background-color:var(--color-red-900)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-7{padding-inline:calc(var(--spacing)*7)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-20{padding-top:calc(var(--spacing)*20)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.text-black{color:var(--color-black)}.text-blue-400{color:var(--color-blue-400)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-indigo-600{color:var(--color-indigo-600)}.text-orange-700{color:var(--color-orange-700)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-blue-600\/20{--tw-ring-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.ring-blue-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.ring-gray-600\/20{--tw-ring-color:#4a556533}@supports (color:color-mix(in lab,red,red)){.ring-gray-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-600)20%,transparent)}}.ring-green-200{--tw-ring-color:var(--color-green-200)}.ring-green-600\/20{--tw-ring-color:#00a54433}@supports (color:color-mix(in lab,red,red)){.ring-green-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-600)20%,transparent)}}.ring-orange-600\/20{--tw-ring-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.ring-orange-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-600)20%,transparent)}}.ring-purple-600\/20{--tw-ring-color:#9810fa33}@supports (color:color-mix(in lab,red,red)){.ring-purple-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-600)20%,transparent)}}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-red-600\/20{--tw-ring-color:#e4001433}@supports (color:color-mix(in lab,red,red)){.ring-red-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-600)20%,transparent)}}.ring-yellow-200{--tw-ring-color:var(--color-yellow-200)}.ring-yellow-600\/20{--tw-ring-color:#cd890033}@supports (color:color-mix(in lab,red,red)){.ring-yellow-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-600)20%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-900:hover{color:var(--color-blue-900)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-green-500:hover{color:var(--color-green-500)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-indigo-900:hover{color:var(--color-indigo-900)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-900:hover{color:var(--color-red-900)}.hover\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\:text-yellow-500:hover{color:var(--color-yellow-500)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:z-10:focus{z-index:10}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:bg-red-200:focus{background-color:var(--color-red-200)}.focus\:placeholder-gray-400:focus::-moz-placeholder{color:var(--color-gray-400)}.focus\:placeholder-gray-400:focus::placeholder{color:var(--color-gray-400)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-400:disabled{background-color:var(--color-gray-400)}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:bg-gray-400:disabled:hover{background-color:var(--color-gray-400)}}@media (min-width:640px){.sm\:mx-auto{margin-inline:auto}.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:ml-4{margin-left:calc(var(--spacing)*4)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-full{width:100%}.sm\:max-w-md{max-width:var(--container-md)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:px-10{padding-inline:calc(var(--spacing)*10)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:768px){.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.md\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}}@media (min-width:1024px){.lg\:fixed{position:fixed}.lg\:inset-y-0{inset-block:calc(var(--spacing)*0)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-64{width:calc(var(--spacing)*64)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:pt-6{padding-top:calc(var(--spacing)*6)}.lg\:pl-64{padding-left:calc(var(--spacing)*64)}}.dark .dark\:block{display:block}.dark .dark\:hidden{display:none}:where(.dark .dark\:divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}.dark .dark\:border-blue-700{border-color:var(--color-blue-700)}.dark .dark\:border-blue-800{border-color:var(--color-blue-800)}.dark .dark\:border-gray-600{border-color:var(--color-gray-600)}.dark .dark\:border-gray-700{border-color:var(--color-gray-700)}.dark .dark\:border-green-700{border-color:var(--color-green-700)}.dark .dark\:border-red-500{border-color:var(--color-red-500)}.dark .dark\:border-red-600{border-color:var(--color-red-600)}.dark .dark\:border-red-700{border-color:var(--color-red-700)}.dark .dark\:border-red-800{border-color:var(--color-red-800)}.dark .dark\:border-yellow-600{border-color:var(--color-yellow-600)}.dark .dark\:border-yellow-700{border-color:var(--color-yellow-700)}.dark .dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark .dark\:bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.dark .dark\:bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark .dark\:bg-blue-800{background-color:var(--color-blue-800)}.dark .dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark .dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900)50%,transparent)}}.dark .dark\:bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-500\/10{background-color:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.dark .dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark .dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark .dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark .dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark .dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark .dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.dark .dark\:bg-green-900{background-color:var(--color-green-900)}.dark .dark\:bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900)50%,transparent)}}.dark .dark\:bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.dark .dark\:bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.dark .dark\:bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.dark .dark\:bg-red-700{background-color:var(--color-red-700)}.dark .dark\:bg-red-800{background-color:var(--color-red-800)}.dark .dark\:bg-red-900{background-color:var(--color-red-900)}.dark .dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark .dark\:bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.dark .dark\:bg-yellow-900{background-color:var(--color-yellow-900)}.dark .dark\:bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900)20%,transparent)}}.dark .dark\:from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:text-blue-100{color:var(--color-blue-100)}.dark .dark\:text-blue-200{color:var(--color-blue-200)}.dark .dark\:text-blue-300{color:var(--color-blue-300)}.dark .dark\:text-blue-400{color:var(--color-blue-400)}.dark .dark\:text-gray-200{color:var(--color-gray-200)}.dark .dark\:text-gray-300{color:var(--color-gray-300)}.dark .dark\:text-gray-400{color:var(--color-gray-400)}.dark .dark\:text-gray-500{color:var(--color-gray-500)}.dark .dark\:text-green-200{color:var(--color-green-200)}.dark .dark\:text-green-300{color:var(--color-green-300)}.dark .dark\:text-green-400{color:var(--color-green-400)}.dark .dark\:text-indigo-400{color:var(--color-indigo-400)}.dark .dark\:text-orange-400{color:var(--color-orange-400)}.dark .dark\:text-purple-400{color:var(--color-purple-400)}.dark .dark\:text-red-100{color:var(--color-red-100)}.dark .dark\:text-red-200{color:var(--color-red-200)}.dark .dark\:text-red-300{color:var(--color-red-300)}.dark .dark\:text-red-400{color:var(--color-red-400)}.dark .dark\:text-white{color:var(--color-white)}.dark .dark\:text-yellow-200{color:var(--color-yellow-200)}.dark .dark\:text-yellow-300{color:var(--color-yellow-300)}.dark .dark\:text-yellow-400{color:var(--color-yellow-400)}.dark .dark\:placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-400::placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.dark .dark\:placeholder-gray-500::placeholder{color:var(--color-gray-500)}.dark .dark\:ring-blue-400\/20{--tw-ring-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.dark .dark\:ring-blue-400\/30{--tw-ring-color:#54a2ff4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)30%,transparent)}}.dark .dark\:ring-blue-500\/20{--tw-ring-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.dark .dark\:ring-gray-400\/20{--tw-ring-color:#99a1af33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)20%,transparent)}}.dark .dark\:ring-gray-400\/30{--tw-ring-color:#99a1af4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)30%,transparent)}}.dark .dark\:ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.dark .dark\:ring-green-400\/20{--tw-ring-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-400)20%,transparent)}}.dark .dark\:ring-green-400\/30{--tw-ring-color:#05df724d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-green-400)30%,transparent)}}.dark .dark\:ring-green-500\/20{--tw-ring-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.dark .dark\:ring-orange-500\/20{--tw-ring-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-orange-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.dark .dark\:ring-purple-500\/20{--tw-ring-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-purple-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.dark .dark\:ring-red-400\/20{--tw-ring-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-400)20%,transparent)}}.dark .dark\:ring-red-400\/30{--tw-ring-color:#ff65684d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-red-400)30%,transparent)}}.dark .dark\:ring-red-500\/20{--tw-ring-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark .dark\:ring-yellow-400\/30{--tw-ring-color:#fac8004d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-yellow-400)30%,transparent)}}.dark .dark\:ring-yellow-500\/20{--tw-ring-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}@media (hover:hover){.dark .dark\:hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.dark .dark\:hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.dark .dark\:hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.dark .dark\:hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.dark .dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark .dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark .dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark .dark\:hover\:bg-red-700:hover{background-color:var(--color-red-700)}.dark .dark\:hover\:bg-red-800:hover{background-color:var(--color-red-800)}.dark .dark\:hover\:text-blue-300:hover{color:var(--color-blue-300)}.dark .dark\:hover\:text-gray-100:hover{color:var(--color-gray-100)}.dark .dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark .dark\:hover\:text-green-300:hover{color:var(--color-green-300)}.dark .dark\:hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.dark .dark\:hover\:text-red-300:hover{color:var(--color-red-300)}.dark .dark\:hover\:text-white:hover{color:var(--color-white)}}.dark .dark\:focus\:bg-red-700:focus{background-color:var(--color-red-700)}.dark .dark\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/webapp/assets/_app/immutable/assets/_layout.pWW488Rd.css b/webapp/assets/_app/immutable/assets/_layout.pWW488Rd.css deleted file mode 100644 index 362cac43..00000000 --- a/webapp/assets/_app/immutable/assets/_layout.pWW488Rd.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-50:oklch(98% .016 73.684);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-900:oklch(35.9% .144 278.697);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-full{right:100%}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-full{left:100%}.z-0{z-index:0}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.-mr-0\.5{margin-right:calc(var(--spacing)*-.5)}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-12{margin-right:calc(var(--spacing)*-12)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-2\.5{margin-right:calc(var(--spacing)*2.5)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-0\.5{margin-left:calc(var(--spacing)*-.5)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0{height:calc(var(--spacing)*0)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-24{height:calc(var(--spacing)*24)}.h-48{height:calc(var(--spacing)*48)}.h-full{height:100%}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[90vh\]{max-height:90vh}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-64{width:calc(var(--spacing)*64)}.w-80{width:calc(var(--spacing)*80)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing)*0)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}:where(.-space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(-1px*var(--tw-space-y-reverse));margin-block-end:calc(-1px*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{-moz-column-gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*4)}:where(.-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px*var(--tw-space-x-reverse));margin-inline-end:calc(-1px*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-6{row-gap:calc(var(--spacing)*6)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-gray-900{border-top-color:var(--color-gray-900)}.border-r-gray-900{border-right-color:var(--color-gray-900)}.border-b-gray-900{border-bottom-color:var(--color-gray-900)}.border-l-gray-900{border-left-color:var(--color-gray-900)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-900{background-color:var(--color-red-900)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-20{padding-top:calc(var(--spacing)*20)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.text-black{color:var(--color-black)}.text-blue-400{color:var(--color-blue-400)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-indigo-600{color:var(--color-indigo-600)}.text-orange-700{color:var(--color-orange-700)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-blue-600\/20{--tw-ring-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.ring-blue-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.ring-gray-600\/20{--tw-ring-color:#4a556533}@supports (color:color-mix(in lab,red,red)){.ring-gray-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-600)20%,transparent)}}.ring-green-200{--tw-ring-color:var(--color-green-200)}.ring-green-600\/20{--tw-ring-color:#00a54433}@supports (color:color-mix(in lab,red,red)){.ring-green-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-600)20%,transparent)}}.ring-orange-600\/20{--tw-ring-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.ring-orange-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-600)20%,transparent)}}.ring-purple-600\/20{--tw-ring-color:#9810fa33}@supports (color:color-mix(in lab,red,red)){.ring-purple-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-600)20%,transparent)}}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-red-600\/20{--tw-ring-color:#e4001433}@supports (color:color-mix(in lab,red,red)){.ring-red-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-600)20%,transparent)}}.ring-yellow-200{--tw-ring-color:var(--color-yellow-200)}.ring-yellow-600\/20{--tw-ring-color:#cd890033}@supports (color:color-mix(in lab,red,red)){.ring-yellow-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-600)20%,transparent)}}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-green-500:hover{color:var(--color-green-500)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-indigo-900:hover{color:var(--color-indigo-900)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-900:hover{color:var(--color-red-900)}.hover\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\:text-yellow-500:hover{color:var(--color-yellow-500)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:z-10:focus{z-index:10}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:bg-red-200:focus{background-color:var(--color-red-200)}.focus\:placeholder-gray-400:focus::-moz-placeholder{color:var(--color-gray-400)}.focus\:placeholder-gray-400:focus::placeholder{color:var(--color-gray-400)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-400:disabled{background-color:var(--color-gray-400)}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:bg-gray-400:disabled:hover{background-color:var(--color-gray-400)}}@media (min-width:640px){.sm\:mx-auto{margin-inline:auto}.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:ml-4{margin-left:calc(var(--spacing)*4)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-full{width:100%}.sm\:max-w-md{max-width:var(--container-md)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:px-10{padding-inline:calc(var(--spacing)*10)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:768px){.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.md\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}}@media (min-width:1024px){.lg\:fixed{position:fixed}.lg\:inset-y-0{inset-block:calc(var(--spacing)*0)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-64{width:calc(var(--spacing)*64)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:pt-6{padding-top:calc(var(--spacing)*6)}.lg\:pl-64{padding-left:calc(var(--spacing)*64)}}.dark .dark\:block{display:block}.dark .dark\:hidden{display:none}:where(.dark .dark\:divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}.dark .dark\:border-blue-700{border-color:var(--color-blue-700)}.dark .dark\:border-blue-800{border-color:var(--color-blue-800)}.dark .dark\:border-gray-600{border-color:var(--color-gray-600)}.dark .dark\:border-gray-700{border-color:var(--color-gray-700)}.dark .dark\:border-green-700{border-color:var(--color-green-700)}.dark .dark\:border-red-500{border-color:var(--color-red-500)}.dark .dark\:border-red-600{border-color:var(--color-red-600)}.dark .dark\:border-red-700{border-color:var(--color-red-700)}.dark .dark\:border-red-800{border-color:var(--color-red-800)}.dark .dark\:border-yellow-700{border-color:var(--color-yellow-700)}.dark .dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark .dark\:bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.dark .dark\:bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark .dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark .dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900)50%,transparent)}}.dark .dark\:bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-500\/10{background-color:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.dark .dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark .dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark .dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark .dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark .dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark .dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.dark .dark\:bg-green-900{background-color:var(--color-green-900)}.dark .dark\:bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900)50%,transparent)}}.dark .dark\:bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.dark .dark\:bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.dark .dark\:bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.dark .dark\:bg-red-700{background-color:var(--color-red-700)}.dark .dark\:bg-red-800{background-color:var(--color-red-800)}.dark .dark\:bg-red-900{background-color:var(--color-red-900)}.dark .dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark .dark\:bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.dark .dark\:bg-yellow-900{background-color:var(--color-yellow-900)}.dark .dark\:bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900)20%,transparent)}}.dark .dark\:from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:text-blue-200{color:var(--color-blue-200)}.dark .dark\:text-blue-300{color:var(--color-blue-300)}.dark .dark\:text-blue-400{color:var(--color-blue-400)}.dark .dark\:text-gray-200{color:var(--color-gray-200)}.dark .dark\:text-gray-300{color:var(--color-gray-300)}.dark .dark\:text-gray-400{color:var(--color-gray-400)}.dark .dark\:text-gray-500{color:var(--color-gray-500)}.dark .dark\:text-green-200{color:var(--color-green-200)}.dark .dark\:text-green-300{color:var(--color-green-300)}.dark .dark\:text-green-400{color:var(--color-green-400)}.dark .dark\:text-indigo-400{color:var(--color-indigo-400)}.dark .dark\:text-orange-400{color:var(--color-orange-400)}.dark .dark\:text-purple-400{color:var(--color-purple-400)}.dark .dark\:text-red-100{color:var(--color-red-100)}.dark .dark\:text-red-200{color:var(--color-red-200)}.dark .dark\:text-red-300{color:var(--color-red-300)}.dark .dark\:text-red-400{color:var(--color-red-400)}.dark .dark\:text-white{color:var(--color-white)}.dark .dark\:text-yellow-200{color:var(--color-yellow-200)}.dark .dark\:text-yellow-300{color:var(--color-yellow-300)}.dark .dark\:text-yellow-400{color:var(--color-yellow-400)}.dark .dark\:placeholder-gray-400::-moz-placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-400::placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-500::-moz-placeholder{color:var(--color-gray-500)}.dark .dark\:placeholder-gray-500::placeholder{color:var(--color-gray-500)}.dark .dark\:ring-blue-400\/20{--tw-ring-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.dark .dark\:ring-blue-400\/30{--tw-ring-color:#54a2ff4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)30%,transparent)}}.dark .dark\:ring-blue-500\/20{--tw-ring-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-blue-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.dark .dark\:ring-gray-400\/20{--tw-ring-color:#99a1af33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)20%,transparent)}}.dark .dark\:ring-gray-400\/30{--tw-ring-color:#99a1af4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)30%,transparent)}}.dark .dark\:ring-gray-500\/20{--tw-ring-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.dark .dark\:ring-green-400\/20{--tw-ring-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-400)20%,transparent)}}.dark .dark\:ring-green-400\/30{--tw-ring-color:#05df724d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-green-400)30%,transparent)}}.dark .dark\:ring-green-500\/20{--tw-ring-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-green-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.dark .dark\:ring-orange-500\/20{--tw-ring-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-orange-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.dark .dark\:ring-purple-500\/20{--tw-ring-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-purple-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.dark .dark\:ring-red-400\/20{--tw-ring-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-400)20%,transparent)}}.dark .dark\:ring-red-400\/30{--tw-ring-color:#ff65684d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-red-400)30%,transparent)}}.dark .dark\:ring-red-500\/20{--tw-ring-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-red-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark .dark\:ring-yellow-400\/30{--tw-ring-color:#fac8004d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-400\/30{--tw-ring-color:color-mix(in oklab,var(--color-yellow-400)30%,transparent)}}.dark .dark\:ring-yellow-500\/20{--tw-ring-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.dark .dark\:ring-yellow-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}@media (hover:hover){.dark .dark\:hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.dark .dark\:hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.dark .dark\:hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.dark .dark\:hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.dark .dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark .dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark .dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark .dark\:hover\:bg-red-700:hover{background-color:var(--color-red-700)}.dark .dark\:hover\:bg-red-800:hover{background-color:var(--color-red-800)}.dark .dark\:hover\:text-blue-300:hover{color:var(--color-blue-300)}.dark .dark\:hover\:text-gray-100:hover{color:var(--color-gray-100)}.dark .dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark .dark\:hover\:text-green-300:hover{color:var(--color-green-300)}.dark .dark\:hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.dark .dark\:hover\:text-red-300:hover{color:var(--color-red-300)}.dark .dark\:hover\:text-white:hover{color:var(--color-white)}}.dark .dark\:focus\:bg-red-700:focus{background-color:var(--color-red-700)}.dark .dark\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/webapp/assets/_app/immutable/chunks/-esynYXT.js b/webapp/assets/_app/immutable/chunks/-esynYXT.js deleted file mode 100644 index ac1e7e0b..00000000 --- a/webapp/assets/_app/immutable/chunks/-esynYXT.js +++ /dev/null @@ -1,7 +0,0 @@ -import{b as Tr,r as Br}from"./D0m048VH.js";import"./DsnmJJEf.js";import{i as Dr}from"./DT0EGONV.js";import{t as Ie,K as Y,L as Ke,aj as Lr,aW as jr,T as ht,a3 as kr,af as zr,aX as Fr,aY as Gr,aZ as ut,Y as _r,a_ as qr,Z as we,M as Jt,ae as Xe,P as Kt,F as ot,a8 as Hr,a$ as $r,b0 as Nr,aw as Wr,W as Qr,b1 as Mr,b2 as Jr,b3 as Kr,b4 as Xr,g as k,b5 as Yr,b6 as Zr,a2 as Ot,b7 as es,b8 as ts,b9 as rs,ba as ss,bb as as,at as os,bc as ns,bd as ls,be as is,p as cs,E as ps,l as ee,a as ds,f as hs,e as us,c as ue,d as Os,n as oe,m as te,s as re,j as qe,k as Pt,r as He,C as nt,B as Ps,b as bs}from"./CRKWEg6v.js";import{l as bt,p as se,i as $e}from"./e1m7WRO5.js";function mt(t,e,r=!1,s=!1,o=!1){var a=t,n="";Ie(()=>{var l=Lr;if(n===(n=e()??"")){Y&&Ke();return}if(l.nodes_start!==null&&(jr(l.nodes_start,l.nodes_end),l.nodes_start=l.nodes_end=null),n!==""){if(Y){ht.data;for(var i=Ke(),c=i;i!==null&&(i.nodeType!==kr||i.data!=="");)c=i,i=zr(i);if(i===null)throw Fr(),Gr;ut(ht,c),a=_r(i);return}var p=n+"";r?p=`${p}`:s&&(p=`${p}`);var R=qr(p);if((r||s)&&(R=we(R)),ut(we(R),R.lastChild),r||s)for(;we(R);)a.before(we(R));else a.before(R)}})}function ms(t,e,r,s,o){Y&&Ke();var a=e.$$slots?.[r],n=!1;a===!0&&(a=e[r==="default"?"children":r],n=!0),a===void 0||a(t,n?()=>s:s)}function Vs(t,e){var r=void 0,s;Jt(()=>{r!==(r=e())&&(s&&(Xe(s),s=null),r&&(s=Kt(()=>{ot(()=>r(t))})))})}function Xt(t){var e,r,s="";if(typeof t=="string"||typeof t=="number")s+=t;else if(typeof t=="object")if(Array.isArray(t)){var o=t.length;for(e=0;e=0;){var l=n+a;(n===0||Vt.includes(s[n-1]))&&(l===s.length||Vt.includes(s[l]))?s=(n===0?"":s.substring(0,n))+s.substring(l+1):n=l}}return s===""?null:s}function St(t,e=!1){var r=e?" !important;":";",s="";for(var o in t){var a=t[o];a!=null&&a!==""&&(s+=" "+o+": "+a+r)}return s}function Ne(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function fs(t,e){if(e){var r="",s,o;if(Array.isArray(e)?(s=e[0],o=e[1]):s=e,t){t=String(t).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var a=!1,n=0,l=!1,i=[];s&&i.push(...Object.keys(s).map(Ne)),o&&i.push(...Object.keys(o).map(Ne));var c=0,p=-1;const y=t.length;for(var R=0;R{Ce(t,t.__value)});e.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Wr(()=>{e.disconnect()})}function Do(t,e,r=e){var s=!0;Qr(t,"change",o=>{var a=o?"[selected]":":checked",n;if(t.multiple)n=[].map.call(t.querySelectorAll(a),me);else{var l=t.querySelector(a)??t.querySelector("option:not([disabled])");n=l&&me(l)}r(n)}),ot(()=>{var o=e();if(Ce(t,o,s),s&&o===void 0){var a=t.querySelector(":checked");a!==null&&(o=me(a),r(o))}t.__value=o,s=!1}),Yt(t)}function me(t){return"__value"in t?t.__value:t.value}const Oe=Symbol("class"),Pe=Symbol("style"),Zt=Symbol("is custom element"),er=Symbol("is html");function Lo(t){if(Y){var e=!1,r=()=>{if(!e){if(e=!0,t.hasAttribute("value")){var s=t.value;Ue(t,"value",null),t.value=s}if(t.hasAttribute("checked")){var o=t.checked;Ue(t,"checked",null),t.checked=o}}};t.__on_r=r,ns(r),ls()}}function jo(t,e){var r=lt(t);r.value===(r.value=e??void 0)||t.value===e&&(e!==0||t.nodeName!=="PROGRESS")||(t.value=e??"")}function ws(t,e){e?t.hasAttribute("selected")||t.setAttribute("selected",""):t.removeAttribute("selected")}function Ue(t,e,r,s){var o=lt(t);Y&&(o[e]=t.getAttribute(e),e==="src"||e==="srcset"||e==="href"&&t.nodeName==="LINK")||o[e]!==(o[e]=r)&&(e==="loading"&&(t[Jr]=r),r==null?t.removeAttribute(e):typeof r!="string"&&tr(t).includes(e)?t[e]=r:t.setAttribute(e,r))}function Is(t,e,r,s,o=!1){var a=lt(t),n=a[Zt],l=!a[er];let i=Y&&n;i&&Ot(!1);var c=e||{},p=t.tagName==="OPTION";for(var R in e)R in r||(r[R]=null);r.class?r.class=As(r.class):r[Oe]&&(r.class=null),r[Pe]&&(r.style??=null);var I=tr(t);for(const E in r){let v=r[E];if(p&&E==="value"&&v==null){t.value=t.__value="",c[E]=v;continue}if(E==="class"){var T=t.namespaceURI==="http://www.w3.org/1999/xhtml";Ee(t,T,v,s,e?.[Oe],r[Oe]),c[E]=v,c[Oe]=r[Oe];continue}if(E==="style"){ys(t,v,e?.[Pe],r[Pe]),c[E]=v,c[Pe]=r[Pe];continue}var f=c[E];if(!(v===f&&!(v===void 0&&t.hasAttribute(E)))){c[E]=v;var y=E[0]+E[1];if(y!=="$$")if(y==="on"){const U={},L="$$"+E;let B=E.slice(2);var w=is(B);if(es(B)&&(B=B.slice(0,-7),U.capture=!0),!w&&f){if(v!=null)continue;t.removeEventListener(B,c[L],U),c[L]=null}if(v!=null)if(w)t[`__${B}`]=v,rs([B]);else{let Z=function(ce){c[E].call(this,ce)};c[L]=ts(B,t,Z,U)}else w&&(t[`__${B}`]=void 0)}else if(E==="style")Ue(t,E,v);else if(E==="autofocus")ss(t,!!v);else if(!n&&(E==="__value"||E==="value"&&v!=null))t.value=t.__value=v;else if(E==="selected"&&p)ws(t,v);else{var C=E;l||(C=as(C));var D=C==="defaultValue"||C==="defaultChecked";if(v==null&&!n&&!D)if(a[E]=null,C==="value"||C==="checked"){let U=t;const L=e===void 0;if(C==="value"){let B=U.defaultValue;U.removeAttribute(C),U.defaultValue=B,U.value=U.__value=L?B:null}else{let B=U.defaultChecked;U.removeAttribute(C),U.defaultChecked=B,U.checked=L?B:!1}}else t.removeAttribute(E);else D||I.includes(C)&&(n||typeof v!="string")?(t[C]=v,C in a&&(a[C]=os)):typeof v!="function"&&Ue(t,C,v)}}}return i&&Ot(!0),c}function Es(t,e,r=[],s=[],o,a=!1){Mr(r,s,n=>{var l=void 0,i={},c=t.nodeName==="SELECT",p=!1;if(Jt(()=>{var I=e(...n.map(k)),T=Is(t,l,I,o,a);p&&c&&"value"in I&&Ce(t,I.value);for(let y of Object.getOwnPropertySymbols(i))I[y]||Xe(i[y]);for(let y of Object.getOwnPropertySymbols(I)){var f=I[y];y.description===Yr&&(!l||f!==l[y])&&(i[y]&&Xe(i[y]),i[y]=Kt(()=>Vs(t,()=>f))),T[y]=f}l=T}),c){var R=t;ot(()=>{Ce(R,l.value,!0),Yt(R)})}p=!0})}function lt(t){return t.__attributes??={[Zt]:t.nodeName.includes("-"),[er]:t.namespaceURI===Kr}}var At=new Map;function tr(t){var e=At.get(t.nodeName);if(e)return e;At.set(t.nodeName,e=[]);for(var r,s=t,o=Element.prototype;o!==s;){r=Zr(s);for(var a in r)r[a].set&&e.push(a);s=Xr(s)}return e}function ko(t,e){return Tr+Br(t,e)}function rr(t,e){return function(){return t.apply(e,arguments)}}const{toString:gs}=Object.prototype,{getPrototypeOf:it}=Object,{iterator:De,toStringTag:sr}=Symbol,Le=(t=>e=>{const r=gs.call(e);return t[r]||(t[r]=r.slice(8,-1).toLowerCase())})(Object.create(null)),N=t=>(t=t.toLowerCase(),e=>Le(e)===t),je=t=>e=>typeof e===t,{isArray:de}=Array,Ve=je("undefined");function Se(t){return t!==null&&!Ve(t)&&t.constructor!==null&&!Ve(t.constructor)&&_(t.constructor.isBuffer)&&t.constructor.isBuffer(t)}const ar=N("ArrayBuffer");function xs(t){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(t):e=t&&t.buffer&&ar(t.buffer),e}const vs=je("string"),_=je("function"),or=je("number"),Ae=t=>t!==null&&typeof t=="object",Cs=t=>t===!0||t===!1,ge=t=>{if(Le(t)!=="object")return!1;const e=it(t);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(sr in t)&&!(De in t)},Us=t=>{if(!Ae(t)||Se(t))return!1;try{return Object.keys(t).length===0&&Object.getPrototypeOf(t)===Object.prototype}catch{return!1}},Ts=N("Date"),Bs=N("File"),Ds=N("Blob"),Ls=N("FileList"),js=t=>Ae(t)&&_(t.pipe),ks=t=>{let e;return t&&(typeof FormData=="function"&&t instanceof FormData||_(t.append)&&((e=Le(t))==="formdata"||e==="object"&&_(t.toString)&&t.toString()==="[object FormData]"))},zs=N("URLSearchParams"),[Fs,Gs,_s,qs]=["ReadableStream","Request","Response","Headers"].map(N),Hs=t=>t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Re(t,e,{allOwnKeys:r=!1}={}){if(t===null||typeof t>"u")return;let s,o;if(typeof t!="object"&&(t=[t]),de(t))for(s=0,o=t.length;s0;)if(o=r[s],e===o.toLowerCase())return o;return null}const ne=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,lr=t=>!Ve(t)&&t!==ne;function Ye(){const{caseless:t}=lr(this)&&this||{},e={},r=(s,o)=>{const a=t&&nr(e,o)||o;ge(e[a])&&ge(s)?e[a]=Ye(e[a],s):ge(s)?e[a]=Ye({},s):de(s)?e[a]=s.slice():e[a]=s};for(let s=0,o=arguments.length;s(Re(e,(o,a)=>{r&&_(o)?t[a]=rr(o,r):t[a]=o},{allOwnKeys:s}),t),Ns=t=>(t.charCodeAt(0)===65279&&(t=t.slice(1)),t),Ws=(t,e,r,s)=>{t.prototype=Object.create(e.prototype,s),t.prototype.constructor=t,Object.defineProperty(t,"super",{value:e.prototype}),r&&Object.assign(t.prototype,r)},Qs=(t,e,r,s)=>{let o,a,n;const l={};if(e=e||{},t==null)return e;do{for(o=Object.getOwnPropertyNames(t),a=o.length;a-- >0;)n=o[a],(!s||s(n,t,e))&&!l[n]&&(e[n]=t[n],l[n]=!0);t=r!==!1&&it(t)}while(t&&(!r||r(t,e))&&t!==Object.prototype);return e},Ms=(t,e,r)=>{t=String(t),(r===void 0||r>t.length)&&(r=t.length),r-=e.length;const s=t.indexOf(e,r);return s!==-1&&s===r},Js=t=>{if(!t)return null;if(de(t))return t;let e=t.length;if(!or(e))return null;const r=new Array(e);for(;e-- >0;)r[e]=t[e];return r},Ks=(t=>e=>t&&e instanceof t)(typeof Uint8Array<"u"&&it(Uint8Array)),Xs=(t,e)=>{const s=(t&&t[De]).call(t);let o;for(;(o=s.next())&&!o.done;){const a=o.value;e.call(t,a[0],a[1])}},Ys=(t,e)=>{let r;const s=[];for(;(r=t.exec(e))!==null;)s.push(r);return s},Zs=N("HTMLFormElement"),ea=t=>t.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(r,s,o){return s.toUpperCase()+o}),Rt=(({hasOwnProperty:t})=>(e,r)=>t.call(e,r))(Object.prototype),ta=N("RegExp"),ir=(t,e)=>{const r=Object.getOwnPropertyDescriptors(t),s={};Re(r,(o,a)=>{let n;(n=e(o,a,t))!==!1&&(s[a]=n||o)}),Object.defineProperties(t,s)},ra=t=>{ir(t,(e,r)=>{if(_(t)&&["arguments","caller","callee"].indexOf(r)!==-1)return!1;const s=t[r];if(_(s)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")})}})},sa=(t,e)=>{const r={},s=o=>{o.forEach(a=>{r[a]=!0})};return de(t)?s(t):s(String(t).split(e)),r},aa=()=>{},oa=(t,e)=>t!=null&&Number.isFinite(t=+t)?t:e;function na(t){return!!(t&&_(t.append)&&t[sr]==="FormData"&&t[De])}const la=t=>{const e=new Array(10),r=(s,o)=>{if(Ae(s)){if(e.indexOf(s)>=0)return;if(Se(s))return s;if(!("toJSON"in s)){e[o]=s;const a=de(s)?[]:{};return Re(s,(n,l)=>{const i=r(n,o+1);!Ve(i)&&(a[l]=i)}),e[o]=void 0,a}}return s};return r(t,0)},ia=N("AsyncFunction"),ca=t=>t&&(Ae(t)||_(t))&&_(t.then)&&_(t.catch),cr=((t,e)=>t?setImmediate:e?((r,s)=>(ne.addEventListener("message",({source:o,data:a})=>{o===ne&&a===r&&s.length&&s.shift()()},!1),o=>{s.push(o),ne.postMessage(r,"*")}))(`axios@${Math.random()}`,[]):r=>setTimeout(r))(typeof setImmediate=="function",_(ne.postMessage)),pa=typeof queueMicrotask<"u"?queueMicrotask.bind(ne):typeof process<"u"&&process.nextTick||cr,da=t=>t!=null&&_(t[De]),h={isArray:de,isArrayBuffer:ar,isBuffer:Se,isFormData:ks,isArrayBufferView:xs,isString:vs,isNumber:or,isBoolean:Cs,isObject:Ae,isPlainObject:ge,isEmptyObject:Us,isReadableStream:Fs,isRequest:Gs,isResponse:_s,isHeaders:qs,isUndefined:Ve,isDate:Ts,isFile:Bs,isBlob:Ds,isRegExp:ta,isFunction:_,isStream:js,isURLSearchParams:zs,isTypedArray:Ks,isFileList:Ls,forEach:Re,merge:Ye,extend:$s,trim:Hs,stripBOM:Ns,inherits:Ws,toFlatObject:Qs,kindOf:Le,kindOfTest:N,endsWith:Ms,toArray:Js,forEachEntry:Xs,matchAll:Ys,isHTMLForm:Zs,hasOwnProperty:Rt,hasOwnProp:Rt,reduceDescriptors:ir,freezeMethods:ra,toObjectSet:sa,toCamelCase:ea,noop:aa,toFiniteNumber:oa,findKey:nr,global:ne,isContextDefined:lr,isSpecCompliantForm:na,toJSONObject:la,isAsyncFn:ia,isThenable:ca,setImmediate:cr,asap:pa,isIterable:da};function g(t,e,r,s,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=t,this.name="AxiosError",e&&(this.code=e),r&&(this.config=r),s&&(this.request=s),o&&(this.response=o,this.status=o.status?o.status:null)}h.inherits(g,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:h.toJSONObject(this.config),code:this.code,status:this.status}}});const pr=g.prototype,dr={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(t=>{dr[t]={value:t}});Object.defineProperties(g,dr);Object.defineProperty(pr,"isAxiosError",{value:!0});g.from=(t,e,r,s,o,a)=>{const n=Object.create(pr);return h.toFlatObject(t,n,function(i){return i!==Error.prototype},l=>l!=="isAxiosError"),g.call(n,t.message,e,r,s,o),n.cause=t,n.name=t.name,a&&Object.assign(n,a),n};const ha=null;function Ze(t){return h.isPlainObject(t)||h.isArray(t)}function hr(t){return h.endsWith(t,"[]")?t.slice(0,-2):t}function ft(t,e,r){return t?t.concat(e).map(function(o,a){return o=hr(o),!r&&a?"["+o+"]":o}).join(r?".":""):e}function ua(t){return h.isArray(t)&&!t.some(Ze)}const Oa=h.toFlatObject(h,{},null,function(e){return/^is[A-Z]/.test(e)});function ke(t,e,r){if(!h.isObject(t))throw new TypeError("target must be an object");e=e||new FormData,r=h.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,w){return!h.isUndefined(w[y])});const s=r.metaTokens,o=r.visitor||p,a=r.dots,n=r.indexes,i=(r.Blob||typeof Blob<"u"&&Blob)&&h.isSpecCompliantForm(e);if(!h.isFunction(o))throw new TypeError("visitor must be a function");function c(f){if(f===null)return"";if(h.isDate(f))return f.toISOString();if(h.isBoolean(f))return f.toString();if(!i&&h.isBlob(f))throw new g("Blob is not supported. Use a Buffer instead.");return h.isArrayBuffer(f)||h.isTypedArray(f)?i&&typeof Blob=="function"?new Blob([f]):Buffer.from(f):f}function p(f,y,w){let C=f;if(f&&!w&&typeof f=="object"){if(h.endsWith(y,"{}"))y=s?y:y.slice(0,-2),f=JSON.stringify(f);else if(h.isArray(f)&&ua(f)||(h.isFileList(f)||h.endsWith(y,"[]"))&&(C=h.toArray(f)))return y=hr(y),C.forEach(function(E,v){!(h.isUndefined(E)||E===null)&&e.append(n===!0?ft([y],v,a):n===null?y:y+"[]",c(E))}),!1}return Ze(f)?!0:(e.append(ft(w,y,a),c(f)),!1)}const R=[],I=Object.assign(Oa,{defaultVisitor:p,convertValue:c,isVisitable:Ze});function T(f,y){if(!h.isUndefined(f)){if(R.indexOf(f)!==-1)throw Error("Circular reference detected in "+y.join("."));R.push(f),h.forEach(f,function(C,D){(!(h.isUndefined(C)||C===null)&&o.call(e,C,h.isString(D)?D.trim():D,y,I))===!0&&T(C,y?y.concat(D):[D])}),R.pop()}}if(!h.isObject(t))throw new TypeError("data must be an object");return T(t),e}function yt(t){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(t).replace(/[!'()~]|%20|%00/g,function(s){return e[s]})}function ct(t,e){this._pairs=[],t&&ke(t,this,e)}const ur=ct.prototype;ur.append=function(e,r){this._pairs.push([e,r])};ur.toString=function(e){const r=e?function(s){return e.call(this,s,yt)}:yt;return this._pairs.map(function(o){return r(o[0])+"="+r(o[1])},"").join("&")};function Pa(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Or(t,e,r){if(!e)return t;const s=r&&r.encode||Pa;h.isFunction(r)&&(r={serialize:r});const o=r&&r.serialize;let a;if(o?a=o(e,r):a=h.isURLSearchParams(e)?e.toString():new ct(e,r).toString(s),a){const n=t.indexOf("#");n!==-1&&(t=t.slice(0,n)),t+=(t.indexOf("?")===-1?"?":"&")+a}return t}class wt{constructor(){this.handlers=[]}use(e,r,s){return this.handlers.push({fulfilled:e,rejected:r,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){h.forEach(this.handlers,function(s){s!==null&&e(s)})}}const Pr={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},ba=typeof URLSearchParams<"u"?URLSearchParams:ct,ma=typeof FormData<"u"?FormData:null,Va=typeof Blob<"u"?Blob:null,Sa={isBrowser:!0,classes:{URLSearchParams:ba,FormData:ma,Blob:Va},protocols:["http","https","file","blob","url","data"]},pt=typeof window<"u"&&typeof document<"u",et=typeof navigator=="object"&&navigator||void 0,Aa=pt&&(!et||["ReactNative","NativeScript","NS"].indexOf(et.product)<0),Ra=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",fa=pt&&window.location.href||"http://localhost",ya=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:pt,hasStandardBrowserEnv:Aa,hasStandardBrowserWebWorkerEnv:Ra,navigator:et,origin:fa},Symbol.toStringTag,{value:"Module"})),G={...ya,...Sa};function wa(t,e){return ke(t,new G.classes.URLSearchParams,{visitor:function(r,s,o,a){return G.isNode&&h.isBuffer(r)?(this.append(s,r.toString("base64")),!1):a.defaultVisitor.apply(this,arguments)},...e})}function Ia(t){return h.matchAll(/\w+|\[(\w*)]/g,t).map(e=>e[0]==="[]"?"":e[1]||e[0])}function Ea(t){const e={},r=Object.keys(t);let s;const o=r.length;let a;for(s=0;s=r.length;return n=!n&&h.isArray(o)?o.length:n,i?(h.hasOwnProp(o,n)?o[n]=[o[n],s]:o[n]=s,!l):((!o[n]||!h.isObject(o[n]))&&(o[n]=[]),e(r,s,o[n],a)&&h.isArray(o[n])&&(o[n]=Ea(o[n])),!l)}if(h.isFormData(t)&&h.isFunction(t.entries)){const r={};return h.forEachEntry(t,(s,o)=>{e(Ia(s),o,r,0)}),r}return null}function ga(t,e,r){if(h.isString(t))try{return(e||JSON.parse)(t),h.trim(t)}catch(s){if(s.name!=="SyntaxError")throw s}return(r||JSON.stringify)(t)}const fe={transitional:Pr,adapter:["xhr","http","fetch"],transformRequest:[function(e,r){const s=r.getContentType()||"",o=s.indexOf("application/json")>-1,a=h.isObject(e);if(a&&h.isHTMLForm(e)&&(e=new FormData(e)),h.isFormData(e))return o?JSON.stringify(br(e)):e;if(h.isArrayBuffer(e)||h.isBuffer(e)||h.isStream(e)||h.isFile(e)||h.isBlob(e)||h.isReadableStream(e))return e;if(h.isArrayBufferView(e))return e.buffer;if(h.isURLSearchParams(e))return r.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let l;if(a){if(s.indexOf("application/x-www-form-urlencoded")>-1)return wa(e,this.formSerializer).toString();if((l=h.isFileList(e))||s.indexOf("multipart/form-data")>-1){const i=this.env&&this.env.FormData;return ke(l?{"files[]":e}:e,i&&new i,this.formSerializer)}}return a||o?(r.setContentType("application/json",!1),ga(e)):e}],transformResponse:[function(e){const r=this.transitional||fe.transitional,s=r&&r.forcedJSONParsing,o=this.responseType==="json";if(h.isResponse(e)||h.isReadableStream(e))return e;if(e&&h.isString(e)&&(s&&!this.responseType||o)){const n=!(r&&r.silentJSONParsing)&&o;try{return JSON.parse(e)}catch(l){if(n)throw l.name==="SyntaxError"?g.from(l,g.ERR_BAD_RESPONSE,this,null,this.response):l}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:G.classes.FormData,Blob:G.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};h.forEach(["delete","get","head","post","put","patch"],t=>{fe.headers[t]={}});const xa=h.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),va=t=>{const e={};let r,s,o;return t&&t.split(` -`).forEach(function(n){o=n.indexOf(":"),r=n.substring(0,o).trim().toLowerCase(),s=n.substring(o+1).trim(),!(!r||e[r]&&xa[r])&&(r==="set-cookie"?e[r]?e[r].push(s):e[r]=[s]:e[r]=e[r]?e[r]+", "+s:s)}),e},It=Symbol("internals");function be(t){return t&&String(t).trim().toLowerCase()}function xe(t){return t===!1||t==null?t:h.isArray(t)?t.map(xe):String(t)}function Ca(t){const e=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=r.exec(t);)e[s[1]]=s[2];return e}const Ua=t=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(t.trim());function Qe(t,e,r,s,o){if(h.isFunction(s))return s.call(this,e,r);if(o&&(e=r),!!h.isString(e)){if(h.isString(s))return e.indexOf(s)!==-1;if(h.isRegExp(s))return s.test(e)}}function Ta(t){return t.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,r,s)=>r.toUpperCase()+s)}function Ba(t,e){const r=h.toCamelCase(" "+e);["get","set","has"].forEach(s=>{Object.defineProperty(t,s+r,{value:function(o,a,n){return this[s].call(this,e,o,a,n)},configurable:!0})})}let q=class{constructor(e){e&&this.set(e)}set(e,r,s){const o=this;function a(l,i,c){const p=be(i);if(!p)throw new Error("header name must be a non-empty string");const R=h.findKey(o,p);(!R||o[R]===void 0||c===!0||c===void 0&&o[R]!==!1)&&(o[R||i]=xe(l))}const n=(l,i)=>h.forEach(l,(c,p)=>a(c,p,i));if(h.isPlainObject(e)||e instanceof this.constructor)n(e,r);else if(h.isString(e)&&(e=e.trim())&&!Ua(e))n(va(e),r);else if(h.isObject(e)&&h.isIterable(e)){let l={},i,c;for(const p of e){if(!h.isArray(p))throw TypeError("Object iterator must return a key-value pair");l[c=p[0]]=(i=l[c])?h.isArray(i)?[...i,p[1]]:[i,p[1]]:p[1]}n(l,r)}else e!=null&&a(r,e,s);return this}get(e,r){if(e=be(e),e){const s=h.findKey(this,e);if(s){const o=this[s];if(!r)return o;if(r===!0)return Ca(o);if(h.isFunction(r))return r.call(this,o,s);if(h.isRegExp(r))return r.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,r){if(e=be(e),e){const s=h.findKey(this,e);return!!(s&&this[s]!==void 0&&(!r||Qe(this,this[s],s,r)))}return!1}delete(e,r){const s=this;let o=!1;function a(n){if(n=be(n),n){const l=h.findKey(s,n);l&&(!r||Qe(s,s[l],l,r))&&(delete s[l],o=!0)}}return h.isArray(e)?e.forEach(a):a(e),o}clear(e){const r=Object.keys(this);let s=r.length,o=!1;for(;s--;){const a=r[s];(!e||Qe(this,this[a],a,e,!0))&&(delete this[a],o=!0)}return o}normalize(e){const r=this,s={};return h.forEach(this,(o,a)=>{const n=h.findKey(s,a);if(n){r[n]=xe(o),delete r[a];return}const l=e?Ta(a):String(a).trim();l!==a&&delete r[a],r[l]=xe(o),s[l]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const r=Object.create(null);return h.forEach(this,(s,o)=>{s!=null&&s!==!1&&(r[o]=e&&h.isArray(s)?s.join(", "):s)}),r}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,r])=>e+": "+r).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...r){const s=new this(e);return r.forEach(o=>s.set(o)),s}static accessor(e){const s=(this[It]=this[It]={accessors:{}}).accessors,o=this.prototype;function a(n){const l=be(n);s[l]||(Ba(o,n),s[l]=!0)}return h.isArray(e)?e.forEach(a):a(e),this}};q.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);h.reduceDescriptors(q.prototype,({value:t},e)=>{let r=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(s){this[r]=s}}});h.freezeMethods(q);function Me(t,e){const r=this||fe,s=e||r,o=q.from(s.headers);let a=s.data;return h.forEach(t,function(l){a=l.call(r,a,o.normalize(),e?e.status:void 0)}),o.normalize(),a}function mr(t){return!!(t&&t.__CANCEL__)}function he(t,e,r){g.call(this,t??"canceled",g.ERR_CANCELED,e,r),this.name="CanceledError"}h.inherits(he,g,{__CANCEL__:!0});function Vr(t,e,r){const s=r.config.validateStatus;!r.status||!s||s(r.status)?t(r):e(new g("Request failed with status code "+r.status,[g.ERR_BAD_REQUEST,g.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}function Da(t){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(t);return e&&e[1]||""}function La(t,e){t=t||10;const r=new Array(t),s=new Array(t);let o=0,a=0,n;return e=e!==void 0?e:1e3,function(i){const c=Date.now(),p=s[a];n||(n=c),r[o]=i,s[o]=c;let R=a,I=0;for(;R!==o;)I+=r[R++],R=R%t;if(o=(o+1)%t,o===a&&(a=(a+1)%t),c-n{r=p,o=null,a&&(clearTimeout(a),a=null),t(...c)};return[(...c)=>{const p=Date.now(),R=p-r;R>=s?n(c,p):(o=c,a||(a=setTimeout(()=>{a=null,n(o)},s-R)))},()=>o&&n(o)]}const Te=(t,e,r=3)=>{let s=0;const o=La(50,250);return ja(a=>{const n=a.loaded,l=a.lengthComputable?a.total:void 0,i=n-s,c=o(i),p=n<=l;s=n;const R={loaded:n,total:l,progress:l?n/l:void 0,bytes:i,rate:c||void 0,estimated:c&&l&&p?(l-n)/c:void 0,event:a,lengthComputable:l!=null,[e?"download":"upload"]:!0};t(R)},r)},Et=(t,e)=>{const r=t!=null;return[s=>e[0]({lengthComputable:r,total:t,loaded:s}),e[1]]},gt=t=>(...e)=>h.asap(()=>t(...e)),ka=G.hasStandardBrowserEnv?((t,e)=>r=>(r=new URL(r,G.origin),t.protocol===r.protocol&&t.host===r.host&&(e||t.port===r.port)))(new URL(G.origin),G.navigator&&/(msie|trident)/i.test(G.navigator.userAgent)):()=>!0,za=G.hasStandardBrowserEnv?{write(t,e,r,s,o,a){const n=[t+"="+encodeURIComponent(e)];h.isNumber(r)&&n.push("expires="+new Date(r).toGMTString()),h.isString(s)&&n.push("path="+s),h.isString(o)&&n.push("domain="+o),a===!0&&n.push("secure"),document.cookie=n.join("; ")},read(t){const e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove(t){this.write(t,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Fa(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)}function Ga(t,e){return e?t.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):t}function Sr(t,e,r){let s=!Fa(e);return t&&(s||r==!1)?Ga(t,e):e}const xt=t=>t instanceof q?{...t}:t;function ie(t,e){e=e||{};const r={};function s(c,p,R,I){return h.isPlainObject(c)&&h.isPlainObject(p)?h.merge.call({caseless:I},c,p):h.isPlainObject(p)?h.merge({},p):h.isArray(p)?p.slice():p}function o(c,p,R,I){if(h.isUndefined(p)){if(!h.isUndefined(c))return s(void 0,c,R,I)}else return s(c,p,R,I)}function a(c,p){if(!h.isUndefined(p))return s(void 0,p)}function n(c,p){if(h.isUndefined(p)){if(!h.isUndefined(c))return s(void 0,c)}else return s(void 0,p)}function l(c,p,R){if(R in e)return s(c,p);if(R in t)return s(void 0,c)}const i={url:a,method:a,data:a,baseURL:n,transformRequest:n,transformResponse:n,paramsSerializer:n,timeout:n,timeoutMessage:n,withCredentials:n,withXSRFToken:n,adapter:n,responseType:n,xsrfCookieName:n,xsrfHeaderName:n,onUploadProgress:n,onDownloadProgress:n,decompress:n,maxContentLength:n,maxBodyLength:n,beforeRedirect:n,transport:n,httpAgent:n,httpsAgent:n,cancelToken:n,socketPath:n,responseEncoding:n,validateStatus:l,headers:(c,p,R)=>o(xt(c),xt(p),R,!0)};return h.forEach(Object.keys({...t,...e}),function(p){const R=i[p]||o,I=R(t[p],e[p],p);h.isUndefined(I)&&R!==l||(r[p]=I)}),r}const Ar=t=>{const e=ie({},t);let{data:r,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:a,headers:n,auth:l}=e;e.headers=n=q.from(n),e.url=Or(Sr(e.baseURL,e.url,e.allowAbsoluteUrls),t.params,t.paramsSerializer),l&&n.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):"")));let i;if(h.isFormData(r)){if(G.hasStandardBrowserEnv||G.hasStandardBrowserWebWorkerEnv)n.setContentType(void 0);else if((i=n.getContentType())!==!1){const[c,...p]=i?i.split(";").map(R=>R.trim()).filter(Boolean):[];n.setContentType([c||"multipart/form-data",...p].join("; "))}}if(G.hasStandardBrowserEnv&&(s&&h.isFunction(s)&&(s=s(e)),s||s!==!1&&ka(e.url))){const c=o&&a&&za.read(a);c&&n.set(o,c)}return e},_a=typeof XMLHttpRequest<"u",qa=_a&&function(t){return new Promise(function(r,s){const o=Ar(t);let a=o.data;const n=q.from(o.headers).normalize();let{responseType:l,onUploadProgress:i,onDownloadProgress:c}=o,p,R,I,T,f;function y(){T&&T(),f&&f(),o.cancelToken&&o.cancelToken.unsubscribe(p),o.signal&&o.signal.removeEventListener("abort",p)}let w=new XMLHttpRequest;w.open(o.method.toUpperCase(),o.url,!0),w.timeout=o.timeout;function C(){if(!w)return;const E=q.from("getAllResponseHeaders"in w&&w.getAllResponseHeaders()),U={data:!l||l==="text"||l==="json"?w.responseText:w.response,status:w.status,statusText:w.statusText,headers:E,config:t,request:w};Vr(function(B){r(B),y()},function(B){s(B),y()},U),w=null}"onloadend"in w?w.onloadend=C:w.onreadystatechange=function(){!w||w.readyState!==4||w.status===0&&!(w.responseURL&&w.responseURL.indexOf("file:")===0)||setTimeout(C)},w.onabort=function(){w&&(s(new g("Request aborted",g.ECONNABORTED,t,w)),w=null)},w.onerror=function(){s(new g("Network Error",g.ERR_NETWORK,t,w)),w=null},w.ontimeout=function(){let v=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const U=o.transitional||Pr;o.timeoutErrorMessage&&(v=o.timeoutErrorMessage),s(new g(v,U.clarifyTimeoutError?g.ETIMEDOUT:g.ECONNABORTED,t,w)),w=null},a===void 0&&n.setContentType(null),"setRequestHeader"in w&&h.forEach(n.toJSON(),function(v,U){w.setRequestHeader(U,v)}),h.isUndefined(o.withCredentials)||(w.withCredentials=!!o.withCredentials),l&&l!=="json"&&(w.responseType=o.responseType),c&&([I,f]=Te(c,!0),w.addEventListener("progress",I)),i&&w.upload&&([R,T]=Te(i),w.upload.addEventListener("progress",R),w.upload.addEventListener("loadend",T)),(o.cancelToken||o.signal)&&(p=E=>{w&&(s(!E||E.type?new he(null,t,w):E),w.abort(),w=null)},o.cancelToken&&o.cancelToken.subscribe(p),o.signal&&(o.signal.aborted?p():o.signal.addEventListener("abort",p)));const D=Da(o.url);if(D&&G.protocols.indexOf(D)===-1){s(new g("Unsupported protocol "+D+":",g.ERR_BAD_REQUEST,t));return}w.send(a||null)})},Ha=(t,e)=>{const{length:r}=t=t?t.filter(Boolean):[];if(e||r){let s=new AbortController,o;const a=function(c){if(!o){o=!0,l();const p=c instanceof Error?c:this.reason;s.abort(p instanceof g?p:new he(p instanceof Error?p.message:p))}};let n=e&&setTimeout(()=>{n=null,a(new g(`timeout ${e} of ms exceeded`,g.ETIMEDOUT))},e);const l=()=>{t&&(n&&clearTimeout(n),n=null,t.forEach(c=>{c.unsubscribe?c.unsubscribe(a):c.removeEventListener("abort",a)}),t=null)};t.forEach(c=>c.addEventListener("abort",a));const{signal:i}=s;return i.unsubscribe=()=>h.asap(l),i}},$a=function*(t,e){let r=t.byteLength;if(r{const o=Na(t,e);let a=0,n,l=i=>{n||(n=!0,s&&s(i))};return new ReadableStream({async pull(i){try{const{done:c,value:p}=await o.next();if(c){l(),i.close();return}let R=p.byteLength;if(r){let I=a+=R;r(I)}i.enqueue(new Uint8Array(p))}catch(c){throw l(c),c}},cancel(i){return l(i),o.return()}},{highWaterMark:2})},ze=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Rr=ze&&typeof ReadableStream=="function",Qa=ze&&(typeof TextEncoder=="function"?(t=>e=>t.encode(e))(new TextEncoder):async t=>new Uint8Array(await new Response(t).arrayBuffer())),fr=(t,...e)=>{try{return!!t(...e)}catch{return!1}},Ma=Rr&&fr(()=>{let t=!1;const e=new Request(G.origin,{body:new ReadableStream,method:"POST",get duplex(){return t=!0,"half"}}).headers.has("Content-Type");return t&&!e}),Ct=64*1024,tt=Rr&&fr(()=>h.isReadableStream(new Response("").body)),Be={stream:tt&&(t=>t.body)};ze&&(t=>{["text","arrayBuffer","blob","formData","stream"].forEach(e=>{!Be[e]&&(Be[e]=h.isFunction(t[e])?r=>r[e]():(r,s)=>{throw new g(`Response type '${e}' is not supported`,g.ERR_NOT_SUPPORT,s)})})})(new Response);const Ja=async t=>{if(t==null)return 0;if(h.isBlob(t))return t.size;if(h.isSpecCompliantForm(t))return(await new Request(G.origin,{method:"POST",body:t}).arrayBuffer()).byteLength;if(h.isArrayBufferView(t)||h.isArrayBuffer(t))return t.byteLength;if(h.isURLSearchParams(t)&&(t=t+""),h.isString(t))return(await Qa(t)).byteLength},Ka=async(t,e)=>{const r=h.toFiniteNumber(t.getContentLength());return r??Ja(e)},Xa=ze&&(async t=>{let{url:e,method:r,data:s,signal:o,cancelToken:a,timeout:n,onDownloadProgress:l,onUploadProgress:i,responseType:c,headers:p,withCredentials:R="same-origin",fetchOptions:I}=Ar(t);c=c?(c+"").toLowerCase():"text";let T=Ha([o,a&&a.toAbortSignal()],n),f;const y=T&&T.unsubscribe&&(()=>{T.unsubscribe()});let w;try{if(i&&Ma&&r!=="get"&&r!=="head"&&(w=await Ka(p,s))!==0){let U=new Request(e,{method:"POST",body:s,duplex:"half"}),L;if(h.isFormData(s)&&(L=U.headers.get("content-type"))&&p.setContentType(L),U.body){const[B,Z]=Et(w,Te(gt(i)));s=vt(U.body,Ct,B,Z)}}h.isString(R)||(R=R?"include":"omit");const C="credentials"in Request.prototype;f=new Request(e,{...I,signal:T,method:r.toUpperCase(),headers:p.normalize().toJSON(),body:s,duplex:"half",credentials:C?R:void 0});let D=await fetch(f,I);const E=tt&&(c==="stream"||c==="response");if(tt&&(l||E&&y)){const U={};["status","statusText","headers"].forEach(ce=>{U[ce]=D[ce]});const L=h.toFiniteNumber(D.headers.get("content-length")),[B,Z]=l&&Et(L,Te(gt(l),!0))||[];D=new Response(vt(D.body,Ct,B,()=>{Z&&Z(),y&&y()}),U)}c=c||"text";let v=await Be[h.findKey(Be,c)||"text"](D,t);return!E&&y&&y(),await new Promise((U,L)=>{Vr(U,L,{data:v,headers:q.from(D.headers),status:D.status,statusText:D.statusText,config:t,request:f})})}catch(C){throw y&&y(),C&&C.name==="TypeError"&&/Load failed|fetch/i.test(C.message)?Object.assign(new g("Network Error",g.ERR_NETWORK,t,f),{cause:C.cause||C}):g.from(C,C&&C.code,t,f)}}),rt={http:ha,xhr:qa,fetch:Xa};h.forEach(rt,(t,e)=>{if(t){try{Object.defineProperty(t,"name",{value:e})}catch{}Object.defineProperty(t,"adapterName",{value:e})}});const Ut=t=>`- ${t}`,Ya=t=>h.isFunction(t)||t===null||t===!1,yr={getAdapter:t=>{t=h.isArray(t)?t:[t];const{length:e}=t;let r,s;const o={};for(let a=0;a`adapter ${l} `+(i===!1?"is not supported by the environment":"is not available in the build"));let n=e?a.length>1?`since : -`+a.map(Ut).join(` -`):" "+Ut(a[0]):"as no adapter specified";throw new g("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return s},adapters:rt};function Je(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new he(null,t)}function Tt(t){return Je(t),t.headers=q.from(t.headers),t.data=Me.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),yr.getAdapter(t.adapter||fe.adapter)(t).then(function(s){return Je(t),s.data=Me.call(t,t.transformResponse,s),s.headers=q.from(s.headers),s},function(s){return mr(s)||(Je(t),s&&s.response&&(s.response.data=Me.call(t,t.transformResponse,s.response),s.response.headers=q.from(s.response.headers))),Promise.reject(s)})}const wr="1.11.0",Fe={};["object","boolean","number","function","string","symbol"].forEach((t,e)=>{Fe[t]=function(s){return typeof s===t||"a"+(e<1?"n ":" ")+t}});const Bt={};Fe.transitional=function(e,r,s){function o(a,n){return"[Axios v"+wr+"] Transitional option '"+a+"'"+n+(s?". "+s:"")}return(a,n,l)=>{if(e===!1)throw new g(o(n," has been removed"+(r?" in "+r:"")),g.ERR_DEPRECATED);return r&&!Bt[n]&&(Bt[n]=!0,console.warn(o(n," has been deprecated since v"+r+" and will be removed in the near future"))),e?e(a,n,l):!0}};Fe.spelling=function(e){return(r,s)=>(console.warn(`${s} is likely a misspelling of ${e}`),!0)};function Za(t,e,r){if(typeof t!="object")throw new g("options must be an object",g.ERR_BAD_OPTION_VALUE);const s=Object.keys(t);let o=s.length;for(;o-- >0;){const a=s[o],n=e[a];if(n){const l=t[a],i=l===void 0||n(l,a,t);if(i!==!0)throw new g("option "+a+" must be "+i,g.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new g("Unknown option "+a,g.ERR_BAD_OPTION)}}const ve={assertOptions:Za,validators:Fe},M=ve.validators;let le=class{constructor(e){this.defaults=e||{},this.interceptors={request:new wt,response:new wt}}async request(e,r){try{return await this._request(e,r)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const a=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?a&&!String(s.stack).endsWith(a.replace(/^.+\n.+\n/,""))&&(s.stack+=` -`+a):s.stack=a}catch{}}throw s}}_request(e,r){typeof e=="string"?(r=r||{},r.url=e):r=e||{},r=ie(this.defaults,r);const{transitional:s,paramsSerializer:o,headers:a}=r;s!==void 0&&ve.assertOptions(s,{silentJSONParsing:M.transitional(M.boolean),forcedJSONParsing:M.transitional(M.boolean),clarifyTimeoutError:M.transitional(M.boolean)},!1),o!=null&&(h.isFunction(o)?r.paramsSerializer={serialize:o}:ve.assertOptions(o,{encode:M.function,serialize:M.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),ve.assertOptions(r,{baseUrl:M.spelling("baseURL"),withXsrfToken:M.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let n=a&&h.merge(a.common,a[r.method]);a&&h.forEach(["delete","get","head","post","put","patch","common"],f=>{delete a[f]}),r.headers=q.concat(n,a);const l=[];let i=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(r)===!1||(i=i&&y.synchronous,l.unshift(y.fulfilled,y.rejected))});const c=[];this.interceptors.response.forEach(function(y){c.push(y.fulfilled,y.rejected)});let p,R=0,I;if(!i){const f=[Tt.bind(this),void 0];for(f.unshift(...l),f.push(...c),I=f.length,p=Promise.resolve(r);R{if(!s._listeners)return;let a=s._listeners.length;for(;a-- >0;)s._listeners[a](o);s._listeners=null}),this.promise.then=o=>{let a;const n=new Promise(l=>{s.subscribe(l),a=l}).then(o);return n.cancel=function(){s.unsubscribe(a)},n},e(function(a,n,l){s.reason||(s.reason=new he(a,n,l),r(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const r=this._listeners.indexOf(e);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){const e=new AbortController,r=s=>{e.abort(s)};return this.subscribe(r),e.signal.unsubscribe=()=>this.unsubscribe(r),e.signal}static source(){let e;return{token:new Ir(function(o){e=o}),cancel:e}}};function to(t){return function(r){return t.apply(null,r)}}function ro(t){return h.isObject(t)&&t.isAxiosError===!0}const st={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(st).forEach(([t,e])=>{st[e]=t});function Er(t){const e=new le(t),r=rr(le.prototype.request,e);return h.extend(r,le.prototype,e,{allOwnKeys:!0}),h.extend(r,e,null,{allOwnKeys:!0}),r.create=function(o){return Er(ie(t,o))},r}const u=Er(fe);u.Axios=le;u.CanceledError=he;u.CancelToken=eo;u.isCancel=mr;u.VERSION=wr;u.toFormData=ke;u.AxiosError=g;u.Cancel=u.CanceledError;u.all=function(e){return Promise.all(e)};u.spread=to;u.isAxiosError=ro;u.mergeConfig=ie;u.AxiosHeaders=q;u.formToJSON=t=>br(h.isHTMLForm(t)?new FormData(t):t);u.getAdapter=yr.getAdapter;u.HttpStatusCode=st;u.default=u;const{Axios:Go,AxiosError:_o,CanceledError:qo,isCancel:Ho,CancelToken:$o,VERSION:No,all:Wo,Cancel:Qo,isAxiosError:Mo,spread:Jo,toFormData:Ko,AxiosHeaders:Xo,HttpStatusCode:Yo,formToJSON:Zo,getAdapter:en,mergeConfig:tn}=u,O="/api/v1".replace(/\/+$/,"");class H{constructor(e,r=O,s=u){this.basePath=r,this.axios=s,e&&(this.configuration=e,this.basePath=e.basePath??r)}configuration}class so extends Error{constructor(e,r){super(r),this.field=e,this.name="RequiredError"}}const P={},b="https://example.com",d=function(t,e,r){if(r==null)throw new so(e,`Required parameter ${e} was null or undefined when calling ${t}.`)},m=async function(t,e,r){if(r&&r.apiKey){const s=typeof r.apiKey=="function"?await r.apiKey(e):await r.apiKey;t[e]=s}};function at(t,e,r=""){e!=null&&(typeof e=="object"?Array.isArray(e)?e.forEach(s=>at(t,s,r)):Object.keys(e).forEach(s=>at(t,e[s],`${r}${r!==""?".":""}${s}`)):t.has(r)?t.append(r,e):t.set(r,e))}const V=function(t,...e){const r=new URLSearchParams(t.search);at(r,e),t.search=r.toString()},x=function(t,e,r){const s=typeof t!="string";return(s&&r&&r.isJsonMime?r.isJsonMime(e.headers["Content-Type"]):s)?JSON.stringify(t!==void 0?t:{}):t||""},S=function(t){return t.pathname+t.search+t.hash},A=function(t,e,r,s){return(o=e,a=r)=>{const n={...t.options,url:(o.defaults.baseURL?"":s?.basePath??a)+t.url};return o.request(n)}},ao=function(t){return{updateController:async(e,r={})=>{d("updateController","body",e);const s="/controller",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"PUT",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}}}},oo=function(t){const e=ao(t);return{async updateController(r,s){const o=await e.updateController(r,s),a=t?.serverIndex??0,n=P["ControllerApi.updateController"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)}}};class Dt extends H{updateController(e,r){return oo(this.configuration).updateController(e,r).then(s=>s(this.axios,this.basePath))}}const no=function(t){return{controllerInfo:async(e={})=>{const r="/controller-info",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}}}},lo=function(t){const e=no(t);return{async controllerInfo(r){const s=await e.controllerInfo(r),o=t?.serverIndex??0,a=P["ControllerInfoApi.controllerInfo"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)}}};class Lt extends H{controllerInfo(e){return lo(this.configuration).controllerInfo(e).then(r=>r(this.axios,this.basePath))}}const io=function(t){return{createCredentials:async(e,r={})=>{d("createCredentials","body",e);const s="/github/credentials",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}},createGiteaCredentials:async(e,r={})=>{d("createGiteaCredentials","body",e);const s="/gitea/credentials",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}},deleteCredentials:async(e,r={})=>{d("deleteCredentials","id",e);const s="/github/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},deleteGiteaCredentials:async(e,r={})=>{d("deleteGiteaCredentials","id",e);const s="/gitea/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getCredentials:async(e,r={})=>{d("getCredentials","id",e);const s="/github/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getGiteaCredentials:async(e,r={})=>{d("getGiteaCredentials","id",e);const s="/gitea/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listCredentials:async(e={})=>{const r="/github/credentials",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listGiteaCredentials:async(e={})=>{const r="/gitea/credentials",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},updateCredentials:async(e,r,s={})=>{d("updateCredentials","id",e),d("updateCredentials","body",r);const o="/github/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},updateGiteaCredentials:async(e,r,s={})=>{d("updateGiteaCredentials","id",e),d("updateGiteaCredentials","body",r);const o="/gitea/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}}}},J=function(t){const e=io(t);return{async createCredentials(r,s){const o=await e.createCredentials(r,s),a=t?.serverIndex??0,n=P["CredentialsApi.createCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async createGiteaCredentials(r,s){const o=await e.createGiteaCredentials(r,s),a=t?.serverIndex??0,n=P["CredentialsApi.createGiteaCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async deleteCredentials(r,s){const o=await e.deleteCredentials(r,s),a=t?.serverIndex??0,n=P["CredentialsApi.deleteCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async deleteGiteaCredentials(r,s){const o=await e.deleteGiteaCredentials(r,s),a=t?.serverIndex??0,n=P["CredentialsApi.deleteGiteaCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getCredentials(r,s){const o=await e.getCredentials(r,s),a=t?.serverIndex??0,n=P["CredentialsApi.getCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getGiteaCredentials(r,s){const o=await e.getGiteaCredentials(r,s),a=t?.serverIndex??0,n=P["CredentialsApi.getGiteaCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listCredentials(r){const s=await e.listCredentials(r),o=t?.serverIndex??0,a=P["CredentialsApi.listCredentials"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)},async listGiteaCredentials(r){const s=await e.listGiteaCredentials(r),o=t?.serverIndex??0,a=P["CredentialsApi.listGiteaCredentials"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)},async updateCredentials(r,s,o){const a=await e.updateCredentials(r,s,o),n=t?.serverIndex??0,l=P["CredentialsApi.updateCredentials"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async updateGiteaCredentials(r,s,o){const a=await e.updateGiteaCredentials(r,s,o),n=t?.serverIndex??0,l=P["CredentialsApi.updateGiteaCredentials"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)}}};class jt extends H{createCredentials(e,r){return J(this.configuration).createCredentials(e,r).then(s=>s(this.axios,this.basePath))}createGiteaCredentials(e,r){return J(this.configuration).createGiteaCredentials(e,r).then(s=>s(this.axios,this.basePath))}deleteCredentials(e,r){return J(this.configuration).deleteCredentials(e,r).then(s=>s(this.axios,this.basePath))}deleteGiteaCredentials(e,r){return J(this.configuration).deleteGiteaCredentials(e,r).then(s=>s(this.axios,this.basePath))}getCredentials(e,r){return J(this.configuration).getCredentials(e,r).then(s=>s(this.axios,this.basePath))}getGiteaCredentials(e,r){return J(this.configuration).getGiteaCredentials(e,r).then(s=>s(this.axios,this.basePath))}listCredentials(e){return J(this.configuration).listCredentials(e).then(r=>r(this.axios,this.basePath))}listGiteaCredentials(e){return J(this.configuration).listGiteaCredentials(e).then(r=>r(this.axios,this.basePath))}updateCredentials(e,r,s){return J(this.configuration).updateCredentials(e,r,s).then(o=>o(this.axios,this.basePath))}updateGiteaCredentials(e,r,s){return J(this.configuration).updateGiteaCredentials(e,r,s).then(o=>o(this.axios,this.basePath))}}const co=function(t){return{createGiteaEndpoint:async(e,r={})=>{d("createGiteaEndpoint","body",e);const s="/gitea/endpoints",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}},createGithubEndpoint:async(e,r={})=>{d("createGithubEndpoint","body",e);const s="/github/endpoints",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}},deleteGiteaEndpoint:async(e,r={})=>{d("deleteGiteaEndpoint","name",e);const s="/gitea/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},deleteGithubEndpoint:async(e,r={})=>{d("deleteGithubEndpoint","name",e);const s="/github/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getGiteaEndpoint:async(e,r={})=>{d("getGiteaEndpoint","name",e);const s="/gitea/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getGithubEndpoint:async(e,r={})=>{d("getGithubEndpoint","name",e);const s="/github/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listGiteaEndpoints:async(e={})=>{const r="/gitea/endpoints",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listGithubEndpoints:async(e={})=>{const r="/github/endpoints",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},updateGiteaEndpoint:async(e,r,s={})=>{d("updateGiteaEndpoint","name",e),d("updateGiteaEndpoint","body",r);const o="/gitea/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},updateGithubEndpoint:async(e,r,s={})=>{d("updateGithubEndpoint","name",e),d("updateGithubEndpoint","body",r);const o="/github/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}}}},K=function(t){const e=co(t);return{async createGiteaEndpoint(r,s){const o=await e.createGiteaEndpoint(r,s),a=t?.serverIndex??0,n=P["EndpointsApi.createGiteaEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async createGithubEndpoint(r,s){const o=await e.createGithubEndpoint(r,s),a=t?.serverIndex??0,n=P["EndpointsApi.createGithubEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async deleteGiteaEndpoint(r,s){const o=await e.deleteGiteaEndpoint(r,s),a=t?.serverIndex??0,n=P["EndpointsApi.deleteGiteaEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async deleteGithubEndpoint(r,s){const o=await e.deleteGithubEndpoint(r,s),a=t?.serverIndex??0,n=P["EndpointsApi.deleteGithubEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getGiteaEndpoint(r,s){const o=await e.getGiteaEndpoint(r,s),a=t?.serverIndex??0,n=P["EndpointsApi.getGiteaEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getGithubEndpoint(r,s){const o=await e.getGithubEndpoint(r,s),a=t?.serverIndex??0,n=P["EndpointsApi.getGithubEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listGiteaEndpoints(r){const s=await e.listGiteaEndpoints(r),o=t?.serverIndex??0,a=P["EndpointsApi.listGiteaEndpoints"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)},async listGithubEndpoints(r){const s=await e.listGithubEndpoints(r),o=t?.serverIndex??0,a=P["EndpointsApi.listGithubEndpoints"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)},async updateGiteaEndpoint(r,s,o){const a=await e.updateGiteaEndpoint(r,s,o),n=t?.serverIndex??0,l=P["EndpointsApi.updateGiteaEndpoint"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async updateGithubEndpoint(r,s,o){const a=await e.updateGithubEndpoint(r,s,o),n=t?.serverIndex??0,l=P["EndpointsApi.updateGithubEndpoint"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)}}};class kt extends H{createGiteaEndpoint(e,r){return K(this.configuration).createGiteaEndpoint(e,r).then(s=>s(this.axios,this.basePath))}createGithubEndpoint(e,r){return K(this.configuration).createGithubEndpoint(e,r).then(s=>s(this.axios,this.basePath))}deleteGiteaEndpoint(e,r){return K(this.configuration).deleteGiteaEndpoint(e,r).then(s=>s(this.axios,this.basePath))}deleteGithubEndpoint(e,r){return K(this.configuration).deleteGithubEndpoint(e,r).then(s=>s(this.axios,this.basePath))}getGiteaEndpoint(e,r){return K(this.configuration).getGiteaEndpoint(e,r).then(s=>s(this.axios,this.basePath))}getGithubEndpoint(e,r){return K(this.configuration).getGithubEndpoint(e,r).then(s=>s(this.axios,this.basePath))}listGiteaEndpoints(e){return K(this.configuration).listGiteaEndpoints(e).then(r=>r(this.axios,this.basePath))}listGithubEndpoints(e){return K(this.configuration).listGithubEndpoints(e).then(r=>r(this.axios,this.basePath))}updateGiteaEndpoint(e,r,s){return K(this.configuration).updateGiteaEndpoint(e,r,s).then(o=>o(this.axios,this.basePath))}updateGithubEndpoint(e,r,s){return K(this.configuration).updateGithubEndpoint(e,r,s).then(o=>o(this.axios,this.basePath))}}const po=function(t){return{createEnterprise:async(e,r={})=>{d("createEnterprise","body",e);const s="/enterprises",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}},createEnterprisePool:async(e,r,s={})=>{d("createEnterprisePool","enterpriseID",e),d("createEnterprisePool","body",r);const o="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},createEnterpriseScaleSet:async(e,r,s={})=>{d("createEnterpriseScaleSet","enterpriseID",e),d("createEnterpriseScaleSet","body",r);const o="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},deleteEnterprise:async(e,r={})=>{d("deleteEnterprise","enterpriseID",e);const s="/enterprises/{enterpriseID}".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},deleteEnterprisePool:async(e,r,s={})=>{d("deleteEnterprisePool","enterpriseID",e),d("deleteEnterprisePool","poolID",r);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getEnterprise:async(e,r={})=>{d("getEnterprise","enterpriseID",e);const s="/enterprises/{enterpriseID}".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getEnterprisePool:async(e,r,s={})=>{d("getEnterprisePool","enterpriseID",e),d("getEnterprisePool","poolID",r);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},listEnterpriseInstances:async(e,r={})=>{d("listEnterpriseInstances","enterpriseID",e);const s="/enterprises/{enterpriseID}/instances".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listEnterprisePools:async(e,r={})=>{d("listEnterprisePools","enterpriseID",e);const s="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listEnterpriseScaleSets:async(e,r={})=>{d("listEnterpriseScaleSets","enterpriseID",e);const s="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listEnterprises:async(e,r,s={})=>{const o="/enterprises",a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),e!==void 0&&(c.name=e),r!==void 0&&(c.endpoint=r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},updateEnterprise:async(e,r,s={})=>{d("updateEnterprise","enterpriseID",e),d("updateEnterprise","body",r);const o="/enterprises/{enterpriseID}".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},updateEnterprisePool:async(e,r,s,o={})=>{d("updateEnterprisePool","enterpriseID",e),d("updateEnterprisePool","poolID",r),d("updateEnterprisePool","body",s);const a="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await m(c,"Authorization",t),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,t),{url:S(n),options:i}}}},$=function(t){const e=po(t);return{async createEnterprise(r,s){const o=await e.createEnterprise(r,s),a=t?.serverIndex??0,n=P["EnterprisesApi.createEnterprise"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async createEnterprisePool(r,s,o){const a=await e.createEnterprisePool(r,s,o),n=t?.serverIndex??0,l=P["EnterprisesApi.createEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async createEnterpriseScaleSet(r,s,o){const a=await e.createEnterpriseScaleSet(r,s,o),n=t?.serverIndex??0,l=P["EnterprisesApi.createEnterpriseScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteEnterprise(r,s){const o=await e.deleteEnterprise(r,s),a=t?.serverIndex??0,n=P["EnterprisesApi.deleteEnterprise"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async deleteEnterprisePool(r,s,o){const a=await e.deleteEnterprisePool(r,s,o),n=t?.serverIndex??0,l=P["EnterprisesApi.deleteEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getEnterprise(r,s){const o=await e.getEnterprise(r,s),a=t?.serverIndex??0,n=P["EnterprisesApi.getEnterprise"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getEnterprisePool(r,s,o){const a=await e.getEnterprisePool(r,s,o),n=t?.serverIndex??0,l=P["EnterprisesApi.getEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async listEnterpriseInstances(r,s){const o=await e.listEnterpriseInstances(r,s),a=t?.serverIndex??0,n=P["EnterprisesApi.listEnterpriseInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listEnterprisePools(r,s){const o=await e.listEnterprisePools(r,s),a=t?.serverIndex??0,n=P["EnterprisesApi.listEnterprisePools"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listEnterpriseScaleSets(r,s){const o=await e.listEnterpriseScaleSets(r,s),a=t?.serverIndex??0,n=P["EnterprisesApi.listEnterpriseScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listEnterprises(r,s,o){const a=await e.listEnterprises(r,s,o),n=t?.serverIndex??0,l=P["EnterprisesApi.listEnterprises"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async updateEnterprise(r,s,o){const a=await e.updateEnterprise(r,s,o),n=t?.serverIndex??0,l=P["EnterprisesApi.updateEnterprise"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async updateEnterprisePool(r,s,o,a){const n=await e.updateEnterprisePool(r,s,o,a),l=t?.serverIndex??0,i=P["EnterprisesApi.updateEnterprisePool"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)}}};class zt extends H{createEnterprise(e,r){return $(this.configuration).createEnterprise(e,r).then(s=>s(this.axios,this.basePath))}createEnterprisePool(e,r,s){return $(this.configuration).createEnterprisePool(e,r,s).then(o=>o(this.axios,this.basePath))}createEnterpriseScaleSet(e,r,s){return $(this.configuration).createEnterpriseScaleSet(e,r,s).then(o=>o(this.axios,this.basePath))}deleteEnterprise(e,r){return $(this.configuration).deleteEnterprise(e,r).then(s=>s(this.axios,this.basePath))}deleteEnterprisePool(e,r,s){return $(this.configuration).deleteEnterprisePool(e,r,s).then(o=>o(this.axios,this.basePath))}getEnterprise(e,r){return $(this.configuration).getEnterprise(e,r).then(s=>s(this.axios,this.basePath))}getEnterprisePool(e,r,s){return $(this.configuration).getEnterprisePool(e,r,s).then(o=>o(this.axios,this.basePath))}listEnterpriseInstances(e,r){return $(this.configuration).listEnterpriseInstances(e,r).then(s=>s(this.axios,this.basePath))}listEnterprisePools(e,r){return $(this.configuration).listEnterprisePools(e,r).then(s=>s(this.axios,this.basePath))}listEnterpriseScaleSets(e,r){return $(this.configuration).listEnterpriseScaleSets(e,r).then(s=>s(this.axios,this.basePath))}listEnterprises(e,r,s){return $(this.configuration).listEnterprises(e,r,s).then(o=>o(this.axios,this.basePath))}updateEnterprise(e,r,s){return $(this.configuration).updateEnterprise(e,r,s).then(o=>o(this.axios,this.basePath))}updateEnterprisePool(e,r,s,o){return $(this.configuration).updateEnterprisePool(e,r,s,o).then(a=>a(this.axios,this.basePath))}}const ho=function(t){return{firstRun:async(e,r={})=>{d("firstRun","body",e);const s="/first-run",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}}}},uo=function(t){const e=ho(t);return{async firstRun(r,s){const o=await e.firstRun(r,s),a=t?.serverIndex??0,n=P["FirstRunApi.firstRun"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)}}};class Ft extends H{firstRun(e,r){return uo(this.configuration).firstRun(e,r).then(s=>s(this.axios,this.basePath))}}const Oo=function(t){return{getOrgWebhookInfo:async(e,r={})=>{d("getOrgWebhookInfo","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getRepoWebhookInfo:async(e,r={})=>{d("getRepoWebhookInfo","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},installOrgWebhook:async(e,r,s={})=>{d("installOrgWebhook","orgID",e),d("installOrgWebhook","body",r);const o="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},installRepoWebhook:async(e,r,s={})=>{d("installRepoWebhook","repoID",e),d("installRepoWebhook","body",r);const o="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},uninstallOrgWebhook:async(e,r={})=>{d("uninstallOrgWebhook","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},uninstallRepoWebhook:async(e,r={})=>{d("uninstallRepoWebhook","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}}}},pe=function(t){const e=Oo(t);return{async getOrgWebhookInfo(r,s){const o=await e.getOrgWebhookInfo(r,s),a=t?.serverIndex??0,n=P["HooksApi.getOrgWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getRepoWebhookInfo(r,s){const o=await e.getRepoWebhookInfo(r,s),a=t?.serverIndex??0,n=P["HooksApi.getRepoWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async installOrgWebhook(r,s,o){const a=await e.installOrgWebhook(r,s,o),n=t?.serverIndex??0,l=P["HooksApi.installOrgWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async installRepoWebhook(r,s,o){const a=await e.installRepoWebhook(r,s,o),n=t?.serverIndex??0,l=P["HooksApi.installRepoWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async uninstallOrgWebhook(r,s){const o=await e.uninstallOrgWebhook(r,s),a=t?.serverIndex??0,n=P["HooksApi.uninstallOrgWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async uninstallRepoWebhook(r,s){const o=await e.uninstallRepoWebhook(r,s),a=t?.serverIndex??0,n=P["HooksApi.uninstallRepoWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)}}};class Gt extends H{getOrgWebhookInfo(e,r){return pe(this.configuration).getOrgWebhookInfo(e,r).then(s=>s(this.axios,this.basePath))}getRepoWebhookInfo(e,r){return pe(this.configuration).getRepoWebhookInfo(e,r).then(s=>s(this.axios,this.basePath))}installOrgWebhook(e,r,s){return pe(this.configuration).installOrgWebhook(e,r,s).then(o=>o(this.axios,this.basePath))}installRepoWebhook(e,r,s){return pe(this.configuration).installRepoWebhook(e,r,s).then(o=>o(this.axios,this.basePath))}uninstallOrgWebhook(e,r){return pe(this.configuration).uninstallOrgWebhook(e,r).then(s=>s(this.axios,this.basePath))}uninstallRepoWebhook(e,r){return pe(this.configuration).uninstallRepoWebhook(e,r).then(s=>s(this.axios,this.basePath))}}const Po=function(t){return{deleteInstance:async(e,r,s,o={})=>{d("deleteInstance","instanceName",e);const a="/instances/{instanceName}".replace("{instanceName}",encodeURIComponent(String(e))),n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"DELETE",...l,...o},c={},p={};await m(c,"Authorization",t),r!==void 0&&(p.forceRemove=r),s!==void 0&&(p.bypassGHUnauthorized=s),V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},{url:S(n),options:i}},getInstance:async(e,r={})=>{d("getInstance","instanceName",e);const s="/instances/{instanceName}".replace("{instanceName}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listEnterpriseInstances:async(e,r={})=>{d("listEnterpriseInstances","enterpriseID",e);const s="/enterprises/{enterpriseID}/instances".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listInstances:async(e={})=>{const r="/instances",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listOrgInstances:async(e,r={})=>{d("listOrgInstances","orgID",e);const s="/organizations/{orgID}/instances".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listPoolInstances:async(e,r={})=>{d("listPoolInstances","poolID",e);const s="/pools/{poolID}/instances".replace("{poolID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listRepoInstances:async(e,r={})=>{d("listRepoInstances","repoID",e);const s="/repositories/{repoID}/instances".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listScaleSetInstances:async(e,r={})=>{d("listScaleSetInstances","scalesetID",e);const s="/scalesets/{scalesetID}/instances".replace("{scalesetID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}}}},ae=function(t){const e=Po(t);return{async deleteInstance(r,s,o,a){const n=await e.deleteInstance(r,s,o,a),l=t?.serverIndex??0,i=P["InstancesApi.deleteInstance"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)},async getInstance(r,s){const o=await e.getInstance(r,s),a=t?.serverIndex??0,n=P["InstancesApi.getInstance"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listEnterpriseInstances(r,s){const o=await e.listEnterpriseInstances(r,s),a=t?.serverIndex??0,n=P["InstancesApi.listEnterpriseInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listInstances(r){const s=await e.listInstances(r),o=t?.serverIndex??0,a=P["InstancesApi.listInstances"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)},async listOrgInstances(r,s){const o=await e.listOrgInstances(r,s),a=t?.serverIndex??0,n=P["InstancesApi.listOrgInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listPoolInstances(r,s){const o=await e.listPoolInstances(r,s),a=t?.serverIndex??0,n=P["InstancesApi.listPoolInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listRepoInstances(r,s){const o=await e.listRepoInstances(r,s),a=t?.serverIndex??0,n=P["InstancesApi.listRepoInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listScaleSetInstances(r,s){const o=await e.listScaleSetInstances(r,s),a=t?.serverIndex??0,n=P["InstancesApi.listScaleSetInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)}}};class _t extends H{deleteInstance(e,r,s,o){return ae(this.configuration).deleteInstance(e,r,s,o).then(a=>a(this.axios,this.basePath))}getInstance(e,r){return ae(this.configuration).getInstance(e,r).then(s=>s(this.axios,this.basePath))}listEnterpriseInstances(e,r){return ae(this.configuration).listEnterpriseInstances(e,r).then(s=>s(this.axios,this.basePath))}listInstances(e){return ae(this.configuration).listInstances(e).then(r=>r(this.axios,this.basePath))}listOrgInstances(e,r){return ae(this.configuration).listOrgInstances(e,r).then(s=>s(this.axios,this.basePath))}listPoolInstances(e,r){return ae(this.configuration).listPoolInstances(e,r).then(s=>s(this.axios,this.basePath))}listRepoInstances(e,r){return ae(this.configuration).listRepoInstances(e,r).then(s=>s(this.axios,this.basePath))}listScaleSetInstances(e,r){return ae(this.configuration).listScaleSetInstances(e,r).then(s=>s(this.axios,this.basePath))}}const bo=function(t){return{login:async(e,r={})=>{d("login","body",e);const s="/auth/login",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}}}},mo=function(t){const e=bo(t);return{async login(r,s){const o=await e.login(r,s),a=t?.serverIndex??0,n=P["LoginApi.login"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)}}};class qt extends H{login(e,r){return mo(this.configuration).login(e,r).then(s=>s(this.axios,this.basePath))}}const Vo=function(t){return{createOrg:async(e,r={})=>{d("createOrg","body",e);const s="/organizations",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}},createOrgPool:async(e,r,s={})=>{d("createOrgPool","orgID",e),d("createOrgPool","body",r);const o="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},createOrgScaleSet:async(e,r,s={})=>{d("createOrgScaleSet","orgID",e),d("createOrgScaleSet","body",r);const o="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},deleteOrg:async(e,r,s={})=>{d("deleteOrg","orgID",e);const o="/organizations/{orgID}".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),r!==void 0&&(c.keepWebhook=r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deleteOrgPool:async(e,r,s={})=>{d("deleteOrgPool","orgID",e),d("deleteOrgPool","poolID",r);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getOrg:async(e,r={})=>{d("getOrg","orgID",e);const s="/organizations/{orgID}".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getOrgPool:async(e,r,s={})=>{d("getOrgPool","orgID",e),d("getOrgPool","poolID",r);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getOrgWebhookInfo:async(e,r={})=>{d("getOrgWebhookInfo","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},installOrgWebhook:async(e,r,s={})=>{d("installOrgWebhook","orgID",e),d("installOrgWebhook","body",r);const o="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},listOrgInstances:async(e,r={})=>{d("listOrgInstances","orgID",e);const s="/organizations/{orgID}/instances".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listOrgPools:async(e,r={})=>{d("listOrgPools","orgID",e);const s="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listOrgScaleSets:async(e,r={})=>{d("listOrgScaleSets","orgID",e);const s="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listOrgs:async(e,r,s={})=>{const o="/organizations",a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),e!==void 0&&(c.name=e),r!==void 0&&(c.endpoint=r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},uninstallOrgWebhook:async(e,r={})=>{d("uninstallOrgWebhook","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},updateOrg:async(e,r,s={})=>{d("updateOrg","orgID",e),d("updateOrg","body",r);const o="/organizations/{orgID}".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},updateOrgPool:async(e,r,s,o={})=>{d("updateOrgPool","orgID",e),d("updateOrgPool","poolID",r),d("updateOrgPool","body",s);const a="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await m(c,"Authorization",t),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,t),{url:S(n),options:i}}}},z=function(t){const e=Vo(t);return{async createOrg(r,s){const o=await e.createOrg(r,s),a=t?.serverIndex??0,n=P["OrganizationsApi.createOrg"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async createOrgPool(r,s,o){const a=await e.createOrgPool(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.createOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async createOrgScaleSet(r,s,o){const a=await e.createOrgScaleSet(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.createOrgScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteOrg(r,s,o){const a=await e.deleteOrg(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.deleteOrg"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteOrgPool(r,s,o){const a=await e.deleteOrgPool(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.deleteOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getOrg(r,s){const o=await e.getOrg(r,s),a=t?.serverIndex??0,n=P["OrganizationsApi.getOrg"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getOrgPool(r,s,o){const a=await e.getOrgPool(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.getOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getOrgWebhookInfo(r,s){const o=await e.getOrgWebhookInfo(r,s),a=t?.serverIndex??0,n=P["OrganizationsApi.getOrgWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async installOrgWebhook(r,s,o){const a=await e.installOrgWebhook(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.installOrgWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async listOrgInstances(r,s){const o=await e.listOrgInstances(r,s),a=t?.serverIndex??0,n=P["OrganizationsApi.listOrgInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listOrgPools(r,s){const o=await e.listOrgPools(r,s),a=t?.serverIndex??0,n=P["OrganizationsApi.listOrgPools"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listOrgScaleSets(r,s){const o=await e.listOrgScaleSets(r,s),a=t?.serverIndex??0,n=P["OrganizationsApi.listOrgScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listOrgs(r,s,o){const a=await e.listOrgs(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.listOrgs"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async uninstallOrgWebhook(r,s){const o=await e.uninstallOrgWebhook(r,s),a=t?.serverIndex??0,n=P["OrganizationsApi.uninstallOrgWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async updateOrg(r,s,o){const a=await e.updateOrg(r,s,o),n=t?.serverIndex??0,l=P["OrganizationsApi.updateOrg"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async updateOrgPool(r,s,o,a){const n=await e.updateOrgPool(r,s,o,a),l=t?.serverIndex??0,i=P["OrganizationsApi.updateOrgPool"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)}}};class Ht extends H{createOrg(e,r){return z(this.configuration).createOrg(e,r).then(s=>s(this.axios,this.basePath))}createOrgPool(e,r,s){return z(this.configuration).createOrgPool(e,r,s).then(o=>o(this.axios,this.basePath))}createOrgScaleSet(e,r,s){return z(this.configuration).createOrgScaleSet(e,r,s).then(o=>o(this.axios,this.basePath))}deleteOrg(e,r,s){return z(this.configuration).deleteOrg(e,r,s).then(o=>o(this.axios,this.basePath))}deleteOrgPool(e,r,s){return z(this.configuration).deleteOrgPool(e,r,s).then(o=>o(this.axios,this.basePath))}getOrg(e,r){return z(this.configuration).getOrg(e,r).then(s=>s(this.axios,this.basePath))}getOrgPool(e,r,s){return z(this.configuration).getOrgPool(e,r,s).then(o=>o(this.axios,this.basePath))}getOrgWebhookInfo(e,r){return z(this.configuration).getOrgWebhookInfo(e,r).then(s=>s(this.axios,this.basePath))}installOrgWebhook(e,r,s){return z(this.configuration).installOrgWebhook(e,r,s).then(o=>o(this.axios,this.basePath))}listOrgInstances(e,r){return z(this.configuration).listOrgInstances(e,r).then(s=>s(this.axios,this.basePath))}listOrgPools(e,r){return z(this.configuration).listOrgPools(e,r).then(s=>s(this.axios,this.basePath))}listOrgScaleSets(e,r){return z(this.configuration).listOrgScaleSets(e,r).then(s=>s(this.axios,this.basePath))}listOrgs(e,r,s){return z(this.configuration).listOrgs(e,r,s).then(o=>o(this.axios,this.basePath))}uninstallOrgWebhook(e,r){return z(this.configuration).uninstallOrgWebhook(e,r).then(s=>s(this.axios,this.basePath))}updateOrg(e,r,s){return z(this.configuration).updateOrg(e,r,s).then(o=>o(this.axios,this.basePath))}updateOrgPool(e,r,s,o){return z(this.configuration).updateOrgPool(e,r,s,o).then(a=>a(this.axios,this.basePath))}}const So=function(t){return{createEnterprisePool:async(e,r,s={})=>{d("createEnterprisePool","enterpriseID",e),d("createEnterprisePool","body",r);const o="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},createOrgPool:async(e,r,s={})=>{d("createOrgPool","orgID",e),d("createOrgPool","body",r);const o="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},createRepoPool:async(e,r,s={})=>{d("createRepoPool","repoID",e),d("createRepoPool","body",r);const o="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},deleteEnterprisePool:async(e,r,s={})=>{d("deleteEnterprisePool","enterpriseID",e),d("deleteEnterprisePool","poolID",r);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deleteOrgPool:async(e,r,s={})=>{d("deleteOrgPool","orgID",e),d("deleteOrgPool","poolID",r);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deletePool:async(e,r={})=>{d("deletePool","poolID",e);const s="/pools/{poolID}".replace("{poolID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},deleteRepoPool:async(e,r,s={})=>{d("deleteRepoPool","repoID",e),d("deleteRepoPool","poolID",r);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getEnterprisePool:async(e,r,s={})=>{d("getEnterprisePool","enterpriseID",e),d("getEnterprisePool","poolID",r);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getOrgPool:async(e,r,s={})=>{d("getOrgPool","orgID",e),d("getOrgPool","poolID",r);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getPool:async(e,r={})=>{d("getPool","poolID",e);const s="/pools/{poolID}".replace("{poolID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getRepoPool:async(e,r,s={})=>{d("getRepoPool","repoID",e),d("getRepoPool","poolID",r);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},listEnterprisePools:async(e,r={})=>{d("listEnterprisePools","enterpriseID",e);const s="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listOrgPools:async(e,r={})=>{d("listOrgPools","orgID",e);const s="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listPools:async(e={})=>{const r="/pools",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listRepoPools:async(e,r={})=>{d("listRepoPools","repoID",e);const s="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},updateEnterprisePool:async(e,r,s,o={})=>{d("updateEnterprisePool","enterpriseID",e),d("updateEnterprisePool","poolID",r),d("updateEnterprisePool","body",s);const a="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await m(c,"Authorization",t),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,t),{url:S(n),options:i}},updateOrgPool:async(e,r,s,o={})=>{d("updateOrgPool","orgID",e),d("updateOrgPool","poolID",r),d("updateOrgPool","body",s);const a="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await m(c,"Authorization",t),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,t),{url:S(n),options:i}},updatePool:async(e,r,s={})=>{d("updatePool","poolID",e),d("updatePool","body",r);const o="/pools/{poolID}".replace("{poolID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},updateRepoPool:async(e,r,s,o={})=>{d("updateRepoPool","repoID",e),d("updateRepoPool","poolID",r),d("updateRepoPool","body",s);const a="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await m(c,"Authorization",t),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,t),{url:S(n),options:i}}}},j=function(t){const e=So(t);return{async createEnterprisePool(r,s,o){const a=await e.createEnterprisePool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.createEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async createOrgPool(r,s,o){const a=await e.createOrgPool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.createOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async createRepoPool(r,s,o){const a=await e.createRepoPool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.createRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteEnterprisePool(r,s,o){const a=await e.deleteEnterprisePool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.deleteEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteOrgPool(r,s,o){const a=await e.deleteOrgPool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.deleteOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deletePool(r,s){const o=await e.deletePool(r,s),a=t?.serverIndex??0,n=P["PoolsApi.deletePool"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async deleteRepoPool(r,s,o){const a=await e.deleteRepoPool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.deleteRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getEnterprisePool(r,s,o){const a=await e.getEnterprisePool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.getEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getOrgPool(r,s,o){const a=await e.getOrgPool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.getOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getPool(r,s){const o=await e.getPool(r,s),a=t?.serverIndex??0,n=P["PoolsApi.getPool"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getRepoPool(r,s,o){const a=await e.getRepoPool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.getRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async listEnterprisePools(r,s){const o=await e.listEnterprisePools(r,s),a=t?.serverIndex??0,n=P["PoolsApi.listEnterprisePools"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listOrgPools(r,s){const o=await e.listOrgPools(r,s),a=t?.serverIndex??0,n=P["PoolsApi.listOrgPools"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listPools(r){const s=await e.listPools(r),o=t?.serverIndex??0,a=P["PoolsApi.listPools"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)},async listRepoPools(r,s){const o=await e.listRepoPools(r,s),a=t?.serverIndex??0,n=P["PoolsApi.listRepoPools"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async updateEnterprisePool(r,s,o,a){const n=await e.updateEnterprisePool(r,s,o,a),l=t?.serverIndex??0,i=P["PoolsApi.updateEnterprisePool"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)},async updateOrgPool(r,s,o,a){const n=await e.updateOrgPool(r,s,o,a),l=t?.serverIndex??0,i=P["PoolsApi.updateOrgPool"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)},async updatePool(r,s,o){const a=await e.updatePool(r,s,o),n=t?.serverIndex??0,l=P["PoolsApi.updatePool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async updateRepoPool(r,s,o,a){const n=await e.updateRepoPool(r,s,o,a),l=t?.serverIndex??0,i=P["PoolsApi.updateRepoPool"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)}}};class $t extends H{createEnterprisePool(e,r,s){return j(this.configuration).createEnterprisePool(e,r,s).then(o=>o(this.axios,this.basePath))}createOrgPool(e,r,s){return j(this.configuration).createOrgPool(e,r,s).then(o=>o(this.axios,this.basePath))}createRepoPool(e,r,s){return j(this.configuration).createRepoPool(e,r,s).then(o=>o(this.axios,this.basePath))}deleteEnterprisePool(e,r,s){return j(this.configuration).deleteEnterprisePool(e,r,s).then(o=>o(this.axios,this.basePath))}deleteOrgPool(e,r,s){return j(this.configuration).deleteOrgPool(e,r,s).then(o=>o(this.axios,this.basePath))}deletePool(e,r){return j(this.configuration).deletePool(e,r).then(s=>s(this.axios,this.basePath))}deleteRepoPool(e,r,s){return j(this.configuration).deleteRepoPool(e,r,s).then(o=>o(this.axios,this.basePath))}getEnterprisePool(e,r,s){return j(this.configuration).getEnterprisePool(e,r,s).then(o=>o(this.axios,this.basePath))}getOrgPool(e,r,s){return j(this.configuration).getOrgPool(e,r,s).then(o=>o(this.axios,this.basePath))}getPool(e,r){return j(this.configuration).getPool(e,r).then(s=>s(this.axios,this.basePath))}getRepoPool(e,r,s){return j(this.configuration).getRepoPool(e,r,s).then(o=>o(this.axios,this.basePath))}listEnterprisePools(e,r){return j(this.configuration).listEnterprisePools(e,r).then(s=>s(this.axios,this.basePath))}listOrgPools(e,r){return j(this.configuration).listOrgPools(e,r).then(s=>s(this.axios,this.basePath))}listPools(e){return j(this.configuration).listPools(e).then(r=>r(this.axios,this.basePath))}listRepoPools(e,r){return j(this.configuration).listRepoPools(e,r).then(s=>s(this.axios,this.basePath))}updateEnterprisePool(e,r,s,o){return j(this.configuration).updateEnterprisePool(e,r,s,o).then(a=>a(this.axios,this.basePath))}updateOrgPool(e,r,s,o){return j(this.configuration).updateOrgPool(e,r,s,o).then(a=>a(this.axios,this.basePath))}updatePool(e,r,s){return j(this.configuration).updatePool(e,r,s).then(o=>o(this.axios,this.basePath))}updateRepoPool(e,r,s,o){return j(this.configuration).updateRepoPool(e,r,s,o).then(a=>a(this.axios,this.basePath))}}const Ao=function(t){return{listProviders:async(e={})=>{const r="/providers",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}}}},Ro=function(t){const e=Ao(t);return{async listProviders(r){const s=await e.listProviders(r),o=t?.serverIndex??0,a=P["ProvidersApi.listProviders"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)}}};class Nt extends H{listProviders(e){return Ro(this.configuration).listProviders(e).then(r=>r(this.axios,this.basePath))}}const fo=function(t){return{createRepo:async(e,r={})=>{d("createRepo","body",e);const s="/repositories",o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"POST",...a,...r},l={},i={};await m(l,"Authorization",t),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},n.data=x(e,n,t),{url:S(o),options:n}},createRepoPool:async(e,r,s={})=>{d("createRepoPool","repoID",e),d("createRepoPool","body",r);const o="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},createRepoScaleSet:async(e,r,s={})=>{d("createRepoScaleSet","repoID",e),d("createRepoScaleSet","body",r);const o="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},deleteRepo:async(e,r,s={})=>{d("deleteRepo","repoID",e);const o="/repositories/{repoID}".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),r!==void 0&&(c.keepWebhook=r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deleteRepoPool:async(e,r,s={})=>{d("deleteRepoPool","repoID",e),d("deleteRepoPool","poolID",r);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getRepo:async(e,r={})=>{d("getRepo","repoID",e);const s="/repositories/{repoID}".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getRepoPool:async(e,r,s={})=>{d("getRepoPool","repoID",e),d("getRepoPool","poolID",r);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"GET",...n,...s},i={},c={};await m(i,"Authorization",t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getRepoWebhookInfo:async(e,r={})=>{d("getRepoWebhookInfo","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},installRepoWebhook:async(e,r,s={})=>{d("installRepoWebhook","repoID",e),d("installRepoWebhook","body",r);const o="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},listRepoInstances:async(e,r={})=>{d("listRepoInstances","repoID",e);const s="/repositories/{repoID}/instances".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listRepoPools:async(e,r={})=>{d("listRepoPools","repoID",e);const s="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listRepoScaleSets:async(e,r={})=>{d("listRepoScaleSets","repoID",e);const s="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listRepos:async(e,r,s,o={})=>{const a="/repositories",n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"GET",...l,...o},c={},p={};await m(c,"Authorization",t),e!==void 0&&(p.owner=e),r!==void 0&&(p.name=r),s!==void 0&&(p.endpoint=s),V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},{url:S(n),options:i}},uninstallRepoWebhook:async(e,r={})=>{d("uninstallRepoWebhook","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},updateRepo:async(e,r,s={})=>{d("updateRepo","repoID",e),d("updateRepo","body",r);const o="/repositories/{repoID}".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},updateRepoPool:async(e,r,s,o={})=>{d("updateRepoPool","repoID",e),d("updateRepoPool","poolID",r),d("updateRepoPool","body",s);const a="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(r))),n=new URL(a,b);let l;t&&(l=t.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await m(c,"Authorization",t),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,t),{url:S(n),options:i}}}},F=function(t){const e=fo(t);return{async createRepo(r,s){const o=await e.createRepo(r,s),a=t?.serverIndex??0,n=P["RepositoriesApi.createRepo"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async createRepoPool(r,s,o){const a=await e.createRepoPool(r,s,o),n=t?.serverIndex??0,l=P["RepositoriesApi.createRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async createRepoScaleSet(r,s,o){const a=await e.createRepoScaleSet(r,s,o),n=t?.serverIndex??0,l=P["RepositoriesApi.createRepoScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteRepo(r,s,o){const a=await e.deleteRepo(r,s,o),n=t?.serverIndex??0,l=P["RepositoriesApi.deleteRepo"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteRepoPool(r,s,o){const a=await e.deleteRepoPool(r,s,o),n=t?.serverIndex??0,l=P["RepositoriesApi.deleteRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getRepo(r,s){const o=await e.getRepo(r,s),a=t?.serverIndex??0,n=P["RepositoriesApi.getRepo"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getRepoPool(r,s,o){const a=await e.getRepoPool(r,s,o),n=t?.serverIndex??0,l=P["RepositoriesApi.getRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async getRepoWebhookInfo(r,s){const o=await e.getRepoWebhookInfo(r,s),a=t?.serverIndex??0,n=P["RepositoriesApi.getRepoWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async installRepoWebhook(r,s,o){const a=await e.installRepoWebhook(r,s,o),n=t?.serverIndex??0,l=P["RepositoriesApi.installRepoWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async listRepoInstances(r,s){const o=await e.listRepoInstances(r,s),a=t?.serverIndex??0,n=P["RepositoriesApi.listRepoInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listRepoPools(r,s){const o=await e.listRepoPools(r,s),a=t?.serverIndex??0,n=P["RepositoriesApi.listRepoPools"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listRepoScaleSets(r,s){const o=await e.listRepoScaleSets(r,s),a=t?.serverIndex??0,n=P["RepositoriesApi.listRepoScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listRepos(r,s,o,a){const n=await e.listRepos(r,s,o,a),l=t?.serverIndex??0,i=P["RepositoriesApi.listRepos"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)},async uninstallRepoWebhook(r,s){const o=await e.uninstallRepoWebhook(r,s),a=t?.serverIndex??0,n=P["RepositoriesApi.uninstallRepoWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async updateRepo(r,s,o){const a=await e.updateRepo(r,s,o),n=t?.serverIndex??0,l=P["RepositoriesApi.updateRepo"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async updateRepoPool(r,s,o,a){const n=await e.updateRepoPool(r,s,o,a),l=t?.serverIndex??0,i=P["RepositoriesApi.updateRepoPool"]?.[l]?.url;return(c,p)=>A(n,u,O,t)(c,i||p)}}};class Wt extends H{createRepo(e,r){return F(this.configuration).createRepo(e,r).then(s=>s(this.axios,this.basePath))}createRepoPool(e,r,s){return F(this.configuration).createRepoPool(e,r,s).then(o=>o(this.axios,this.basePath))}createRepoScaleSet(e,r,s){return F(this.configuration).createRepoScaleSet(e,r,s).then(o=>o(this.axios,this.basePath))}deleteRepo(e,r,s){return F(this.configuration).deleteRepo(e,r,s).then(o=>o(this.axios,this.basePath))}deleteRepoPool(e,r,s){return F(this.configuration).deleteRepoPool(e,r,s).then(o=>o(this.axios,this.basePath))}getRepo(e,r){return F(this.configuration).getRepo(e,r).then(s=>s(this.axios,this.basePath))}getRepoPool(e,r,s){return F(this.configuration).getRepoPool(e,r,s).then(o=>o(this.axios,this.basePath))}getRepoWebhookInfo(e,r){return F(this.configuration).getRepoWebhookInfo(e,r).then(s=>s(this.axios,this.basePath))}installRepoWebhook(e,r,s){return F(this.configuration).installRepoWebhook(e,r,s).then(o=>o(this.axios,this.basePath))}listRepoInstances(e,r){return F(this.configuration).listRepoInstances(e,r).then(s=>s(this.axios,this.basePath))}listRepoPools(e,r){return F(this.configuration).listRepoPools(e,r).then(s=>s(this.axios,this.basePath))}listRepoScaleSets(e,r){return F(this.configuration).listRepoScaleSets(e,r).then(s=>s(this.axios,this.basePath))}listRepos(e,r,s,o){return F(this.configuration).listRepos(e,r,s,o).then(a=>a(this.axios,this.basePath))}uninstallRepoWebhook(e,r){return F(this.configuration).uninstallRepoWebhook(e,r).then(s=>s(this.axios,this.basePath))}updateRepo(e,r,s){return F(this.configuration).updateRepo(e,r,s).then(o=>o(this.axios,this.basePath))}updateRepoPool(e,r,s,o){return F(this.configuration).updateRepoPool(e,r,s,o).then(a=>a(this.axios,this.basePath))}}const yo=function(t){return{createEnterpriseScaleSet:async(e,r,s={})=>{d("createEnterpriseScaleSet","enterpriseID",e),d("createEnterpriseScaleSet","body",r);const o="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},createOrgScaleSet:async(e,r,s={})=>{d("createOrgScaleSet","orgID",e),d("createOrgScaleSet","body",r);const o="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},createRepoScaleSet:async(e,r,s={})=>{d("createRepoScaleSet","repoID",e),d("createRepoScaleSet","body",r);const o="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"POST",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}},deleteScaleSet:async(e,r={})=>{d("deleteScaleSet","scalesetID",e);const s="/scalesets/{scalesetID}".replace("{scalesetID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"DELETE",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},getScaleSet:async(e,r={})=>{d("getScaleSet","scalesetID",e);const s="/scalesets/{scalesetID}".replace("{scalesetID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listEnterpriseScaleSets:async(e,r={})=>{d("listEnterpriseScaleSets","enterpriseID",e);const s="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listOrgScaleSets:async(e,r={})=>{d("listOrgScaleSets","orgID",e);const s="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listRepoScaleSets:async(e,r={})=>{d("listRepoScaleSets","repoID",e);const s="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,b);let a;t&&(a=t.baseOptions);const n={method:"GET",...a,...r},l={},i={};await m(l,"Authorization",t),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...r.headers},{url:S(o),options:n}},listScalesets:async(e={})=>{const r="/scalesets",s=new URL(r,b);let o;t&&(o=t.baseOptions);const a={method:"GET",...o,...e},n={},l={};await m(n,"Authorization",t),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},updateScaleSet:async(e,r,s={})=>{d("updateScaleSet","scalesetID",e),d("updateScaleSet","body",r);const o="/scalesets/{scalesetID}".replace("{scalesetID}",encodeURIComponent(String(e))),a=new URL(o,b);let n;t&&(n=t.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await m(i,"Authorization",t),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(r,l,t),{url:S(a),options:l}}}},X=function(t){const e=yo(t);return{async createEnterpriseScaleSet(r,s,o){const a=await e.createEnterpriseScaleSet(r,s,o),n=t?.serverIndex??0,l=P["ScalesetsApi.createEnterpriseScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async createOrgScaleSet(r,s,o){const a=await e.createOrgScaleSet(r,s,o),n=t?.serverIndex??0,l=P["ScalesetsApi.createOrgScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async createRepoScaleSet(r,s,o){const a=await e.createRepoScaleSet(r,s,o),n=t?.serverIndex??0,l=P["ScalesetsApi.createRepoScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)},async deleteScaleSet(r,s){const o=await e.deleteScaleSet(r,s),a=t?.serverIndex??0,n=P["ScalesetsApi.deleteScaleSet"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async getScaleSet(r,s){const o=await e.getScaleSet(r,s),a=t?.serverIndex??0,n=P["ScalesetsApi.getScaleSet"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listEnterpriseScaleSets(r,s){const o=await e.listEnterpriseScaleSets(r,s),a=t?.serverIndex??0,n=P["ScalesetsApi.listEnterpriseScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listOrgScaleSets(r,s){const o=await e.listOrgScaleSets(r,s),a=t?.serverIndex??0,n=P["ScalesetsApi.listOrgScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listRepoScaleSets(r,s){const o=await e.listRepoScaleSets(r,s),a=t?.serverIndex??0,n=P["ScalesetsApi.listRepoScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,t)(l,n||i)},async listScalesets(r){const s=await e.listScalesets(r),o=t?.serverIndex??0,a=P["ScalesetsApi.listScalesets"]?.[o]?.url;return(n,l)=>A(s,u,O,t)(n,a||l)},async updateScaleSet(r,s,o){const a=await e.updateScaleSet(r,s,o),n=t?.serverIndex??0,l=P["ScalesetsApi.updateScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,t)(i,l||c)}}};class Qt extends H{createEnterpriseScaleSet(e,r,s){return X(this.configuration).createEnterpriseScaleSet(e,r,s).then(o=>o(this.axios,this.basePath))}createOrgScaleSet(e,r,s){return X(this.configuration).createOrgScaleSet(e,r,s).then(o=>o(this.axios,this.basePath))}createRepoScaleSet(e,r,s){return X(this.configuration).createRepoScaleSet(e,r,s).then(o=>o(this.axios,this.basePath))}deleteScaleSet(e,r){return X(this.configuration).deleteScaleSet(e,r).then(s=>s(this.axios,this.basePath))}getScaleSet(e,r){return X(this.configuration).getScaleSet(e,r).then(s=>s(this.axios,this.basePath))}listEnterpriseScaleSets(e,r){return X(this.configuration).listEnterpriseScaleSets(e,r).then(s=>s(this.axios,this.basePath))}listOrgScaleSets(e,r){return X(this.configuration).listOrgScaleSets(e,r).then(s=>s(this.axios,this.basePath))}listRepoScaleSets(e,r){return X(this.configuration).listRepoScaleSets(e,r).then(s=>s(this.axios,this.basePath))}listScalesets(e){return X(this.configuration).listScalesets(e).then(r=>r(this.axios,this.basePath))}updateScaleSet(e,r,s){return X(this.configuration).updateScaleSet(e,r,s).then(o=>o(this.axios,this.basePath))}}class Mt{apiKey;username;password;accessToken;basePath;serverIndex;baseOptions;formDataCtor;constructor(e={}){this.apiKey=e.apiKey,this.username=e.username,this.password=e.password,this.accessToken=e.accessToken,this.basePath=e.basePath,this.serverIndex=e.serverIndex,this.baseOptions={...e.baseOptions,headers:{...e.baseOptions?.headers}},this.formDataCtor=e.formDataCtor}isJsonMime(e){const r=new RegExp("^(application/json|[^;/ ]+/[^;/ ]+[+]json)[ ]*(;.*)?$","i");return e!==null&&(r.test(e)||e.toLowerCase()==="application/json-patch+json")}}class gr{baseUrl;token;config;isDevelopmentMode(){return typeof window>"u"?!1:window.location.port==="5173"}loginApi;controllerInfoApi;controllerApi;endpointsApi;credentialsApi;repositoriesApi;organizationsApi;enterprisesApi;poolsApi;scaleSetsApi;instancesApi;providersApi;firstRunApi;hooksApi;constructor(e=""){this.baseUrl=e||window.location.origin;const r=this.isDevelopmentMode();this.config=new Mt({basePath:`${this.baseUrl}/api/v1`,accessToken:()=>this.token||"",baseOptions:{withCredentials:!r}}),this.loginApi=new qt(this.config),this.controllerInfoApi=new Lt(this.config),this.controllerApi=new Dt(this.config),this.endpointsApi=new kt(this.config),this.credentialsApi=new jt(this.config),this.repositoriesApi=new Wt(this.config),this.organizationsApi=new Ht(this.config),this.enterprisesApi=new zt(this.config),this.poolsApi=new $t(this.config),this.scaleSetsApi=new Qt(this.config),this.instancesApi=new _t(this.config),this.providersApi=new Nt(this.config),this.firstRunApi=new Ft(this.config),this.hooksApi=new Gt(this.config)}setToken(e){this.token=e;const r=this.isDevelopmentMode();this.config=new Mt({basePath:`${this.baseUrl}/api/v1`,accessToken:()=>e,baseOptions:{withCredentials:!r}}),this.loginApi=new qt(this.config),this.controllerInfoApi=new Lt(this.config),this.controllerApi=new Dt(this.config),this.endpointsApi=new kt(this.config),this.credentialsApi=new jt(this.config),this.repositoriesApi=new Wt(this.config),this.organizationsApi=new Ht(this.config),this.enterprisesApi=new zt(this.config),this.poolsApi=new $t(this.config),this.scaleSetsApi=new Qt(this.config),this.instancesApi=new _t(this.config),this.providersApi=new Nt(this.config),this.firstRunApi=new Ft(this.config),this.hooksApi=new Gt(this.config)}async login(e){const r={username:e.username,password:e.password},o=(await this.loginApi.login(r)).data.token;if(o)return this.setToken(o),{token:o};throw new Error("Login failed")}async getControllerInfo(){return(await this.controllerInfoApi.controllerInfo()).data}async listGithubEndpoints(){return(await this.endpointsApi.listGithubEndpoints()).data||[]}async getGithubEndpoint(e){return(await this.endpointsApi.getGithubEndpoint(e)).data}async createGithubEndpoint(e){return(await this.endpointsApi.createGithubEndpoint(e)).data}async updateGithubEndpoint(e,r){return(await this.endpointsApi.updateGithubEndpoint(e,r)).data}async deleteGithubEndpoint(e){await this.endpointsApi.deleteGithubEndpoint(e)}async listGiteaEndpoints(){return(await this.endpointsApi.listGiteaEndpoints()).data||[]}async getGiteaEndpoint(e){return(await this.endpointsApi.getGiteaEndpoint(e)).data}async createGiteaEndpoint(e){return(await this.endpointsApi.createGiteaEndpoint(e)).data}async updateGiteaEndpoint(e,r){return(await this.endpointsApi.updateGiteaEndpoint(e,r)).data}async deleteGiteaEndpoint(e){await this.endpointsApi.deleteGiteaEndpoint(e)}async listAllEndpoints(){const[e,r]=await Promise.all([this.listGithubEndpoints().catch(()=>[]),this.listGiteaEndpoints().catch(()=>[])]);return[...e.map(s=>({...s,endpoint_type:"github"})),...r.map(s=>({...s,endpoint_type:"gitea"}))]}async listGithubCredentials(){return(await this.credentialsApi.listCredentials()).data||[]}async getGithubCredentials(e){return(await this.credentialsApi.getCredentials(e)).data}async createGithubCredentials(e){return(await this.credentialsApi.createCredentials(e)).data}async updateGithubCredentials(e,r){return(await this.credentialsApi.updateCredentials(e,r)).data}async deleteGithubCredentials(e){await this.credentialsApi.deleteCredentials(e)}async listGiteaCredentials(){return(await this.credentialsApi.listGiteaCredentials()).data||[]}async getGiteaCredentials(e){return(await this.credentialsApi.getGiteaCredentials(e)).data}async createGiteaCredentials(e){return(await this.credentialsApi.createGiteaCredentials(e)).data}async updateGiteaCredentials(e,r){return(await this.credentialsApi.updateGiteaCredentials(e,r)).data}async deleteGiteaCredentials(e){await this.credentialsApi.deleteGiteaCredentials(e)}async listAllCredentials(){const[e,r]=await Promise.all([this.listGithubCredentials().catch(()=>[]),this.listGiteaCredentials().catch(()=>[])]);return[...e,...r]}async installRepositoryWebhook(e,r={}){await this.repositoriesApi.installRepoWebhook(e,r)}async uninstallRepositoryWebhook(e){await this.hooksApi.uninstallRepoWebhook(e)}async getRepositoryWebhookInfo(e){return(await this.hooksApi.getRepoWebhookInfo(e)).data}async listRepositories(){return(await this.repositoriesApi.listRepos()).data||[]}async getRepository(e){return(await this.repositoriesApi.getRepo(e)).data}async createRepository(e){return(await this.repositoriesApi.createRepo(e)).data}async updateRepository(e,r){return(await this.repositoriesApi.updateRepo(e,r)).data}async deleteRepository(e){await this.repositoriesApi.deleteRepo(e)}async installRepoWebhook(e){await this.repositoriesApi.installRepoWebhook(e,{})}async listRepositoryPools(e){return(await this.repositoriesApi.listRepoPools(e)).data||[]}async listRepositoryInstances(e){return(await this.repositoriesApi.listRepoInstances(e)).data||[]}async createRepositoryPool(e,r){return(await this.repositoriesApi.createRepoPool(e,r)).data}async installOrganizationWebhook(e,r={}){await this.organizationsApi.installOrgWebhook(e,r)}async uninstallOrganizationWebhook(e){await this.hooksApi.uninstallOrgWebhook(e)}async getOrganizationWebhookInfo(e){return(await this.hooksApi.getOrgWebhookInfo(e)).data}async listOrganizations(){return(await this.organizationsApi.listOrgs()).data||[]}async getOrganization(e){return(await this.organizationsApi.getOrg(e)).data}async createOrganization(e){return(await this.organizationsApi.createOrg(e)).data}async updateOrganization(e,r){return(await this.organizationsApi.updateOrg(e,r)).data}async deleteOrganization(e){await this.organizationsApi.deleteOrg(e)}async listOrganizationPools(e){return(await this.organizationsApi.listOrgPools(e)).data||[]}async listOrganizationInstances(e){return(await this.organizationsApi.listOrgInstances(e)).data||[]}async createOrganizationPool(e,r){return(await this.organizationsApi.createOrgPool(e,r)).data}async listEnterprises(){return(await this.enterprisesApi.listEnterprises()).data||[]}async getEnterprise(e){return(await this.enterprisesApi.getEnterprise(e)).data}async createEnterprise(e){return(await this.enterprisesApi.createEnterprise(e)).data}async updateEnterprise(e,r){return(await this.enterprisesApi.updateEnterprise(e,r)).data}async deleteEnterprise(e){await this.enterprisesApi.deleteEnterprise(e)}async listEnterprisePools(e){return(await this.enterprisesApi.listEnterprisePools(e)).data||[]}async listEnterpriseInstances(e){return(await this.enterprisesApi.listEnterpriseInstances(e)).data||[]}async createEnterprisePool(e,r){return(await this.enterprisesApi.createEnterprisePool(e,r)).data}async createRepositoryScaleSet(e,r){return(await this.repositoriesApi.createRepoScaleSet(e,r)).data}async listRepositoryScaleSets(e){return(await this.repositoriesApi.listRepoScaleSets(e)).data||[]}async createOrganizationScaleSet(e,r){return(await this.organizationsApi.createOrgScaleSet(e,r)).data}async listOrganizationScaleSets(e){return(await this.organizationsApi.listOrgScaleSets(e)).data||[]}async createEnterpriseScaleSet(e,r){return(await this.enterprisesApi.createEnterpriseScaleSet(e,r)).data}async listEnterpriseScaleSets(e){return(await this.enterprisesApi.listEnterpriseScaleSets(e)).data||[]}async listPools(){return(await this.poolsApi.listPools()).data||[]}async listAllPools(){return this.listPools()}async getPool(e){return(await this.poolsApi.getPool(e)).data}async updatePool(e,r){return(await this.poolsApi.updatePool(e,r)).data}async deletePool(e){await this.poolsApi.deletePool(e)}async listScaleSets(){return(await this.scaleSetsApi.listScalesets()).data||[]}async getScaleSet(e){return(await this.scaleSetsApi.getScaleSet(e.toString())).data}async updateScaleSet(e,r){return(await this.scaleSetsApi.updateScaleSet(e.toString(),r)).data}async deleteScaleSet(e){await this.scaleSetsApi.deleteScaleSet(e.toString())}async listInstances(){return(await this.instancesApi.listInstances()).data||[]}async getInstance(e){return(await this.instancesApi.getInstance(e)).data}async deleteInstance(e){await this.instancesApi.deleteInstance(e)}async listProviders(){return(await this.providersApi.listProviders()).data||[]}async listCredentials(){return this.listAllCredentials()}async listEndpoints(){return this.listAllEndpoints()}async firstRun(e){return(await this.firstRunApi.firstRun(e)).data}async updateController(e){return(await this.controllerApi.updateController(e)).data}}new gr;class wo extends gr{constructor(e=""){super(e)}}const rn=new wo;var Io=nt(''),Eo=nt(''),go=nt(''),xo=hs("");function sn(t,e){const r=bt(e,["children","$$slots","$$events","$$legacy"]),s=bt(r,["variant","size","disabled","loading","type","fullWidth","icon","iconPosition"]);cs(e,!1);const o=te(),a=te(),n=te(),l=te(),i=te(),c=te(),p=te(),R=te(),I=ps();let T=se(e,"variant",8,"primary"),f=se(e,"size",8,"md"),y=se(e,"disabled",8,!1),w=se(e,"loading",8,!1),C=se(e,"type",8,"button"),D=se(e,"fullWidth",8,!1),E=se(e,"icon",8,null),v=se(e,"iconPosition",8,"left");function U(){!y()&&!w()&&I("click")}ee(()=>{},()=>{re(o,"inline-flex items-center justify-center font-medium rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-900 cursor-pointer disabled:cursor-not-allowed")}),ee(()=>oe(f()),()=>{re(a,{sm:"px-3 py-2 text-sm",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"}[f()])}),ee(()=>oe(T()),()=>{re(n,{primary:"text-white bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 disabled:bg-gray-400 disabled:hover:bg-gray-400",secondary:"text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600 focus:ring-blue-500",danger:"text-white bg-red-600 hover:bg-red-700 focus:ring-red-500 disabled:bg-gray-400 disabled:hover:bg-gray-400",ghost:"text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800 focus:ring-blue-500"}[T()])}),ee(()=>oe(D()),()=>{re(l,D()?"w-full":"")}),ee(()=>oe(y()),()=>{re(i,y()?"opacity-50":"")}),ee(()=>(k(o),k(a),k(n),k(l),k(i)),()=>{re(c,[k(o),k(a),k(n),k(l),k(i)].filter(Boolean).join(" "))}),ee(()=>oe(f()),()=>{re(p,{sm:"h-4 w-4",md:"h-5 w-5",lg:"h-6 w-6"}[f()])}),ee(()=>(oe(v()),oe(f())),()=>{re(R,{sm:v()==="left"?"-ml-0.5 mr-2":"ml-2 -mr-0.5",md:v()==="left"?"-ml-1 mr-2":"ml-2 -mr-1",lg:v()==="left"?"-ml-1 mr-3":"ml-3 -mr-1"}[f()])}),ds(),Dr();var L=xo();Es(L,()=>({type:C(),disabled:y(),class:k(c),...s}));var B=qe(L);{var Z=W=>{var Q=Io();Ie(()=>Ee(Q,0,`animate-spin ${k(p)??""} ${v()==="left"?"-ml-1 mr-2":"ml-2 -mr-1"}`)),ue(W,Q)},ce=W=>{var Q=Ps(),Ge=bs(Q);{var Cr=_e=>{var ye=Eo(),Ur=qe(ye);mt(Ur,E,!0),He(ye),Ie(()=>Ee(ye,0,`${k(p)??""} ${k(R)??""}`)),ue(_e,ye)};$e(Ge,_e=>{E()&&v()==="left"&&_e(Cr)},!0)}ue(W,Q)};$e(B,W=>{w()?W(Z):W(ce,!1)})}var dt=Pt(B,2);ms(dt,e,"default",{});var xr=Pt(dt,2);{var vr=W=>{var Q=go(),Ge=qe(Q);mt(Ge,E,!0),He(Q),Ie(()=>Ee(Q,0,`${k(p)??""} ${k(R)??""}`)),ue(W,Q)};$e(xr,W=>{E()&&v()==="right"&&!w()&&W(vr)})}He(L),us("click",L,U),ue(t,L),Os()}export{sn as B,jo as a,Do as b,Ue as c,ko as d,ms as e,As as f,rn as g,mt as h,Es as i,ys as j,Lo as r,Ee as s}; diff --git a/webapp/assets/_app/immutable/chunks/2Xl6sR6s.js b/webapp/assets/_app/immutable/chunks/2Xl6sR6s.js new file mode 100644 index 00000000..044d3bcb --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/2Xl6sR6s.js @@ -0,0 +1,2 @@ +import"./DsnmJJEf.js";import{i as Hr}from"./C7KraPli.js";import{p as Kr,E as Wr,m as u,o as Qr,k as n,l as pr,g as e,h as Vr,f as w,d,r as t,s as o,t as v,y as Pe,u as b,z as br,q as j,e as h,i as G,b as c,B as Xr,a as gr,D as cr,c as Yr}from"./cPTQ2Ibn.js";import{p as Zr,i as I,s as et,a as rt}from"./DqFqoVWr.js";import{e as fr,i as vr}from"./CiWDXYQd.js";import{r as k,s as mr,b as Je,c as yr,g as tt,d as xr}from"./DqbUkQgD.js";import{b as S,a as at}from"./B-_QCM7E.js";import{p as dt}from"./D4Caz1gY.js";import{M as ot}from"./Bo3f8OIz.js";import{J as it}from"./D6f8Dk7c.js";import{e as _r}from"./BZiHL9L3.js";import{e as nt}from"./JUkrBp3F.js";var st=w('

'),lt=w('

'),ut=w('
Loading templates...
'),pt=w(""),bt=w('

',1),gt=w('

Create a template first or proceed without a template to use default behavior.

'),ct=w(' '),ft=w('
'),vt=w('
Updating...
'),mt=w('

Pool Information (Read-only)

Provider:
Entity:

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Tags
Extra Specs (JSON)
');function Pt(hr,Me){Kr(Me,!1);const[kr,wr]=et(),U=()=>rt(nt,"$eagerCache",kr);let a=Zr(Me,"pool",8);const Z=Wr();let z=u(!1),B=u(""),T=u(""),m=u([]),ee=u(!1),L=u(a().image||""),F=u(a().flavor||""),O=u(a().max_runners),P=u(a().min_idle_runners),q=u(a().runner_bootstrap_timeout),H=u(a().priority),K=u(a().runner_prefix||""),y=u(a().os_type||"linux"),D=u(a().os_arch||"amd64"),W=u(a()["github-runner-group"]||""),Q=u(a().enabled),x=u((a().tags||[]).map(i=>i.name||"").filter(Boolean)),C=u(""),J=u("{}"),$=u(a().template_id);function Tr(i){if(i.repo_id){const s=U().repositories.find(p=>p.id===i.repo_id);return s?`${s.owner}/${s.name}`:"Unknown Entity"}if(i.org_id){const s=U().organizations.find(p=>p.id===i.org_id);return s&&s.name?s.name:"Unknown Entity"}if(i.enterprise_id){const s=U().enterprises.find(p=>p.id===i.enterprise_id);return s&&s.name?s.name:"Unknown Entity"}return"Unknown Entity"}function $r(i){return i.repo_id?"Repository":i.org_id?"Organization":i.enterprise_id?"Enterprise":"Unknown"}function re(){if(a().endpoint?.endpoint_type)return a().endpoint.endpoint_type;if(a().repo_id){const i=U().repositories.find(s=>s.id===a().repo_id);if(i?.endpoint?.endpoint_type)return i.endpoint.endpoint_type}if(a().org_id){const i=U().organizations.find(s=>s.id===a().org_id);if(i?.endpoint?.endpoint_type)return i.endpoint.endpoint_type}if(a().enterprise_id){const i=U().enterprises.find(s=>s.id===a().enterprise_id);if(i?.endpoint?.endpoint_type)return i.endpoint.endpoint_type}return null}async function Ne(){try{n(ee,!0);const i=re();if(!i){n(m,[]);return}if(n(m,await tt.listTemplates(e(y),void 0,i)),!e($)||!e(m).find(s=>s.id===e($))){const s=e(m).find(p=>p.owner_id==="system");s?n($,s.id):e(m).length>0&&n($,e(m)[0].id)}}catch(i){n(B,_r(i))}finally{n(ee,!1)}}Qr(()=>{if(a().extra_specs)try{if(typeof a().extra_specs=="object")n(J,JSON.stringify(a().extra_specs,null,2));else{const i=JSON.parse(a().extra_specs);n(J,JSON.stringify(i,null,2))}}catch{n(J,a().extra_specs||"{}")}Ne()});function Ae(){e(C).trim()&&!e(x).includes(e(C).trim())&&(n(x,[...e(x),e(C).trim()]),n(C,""))}function Er(i){n(x,e(x).filter((s,p)=>p!==i))}function Rr(i){i.key==="Enter"&&(i.preventDefault(),Ae())}async function Sr(){try{if(n(z,!0),n(B,""),e(T))throw new Error(e(T));let i={};if(e(J).trim())try{i=JSON.parse(e(J))}catch{throw new Error("Invalid JSON in extra specs")}const s={image:e(L)!==a().image?e(L):void 0,flavor:e(F)!==a().flavor?e(F):void 0,max_runners:e(O)!==a().max_runners?e(O):void 0,min_idle_runners:e(P)!==a().min_idle_runners?e(P):void 0,runner_bootstrap_timeout:e(q)!==a().runner_bootstrap_timeout?e(q):void 0,priority:e(H)!==a().priority?e(H):void 0,runner_prefix:e(K)!==a().runner_prefix?e(K):void 0,os_type:e(y)!==a().os_type?e(y):void 0,os_arch:e(D)!==a().os_arch?e(D):void 0,"github-runner-group":e(W)!==a()["github-runner-group"]&&e(W)||void 0,enabled:e(Q)!==a().enabled?e(Q):void 0,tags:JSON.stringify(e(x))!==JSON.stringify((a().tags||[]).map(p=>p.name||"").filter(Boolean))?e(x):void 0,extra_specs:e(J).trim()!==JSON.stringify(a().extra_specs||{},null,2).trim()?i:void 0,template_id:e($)!==a().template_id?e($):void 0};Object.keys(s).forEach(p=>{s[p]===void 0&&delete s[p]}),Z("submit",s)}catch(i){n(B,_r(i))}finally{n(z,!1)}}pr(()=>e(y),()=>{e(y)&&Ne()}),pr(()=>(e(P),e(O)),()=>{e(P)!==null&&e(P)!==void 0&&e(O)!==null&&e(O)!==void 0&&e(P)>e(O)?n(T,"Min idle runners cannot be greater than max runners"):n(T,"")}),Vr(),Hr(),ot(hr,{$$events:{close:()=>Z("close")},children:(i,s)=>{var p=mt(),te=d(p),Ie=d(te),Or=d(Ie);t(Ie),t(te);var ae=o(te,2),Ue=d(ae);{var Pr=r=>{var l=st(),E=d(l),M=d(E,!0);t(E),t(l),v(()=>h(M,e(B))),c(r,l)};I(Ue,r=>{e(B)&&r(Pr)})}var Ce=o(Ue,2);{var Jr=r=>{var l=lt(),E=d(l),M=d(E,!0);t(E),t(l),v(()=>h(M,e(T))),c(r,l)};I(Ce,r=>{e(T)&&r(Jr)})}var de=o(Ce,2),Be=o(d(de),2),oe=d(Be),De=o(d(oe),2),Mr=d(De,!0);t(De),t(oe);var je=o(oe,2),Ge=o(d(je),2),Nr=d(Ge);t(Ge),t(je),t(Be),t(de);var ie=o(de,2),ze=o(d(ie),2),ne=d(ze),Le=o(d(ne),2);k(Le),t(ne);var se=o(ne,2),Fe=o(d(se),2);k(Fe),t(se);var le=o(se,2),ue=o(d(le),2);v(()=>{e(y),Pe(()=>{})});var pe=d(ue);pe.value=pe.__value="linux";var qe=o(pe);qe.value=qe.__value="windows",t(ue),t(le);var be=o(le,2),ge=o(d(be),2);v(()=>{e(D),Pe(()=>{})});var ce=d(ge);ce.value=ce.__value="amd64";var He=o(ce);He.value=He.__value="arm64",t(ge),t(be);var Ke=o(be,2),Ar=o(d(Ke),2);{var Ir=r=>{var l=ut();c(r,l)},Ur=r=>{var l=Xr(),E=gr(l);{var M=_=>{var R=bt(),f=gr(R);v(()=>{e($),Pe(()=>{e(m)})}),fr(f,5,()=>e(m),vr,(N,g)=>{var A=pt(),sr=d(A),Fr=o(sr);{var qr=Oe=>{var ur=cr();v(()=>h(ur,`- ${e(g),b(()=>e(g).description)??""}`)),c(Oe,ur)};I(Fr,Oe=>{e(g),b(()=>e(g).description)&&Oe(qr)})}t(A);var lr={};v(()=>{h(sr,`${e(g),b(()=>e(g).name)??""} ${e(g),b(()=>e(g).owner_id==="system"?"(System)":"")??""} `),lr!==(lr=(e(g),b(()=>e(g).id)))&&(A.value=(A.__value=(e(g),b(()=>e(g).id)))??"")}),c(N,A)}),t(f);var X=o(f,2),Y=d(X);t(X),v(N=>h(Y,`Templates define how the runner software is installed and configured. + Showing templates for ${N??""} ${e(y)??""}.`),[()=>b(re)]),Je(f,()=>e($),N=>n($,N)),c(_,R)},Se=_=>{var R=gt(),f=d(R),X=d(f);t(f);var Y=o(f,2),N=d(Y);br(),t(Y),t(R),v((g,A)=>{h(X,`No templates found for ${g??""} ${e(y)??""}.`),yr(N,"href",A)},[()=>b(re),()=>(j(xr),b(()=>xr("/templates")))]),c(_,R)};I(E,_=>{e(m),b(()=>e(m).length>0)?_(M):_(Se,!1)},!0)}c(r,l)};I(Ar,r=>{e(ee)?r(Ir):r(Ur,!1)})}t(Ke),t(ze),t(ie);var fe=o(ie,2),We=o(d(fe),2),ve=d(We),me=o(d(ve),2);k(me),t(ve);var ye=o(ve,2),xe=o(d(ye),2);k(xe),t(ye);var Qe=o(ye,2),Ve=o(d(Qe),2);k(Ve),t(Qe),t(We),t(fe);var _e=o(fe,2),he=o(d(_e),2),ke=d(he),Xe=o(d(ke),2);k(Xe),t(ke);var we=o(ke,2),Ye=o(d(we),2);k(Ye),t(we);var Ze=o(we,2),er=o(d(Ze),2);k(er),t(Ze),t(he);var Te=o(he,2),rr=d(Te),tr=o(d(rr),2),$e=d(tr),V=d($e);k(V);var Cr=o(V,2);t($e);var Br=o($e,2);{var Dr=r=>{var l=ft();fr(l,5,()=>e(x),vr,(E,M,Se)=>{var _=ct(),R=d(_),f=o(R);t(_),v(()=>{h(R,`${e(M)??""} `),yr(f,"aria-label",`Remove tag ${e(M)??""}`)}),G("click",f,()=>Er(Se)),c(E,_)}),t(l),c(r,l)};I(Br,r=>{e(x),b(()=>e(x).length>0)&&r(Dr)})}t(tr),t(rr),t(Te);var Ee=o(Te,2),ar=d(Ee),jr=o(d(ar),2);it(jr,{rows:4,placeholder:"{}",get value(){return e(J)},set value(r){n(J,r)},$$legacy:!0}),t(ar),t(Ee);var dr=o(Ee,2),or=d(dr);k(or),br(2),t(dr),t(_e);var ir=o(_e,2),nr=d(ir),Re=o(nr,2),Gr=d(Re);{var zr=r=>{var l=vt();c(r,l)},Lr=r=>{var l=cr("Update Pool");c(r,l)};I(Gr,r=>{e(z)?r(zr):r(Lr,!1)})}t(Re),t(ir),t(ae),t(p),v((r,l)=>{h(Or,`Update Pool ${j(a()),b(()=>a().id)??""}`),h(Mr,(j(a()),b(()=>a().provider_name))),h(Nr,`${r??""}: ${l??""}`),mr(me,1,`w-full px-3 py-2 border ${e(T)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),mr(xe,1,`w-full px-3 py-2 border ${e(T)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),Re.disabled=e(z)||e(T)!==""},[()=>(j(a()),b(()=>$r(a()))),()=>(j(a()),b(()=>Tr(a())))]),S(Le,()=>e(L),r=>n(L,r)),S(Fe,()=>e(F),r=>n(F,r)),Je(ue,()=>e(y),r=>n(y,r)),Je(ge,()=>e(D),r=>n(D,r)),S(me,()=>e(P),r=>n(P,r)),S(xe,()=>e(O),r=>n(O,r)),S(Ve,()=>e(q),r=>n(q,r)),S(Xe,()=>e(K),r=>n(K,r)),S(Ye,()=>e(H),r=>n(H,r)),S(er,()=>e(W),r=>n(W,r)),S(V,()=>e(C),r=>n(C,r)),G("keydown",V,Rr),G("click",Cr,Ae),at(or,()=>e(Q),r=>n(Q,r)),G("click",nr,()=>Z("close")),G("submit",ae,dt(Sr)),c(i,p)},$$slots:{default:!0}}),Yr(),wr()}export{Pt as U}; diff --git a/webapp/assets/_app/immutable/chunks/41x1-UqF.js b/webapp/assets/_app/immutable/chunks/41x1-UqF.js new file mode 100644 index 00000000..691c56fd --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/41x1-UqF.js @@ -0,0 +1 @@ +import{H as l,I as u,J as m,K as _,L as p,M as h,N as v,O as b,P as g,Q as x}from"./cPTQ2Ibn.js";function E(s,i,d){l&&u();var r=s,a,n,e=null,t=null;function f(){n&&(x(n),n=null),e&&(e.lastChild.remove(),r.before(e),e=null),n=t,t=null}m(()=>{if(a!==(a=i())){var c=b();if(a){var o=r;c&&(e=document.createDocumentFragment(),e.append(o=p())),t=h(()=>d(o,a))}c?v.add_callback(f):f()}},_),l&&(r=g)}export{E as c}; diff --git a/webapp/assets/_app/immutable/chunks/BXdh0O4_.js b/webapp/assets/_app/immutable/chunks/91PQ6UtW.js similarity index 54% rename from webapp/assets/_app/immutable/chunks/BXdh0O4_.js rename to webapp/assets/_app/immutable/chunks/91PQ6UtW.js index bac4de19..51836f79 100644 --- a/webapp/assets/_app/immutable/chunks/BXdh0O4_.js +++ b/webapp/assets/_app/immutable/chunks/91PQ6UtW.js @@ -1 +1 @@ -import"./DsnmJJEf.js";import{i as q}from"./DT0EGONV.js";import{p as A,E as F,f as y,k as l,j as e,r as a,z as $,D as b,c as o,t as p,v as n,d as G}from"./CRKWEg6v.js";import{p as v,i as H}from"./e1m7WRO5.js";import{M as I}from"./xe-4nY5o.js";import{B as w}from"./-esynYXT.js";var J=y('

'),K=y('

');function W(D,s){A(s,!1);let j=v(s,"title",8),M=v(s,"message",8),g=v(s,"itemName",8,""),d=v(s,"loading",8,!1);const c=F();function B(){c("confirm")}q(),I(D,{$$events:{close:()=>c("close")},children:(C,O)=>{var m=K(),f=l(e(m),2),u=e(f),P=e(u,!0);a(u);var h=l(u,2),x=e(h),z=e(x,!0);a(x);var E=l(x,2);{var L=t=>{var i=J(),r=e(i,!0);a(i),p(()=>n(r,g())),o(t,i)};H(E,t=>{g()&&t(L)})}a(h),a(f);var _=l(f,2),k=e(_);w(k,{variant:"secondary",get disabled(){return d()},$$events:{click:()=>c("close")},children:(t,i)=>{$();var r=b("Cancel");o(t,r)},$$slots:{default:!0}});var N=l(k,2);w(N,{variant:"danger",get disabled(){return d()},get loading(){return d()},$$events:{click:B},children:(t,i)=>{$();var r=b();p(()=>n(r,d()?"Deleting...":"Delete")),o(t,r)},$$slots:{default:!0}}),a(_),a(m),p(()=>{n(P,j()),n(z,M())}),o(C,m)},$$slots:{default:!0}}),G()}export{W as D}; +import"./DsnmJJEf.js";import{i as q}from"./C7KraPli.js";import{p as A,E as F,f as y,s as l,d as t,r as a,z as $,D as b,b as o,t as p,e as n,c as G}from"./cPTQ2Ibn.js";import{p as v,i as H}from"./DqFqoVWr.js";import{M as I}from"./Bo3f8OIz.js";import{B as w}from"./DqbUkQgD.js";var J=y('

'),K=y('

');function W(D,s){A(s,!1);let M=v(s,"title",8),j=v(s,"message",8),g=v(s,"itemName",8,""),d=v(s,"loading",8,!1);const c=F();function B(){c("confirm")}q(),I(D,{$$events:{close:()=>c("close")},children:(C,O)=>{var m=K(),f=l(t(m),2),u=t(f),P=t(u,!0);a(u);var h=l(u,2),x=t(h),z=t(x,!0);a(x);var E=l(x,2);{var L=e=>{var i=J(),r=t(i,!0);a(i),p(()=>n(r,g())),o(e,i)};H(E,e=>{g()&&e(L)})}a(h),a(f);var _=l(f,2),k=t(_);w(k,{variant:"secondary",get disabled(){return d()},$$events:{click:()=>c("close")},children:(e,i)=>{$();var r=b("Cancel");o(e,r)},$$slots:{default:!0}});var N=l(k,2);w(N,{variant:"danger",get disabled(){return d()},get loading(){return d()},$$events:{click:B},children:(e,i)=>{$();var r=b();p(()=>n(r,d()?"Deleting...":"Delete")),o(e,r)},$$slots:{default:!0}}),a(_),a(m),p(()=>{n(P,M()),n(z,j())}),o(C,m)},$$slots:{default:!0}}),G()}export{W as D}; diff --git a/webapp/assets/_app/immutable/chunks/B-_QCM7E.js b/webapp/assets/_app/immutable/chunks/B-_QCM7E.js new file mode 100644 index 00000000..6df06e24 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/B-_QCM7E.js @@ -0,0 +1 @@ +import{aj as b,ak as o,u as h,ah as _,H as t,N as f,al as m}from"./cPTQ2Ibn.js";function y(e,a,c=a){var v=b(),d=new WeakSet;o(e,"input",r=>{var l=r?e.defaultValue:e.value;if(l=n(e)?s(l):l,c(l),f!==null&&d.add(f),v&&l!==(l=a())){var k=e.selectionStart,u=e.selectionEnd;e.value=l??"",u!==null&&(e.selectionStart=k,e.selectionEnd=Math.min(u,e.value.length))}}),(t&&e.defaultValue!==e.value||h(a)==null&&e.value)&&(c(n(e)?s(e.value):e.value),f!==null&&d.add(f)),_(()=>{var r=a();if(e===document.activeElement){var l=m??f;if(d.has(l))return}n(e)&&r===s(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function E(e,a,c=a){o(e,"change",v=>{var d=v?e.defaultChecked:e.checked;c(d)}),(t&&e.defaultChecked!==e.checked||h(a)==null)&&c(e.checked),_(()=>{var v=a();e.checked=!!v})}function n(e){var a=e.type;return a==="number"||a==="range"}function s(e){return e===""?null:+e}export{E as a,y as b}; diff --git a/webapp/assets/_app/immutable/chunks/B0Y2gXDu.js b/webapp/assets/_app/immutable/chunks/B0Y2gXDu.js deleted file mode 100644 index c6feb1b1..00000000 --- a/webapp/assets/_app/immutable/chunks/B0Y2gXDu.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as v}from"./DT0EGONV.js";import{p as w,l as m,n as s,g as r,m as g,a as x,B as h,b as T,c as B,d as S,s as k,u}from"./CRKWEg6v.js";import{k as A}from"./B1coRVG4.js";import{p as d}from"./e1m7WRO5.js";import{k as b,B as C}from"./c_t0vA9G.js";import{f as E}from"./ow_oMtSd.js";function q(_,i){w(i,!1);const c=g(),n=g();let e=d(i,"item",8),l=d(i,"statusType",8,"entity"),a=d(i,"statusField",8,"status");m(()=>(s(e()),s(a())),()=>{k(c,e()?.[a()]||"unknown")}),m(()=>(s(e()),s(l()),r(c),s(a())),()=>{k(n,(()=>{if(!e())return{variant:"error",text:"Unknown"};switch(l()){case"entity":return b(e());case"instance":let t="secondary";switch(r(c).toLowerCase()){case"running":t="success";break;case"stopped":t="info";break;case"creating":case"pending_create":t="warning";break;case"deleting":case"pending_delete":case"pending_force_delete":t="warning";break;case"error":case"deleted":t="error";break;case"active":case"online":t="success";break;case"idle":t="info";break;case"pending":case"installing":t="warning";break;case"failed":case"terminated":case"offline":t="error";break;case"unknown":default:t="secondary";break}return{variant:t,text:E(r(c))};case"enabled":return{variant:e().enabled?"success":"error",text:e().enabled?"Enabled":"Disabled"};case"custom":const o=e()[a()]||"Unknown";if(a()==="auth-type"){const f=o==="pat"||!o?"pat":"app";return{variant:f==="pat"?"success":"info",text:f==="pat"?"PAT":"App"}}return{variant:"info",text:o};default:return b(e())}})())}),x(),v();var p=h(),y=T(p);A(y,()=>(s(e()),s(a()),u(()=>`${e()?.name||"item"}-${e()?.[a()]||"status"}-${e()?.updated_at||"time"}`)),t=>{C(t,{get variant(){return r(n),u(()=>r(n).variant)},get text(){return r(n),u(()=>r(n).text)}})}),B(_,p),S()}export{q as S}; diff --git a/webapp/assets/_app/immutable/chunks/DxLDbRe7.js b/webapp/assets/_app/immutable/chunks/B1V2wE0x.js similarity index 77% rename from webapp/assets/_app/immutable/chunks/DxLDbRe7.js rename to webapp/assets/_app/immutable/chunks/B1V2wE0x.js index a5cf66db..4a3fe93d 100644 --- a/webapp/assets/_app/immutable/chunks/DxLDbRe7.js +++ b/webapp/assets/_app/immutable/chunks/B1V2wE0x.js @@ -1 +1 @@ -import"./DsnmJJEf.js";import{i as qe}from"./DT0EGONV.js";import{p as Fe,E as Ke,o as Ge,f as x,j as t,r,k as s,g as e,m,z as B,t as y,y as ue,u as l,v,n as T,s as i,e as be,c as u,D as He,d as Je}from"./CRKWEg6v.js";import{p as ge,i as U}from"./e1m7WRO5.js";import{e as Qe,i as Ve}from"./C73ZVvpW.js";import{r as me,b as ye,g as Xe}from"./-esynYXT.js";import{a as Ye,b as Ze}from"./B3a35v7J.js";import{p as ea}from"./D4Caz1gY.js";import{e as xe}from"./BZiHL9L3.js";import{M as aa}from"./xe-4nY5o.js";var ta=x('

'),ra=x('
Owner:
'),oa=x('
'),sa=x(""),na=x(''),ia=x('

Leave empty to auto-generate a new secret

'),da=x('
Updating...
'),la=x('

Name:
Endpoint:
Current Credentials:
Current Pool Balancer:

Leave unchanged to keep current credentials

Round Robin distributes jobs evenly across pools, Pack fills pools in order

');function _a(fe,D){Fe(D,!1);let d=ge(D,"entity",8),w=ge(D,"entityType",8);const $=Ke();let C=m(!1),k=m(""),M=m([]),R=m(!1),f=m(""),_=m(""),h=m(""),b=m(!1);function _e(){if(w()==="repository"){const c=d();return`${c.owner}/${c.name}`}return d().name||""}function W(){return w().charAt(0).toUpperCase()+w().slice(1)}function he(){return w()==="repository"&&d().owner||""}async function ke(){try{i(R,!0),i(M,await Xe.listCredentials())}catch(c){i(k,xe(c))}finally{i(R,!1)}}function we(){i(f,d().credentials_name||""),i(_,d().pool_balancing_type||"roundrobin"),i(h,""),i(b,!1)}async function Ce(){try{i(C,!0),i(k,"");const c={};let E=!1;if(e(f)&&e(f)!==d().credentials_name&&(c.credentials_name=e(f),E=!0),e(_)&&e(_)!==d().pool_balancing_type&&(c.pool_balancer_type=e(_),E=!0),e(b)){if(!e(h).trim()){i(k,"Please enter a webhook secret or uncheck the option to change it");return}c.webhook_secret=e(h),E=!0}if(!E){$("close");return}$("submit",c)}catch(c){i(k,xe(c))}finally{i(C,!1)}}Ge(()=>{ke(),we()}),qe(),aa(fe,{$$events:{close:()=>$("close")},children:(c,E)=>{var j=la(),A=t(j),N=t(A),Ee=t(N);r(N);var Y=s(N,2),Se=t(Y,!0);r(Y),r(A);var z=s(A,2),Z=t(z);{var Pe=a=>{var o=ta(),n=t(o),p=t(n,!0);r(n),r(o),y(()=>v(p,e(k))),u(a,o)};U(Z,a=>{e(k)&&a(Pe)})}var I=s(Z,2),L=t(I),Ue=t(L);r(L);var ee=s(L,2),ae=t(ee);{var $e=a=>{var o=ra(),n=s(t(o),2),p=t(n,!0);r(n),r(o),y(S=>v(p,S),[()=>l(he)]),u(a,o)};U(ae,a=>{w()==="repository"&&a($e)})}var O=s(ae,2),te=s(t(O),2),Be=t(te,!0);r(te),r(O);var q=s(O,2),re=s(t(q),2),Te=t(re,!0);r(re),r(q);var F=s(q,2),oe=s(t(F),2),De=t(oe,!0);r(oe),r(F);var se=s(F,2),ne=s(t(se),2),Me=t(ne,!0);r(ne),r(se),r(ee),r(I);var K=s(I,2),G=t(K),Re=s(t(G),2);{var We=a=>{var o=oa();u(a,o)},je=a=>{var o=na();y(()=>{e(f),ue(()=>{e(M)})});var n=t(o);n.value=n.__value="";var p=s(n);Qe(p,1,()=>e(M),Ve,(S,g)=>{var P=sa(),Oe=t(P);r(P);var pe={};y(()=>{v(Oe,`${e(g),l(()=>e(g).name)??""} (${e(g),l(()=>e(g).endpoint?.name||"Unknown")??""})`),pe!==(pe=(e(g),l(()=>e(g).name)))&&(P.value=(P.__value=(e(g),l(()=>e(g).name)))??"")}),u(S,P)}),r(o),ye(o,()=>e(f),S=>i(f,S)),u(a,o)};U(Re,a=>{e(R)?a(We):a(je,!1)})}B(2),r(G);var H=s(G,2),J=s(t(H),2);y(()=>{e(_),ue(()=>{})});var Q=t(J);Q.value=Q.__value="roundrobin";var ie=s(Q);ie.value=ie.__value="pack",r(J),B(2),r(H);var de=s(H,2),V=t(de),le=t(V);me(le),B(2),r(V);var Ae=s(V,2);{var Ne=a=>{var o=ia(),n=s(t(o),2);me(n),B(2),r(o),y(()=>n.required=e(b)),Ze(n,()=>e(h),p=>i(h,p)),u(a,o)};U(Ae,a=>{e(b)&&a(Ne)})}r(de),r(K);var ce=s(K,2),ve=t(ce),X=s(ve,2),ze=t(X);{var Ie=a=>{var o=da();u(a,o)},Le=a=>{var o=He();y(n=>v(o,`Update ${n??""}`),[()=>l(W)]),u(a,o)};U(ze,a=>{e(C)?a(Ie):a(Le,!1)})}r(X),r(ce),r(z),r(j),y((a,o,n,p)=>{v(Ee,`Update ${a??""}`),v(Se,o),v(Ue,`${n??""} Information`),v(Be,(T(d()),l(()=>d().name))),v(Te,(T(d()),l(()=>d().endpoint?.name))),v(De,(T(d()),l(()=>d().credentials_name))),v(Me,(T(d()),l(()=>d().pool_balancing_type||"roundrobin"))),X.disabled=p},[()=>l(W),()=>l(_e),()=>l(W),()=>(e(C),e(b),e(h),l(()=>e(C)||e(b)&&!e(h).trim()))]),ye(J,()=>e(_),a=>i(_,a)),Ye(le,()=>e(b),a=>i(b,a)),be("click",ve,()=>$("close")),be("submit",z,ea(Ce)),u(c,j)},$$slots:{default:!0}}),Je()}export{_a as U}; +import"./DsnmJJEf.js";import{i as Oe}from"./C7KraPli.js";import{p as Fe,E as Ke,o as Ge,f as x,d as t,r,s,g as e,m,z as B,t as y,y as ue,u as l,e as v,q as T,k as i,i as be,b as u,D as He,c as Je}from"./cPTQ2Ibn.js";import{p as ge,i as U}from"./DqFqoVWr.js";import{e as Qe,i as Ve}from"./CiWDXYQd.js";import{r as me,b as ye,g as Xe}from"./DqbUkQgD.js";import{a as Ye,b as Ze}from"./B-_QCM7E.js";import{p as ea}from"./D4Caz1gY.js";import{e as xe}from"./BZiHL9L3.js";import{M as aa}from"./Bo3f8OIz.js";var ta=x('

'),ra=x('
Owner:
'),oa=x('
'),sa=x(""),na=x(''),ia=x('

Leave empty to auto-generate a new secret

'),da=x('
Updating...
'),la=x('

Name:
Endpoint:
Current Credentials:
Current Pool Balancer:

Leave unchanged to keep current credentials

Round Robin distributes jobs evenly across pools, Pack fills pools in order

');function _a(fe,D){Fe(D,!1);let d=ge(D,"entity",8),w=ge(D,"entityType",8);const $=Ke();let C=m(!1),k=m(""),M=m([]),R=m(!1),f=m(""),_=m(""),h=m(""),b=m(!1);function _e(){if(w()==="repository"){const c=d();return`${c.owner}/${c.name}`}return d().name||""}function W(){return w().charAt(0).toUpperCase()+w().slice(1)}function he(){return w()==="repository"&&d().owner||""}async function ke(){try{i(R,!0),i(M,await Xe.listCredentials())}catch(c){i(k,xe(c))}finally{i(R,!1)}}function we(){i(f,d().credentials_name||""),i(_,d().pool_balancing_type||"roundrobin"),i(h,""),i(b,!1)}async function Ce(){try{i(C,!0),i(k,"");const c={};let E=!1;if(e(f)&&e(f)!==d().credentials_name&&(c.credentials_name=e(f),E=!0),e(_)&&e(_)!==d().pool_balancing_type&&(c.pool_balancer_type=e(_),E=!0),e(b)){if(!e(h).trim()){i(k,"Please enter a webhook secret or uncheck the option to change it");return}c.webhook_secret=e(h),E=!0}if(!E){$("close");return}$("submit",c)}catch(c){i(k,xe(c))}finally{i(C,!1)}}Ge(()=>{ke(),we()}),Oe(),aa(fe,{$$events:{close:()=>$("close")},children:(c,E)=>{var A=la(),N=t(A),j=t(N),Ee=t(j);r(j);var Y=s(j,2),Se=t(Y,!0);r(Y),r(N);var q=s(N,2),Z=t(q);{var Pe=a=>{var o=ta(),n=t(o),p=t(n,!0);r(n),r(o),y(()=>v(p,e(k))),u(a,o)};U(Z,a=>{e(k)&&a(Pe)})}var z=s(Z,2),I=t(z),Ue=t(I);r(I);var ee=s(I,2),ae=t(ee);{var $e=a=>{var o=ra(),n=s(t(o),2),p=t(n,!0);r(n),r(o),y(S=>v(p,S),[()=>l(he)]),u(a,o)};U(ae,a=>{w()==="repository"&&a($e)})}var L=s(ae,2),te=s(t(L),2),Be=t(te,!0);r(te),r(L);var O=s(L,2),re=s(t(O),2),Te=t(re,!0);r(re),r(O);var F=s(O,2),oe=s(t(F),2),De=t(oe,!0);r(oe),r(F);var se=s(F,2),ne=s(t(se),2),Me=t(ne,!0);r(ne),r(se),r(ee),r(z);var K=s(z,2),G=t(K),Re=s(t(G),2);{var We=a=>{var o=oa();u(a,o)},Ae=a=>{var o=na();y(()=>{e(f),ue(()=>{e(M)})});var n=t(o);n.value=n.__value="";var p=s(n);Qe(p,1,()=>e(M),Ve,(S,g)=>{var P=sa(),Le=t(P);r(P);var pe={};y(()=>{v(Le,`${e(g),l(()=>e(g).name)??""} (${e(g),l(()=>e(g).endpoint?.name||"Unknown")??""})`),pe!==(pe=(e(g),l(()=>e(g).name)))&&(P.value=(P.__value=(e(g),l(()=>e(g).name)))??"")}),u(S,P)}),r(o),ye(o,()=>e(f),S=>i(f,S)),u(a,o)};U(Re,a=>{e(R)?a(We):a(Ae,!1)})}B(2),r(G);var H=s(G,2),J=s(t(H),2);y(()=>{e(_),ue(()=>{})});var Q=t(J);Q.value=Q.__value="roundrobin";var ie=s(Q);ie.value=ie.__value="pack",r(J),B(2),r(H);var de=s(H,2),V=t(de),le=t(V);me(le),B(2),r(V);var Ne=s(V,2);{var je=a=>{var o=ia(),n=s(t(o),2);me(n),B(2),r(o),y(()=>n.required=e(b)),Ze(n,()=>e(h),p=>i(h,p)),u(a,o)};U(Ne,a=>{e(b)&&a(je)})}r(de),r(K);var ce=s(K,2),ve=t(ce),X=s(ve,2),qe=t(X);{var ze=a=>{var o=da();u(a,o)},Ie=a=>{var o=He();y(n=>v(o,`Update ${n??""}`),[()=>l(W)]),u(a,o)};U(qe,a=>{e(C)?a(ze):a(Ie,!1)})}r(X),r(ce),r(q),r(A),y((a,o,n,p)=>{v(Ee,`Update ${a??""}`),v(Se,o),v(Ue,`${n??""} Information`),v(Be,(T(d()),l(()=>d().name))),v(Te,(T(d()),l(()=>d().endpoint?.name))),v(De,(T(d()),l(()=>d().credentials_name))),v(Me,(T(d()),l(()=>d().pool_balancing_type||"roundrobin"))),X.disabled=p},[()=>l(W),()=>l(_e),()=>l(W),()=>(e(C),e(b),e(h),l(()=>e(C)||e(b)&&!e(h).trim()))]),ye(J,()=>e(_),a=>i(_,a)),Ye(le,()=>e(b),a=>i(b,a)),be("click",ve,()=>$("close")),be("submit",q,ea(Ce)),u(c,A)},$$slots:{default:!0}}),Je()}export{_a as U}; diff --git a/webapp/assets/_app/immutable/chunks/B1coRVG4.js b/webapp/assets/_app/immutable/chunks/B1coRVG4.js deleted file mode 100644 index 91a4dba2..00000000 --- a/webapp/assets/_app/immutable/chunks/B1coRVG4.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as ke}from"./DT0EGONV.js";import{V as ut,aU as gt,aV as ft,M as ht,O as mt,P as pt,Q as kt,R as xt,at as _t,K as Xe,L as yt,U as bt,T as wt,a8 as Mt,p as fe,l as $,s as ee,m as te,n as u,a as Le,C as ye,j as s,g as e,r as n,t as R,c as i,d as he,E as be,f as L,e as Ge,u as v,k as j,v as O,z as Se,D as Te,B as Q,b as q,y as Pt,q as X}from"./CRKWEg6v.js";import{p as o,l as Ye,i as I,b as Ct}from"./e1m7WRO5.js";import{e as de,i as ge}from"./C73ZVvpW.js";import{h as Ae,s as pe,i as jt,f as zt,B as Ce,r as Tt,c as Be,b as Lt,d as Ht,e as $e,j as It}from"./-esynYXT.js";import{c as St}from"./Ddit_D7n.js";import{b as At}from"./B3a35v7J.js";import{B as Bt,g as et,b as Et}from"./c_t0vA9G.js";function tt(S,r,g){Xe&&yt();var a=S,t=_t,p,h,m=null,f=ut()?gt:ft;function M(){p&&bt(p),m!==null&&(m.lastChild.remove(),a.before(m),m=null),p=h}ht(()=>{if(f(t,t=r())){var k=a,A=xt();A&&(m=document.createDocumentFragment(),m.append(k=mt())),h=pt(()=>g(k)),A?kt.add_callback(M):M()}}),Xe&&(a=wt)}function Fe(S,r){var g=S.$$events?.[r.type],a=Mt(g)?g.slice():g==null?[]:[g];for(var t of a)t.call(this,r)}var Dt=ye('');function Vt(S,r){fe(r,!1);const g=te();let a=o(r,"name",8),t=o(r,"class",8,"h-5 w-5");const p={plus:'',edit:'',delete:'',view:'',close:'',check:'',x:'',"chevron-left":'',"chevron-right":'',"chevron-down":'',"chevron-up":'',search:'',refresh:'',menu:'',settings:'',"check-circle":'',"x-circle":'',"exclamation-circle":'',"information-circle":'',loading:'',sun:'',moon:'',document:'',folder:''};$(()=>u(a()),()=>{ee(g,p[a()]||"")}),Le();var h=Dt(),m=s(h);Ae(m,()=>e(g),!0),n(h),R(()=>pe(h,0,`${t()}`)),i(S,h),he()}var Nt=L('');function rt(S,r){const g=Ye(r,["children","$$slots","$$events","$$legacy"]),a=Ye(g,["action","disabled","title","ariaLabel","size"]);fe(r,!1);const t=te(),p=te(),h=te(),m=te(),f=te(),M=te(),k=te(),A=te(),U=te(),V=be();let P=o(r,"action",8,"edit"),Z=o(r,"disabled",8,!1),B=o(r,"title",8,""),x=o(r,"ariaLabel",8,""),H=o(r,"size",8,"md");function D(){Z()||V("click")}$(()=>{},()=>{ee(t,"transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-900 cursor-pointer disabled:cursor-not-allowed disabled:opacity-50")}),$(()=>u(H()),()=>{ee(p,{sm:"p-1",md:"p-2"}[H()])}),$(()=>u(P()),()=>{ee(h,{edit:"text-indigo-600 dark:text-indigo-400 hover:text-indigo-900 dark:hover:text-indigo-300 focus:ring-indigo-500",delete:"text-red-600 dark:text-red-400 hover:text-red-900 dark:hover:text-red-300 focus:ring-red-500",view:"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-300 focus:ring-gray-500",add:"text-green-600 dark:text-green-400 hover:text-green-900 dark:hover:text-green-300 focus:ring-green-500"}[P()])}),$(()=>u(H()),()=>{ee(m,H()==="sm"?"h-4 w-4":"h-5 w-5")}),$(()=>(e(t),e(p),e(h)),()=>{ee(f,[e(t),e(p),e(h)].join(" "))}),$(()=>{},()=>{ee(M,{edit:'',delete:'',view:'',add:''})}),$(()=>{},()=>{ee(k,{edit:"Edit",delete:"Delete",view:"View",add:"Add"})}),$(()=>(u(B()),e(k),u(P())),()=>{ee(A,B()||e(k)[P()])}),$(()=>(u(x()),e(k),u(P())),()=>{ee(U,x()||`${e(k)[P()]} item`)}),Le(),ke();var F=Nt();jt(F,()=>({type:"button",class:e(f),disabled:Z(),title:e(A),"aria-label":e(U),...a}));var J=s(F),l=s(J);Ae(l,()=>(e(M),u(P()),v(()=>e(M)[P()])),!0),n(J),n(F),R(()=>pe(J,0,zt(e(m)))),Ge("click",F,D),i(S,F),he()}var Rt=L('

');function Ut(S,r){let g=o(r,"message",8,"Loading...");var a=Rt(),t=j(s(a),2),p=s(t,!0);n(t),n(a),R(()=>O(p,g())),i(S,a)}var qt=L('
'),Ot=L('

');function Ft(S,r){let g=o(r,"title",8,"Error"),a=o(r,"message",8),t=o(r,"showRetry",8,!1),p=o(r,"onRetry",8,void 0);var h=Ot(),m=s(h),f=s(m),M=j(s(f),2),k=s(M),A=s(k,!0);n(k);var U=j(k,2),V=s(U,!0);n(U);var P=j(U,2);{var Z=B=>{var x=qt(),H=s(x);Ce(H,{variant:"secondary",size:"sm",icon:"",class:"text-red-700 dark:text-red-200 bg-red-100 dark:bg-red-800 hover:bg-red-200 dark:hover:bg-red-700 focus:outline-none focus:bg-red-200 dark:focus:bg-red-700",$$events:{click(...D){p()?.apply(this,D)}},children:(D,F)=>{Se();var J=Te("Retry");i(D,J)},$$slots:{default:!0}}),n(x),i(B,x)};I(P,B=>{t()&&p()&&B(Z)})}n(M),n(f),n(m),n(h),R(()=>{O(A,g()),O(V,a())}),i(S,h)}var Gt=ye(''),Kt=ye(''),Qt=ye(''),Zt=ye(''),Jt=ye(''),Wt=ye(''),Xt=L('

');function Yt(S,r){let g=o(r,"title",8),a=o(r,"message",8),t=o(r,"iconType",8,"document");var p=Xt(),h=s(p);{var m=V=>{var P=Gt();i(V,P)},f=V=>{var P=Q(),Z=q(P);{var B=H=>{var D=Kt();i(H,D)},x=H=>{var D=Q(),F=q(D);{var J=d=>{var c=Qt();i(d,c)},l=d=>{var c=Q(),y=q(c);{var N=w=>{var E=Zt();i(w,E)},W=w=>{var E=Q(),z=q(E);{var C=T=>{var G=Jt();i(T,G)},_=T=>{var G=Q(),Y=q(G);{var re=ae=>{var ce=Wt();i(ae,ce)};I(Y,ae=>{t()==="settings"&&ae(re)},!0)}i(T,G)};I(z,T=>{t()==="key"?T(C):T(_,!1)},!0)}i(w,E)};I(y,w=>{t()==="cog"?w(N):w(W,!1)},!0)}i(d,c)};I(F,d=>{t()==="users"?d(J):d(l,!1)},!0)}i(H,D)};I(Z,H=>{t()==="building"?H(B):H(x,!1)},!0)}i(V,P)};I(h,V=>{t()==="document"?V(m):V(f,!1)})}var M=j(h,2),k=s(M,!0);n(M);var A=j(M,2),U=s(A,!0);n(A),n(p),R(()=>{O(k,g()),O(U,a())}),i(S,p)}var $t=L('
');function er(S,r){fe(r,!1);let g=o(r,"value",12,""),a=o(r,"placeholder",8,"Search..."),t=o(r,"disabled",8,!1);const p=be();function h(){p("input",g())}ke();var m=$t(),f=s(m),M=s(f);Vt(M,{name:"search",class:"h-5 w-5 text-gray-400"}),n(f);var k=j(f,2);Tt(k),n(m),R(()=>{Be(k,"placeholder",a()),k.disabled=t()}),At(k,g),Ge("input",k,h),i(S,m),he()}var tr=L(""),rr=L('
'),ar=L('
');function nr(S,r){fe(r,!1);let g=o(r,"searchTerm",12,""),a=o(r,"perPage",12,25),t=o(r,"placeholder",8,"Search..."),p=o(r,"showPerPageSelector",8,!0),h=o(r,"perPageOptions",24,()=>[25,50,100]);const m=be();function f(){m("search",{term:g()})}function M(){m("perPageChange",{perPage:a()})}ke();var k=ar(),A=s(k),U=s(A),V=s(U),P=j(s(V),2);er(P,{get placeholder(){return t()},get value(){return g()},set value(x){g(x)},$$events:{input:f},$$legacy:!0}),n(V),n(U);var Z=j(U,2);{var B=x=>{var H=rr(),D=s(H),F=j(s(D),2);R(()=>{a(),Pt(()=>{h()})}),de(F,5,h,ge,(J,l)=>{var d=tr(),c=s(d,!0);n(d);var y={};R(()=>{O(c,e(l)),y!==(y=e(l))&&(d.value=(d.__value=e(l))??"")}),i(J,d)}),n(F),n(D),n(H),Lt(F,a),Ge("change",F,M),i(x,H)};I(Z,x=>{p()&&x(B)})}n(A),n(k),i(S,k),he()}var ir=L('Showing to of ',1),or=L('
');function sr(S,r){fe(r,!1);const g=te(),a=te();let t=o(r,"currentPage",8,1),p=o(r,"totalPages",8,1),h=o(r,"perPage",8,25),m=o(r,"totalItems",8,0),f=o(r,"itemName",8,"results");const M=be();function k(P){P>=1&&P<=p()&&P!==t()&&M("pageChange",{page:P})}$(()=>(u(m()),u(t()),u(h())),()=>{ee(g,m()===0?0:(t()-1)*h()+1)}),$(()=>(u(t()),u(h()),u(m())),()=>{ee(a,Math.min(t()*h(),m()))}),Le(),ke();var A=Q(),U=q(A);{var V=P=>{var Z=or(),B=s(Z),x=s(B);{let z=X(()=>t()===1);Ce(x,{variant:"secondary",get disabled(){return e(z)},$$events:{click:()=>k(t()-1)},children:(C,_)=>{Se();var T=Te("Previous");i(C,T)},$$slots:{default:!0}})}var H=j(x,2);{let z=X(()=>t()===p());Ce(H,{variant:"secondary",get disabled(){return e(z)},class:"ml-3",$$events:{click:()=>k(t()+1)},children:(C,_)=>{Se();var T=Te("Next");i(C,T)},$$slots:{default:!0}})}n(B);var D=j(B,2),F=s(D),J=s(F),l=s(J);{var d=z=>{var C=Te();R(()=>O(C,`No ${f()??""}`)),i(z,C)},c=z=>{var C=ir(),_=j(q(C)),T=s(_,!0);n(_);var G=j(_,2),Y=s(G,!0);n(G);var re=j(G,2),ae=s(re,!0);n(re);var ce=j(re);R(()=>{O(T,e(g)),O(Y,e(a)),O(ae,m()),O(ce,` ${f()??""}`)}),i(z,C)};I(l,z=>{m()===0?z(d):z(c,!1)})}n(J),n(F);var y=j(F,2),N=s(y),W=s(N);{let z=X(()=>t()===1);Ce(W,{variant:"secondary",size:"sm",get disabled(){return e(z)},class:"rounded-r-none","aria-label":"Previous page",icon:"",$$events:{click:()=>k(t()-1)}})}var w=j(W,2);de(w,1,()=>(u(p()),v(()=>Array(p()))),ge,(z,C,_)=>{const T=X(()=>_+1);{let G=X(()=>e(T)===t()?"primary":"secondary");Ce(z,{get variant(){return e(G)},size:"sm",class:"rounded-none border-l-0 first:border-l first:rounded-l-md",$$events:{click:()=>k(e(T))},children:(Y,re)=>{Se();var ae=Te();R(()=>O(ae,e(T))),i(Y,ae)},$$slots:{default:!0}})}});var E=j(w,2);{let z=X(()=>t()===p());Ce(E,{variant:"secondary",size:"sm",get disabled(){return e(z)},class:"rounded-l-none","aria-label":"Next page",icon:"",$$events:{click:()=>k(t()+1)}})}n(N),n(y),n(D),n(Z),i(P,Z)};I(U,P=>{p()>1&&P(V)})}i(S,A),he()}var lr=L('

'),dr=L('

'),cr=L('

'),vr=L('

'),ur=L('
'),gr=L('
'),fr=L('
'),hr=L(" "),mr=L('
'),pr=L('
');function kr(S,r){fe(r,!1);const g=be();let a=o(r,"item",8),t=o(r,"config",8);function p(){if(!a())return"Unknown";const{field:l,useId:d,showOwner:c}=t().primaryText,y=a()[l];return d&&y?`${y.slice(0,8)}...`:c&&a().owner&&a().name?`${a().owner}/${a().name}`:y||"Unknown"}function h(){if(!t().secondaryText)return"";const{field:l,computedValue:d}=t().secondaryText;return d!==void 0?typeof d=="function"?d(a()):d:a()?.[l]||""}function m(){if(!t().primaryText.href||!a())return"#";let l=t().primaryText.href;return l=l.replace("{id}",a().id||""),l=l.replace("{name}",encodeURIComponent(a().name||"")),Ht(l)}function f(l){if(!a())return;const d=t().actions?.find(c=>c.type===l);d&&d.handler(a()),l==="edit"?g("edit",{item:a()}):l==="delete"?g("delete",{item:a()}):g("action",{type:l,item:a()})}function M(l){switch(l.type){case"status":if(t().entityType==="instance"){const c=a()?.[l.field]||"unknown";let y="neutral",N=c.charAt(0).toUpperCase()+c.slice(1);return l.field==="status"?y=c==="running"?"success":c==="pending"||c==="creating"?"info":c==="failed"||c==="error"?"error":"neutral":l.field==="runner_status"&&(y=c==="idle"?"info":c==="active"||c==="running"?"success":c==="failed"||c==="error"?"error":"neutral"),{variant:y,text:N}}return{variant:"neutral",text:a()?.[l.field]||"Unknown"};case"forge":return{variant:"neutral",text:a()?.[l.field]||"unknown"};case"auth":const d=a()?.[l.field]||"pat";return{variant:d==="pat"?"success":"info",text:d.toUpperCase()};case"custom":if(typeof l.value=="function"){const c=l.value(a());return{variant:c?.variant||"neutral",text:c?.text||""}}return{variant:l.value?.variant||"neutral",text:l.value?.text||""};default:return{variant:"neutral",text:""}}}ke();var k=pr(),A=s(k),U=s(A);{var V=l=>{var d=dr(),c=s(d),y=s(c,!0);n(c);var N=j(c,2);{var W=w=>{var E=lr(),z=s(E,!0);n(E),R(C=>O(z,C),[()=>v(h)]),i(w,E)};I(N,w=>{u(t()),v(()=>t().secondaryText)&&w(W)})}n(d),R((w,E)=>{Be(d,"href",w),pe(c,1,`text-sm font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300 truncate${u(t()),v(()=>t().primaryText.isMonospace?" font-mono":"")??""}`),O(y,E)},[()=>v(m),()=>v(p)]),i(l,d)},P=l=>{var d=vr(),c=s(d),y=s(c,!0);n(c);var N=j(c,2);{var W=w=>{var E=cr(),z=s(E,!0);n(E),R(C=>O(z,C),[()=>v(h)]),i(w,E)};I(N,w=>{u(t()),v(()=>t().secondaryText)&&w(W)})}n(d),R(w=>O(y,w),[()=>v(p)]),i(l,d)};I(U,l=>{u(t()),v(()=>t().primaryText.isClickable)?l(V):l(P,!1)})}var Z=j(U,2);{var B=l=>{var d=fr(),c=s(d);{var y=w=>{var E=Q(),z=q(E);de(z,1,()=>(u(t()),v(()=>t().customInfo)),ge,(C,_)=>{const T=X(()=>(e(_),u(a()),v(()=>typeof e(_).icon=="function"?e(_).icon(a()):e(_).icon))),G=X(()=>(e(_),u(a()),v(()=>typeof e(_).text=="function"?e(_).text(a()):e(_).text)));var Y=ur(),re=s(Y);{var ae=je=>{var He=Q(),De=q(He);Ae(De,()=>e(T)),i(je,He)};I(re,je=>{e(T)&&je(ae)})}var ce=j(re,2),Ee=s(ce,!0);n(ce),n(Y),R(()=>O(Ee,e(G))),i(C,Y)}),i(w,E)};I(c,w=>{u(t()),v(()=>t().customInfo)&&w(y)})}var N=j(c,2);{var W=w=>{var E=Q(),z=q(E);de(z,1,()=>(u(t()),v(()=>t().badges.filter(C=>C.type==="forge"))),ge,(C,_)=>{var T=gr(),G=s(T);Ae(G,()=>(u(et),e(_),u(a()),v(()=>et(e(_).field?a()?.[e(_).field]||"unknown":a()?.endpoint?.endpoint_type||"unknown"))));var Y=j(G,2),re=s(Y,!0);n(Y),n(T),R(()=>O(re,(u(a()),v(()=>a()?.endpoint?.name||"Unknown")))),i(C,T)}),i(w,E)};I(N,w=>{u(t()),v(()=>t().badges)&&w(W)})}n(d),i(l,d)};I(Z,l=>{u(t()),v(()=>t().customInfo||t().badges?.some(d=>d.type==="forge"))&&l(B)})}n(A);var x=j(A,2),H=s(x);{var D=l=>{var d=Q(),c=q(d);de(c,1,()=>(u(t()),v(()=>t().badges.filter(y=>y.type!=="forge"))),ge,(y,N)=>{var W=Q(),w=q(W);{var E=C=>{const _=X(()=>(e(N),v(()=>M(e(N)))));var T=hr(),G=s(T,!0);n(T),R(()=>{pe(T,1,`inline-flex items-center rounded-full px-2 py-1 text-xs font-medium ring-1 ring-inset ${u(e(_)),v(()=>e(_).variant==="success"?"bg-green-50 text-green-700 ring-green-600/20 dark:bg-green-900/50 dark:text-green-300 dark:ring-green-400/20":e(_).variant==="info"?"bg-blue-50 text-blue-700 ring-blue-600/20 dark:bg-blue-900/50 dark:text-blue-300 dark:ring-blue-400/20":e(_).variant==="error"?"bg-red-50 text-red-700 ring-red-600/20 dark:bg-red-900/50 dark:text-red-300 dark:ring-red-400/20":"bg-gray-50 text-gray-700 ring-gray-600/20 dark:bg-gray-900/50 dark:text-gray-300 dark:ring-gray-400/20")??""}`),O(G,(u(e(_)),v(()=>e(_).text)))}),i(C,T)},z=C=>{const _=X(()=>(e(N),v(()=>M(e(N)))));Bt(C,{get variant(){return u(e(_)),v(()=>e(_).variant)},get text(){return u(e(_)),v(()=>e(_).text)}})};I(w,C=>{e(N),v(()=>e(N).type==="status")?C(E):C(z,!1)})}i(y,W)}),i(l,d)};I(H,l=>{u(t()),v(()=>t().badges)&&l(D)})}var F=j(H,2);{var J=l=>{var d=mr();de(d,5,()=>(u(t()),v(()=>t().actions)),ge,(c,y)=>{{let N=X(()=>(e(y),u(t()),v(()=>e(y).type==="edit"?`Edit ${t().entityType}`:`Delete ${t().entityType}`))),W=X(()=>(e(y),u(t()),v(()=>e(y).type==="edit"?`Edit ${t().entityType}`:`Delete ${t().entityType}`)));rt(c,{get action(){return e(y),v(()=>e(y).type)},size:"sm",get title(){return e(N)},get ariaLabel(){return e(W)},$$events:{click:()=>f(e(y).type)}})}}),n(d),i(l,d)};I(F,l=>{u(t()),v(()=>t().actions)&&l(J)})}n(x),n(k),i(S,k),he()}var xr=L('
'),_r=L('
'),yr=L("
"),br=L("
"),wr=L(' ',1),Mr=L('
');function Dr(S,r){fe(r,!1);const g=te();let a=o(r,"columns",24,()=>[]),t=o(r,"data",24,()=>[]),p=o(r,"loading",8,!1),h=o(r,"error",8,""),m=o(r,"totalItems",8,0),f=o(r,"itemName",8,"results"),M=o(r,"searchTerm",12,""),k=o(r,"searchPlaceholder",8,"Search..."),A=o(r,"showSearch",8,!0),U=o(r,"currentPage",8,1),V=o(r,"perPage",12,25),P=o(r,"totalPages",8,1),Z=o(r,"showPagination",8,!0),B=o(r,"showPerPageSelector",8,!0),x=o(r,"emptyTitle",8,"No items found"),H=o(r,"emptyMessage",8,""),D=o(r,"emptyIconType",8,"document"),F=o(r,"errorTitle",8,"Error loading data"),J=o(r,"showRetry",8,!1),l=o(r,"showMobileCards",8,!0),d=o(r,"mobileCardConfig",8,null);const c=be();function y(b){c("search",b.detail)}function N(b){c("pageChange",b.detail)}function W(b){c("perPageChange",b.detail)}function w(){c("retry")}function E(b){c("edit",b.detail)}function z(b){c("delete",b.detail)}function C(b){c("action",b.detail)}function _(b){const ve="px-6 py-4 text-sm",Ve=b.align==="right"?"text-right":b.align==="center"?"text-center":"text-left",Ne=b.key==="actions"?"font-medium":"text-gray-900 dark:text-white",Re=b.flexible?"min-w-0":"";return`${ve} ${Ve} ${Ne} ${Re}`.trim()}function T(){return a().map(b=>b.flexible?`${b.flexRatio||1}fr`:"auto").join(" ")}$(()=>(u(H()),u(M()),u(f())),()=>{ee(g,H()||(M()?`No items found matching "${M()}"`:`No ${f()} found`))}),Le(),ke();var G=Mr(),Y=s(G);{var re=b=>{nr(b,{get placeholder(){return k()},get showPerPageSelector(){return B()},get searchTerm(){return M()},set searchTerm(ve){M(ve)},get perPage(){return V()},set perPage(ve){V(ve)},$$events:{search:y,perPageChange:W},$$legacy:!0})};I(Y,b=>{A()&&b(re)})}var ae=j(Y,2),ce=s(ae);{var Ee=b=>{Ut(b,{get message(){return`Loading ${f()??""}...`}})},je=b=>{var ve=Q(),Ve=q(ve);{var Ne=we=>{{let Ie=X(()=>J()?w:void 0);Ft(we,{get title(){return F()},get message(){return h()},get showRetry(){return J()},get onRetry(){return e(Ie)}})}},Re=we=>{var Ie=Q(),at=q(Ie);{var nt=Me=>{Yt(Me,{get title(){return x()},get message(){return e(g)},get iconType(){return D()}})},it=Me=>{var Ke=wr(),Qe=q(Ke);{var ot=oe=>{var K=_r();de(K,7,t,(le,ne)=>le.id||le.name||ne,(le,ne,qe)=>{var ze=xr(),ie=s(ze);{var Pe=me=>{var xe=Q(),se=q(xe);tt(se,()=>(e(ne),v(()=>`${e(ne).id||e(ne).name}-${e(ne).updated_at}-mobile`)),_e=>{kr(_e,{get item(){return e(ne)},get config(){return d()},$$events:{edit(ue){Fe.call(this,r,ue)},delete(ue){Fe.call(this,r,ue)},action(ue){Fe.call(this,r,ue)}}})}),i(me,xe)},Oe=me=>{var xe=Q(),se=q(xe);$e(se,r,"mobile-card",{get item(){return e(ne)},get index(){return e(qe)}}),i(me,xe)};I(ie,me=>{d()?me(Pe):me(Oe,!1)})}n(ze),i(le,ze)}),n(K),i(oe,K)};I(Qe,oe=>{l()&&oe(ot)})}var Ze=j(Qe,2),Ue=s(Ze),Je=s(Ue);de(Je,1,a,ge,(oe,K)=>{var le=yr(),ne=s(le,!0);n(le),R(()=>{pe(le,1,`px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider bg-gray-50 dark:bg-gray-700 border-b border-gray-200 dark:border-gray-600 ${e(K),v(()=>e(K).align==="right"?"text-right":e(K).align==="center"?"text-center":"text-left")??""}`),O(ne,(e(K),v(()=>e(K).title)))}),i(oe,le)});var st=j(Je,2);de(st,3,t,(oe,K)=>oe.id||oe.name||K,(oe,K,le)=>{var ne=Q(),qe=q(ne);de(qe,1,a,ge,(ze,ie)=>{var Pe=br(),Oe=s(Pe);{var me=se=>{var _e=Q(),ue=q(_e);tt(ue,()=>(e(K),e(ie),v(()=>`${e(K).id||e(K).name}-${e(K).updated_at}-${e(ie).key}`)),lt=>{var We=Q(),dt=q(We);St(dt,()=>e(ie).cellComponent,(ct,vt)=>{vt(ct,Ct({get item(){return e(K)}},()=>e(ie).cellProps,{$$events:{edit:E,delete:z,action:C}}))}),i(lt,We)}),i(se,_e)},xe=se=>{var _e=Q(),ue=q(_e);$e(ue,r,"cell",{get item(){return e(K)},get column(){return e(ie)},get index(){return e(le)},get value(){return e(K),e(ie),v(()=>e(K)[e(ie).key])}}),i(se,_e)};I(Oe,se=>{e(ie),v(()=>e(ie).cellComponent)?se(me):se(xe,!1)})}n(Pe),R(se=>pe(Pe,1,`${se??""} border-b border-gray-200 dark:border-gray-700`),[()=>(e(ie),v(()=>_(e(ie))))]),i(ze,Pe)}),i(oe,ne)}),n(Ue),n(Ze),R(oe=>It(Ue,`grid-template-columns: ${oe??""}`),[()=>v(T)]),i(Me,Ke)};I(at,Me=>{u(t()),v(()=>t().length===0)?Me(nt):Me(it,!1)},!0)}i(we,Ie)};I(Ve,we=>{h()?we(Ne):we(Re,!1)},!0)}i(b,ve)};I(ce,b=>{p()?b(Ee):b(je,!1)})}var He=j(ce,2);{var De=b=>{sr(b,{get currentPage(){return U()},get totalPages(){return P()},get perPage(){return V()},get totalItems(){return m()},get itemName(){return f()},$$events:{pageChange:N}})};I(He,b=>{u(Z()),u(p()),u(h()),u(t()),v(()=>Z()&&!p()&&!h()&&t().length>0)&&b(De)})}n(ae),n(G),i(S,G),he()}var Pr=L('
');function Vr(S,r){fe(r,!1);const g=be();let a=o(r,"item",8),t=o(r,"actions",24,()=>[{type:"edit",title:"Edit",ariaLabel:"Edit item",action:"edit"},{type:"delete",title:"Delete",ariaLabel:"Delete item",action:"delete"}]);function p(m){a()&&(m==="edit"?g("edit",{item:a()}):m==="delete"?g("delete",{item:a()}):g("action",{type:m,item:a()}))}ke();var h=Pr();de(h,5,t,ge,(m,f)=>{{let M=X(()=>(e(f),v(()=>e(f).action||(e(f).type==="edit"?"edit":e(f).type==="delete"?"delete":"view")))),k=X(()=>(e(f),v(()=>e(f).title||(e(f).type==="edit"?"Edit":e(f).type==="delete"?"Delete":e(f).label)))),A=X(()=>(e(f),v(()=>e(f).ariaLabel||(e(f).type==="edit"?"Edit item":e(f).type==="delete"?"Delete item":e(f).label))));rt(m,{get action(){return e(M)},get title(){return e(k)},get ariaLabel(){return e(A)},$$events:{click:()=>p(e(f).type)}})}}),n(h),i(S,h),he()}var Cr=L(" "),jr=L(" ");function Nr(S,r){fe(r,!1);const g=te(),a=te();let t=o(r,"item",8),p=o(r,"field",8),h=o(r,"type",8,"text"),m=o(r,"truncateLength",8,50),f=o(r,"showTitle",8,!1);function M(){return t()&&p().split(".").reduce((B,x)=>B?.[x],t())||""}function k(){return h()==="date"?Et(e(g)):h()==="truncated"&&e(g).length>m()?`${e(g).slice(0,m())}...`:e(g)}function A(){switch(h()){case"code":return"inline-block max-w-full truncate bg-gray-100 dark:bg-gray-700 px-2 py-1 rounded text-xs font-mono";case"description":return"block w-full truncate text-sm text-gray-500 dark:text-gray-300";case"date":return"block w-full truncate text-sm text-gray-900 dark:text-white font-mono";default:return"block w-full truncate text-sm text-gray-900 dark:text-white"}}$(()=>{},()=>{ee(g,M())}),$(()=>{},()=>{ee(a,k())}),Le(),ke();var U=Q(),V=q(U);{var P=B=>{var x=Cr(),H=s(x,!0);n(x),R(D=>{pe(x,1,`${D??""} ${f()?"cursor-default":""}`),Be(x,"title",f()?e(g):""),O(H,e(a))},[()=>v(A)]),i(B,x)},Z=B=>{var x=jr(),H=s(x,!0);n(x),R(D=>{pe(x,1,`${D??""} ${f()?"cursor-default":""}`),Be(x,"title",f()?e(g):""),O(H,e(a))},[()=>v(A)]),i(B,x)};I(V,B=>{h()==="code"?B(P):B(Z,!1)})}i(S,U),he()}export{rt as A,Dr as D,Nr as G,Ut as L,Vr as a,tt as k}; diff --git a/webapp/assets/_app/immutable/chunks/B27KefbC.js b/webapp/assets/_app/immutable/chunks/B27KefbC.js deleted file mode 100644 index 9fa047c1..00000000 --- a/webapp/assets/_app/immutable/chunks/B27KefbC.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as _}from"./DT0EGONV.js";import{p as h,f as x,t as k,c as u,d as g,k as w,j as o,u as d,n as e,r,v as y}from"./CRKWEg6v.js";import{h as z}from"./-esynYXT.js";import{p as m}from"./e1m7WRO5.js";import{g as v}from"./c_t0vA9G.js";var E=x('
');function U(l,i){h(i,!1);let t=m(i,"item",8),s=m(i,"iconSize",8,"w-5 h-5");_();var a=E(),n=o(a),f=o(n);z(f,()=>(e(v),e(t()),e(s()),d(()=>v(t()?.endpoint?.endpoint_type||t()?.endpoint_type||"unknown",s())))),r(n);var p=w(n,2),c=o(p,!0);r(p),r(a),k(()=>y(c,(e(t()),d(()=>t()?.endpoint?.name||t()?.endpoint_name||t()?.endpoint_type||"Unknown")))),u(l,a),g()}export{U as E}; diff --git a/webapp/assets/_app/immutable/chunks/B3a35v7J.js b/webapp/assets/_app/immutable/chunks/B3a35v7J.js deleted file mode 100644 index 082e4b4b..00000000 --- a/webapp/assets/_app/immutable/chunks/B3a35v7J.js +++ /dev/null @@ -1 +0,0 @@ -import{V as b,W as o,u as h,G as _,K as t,Q as f,X as m}from"./CRKWEg6v.js";function y(e,a,c=a){var v=b(),d=new WeakSet;o(e,"input",r=>{var l=r?e.defaultValue:e.value;if(l=n(e)?s(l):l,c(l),f!==null&&d.add(f),v&&l!==(l=a())){var k=e.selectionStart,u=e.selectionEnd;e.value=l??"",u!==null&&(e.selectionStart=k,e.selectionEnd=Math.min(u,e.value.length))}}),(t&&e.defaultValue!==e.value||h(a)==null&&e.value)&&(c(n(e)?s(e.value):e.value),f!==null&&d.add(f)),_(()=>{var r=a();if(e===document.activeElement){var l=m??f;if(d.has(l))return}n(e)&&r===s(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function E(e,a,c=a){o(e,"change",v=>{var d=v?e.defaultChecked:e.checked;c(d)}),(t&&e.defaultChecked!==e.checked||h(a)==null)&&c(e.checked),_(()=>{var v=a();e.checked=!!v})}function n(e){var a=e.type;return a==="number"||a==="range"}function s(e){return e===""?null:+e}export{E as a,y as b}; diff --git a/webapp/assets/_app/immutable/chunks/BAnDfGwP.js b/webapp/assets/_app/immutable/chunks/BAnDfGwP.js deleted file mode 100644 index b8e35407..00000000 --- a/webapp/assets/_app/immutable/chunks/BAnDfGwP.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as E}from"./DT0EGONV.js";import{p as H,E as L,f as h,t as f,c,d as z,j as e,r as a,k as x,v as d,z as M,D as q}from"./CRKWEg6v.js";import{p as i,i as C}from"./e1m7WRO5.js";import{B as F}from"./-esynYXT.js";var G=h('
'),I=h('

');function S(u,t){H(t,!1);const _=L();let k=i(t,"title",8),b=i(t,"description",8),v=i(t,"actionLabel",8,null),g=i(t,"showAction",8,!0);function w(){_("action")}E();var r=I(),s=e(r),o=e(s),y=e(o,!0);a(o);var m=x(o,2),j=e(m,!0);a(m),a(s);var A=x(s,2);{var P=n=>{var l=G(),B=e(l);F(B,{variant:"primary",icon:'',$$events:{click:w},children:(D,J)=>{M();var p=q();f(()=>d(p,v())),c(D,p)},$$slots:{default:!0}}),a(l),c(n,l)};C(A,n=>{g()&&v()&&n(P)})}a(r),f(()=>{d(y,k()),d(j,b())}),c(u,r),z()}export{S as P}; diff --git a/webapp/assets/_app/immutable/chunks/BM4Azg_w.js b/webapp/assets/_app/immutable/chunks/BM4Azg_w.js new file mode 100644 index 00000000..dd1558de --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/BM4Azg_w.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as _}from"./C7KraPli.js";import{p as k,f as E,t as C,u as i,q as t,e as f,b as P,c as j,s as q,d as l,r as o}from"./cPTQ2Ibn.js";import{c as z}from"./DqbUkQgD.js";import{p as n}from"./DqFqoVWr.js";import{j as x,e as c,i as u}from"./DJsB5Z5V.js";var N=E('');function F(d,r){k(r,!1);let e=n(r,"item",8),m=n(r,"eagerCache",8,null);_();var s=N(),a=l(s),v=l(a,!0);o(a);var p=q(a,2),g=l(p,!0);o(p),o(s),C((h,b,y)=>{z(a,"href",h),f(v,b),f(g,y)},[()=>(t(x),t(e()),i(()=>x(e()))),()=>(t(c),t(e()),t(m()),i(()=>c(e(),m()))),()=>(t(u),t(e()),i(()=>u(e())))]),P(d,s),j()}export{F as P}; diff --git a/webapp/assets/_app/immutable/chunks/BMHtEUeX.js b/webapp/assets/_app/immutable/chunks/BMHtEUeX.js deleted file mode 100644 index d3333808..00000000 --- a/webapp/assets/_app/immutable/chunks/BMHtEUeX.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as b}from"./DT0EGONV.js";import{p as k,f as E,t as C,u as i,n as t,v as n,c as j,d as P,k as z,j as l,r as o}from"./CRKWEg6v.js";import{c as N}from"./-esynYXT.js";import{p as f}from"./e1m7WRO5.js";import{j as x,e as c,i as u}from"./c_t0vA9G.js";var T=E('');function F(d,r){k(r,!1);let e=f(r,"item",8),m=f(r,"eagerCache",8,null);b();var s=T(),a=l(s),v=l(a,!0);o(a);var p=z(a,2),g=l(p,!0);o(p),o(s),C((h,y,_)=>{N(a,"href",h),n(v,y),n(g,_)},[()=>(t(x),t(e()),i(()=>x(e()))),()=>(t(c),t(e()),t(m()),i(()=>c(e(),m()))),()=>(t(u),t(e()),i(()=>u(e())))]),j(d,s),P()}export{F as P}; diff --git a/webapp/assets/_app/immutable/chunks/BQabvZPm.js b/webapp/assets/_app/immutable/chunks/BQabvZPm.js deleted file mode 100644 index a5040a00..00000000 --- a/webapp/assets/_app/immutable/chunks/BQabvZPm.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as Lr}from"./DT0EGONV.js";import{p as qr,E as Gr,m as s,o as Jr,f as m,k as r,j as o,g as e,r as a,t as v,e as E,c as b,v as T,b as Nr,z as pr,y as W,u as p,s as i,D as Ae,d as Vr}from"./CRKWEg6v.js";import{p as mr,i as z}from"./e1m7WRO5.js";import{e as Oe,i as $e}from"./C73ZVvpW.js";import{s as He,r as h,b as Q,g as C,c as Fr}from"./-esynYXT.js";import{b as w,a as Kr}from"./B3a35v7J.js";import{p as Ur}from"./D4Caz1gY.js";import{M as Wr}from"./xe-4nY5o.js";import{e as Be}from"./BZiHL9L3.js";import{J as Qr}from"./DJsbLMno.js";var Xr=m('

'),Yr=m('
'),Zr=m(""),et=m(''),rt=m('
'),tt=m(""),at=m(''),ot=m(' '),it=m('
'),dt=m('

Entity & Provider Configuration

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Extra Specs (JSON)
',1),st=m('
Creating...
'),lt=m('

Create New Pool

Entity Level *
');function ht(fr,X){qr(X,!1);const G=Gr();let Y=mr(X,"initialEntityType",8,""),De=mr(X,"initialEntityId",8,""),J=s(!1),M=s(""),n=s(Y()),I=s([]),Z=s([]),ee=s(!1),re=s(!1),k=s(De()),S=s(""),B=s(""),D=s(""),te=s(void 0),ae=s(void 0),oe=s(void 0),ie=s(100),de=s("garm"),N=s("linux"),V=s("amd64"),se=s(""),le=s(!0),_=s([]),j=s(""),L=s("{}");async function yr(){try{i(re,!0),i(Z,await C.listProviders())}catch(l){i(M,Be(l))}finally{i(re,!1)}}async function Le(){if(e(n))try{switch(i(ee,!0),i(I,[]),e(n)){case"repository":i(I,await C.listRepositories());break;case"organization":i(I,await C.listOrganizations());break;case"enterprise":i(I,await C.listEnterprises());break}}catch(l){i(M,Be(l))}finally{i(ee,!1)}}function ne(l){e(n)!==l&&(i(n,l),i(k,""),Le())}function qe(){e(j).trim()&&!e(_).includes(e(j).trim())&&(i(_,[...e(_),e(j).trim()]),i(j,""))}function xr(l){i(_,e(_).filter((P,A)=>A!==l))}function hr(l){l.key==="Enter"&&(l.preventDefault(),qe())}async function kr(){if(!e(n)||!e(k)||!e(S)||!e(B)||!e(D)){i(M,"Please fill in all required fields");return}try{i(J,!0),i(M,"");let l={};if(e(L).trim())try{l=JSON.parse(e(L))}catch{throw new Error("Invalid JSON in extra specs")}const P={provider_name:e(S),image:e(B),flavor:e(D),max_runners:e(te)||10,min_idle_runners:e(ae)||0,runner_bootstrap_timeout:e(oe)||20,priority:e(ie),runner_prefix:e(de),os_type:e(N),os_arch:e(V),"github-runner-group":e(se)||void 0,enabled:e(le),tags:e(_),extra_specs:e(L).trim()?l:void 0};if(Y()&&De())G("submit",P);else{switch(e(n)){case"repository":await C.createRepositoryPool(e(k),P);break;case"organization":await C.createOrganizationPool(e(k),P);break;case"enterprise":await C.createEnterprisePool(e(k),P);break;default:throw new Error("Invalid entity level")}G("submit",P)}}catch(l){i(M,Be(l))}finally{i(J,!1)}}Jr(()=>{yr(),Y()&&Le()}),Lr(),Wr(fr,{$$events:{close:()=>G("close")},children:(l,P)=>{var A=lt(),ue=r(o(A),2),Ge=o(ue);{var _r=c=>{var y=Xr(),O=o(y),F=o(O,!0);a(O),a(y),v(()=>T(F,e(M))),b(c,y)};z(Ge,c=>{e(M)&&c(_r)})}var be=r(Ge,2),Je=r(o(be),2),ce=o(Je),ge=r(ce,2),Ne=r(ge,2);a(Je),a(be);var Ve=r(be,2);{var wr=c=>{var y=dt(),O=Nr(y),F=r(o(O),2),pe=o(F),me=o(pe),Rr=o(me);pr(),a(me);var Tr=r(me,2);{var zr=t=>{var u=Yr();b(t,u)},Cr=t=>{var u=et();v(()=>{e(k),W(()=>{e(n),e(I)})});var f=o(u),$=o(f);a(f),f.value=f.__value="";var R=r(f);Oe(R,1,()=>e(I),$e,(g,d)=>{var x=Zr(),U=o(x);{var Br=H=>{var q=Ae();v(()=>T(q,`${e(d),p(()=>e(d).owner)??""}/${e(d),p(()=>e(d).name)??""} (${e(d),p(()=>e(d).endpoint?.name)??""})`)),b(H,q)},Dr=H=>{var q=Ae();v(()=>T(q,`${e(d),p(()=>e(d).name)??""} (${e(d),p(()=>e(d).endpoint?.name)??""})`)),b(H,q)};z(U,H=>{e(n)==="repository"?H(Br):H(Dr,!1)})}a(x);var vr={};v(()=>{vr!==(vr=(e(d),p(()=>e(d).id)))&&(x.value=(x.__value=(e(d),p(()=>e(d).id)))??"")}),b(g,x)}),a(u),v(()=>T($,`Select a ${e(n)??""}`)),Q(u,()=>e(k),g=>i(k,g)),b(t,u)};z(Tr,t=>{e(ee)?t(zr):t(Cr,!1)})}a(pe);var Ue=r(pe,2),Ir=r(o(Ue),2);{var Sr=t=>{var u=rt();b(t,u)},jr=t=>{var u=at();v(()=>{e(S),W(()=>{e(Z)})});var f=o(u);f.value=f.__value="";var $=r(f);Oe($,1,()=>e(Z),$e,(R,g)=>{var d=tt(),x=o(d,!0);a(d);var U={};v(()=>{T(x,(e(g),p(()=>e(g).name))),U!==(U=(e(g),p(()=>e(g).name)))&&(d.value=(d.__value=(e(g),p(()=>e(g).name)))??"")}),b(R,d)}),a(u),Q(u,()=>e(S),R=>i(S,R)),b(t,u)};z(Ir,t=>{e(re)?t(Sr):t(jr,!1)})}a(Ue),a(F),a(O);var fe=r(O,2),We=r(o(fe),2),ye=o(We),Qe=r(o(ye),2);h(Qe),a(ye);var xe=r(ye,2),Xe=r(o(xe),2);h(Xe),a(xe);var he=r(xe,2),ke=r(o(he),2);v(()=>{e(N),W(()=>{})});var _e=o(ke);_e.value=_e.__value="linux";var Ye=r(_e);Ye.value=Ye.__value="windows",a(ke),a(he);var Ze=r(he,2),we=r(o(Ze),2);v(()=>{e(V),W(()=>{})});var Ee=o(we);Ee.value=Ee.__value="amd64";var er=r(Ee);er.value=er.__value="arm64",a(we),a(Ze),a(We),a(fe);var Me=r(fe,2),rr=r(o(Me),2),Pe=o(rr),tr=r(o(Pe),2);h(tr),a(Pe);var Re=r(Pe,2),ar=r(o(Re),2);h(ar),a(Re);var or=r(Re,2),ir=r(o(or),2);h(ir),a(or),a(rr),a(Me);var dr=r(Me,2),Te=r(o(dr),2),ze=o(Te),sr=r(o(ze),2);h(sr),a(ze);var Ce=r(ze,2),lr=r(o(Ce),2);h(lr),a(Ce);var nr=r(Ce,2),ur=r(o(nr),2);h(ur),a(nr),a(Te);var Ie=r(Te,2),br=r(o(Ie),2),Se=o(br),K=o(Se);h(K);var Ar=r(K,2);a(Se);var Or=r(Se,2);{var $r=t=>{var u=it();Oe(u,5,()=>e(_),$e,(f,$,R)=>{var g=ot(),d=o(g),x=r(d);a(g),v(()=>{T(d,`${e($)??""} `),Fr(x,"aria-label",`Remove tag ${e($)}`)}),E("click",x,()=>xr(R)),b(f,g)}),a(u),b(t,u)};z(Or,t=>{e(_),p(()=>e(_).length>0)&&t($r)})}a(br),a(Ie);var je=r(Ie,2),Hr=r(o(je),2);Qr(Hr,{rows:4,placeholder:"{}",get value(){return e(L)},set value(t){i(L,t)},$$legacy:!0}),a(je);var cr=r(je,2),gr=o(cr);h(gr),pr(2),a(cr),a(dr),v(t=>T(Rr,`${t??""} `),[()=>(e(n),p(()=>e(n).charAt(0).toUpperCase()+e(n).slice(1)))]),w(Qe,()=>e(B),t=>i(B,t)),w(Xe,()=>e(D),t=>i(D,t)),Q(ke,()=>e(N),t=>i(N,t)),Q(we,()=>e(V),t=>i(V,t)),w(tr,()=>e(ae),t=>i(ae,t)),w(ar,()=>e(te),t=>i(te,t)),w(ir,()=>e(oe),t=>i(oe,t)),w(sr,()=>e(de),t=>i(de,t)),w(lr,()=>e(ie),t=>i(ie,t)),w(ur,()=>e(se),t=>i(se,t)),w(K,()=>e(j),t=>i(j,t)),E("keydown",K,hr),E("click",Ar,qe),Kr(gr,()=>e(le),t=>i(le,t)),b(c,y)};z(Ve,c=>{e(n)&&c(wr)})}var Fe=r(Ve,2),Ke=o(Fe),ve=r(Ke,2),Er=o(ve);{var Mr=c=>{var y=st();b(c,y)},Pr=c=>{var y=Ae("Create Pool");b(c,y)};z(Er,c=>{e(J)?c(Mr):c(Pr,!1)})}a(ve),a(Fe),a(ue),a(A),v(()=>{He(ce,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(n)==="repository"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),He(ge,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(n)==="organization"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),He(Ne,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(n)==="enterprise"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),ve.disabled=e(J)||!e(n)||!e(k)||!e(S)||!e(B)||!e(D)}),E("click",ce,()=>ne("repository")),E("click",ge,()=>ne("organization")),E("click",Ne,()=>ne("enterprise")),E("click",Ke,()=>G("close")),E("submit",ue,Ur(kr)),b(l,A)},$$slots:{default:!0}}),Vr()}export{ht as C}; diff --git a/webapp/assets/_app/immutable/chunks/BUaPampd.js b/webapp/assets/_app/immutable/chunks/BUaPampd.js new file mode 100644 index 00000000..78492191 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/BUaPampd.js @@ -0,0 +1,2 @@ +import"./DsnmJJEf.js";import{i as Ar}from"./C7KraPli.js";import{p as Jr,E as Mr,m as u,o as Nr,k as s,l as or,g as e,h as Pr,f as M,d,r as a,s as o,q as R,u as p,t as f,y as Re,z as sr,e as y,i as ir,b,D,B as Ee,a as Q,c as Cr}from"./cPTQ2Ibn.js";import{p as Ur,i as E,s as Dr,a as Gr}from"./DqFqoVWr.js";import{e as jr,i as zr}from"./CiWDXYQd.js";import{r as $,s as nr,b as $e,g as Br,d as lr,c as Lr}from"./DqbUkQgD.js";import{b as J,a as Fr}from"./B-_QCM7E.js";import{p as qr}from"./D4Caz1gY.js";import{M as Hr}from"./Bo3f8OIz.js";import{e as ur}from"./BZiHL9L3.js";import{J as Wr}from"./D6f8Dk7c.js";import{e as Kr}from"./JUkrBp3F.js";var Qr=M('

'),Vr=M('

'),Xr=M('
Loading templates...
'),Yr=M(""),Zr=M('

',1),et=M('

Create a template first or proceed without a template to use default behavior.

'),rt=M('
Updating...
'),tt=M('

Scale Set Information

Provider:
Entity:

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Extra Specs (JSON)
');function vt(pr,Oe){Jr(Oe,!1);const[br,cr]=Dr(),V=()=>Gr(Kr,"$eagerCache",br);let r=Ur(Oe,"scaleSet",8);const X=Mr();let z=u(!1),G=u(""),k=u(""),x=u([]),Y=u(!1),B=u(r().name||""),L=u(r().image||""),F=u(r().flavor||""),O=u(r().max_runners),I=u(r().min_idle_runners),q=u(r().runner_bootstrap_timeout),H=u(r().runner_prefix||""),_=u(r().os_type||"linux"),j=u(r().os_arch||"amd64"),W=u(r()["github-runner-group"]||""),K=u(r().enabled),A=u("{}"),w=u(r().template_id);function Z(){if(r().endpoint?.endpoint_type)return r().endpoint.endpoint_type;if(r().repo_id){const i=V().repositories.find(c=>c.id===r().repo_id);if(i?.endpoint?.endpoint_type)return i.endpoint.endpoint_type}if(r().org_id){const i=V().organizations.find(c=>c.id===r().org_id);if(i?.endpoint?.endpoint_type)return i.endpoint.endpoint_type}if(r().enterprise_id){const i=V().enterprises.find(c=>c.id===r().enterprise_id);if(i?.endpoint?.endpoint_type)return i.endpoint.endpoint_type}return null}async function Ie(){try{s(Y,!0);const i=Z();if(!i){s(x,[]);return}if(s(x,await Br.listTemplates(e(_),void 0,i)),!e(w)||!e(x).find(c=>c.id===e(w))){const c=e(x).find(S=>S.owner_id==="system");c?s(w,c.id):e(x).length>0&&s(w,e(x)[0].id)}}catch(i){s(G,ur(i))}finally{s(Y,!1)}}Nr(()=>{if(r().extra_specs)try{if(typeof r().extra_specs=="object")s(A,JSON.stringify(r().extra_specs,null,2));else{const i=JSON.parse(r().extra_specs);s(A,JSON.stringify(i,null,2))}}catch{s(A,r().extra_specs||"{}")}Ie()});async function gr(){try{if(s(z,!0),s(G,""),e(k))throw new Error(e(k));let i={};if(e(A).trim())try{i=JSON.parse(e(A))}catch{throw new Error("Invalid JSON in extra specs")}const c={name:e(B)!==r().name?e(B):void 0,image:e(L)!==r().image?e(L):void 0,flavor:e(F)!==r().flavor?e(F):void 0,max_runners:e(O)!==r().max_runners?e(O):void 0,min_idle_runners:e(I)!==r().min_idle_runners?e(I):void 0,runner_bootstrap_timeout:e(q)!==r().runner_bootstrap_timeout?e(q):void 0,runner_prefix:e(H)!==r().runner_prefix?e(H):void 0,os_type:e(_)!==r().os_type?e(_):void 0,os_arch:e(j)!==r().os_arch?e(j):void 0,"github-runner-group":e(W)!==r()["github-runner-group"]&&e(W)||void 0,enabled:e(K)!==r().enabled?e(K):void 0,extra_specs:e(A).trim()!==JSON.stringify(r().extra_specs||{},null,2).trim()?i:void 0,template_id:e(w)!==r().template_id?e(w):void 0};Object.keys(c).forEach(S=>{c[S]===void 0&&delete c[S]}),X("submit",c)}catch(i){s(G,ur(i))}finally{s(z,!1)}}or(()=>e(_),()=>{e(_)&&Ie()}),or(()=>(e(I),e(O)),()=>{e(I)!==null&&e(I)!==void 0&&e(O)!==null&&e(O)!==void 0&&e(I)>e(O)?s(k,"Min idle runners cannot be greater than max runners"):s(k,"")}),Pr(),Ar(),Hr(pr,{$$events:{close:()=>X("close")},children:(i,c)=>{var S=tt(),ee=d(S),Ae=d(ee),vr=d(Ae);a(Ae),a(ee);var re=o(ee,2),Je=d(re);{var fr=t=>{var n=Qr(),T=d(n),N=d(T,!0);a(T),a(n),f(()=>y(N,e(G))),b(t,n)};E(Je,t=>{e(G)&&t(fr)})}var Me=o(Je,2);{var mr=t=>{var n=Vr(),T=d(n),N=d(T,!0);a(T),a(n),f(()=>y(N,e(k))),b(t,n)};E(Me,t=>{e(k)&&t(mr)})}var te=o(Me,2),Ne=o(d(te),2),ae=d(Ne),Pe=o(d(ae),2),yr=d(Pe,!0);a(Pe),a(ae);var Ce=o(ae,2),Ue=o(d(Ce),2),xr=d(Ue);{var _r=t=>{var n=D();f(()=>y(n,`Repository: ${R(r()),p(()=>r().repo_name)??""}`)),b(t,n)},hr=t=>{var n=Ee(),T=Q(n);{var N=v=>{var m=D();f(()=>y(m,`Organization: ${R(r()),p(()=>r().org_name)??""}`)),b(v,m)},Se=v=>{var m=Ee(),h=Q(m);{var C=g=>{var l=D();f(()=>y(l,`Enterprise: ${R(r()),p(()=>r().enterprise_name)??""}`)),b(g,l)},U=g=>{var l=D("Unknown Entity");b(g,l)};E(h,g=>{R(r()),p(()=>r().enterprise_name)?g(C):g(U,!1)},!0)}b(v,m)};E(T,v=>{R(r()),p(()=>r().org_name)?v(N):v(Se,!1)},!0)}b(t,n)};E(xr,t=>{R(r()),p(()=>r().repo_name)?t(_r):t(hr,!1)})}a(Ue),a(Ce),a(Ne),a(te);var de=o(te,2),De=o(d(de),2);$(De),a(de);var oe=o(de,2),Ge=o(d(oe),2),se=d(Ge),je=o(d(se),2);$(je),a(se);var ie=o(se,2),ze=o(d(ie),2);$(ze),a(ie);var ne=o(ie,2),le=o(d(ne),2);f(()=>{e(_),Re(()=>{})});var ue=d(le);ue.value=ue.__value="linux";var Be=o(ue);Be.value=Be.__value="windows",a(le),a(ne);var pe=o(ne,2),be=o(d(pe),2);f(()=>{e(j),Re(()=>{})});var ce=d(be);ce.value=ce.__value="amd64";var Le=o(ce);Le.value=Le.__value="arm64",a(be),a(pe);var Fe=o(pe,2),kr=o(d(Fe),2);{var wr=t=>{var n=Xr();b(t,n)},Sr=t=>{var n=Ee(),T=Q(n);{var N=v=>{var m=Zr(),h=Q(m);f(()=>{e(w),Re(()=>{e(x)})}),jr(h,5,()=>e(x),zr,(g,l)=>{var P=Yr(),tr=d(P),Or=o(tr);{var Ir=Te=>{var dr=D();f(()=>y(dr,`- ${e(l),p(()=>e(l).description)??""}`)),b(Te,dr)};E(Or,Te=>{e(l),p(()=>e(l).description)&&Te(Ir)})}a(P);var ar={};f(()=>{y(tr,`${e(l),p(()=>e(l).name)??""} ${e(l),p(()=>e(l).owner_id==="system"?"(System)":"")??""} `),ar!==(ar=(e(l),p(()=>e(l).id)))&&(P.value=(P.__value=(e(l),p(()=>e(l).id)))??"")}),b(g,P)}),a(h);var C=o(h,2),U=d(C);a(C),f(g=>y(U,`Templates define how the runner software is installed and configured. + Showing templates for ${g??""} ${e(_)??""}.`),[()=>p(Z)]),$e(h,()=>e(w),g=>s(w,g)),b(v,m)},Se=v=>{var m=et(),h=d(m),C=d(h);a(h);var U=o(h,2),g=d(U);sr(),a(U),a(m),f((l,P)=>{y(C,`No templates found for ${l??""} ${e(_)??""}.`),Lr(g,"href",P)},[()=>p(Z),()=>(R(lr),p(()=>lr("/templates")))]),b(v,m)};E(T,v=>{e(x),p(()=>e(x).length>0)?v(N):v(Se,!1)},!0)}b(t,n)};E(kr,t=>{e(Y)?t(wr):t(Sr,!1)})}a(Fe),a(Ge),a(oe);var ge=o(oe,2),qe=o(d(ge),2),ve=d(qe),fe=o(d(ve),2);$(fe),a(ve);var me=o(ve,2),ye=o(d(me),2);$(ye),a(me);var He=o(me,2),We=o(d(He),2);$(We),a(He),a(qe),a(ge);var xe=o(ge,2),_e=o(d(xe),2),he=d(_e),Ke=o(d(he),2);$(Ke),a(he);var Qe=o(he,2),Ve=o(d(Qe),2);$(Ve),a(Qe),a(_e);var ke=o(_e,2),Xe=d(ke),Tr=o(d(Xe),2);Wr(Tr,{rows:4,placeholder:"{}",get value(){return e(A)},set value(t){s(A,t)},$$legacy:!0}),a(Xe),a(ke);var Ye=o(ke,2),Ze=d(Ye);$(Ze),sr(2),a(Ye),a(xe);var er=o(xe,2),rr=d(er),we=o(rr,2),Rr=d(we);{var Er=t=>{var n=rt();b(t,n)},$r=t=>{var n=D("Update Scale Set");b(t,n)};E(Rr,t=>{e(z)?t(Er):t($r,!1)})}a(we),a(er),a(re),a(S),f(()=>{y(vr,`Update Scale Set ${R(r()),p(()=>r().name)??""}`),y(yr,(R(r()),p(()=>r().provider_name))),nr(fe,1,`w-full px-3 py-2 border ${e(k)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),nr(ye,1,`w-full px-3 py-2 border ${e(k)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),we.disabled=e(z)||e(k)!==""}),J(De,()=>e(B),t=>s(B,t)),J(je,()=>e(L),t=>s(L,t)),J(ze,()=>e(F),t=>s(F,t)),$e(le,()=>e(_),t=>s(_,t)),$e(be,()=>e(j),t=>s(j,t)),J(fe,()=>e(I),t=>s(I,t)),J(ye,()=>e(O),t=>s(O,t)),J(We,()=>e(q),t=>s(q,t)),J(Ke,()=>e(H),t=>s(H,t)),J(Ve,()=>e(W),t=>s(W,t)),Fr(Ze,()=>e(K),t=>s(K,t)),ir("click",rr,()=>X("close")),ir("submit",re,qr(gr)),b(i,S)},$$slots:{default:!0}}),Cr(),cr()}export{vt as U}; diff --git a/webapp/assets/_app/immutable/chunks/BV_mDmfH.js b/webapp/assets/_app/immutable/chunks/BV_mDmfH.js new file mode 100644 index 00000000..273ea740 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/BV_mDmfH.js @@ -0,0 +1 @@ +import{F as C}from"./cPTQ2Ibn.js";function x(){const{subscribe:E,set:L,update:s}=C({connected:!1,connecting:!1,error:null,lastEvent:null});let e=null,b=0,W=50,k=1e3,f=1e3,m=3e4,d=null,r=[],i=!1;const l=new Map;function N(){const t=window.location.protocol==="https:"?"wss:":"ws:",n=window.location.host;return`${t}//${n}/api/v1/ws/events`}function u(){if(!(e&&(e.readyState===WebSocket.CONNECTING||e.readyState===WebSocket.OPEN))){i=!1,s(t=>({...t,connecting:!0,error:null}));try{const t=N();e=new WebSocket(t);const n=setTimeout(()=>{e&&e.readyState===WebSocket.CONNECTING&&e.close()},1e4);e.onopen=()=>{clearTimeout(n),b=0,f=k,s(a=>({...a,connected:!0,connecting:!1,error:null})),r.length>0&&g(r)},e.onmessage=a=>{try{const c=JSON.parse(a.data);s(o=>({...o,lastEvent:c})),(l.get(c["entity-type"])||[]).forEach(o=>{try{o(c)}catch(w){console.error("[WebSocket] Error in event callback:",w)}})}catch(c){console.error("[WebSocket] Error parsing message:",c)}},e.onclose=a=>{clearTimeout(n);const c=a.code===1e3&&i,S=a.code!==1e3?`Connection closed: ${a.reason||"Unknown reason"}`:null;s(o=>({...o,connected:!1,connecting:!1,error:S})),c||h()},e.onerror=a=>{clearTimeout(n),s(c=>({...c,connected:!1,connecting:!1,error:"WebSocket connection error"})),i||h()}}catch(t){s(n=>({...n,connected:!1,connecting:!1,error:t instanceof Error?t.message:"Failed to connect"}))}}}function M(){}function F(){}function h(){if(i)return;d&&clearTimeout(d),b++,b>W&&(b=1,f=k);const t=Math.min(f,m);d=window.setTimeout(()=>{if(!i){u();const n=Math.random()*1e3;f=Math.min(f*1.5+n,m)}},t)}function g(t){if(e&&e.readyState===WebSocket.OPEN){const n={"send-everything":!1,filters:t};e.send(JSON.stringify(n)),r=[...t]}}function y(){i=!0,d&&(clearTimeout(d),d=null),e&&(e.close(1e3,"Manual disconnect"),e=null),l.clear(),r=[],s(t=>({...t,connected:!1,connecting:!1,error:null,lastEvent:null}))}function O(){navigator.onLine&&!i&&setTimeout(()=>{(!e||e.readyState===WebSocket.CLOSED||e.readyState===WebSocket.CLOSING)&&(b=0,f=k,u())},2e3)}typeof window<"u"&&(window.addEventListener("online",O),window.addEventListener("offline",()=>{s(t=>({...t,error:"Network offline"}))}),setInterval(()=>{i||(!e||e.readyState===WebSocket.CLOSED||e.readyState===WebSocket.CLOSING)&&u()},1e4));function v(t,n,a){l.has(t)||l.set(t,[]),l.get(t).push(a);const c=r.findIndex(o=>o["entity-type"]===t),S={"entity-type":t,operations:n};if(c>=0){const o=r[c].operations;S.operations=Array.from(new Set([...o,...n])),r[c]=S}else r.push(S);return e&&e.readyState===WebSocket.OPEN&&g(r),(!e||e.readyState===WebSocket.CLOSED||e.readyState===WebSocket.CLOSING)&&u(),()=>{const o=l.get(t);if(o){const w=o.indexOf(a);if(w>-1&&o.splice(w,1),o.length===0){l.delete(t);const p=r.findIndex(I=>I["entity-type"]===t);p>-1&&(r.splice(p,1),e&&e.readyState===WebSocket.OPEN&&g(r))}}}}return typeof window<"u"&&u(),{subscribe:E,connect:u,disconnect:y,subscribeToEntity:v}}const D=x();export{D as w}; diff --git a/webapp/assets/_app/immutable/chunks/D9uxtZe_.js b/webapp/assets/_app/immutable/chunks/BVyy60Ai.js similarity index 97% rename from webapp/assets/_app/immutable/chunks/D9uxtZe_.js rename to webapp/assets/_app/immutable/chunks/BVyy60Ai.js index 4a9c1ca4..bba416ab 100644 --- a/webapp/assets/_app/immutable/chunks/D9uxtZe_.js +++ b/webapp/assets/_app/immutable/chunks/BVyy60Ai.js @@ -1 +1 @@ -import{I as w}from"./CRKWEg6v.js";import{g as r}from"./-esynYXT.js";const m=!0,z=m,I=()=>window.location.port==="5173",b={isAuthenticated:!1,user:null,loading:!0,needsInitialization:!1},n=w(b);function f(t,a,e=7){const i=new Date;i.setTime(i.getTime()+e*24*60*60*1e3),document.cookie=`${t}=${a};expires=${i.toUTCString()};path=/;SameSite=Lax`}function d(t){const a=t+"=",e=document.cookie.split(";");for(let i=0;i({...i,loading:!0}));const e=await r.login({username:t,password:a});z&&(f("garm_token",e.token),f("garm_user",t)),r.setToken(e.token),n.set({isAuthenticated:!0,user:t,loading:!1,needsInitialization:!1})}catch(e){throw n.update(i=>({...i,loading:!1})),e}},logout(){g("garm_token"),g("garm_user"),n.set({isAuthenticated:!1,user:null,loading:!1,needsInitialization:!1})},async init(){try{n.update(e=>({...e,loading:!0})),await c.checkInitializationStatus();const t=d("garm_token"),a=d("garm_user");if(t&&a&&(r.setToken(t),await c.checkAuth())){n.set({isAuthenticated:!0,user:a,loading:!1,needsInitialization:!1});return}n.update(e=>({...e,loading:!1,needsInitialization:!1}))}catch{n.update(a=>({...a,loading:!1}))}},async checkInitializationStatus(){try{const t={Accept:"application/json"},a=d("garm_token"),e=I();e&&a&&(t.Authorization=`Bearer ${a}`);const i=await fetch("/api/v1/login",{method:"GET",headers:t,credentials:e?"omit":"include"});if(!i.ok){if(i.status===409&&(await i.json()).error==="init_required")throw n.update(s=>({...s,needsInitialization:!0,loading:!1})),new Error("Initialization required");return}return}catch(t){if(t instanceof Error&&t.message==="Initialization required")throw t;return}},async checkAuth(){try{return await c.checkInitializationStatus(),await r.getControllerInfo(),!0}catch(t){return t instanceof Error&&t.message==="Initialization required"?!1:t?.response?.status===409&&t?.response?.data?.error==="init_required"?(n.update(a=>({...a,needsInitialization:!0,loading:!1})),!1):(c.logout(),!1)}},async initialize(t,a,e,i,o){try{n.update(u=>({...u,loading:!0}));const s=await r.firstRun({username:t,email:a,password:e,full_name:i||t});await c.login(t,e);const l=window.location.origin,h=o?.metadataUrl||`${l}/api/v1/metadata`,p=o?.callbackUrl||`${l}/api/v1/callbacks`,k=o?.webhookUrl||`${l}/webhooks`;await r.updateController({metadata_url:h,callback_url:p,webhook_url:k}),n.update(u=>({...u,needsInitialization:!1}))}catch(s){throw n.update(l=>({...l,loading:!1})),s}}};export{n as a,c as b}; +import{F as w}from"./cPTQ2Ibn.js";import{g as r}from"./DqbUkQgD.js";const m=!0,z=m,I=()=>window.location.port==="5173",b={isAuthenticated:!1,user:null,loading:!0,needsInitialization:!1},n=w(b);function f(t,a,e=7){const i=new Date;i.setTime(i.getTime()+e*24*60*60*1e3),document.cookie=`${t}=${a};expires=${i.toUTCString()};path=/;SameSite=Lax`}function d(t){const a=t+"=",e=document.cookie.split(";");for(let i=0;i({...i,loading:!0}));const e=await r.login({username:t,password:a});z&&(f("garm_token",e.token),f("garm_user",t)),r.setToken(e.token),n.set({isAuthenticated:!0,user:t,loading:!1,needsInitialization:!1})}catch(e){throw n.update(i=>({...i,loading:!1})),e}},logout(){g("garm_token"),g("garm_user"),n.set({isAuthenticated:!1,user:null,loading:!1,needsInitialization:!1})},async init(){try{n.update(e=>({...e,loading:!0})),await c.checkInitializationStatus();const t=d("garm_token"),a=d("garm_user");if(t&&a&&(r.setToken(t),await c.checkAuth())){n.set({isAuthenticated:!0,user:a,loading:!1,needsInitialization:!1});return}n.update(e=>({...e,loading:!1,needsInitialization:!1}))}catch{n.update(a=>({...a,loading:!1}))}},async checkInitializationStatus(){try{const t={Accept:"application/json"},a=d("garm_token"),e=I();e&&a&&(t.Authorization=`Bearer ${a}`);const i=await fetch("/api/v1/login",{method:"GET",headers:t,credentials:e?"omit":"include"});if(!i.ok){if(i.status===409&&(await i.json()).error==="init_required")throw n.update(s=>({...s,needsInitialization:!0,loading:!1})),new Error("Initialization required");return}return}catch(t){if(t instanceof Error&&t.message==="Initialization required")throw t;return}},async checkAuth(){try{return await c.checkInitializationStatus(),await r.getControllerInfo(),!0}catch(t){return t instanceof Error&&t.message==="Initialization required"?!1:t?.response?.status===409&&t?.response?.data?.error==="init_required"?(n.update(a=>({...a,needsInitialization:!0,loading:!1})),!1):(c.logout(),!1)}},async initialize(t,a,e,i,o){try{n.update(u=>({...u,loading:!0}));const s=await r.firstRun({username:t,email:a,password:e,full_name:i||t});await c.login(t,e);const l=window.location.origin,h=o?.metadataUrl||`${l}/api/v1/metadata`,p=o?.callbackUrl||`${l}/api/v1/callbacks`,k=o?.webhookUrl||`${l}/webhooks`;await r.updateController({metadata_url:h,callback_url:p,webhook_url:k}),n.update(u=>({...u,needsInitialization:!1}))}catch(s){throw n.update(l=>({...l,loading:!1})),s}}};export{n as a,c as b}; diff --git a/webapp/assets/_app/immutable/chunks/BZ2WxPPD.js b/webapp/assets/_app/immutable/chunks/BZ2WxPPD.js new file mode 100644 index 00000000..0d8c1f85 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/BZ2WxPPD.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as v}from"./C7KraPli.js";import{p as w,l as m,q as s,g as r,m as g,h as x,B as h,a as T,b as B,c as S,k,u}from"./cPTQ2Ibn.js";import{k as A}from"./Du50aAe5.js";import{p as d}from"./DqFqoVWr.js";import{k as b,B as C}from"./DJsB5Z5V.js";import{f as E}from"./ow_oMtSd.js";function j(_,i){w(i,!1);const c=g(),n=g();let e=d(i,"item",8),l=d(i,"statusType",8,"entity"),a=d(i,"statusField",8,"status");m(()=>(s(e()),s(a())),()=>{k(c,e()?.[a()]||"unknown")}),m(()=>(s(e()),s(l()),r(c),s(a())),()=>{k(n,(()=>{if(!e())return{variant:"error",text:"Unknown"};switch(l()){case"entity":return b(e());case"instance":let t="secondary";switch(r(c).toLowerCase()){case"running":t="success";break;case"stopped":t="info";break;case"creating":case"pending_create":t="warning";break;case"deleting":case"pending_delete":case"pending_force_delete":t="warning";break;case"error":case"deleted":t="error";break;case"active":case"online":t="success";break;case"idle":t="info";break;case"pending":case"installing":t="warning";break;case"failed":case"terminated":case"offline":t="error";break;case"unknown":default:t="secondary";break}return{variant:t,text:E(r(c))};case"enabled":return{variant:e().enabled?"success":"error",text:e().enabled?"Enabled":"Disabled"};case"custom":const o=e()[a()]||"Unknown";if(a()==="auth-type"){const f=o==="pat"||!o?"pat":"app";return{variant:f==="pat"?"success":"info",text:f==="pat"?"PAT":"App"}}return{variant:"info",text:o};default:return b(e())}})())}),x(),v();var p=h(),y=T(p);A(y,()=>(s(e()),s(a()),u(()=>`${e()?.name||"item"}-${e()?.[a()]||"status"}-${e()?.updated_at||"time"}`)),t=>{C(t,{get variant(){return r(n),u(()=>r(n).variant)},get text(){return r(n),u(()=>r(n).text)}})}),B(_,p),S()}export{j as S}; diff --git a/webapp/assets/_app/immutable/chunks/Bc0BXFmi.js b/webapp/assets/_app/immutable/chunks/Bc0BXFmi.js deleted file mode 100644 index 356ae940..00000000 --- a/webapp/assets/_app/immutable/chunks/Bc0BXFmi.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as K}from"./DT0EGONV.js";import{p as O,f as U,j as e,r as t,k as s,n as c,u as o,z as at,t as q,v as g,c as h,d as Q,E as mt,D as ut,B as Y,b as Z,g as P}from"./CRKWEg6v.js";import{p as T,i as H,s as gt,a as pt}from"./e1m7WRO5.js";import{c as rt,d as tt,B as xt}from"./-esynYXT.js";import{b as R,B as $,e as ft}from"./c_t0vA9G.js";import{e as yt}from"./Djd10kRn.js";import{D as ht,G as et}from"./B1coRVG4.js";import{E as _t}from"./DF8ZTWYj.js";import{S as kt}from"./B0Y2gXDu.js";import{e as bt,i as wt}from"./C73ZVvpW.js";import{b as Ct}from"./b5SBTec5.js";var Pt=U('

ID
Created At
Updated At
Status
Pool Balancer Type
');function $t(L,v){O(v,!1);let a=T(v,"entity",8),p=T(v,"entityType",8);function N(){return`${p().charAt(0).toUpperCase()+p().slice(1)} Information`}function n(){if(!a().endpoint?.base_url)return"#";switch(p()){case"repository":const d=a();return`${a().endpoint.base_url}/${d.owner}/${a().name}`;case"organization":return`${a().endpoint.base_url}/${a().name}`;case"enterprise":return`${a().endpoint.base_url}/enterprises/${a().name}`;default:return"#"}}function E(){return`${p().charAt(0).toUpperCase()+p().slice(1)} URL`}function V(){const d=a().pool_balancing_type;if(!d||d===""||d==="none")return"Round Robin (default)";switch(d){case"roundrobin":return"Round Robin";case"pack":return"Pack";default:return d}}K();var m=Pt(),x=e(m),_=e(x),I=e(_,!0);t(_);var k=s(_,2),i=e(k),f=s(e(i),2),b=e(f,!0);t(f),t(i);var u=s(i,2),D=s(e(u),2),M=e(D,!0);t(D),t(u);var w=s(u,2),S=s(e(w),2),G=e(S,!0);t(S),t(w);var r=s(w,2),C=s(e(r),2),l=e(C);{var j=d=>{$(d,{variant:"success",text:"Running"})},z=d=>{$(d,{variant:"error",text:"Stopped"})};H(l,d=>{c(a()),o(()=>a().pool_manager_status?.running)?d(j):d(z,!1)})}t(C),t(r);var B=s(r,2),A=s(e(B),2),y=e(A,!0);t(A),t(B);var W=s(B,2),F=e(W),st=e(F,!0);t(F);var X=s(F,2),J=e(X),ot=e(J);at(),t(J),t(X),t(W),t(k),t(x),t(m),q((d,it,dt,nt,lt,vt,ct)=>{g(I,d),g(b,(c(a()),o(()=>a().id))),g(M,it),g(G,dt),g(y,nt),g(st,lt),rt(J,"href",vt),g(ot,`${ct??""} `)},[()=>o(N),()=>(c(R),c(a()),o(()=>R(a().created_at))),()=>(c(R),c(a()),o(()=>R(a().updated_at))),()=>o(V),()=>o(E),()=>o(n),()=>o(n)]),h(L,m),Q()}var Tt=U('

No pools configured

'),Et=U('');function Wt(L,v){O(v,!1);const[a,p]=gt(),N=()=>pt(yt,"$eagerCache",a);let n=T(v,"pools",8),E=T(v,"entityType",8),V=T(v,"entityId",8,""),m=T(v,"entityName",8,"");const x=mt();function _(){x("addPool",{entityType:E(),entityId:V(),entityName:m()})}const I=[{key:"id",title:"ID",flexible:!0,cellComponent:_t,cellProps:{entityType:"pool",showId:!0,fontMono:!0}},{key:"image",title:"Image",flexible:!0,cellComponent:et,cellProps:{field:"image",type:"code",showTitle:!0}},{key:"provider",title:"Provider",cellComponent:et,cellProps:{field:"provider_name"}},{key:"status",title:"Status",cellComponent:kt,cellProps:{statusType:"enabled"}}],k={entityType:"pool",primaryText:{field:"id",isClickable:!0,href:"/pools/{id}",useId:!0,isMonospace:!0},secondaryText:{field:"entity_name",computedValue:r=>ft(r,N())},badges:[{type:"custom",value:r=>({variant:r.enabled?"success":"error",text:r.enabled?"Enabled":"Disabled"})}]};K();var i=Et(),f=e(i),b=e(f),u=e(b),D=e(u);t(u);var M=s(u,2);t(b);var w=s(b,2);{var S=r=>{var C=Tt(),l=s(e(C),4),j=e(l);t(l);var z=s(l,2),B=e(z);xt(B,{variant:"primary",size:"sm",$$events:{click:_},children:(A,y)=>{at();var W=ut("Add Pool");h(A,W)},$$slots:{default:!0}}),t(z),t(C),q(()=>g(j,`No pools configured for this ${E()??""}.`)),h(r,C)},G=r=>{ht(r,{get columns(){return I},get data(){return n()},loading:!1,error:"",searchTerm:"",showSearch:!1,showPagination:!1,currentPage:1,get perPage(){return c(n()),o(()=>n().length)},totalPages:1,get totalItems(){return c(n()),o(()=>n().length)},itemName:"pools",emptyTitle:"No pools configured",get emptyMessage(){return`No pools configured for this ${E()??""}.`},emptyIconType:"cog",get mobileCardConfig(){return k}})};H(w,r=>{c(n()),o(()=>n().length===0)?r(S):r(G,!1)})}t(f),t(i),q(r=>{g(D,`Pools (${c(n()),o(()=>n().length)??""})`),rt(M,"href",r)},[()=>(c(tt),o(()=>tt("/pools")))]),h(L,i),Q(),p()}var It=U('

'),Bt=U('

Events

'),Nt=U('

Events

No events available

');function qt(L,v){O(v,!1);let a=T(v,"events",8),p=T(v,"eventsContainer",12,void 0);K();var N=Y(),n=Z(N);{var E=m=>{var x=Bt(),_=e(x),I=s(e(_),2);bt(I,5,a,wt,(k,i)=>{var f=It(),b=e(f),u=e(b),D=e(u,!0);t(u);var M=s(u,2),w=e(M);{var S=l=>{$(l,{variant:"error",text:"Error"})},G=l=>{var j=Y(),z=Z(j);{var B=y=>{$(y,{variant:"warning",text:"Warning"})},A=y=>{$(y,{variant:"info",text:"Info"})};H(z,y=>{P(i),o(()=>(P(i).event_level||"info").toLowerCase()==="warning")?y(B):y(A,!1)},!0)}h(l,j)};H(w,l=>{P(i),o(()=>(P(i).event_level||"info").toLowerCase()==="error")?l(S):l(G,!1)})}var r=s(w,2),C=e(r,!0);t(r),t(M),t(b),t(f),q(l=>{g(D,(P(i),o(()=>P(i).message))),g(C,l)},[()=>(c(R),P(i),o(()=>R(P(i).created_at)))]),h(k,f)}),t(I),Ct(I,k=>p(k),()=>p()),t(_),t(x),h(m,x)},V=m=>{var x=Nt();h(m,x)};H(n,m=>{c(a()),o(()=>a()&&a().length>0)?m(E):m(V,!1)})}h(L,N),Q()}export{$t as E,Wt as P,qt as a}; diff --git a/webapp/assets/_app/immutable/chunks/BgSaD1r_.js b/webapp/assets/_app/immutable/chunks/BgSaD1r_.js new file mode 100644 index 00000000..198f6f6f --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/BgSaD1r_.js @@ -0,0 +1 @@ +import{s as t,p as r}from"./CTvJf3dP.js";const e={get data(){return r.data},get error(){return r.error},get form(){return r.form},get params(){return r.params},get route(){return r.route},get state(){return r.state},get status(){return r.status},get url(){return r.url}};t.updated.check;const s=e;export{s as p}; diff --git a/webapp/assets/_app/immutable/chunks/D6DjlyIQ.js b/webapp/assets/_app/immutable/chunks/Bgbd8SZ5.js similarity index 90% rename from webapp/assets/_app/immutable/chunks/D6DjlyIQ.js rename to webapp/assets/_app/immutable/chunks/Bgbd8SZ5.js index 42d8bfcf..a39c9abe 100644 --- a/webapp/assets/_app/immutable/chunks/D6DjlyIQ.js +++ b/webapp/assets/_app/immutable/chunks/Bgbd8SZ5.js @@ -1 +1 @@ -import{I as u}from"./CRKWEg6v.js";function c(){const{subscribe:s,set:i,update:o}=u([]),n={subscribe:s,add:e=>{const t=Math.random().toString(36).substr(2,9),r={...e,id:t,duration:e.duration??5e3};return o(a=>[...a,r]),r.duration&&r.duration>0&&setTimeout(()=>{o(a=>a.filter(d=>d.id!==t))},r.duration),t},remove:e=>{o(t=>t.filter(r=>r.id!==e))},clear:()=>{i([])},success:(e,t="",r)=>n.add({type:"success",title:e,message:t,duration:r}),error:(e,t="",r)=>n.add({type:"error",title:e,message:t,duration:r}),info:(e,t="",r)=>n.add({type:"info",title:e,message:t,duration:r}),warning:(e,t="",r)=>n.add({type:"warning",title:e,message:t,duration:r})};return n}const p=c();export{p as t}; +import{F as u}from"./cPTQ2Ibn.js";function c(){const{subscribe:s,set:i,update:o}=u([]),n={subscribe:s,add:e=>{const t=Math.random().toString(36).substr(2,9),r={...e,id:t,duration:e.duration??5e3};return o(a=>[...a,r]),r.duration&&r.duration>0&&setTimeout(()=>{o(a=>a.filter(d=>d.id!==t))},r.duration),t},remove:e=>{o(t=>t.filter(r=>r.id!==e))},clear:()=>{i([])},success:(e,t="",r)=>n.add({type:"success",title:e,message:t,duration:r}),error:(e,t="",r)=>n.add({type:"error",title:e,message:t,duration:r}),info:(e,t="",r)=>n.add({type:"info",title:e,message:t,duration:r}),warning:(e,t="",r)=>n.add({type:"warning",title:e,message:t,duration:r})};return n}const p=c();export{p as t}; diff --git a/webapp/assets/_app/immutable/chunks/Bo3f8OIz.js b/webapp/assets/_app/immutable/chunks/Bo3f8OIz.js new file mode 100644 index 00000000..b0450836 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/Bo3f8OIz.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as u}from"./C7KraPli.js";import{p as v,E as m,f as h,d as r,r as d,i,b as k,c as g}from"./cPTQ2Ibn.js";import{i as b}from"./DqbUkQgD.js";var w=h('');function M(s,t){v(t,!1);const l=m();function n(){l("close")}function c(o){o.stopPropagation()}function f(o){o.key==="Escape"&&l("close")}u();var a=w(),e=r(a),p=r(e);b(p,t,"default",{}),d(e),d(a),i("click",e,c),i("click",a,n),i("keydown",a,f),k(s,a),g()}export{M}; diff --git a/webapp/assets/_app/immutable/chunks/BxQMwFca.js b/webapp/assets/_app/immutable/chunks/BxQMwFca.js deleted file mode 100644 index dae3b474..00000000 --- a/webapp/assets/_app/immutable/chunks/BxQMwFca.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as mr}from"./DT0EGONV.js";import{p as yr,E as xr,m as b,o as _r,s as n,l as hr,g as e,a as kr,f as $,j as a,r as t,k as d,t as w,y as We,u as T,z as wr,n as B,v as E,e as O,c as _,D as Er,d as $r}from"./CRKWEg6v.js";import{p as Rr,i as G,s as Sr,a as Tr}from"./e1m7WRO5.js";import{e as Or,i as Pr}from"./C73ZVvpW.js";import{r as c,s as qe,b as Qe,c as Jr}from"./-esynYXT.js";import{b as v,a as Mr}from"./B3a35v7J.js";import{p as Nr}from"./D4Caz1gY.js";import{M as Ur}from"./xe-4nY5o.js";import{J as Ar}from"./DJsbLMno.js";import{e as Ir}from"./BZiHL9L3.js";import{e as jr}from"./Djd10kRn.js";var Cr=$('

'),Dr=$('

'),Br=$(' '),Gr=$('
'),zr=$('
Updating...
'),Lr=$('

Pool Information (Read-only)

Provider:
Entity:

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Tags
Extra Specs (JSON)
');function tt(Ve,fe){yr(fe,!1);const[Xe,Ye]=Sr(),z=()=>Tr(jr,"$eagerCache",Xe);let o=Rr(fe,"pool",8);const L=xr();let P=b(!1),J=b(""),p=b(""),M=b(o().image||""),N=b(o().flavor||""),m=b(o().max_runners),y=b(o().min_idle_runners),U=b(o().runner_bootstrap_timeout),A=b(o().priority),I=b(o().runner_prefix||""),R=b(o().os_type||"linux"),S=b(o().os_arch||"amd64"),j=b(o()["github-runner-group"]||""),C=b(o().enabled),g=b((o().tags||[]).map(i=>i.name||"").filter(Boolean)),h=b(""),f=b("{}");function Ze(i){if(i.repo_id){const s=z().repositories.find(l=>l.id===i.repo_id);return s?`${s.owner}/${s.name}`:"Unknown Entity"}if(i.org_id){const s=z().organizations.find(l=>l.id===i.org_id);return s&&s.name?s.name:"Unknown Entity"}if(i.enterprise_id){const s=z().enterprises.find(l=>l.id===i.enterprise_id);return s&&s.name?s.name:"Unknown Entity"}return"Unknown Entity"}function er(i){return i.repo_id?"Repository":i.org_id?"Organization":i.enterprise_id?"Enterprise":"Unknown"}_r(()=>{if(o().extra_specs)try{if(typeof o().extra_specs=="object")n(f,JSON.stringify(o().extra_specs,null,2));else{const i=JSON.parse(o().extra_specs);n(f,JSON.stringify(i,null,2))}}catch{n(f,o().extra_specs||"{}")}});function me(){e(h).trim()&&!e(g).includes(e(h).trim())&&(n(g,[...e(g),e(h).trim()]),n(h,""))}function rr(i){n(g,e(g).filter((s,l)=>l!==i))}function tr(i){i.key==="Enter"&&(i.preventDefault(),me())}async function ar(){try{if(n(P,!0),n(J,""),e(p))throw new Error(e(p));let i={};if(e(f).trim())try{i=JSON.parse(e(f))}catch{throw new Error("Invalid JSON in extra specs")}const s={image:e(M)!==o().image?e(M):void 0,flavor:e(N)!==o().flavor?e(N):void 0,max_runners:e(m)!==o().max_runners?e(m):void 0,min_idle_runners:e(y)!==o().min_idle_runners?e(y):void 0,runner_bootstrap_timeout:e(U)!==o().runner_bootstrap_timeout?e(U):void 0,priority:e(A)!==o().priority?e(A):void 0,runner_prefix:e(I)!==o().runner_prefix?e(I):void 0,os_type:e(R)!==o().os_type?e(R):void 0,os_arch:e(S)!==o().os_arch?e(S):void 0,"github-runner-group":e(j)!==o()["github-runner-group"]&&e(j)||void 0,enabled:e(C)!==o().enabled?e(C):void 0,tags:JSON.stringify(e(g))!==JSON.stringify((o().tags||[]).map(l=>l.name||"").filter(Boolean))?e(g):void 0,extra_specs:e(f).trim()!==JSON.stringify(o().extra_specs||{},null,2).trim()?i:void 0};Object.keys(s).forEach(l=>{s[l]===void 0&&delete s[l]}),L("submit",s)}catch(i){n(J,Ir(i))}finally{n(P,!1)}}hr(()=>(e(y),e(m)),()=>{e(y)!==null&&e(m)!==null&&e(y)>e(m)?n(p,"Min idle runners cannot be greater than max runners"):n(p,"")}),kr(),mr(),Ur(Ve,{$$events:{close:()=>L("close")},children:(i,s)=>{var l=Lr(),F=a(l),ye=a(F),dr=a(ye);t(ye),t(F);var H=d(F,2),xe=a(H);{var or=r=>{var u=Cr(),x=a(u),k=a(x,!0);t(x),t(u),w(()=>E(k,e(J))),_(r,u)};G(xe,r=>{e(J)&&r(or)})}var _e=d(xe,2);{var ir=r=>{var u=Dr(),x=a(u),k=a(x,!0);t(x),t(u),w(()=>E(k,e(p))),_(r,u)};G(_e,r=>{e(p)&&r(ir)})}var K=d(_e,2),he=d(a(K),2),W=a(he),ke=d(a(W),2),nr=a(ke,!0);t(ke),t(W);var we=d(W,2),Ee=d(a(we),2),sr=a(Ee);t(Ee),t(we),t(he),t(K);var q=d(K,2),$e=d(a(q),2),Q=a($e),Re=d(a(Q),2);c(Re),t(Q);var V=d(Q,2),Se=d(a(V),2);c(Se),t(V);var X=d(V,2),Y=d(a(X),2);w(()=>{e(R),We(()=>{})});var Z=a(Y);Z.value=Z.__value="linux";var Te=d(Z);Te.value=Te.__value="windows",t(Y),t(X);var Oe=d(X,2),ee=d(a(Oe),2);w(()=>{e(S),We(()=>{})});var re=a(ee);re.value=re.__value="amd64";var Pe=d(re);Pe.value=Pe.__value="arm64",t(ee),t(Oe),t($e),t(q);var te=d(q,2),Je=d(a(te),2),ae=a(Je),de=d(a(ae),2);c(de),t(ae);var oe=d(ae,2),ie=d(a(oe),2);c(ie),t(oe);var Me=d(oe,2),Ne=d(a(Me),2);c(Ne),t(Me),t(Je),t(te);var ne=d(te,2),se=d(a(ne),2),le=a(se),Ue=d(a(le),2);c(Ue),t(le);var ue=d(le,2),Ae=d(a(ue),2);c(Ae),t(ue);var Ie=d(ue,2),je=d(a(Ie),2);c(je),t(Ie),t(se);var be=d(se,2),Ce=a(be),De=d(a(Ce),2),ge=a(De),D=a(ge);c(D);var lr=d(D,2);t(ge);var ur=d(ge,2);{var br=r=>{var u=Gr();Or(u,5,()=>e(g),Pr,(x,k,fr)=>{var ve=Br(),He=a(ve),Ke=d(He);t(ve),w(()=>{E(He,`${e(k)??""} `),Jr(Ke,"aria-label",`Remove tag ${e(k)??""}`)}),O("click",Ke,()=>rr(fr)),_(x,ve)}),t(u),_(r,u)};G(ur,r=>{e(g),T(()=>e(g).length>0)&&r(br)})}t(De),t(Ce),t(be);var ce=d(be,2),Be=a(ce),gr=d(a(Be),2);Ar(gr,{rows:4,placeholder:"{}",get value(){return e(f)},set value(r){n(f,r)},$$legacy:!0}),t(Be),t(ce);var Ge=d(ce,2),ze=a(Ge);c(ze),wr(2),t(Ge),t(ne);var Le=d(ne,2),Fe=a(Le),pe=d(Fe,2),cr=a(pe);{var pr=r=>{var u=zr();_(r,u)},vr=r=>{var u=Er("Update Pool");_(r,u)};G(cr,r=>{e(P)?r(pr):r(vr,!1)})}t(pe),t(Le),t(H),t(l),w((r,u)=>{E(dr,`Update Pool ${B(o()),T(()=>o().id)??""}`),E(nr,(B(o()),T(()=>o().provider_name))),E(sr,`${r??""}: ${u??""}`),qe(de,1,`w-full px-3 py-2 border ${e(p)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),qe(ie,1,`w-full px-3 py-2 border ${e(p)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),pe.disabled=e(P)||e(p)!==""},[()=>(B(o()),T(()=>er(o()))),()=>(B(o()),T(()=>Ze(o())))]),v(Re,()=>e(M),r=>n(M,r)),v(Se,()=>e(N),r=>n(N,r)),Qe(Y,()=>e(R),r=>n(R,r)),Qe(ee,()=>e(S),r=>n(S,r)),v(de,()=>e(y),r=>n(y,r)),v(ie,()=>e(m),r=>n(m,r)),v(Ne,()=>e(U),r=>n(U,r)),v(Ue,()=>e(I),r=>n(I,r)),v(Ae,()=>e(A),r=>n(A,r)),v(je,()=>e(j),r=>n(j,r)),v(D,()=>e(h),r=>n(h,r)),O("keydown",D,tr),O("click",lr,me),Mr(ze,()=>e(C),r=>n(C,r)),O("click",Fe,()=>L("close")),O("submit",H,Nr(ar)),_(i,l)},$$slots:{default:!0}}),$r(),Ye()}export{tt as U}; diff --git a/webapp/assets/_app/immutable/chunks/C2rI8IaC.js b/webapp/assets/_app/immutable/chunks/C2rI8IaC.js new file mode 100644 index 00000000..582270a6 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/C2rI8IaC.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as V}from"./C7KraPli.js";import{p as B,E as D,l as t,q as s,g as e,m as a,h as P,f as T,t as q,i as S,b as F,c as G,u as I,d as w,k as o,r as z}from"./cPTQ2Ibn.js";import{e as J,h as K,s as N,f as O}from"./DqbUkQgD.js";import{l as C,p as l}from"./DqFqoVWr.js";var Q=T('');function Z(j,i){const M=C(i,["children","$$slots","$$events","$$legacy"]),L=C(M,["action","disabled","title","ariaLabel","size"]);B(i,!1);const u=a(),h=a(),p=a(),v=a(),g=a(),f=a(),n=a(),m=a(),b=a(),A=D();let r=l(i,"action",8,"edit"),x=l(i,"disabled",8,!1),y=l(i,"title",8,""),_=l(i,"ariaLabel",8,""),c=l(i,"size",8,"md");function H(){x()||A("click")}t(()=>{},()=>{o(u,"transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-900 cursor-pointer disabled:cursor-not-allowed disabled:opacity-50")}),t(()=>s(c()),()=>{o(h,{sm:"p-1",md:"p-2"}[c()])}),t(()=>s(r()),()=>{o(p,{edit:"text-indigo-600 dark:text-indigo-400 hover:text-indigo-900 dark:hover:text-indigo-300 focus:ring-indigo-500",delete:"text-red-600 dark:text-red-400 hover:text-red-900 dark:hover:text-red-300 focus:ring-red-500",view:"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-300 focus:ring-gray-500",add:"text-green-600 dark:text-green-400 hover:text-green-900 dark:hover:text-green-300 focus:ring-green-500",copy:"text-blue-600 dark:text-blue-400 hover:text-blue-900 dark:hover:text-blue-300 focus:ring-blue-500"}[r()])}),t(()=>s(c()),()=>{o(v,c()==="sm"?"h-4 w-4":"h-5 w-5")}),t(()=>(e(u),e(h),e(p)),()=>{o(g,[e(u),e(h),e(p)].join(" "))}),t(()=>{},()=>{o(f,{edit:'',delete:'',view:'',add:'',copy:''})}),t(()=>{},()=>{o(n,{edit:"Edit",delete:"Delete",view:"View",add:"Add",copy:"Clone"})}),t(()=>(s(y()),e(n),s(r())),()=>{o(m,y()||e(n)[r()])}),t(()=>(s(_()),e(n),s(r())),()=>{o(b,_()||`${e(n)[r()]} item`)}),P(),V();var d=Q();J(d,()=>({type:"button",class:e(g),disabled:x(),title:e(m),"aria-label":e(b),...L}));var k=w(d),E=w(k);K(E,()=>(e(f),s(r()),I(()=>e(f)[r()])),!0),z(k),z(d),q(()=>N(k,0,O(e(v)))),S("click",d,H),F(j,d),G()}export{Z as A}; diff --git a/webapp/assets/_app/immutable/chunks/C73ZVvpW.js b/webapp/assets/_app/immutable/chunks/C73ZVvpW.js deleted file mode 100644 index 189c25d1..00000000 --- a/webapp/assets/_app/immutable/chunks/C73ZVvpW.js +++ /dev/null @@ -1 +0,0 @@ -import{O as K,M as te,Y as F,K as M,Z as ae,L as re,g as $,q as oe,_ as ie,a0 as se,a1 as J,a2 as G,T as L,a3 as le,a4 as ce,P as q,R as fe,Q as ue,a5 as V,m as de,a6 as B,a7 as Q,a8 as ve,a9 as D,aa as X,U as he,ab as R,ac as Se,ad as P,ae as Z,af as me,ag as _e,ah as we,ai as Ee,aj as pe,ak as z,H as be,al as ge,I as Ie}from"./CRKWEg6v.js";function Te(c,o){return o}function Ne(c,o,n){for(var t=c.items,u=[],S=o.length,s=0;s0&&u.length===0&&n!==null;if(d){var N=n.parentNode;we(N),N.append(n),t.clear(),T(c,o[0].prev,o[S-1].next)}Ee(u,()=>{for(var m=0;m{var _=n();return ve(_)?_:_==null?[]:Q(_)}),r,v;function f(){ke(v,r,d,E,s,u,o,t,n),S!==null&&(r.length===0?i?X(i):i=q(()=>S(s)):i!==null&&he(i,()=>{i=null}))}te(()=>{v??=pe,r=$(x);var _=r.length;if(g&&_===0)return;g=_===0;let p=!1;if(M){var k=ie(s)===se;k!==(_===0)&&(s=J(),F(s),G(!1),p=!0)}if(M){for(var C=null,b,e=0;e<_;e++){if(L.nodeType===le&&L.data===ce){s=L,p=!0,G(!1);break}var a=r[e],l=t(a,e);b=Y(L,d,C,null,a,l,e,u,o,n),d.items.set(l,b),C=b}_>0&&F(J())}if(M)_===0&&S&&(i=q(()=>S(s)));else if(fe()){var w=new Set,O=ue;for(e=0;e<_;e+=1){a=r[e],l=t(a,e);var h=d.items.get(l)??E.get(l);h?(o&(R|D))!==0&&j(h,a,e,o):(b=Y(null,d,null,null,a,l,e,u,o,n,!0),E.set(l,b)),w.add(l)}for(const[I,W]of d.items)w.has(I)||O.skipped_effects.add(W.e);O.add_callback(f)}else f();p&&G(!0),$(x)}),M&&(s=L)}function ke(c,o,n,t,u,S,s,d,N){var m=(s&ge)!==0,i=(s&(R|D))!==0,g=o.length,E=n.items,x=n.first,r=x,v,f=null,_,p=[],k=[],C,b,e,a;if(m)for(a=0;a0){var ee=(s&z)!==0&&g===0?u:null;if(m){for(a=0;a{if(_!==void 0)for(e of _)e.a?.apply()}),c.first=n.first&&n.first.e,c.last=f&&f.e;for(var ne of t.values())Z(ne.e);t.clear()}function j(c,o,n,t){(t&R)!==0&&V(c.v,o),(t&D)!==0?V(c.i,n):c.i=n}function Y(c,o,n,t,u,S,s,d,N,m,i){var g=(N&R)!==0,E=(N&Se)===0,x=g?E?de(u,!1,!1):B(u):u,r=(N&D)===0?s:B(s),v={i:r,v:x,k:S,a:null,e:null,prev:n,next:t};try{if(c===null){var f=document.createDocumentFragment();f.append(c=K())}return v.e=q(()=>d(c,x,r,m),M),v.e.prev=n&&n.e,v.e.next=t&&t.e,n===null?i||(o.first=v):(n.next=v,n.e.next=v.e),t!==null&&(t.prev=v,t.e.prev=v.e),v}finally{}}function U(c,o,n){for(var t=c.next?c.next.e.nodes_start:n,u=o?o.e.nodes_start:n,S=c.e.nodes_start;S!==null&&S!==t;){var s=me(S);u.before(S),S=s}}function T(c,o,n){o===null?c.first=n:(o.next=n,o.e.next=n&&n.e),n!==null&&(n.prev=o,n.e.prev=o&&o.e)}function Ce(){const{subscribe:c,set:o,update:n}=Ie({connected:!1,connecting:!1,error:null,lastEvent:null});let t=null,u=0,S=50,s=1e3,d=1e3,N=3e4,m=null,i=[],g=!1;const E=new Map;function x(){const e=window.location.protocol==="https:"?"wss:":"ws:",a=window.location.host;return`${e}//${a}/api/v1/ws/events`}function r(){if(!(t&&(t.readyState===WebSocket.CONNECTING||t.readyState===WebSocket.OPEN))){g=!1,n(e=>({...e,connecting:!0,error:null}));try{const e=x();t=new WebSocket(e);const a=setTimeout(()=>{t&&t.readyState===WebSocket.CONNECTING&&t.close()},1e4);t.onopen=()=>{clearTimeout(a),u=0,d=s,n(l=>({...l,connected:!0,connecting:!1,error:null})),i.length>0&&p(i)},t.onmessage=l=>{try{const w=JSON.parse(l.data);n(h=>({...h,lastEvent:w})),(E.get(w["entity-type"])||[]).forEach(h=>{try{h(w)}catch(I){console.error("[WebSocket] Error in event callback:",I)}})}catch(w){console.error("[WebSocket] Error parsing message:",w)}},t.onclose=l=>{clearTimeout(a);const w=l.code===1e3&&g,O=l.code!==1e3?`Connection closed: ${l.reason||"Unknown reason"}`:null;n(h=>({...h,connected:!1,connecting:!1,error:O})),w||_()},t.onerror=l=>{clearTimeout(a),n(w=>({...w,connected:!1,connecting:!1,error:"WebSocket connection error"})),g||_()}}catch(e){n(a=>({...a,connected:!1,connecting:!1,error:e instanceof Error?e.message:"Failed to connect"}))}}}function v(){}function f(){}function _(){if(g)return;m&&clearTimeout(m),u++,u>S&&(u=1,d=s);const e=Math.min(d,N);m=window.setTimeout(()=>{if(!g){r();const a=Math.random()*1e3;d=Math.min(d*1.5+a,N)}},e)}function p(e){if(t&&t.readyState===WebSocket.OPEN){const a={"send-everything":!1,filters:e};t.send(JSON.stringify(a)),i=[...e]}}function k(){g=!0,m&&(clearTimeout(m),m=null),t&&(t.close(1e3,"Manual disconnect"),t=null),E.clear(),i=[],n(e=>({...e,connected:!1,connecting:!1,error:null,lastEvent:null}))}function C(){navigator.onLine&&!g&&setTimeout(()=>{(!t||t.readyState===WebSocket.CLOSED||t.readyState===WebSocket.CLOSING)&&(u=0,d=s,r())},2e3)}typeof window<"u"&&(window.addEventListener("online",C),window.addEventListener("offline",()=>{n(e=>({...e,error:"Network offline"}))}),setInterval(()=>{g||(!t||t.readyState===WebSocket.CLOSED||t.readyState===WebSocket.CLOSING)&&r()},1e4));function b(e,a,l){E.has(e)||E.set(e,[]),E.get(e).push(l);const w=i.findIndex(h=>h["entity-type"]===e),O={"entity-type":e,operations:a};if(w>=0){const h=i[w].operations;O.operations=Array.from(new Set([...h,...a])),i[w]=O}else i.push(O);return t&&t.readyState===WebSocket.OPEN&&p(i),(!t||t.readyState===WebSocket.CLOSED||t.readyState===WebSocket.CLOSING)&&r(),()=>{const h=E.get(e);if(h){const I=h.indexOf(l);if(I>-1&&h.splice(I,1),h.length===0){E.delete(e);const W=i.findIndex(A=>A["entity-type"]===e);W>-1&&(i.splice(W,1),t&&t.readyState===WebSocket.OPEN&&p(i))}}}}return typeof window<"u"&&r(),{subscribe:c,connect:r,disconnect:k,subscribeToEntity:b}}const We=Ce();export{xe as e,Te as i,We as w}; diff --git a/webapp/assets/_app/immutable/chunks/0HF0aP0D.js b/webapp/assets/_app/immutable/chunks/C7KJ549w.js similarity index 60% rename from webapp/assets/_app/immutable/chunks/0HF0aP0D.js rename to webapp/assets/_app/immutable/chunks/C7KJ549w.js index 78b0d974..09ab2c03 100644 --- a/webapp/assets/_app/immutable/chunks/0HF0aP0D.js +++ b/webapp/assets/_app/immutable/chunks/C7KJ549w.js @@ -1 +1 @@ -import"./DsnmJJEf.js";import{i as ae}from"./DT0EGONV.js";import{p as se,E as re,l as M,n as ie,s as r,g as t,m as k,a as le,f as p,j as v,k as $,r as f,c as l,d as oe,B as T,b as E,z as V,D as q,t as F,v as N,u as ne}from"./CRKWEg6v.js";import{p as R,i as m}from"./e1m7WRO5.js";import{g as u,B as G}from"./-esynYXT.js";import{t as y}from"./D6DjlyIQ.js";import{e as de}from"./BZiHL9L3.js";var ce=p('
Checking...
'),ve=p('
'),fe=p('
Webhook installed
',1),ue=p('
No webhook installed
'),he=p('

Webhook Status

');function _e(H,g){se(g,!1);const x=k();let h=R(g,"entityType",8),s=R(g,"entityId",8),j=R(g,"entityName",8),i=k(null),o=k(!1),b=k(!0);const A=re();async function _(){if(s())try{r(b,!0),h()==="repository"?r(i,await u.getRepositoryWebhookInfo(s())):r(i,await u.getOrganizationWebhookInfo(s()))}catch(e){e&&typeof e=="object"&&"response"in e&&e.response?.status===404?r(i,null):(console.warn("Failed to check webhook status:",e),r(i,null))}finally{r(b,!1)}}async function J(){if(s())try{r(o,!0),h()==="repository"?await u.installRepositoryWebhook(s()):await u.installOrganizationWebhook(s()),y.success("Webhook Installed",`Webhook for ${h()} ${j()} has been installed successfully.`),await _(),A("webhookStatusChanged",{installed:!0})}catch(e){y.error("Webhook Installation Failed",e instanceof Error?e.message:"Failed to install webhook.")}finally{r(o,!1)}}async function K(){if(s())try{r(o,!0),h()==="repository"?await u.uninstallRepositoryWebhook(s()):await u.uninstallOrganizationWebhook(s()),y.success("Webhook Uninstalled",`Webhook for ${h()} ${j()} has been uninstalled successfully.`),await _(),A("webhookStatusChanged",{installed:!1})}catch(e){y.error("Webhook Uninstall Failed",de(e))}finally{r(o,!1)}}M(()=>ie(s()),()=>{s()&&_()}),M(()=>t(i),()=>{r(x,t(i)&&t(i).active)}),le(),ae();var w=he(),O=v(w),P=v(O),W=v(P),D=$(v(W),2),Q=v(D);{var X=e=>{var d=ce();l(e,d)},Y=e=>{var d=T(),z=E(d);{var I=a=>{var n=fe(),B=$(E(n),2);{var c=C=>{var U=ve(),te=v(U);f(U),F(()=>N(te,`URL: ${t(i),ne(()=>t(i).url||"N/A")??""}`)),l(C,U)};m(B,C=>{t(i)&&C(c)})}l(a,n)},S=a=>{var n=ue();l(a,n)};m(z,a=>{t(x)?a(I):a(S,!1)},!0)}l(e,d)};m(Q,e=>{t(b)?e(X):e(Y,!1)})}f(D),f(W);var L=$(W,2),Z=v(L);{var ee=e=>{var d=T(),z=E(d);{var I=a=>{G(a,{variant:"danger",size:"sm",get disabled(){return t(o)},$$events:{click:K},children:(n,B)=>{V();var c=q();F(()=>N(c,t(o)?"Uninstalling...":"Uninstall")),l(n,c)},$$slots:{default:!0}})},S=a=>{G(a,{variant:"primary",size:"sm",get disabled(){return t(o)},$$events:{click:J},children:(n,B)=>{V();var c=q();F(()=>N(c,t(o)?"Installing...":"Install Webhook")),l(n,c)},$$slots:{default:!0}})};m(z,a=>{t(x)?a(I):a(S,!1)})}l(e,d)};m(Z,e=>{t(b)||e(ee)})}f(L),f(P),f(O),f(w),l(H,w),oe()}export{_e as W}; +import"./DsnmJJEf.js";import{i as ae}from"./C7KraPli.js";import{p as se,E as re,l as M,q as ie,k as r,g as t,m as k,h as le,f as p,d as v,s as $,r as f,b as l,c as oe,B as T,a as E,z as q,D as V,t as F,e as N,u as ne}from"./cPTQ2Ibn.js";import{p as R,i as m}from"./DqFqoVWr.js";import{g as h,B as G}from"./DqbUkQgD.js";import{t as y}from"./Bgbd8SZ5.js";import{e as de}from"./BZiHL9L3.js";var ce=p('
Checking...
'),ve=p('
'),fe=p('
Webhook installed
',1),he=p('
No webhook installed
'),ue=p('

Webhook Status

');function _e(H,g){se(g,!1);const x=k();let u=R(g,"entityType",8),s=R(g,"entityId",8),A=R(g,"entityName",8),i=k(null),o=k(!1),b=k(!0);const O=re();async function _(){if(s())try{r(b,!0),u()==="repository"?r(i,await h.getRepositoryWebhookInfo(s())):r(i,await h.getOrganizationWebhookInfo(s()))}catch(e){e&&typeof e=="object"&&"response"in e&&e.response?.status===404?r(i,null):(console.warn("Failed to check webhook status:",e),r(i,null))}finally{r(b,!1)}}async function J(){if(s())try{r(o,!0),u()==="repository"?await h.installRepositoryWebhook(s()):await h.installOrganizationWebhook(s()),y.success("Webhook Installed",`Webhook for ${u()} ${A()} has been installed successfully.`),await _(),O("webhookStatusChanged",{installed:!0})}catch(e){y.error("Webhook Installation Failed",e instanceof Error?e.message:"Failed to install webhook.")}finally{r(o,!1)}}async function K(){if(s())try{r(o,!0),u()==="repository"?await h.uninstallRepositoryWebhook(s()):await h.uninstallOrganizationWebhook(s()),y.success("Webhook Uninstalled",`Webhook for ${u()} ${A()} has been uninstalled successfully.`),await _(),O("webhookStatusChanged",{installed:!1})}catch(e){y.error("Webhook Uninstall Failed",de(e))}finally{r(o,!1)}}M(()=>ie(s()),()=>{s()&&_()}),M(()=>t(i),()=>{r(x,t(i)&&t(i).active)}),le(),ae();var w=ue(),P=v(w),j=v(P),W=v(j),D=$(v(W),2),Q=v(D);{var X=e=>{var d=ce();l(e,d)},Y=e=>{var d=T(),z=E(d);{var I=a=>{var n=fe(),B=$(E(n),2);{var c=C=>{var U=ve(),te=v(U);f(U),F(()=>N(te,`URL: ${t(i),ne(()=>t(i).url||"N/A")??""}`)),l(C,U)};m(B,C=>{t(i)&&C(c)})}l(a,n)},S=a=>{var n=he();l(a,n)};m(z,a=>{t(x)?a(I):a(S,!1)},!0)}l(e,d)};m(Q,e=>{t(b)?e(X):e(Y,!1)})}f(D),f(W);var L=$(W,2),Z=v(L);{var ee=e=>{var d=T(),z=E(d);{var I=a=>{G(a,{variant:"danger",size:"sm",get disabled(){return t(o)},$$events:{click:K},children:(n,B)=>{q();var c=V();F(()=>N(c,t(o)?"Uninstalling...":"Uninstall")),l(n,c)},$$slots:{default:!0}})},S=a=>{G(a,{variant:"primary",size:"sm",get disabled(){return t(o)},$$events:{click:J},children:(n,B)=>{q();var c=V();F(()=>N(c,t(o)?"Installing...":"Install Webhook")),l(n,c)},$$slots:{default:!0}})};m(z,a=>{t(x)?a(I):a(S,!1)})}l(e,d)};m(Z,e=>{t(b)||e(ee)})}f(L),f(j),f(P),f(w),l(H,w),oe()}export{_e as W}; diff --git a/webapp/assets/_app/immutable/chunks/DT0EGONV.js b/webapp/assets/_app/immutable/chunks/C7KraPli.js similarity index 71% rename from webapp/assets/_app/immutable/chunks/DT0EGONV.js rename to webapp/assets/_app/immutable/chunks/C7KraPli.js index 589077ea..efd8f0eb 100644 --- a/webapp/assets/_app/immutable/chunks/DT0EGONV.js +++ b/webapp/assets/_app/immutable/chunks/C7KraPli.js @@ -1 +1 @@ -import{am as g,an as d,ao as c,u as m,ap as b,aq as i,g as p,n as v,ar as h,as as k}from"./CRKWEg6v.js";function x(n=!1){const s=g,e=s.l.u;if(!e)return;let f=()=>v(s.s);if(n){let t=0,a={};const _=h(()=>{let l=!1;const r=s.s;for(const o in r)r[o]!==a[o]&&(a[o]=r[o],l=!0);return l&&t++,t});f=()=>p(_)}e.b.length&&d(()=>{u(s,f),i(e.b)}),c(()=>{const t=m(()=>e.m.map(b));return()=>{for(const a of t)typeof a=="function"&&a()}}),e.a.length&&c(()=>{u(s,f),i(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}k();export{x as i}; +import{am as g,an as d,ao as c,u as m,ap as b,aq as i,g as p,q as v,ar as h,as as k}from"./cPTQ2Ibn.js";function q(n=!1){const s=g,e=s.l.u;if(!e)return;let f=()=>v(s.s);if(n){let t=0,a={};const _=h(()=>{let l=!1;const r=s.s;for(const o in r)r[o]!==a[o]&&(a[o]=r[o],l=!0);return l&&t++,t});f=()=>p(_)}e.b.length&&d(()=>{u(s,f),i(e.b)}),c(()=>{const t=m(()=>e.m.map(b));return()=>{for(const a of t)typeof a=="function"&&a()}}),e.a.length&&c(()=>{u(s,f),i(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}k();export{q as i}; diff --git a/webapp/assets/_app/immutable/chunks/C98nByjP.js b/webapp/assets/_app/immutable/chunks/C98nByjP.js new file mode 100644 index 00000000..029e7770 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/C98nByjP.js @@ -0,0 +1 @@ +function c(s){try{const t=s.split(".");if(t.length!==3)return console.error("Invalid JWT token format"),null;const n=t[1],r=n+"=".repeat((4-n.length%4)%4),o=atob(r);return JSON.parse(o)}catch(t){return console.error("Failed to decode JWT token:",t),null}}function i(){const t=(n=>{const r=n+"=",o=document.cookie.split(";");for(let l=0;l{const t=localStorage.getItem("theme");let e=!1;t==="dark"?e=!0:t==="light"?e=!1:e=window.matchMedia("(prefers-color-scheme: dark)").matches,s(e),o(e)},toggle:()=>r(t=>{const e=!t;return localStorage.setItem("theme",e?"dark":"light"),o(e),e}),set:t=>{localStorage.setItem("theme",t?"dark":"light"),o(t),s(t)}}}function o(a){a?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}const d=c();export{d as t}; diff --git a/webapp/assets/_app/immutable/chunks/CPFytHjx.js b/webapp/assets/_app/immutable/chunks/CPFytHjx.js new file mode 100644 index 00000000..a942bcc9 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/CPFytHjx.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as R}from"./C7KraPli.js";import{p as j,l as w,h as A,f as g,t as k,b as v,c as B,s as D,d as u,k as _,m as y,r as m,q as f,u as h,g as d,e as U}from"./cPTQ2Ibn.js";import{p as o,i as F}from"./DqFqoVWr.js";import{c as b,s as G,d as n}from"./DqbUkQgD.js";var H=g('
'),J=g('');function V(x,a){j(a,!1);const i=y(),p=y();let e=o(a,"item",8),s=o(a,"entityType",8,"repository"),E=o(a,"showOwner",8,!1),I=o(a,"showId",8,!1),z=o(a,"fontMono",8,!1);function C(){if(!e())return"Unknown";switch(s()){case"repository":return E()?`${e().owner||"Unknown"}/${e().name||"Unknown"}`:e().name||"Unknown";case"organization":case"enterprise":return e().name||"Unknown";case"pool":return I()?e().id||"Unknown":e().name||"Unknown";case"scaleset":return e().name||"Unknown";case"instance":return e().name||"Unknown";case"template":return e().name||"Unknown";default:return e().name||e().id||"Unknown"}}function M(){if(!e())return"#";let t;switch(s()){case"instance":t=e().name;break;default:t=e().id||e().name;break}if(!t)return"#";switch(s()){case"repository":return n(`/repositories/${t}`);case"organization":return n(`/organizations/${t}`);case"enterprise":return n(`/enterprises/${t}`);case"pool":return n(`/pools/${t}`);case"scaleset":return n(`/scalesets/${t}`);case"instance":return n(`/instances/${encodeURIComponent(t)}`);case"template":return n(`/templates/${t}`);default:return"#"}}w(()=>{},()=>{_(i,C())}),w(()=>{},()=>{_(p,M())}),A(),R();var c=J(),r=u(c),N=u(r,!0);m(r);var O=D(r);{var T=t=>{var l=H(),q=u(l,!0);m(l),k(()=>U(q,(f(e()),h(()=>e().provider_id)))),v(t,l)};F(O,t=>{f(s()),f(e()),h(()=>s()==="instance"&&e()?.provider_id)&&t(T)})}m(c),k(()=>{b(r,"href",d(p)),G(r,1,`block w-full truncate text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300 ${z()?"font-mono":""}`),b(r,"title",d(i)),U(N,d(i))}),v(x,c),B()}export{V as E}; diff --git a/webapp/assets/_app/immutable/chunks/CRKWEg6v.js b/webapp/assets/_app/immutable/chunks/CRKWEg6v.js deleted file mode 100644 index c3c8352a..00000000 --- a/webapp/assets/_app/immutable/chunks/CRKWEg6v.js +++ /dev/null @@ -1,2 +0,0 @@ -var Je=Array.isArray,wn=Array.prototype.indexOf,yn=Array.from,$e=Object.defineProperty,be=Object.getOwnPropertyDescriptor,gn=Object.getOwnPropertyDescriptors,bn=Object.prototype,mn=Array.prototype,At=Object.getPrototypeOf,dt=Object.isExtensible;function Mr(e){return typeof e=="function"}const Ne=()=>{};function Lr(e){return e()}function St(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}const k=2,Qe=4,qe=8,Ae=16,Y=32,ae=64,kt=128,O=256,De=512,m=1024,P=2048,H=4096,W=8192,de=16384,et=32768,Ct=65536,ht=1<<17,Rt=1<<18,tt=1<<19,nt=1<<20,Be=1<<21,rt=1<<22,X=1<<23,Z=Symbol("$state"),Fr=Symbol("legacy props"),qr=Symbol(""),at=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},st=3,me=8;function Tn(){throw new Error("https://svelte.dev/e/await_outside_boundary")}function he(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function xn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function An(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Sn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function kn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Cn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Rn(){throw new Error("https://svelte.dev/e/get_abort_signal_outside_reaction")}function On(){throw new Error("https://svelte.dev/e/hydration_failed")}function Ot(e){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")}function Vr(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Nn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Pn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Dn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}const Yr=1,Hr=2,Ur=4,$r=8,Br=16,Wr=1,zr=2,Gr=4,Kr=8,Xr=16,Nt=1,In=2,it="[",Mn="[!",Pt="]",oe={},E=Symbol(),Zr="http://www.w3.org/1999/xhtml",Jr="@attach";function je(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function Qr(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}let g=!1;function fe(e){g=e}let w;function I(e){if(e===null)throw je(),oe;return w=e}function ut(){return I(M(w))}function ea(e){if(g){if(M(w)!==null)throw je(),oe;w=e}}function ta(e=1){if(g){for(var t=e,n=w;t--;)n=M(n);w=n}}function na(){for(var e=0,t=w;;){if(t.nodeType===me){var n=t.data;if(n===Pt){if(e===0)return t;e-=1}else(n===it||n===Mn)&&(e+=1)}var r=M(t);t.remove(),t=r}}function ra(e){if(!e||e.nodeType!==me)throw je(),oe;return e.data}function Dt(e){return e===this.v}function It(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function aa(e,t){return e!==t}function Mt(e){return!It(e,this.v)}let Se=!1;function sa(){Se=!0}let p=null;function Ie(e){p=e}function Ln(e){return Ve().get(e)}function Fn(e,t){return Ve().set(e,t),t}function qn(e){return Ve().has(e)}function jn(){return Ve()}function Vn(e,t=!1,n){p={p,c:null,e:null,s:e,x:null,l:Se&&!t?{s:null,u:null,$:[]}:null}}function Yn(e){var t=p,n=t.e;if(n!==null){t.e=null;for(var r of n)Jt(r)}return p=t.p,{}}function ke(){return!Se||p!==null&&p.l===null}function Ve(e){return p===null&&he(),p.c??=new Map(Hn(p)||void 0)}function Hn(e){let t=e.p;for(;t!==null;){const n=t.c;if(n!==null)return n;t=t.p}return null}const Un=new WeakMap;function $n(e){var t=h;if(t===null)return d.f|=X,e;if((t.f&et)===0){if((t.f&kt)===0)throw!t.parent&&e instanceof Error&&Lt(e),e;t.b.error(e)}else lt(e,t)}function lt(e,t){for(;t!==null;){if((t.f&kt)!==0)try{t.b.error(e);return}catch(n){e=n}t=t.parent}throw e instanceof Error&&Lt(e),e}function Lt(e){const t=Un.get(e);t&&($e(e,"message",{value:t.message}),$e(e,"stack",{value:t.stack}))}const Bn=typeof requestIdleCallback>"u"?e=>setTimeout(e,1):requestIdleCallback;let Ee=[],Te=[];function Ft(){var e=Ee;Ee=[],St(e)}function qt(){var e=Te;Te=[],St(e)}function jt(e){Ee.length===0&&queueMicrotask(Ft),Ee.push(e)}function ia(e){Te.length===0&&Bn(qt),Te.push(e)}function Wn(){Ee.length>0&&Ft(),Te.length>0&&qt()}function zn(){for(var e=h.b;e!==null&&!e.has_pending_snippet();)e=e.parent;return e===null&&Tn(),e}function ft(e){var t=k|P,n=d!==null&&(d.f&k)!==0?d:null;return h===null||n!==null&&(n.f&O)!==0?t|=O:h.f|=tt,{ctx:p,deps:null,effects:null,equals:Dt,f:t,fn:e,reactions:null,rv:0,v:E,wv:0,parent:n??h,ac:null}}function Gn(e,t){let n=h;n===null&&xn();var r=n.b,s=void 0,a=ct(E),i=null,f=!d;return ar(()=>{try{var u=e()}catch(_){u=Promise.reject(_)}var l=()=>u;s=i?.then(l,l)??Promise.resolve(u),i=s;var o=y,v=r.pending;f&&(r.update_pending_count(1),v||o.increment());const c=(_,b=void 0)=>{i=null,v||o.activate(),b?b!==at&&(a.f|=X,Le(a,b)):((a.f&X)!==0&&(a.f^=X),Le(a,_)),f&&(r.update_pending_count(-1),v||o.decrement()),Ht()};if(s.then(c,_=>c(null,_||"unknown")),o)return()=>{queueMicrotask(()=>o.neuter())}}),new Promise(u=>{function l(o){function v(){o===s?u(a):l(s)}o.then(v,v)}l(s)})}function ua(e){const t=ft(e);return sn(t),t}function Kn(e){const t=ft(e);return t.equals=Mt,t}function Vt(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;nGn(u))).then(u=>{s?.activate(),i();try{n([...e.map(r),...u])}catch(l){(a.f&de)===0&<(l,a)}s?.deactivate(),Ht()}).catch(u=>{f.error(u)})}function Jn(){var e=h,t=d,n=p;return function(){G(e),L(t),Ie(n)}}function Ht(){G(null),L(null),Ie(null)}const we=new Set;let y=null,He=null,ve=null,pt=new Set,Me=[];function Ut(){const e=Me.shift();Me.length>0&&queueMicrotask(Ut),e()}let ee=[],Ye=null,We=!1,Pe=!1;class te{current=new Map;#a=new Map;#s=new Set;#e=0;#f=null;#o=!1;#n=[];#i=[];#r=[];#t=[];#u=[];#c=[];#_=[];skipped_effects=new Set;process(t){ee=[],He=null;var n=null;if(we.size>1){n=new Map,ve=new Map;for(const[a,i]of this.current)n.set(a,{v:a.v,wv:a.wv}),a.v=i;for(const a of we)if(a!==this)for(const[i,f]of a.#a)n.has(i)||(n.set(i,{v:i.v,wv:i.wv}),i.v=f)}for(const a of t)this.#d(a);if(this.#n.length===0&&this.#e===0){this.#v();var r=this.#r,s=this.#t;this.#r=[],this.#t=[],this.#u=[],He=y,y=null,wt(r),wt(s),y===null?y=this:we.delete(this),this.#f?.resolve()}else this.#l(this.#r),this.#l(this.#t),this.#l(this.#u);if(n){for(const[a,{v:i,wv:f}]of n)a.wv<=f&&(a.v=i);ve=null}for(const a of this.#n)_e(a);for(const a of this.#i)_e(a);this.#n=[],this.#i=[]}#d(t){t.f^=m;for(var n=t.first;n!==null;){var r=n.f,s=(r&(Y|ae))!==0,a=s&&(r&m)!==0,i=a||(r&W)!==0||this.skipped_effects.has(n);if(!i&&n.fn!==null){if(s)n.f^=m;else if((r&m)===0)if((r&Qe)!==0)this.#t.push(n);else if((r&rt)!==0){var f=n.b?.pending?this.#i:this.#n;f.push(n)}else Ce(n)&&((n.f&Ae)!==0&&this.#u.push(n),_e(n));var u=n.first;if(u!==null){n=u;continue}}var l=n.parent;for(n=n.next;n===null&&l!==null;)n=l.next,l=l.parent}}#l(t){for(const n of t)((n.f&P)!==0?this.#c:this.#_).push(n),x(n,m);t.length=0}capture(t,n){this.#a.has(t)||this.#a.set(t,n),this.current.set(t,t.v)}activate(){y=this}deactivate(){y=null,He=null;for(const t of pt)if(pt.delete(t),t(),y!==null)break}neuter(){this.#o=!0}flush(){ee.length>0?ze():this.#v(),y===this&&(this.#e===0&&we.delete(this),this.deactivate())}#v(){if(!this.#o)for(const t of this.#s)t();this.#s.clear()}increment(){this.#e+=1}decrement(){if(this.#e-=1,this.#e===0){for(const t of this.#c)x(t,P),ne(t);for(const t of this.#_)x(t,H),ne(t);this.#r=[],this.#t=[],this.flush()}else this.deactivate()}add_callback(t){this.#s.add(t)}settled(){return(this.#f??=En()).promise}static ensure(){if(y===null){const t=y=new te;we.add(y),Pe||te.enqueue(()=>{y===t&&t.flush()})}return y}static enqueue(t){Me.length===0&&queueMicrotask(Ut),Me.unshift(t)}}function $t(e){var t=Pe;Pe=!0;try{var n;for(e&&(ze(),n=e());;){if(Wn(),ee.length===0&&(y?.flush(),ee.length===0))return Ye=null,n;ze()}}finally{Pe=t}}function ze(){var e=ce;We=!0;try{var t=0;for(bt(!0);ee.length>0;){var n=te.ensure();if(t++>1e3){var r,s;Qn()}n.process(ee),J.clear()}}finally{We=!1,bt(e),Ye=null}}function Qn(){try{Cn()}catch(e){lt(e,Ye)}}function wt(e){var t=e.length;if(t!==0){for(var n=0;ns&&(r.f&nt)!==0)break}}for(;nK(e))),t}function j(e,t,n=!1){d!==null&&(!D||(d.f&ht)!==0)&&ke()&&(d.f&(k|Ae|rt|ht))!==0&&!V?.includes(e)&&Dn();let r=n?ye(t):t;return Le(e,r)}function Le(e,t){if(!e.equals(t)){var n=e.v;pe?J.set(e,t):J.set(e,n),e.v=t;var r=te.ensure();r.capture(e,n),(e.f&k)!==0&&((e.f&P)!==0&&ot(e),x(e,(e.f&O)===0?m:H)),e.wv=ln(),Bt(e,P),ke()&&h!==null&&(h.f&m)!==0&&(h.f&(Y|ae))===0&&(R===null?_r([e]):R.push(e))}return t}function oa(e,t=1){var n=K(e),r=t===1?n++:n--;return j(e,n),r}function Ue(e){j(e,e.v+1)}function Bt(e,t){var n=e.reactions;if(n!==null)for(var r=ke(),s=n.length,a=0;a{if(Q===a)return f();var u=d,l=Q;L(null),Et(a);var o=f();return L(u),Et(l),o};return r&&n.set("length",$(e.length)),new Proxy(e,{defineProperty(f,u,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Nn();var o=n.get(u);return o===void 0?o=i(()=>{var v=$(l.value);return n.set(u,v),v}):j(o,l.value,!0),!0},deleteProperty(f,u){var l=n.get(u);if(l===void 0){if(u in f){const o=i(()=>$(E));n.set(u,o),Ue(s)}}else j(l,E),Ue(s);return!0},get(f,u,l){if(u===Z)return e;var o=n.get(u),v=u in f;if(o===void 0&&(!v||be(f,u)?.writable)&&(o=i(()=>{var _=ye(v?f[u]:E),b=$(_);return b}),n.set(u,o)),o!==void 0){var c=K(o);return c===E?void 0:c}return Reflect.get(f,u,l)},getOwnPropertyDescriptor(f,u){var l=Reflect.getOwnPropertyDescriptor(f,u);if(l&&"value"in l){var o=n.get(u);o&&(l.value=K(o))}else if(l===void 0){var v=n.get(u),c=v?.v;if(v!==void 0&&c!==E)return{enumerable:!0,configurable:!0,value:c,writable:!0}}return l},has(f,u){if(u===Z)return!0;var l=n.get(u),o=l!==void 0&&l.v!==E||Reflect.has(f,u);if(l!==void 0||h!==null&&(!o||be(f,u)?.writable)){l===void 0&&(l=i(()=>{var c=o?ye(f[u]):E,_=$(c);return _}),n.set(u,l));var v=K(l);if(v===E)return!1}return o},set(f,u,l,o){var v=n.get(u),c=u in f;if(r&&u==="length")for(var _=l;_$(E)),n.set(_+"",b))}if(v===void 0)(!c||be(f,u)?.writable)&&(v=i(()=>$(void 0)),j(v,ye(l)),n.set(u,v));else{c=v.v!==E;var q=i(()=>ye(l));j(v,q)}var Re=Reflect.getOwnPropertyDescriptor(f,u);if(Re?.set&&Re.set.call(o,l),!c){if(r&&typeof u=="string"){var Oe=n.get("length"),U=Number(u);Number.isInteger(U)&&U>=Oe.v&&j(Oe,U+1)}Ue(s)}return!0},ownKeys(f){K(s);var u=Reflect.ownKeys(f).filter(v=>{var c=n.get(v);return c===void 0||c.v!==E});for(var[l,o]of n)o.v!==E&&!(l in f)&&u.push(l);return u},setPrototypeOf(){Pn()}})}function yt(e){try{if(e!==null&&typeof e=="object"&&Z in e)return e[Z]}catch{}return e}function ca(e,t){return Object.is(yt(e),yt(t))}var gt,er,Wt,zt,Gt;function Ge(){if(gt===void 0){gt=window,er=document,Wt=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;zt=be(t,"firstChild").get,Gt=be(t,"nextSibling").get,dt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),dt(n)&&(n.__t=void 0)}}function z(e=""){return document.createTextNode(e)}function A(e){return zt.call(e)}function M(e){return Gt.call(e)}function _a(e,t){if(!g)return A(e);var n=A(w);if(n===null)n=w.appendChild(z());else if(t&&n.nodeType!==st){var r=z();return n?.before(r),I(r),r}return I(n),n}function va(e,t){if(!g){var n=A(e);return n instanceof Comment&&n.data===""?M(n):n}return w}function da(e,t=1,n=!1){let r=g?w:e;for(var s;t--;)s=r,r=M(r);if(!g)return r;if(n&&r?.nodeType!==st){var a=z();return r===null?s?.after(a):r.before(a),I(a),a}return I(r),r}function Kt(e){e.textContent=""}function ha(){return!1}function Xt(e){h===null&&d===null&&kn(),d!==null&&(d.f&O)!==0&&h===null&&Sn(),pe&&An()}function tr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function F(e,t,n,r=!0){var s=h;s!==null&&(s.f&W)!==0&&(e|=W);var a={ctx:p,deps:null,nodes_start:null,nodes_end:null,f:e|P,first:null,fn:t,last:null,next:null,parent:s,b:s&&s.b,prev:null,teardown:null,transitions:null,wv:0,ac:null};if(n)try{_e(a),a.f|=et}catch(u){throw re(a),u}else t!==null&&ne(a);var i=n&&a.deps===null&&a.first===null&&a.nodes_start===null&&a.teardown===null&&(a.f&tt)===0;if(!i&&r&&(s!==null&&tr(a,s),d!==null&&(d.f&k)!==0&&(e&ae)===0)){var f=d;(f.effects??=[]).push(a)}return a}function Zt(e){const t=F(qe,null,!1);return x(t,m),t.teardown=e,t}function nr(e){Xt();var t=h.f,n=!d&&(t&Y)!==0&&(t&et)===0;if(n){var r=p;(r.e??=[]).push(e)}else return Jt(e)}function Jt(e){return F(Qe|nt,e,!1)}function pa(e){return Xt(),F(qe|nt,e,!0)}function rr(e){te.ensure();const t=F(ae,e,!0);return(n={})=>new Promise(r=>{n.outro?fr(t,()=>{re(t),r(void 0)}):(re(t),r(void 0))})}function wa(e){return F(Qe,e,!1)}function ya(e,t){var n=p,r={effect:null,ran:!1,deps:e};n.l.$.push(r),r.effect=Qt(()=>{e(),!r.ran&&(r.ran=!0,se(t))})}function ga(){var e=p;Qt(()=>{for(var t of e.l.$){t.deps();var n=t.effect;(n.f&m)!==0&&x(n,H),Ce(n)&&_e(n),t.ran=!1}})}function ar(e){return F(rt|tt,e,!0)}function Qt(e,t=0){return F(qe|t,e,!0)}function ba(e,t=[],n=[]){Zn(t,n,r=>{F(qe,()=>e(...r.map(K)),!0)})}function sr(e,t=0){var n=F(Ae|t,e,!0);return n}function ir(e,t=!0){return F(Y,e,!0,t)}function en(e){var t=e.teardown;if(t!==null){const n=pe,r=d;mt(!0),L(null);try{t.call(null)}finally{mt(n),L(r)}}}function tn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){n.ac?.abort(at);var r=n.next;(n.f&ae)!==0?n.parent=null:re(n,t),n=r}}function ur(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&Y)===0&&re(t),t=n}}function re(e,t=!0){var n=!1;(t||(e.f&Rt)!==0)&&e.nodes_start!==null&&e.nodes_end!==null&&(lr(e.nodes_start,e.nodes_end),n=!0),tn(e,t&&!n),Fe(e,0),x(e,de);var r=e.transitions;if(r!==null)for(const a of r)a.stop();en(e);var s=e.parent;s!==null&&s.first!==null&&nn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes_start=e.nodes_end=e.ac=null}function lr(e,t){for(;e!==null;){var n=e===t?null:M(e);e.remove(),e=n}}function nn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function fr(e,t){var n=[];rn(e,n,!0),or(n,()=>{re(e),t&&t()})}function or(e,t){var n=e.length;if(n>0){var r=()=>--n||t();for(var s of e)s.out(r)}else t()}function rn(e,t,n){if((e.f&W)===0){if(e.f^=W,e.transitions!==null)for(const i of e.transitions)(i.is_global||n)&&t.push(i);for(var r=e.first;r!==null;){var s=r.next,a=(r.f&Ct)!==0||(r.f&Y)!==0;rn(r,t,a?n:!1),r=s}}}function ma(e){an(e,!0)}function an(e,t){if((e.f&W)!==0){e.f^=W,(e.f&m)===0&&(x(e,P),ne(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&Ct)!==0||(n.f&Y)!==0;an(n,s?t:!1),n=r}if(e.transitions!==null)for(const a of e.transitions)(a.is_global||t)&&a.in()}}let le=null;function cr(e){var t=le;try{if(le=new Set,se(e),t!==null)for(var n of le)t.add(n);return le}finally{le=t}}function Ea(e){for(var t of cr(e))Le(t,t.v)}let ce=!1;function bt(e){ce=e}let pe=!1;function mt(e){pe=e}let d=null,D=!1;function L(e){d=e}let h=null;function G(e){h=e}let V=null;function sn(e){d!==null&&(V===null?V=[e]:V.push(e))}let T=null,S=0,R=null;function _r(e){R=e}let un=1,xe=0,Q=xe;function Et(e){Q=e}let B=!1;function ln(){return++un}function Ce(e){var t=e.f;if((t&P)!==0)return!0;if((t&H)!==0){var n=e.deps,r=(t&O)!==0;if(n!==null){var s,a,i=(t&De)!==0,f=r&&h!==null&&!B,u=n.length;if((i||f)&&(h===null||(h.f&de)===0)){var l=e,o=l.parent;for(s=0;se.wv)return!0}(!r||h!==null&&!B)&&x(e,m)}return!1}function fn(e,t,n=!0){var r=e.reactions;if(r!==null&&!V?.includes(e))for(var s=0;s0)for(c.length=S+T.length,_=0;_{document.activeElement===n&&e.focus()})}}function Ca(e){g&&A(e)!==null&&Kt(e)}let Tt=!1;function mr(){Tt||(Tt=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function _n(e){var t=d,n=h;L(null),G(null);try{return e()}finally{L(t),G(n)}}function Ra(e,t,n,r=n){e.addEventListener(t,()=>_n(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),mr()}const vn=new Set,Xe=new Set;function Er(e,t,n,r={}){function s(a){if(r.capture||ge.call(t,a),!a.cancelBubble)return _n(()=>n?.call(this,a))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?jt(()=>{t.addEventListener(e,s,r)}):t.addEventListener(e,s,r),s}function Oa(e,t,n,r,s){var a={capture:r,passive:s},i=Er(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&Zt(()=>{t.removeEventListener(e,i,a)})}function Na(e){for(var t=0;t{throw U});throw c}}finally{e.__root=t,delete e.currentTarget,L(o),G(v)}}}let C;function Tr(){C=void 0}function Pa(e){let t=null,n=g;var r;if(g){for(t=w,C===void 0&&(C=A(document.head));C!==null&&(C.nodeType!==me||C.data!==it);)C=M(C);C===null?fe(!1):C=I(M(C))}g||(r=document.head.appendChild(z()));try{sr(()=>e(r),Rt)}finally{n&&(fe(!0),C=w,I(t))}}function _t(e){var t=document.createElement("template");return t.innerHTML=e.replaceAll("",""),t.content}function N(e,t){var n=h;n.nodes_start===null&&(n.nodes_start=e,n.nodes_end=t)}function Da(e,t){var n=(t&Nt)!==0,r=(t&In)!==0,s,a=!e.startsWith("");return()=>{if(g)return N(w,null),w;s===void 0&&(s=_t(a?e:""+e),n||(s=A(s)));var i=r||Wt?document.importNode(s,!0):s.cloneNode(!0);if(n){var f=A(i),u=i.lastChild;N(f,u)}else N(i,i);return i}}function xr(e,t,n="svg"){var r=!e.startsWith(""),s=(t&Nt)!==0,a=`<${n}>${r?e:""+e}`,i;return()=>{if(g)return N(w,null),w;if(!i){var f=_t(a),u=A(f);if(s)for(i=document.createDocumentFragment();A(u);)i.appendChild(A(u));else i=A(u)}var l=i.cloneNode(!0);if(s){var o=A(l),v=l.lastChild;N(o,v)}else N(l,l);return l}}function Ia(e,t){return xr(e,t,"svg")}function Ma(e=""){if(!g){var t=z(e+"");return N(t,t),t}var n=w;return n.nodeType!==st&&(n.before(n=z()),I(n)),N(n,n),n}function La(){if(g)return N(w,null),w;var e=document.createDocumentFragment(),t=document.createComment(""),n=z();return e.append(t,n),N(t,n),e}function Fa(e,t){if(g){h.nodes_end=w,ut();return}e!==null&&e.before(t)}function qa(e,t){var n=t==null?"":typeof t=="object"?t+"":t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=n+"")}function dn(e,t){return hn(e,t)}function Ar(e,t){Ge(),t.intro=t.intro??!1;const n=t.target,r=g,s=w;try{for(var a=A(n);a&&(a.nodeType!==me||a.data!==it);)a=M(a);if(!a)throw oe;fe(!0),I(a),ut();const i=hn(e,{...t,anchor:a});if(w===null||w.nodeType!==me||w.data!==Pt)throw je(),oe;return fe(!1),i}catch(i){if(i instanceof Error&&i.message.split(` -`).some(f=>f.startsWith("https://svelte.dev/e/")))throw i;return i!==oe&&console.warn("Failed to hydrate: ",i),t.recover===!1&&On(),Ge(),Kt(n),fe(!1),dn(e,t)}finally{fe(r),I(s),Tr()}}const ie=new Map;function hn(e,{target:t,anchor:n,props:r={},events:s,context:a,intro:i=!0}){Ge();var f=new Set,u=v=>{for(var c=0;c{var v=n??t.appendChild(z());return ir(()=>{if(a){Vn({});var c=p;c.c=a}s&&(r.$$events=s),g&&N(v,null),l=e(v,r)||{},g&&(h.nodes_end=w),a&&Yn()}),()=>{for(var c of f){t.removeEventListener(c,ge);var _=ie.get(c);--_===0?(document.removeEventListener(c,ge),ie.delete(c)):ie.set(c,_)}Xe.delete(u),v!==n&&v.parentNode?.removeChild(v)}});return Ze.set(l,o),l}let Ze=new WeakMap;function Sr(e,t){const n=Ze.get(e);return n?(Ze.delete(e),n(t)):Promise.resolve()}function kr(e){return(t,...n)=>{var r=e(...n),s;if(g)s=w,ut();else{var a=r.render().trim(),i=_t(a);s=A(i),t.before(s)}const f=r.setup?.(s);N(s,s),typeof f=="function"&&Zt(f)}}function Cr(e,t,n){if(e==null)return t(void 0),Ne;const r=se(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const ue=[];function ja(e,t=Ne){let n=null;const r=new Set;function s(f){if(It(e,f)&&(e=f,n)){const u=!ue.length;for(const l of r)l[1](),ue.push(l,e);if(u){for(let l=0;l{r.delete(l),r.size===0&&n&&(n(),n=null)}}return{set:s,update:a,subscribe:i}}function Va(e){let t;return Cr(e,n=>t=n)(),t}function Rr(){return d===null&&Rn(),(d.ac??=new AbortController).signal}function pn(e){p===null&&he(),Se&&p.l!==null?vt(p).m.push(e):nr(()=>{const t=se(e);if(typeof t=="function")return t})}function Or(e){p===null&&he(),pn(()=>()=>se(e))}function Nr(e,t,{bubbles:n=!1,cancelable:r=!1}={}){return new CustomEvent(e,{detail:t,bubbles:n,cancelable:r})}function Pr(){const e=p;return e===null&&he(),(t,n,r)=>{const s=e.s.$$events?.[t];if(s){const a=Je(s)?s.slice():[s],i=Nr(t,n,r);for(const f of a)f.call(e.x,i);return!i.defaultPrevented}return!0}}function Dr(e){p===null&&he(),p.l===null&&Ot(),vt(p).b.push(e)}function Ir(e){p===null&&he(),p.l===null&&Ot(),vt(p).a.push(e)}function vt(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const Ya=Object.freeze(Object.defineProperty({__proto__:null,afterUpdate:Ir,beforeUpdate:Dr,createEventDispatcher:Pr,createRawSnippet:kr,flushSync:$t,getAbortSignal:Rr,getAllContexts:jn,getContext:Ln,hasContext:qn,hydrate:Ar,mount:dn,onDestroy:Or,onMount:pn,setContext:Fn,settled:hr,tick:dr,unmount:Sr,untrack:se},Symbol.toStringTag,{value:"Module"}));export{er as $,Or as A,La as B,Ia as C,Ma as D,Pr as E,wa as F,Qt as G,jt as H,ja as I,Va as J,g as K,ut as L,sr as M,Ct as N,z as O,ir as P,y as Q,ha as R,Z as S,w as T,fr as U,ke as V,Ra as W,He as X,I as Y,A as Z,ra as _,ga as a,Qr as a$,Mn as a0,na as a1,fe as a2,me as a3,Pt as a4,Le as a5,ct as a6,yn as a7,Je as a8,Hr as a9,Gr as aA,ye as aB,de as aC,Kr as aD,Se as aE,zr as aF,Wr as aG,oa as aH,G as aI,Xr as aJ,pe as aK,Fr as aL,Mr as aM,Ar as aN,dn as aO,$t as aP,Sr as aQ,$ as aR,dr as aS,ua as aT,aa as aU,It as aV,lr as aW,je as aX,oe as aY,N as aZ,_t as a_,ma as aa,Yr as ab,Br as ac,W as ad,re as ae,M as af,rn as ag,Kt as ah,or as ai,h as aj,Ur as ak,$r as al,p as am,pa as an,nr as ao,Lr as ap,St as aq,ft as ar,sa as as,E as at,Ne as au,Cr as av,Zt as aw,$e as ax,be as ay,Vr as az,va as b,ca as b0,Zn as b1,qr as b2,Zr as b3,At as b4,Jr as b5,gn as b6,xa as b7,Er as b8,Na as b9,ka as ba,Sa as bb,ia as bc,mr as bd,Aa as be,Ya as bf,Fa as c,Yn as d,Oa as e,Da as f,K as g,Pa as h,gt as i,_a as j,da as k,ya as l,la as m,Ta as n,pn as o,Vn as p,Kn as q,ea as r,j as s,ba as t,se as u,qa as v,fa as w,Ca as x,Ea as y,ta as z}; diff --git a/webapp/assets/_app/immutable/chunks/Dkb9lSSG.js b/webapp/assets/_app/immutable/chunks/CTvJf3dP.js similarity index 94% rename from webapp/assets/_app/immutable/chunks/Dkb9lSSG.js rename to webapp/assets/_app/immutable/chunks/CTvJf3dP.js index 50144c21..8c580828 100644 --- a/webapp/assets/_app/immutable/chunks/Dkb9lSSG.js +++ b/webapp/assets/_app/immutable/chunks/CTvJf3dP.js @@ -1,3 +1,3 @@ -import{I as Ae,o as De,aR as L,g as P,s as N,bf as mt,aS as $e}from"./CRKWEg6v.js";import{p as _t,e as yt,a as wt,b as I}from"./D0m048VH.js";class le{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Ee{constructor(t,n){this.status=t,this.location=n}}class Se extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function vt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function bt(e){return e.split("%25").map(decodeURI).join("%25")}function kt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function me({href:e}){return e.split("#")[0]}function At(e,t,n,r=!1){const a=new URL(e);Object.defineProperty(a,"searchParams",{value:new Proxy(a.searchParams,{get(i,o){if(o==="get"||o==="getAll"||o==="has")return f=>(n(f),i[o](f));t();const l=Reflect.get(i,o);return typeof l=="function"?l.bind(i):l}}),enumerable:!0,configurable:!0});const s=["href","pathname","search","toString","toJSON"];r&&s.push("hash");for(const i of s)Object.defineProperty(a,i,{get(){return t(),e[i]},enumerable:!0,configurable:!0});return a}function Et(...e){let t=5381;for(const n of e)if(typeof n=="string"){let r=n.length;for(;r;)t=t*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)t=t*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}function St(e){const t=atob(e),n=new Uint8Array(t.length);for(let r=0;r((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&G.delete(Re(e)),Rt(e,t));const G=new Map;function Tt(e,t){const n=Re(e,t),r=document.querySelector(n);if(r?.textContent){let{body:a,...s}=JSON.parse(r.textContent);const i=r.getAttribute("data-ttl");return i&&G.set(n,{body:a,init:s,ttl:1e3*Number(i)}),r.getAttribute("data-b64")!==null&&(a=St(a)),Promise.resolve(new Response(a,s))}return window.fetch(e,t)}function Ut(e,t,n){if(G.size>0){const r=Re(e,n),a=G.get(r);if(a){if(performance.now(){const{pattern:g,params:u}=_t(o),c={id:o,exec:h=>{const _=g.exec(h);if(_)return yt(_,u,r)},errors:[1,...d||[]].map(h=>e[h]),layouts:[0,...f||[]].map(i),leaf:s(l)};return c.errors.length=c.layouts.length=Math.max(c.errors.length,c.layouts.length),c});function s(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function i(o){return o===void 0?o:[a.has(o),e[o]]}}function Je(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function Be(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const Lt="1757451970280",We="sveltekit:snapshot",ze="sveltekit:scroll",Xe="sveltekit:states",Pt="sveltekit:pageurl",V="sveltekit:history",J="sveltekit:navigation",j={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Z=location.origin;function Te(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function fe(){return{x:pageXOffset,y:pageYOffset}}function B(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const Ve={...j,"":j.hover};function Ze(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Qe(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=Ze(e)}}function we(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";r.hash=`#${o}${r.hash}`}}catch{}const a=e instanceof SVGAElement?e.target.baseVal:e.target,s=!r||!!a||ue(r,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),i=r?.origin===Z&&e.hasAttribute("download");return{url:r,external:s,target:a,download:i}}function te(e){let t=null,n=null,r=null,a=null,s=null,i=null,o=e;for(;o&&o!==document.documentElement;)r===null&&(r=B(o,"preload-code")),a===null&&(a=B(o,"preload-data")),t===null&&(t=B(o,"keepfocus")),n===null&&(n=B(o,"noscroll")),s===null&&(s=B(o,"reload")),i===null&&(i=B(o,"replacestate")),o=Ze(o);function l(f){switch(f){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Ve[r??"off"],preload_data:Ve[a??"off"],keepfocus:l(t),noscroll:l(n),reload:l(s),replace_state:l(i)}}function Me(e){const t=Ae(e);let n=!0;function r(){n=!0,t.update(i=>i)}function a(i){n=!1,t.set(i)}function s(i){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&i(o=l)})}return{notify:r,set:a,subscribe:s}}const et={v:()=>{}};function Nt(){const{set:e,subscribe:t}=Ae(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${wt}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const i=(await a.json()).version!==Lt;return i&&(e(!0),et.v(),clearTimeout(n)),i}catch{return!1}}return{subscribe:t,check:r}}function ue(e,t,n){return e.origin!==Z||!e.pathname.startsWith(t)?!0:n?!(e.pathname===t+"/"||e.pathname===t+"/index.html"||e.protocol==="file:"&&e.pathname.replace(/\/[^/]+\.html?$/,"")===t):!1}function yn(e){}function Ot(e){const t=xt(e),n=new ArrayBuffer(t.length),r=new DataView(n);for(let a=0;a>16),t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255),n=r=0);return r===12?(n>>=4,t+=String.fromCharCode(n)):r===18&&(n>>=2,t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255)),t}const jt=-1,Dt=-2,$t=-3,Bt=-4,Vt=-5,Mt=-6;function Ft(e,t){if(typeof e=="number")return a(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);function a(s,i=!1){if(s===jt)return;if(s===$t)return NaN;if(s===Bt)return 1/0;if(s===Vt)return-1/0;if(s===Mt)return-0;if(i||typeof s!="number")throw new Error("Invalid input");if(s in r)return r[s];const o=n[s];if(!o||typeof o!="object")r[s]=o;else if(Array.isArray(o))if(typeof o[0]=="string"){const l=o[0],f=t?.[l];if(f)return r[s]=f(a(o[1]));switch(l){case"Date":r[s]=new Date(o[1]);break;case"Set":const d=new Set;r[s]=d;for(let c=1;ct!=null)}const Ht="x-sveltekit-invalidated",Kt="x-sveltekit-trailing-slash";function ne(e){return e instanceof le||e instanceof Se?e.status:500}function Yt(e){return e instanceof Se?e.text:"Internal Error"}let E,W,_e;const Jt=De.toString().includes("$$")||/function \w+\(\) \{\}/.test(De.toString());Jt?(E={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},W={current:null},_e={current:!1}):(E=new class{#e=L({});get data(){return P(this.#e)}set data(t){N(this.#e,t)}#t=L(null);get form(){return P(this.#t)}set form(t){N(this.#t,t)}#n=L(null);get error(){return P(this.#n)}set error(t){N(this.#n,t)}#r=L({});get params(){return P(this.#r)}set params(t){N(this.#r,t)}#a=L({id:null});get route(){return P(this.#a)}set route(t){N(this.#a,t)}#o=L({});get state(){return P(this.#o)}set state(t){N(this.#o,t)}#s=L(-1);get status(){return P(this.#s)}set status(t){N(this.#s,t)}#i=L(new URL("https://example.com"));get url(){return P(this.#i)}set url(t){N(this.#i,t)}},W=new class{#e=L(null);get current(){return P(this.#e)}set current(t){N(this.#e,t)}},_e=new class{#e=L(!1);get current(){return P(this.#e)}set current(t){N(this.#e,t)}},et.v=()=>_e.current=!0);function Wt(e){Object.assign(E,e)}const zt="/__data.json",Xt=".html__data.json";function Zt(e){return e.endsWith(".html")?e.replace(/\.html$/,Xt):e.replace(/\/$/,"")+zt}const{tick:Qt}=mt,en=new Set(["icon","shortcut icon","apple-touch-icon"]),$=Je(ze)??{},z=Je(We)??{},x={url:Me({}),page:Me({}),navigating:Ae(null),updated:Nt()};function Ue(e){$[e]=fe()}function tn(e,t){let n=e+1;for(;$[n];)delete $[n],n+=1;for(n=t+1;z[n];)delete z[n],n+=1}function F(e){return location.href=e.href,new Promise(()=>{})}async function nt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(I||"/");e&&await e.update()}}function Fe(){}let Ie,ve,re,O,be,v;globalThis.__sveltekit_o7cvpx.data;const ae=[],oe=[];let C=null;const ee=new Map,rt=new Set,nn=new Set,H=new Set;let w={branch:[],error:null,url:null},Le=!1,se=!1,qe=!0,X=!1,q=!1,at=!1,Pe=!1,ot,k,T,D;const K=new Set,Ge=new Map;async function kn(e,t,n){document.URL!==location.href&&(location.href=location.href),v=e,await e.hooks.init?.(),Ie=It(e),O=document.documentElement,be=t,ve=e.nodes[0],re=e.nodes[1],ve(),re(),k=history.state?.[V],T=history.state?.[J],k||(k=T=Date.now(),history.replaceState({...history.state,[V]:k,[J]:T},""));const r=$[k];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await hn(be,n)):(await Y({type:"enter",url:Te(v.hash?gn(new URL(location.href)):location.href),replace_state:!0}),a()),dn()}function rn(){ae.length=0,Pe=!1}function st(e){oe.some(t=>t?.snapshot)&&(z[e]=oe.map(t=>t?.snapshot?.capture()))}function it(e){z[e]?.forEach((t,n)=>{oe[n]?.snapshot?.restore(t)})}function He(){Ue(k),Be(ze,$),st(T),Be(We,z)}async function Ne(e,t,n,r){let a;const s=await Y({type:"goto",url:Te(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&(Pe=!0,a=[...Ge.keys()]),t.invalidate&&t.invalidate.forEach(un)}});return t.invalidateAll&&$e().then($e).then(()=>{Ge.forEach(({resource:i},o)=>{a?.includes(o)&&i.refresh?.()})}),s}async function an(e){if(e.id!==C?.id){const t={};K.add(t),C={id:e.id,token:t,promise:ft({...e,preload:t}).then(n=>(K.delete(t),n.type==="loaded"&&n.state.error&&(C=null),n))}}return C.promise}async function ye(e){const t=(await he(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].map(n=>n?.[1]()))}function ct(e,t,n){w=e.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(E,e.props.page),ot=new v.root({target:t,props:{...e.props,stores:x,components:oe},hydrate:n,sync:!1}),it(T),n){const a={from:null,to:{params:w.params,route:{id:w.route?.id??null},url:new URL(location.href)},willUnload:!1,type:"enter",complete:Promise.resolve()};H.forEach(s=>s(a))}se=!0}function ie({url:e,params:t,branch:n,status:r,error:a,route:s,form:i}){let o="never";if(I&&(e.pathname===I||e.pathname===I+"/"))o="always";else for(const c of n)c?.slash!==void 0&&(o=c.slash);e.pathname=vt(e.pathname,o),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:a,route:s},props:{constructors:Gt(n).map(c=>c.node.component),page:je(E)}};i!==void 0&&(l.props.form=i);let f={},d=!E,g=0;for(let c=0;c(o&&(l.route=!0),u[c])}),params:new Proxy(r,{get:(u,c)=>(o&&l.params.add(c),u[c])}),data:s?.data??null,url:At(n,()=>{o&&(l.url=!0)},u=>{o&&l.search_params.add(u)},v.hash),async fetch(u,c){u instanceof Request&&(c={body:u.method==="GET"||u.method==="HEAD"?void 0:await u.blob(),cache:u.cache,credentials:u.credentials,headers:[...u.headers].length>0?u?.headers:void 0,integrity:u.integrity,keepalive:u.keepalive,method:u.method,mode:u.mode,redirect:u.redirect,referrer:u.referrer,referrerPolicy:u.referrerPolicy,signal:u.signal,...c});const{resolved:h,promise:_}=lt(u,c,n);return o&&d(h.href),_},setHeaders:()=>{},depends:d,parent(){return o&&(l.parent=!0),t()},untrack(u){o=!1;try{return u()}finally{o=!0}}};i=await f.universal.load.call(null,g)??null}return{node:f,loader:e,server:s,universal:f.universal?.load?{type:"data",data:i,uses:l}:null,data:i??s?.data??null,slash:f.universal?.trailingSlash??s?.slash}}function lt(e,t,n){let r=e instanceof Request?e.url:e;const a=new URL(r,n);a.origin===n.origin&&(r=a.href.slice(n.origin.length));const s=se?Ut(r,a.href,t):Tt(r,t);return{resolved:a,promise:s}}function Ke(e,t,n,r,a,s){if(Pe)return!0;if(!a)return!1;if(a.parent&&e||a.route&&t||a.url&&n)return!0;for(const i of a.search_params)if(r.has(i))return!0;for(const i of a.params)if(s[i]!==w.params[i])return!0;for(const i of a.dependencies)if(ae.some(o=>o(new URL(i))))return!0;return!1}function Ce(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function on(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const r of n){const a=e.searchParams.getAll(r),s=t.searchParams.getAll(r);a.every(i=>s.includes(i))&&s.every(i=>a.includes(i))&&n.delete(r)}return n}function Ye({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:je(E),constructors:[]}}}async function ft({id:e,invalidating:t,url:n,params:r,route:a,preload:s}){if(C?.id===e)return K.delete(C.token),C.promise;const{errors:i,layouts:o,leaf:l}=a,f=[...o,l];i.forEach(p=>p?.().catch(()=>{})),f.forEach(p=>p?.[1]().catch(()=>{}));let d=null;const g=w.url?e!==ce(w.url):!1,u=w.route?a.id!==w.route.id:!1,c=on(w.url,n);let h=!1;const _=f.map((p,y)=>{const b=w.branch[y],A=!!p?.[0]&&(b?.loader!==p[1]||Ke(h,u,g,c,b.server?.uses,r));return A&&(h=!0),A});if(_.some(Boolean)){try{d=await ht(n,_)}catch(p){const y=await M(p,{url:n,params:r,route:{id:e}});return K.has(s)?Ye({error:y,url:n,params:r,route:a}):de({status:ne(p),error:y,url:n,route:a})}if(d.type==="redirect")return d}const m=d?.nodes;let R=!1;const S=f.map(async(p,y)=>{if(!p)return;const b=w.branch[y],A=m?.[y];if((!A||A.type==="skip")&&p[1]===b?.loader&&!Ke(R,u,g,c,b.universal?.uses,r))return b;if(R=!0,A?.type==="error")throw A;return Oe({loader:p[1],url:n,params:r,route:a,parent:async()=>{const pe={};for(let ge=0;ge{});const U=[];for(let p=0;pPromise.resolve({}),server_data_node:Ce(s)}),l={node:await re(),loader:re,universal:null,server:null,data:null};return ie({url:n,params:a,branch:[o,l],status:e,error:t,route:null})}catch(o){if(o instanceof Ee)return Ne(new URL(o.location,location.href),{},0);throw o}}async function cn(e){const t=e.href;if(ee.has(t))return ee.get(t);let n;try{const r=(async()=>{let a=await v.hooks.reroute({url:new URL(e),fetch:async(s,i)=>lt(s,i,e).promise})??e;if(typeof a=="string"){const s=new URL(e);v.hash?s.hash=a:s.pathname=a,a=s}return a})();ee.set(t,r),n=await r}catch{ee.delete(t);return}return n}async function he(e,t){if(e&&!ue(e,I,v.hash)){const n=await cn(e);if(!n)return;const r=ln(n);for(const a of Ie){const s=a.exec(r);if(s)return{id:ce(e),invalidating:t,route:a,params:kt(s),url:e}}}}function ln(e){return bt(v.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(I.length))||"/"}function ce(e){return(v.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function ut({url:e,type:t,intent:n,delta:r}){let a=!1;const s=xe(w,n,e,t);r!==void 0&&(s.navigation.delta=r);const i={...s.navigation,cancel:()=>{a=!0,s.reject(new Error("navigation cancelled"))}};return X||rt.forEach(o=>o(i)),a?null:s}async function Y({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:i={},redirect_count:o=0,nav_token:l={},accept:f=Fe,block:d=Fe}){const g=D;D=l;const u=await he(t,!1),c=e==="enter"?xe(w,u,t,e):ut({url:t,type:e,delta:n?.delta,intent:u});if(!c){d(),D===l&&(D=g);return}const h=k,_=T;f(),X=!0,se&&c.navigation.type!=="enter"&&x.navigating.set(W.current=c.navigation);let m=u&&await ft(u);if(!m){if(ue(t,I,v.hash))return await F(t);m=await dt(t,{id:null},await M(new Se(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404)}if(t=u?.url||t,D!==l)return c.reject(new Error("navigation aborted")),!1;if(m.type==="redirect")if(o>=20)m=await de({status:500,error:await M(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}});else return await Ne(new URL(m.location,t).href,{},o+1,l),!1;else m.props.page.status>=400&&await x.updated.check()&&(await nt(),await F(t));if(rn(),Ue(h),st(_),m.props.page.url.pathname!==t.pathname&&(t.pathname=m.props.page.url.pathname),i=n?n.state:i,!n){const p=s?0:1,y={[V]:k+=p,[J]:T+=p,[Xe]:i};(s?history.replaceState:history.pushState).call(history,y,"",t),s||tn(k,T)}if(C=null,m.props.page.state=i,se){const p=(await Promise.all(Array.from(nn,y=>y(c.navigation)))).filter(y=>typeof y=="function");if(p.length>0){let y=function(){p.forEach(b=>{H.delete(b)})};p.push(y),p.forEach(b=>{H.add(b)})}w=m.state,m.props.page&&(m.props.page.url=t),ot.$set(m.props),Wt(m.props.page),at=!0}else ct(m,be,!1);const{activeElement:R}=document;await Qt();const S=n?n.scroll:a?fe():null;if(qe){const p=t.hash&&document.getElementById(gt(t));S?scrollTo(S.x,S.y):p?p.scrollIntoView():scrollTo(0,0)}const U=document.activeElement!==R&&document.activeElement!==document.body;!r&&!U&&pn(t),qe=!0,m.props.page&&Object.assign(E,m.props.page),X=!1,e==="popstate"&&it(T),c.fulfil(void 0),H.forEach(p=>p(c.navigation)),x.navigating.set(W.current=null)}async function dt(e,t,n,r){return e.origin===Z&&e.pathname===location.pathname&&!Le?await de({status:r,error:n,url:e,route:t}):await F(e)}function fn(){let e,t,n;O.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{s(l,j.hover)},20)});function r(o){o.defaultPrevented||s(o.composedPath()[0],j.tap)}O.addEventListener("mousedown",r),O.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(ye(new URL(l.target.href)),a.unobserve(l.target))},{threshold:0});async function s(o,l){const f=Qe(o,O),d=f===t&&l>=n;if(!f||d)return;const{url:g,external:u,download:c}=we(f,I,v.hash);if(u||c)return;const h=te(f),_=g&&ce(w.url)===ce(g);if(!(h.reload||_))if(l<=h.preload_data){t=f,n=j.tap;const m=await he(g,!1);if(!m)return;an(m)}else l<=h.preload_code&&(t=f,n=l,ye(g))}function i(){a.disconnect();for(const o of O.querySelectorAll("a")){const{url:l,external:f,download:d}=we(o,I,v.hash);if(f||d)continue;const g=te(o);g.reload||(g.preload_code===j.viewport&&a.observe(o),g.preload_code===j.eager&&ye(l))}}H.add(i),i()}function M(e,t){if(e instanceof le)return e.body;const n=ne(e),r=Yt(e);return v.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function An(e,t={}){return e=new URL(Te(e)),e.origin!==Z?Promise.reject(new Error("goto: invalid URL")):Ne(e,t,0)}function un(e){if(typeof e=="function")ae.push(e);else{const{href:t}=new URL(e,location.href);ae.push(n=>n.href===t)}}function dn(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(He(),!X){const r=xe(w,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};rt.forEach(s=>s(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&He()}),navigator.connection?.saveData||fn(),O.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=Qe(t.composedPath()[0],O);if(!n)return;const{url:r,external:a,target:s,download:i}=we(n,I,v.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const o=te(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||i)return;const[f,d]=(v.hash?r.hash.replace(/^#/,""):r.href).split("#"),g=f===me(location);if(a||o.reload&&(!g||!d)){ut({url:r,type:"link"})?X=!0:t.preventDefault();return}if(d!==void 0&&g){const[,u]=w.url.href.split("#");if(u===d){if(t.preventDefault(),d===""||d==="top"&&n.ownerDocument.getElementById("top")===null)window.scrollTo({top:0});else{const c=n.ownerDocument.getElementById(decodeURIComponent(d));c&&(c.scrollIntoView(),c.focus())}return}if(q=!0,Ue(k),e(r),!o.replace_state)return;q=!1}t.preventDefault(),await new Promise(u=>{requestAnimationFrame(()=>{setTimeout(u,0)}),setTimeout(u,100)}),await Y({type:"link",url:r,keepfocus:o.keepfocus,noscroll:o.noscroll,replace_state:o.replace_state??r.href===location.href})}),O.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),r=t.submitter;if((r?.formTarget||n.target)==="_blank"||(r?.formMethod||n.method)!=="get")return;const i=new URL(r?.hasAttribute("formaction")&&r?.formAction||n.action);if(ue(i,I,!1))return;const o=t.target,l=te(o);if(l.reload)return;t.preventDefault(),t.stopPropagation();const f=new FormData(o),d=r?.getAttribute("name");d&&f.append(d,r?.getAttribute("value")??""),i.search=new URLSearchParams(f).toString(),Y({type:"form",url:i,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??i.href===location.href})}),addEventListener("popstate",async t=>{if(!ke){if(t.state?.[V]){const n=t.state[V];if(D={},n===k)return;const r=$[n],a=t.state[Xe]??{},s=new URL(t.state[Pt]??location.href),i=t.state[J],o=w.url?me(location)===me(w.url):!1;if(i===T&&(at||o)){a!==E.state&&(E.state=a),e(s),$[k]=fe(),r&&scrollTo(r.x,r.y),k=n;return}const f=n-k;await Y({type:"popstate",url:s,popped:{state:a,scroll:r,delta:f},accept:()=>{k=n,T=i},block:()=>{history.go(-f)},nav_token:D})}else if(!q){const n=new URL(location.href);e(n),v.hash&&location.reload()}}}),addEventListener("hashchange",()=>{q&&(q=!1,history.replaceState({...history.state,[V]:++k,[J]:T},"",location.href))});for(const t of document.querySelectorAll("link"))en.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&x.navigating.set(W.current=null)});function e(t){w.url=E.url=t,x.page.set(je(E)),x.page.notify()}}async function hn(e,{status:t=200,error:n,node_ids:r,params:a,route:s,server_route:i,data:o,form:l}){Le=!0;const f=new URL(location.href);let d;({params:a={},route:s={id:null}}=await he(f,!1)||{}),d=Ie.find(({id:c})=>c===s.id);let g,u=!0;try{const c=r.map(async(_,m)=>{const R=o[m];return R?.uses&&(R.uses=pt(R.uses)),Oe({loader:v.nodes[_],url:f,params:a,route:s,parent:async()=>{const S={};for(let U=0;Us?"1":"0").join(""));const r=window.fetch,a=await r(n.href,{});if(!a.ok){let s;throw a.headers.get("content-type")?.includes("application/json")?s=await a.json():a.status===404?s="Not Found":a.status===500&&(s="Internal Error"),new le(a.status,s)}return new Promise(async s=>{const i=new Map,o=a.body.getReader(),l=new TextDecoder;function f(g){return Ft(g,{...v.decoders,Promise:u=>new Promise((c,h)=>{i.set(u,{fulfil:c,reject:h})})})}let d="";for(;;){const{done:g,value:u}=await o.read();if(g&&!d)break;for(d+=!u&&d?` +import{F as Ae,o as De,aR as L,g as P,k as N,bf as mt,aS as $e}from"./cPTQ2Ibn.js";import{p as _t,e as yt,a as wt,b as I}from"./D7e9zx6w.js";class le{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Ee{constructor(t,n){this.status=t,this.location=n}}class Se extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function vt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function bt(e){return e.split("%25").map(decodeURI).join("%25")}function kt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function me({href:e}){return e.split("#")[0]}function At(e,t,n,r=!1){const a=new URL(e);Object.defineProperty(a,"searchParams",{value:new Proxy(a.searchParams,{get(i,o){if(o==="get"||o==="getAll"||o==="has")return f=>(n(f),i[o](f));t();const l=Reflect.get(i,o);return typeof l=="function"?l.bind(i):l}}),enumerable:!0,configurable:!0});const s=["href","pathname","search","toString","toJSON"];r&&s.push("hash");for(const i of s)Object.defineProperty(a,i,{get(){return t(),e[i]},enumerable:!0,configurable:!0});return a}function Et(...e){let t=5381;for(const n of e)if(typeof n=="string"){let r=n.length;for(;r;)t=t*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)t=t*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}function St(e){const t=atob(e),n=new Uint8Array(t.length);for(let r=0;r((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&G.delete(Re(e)),Rt(e,t));const G=new Map;function Tt(e,t){const n=Re(e,t),r=document.querySelector(n);if(r?.textContent){let{body:a,...s}=JSON.parse(r.textContent);const i=r.getAttribute("data-ttl");return i&&G.set(n,{body:a,init:s,ttl:1e3*Number(i)}),r.getAttribute("data-b64")!==null&&(a=St(a)),Promise.resolve(new Response(a,s))}return window.fetch(e,t)}function Ut(e,t,n){if(G.size>0){const r=Re(e,n),a=G.get(r);if(a){if(performance.now(){const{pattern:g,params:u}=_t(o),c={id:o,exec:h=>{const _=g.exec(h);if(_)return yt(_,u,r)},errors:[1,...d||[]].map(h=>e[h]),layouts:[0,...f||[]].map(i),leaf:s(l)};return c.errors.length=c.layouts.length=Math.max(c.errors.length,c.layouts.length),c});function s(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function i(o){return o===void 0?o:[a.has(o),e[o]]}}function Je(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function Be(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const Lt="1758549499990",We="sveltekit:snapshot",ze="sveltekit:scroll",Xe="sveltekit:states",Pt="sveltekit:pageurl",V="sveltekit:history",J="sveltekit:navigation",j={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Z=location.origin;function Te(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function fe(){return{x:pageXOffset,y:pageYOffset}}function B(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const Ve={...j,"":j.hover};function Ze(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Qe(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=Ze(e)}}function we(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";r.hash=`#${o}${r.hash}`}}catch{}const a=e instanceof SVGAElement?e.target.baseVal:e.target,s=!r||!!a||ue(r,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),i=r?.origin===Z&&e.hasAttribute("download");return{url:r,external:s,target:a,download:i}}function te(e){let t=null,n=null,r=null,a=null,s=null,i=null,o=e;for(;o&&o!==document.documentElement;)r===null&&(r=B(o,"preload-code")),a===null&&(a=B(o,"preload-data")),t===null&&(t=B(o,"keepfocus")),n===null&&(n=B(o,"noscroll")),s===null&&(s=B(o,"reload")),i===null&&(i=B(o,"replacestate")),o=Ze(o);function l(f){switch(f){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Ve[r??"off"],preload_data:Ve[a??"off"],keepfocus:l(t),noscroll:l(n),reload:l(s),replace_state:l(i)}}function Fe(e){const t=Ae(e);let n=!0;function r(){n=!0,t.update(i=>i)}function a(i){n=!1,t.set(i)}function s(i){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&i(o=l)})}return{notify:r,set:a,subscribe:s}}const et={v:()=>{}};function Nt(){const{set:e,subscribe:t}=Ae(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${wt}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const i=(await a.json()).version!==Lt;return i&&(e(!0),et.v(),clearTimeout(n)),i}catch{return!1}}return{subscribe:t,check:r}}function ue(e,t,n){return e.origin!==Z||!e.pathname.startsWith(t)?!0:n?!(e.pathname===t+"/"||e.pathname===t+"/index.html"||e.protocol==="file:"&&e.pathname.replace(/\/[^/]+\.html?$/,"")===t):!1}function yn(e){}function Ot(e){const t=xt(e),n=new ArrayBuffer(t.length),r=new DataView(n);for(let a=0;a>16),t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255),n=r=0);return r===12?(n>>=4,t+=String.fromCharCode(n)):r===18&&(n>>=2,t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255)),t}const jt=-1,Dt=-2,$t=-3,Bt=-4,Vt=-5,Ft=-6;function Mt(e,t){if(typeof e=="number")return a(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);function a(s,i=!1){if(s===jt)return;if(s===$t)return NaN;if(s===Bt)return 1/0;if(s===Vt)return-1/0;if(s===Ft)return-0;if(i||typeof s!="number")throw new Error("Invalid input");if(s in r)return r[s];const o=n[s];if(!o||typeof o!="object")r[s]=o;else if(Array.isArray(o))if(typeof o[0]=="string"){const l=o[0],f=t?.[l];if(f)return r[s]=f(a(o[1]));switch(l){case"Date":r[s]=new Date(o[1]);break;case"Set":const d=new Set;r[s]=d;for(let c=1;ct!=null)}const Ht="x-sveltekit-invalidated",Kt="x-sveltekit-trailing-slash";function ne(e){return e instanceof le||e instanceof Se?e.status:500}function Yt(e){return e instanceof Se?e.text:"Internal Error"}let E,W,_e;const Jt=De.toString().includes("$$")||/function \w+\(\) \{\}/.test(De.toString());Jt?(E={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},W={current:null},_e={current:!1}):(E=new class{#e=L({});get data(){return P(this.#e)}set data(t){N(this.#e,t)}#t=L(null);get form(){return P(this.#t)}set form(t){N(this.#t,t)}#n=L(null);get error(){return P(this.#n)}set error(t){N(this.#n,t)}#r=L({});get params(){return P(this.#r)}set params(t){N(this.#r,t)}#a=L({id:null});get route(){return P(this.#a)}set route(t){N(this.#a,t)}#o=L({});get state(){return P(this.#o)}set state(t){N(this.#o,t)}#s=L(-1);get status(){return P(this.#s)}set status(t){N(this.#s,t)}#i=L(new URL("https://example.com"));get url(){return P(this.#i)}set url(t){N(this.#i,t)}},W=new class{#e=L(null);get current(){return P(this.#e)}set current(t){N(this.#e,t)}},_e=new class{#e=L(!1);get current(){return P(this.#e)}set current(t){N(this.#e,t)}},et.v=()=>_e.current=!0);function Wt(e){Object.assign(E,e)}const zt="/__data.json",Xt=".html__data.json";function Zt(e){return e.endsWith(".html")?e.replace(/\.html$/,Xt):e.replace(/\/$/,"")+zt}const{tick:Qt}=mt,en=new Set(["icon","shortcut icon","apple-touch-icon"]),$=Je(ze)??{},z=Je(We)??{},x={url:Fe({}),page:Fe({}),navigating:Ae(null),updated:Nt()};function Ue(e){$[e]=fe()}function tn(e,t){let n=e+1;for(;$[n];)delete $[n],n+=1;for(n=t+1;z[n];)delete z[n],n+=1}function M(e){return location.href=e.href,new Promise(()=>{})}async function nt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(I||"/");e&&await e.update()}}function Me(){}let Ie,ve,re,O,be,v;globalThis.__sveltekit_ppz5de.data;const ae=[],oe=[];let C=null;const ee=new Map,rt=new Set,nn=new Set,H=new Set;let w={branch:[],error:null,url:null},Le=!1,se=!1,qe=!0,X=!1,q=!1,at=!1,Pe=!1,ot,k,T,D;const K=new Set,Ge=new Map;async function kn(e,t,n){document.URL!==location.href&&(location.href=location.href),v=e,await e.hooks.init?.(),Ie=It(e),O=document.documentElement,be=t,ve=e.nodes[0],re=e.nodes[1],ve(),re(),k=history.state?.[V],T=history.state?.[J],k||(k=T=Date.now(),history.replaceState({...history.state,[V]:k,[J]:T},""));const r=$[k];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await hn(be,n)):(await Y({type:"enter",url:Te(v.hash?gn(new URL(location.href)):location.href),replace_state:!0}),a()),dn()}function rn(){ae.length=0,Pe=!1}function st(e){oe.some(t=>t?.snapshot)&&(z[e]=oe.map(t=>t?.snapshot?.capture()))}function it(e){z[e]?.forEach((t,n)=>{oe[n]?.snapshot?.restore(t)})}function He(){Ue(k),Be(ze,$),st(T),Be(We,z)}async function Ne(e,t,n,r){let a;const s=await Y({type:"goto",url:Te(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&(Pe=!0,a=[...Ge.keys()]),t.invalidate&&t.invalidate.forEach(un)}});return t.invalidateAll&&$e().then($e).then(()=>{Ge.forEach(({resource:i},o)=>{a?.includes(o)&&i.refresh?.()})}),s}async function an(e){if(e.id!==C?.id){const t={};K.add(t),C={id:e.id,token:t,promise:ft({...e,preload:t}).then(n=>(K.delete(t),n.type==="loaded"&&n.state.error&&(C=null),n))}}return C.promise}async function ye(e){const t=(await he(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].map(n=>n?.[1]()))}function ct(e,t,n){w=e.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(E,e.props.page),ot=new v.root({target:t,props:{...e.props,stores:x,components:oe},hydrate:n,sync:!1}),it(T),n){const a={from:null,to:{params:w.params,route:{id:w.route?.id??null},url:new URL(location.href)},willUnload:!1,type:"enter",complete:Promise.resolve()};H.forEach(s=>s(a))}se=!0}function ie({url:e,params:t,branch:n,status:r,error:a,route:s,form:i}){let o="never";if(I&&(e.pathname===I||e.pathname===I+"/"))o="always";else for(const c of n)c?.slash!==void 0&&(o=c.slash);e.pathname=vt(e.pathname,o),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:a,route:s},props:{constructors:Gt(n).map(c=>c.node.component),page:je(E)}};i!==void 0&&(l.props.form=i);let f={},d=!E,g=0;for(let c=0;c(o&&(l.route=!0),u[c])}),params:new Proxy(r,{get:(u,c)=>(o&&l.params.add(c),u[c])}),data:s?.data??null,url:At(n,()=>{o&&(l.url=!0)},u=>{o&&l.search_params.add(u)},v.hash),async fetch(u,c){u instanceof Request&&(c={body:u.method==="GET"||u.method==="HEAD"?void 0:await u.blob(),cache:u.cache,credentials:u.credentials,headers:[...u.headers].length>0?u?.headers:void 0,integrity:u.integrity,keepalive:u.keepalive,method:u.method,mode:u.mode,redirect:u.redirect,referrer:u.referrer,referrerPolicy:u.referrerPolicy,signal:u.signal,...c});const{resolved:h,promise:_}=lt(u,c,n);return o&&d(h.href),_},setHeaders:()=>{},depends:d,parent(){return o&&(l.parent=!0),t()},untrack(u){o=!1;try{return u()}finally{o=!0}}};i=await f.universal.load.call(null,g)??null}return{node:f,loader:e,server:s,universal:f.universal?.load?{type:"data",data:i,uses:l}:null,data:i??s?.data??null,slash:f.universal?.trailingSlash??s?.slash}}function lt(e,t,n){let r=e instanceof Request?e.url:e;const a=new URL(r,n);a.origin===n.origin&&(r=a.href.slice(n.origin.length));const s=se?Ut(r,a.href,t):Tt(r,t);return{resolved:a,promise:s}}function Ke(e,t,n,r,a,s){if(Pe)return!0;if(!a)return!1;if(a.parent&&e||a.route&&t||a.url&&n)return!0;for(const i of a.search_params)if(r.has(i))return!0;for(const i of a.params)if(s[i]!==w.params[i])return!0;for(const i of a.dependencies)if(ae.some(o=>o(new URL(i))))return!0;return!1}function Ce(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function on(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const r of n){const a=e.searchParams.getAll(r),s=t.searchParams.getAll(r);a.every(i=>s.includes(i))&&s.every(i=>a.includes(i))&&n.delete(r)}return n}function Ye({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:je(E),constructors:[]}}}async function ft({id:e,invalidating:t,url:n,params:r,route:a,preload:s}){if(C?.id===e)return K.delete(C.token),C.promise;const{errors:i,layouts:o,leaf:l}=a,f=[...o,l];i.forEach(p=>p?.().catch(()=>{})),f.forEach(p=>p?.[1]().catch(()=>{}));let d=null;const g=w.url?e!==ce(w.url):!1,u=w.route?a.id!==w.route.id:!1,c=on(w.url,n);let h=!1;const _=f.map((p,y)=>{const b=w.branch[y],A=!!p?.[0]&&(b?.loader!==p[1]||Ke(h,u,g,c,b.server?.uses,r));return A&&(h=!0),A});if(_.some(Boolean)){try{d=await ht(n,_)}catch(p){const y=await F(p,{url:n,params:r,route:{id:e}});return K.has(s)?Ye({error:y,url:n,params:r,route:a}):de({status:ne(p),error:y,url:n,route:a})}if(d.type==="redirect")return d}const m=d?.nodes;let R=!1;const S=f.map(async(p,y)=>{if(!p)return;const b=w.branch[y],A=m?.[y];if((!A||A.type==="skip")&&p[1]===b?.loader&&!Ke(R,u,g,c,b.universal?.uses,r))return b;if(R=!0,A?.type==="error")throw A;return Oe({loader:p[1],url:n,params:r,route:a,parent:async()=>{const pe={};for(let ge=0;ge{});const U=[];for(let p=0;pPromise.resolve({}),server_data_node:Ce(s)}),l={node:await re(),loader:re,universal:null,server:null,data:null};return ie({url:n,params:a,branch:[o,l],status:e,error:t,route:null})}catch(o){if(o instanceof Ee)return Ne(new URL(o.location,location.href),{},0);throw o}}async function cn(e){const t=e.href;if(ee.has(t))return ee.get(t);let n;try{const r=(async()=>{let a=await v.hooks.reroute({url:new URL(e),fetch:async(s,i)=>lt(s,i,e).promise})??e;if(typeof a=="string"){const s=new URL(e);v.hash?s.hash=a:s.pathname=a,a=s}return a})();ee.set(t,r),n=await r}catch{ee.delete(t);return}return n}async function he(e,t){if(e&&!ue(e,I,v.hash)){const n=await cn(e);if(!n)return;const r=ln(n);for(const a of Ie){const s=a.exec(r);if(s)return{id:ce(e),invalidating:t,route:a,params:kt(s),url:e}}}}function ln(e){return bt(v.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(I.length))||"/"}function ce(e){return(v.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function ut({url:e,type:t,intent:n,delta:r}){let a=!1;const s=xe(w,n,e,t);r!==void 0&&(s.navigation.delta=r);const i={...s.navigation,cancel:()=>{a=!0,s.reject(new Error("navigation cancelled"))}};return X||rt.forEach(o=>o(i)),a?null:s}async function Y({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:i={},redirect_count:o=0,nav_token:l={},accept:f=Me,block:d=Me}){const g=D;D=l;const u=await he(t,!1),c=e==="enter"?xe(w,u,t,e):ut({url:t,type:e,delta:n?.delta,intent:u});if(!c){d(),D===l&&(D=g);return}const h=k,_=T;f(),X=!0,se&&c.navigation.type!=="enter"&&x.navigating.set(W.current=c.navigation);let m=u&&await ft(u);if(!m){if(ue(t,I,v.hash))return await M(t);m=await dt(t,{id:null},await F(new Se(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404)}if(t=u?.url||t,D!==l)return c.reject(new Error("navigation aborted")),!1;if(m.type==="redirect")if(o>=20)m=await de({status:500,error:await F(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}});else return await Ne(new URL(m.location,t).href,{},o+1,l),!1;else m.props.page.status>=400&&await x.updated.check()&&(await nt(),await M(t));if(rn(),Ue(h),st(_),m.props.page.url.pathname!==t.pathname&&(t.pathname=m.props.page.url.pathname),i=n?n.state:i,!n){const p=s?0:1,y={[V]:k+=p,[J]:T+=p,[Xe]:i};(s?history.replaceState:history.pushState).call(history,y,"",t),s||tn(k,T)}if(C=null,m.props.page.state=i,se){const p=(await Promise.all(Array.from(nn,y=>y(c.navigation)))).filter(y=>typeof y=="function");if(p.length>0){let y=function(){p.forEach(b=>{H.delete(b)})};p.push(y),p.forEach(b=>{H.add(b)})}w=m.state,m.props.page&&(m.props.page.url=t),ot.$set(m.props),Wt(m.props.page),at=!0}else ct(m,be,!1);const{activeElement:R}=document;await Qt();const S=n?n.scroll:a?fe():null;if(qe){const p=t.hash&&document.getElementById(gt(t));S?scrollTo(S.x,S.y):p?p.scrollIntoView():scrollTo(0,0)}const U=document.activeElement!==R&&document.activeElement!==document.body;!r&&!U&&pn(t),qe=!0,m.props.page&&Object.assign(E,m.props.page),X=!1,e==="popstate"&&it(T),c.fulfil(void 0),H.forEach(p=>p(c.navigation)),x.navigating.set(W.current=null)}async function dt(e,t,n,r){return e.origin===Z&&e.pathname===location.pathname&&!Le?await de({status:r,error:n,url:e,route:t}):await M(e)}function fn(){let e,t,n;O.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{s(l,j.hover)},20)});function r(o){o.defaultPrevented||s(o.composedPath()[0],j.tap)}O.addEventListener("mousedown",r),O.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(ye(new URL(l.target.href)),a.unobserve(l.target))},{threshold:0});async function s(o,l){const f=Qe(o,O),d=f===t&&l>=n;if(!f||d)return;const{url:g,external:u,download:c}=we(f,I,v.hash);if(u||c)return;const h=te(f),_=g&&ce(w.url)===ce(g);if(!(h.reload||_))if(l<=h.preload_data){t=f,n=j.tap;const m=await he(g,!1);if(!m)return;an(m)}else l<=h.preload_code&&(t=f,n=l,ye(g))}function i(){a.disconnect();for(const o of O.querySelectorAll("a")){const{url:l,external:f,download:d}=we(o,I,v.hash);if(f||d)continue;const g=te(o);g.reload||(g.preload_code===j.viewport&&a.observe(o),g.preload_code===j.eager&&ye(l))}}H.add(i),i()}function F(e,t){if(e instanceof le)return e.body;const n=ne(e),r=Yt(e);return v.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function An(e,t={}){return e=new URL(Te(e)),e.origin!==Z?Promise.reject(new Error("goto: invalid URL")):Ne(e,t,0)}function un(e){if(typeof e=="function")ae.push(e);else{const{href:t}=new URL(e,location.href);ae.push(n=>n.href===t)}}function dn(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(He(),!X){const r=xe(w,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};rt.forEach(s=>s(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&He()}),navigator.connection?.saveData||fn(),O.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=Qe(t.composedPath()[0],O);if(!n)return;const{url:r,external:a,target:s,download:i}=we(n,I,v.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const o=te(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||i)return;const[f,d]=(v.hash?r.hash.replace(/^#/,""):r.href).split("#"),g=f===me(location);if(a||o.reload&&(!g||!d)){ut({url:r,type:"link"})?X=!0:t.preventDefault();return}if(d!==void 0&&g){const[,u]=w.url.href.split("#");if(u===d){if(t.preventDefault(),d===""||d==="top"&&n.ownerDocument.getElementById("top")===null)window.scrollTo({top:0});else{const c=n.ownerDocument.getElementById(decodeURIComponent(d));c&&(c.scrollIntoView(),c.focus())}return}if(q=!0,Ue(k),e(r),!o.replace_state)return;q=!1}t.preventDefault(),await new Promise(u=>{requestAnimationFrame(()=>{setTimeout(u,0)}),setTimeout(u,100)}),await Y({type:"link",url:r,keepfocus:o.keepfocus,noscroll:o.noscroll,replace_state:o.replace_state??r.href===location.href})}),O.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),r=t.submitter;if((r?.formTarget||n.target)==="_blank"||(r?.formMethod||n.method)!=="get")return;const i=new URL(r?.hasAttribute("formaction")&&r?.formAction||n.action);if(ue(i,I,!1))return;const o=t.target,l=te(o);if(l.reload)return;t.preventDefault(),t.stopPropagation();const f=new FormData(o),d=r?.getAttribute("name");d&&f.append(d,r?.getAttribute("value")??""),i.search=new URLSearchParams(f).toString(),Y({type:"form",url:i,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??i.href===location.href})}),addEventListener("popstate",async t=>{if(!ke){if(t.state?.[V]){const n=t.state[V];if(D={},n===k)return;const r=$[n],a=t.state[Xe]??{},s=new URL(t.state[Pt]??location.href),i=t.state[J],o=w.url?me(location)===me(w.url):!1;if(i===T&&(at||o)){a!==E.state&&(E.state=a),e(s),$[k]=fe(),r&&scrollTo(r.x,r.y),k=n;return}const f=n-k;await Y({type:"popstate",url:s,popped:{state:a,scroll:r,delta:f},accept:()=>{k=n,T=i},block:()=>{history.go(-f)},nav_token:D})}else if(!q){const n=new URL(location.href);e(n),v.hash&&location.reload()}}}),addEventListener("hashchange",()=>{q&&(q=!1,history.replaceState({...history.state,[V]:++k,[J]:T},"",location.href))});for(const t of document.querySelectorAll("link"))en.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&x.navigating.set(W.current=null)});function e(t){w.url=E.url=t,x.page.set(je(E)),x.page.notify()}}async function hn(e,{status:t=200,error:n,node_ids:r,params:a,route:s,server_route:i,data:o,form:l}){Le=!0;const f=new URL(location.href);let d;({params:a={},route:s={id:null}}=await he(f,!1)||{}),d=Ie.find(({id:c})=>c===s.id);let g,u=!0;try{const c=r.map(async(_,m)=>{const R=o[m];return R?.uses&&(R.uses=pt(R.uses)),Oe({loader:v.nodes[_],url:f,params:a,route:s,parent:async()=>{const S={};for(let U=0;Us?"1":"0").join(""));const r=window.fetch,a=await r(n.href,{});if(!a.ok){let s;throw a.headers.get("content-type")?.includes("application/json")?s=await a.json():a.status===404?s="Not Found":a.status===500&&(s="Internal Error"),new le(a.status,s)}return new Promise(async s=>{const i=new Map,o=a.body.getReader(),l=new TextDecoder;function f(g){return Mt(g,{...v.decoders,Promise:u=>new Promise((c,h)=>{i.set(u,{fulfil:c,reject:h})})})}let d="";for(;;){const{done:g,value:u}=await o.read();if(g&&!d)break;for(d+=!u&&d?` `:l.decode(u,{stream:!0});;){const c=d.indexOf(` `);if(c===-1)break;const h=JSON.parse(d.slice(0,c));if(d=d.slice(c+1),h.type==="redirect")return s(h);if(h.type==="data")h.nodes?.forEach(_=>{_?.type==="data"&&(_.uses=pt(_.uses),_.data=f(_.data))}),s(h);else if(h.type==="chunk"){const{id:_,data:m,error:R}=h,S=i.get(_);i.delete(_),R?S.reject(f(R)):S.fulfil(f(m))}}}})}function pt(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}let ke=!1;function pn(e){const t=document.querySelector("[autofocus]");if(t)t.focus();else{const n=gt(e);if(n&&document.getElementById(n)){const{x:a,y:s}=fe();setTimeout(()=>{const i=history.state;ke=!0,location.replace(`#${n}`),v.hash&&location.replace(e.hash),history.replaceState(i,"",e.hash),scrollTo(a,s),ke=!1})}else{const a=document.body,s=a.getAttribute("tabindex");a.tabIndex=-1,a.focus({preventScroll:!0,focusVisible:!1}),s!==null?a.setAttribute("tabindex",s):a.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const a=[];for(let s=0;s{if(r.rangeCount===a.length){for(let s=0;s{a=l,s=f});return i.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n},willUnload:!t,type:r,complete:i},fulfil:a,reject:s}}function je(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function gn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function gt(e){let t;if(v.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{kn as a,An as g,yn as l,E as p,x as s}; diff --git a/webapp/assets/_app/immutable/chunks/CYqkNFLz.js b/webapp/assets/_app/immutable/chunks/CYqkNFLz.js new file mode 100644 index 00000000..fb067386 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/CYqkNFLz.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as _}from"./C7KraPli.js";import{p as h,f as x,t as u,b as g,c as k,s as w,d as o,u as d,q as e,r,e as y}from"./cPTQ2Ibn.js";import{h as b}from"./DqbUkQgD.js";import{p as m}from"./DqFqoVWr.js";import{g as l}from"./DJsB5Z5V.js";var z=x('
');function U(v,i){h(i,!1);let t=m(i,"item",8),s=m(i,"iconSize",8,"w-5 h-5");_();var a=z(),n=o(a),f=o(n);b(f,()=>(e(l),e(t()),e(s()),d(()=>l(t()?.endpoint?.endpoint_type||t()?.endpoint_type||"unknown",s())))),r(n);var p=w(n,2),c=o(p,!0);r(p),r(a),u(()=>y(c,(e(t()),d(()=>t()?.endpoint?.name||t()?.endpoint_name||t()?.endpoint_type||"Unknown")))),g(v,a),k()}export{U as E}; diff --git a/webapp/assets/_app/immutable/chunks/CiGy614T.js b/webapp/assets/_app/immutable/chunks/CiGy614T.js deleted file mode 100644 index 1d8d733c..00000000 --- a/webapp/assets/_app/immutable/chunks/CiGy614T.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as j}from"./DT0EGONV.js";import{p as E,E as G,f as S,j as t,r,k as g,u,n as p,z as m,t as z,v as D,e as f,c as H,d as I}from"./CRKWEg6v.js";import{h as y,s as v}from"./-esynYXT.js";import{p as h}from"./e1m7WRO5.js";import{g as o}from"./c_t0vA9G.js";var q=S('
');function M(x,s){E(s,!1);const k=G();let d=h(s,"selectedForgeType",12,""),_=h(s,"label",8,"Select Forge Type");function n(c){d(c),k("select",c)}j();var i=q(),l=t(i),F=t(l,!0);r(l);var b=g(l,2),e=t(b),w=t(e);y(w,()=>(p(o),u(()=>o("github","w-8 h-8")))),m(2),r(e);var a=g(e,2),T=t(a);y(T,()=>(p(o),u(()=>o("gitea","w-8 h-8")))),m(2),r(a),r(b),r(i),z(()=>{D(F,_()),v(e,1,`flex flex-col items-center justify-center p-6 border-2 rounded-lg transition-colors cursor-pointer ${d()==="github"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),v(a,1,`flex flex-col items-center justify-center p-6 border-2 rounded-lg transition-colors cursor-pointer ${d()==="gitea"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`)}),f("click",e,()=>n("github")),f("click",a,()=>n("gitea")),H(x,i),I()}export{M as F}; diff --git a/webapp/assets/_app/immutable/chunks/CiWDXYQd.js b/webapp/assets/_app/immutable/chunks/CiWDXYQd.js new file mode 100644 index 00000000..576d2964 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/CiWDXYQd.js @@ -0,0 +1 @@ +import{L as G,J as re,R as X,H as D,S as ne,I as fe,g as Q,v as le,T as ie,U as se,V as W,W as g,P as O,X as ue,Y as te,M as J,O as ve,N as de,Z,m as _e,_ as z,a0 as K,a1 as oe,a2 as V,a3 as $,Q as ce,a4 as Y,a5 as he,a6 as B,a7 as k,a8 as Ee,a9 as me,aa as pe,ab as Te,ac as Ae,ad as y,ae as Ie,af as Ne}from"./cPTQ2Ibn.js";function Me(i,r){return r}function we(i,r,e){for(var u=i.items,v=[],d=r.length,s=0;s0&&v.length===0&&e!==null;if(h){var T=e.parentNode;pe(T),T.append(e),u.clear(),w(i,r[0].prev,r[d-1].next)}Te(v,()=>{for(var p=0;p{var _=e();return oe(_)?_:_==null?[]:K(_)}),n,t;function l(){xe(t,n,h,A,s,v,r,u,e),d!==null&&(n.length===0?o?$(o):o=J(()=>d(s)):o!==null&&ce(o,()=>{o=null}))}re(()=>{t??=Ae,n=Q(M);var _=n.length;if(C&&_===0)return;C=_===0;let m=!1;if(D){var I=ie(s)===se;I!==(_===0)&&(s=W(),X(s),g(!1),m=!0)}if(D){for(var x=null,c,a=0;a<_;a++){if(O.nodeType===ue&&O.data===te){s=O,m=!0,g(!1);break}var f=n[a],E=u(f,a);c=P(O,h,x,null,f,E,a,v,r,e),h.items.set(E,c),x=c}_>0&&X(W())}if(D)_===0&&d&&(o=J(()=>d(s)));else if(ve()){var H=new Set,b=de;for(a=0;a<_;a+=1){f=n[a],E=u(f,a);var S=h.items.get(E)??A.get(E);S?(r&(Y|V))!==0&&j(S,f,a,r):(c=P(null,h,null,null,f,E,a,v,r,e,!0),A.set(E,c)),H.add(E)}for(const[N,L]of h.items)H.has(N)||b.skipped_effects.add(L.e);b.add_callback(l)}else l();m&&g(!0),Q(M)}),D&&(s=O)}function xe(i,r,e,u,v,d,s,h,T){var p=(s&Ne)!==0,o=(s&(Y|V))!==0,C=r.length,A=e.items,M=e.first,n=M,t,l=null,_,m=[],I=[],x,c,a,f;if(p)for(f=0;f0){var ee=(s&y)!==0&&C===0?v:null;if(p){for(f=0;f{if(_!==void 0)for(a of _)a.a?.apply()}),i.first=e.first&&e.first.e,i.last=l&&l.e;for(var ae of u.values())k(ae.e);u.clear()}function j(i,r,e,u){(u&Y)!==0&&Z(i.v,r),(u&V)!==0?Z(i.i,e):i.i=e}function P(i,r,e,u,v,d,s,h,T,p,o){var C=(T&Y)!==0,A=(T&he)===0,M=C?A?_e(v,!1,!1):z(v):v,n=(T&V)===0?s:z(s),t={i:n,v:M,k:d,a:null,e:null,prev:e,next:u};try{if(i===null){var l=document.createDocumentFragment();l.append(i=G())}return t.e=J(()=>h(i,M,n,p),D),t.e.prev=e&&e.e,t.e.next=u&&u.e,e===null?o||(r.first=t):(e.next=t,e.e.next=t.e),u!==null&&(u.prev=t,u.e.prev=t.e),t}finally{}}function F(i,r,e){for(var u=i.next?i.next.e.nodes_start:e,v=r?r.e.nodes_start:e,d=i.e.nodes_start;d!==null&&d!==u;){var s=Ee(d);v.before(d),d=s}}function w(i,r,e){r===null?i.first=e:(r.next=e,r.e.next=e&&e.e),e!==null&&(e.prev=r,e.e.prev=r&&r.e)}export{Se as e,Me as i}; diff --git a/webapp/assets/_app/immutable/chunks/Cqnw7O8j.js b/webapp/assets/_app/immutable/chunks/Cqnw7O8j.js new file mode 100644 index 00000000..601ebbff --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/Cqnw7O8j.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as j}from"./C7KraPli.js";import{p as E,E as G,f as S,d as t,r,s as g,u,q as p,z as m,t as q,e as z,i as f,b as D,c as H}from"./cPTQ2Ibn.js";import{h as y,s as h}from"./DqbUkQgD.js";import{p as v}from"./DqFqoVWr.js";import{g as o}from"./DJsB5Z5V.js";var I=S('
');function M(x,s){E(s,!1);const k=G();let i=v(s,"selectedForgeType",12,""),_=v(s,"label",8,"Select Forge Type");function n(c){i(c),k("select",c)}j();var d=I(),l=t(d),F=t(l,!0);r(l);var b=g(l,2),e=t(b),w=t(e);y(w,()=>(p(o),u(()=>o("github","w-8 h-8")))),m(2),r(e);var a=g(e,2),T=t(a);y(T,()=>(p(o),u(()=>o("gitea","w-8 h-8")))),m(2),r(a),r(b),r(d),q(()=>{z(F,_()),h(e,1,`flex flex-col items-center justify-center p-6 border-2 rounded-lg transition-colors cursor-pointer ${i()==="github"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),h(a,1,`flex flex-col items-center justify-center p-6 border-2 rounded-lg transition-colors cursor-pointer ${i()==="gitea"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`)}),f("click",e,()=>n("github")),f("click",a,()=>n("gitea")),D(x,d),H()}export{M as F}; diff --git a/webapp/assets/_app/immutable/chunks/CrNwrvNH.js b/webapp/assets/_app/immutable/chunks/CrNwrvNH.js deleted file mode 100644 index e2c6b06b..00000000 --- a/webapp/assets/_app/immutable/chunks/CrNwrvNH.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as W}from"./DT0EGONV.js";import{f as S,j as t,k as p,r as a,t as L,v as _,c as u,z as N,D as A,p as X,u as T,n as P,d as Y}from"./CRKWEg6v.js";import{p as s,i as I}from"./e1m7WRO5.js";import{s as Z,h as $,B as F,d as B,c as ee}from"./-esynYXT.js";import{D as te,G as ae,a as se}from"./B1coRVG4.js";import{E as le}from"./DF8ZTWYj.js";import{S as G}from"./B0Y2gXDu.js";var ne=S('
'),ie=S('
'),re=S('

');function ge(j,e){let n=s(e,"title",8),E=s(e,"subtitle",8),b=s(e,"forgeIcon",8,""),f=s(e,"onEdit",8,null),h=s(e,"onDelete",8,null),k=s(e,"editLabel",8,"Edit"),z=s(e,"deleteLabel",8,"Delete"),g=s(e,"titleClass",8,"");var c=re(),v=t(c),m=t(v),y=t(m),C=t(y);{var H=i=>{var r=ne(),w=t(r);$(w,b),a(r),u(i,r)};I(C,i=>{b()&&i(H)})}var l=p(C,2),D=t(l),V=t(D,!0);a(D);var M=p(D,2),R=t(M,!0);a(M),a(l),a(y);var q=p(y,2);{var J=i=>{var r=ie(),w=t(r);{var K=o=>{F(o,{variant:"secondary",size:"md",icon:"",$$events:{click(...d){f()?.apply(this,d)}},children:(d,U)=>{N();var x=A();L(()=>_(x,k())),u(d,x)},$$slots:{default:!0}})};I(w,o=>{f()&&o(K)})}var O=p(w,2);{var Q=o=>{F(o,{variant:"danger",size:"md",icon:"",$$events:{click(...d){h()?.apply(this,d)}},children:(d,U)=>{N();var x=A();L(()=>_(x,z())),u(d,x)},$$slots:{default:!0}})};I(O,o=>{h()&&o(Q)})}a(r),u(i,r)};I(q,i=>{(f()||h())&&i(J)})}a(m),a(v),a(c),L(()=>{Z(D,1,`text-2xl font-bold text-gray-900 dark:text-white ${g()??""}`),_(V,n()),_(R,E())}),u(j,c)}var oe=S('');function ye(j,e){X(e,!1);let n=s(e,"instances",8),E=s(e,"entityType",8),b=s(e,"onDeleteInstance",8);const f=[{key:"name",title:"Name",cellComponent:le,cellProps:{entityType:"instance",nameField:"name"}},{key:"status",title:"Status",cellComponent:G,cellProps:{statusType:"instance",statusField:"status"}},{key:"runner_status",title:"Runner Status",cellComponent:G,cellProps:{statusType:"instance",statusField:"runner_status"}},{key:"created",title:"Created",cellComponent:ae,cellProps:{field:"created_at",type:"date"}},{key:"actions",title:"Actions",align:"right",cellComponent:se,cellProps:{actions:[{type:"delete",label:"Delete",title:"Delete instance",ariaLabel:"Delete instance",action:"delete"}]}}],h={entityType:"instance",primaryText:{field:"name",isClickable:!0,href:"/instances/{name}"},secondaryText:{field:"provider_id"},badges:[{type:"status",field:"status"}],actions:[{type:"delete",handler:l=>k(l)}]};function k(l){b()(l)}function z(l){k(l.detail.item)}W();var g=oe(),c=t(g),v=t(c),m=t(v),y=t(m);a(m);var C=p(m,2);a(v);var H=p(v,2);te(H,{get columns(){return f},get data(){return n()},loading:!1,error:"",searchTerm:"",showSearch:!1,showPagination:!1,currentPage:1,get perPage(){return P(n()),T(()=>n().length)},totalPages:1,get totalItems(){return P(n()),T(()=>n().length)},itemName:"instances",emptyTitle:"No instances running",get emptyMessage(){return`No instances running for this ${E()??""}.`},emptyIconType:"cog",get mobileCardConfig(){return h},$$events:{delete:z}}),a(c),a(g),L(l=>{_(y,`Instances (${P(n()),T(()=>n().length)??""})`),ee(C,"href",l)},[()=>(P(B),T(()=>B("/instances")))]),u(j,g),Y()}export{ge as D,ye as I}; diff --git a/webapp/assets/_app/immutable/chunks/Cwu7L3Xf.js b/webapp/assets/_app/immutable/chunks/Cwu7L3Xf.js new file mode 100644 index 00000000..e19a6076 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/Cwu7L3Xf.js @@ -0,0 +1 @@ +import{ag as h,ah as t,u as b,ae as k,ai as S}from"./cPTQ2Ibn.js";function u(r,a){return r===a||r?.[S]===a}function d(r={},a,f,T){return h(()=>{var i,s;return t(()=>{i=s,s=[],b(()=>{r!==f(...s)&&(a(r,...s),i&&u(f(...i),r)&&a(null,...i))})}),()=>{k(()=>{s&&u(f(...s),r)&&a(null,...s)})}}),r}export{d as b}; diff --git a/webapp/assets/_app/immutable/chunks/DJsbLMno.js b/webapp/assets/_app/immutable/chunks/D6f8Dk7c.js similarity index 52% rename from webapp/assets/_app/immutable/chunks/DJsbLMno.js rename to webapp/assets/_app/immutable/chunks/D6f8Dk7c.js index 5af57108..09172b34 100644 --- a/webapp/assets/_app/immutable/chunks/DJsbLMno.js +++ b/webapp/assets/_app/immutable/chunks/D6f8Dk7c.js @@ -1,4 +1,4 @@ -import"./DsnmJJEf.js";import{i as g}from"./DT0EGONV.js";import{p as x,l as k,s as d,m as w,n as y,a as J,f as m,j as z,x as j,k as L,g as c,r as B,t as C,c as n,d as E}from"./CRKWEg6v.js";import{p as o,i as M}from"./e1m7WRO5.js";import{c as f,s as N}from"./-esynYXT.js";import{b as O}from"./B3a35v7J.js";var S=m('
'),V=m('
');function I(p,r){x(r,!1);let t=o(r,"value",12,""),u=o(r,"placeholder",8,"{}"),b=o(r,"rows",8,4),i=o(r,"disabled",8,!1),a=w(!0);k(()=>y(t()),()=>{if(t().trim())try{JSON.parse(t()),d(a,!0)}catch{d(a,!1)}else d(a,!0)}),J(),g();var l=V(),e=z(l);j(e);var v=L(e,2);{var h=s=>{var _=S();n(s,_)};M(v,s=>{c(a)||s(h)})}B(l),C(()=>{f(e,"placeholder",u()),f(e,"rows",b()),e.disabled=i(),N(e,1,`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 font-mono text-sm resize-none +import"./DsnmJJEf.js";import{i as g}from"./C7KraPli.js";import{p as x,l as k,k as d,m as w,q as y,h as J,f as b,d as z,x as L,s as j,g as c,r as q,t as B,b as f,c as C}from"./cPTQ2Ibn.js";import{p as o,i as E}from"./DqFqoVWr.js";import{c as n,s as M}from"./DqbUkQgD.js";import{b as N}from"./B-_QCM7E.js";var O=b('
'),S=b('
');function I(m,r){x(r,!1);let t=o(r,"value",12,""),p=o(r,"placeholder",8,"{}"),u=o(r,"rows",8,4),i=o(r,"disabled",8,!1),a=w(!0);k(()=>y(t()),()=>{if(t().trim())try{JSON.parse(t()),d(a,!0)}catch{d(a,!1)}else d(a,!0)}),J(),g();var l=S(),e=z(l);L(e);var v=j(e,2);{var h=s=>{var _=O();f(s,_)};E(v,s=>{c(a)||s(h)})}q(l),B(()=>{n(e,"placeholder",p()),n(e,"rows",u()),e.disabled=i(),M(e,1,`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 font-mono text-sm resize-none ${c(a)?"border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white":"border-red-300 dark:border-red-600 bg-red-50 dark:bg-red-900/20 text-red-900 dark:text-red-100"} ${i()?"opacity-50 cursor-not-allowed":""} - `)}),O(e,t),n(p,l),E()}export{I as J}; + `)}),N(e,t),f(m,l),C()}export{I as J}; diff --git a/webapp/assets/_app/immutable/chunks/D0m048VH.js b/webapp/assets/_app/immutable/chunks/D7e9zx6w.js similarity index 69% rename from webapp/assets/_app/immutable/chunks/D0m048VH.js rename to webapp/assets/_app/immutable/chunks/D7e9zx6w.js index 79f0b14f..4de5c05f 100644 --- a/webapp/assets/_app/immutable/chunks/D0m048VH.js +++ b/webapp/assets/_app/immutable/chunks/D7e9zx6w.js @@ -1 +1 @@ -const w=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function b(t){const s=[];return{pattern:t==="/"?/^\/$/:new RegExp(`^${_(t).map(a=>{const i=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(i)return s.push({name:i[1],matcher:i[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const c=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(c)return s.push({name:c[1],matcher:c[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const n=a.split(/\[(.+?)\](?!\])/);return"/"+n.map((e,u)=>{if(u%2){if(e.startsWith("x+"))return h(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith("u+"))return h(String.fromCharCode(...e.slice(2).split("-").map(g=>parseInt(g,16))));const o=w.exec(e),[,l,p,m,d]=o;return s.push({name:m,matcher:d,optional:!!l,rest:!!p,chained:p?u===1&&n[0]==="":!1}),p?"([^]*?)":l?"([^/]*)?":"([^/]+?)"}return h(e)}).join("")}).join("")}/?$`),params:s}}function $(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function _(t){return t.slice(1).split("/").filter($)}function j(t,s,f){const a={},i=t.slice(1),c=i.filter(r=>r!==void 0);let n=0;for(let r=0;ro).join("/"),n=0),u===void 0){e.rest&&(a[e.name]="");continue}if(!e.matcher||f[e.matcher](u)){a[e.name]=u;const o=s[r+1],l=i[r+1];o&&!o.rest&&o.optional&&l&&e.chained&&(n=0),!o&&!l&&Object.keys(a).length===c.length&&(n=0);continue}if(e.optional&&e.chained){n++;continue}return}if(!n)return a}function h(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}const v=/\[(\[)?(\.\.\.)?(\w+?)(?:=(\w+))?\]\]?/g;function k(t,s){return"/"+_(t).map(a=>a.replace(v,(i,c,n,r)=>{const e=s[r];if(!e){if(c||n&&e!==void 0)return"";throw new Error(`Missing parameter '${r}' in route ${t}`)}if(e.startsWith("/")||e.endsWith("/"))throw new Error(`Parameter '${r}' in route ${t} cannot start or end with a slash -- this would cause an invalid route like foo//bar`);return e})).filter(Boolean).join("/")}const x=globalThis.__sveltekit_o7cvpx?.base??"/ui",C=globalThis.__sveltekit_o7cvpx?.assets??x;export{C as a,x as b,j as e,b as p,k as r}; +const w=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function x(t){const s=[];return{pattern:t==="/"?/^\/$/:new RegExp(`^${_(t).map(a=>{const i=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(i)return s.push({name:i[1],matcher:i[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const c=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(c)return s.push({name:c[1],matcher:c[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const n=a.split(/\[(.+?)\](?!\])/);return"/"+n.map((e,u)=>{if(u%2){if(e.startsWith("x+"))return h(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith("u+"))return h(String.fromCharCode(...e.slice(2).split("-").map(g=>parseInt(g,16))));const o=w.exec(e),[,l,f,m,d]=o;return s.push({name:m,matcher:d,optional:!!l,rest:!!f,chained:f?u===1&&n[0]==="":!1}),f?"([^]*?)":l?"([^/]*)?":"([^/]+?)"}return h(e)}).join("")}).join("")}/?$`),params:s}}function $(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function _(t){return t.slice(1).split("/").filter($)}function j(t,s,p){const a={},i=t.slice(1),c=i.filter(r=>r!==void 0);let n=0;for(let r=0;ro).join("/"),n=0),u===void 0){e.rest&&(a[e.name]="");continue}if(!e.matcher||p[e.matcher](u)){a[e.name]=u;const o=s[r+1],l=i[r+1];o&&!o.rest&&o.optional&&l&&e.chained&&(n=0),!o&&!l&&Object.keys(a).length===c.length&&(n=0);continue}if(e.optional&&e.chained){n++;continue}return}if(!n)return a}function h(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}const b=/\[(\[)?(\.\.\.)?(\w+?)(?:=(\w+))?\]\]?/g;function k(t,s){return"/"+_(t).map(a=>a.replace(b,(i,c,n,r)=>{const e=s[r];if(!e){if(c||n&&e!==void 0)return"";throw new Error(`Missing parameter '${r}' in route ${t}`)}if(e.startsWith("/")||e.endsWith("/"))throw new Error(`Parameter '${r}' in route ${t} cannot start or end with a slash -- this would cause an invalid route like foo//bar`);return e})).filter(Boolean).join("/")}const v=globalThis.__sveltekit_ppz5de?.base??"/ui",C=globalThis.__sveltekit_ppz5de?.assets??v;export{C as a,v as b,j as e,x as p,k as r}; diff --git a/webapp/assets/_app/immutable/chunks/DF8ZTWYj.js b/webapp/assets/_app/immutable/chunks/DF8ZTWYj.js deleted file mode 100644 index aca1d2e5..00000000 --- a/webapp/assets/_app/immutable/chunks/DF8ZTWYj.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as R}from"./DT0EGONV.js";import{p as q,l as w,a as A,f as x,t as v,c as k,d as B,k as D,j as u,s as _,m as y,r as f,n as m,u as h,g as d,v as U}from"./CRKWEg6v.js";import{p as o,i as F}from"./e1m7WRO5.js";import{c as g,s as G,d as r}from"./-esynYXT.js";var H=x('
'),J=x('');function V(b,n){q(n,!1);const i=y(),p=y();let e=o(n,"item",8),s=o(n,"entityType",8,"repository"),E=o(n,"showOwner",8,!1),I=o(n,"showId",8,!1),z=o(n,"fontMono",8,!1);function C(){if(!e())return"Unknown";switch(s()){case"repository":return E()?`${e().owner||"Unknown"}/${e().name||"Unknown"}`:e().name||"Unknown";case"organization":case"enterprise":return e().name||"Unknown";case"pool":return I()?e().id||"Unknown":e().name||"Unknown";case"scaleset":return e().name||"Unknown";case"instance":return e().name||"Unknown";default:return e().name||e().id||"Unknown"}}function M(){if(!e())return"#";let t;switch(s()){case"instance":t=e().name;break;default:t=e().id||e().name;break}if(!t)return"#";switch(s()){case"repository":return r(`/repositories/${t}`);case"organization":return r(`/organizations/${t}`);case"enterprise":return r(`/enterprises/${t}`);case"pool":return r(`/pools/${t}`);case"scaleset":return r(`/scalesets/${t}`);case"instance":return r(`/instances/${encodeURIComponent(t)}`);default:return"#"}}w(()=>{},()=>{_(i,C())}),w(()=>{},()=>{_(p,M())}),A(),R();var c=J(),a=u(c),N=u(a,!0);f(a);var O=D(a);{var T=t=>{var l=H(),j=u(l,!0);f(l),v(()=>U(j,(m(e()),h(()=>e().provider_id)))),k(t,l)};F(O,t=>{m(s()),m(e()),h(()=>s()==="instance"&&e()?.provider_id)&&t(T)})}f(c),v(()=>{g(a,"href",d(p)),G(a,1,`block w-full truncate text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300 ${z()?"font-mono":""}`),g(a,"title",d(i)),U(N,d(i))}),k(b,c),B()}export{V as E}; diff --git a/webapp/assets/_app/immutable/chunks/DJ6ZD3Tj.js b/webapp/assets/_app/immutable/chunks/DJ6ZD3Tj.js deleted file mode 100644 index 4adeebac..00000000 --- a/webapp/assets/_app/immutable/chunks/DJ6ZD3Tj.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as nr}from"./DT0EGONV.js";import{p as lr,E as ur,m as n,o as br,s,l as cr,g as e,a as gr,f as C,j as t,r as d,k as o,n as v,u as m,t as p,y as je,z as vr,v as k,e as Be,c as l,D as T,B as ze,b as Ce,d as mr}from"./CRKWEg6v.js";import{p as pr,i as R}from"./e1m7WRO5.js";import{r as c,s as Le,b as Fe}from"./-esynYXT.js";import{b as f,a as fr}from"./B3a35v7J.js";import{p as xr}from"./D4Caz1gY.js";import{M as yr}from"./xe-4nY5o.js";import{e as _r}from"./BZiHL9L3.js";import{J as hr}from"./DJsbLMno.js";var kr=C('

'),wr=C('

'),Sr=C('
Updating...
'),Rr=C('

Scale Set Information

Provider:
Entity:

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Extra Specs (JSON)
');function Dr(He,ge){lr(ge,!1);let a=pr(ge,"scaleSet",8);const L=ur();let A=n(!1),N=n(""),u=n(""),P=n(a().name||""),U=n(a().image||""),D=n(a().flavor||""),x=n(a().max_runners),y=n(a().min_idle_runners),G=n(a().runner_bootstrap_timeout),$=n(a().runner_prefix||""),E=n(a().os_type||"linux"),O=n(a().os_arch||"amd64"),j=n(a()["github-runner-group"]||""),B=n(a().enabled),g=n("{}");br(()=>{if(a().extra_specs)try{if(typeof a().extra_specs=="object")s(g,JSON.stringify(a().extra_specs,null,2));else{const b=JSON.parse(a().extra_specs);s(g,JSON.stringify(b,null,2))}}catch{s(g,a().extra_specs||"{}")}});async function We(){try{if(s(A,!0),s(N,""),e(u))throw new Error(e(u));let b={};if(e(g).trim())try{b=JSON.parse(e(g))}catch{throw new Error("Invalid JSON in extra specs")}const I={name:e(P)!==a().name?e(P):void 0,image:e(U)!==a().image?e(U):void 0,flavor:e(D)!==a().flavor?e(D):void 0,max_runners:e(x)!==a().max_runners?e(x):void 0,min_idle_runners:e(y)!==a().min_idle_runners?e(y):void 0,runner_bootstrap_timeout:e(G)!==a().runner_bootstrap_timeout?e(G):void 0,runner_prefix:e($)!==a().runner_prefix?e($):void 0,os_type:e(E)!==a().os_type?e(E):void 0,os_arch:e(O)!==a().os_arch?e(O):void 0,"github-runner-group":e(j)!==a()["github-runner-group"]&&e(j)||void 0,enabled:e(B)!==a().enabled?e(B):void 0,extra_specs:e(g).trim()!==JSON.stringify(a().extra_specs||{},null,2).trim()?b:void 0};Object.keys(I).forEach(_=>{I[_]===void 0&&delete I[_]}),L("submit",I)}catch(b){s(N,_r(b))}finally{s(A,!1)}}cr(()=>(e(y),e(x)),()=>{e(y)!==null&&e(x)!==null&&e(y)>e(x)?s(u,"Min idle runners cannot be greater than max runners"):s(u,"")}),gr(),nr(),yr(He,{$$events:{close:()=>L("close")},children:(b,I)=>{var _=Rr(),F=t(_),ve=t(F),qe=t(ve);d(ve),d(F);var H=o(F,2),me=t(H);{var Ke=r=>{var i=kr(),h=t(i),J=t(h,!0);d(h),d(i),p(()=>k(J,e(N))),l(r,i)};R(me,r=>{e(N)&&r(Ke)})}var pe=o(me,2);{var Qe=r=>{var i=wr(),h=t(i),J=t(h,!0);d(h),d(i),p(()=>k(J,e(u))),l(r,i)};R(pe,r=>{e(u)&&r(Qe)})}var W=o(pe,2),fe=o(t(W),2),q=t(fe),xe=o(t(q),2),Ve=t(xe,!0);d(xe),d(q);var ye=o(q,2),_e=o(t(ye),2),Xe=t(_e);{var Ye=r=>{var i=T();p(()=>k(i,`Repository: ${v(a()),m(()=>a().repo_name)??""}`)),l(r,i)},Ze=r=>{var i=ze(),h=Ce(i);{var J=w=>{var M=T();p(()=>k(M,`Organization: ${v(a()),m(()=>a().org_name)??""}`)),l(w,M)},dr=w=>{var M=ze(),or=Ce(M);{var sr=S=>{var z=T();p(()=>k(z,`Enterprise: ${v(a()),m(()=>a().enterprise_name)??""}`)),l(S,z)},ir=S=>{var z=T("Unknown Entity");l(S,z)};R(or,S=>{v(a()),m(()=>a().enterprise_name)?S(sr):S(ir,!1)},!0)}l(w,M)};R(h,w=>{v(a()),m(()=>a().org_name)?w(J):w(dr,!1)},!0)}l(r,i)};R(Xe,r=>{v(a()),m(()=>a().repo_name)?r(Ye):r(Ze,!1)})}d(_e),d(ye),d(fe),d(W);var K=o(W,2),he=o(t(K),2);c(he),d(K);var Q=o(K,2),ke=o(t(Q),2),V=t(ke),we=o(t(V),2);c(we),d(V);var X=o(V,2),Se=o(t(X),2);c(Se),d(X);var Y=o(X,2),Z=o(t(Y),2);p(()=>{e(E),je(()=>{})});var ee=t(Z);ee.value=ee.__value="linux";var Re=o(ee);Re.value=Re.__value="windows",d(Z),d(Y);var Ee=o(Y,2),re=o(t(Ee),2);p(()=>{e(O),je(()=>{})});var ae=t(re);ae.value=ae.__value="amd64";var Oe=o(ae);Oe.value=Oe.__value="arm64",d(re),d(Ee),d(ke),d(Q);var te=o(Q,2),Ie=o(t(te),2),de=t(Ie),oe=o(t(de),2);c(oe),d(de);var se=o(de,2),ie=o(t(se),2);c(ie),d(se);var Je=o(se,2),Me=o(t(Je),2);c(Me),d(Je),d(Ie),d(te);var ne=o(te,2),le=o(t(ne),2),ue=t(le),Te=o(t(ue),2);c(Te),d(ue);var Ae=o(ue,2),Ne=o(t(Ae),2);c(Ne),d(Ae),d(le);var be=o(le,2),Pe=t(be),er=o(t(Pe),2);hr(er,{rows:4,placeholder:"{}",get value(){return e(g)},set value(r){s(g,r)},$$legacy:!0}),d(Pe),d(be);var Ue=o(be,2),De=t(Ue);c(De),vr(2),d(Ue),d(ne);var Ge=o(ne,2),$e=t(Ge),ce=o($e,2),rr=t(ce);{var ar=r=>{var i=Sr();l(r,i)},tr=r=>{var i=T("Update Scale Set");l(r,i)};R(rr,r=>{e(A)?r(ar):r(tr,!1)})}d(ce),d(Ge),d(H),d(_),p(()=>{k(qe,`Update Scale Set ${v(a()),m(()=>a().name)??""}`),k(Ve,(v(a()),m(()=>a().provider_name))),Le(oe,1,`w-full px-3 py-2 border ${e(u)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),Le(ie,1,`w-full px-3 py-2 border ${e(u)?"border-red-300 dark:border-red-500":"border-gray-300 dark:border-gray-600"} rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white`),ce.disabled=e(A)||e(u)!==""}),f(he,()=>e(P),r=>s(P,r)),f(we,()=>e(U),r=>s(U,r)),f(Se,()=>e(D),r=>s(D,r)),Fe(Z,()=>e(E),r=>s(E,r)),Fe(re,()=>e(O),r=>s(O,r)),f(oe,()=>e(y),r=>s(y,r)),f(ie,()=>e(x),r=>s(x,r)),f(Me,()=>e(G),r=>s(G,r)),f(Te,()=>e($),r=>s($,r)),f(Ne,()=>e(j),r=>s(j,r)),fr(De,()=>e(B),r=>s(B,r)),Be("click",$e,()=>L("close")),Be("submit",H,xr(We)),l(b,_)},$$slots:{default:!0}}),mr()}export{Dr as U}; diff --git a/webapp/assets/_app/immutable/chunks/c_t0vA9G.js b/webapp/assets/_app/immutable/chunks/DJsB5Z5V.js similarity index 89% rename from webapp/assets/_app/immutable/chunks/c_t0vA9G.js rename to webapp/assets/_app/immutable/chunks/DJsB5Z5V.js index 2f06af7d..bc301b15 100644 --- a/webapp/assets/_app/immutable/chunks/c_t0vA9G.js +++ b/webapp/assets/_app/immutable/chunks/DJsB5Z5V.js @@ -1,4 +1,4 @@ -import{d,s as w,f as x}from"./-esynYXT.js";import"./DsnmJJEf.js";import{i as k}from"./DT0EGONV.js";import{p as b,l as v,n as c,a as _,f as y,t as h,c as E,d as B,s as z,m as L,j as M,r as j,g as T,v as U}from"./CRKWEg6v.js";import{p as o}from"./e1m7WRO5.js";function A(e){if(!e)return"N/A";try{return(typeof e=="string"?new Date(e):e).toLocaleString()}catch{return"Invalid Date"}}function C(e,r="w-4 h-4"){return e==="gitea"?``:e==="github"?`
`:` +import{d,s as w,f as x}from"./DqbUkQgD.js";import"./DsnmJJEf.js";import{i as k}from"./C7KraPli.js";import{p as b,l as _,q as c,h as v,f as y,t as h,b as E,c as B,k as z,m as L,d as M,r as j,g as T,e as U}from"./cPTQ2Ibn.js";import{p as o}from"./DqFqoVWr.js";function q(e){if(!e)return"N/A";try{return(typeof e=="string"?new Date(e):e).toLocaleString()}catch{return"Invalid Date"}}function A(e,r="w-4 h-4"){return e==="gitea"?``:e==="github"?`
`:` - `}function H(e,r){if(e.repo_name)return e.repo_name;if(e.org_name)return e.org_name;if(e.enterprise_name)return e.enterprise_name;if(e.repo_id&&!e.repo_name&&r?.repositories){const n=r.repositories.find(t=>t.id===e.repo_id);return n?`${n.owner}/${n.name}`:"Unknown Entity"}if(e.org_id&&!e.org_name&&r?.organizations){const n=r.organizations.find(t=>t.id===e.org_id);return n&&n.name?n.name:"Unknown Entity"}if(e.enterprise_id&&!e.enterprise_name&&r?.enterprises){const n=r.enterprises.find(t=>t.id===e.enterprise_id);return n&&n.name?n.name:"Unknown Entity"}return"Unknown Entity"}function P(e){return e.repo_id?"repository":e.org_id?"organization":e.enterprise_id?"enterprise":"unknown"}function V(e){return e.repo_id?d(`/repositories/${e.repo_id}`):e.org_id?d(`/organizations/${e.org_id}`):e.enterprise_id?d(`/enterprises/${e.enterprise_id}`):"#"}function W(e){e&&(e.scrollTop=e.scrollHeight)}function q(e){return{newPerPage:e,newCurrentPage:1}}function G(e){return e.pool_manager_status?.running?{text:"Running",variant:"success"}:{text:"Stopped",variant:"error"}}function J(e){switch(e.toLowerCase()){case"error":return{text:"Error",variant:"error"};case"warning":return{text:"Warning",variant:"warning"};case"info":return{text:"Info",variant:"info"};default:return{text:e,variant:"info"}}}function l(e,r,n){if(!r.trim())return e;const t=r.toLowerCase();return e.filter(a=>typeof n=="function"?n(a).toLowerCase().includes(t):n.some(i=>a[i]?.toString().toLowerCase().includes(t)))}function K(e,r){return l(e,r,["name","owner"])}function O(e,r){return l(e,r,["name"])}function Q(e,r){return l(e,r,n=>[n.name||"",n.description||"",n.endpoint?.name||""].join(" "))}function X(e,r){return l(e,r,["name","description","base_url","api_base_url"])}function Y(e,r,n){return e.slice((r-1)*n,r*n)}var I=y(" ");function Z(e,r){b(r,!1);const n=L();let t=o(r,"variant",8,"gray"),a=o(r,"size",8,"sm"),i=o(r,"text",8),g=o(r,"ring",8,!1);const u={success:"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200",error:"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200",warning:"bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200",info:"bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200",gray:"bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200",blue:"bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200",green:"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200",red:"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200",yellow:"bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200",secondary:"bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200"},f={success:"ring-green-600/20 dark:ring-green-400/30",error:"ring-red-600/20 dark:ring-red-400/30",warning:"ring-yellow-600/20 dark:ring-yellow-400/30",info:"ring-blue-600/20 dark:ring-blue-400/30",gray:"ring-gray-500/20 dark:ring-gray-400/30",blue:"ring-blue-600/20 dark:ring-blue-400/30",green:"ring-green-600/20 dark:ring-green-400/30",red:"ring-red-600/20 dark:ring-red-400/30",yellow:"ring-yellow-600/20 dark:ring-yellow-400/30",secondary:"ring-gray-500/20 dark:ring-gray-400/30"},p={sm:"px-2 py-1 text-xs",md:"px-2.5 py-0.5 text-xs"};v(()=>(c(t()),c(a()),c(g())),()=>{z(n,["inline-flex items-center rounded-full font-semibold",u[t()],p[a()],g()?`ring-1 ring-inset ${f[t()]}`:""].filter(Boolean).join(" "))}),_(),k();var s=I(),m=M(s,!0);j(s),h(()=>{w(s,1,x(T(n))),U(m,i())}),E(e,s),B()}export{Z as B,X as a,A as b,q as c,J as d,H as e,Q as f,C as g,l as h,P as i,V as j,G as k,O as l,K as m,Y as p,W as s}; + `}function C(e,r){if(e.repo_name)return e.repo_name;if(e.org_name)return e.org_name;if(e.enterprise_name)return e.enterprise_name;if(e.repo_id&&!e.repo_name&&r?.repositories){const n=r.repositories.find(t=>t.id===e.repo_id);return n?`${n.owner}/${n.name}`:"Unknown Entity"}if(e.org_id&&!e.org_name&&r?.organizations){const n=r.organizations.find(t=>t.id===e.org_id);return n&&n.name?n.name:"Unknown Entity"}if(e.enterprise_id&&!e.enterprise_name&&r?.enterprises){const n=r.enterprises.find(t=>t.id===e.enterprise_id);return n&&n.name?n.name:"Unknown Entity"}return"Unknown Entity"}function H(e){return e.repo_id?"repository":e.org_id?"organization":e.enterprise_id?"enterprise":"unknown"}function P(e){return e.repo_id?d(`/repositories/${e.repo_id}`):e.org_id?d(`/organizations/${e.org_id}`):e.enterprise_id?d(`/enterprises/${e.enterprise_id}`):"#"}function V(e){e&&(e.scrollTop=e.scrollHeight)}function W(e){return{newPerPage:e,newCurrentPage:1}}function G(e){return e.pool_manager_status?.running?{text:"Running",variant:"success"}:{text:"Stopped",variant:"error"}}function J(e){switch(e.toLowerCase()){case"error":return{text:"Error",variant:"error"};case"warning":return{text:"Warning",variant:"warning"};case"info":return{text:"Info",variant:"info"};default:return{text:e,variant:"info"}}}function l(e,r,n){if(!r.trim())return e;const t=r.toLowerCase();return e.filter(a=>typeof n=="function"?n(a).toLowerCase().includes(t):n.some(i=>a[i]?.toString().toLowerCase().includes(t)))}function K(e,r){return l(e,r,["name","owner"])}function O(e,r){return l(e,r,["name"])}function Q(e,r){return l(e,r,n=>[n.name||"",n.description||"",n.endpoint?.name||""].join(" "))}function X(e,r){return l(e,r,["name","description","base_url","api_base_url"])}function Y(e,r,n){return e.slice((r-1)*n,r*n)}var I=y(" ");function Z(e,r){b(r,!1);const n=L();let t=o(r,"variant",8,"gray"),a=o(r,"size",8,"sm"),i=o(r,"text",8),g=o(r,"ring",8,!1);const u={success:"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200",error:"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200",warning:"bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200",info:"bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200",gray:"bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200",blue:"bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200",green:"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200",red:"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200",yellow:"bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200",secondary:"bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200"},f={success:"ring-green-600/20 dark:ring-green-400/30",error:"ring-red-600/20 dark:ring-red-400/30",warning:"ring-yellow-600/20 dark:ring-yellow-400/30",info:"ring-blue-600/20 dark:ring-blue-400/30",gray:"ring-gray-500/20 dark:ring-gray-400/30",blue:"ring-blue-600/20 dark:ring-blue-400/30",green:"ring-green-600/20 dark:ring-green-400/30",red:"ring-red-600/20 dark:ring-red-400/30",yellow:"ring-yellow-600/20 dark:ring-yellow-400/30",secondary:"ring-gray-500/20 dark:ring-gray-400/30"},p={sm:"px-2 py-1 text-xs",md:"px-2.5 py-0.5 text-xs"};_(()=>(c(t()),c(a()),c(g())),()=>{z(n,["inline-flex items-center rounded-full font-semibold",u[t()],p[a()],g()?`ring-1 ring-inset ${f[t()]}`:""].filter(Boolean).join(" "))}),v(),k();var s=I(),m=M(s,!0);j(s),h(()=>{w(s,1,x(T(n))),U(m,i())}),E(e,s),B()}export{Z as B,X as a,q as b,W as c,J as d,C as e,Q as f,A as g,l as h,H as i,P as j,G as k,O as l,K as m,Y as p,V as s}; diff --git a/webapp/assets/_app/immutable/chunks/DPR9Z_fe.js b/webapp/assets/_app/immutable/chunks/DPR9Z_fe.js new file mode 100644 index 00000000..8298cdfd --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/DPR9Z_fe.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as it}from"./C7KraPli.js";import{p as st,E as lt,m as n,o as nt,l as zr,g as e,h as ut,f as x,s as r,d as o,r as a,t as p,i as q,b as u,e as M,a as de,z as Ye,y as Q,u as v,k as d,D as X,c as bt,B as Ir,q as vt}from"./cPTQ2Ibn.js";import{p as Ar,i as E}from"./DqFqoVWr.js";import{e as ie,i as se}from"./CiWDXYQd.js";import{s as Ze,r as C,b as Y,g as D,c as jr,d as $r}from"./DqbUkQgD.js";import{b as $,a as ct}from"./B-_QCM7E.js";import{p as gt}from"./D4Caz1gY.js";import{M as pt}from"./Bo3f8OIz.js";import{e as le}from"./BZiHL9L3.js";import{J as ft}from"./D6f8Dk7c.js";var mt=x('

'),yt=x('
'),xt=x(""),_t=x(''),ht=x('
'),kt=x(""),wt=x(''),Et=x('
Loading templates...
'),Tt=x(""),Mt=x('

Templates define how the runner software is installed and configured.

',1),Pt=x('

Create a template first or proceed without a template to use default behavior.

'),Rt=x('

Select an entity first to see available templates

'),St=x(' '),Ct=x('
'),zt=x('

Entity & Provider Configuration

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Extra Specs (JSON)
',1),It=x('
Creating...
'),At=x('

Create New Pool

Entity Level *
');function Vt(Or,ne){st(ne,!1);const Z=lt();let ue=Ar(ne,"initialEntityType",8,""),er=Ar(ne,"initialEntityId",8,""),ee=n(!1),O=n(""),f=n(ue()),B=n([]),be=n([]),P=n([]),ve=n(!1),ce=n(!1),ge=n(!1),m=n(er()),G=n(""),V=n(""),F=n(""),pe=n(void 0),fe=n(void 0),me=n(void 0),ye=n(100),xe=n("garm"),T=n("linux"),re=n("amd64"),_e=n(""),he=n(!0),z=n([]),J=n(""),K=n("{}"),I=n(void 0);async function Br(){try{d(ce,!0),d(be,await D.listProviders())}catch(i){d(O,le(i))}finally{d(ce,!1)}}async function rr(){try{d(ge,!0);const i=ke();if(!i){d(P,[]);return}if(d(P,await D.listTemplates(e(T),void 0,i)),!e(I)||!e(P).find(g=>g.id===e(I))){const g=e(P).find(H=>H.owner_id==="system");g?d(I,g.id):e(P).length>0&&d(I,e(P)[0].id)}}catch(i){d(O,le(i))}finally{d(ge,!1)}}function ke(){if(!e(m)||!e(B))return null;const i=e(B).find(g=>g.id===e(m));if(!i)return null;if("forge_type"in i)return i.forge_type;if("endpoint"in i){const g=i.endpoint;if(g&&"endpoint_type"in g)return g.endpoint_type||null}return"github"}async function tr(){if(e(f))try{switch(d(ve,!0),d(B,[]),e(f)){case"repository":d(B,await D.listRepositories());break;case"organization":d(B,await D.listOrganizations());break;case"enterprise":d(B,await D.listEnterprises());break}}catch(i){d(O,le(i))}finally{d(ve,!1)}}function we(i){e(f)!==i&&(d(f,i),d(m,""),d(I,void 0),tr())}function ar(){e(J).trim()&&!e(z).includes(e(J).trim())&&(d(z,[...e(z),e(J).trim()]),d(J,""))}function Hr(i){d(z,e(z).filter((g,H)=>H!==i))}function Lr(i){i.key==="Enter"&&(i.preventDefault(),ar())}async function qr(){if(!e(f)||!e(m)||!e(G)||!e(V)||!e(F)){d(O,"Please fill in all required fields");return}try{d(ee,!0),d(O,"");let i={};if(e(K).trim())try{i=JSON.parse(e(K))}catch{throw new Error("Invalid JSON in extra specs")}const g={provider_name:e(G),image:e(V),flavor:e(F),max_runners:e(pe)||10,min_idle_runners:e(fe)||0,runner_bootstrap_timeout:e(me)||20,priority:e(ye),runner_prefix:e(xe),os_type:e(T),os_arch:e(re),"github-runner-group":e(_e)||void 0,enabled:e(he),tags:e(z),extra_specs:e(K).trim()?i:void 0,template_id:e(I)};if(ue()&&er())Z("submit",g);else{switch(e(f)){case"repository":await D.createRepositoryPool(e(m),g);break;case"organization":await D.createOrganizationPool(e(m),g);break;case"enterprise":await D.createEnterprisePool(e(m),g);break;default:throw new Error("Invalid entity level")}Z("submit",g)}}catch(i){d(O,le(i))}finally{d(ee,!1)}}nt(()=>{Br(),ue()&&tr()}),zr(()=>(e(m),e(T)),()=>{e(m)&&e(T)&&rr()}),zr(()=>(e(T),e(m)),()=>{e(T)&&e(m)&&rr()}),ut(),it(),pt(Or,{$$events:{close:()=>Z("close")},children:(i,g)=>{var H=At(),Ee=r(o(H),2),or=o(Ee);{var Dr=k=>{var R=mt(),N=o(R),te=o(N,!0);a(N),a(R),p(()=>M(te,e(O))),u(k,R)};E(or,k=>{e(O)&&k(Dr)})}var Te=r(or,2),dr=r(o(Te),2),Me=o(dr),Pe=r(Me,2),ir=r(Pe,2);a(dr),a(Te);var sr=r(Te,2);{var Gr=k=>{var R=zt(),N=de(R),te=r(o(N),2),Se=o(te),Ce=o(Se),Fr=o(Ce);Ye(),a(Ce);var Kr=r(Ce,2);{var Ur=t=>{var b=yt();u(t,b)},Wr=t=>{var b=_t();p(()=>{e(m),Q(()=>{e(f),e(B)})});var w=o(b),L=o(w);a(w),w.value=w.__value="";var A=r(w);ie(A,1,()=>e(B),se,(c,s)=>{var y=xt(),j=o(y);{var U=l=>{var h=X();p(()=>M(h,`${e(s),v(()=>e(s).owner)??""}/${e(s),v(()=>e(s).name)??""} (${e(s),v(()=>e(s).endpoint?.name)??""})`)),u(l,h)},S=l=>{var h=X();p(()=>M(h,`${e(s),v(()=>e(s).name)??""} (${e(s),v(()=>e(s).endpoint?.name)??""})`)),u(l,h)};E(j,l=>{e(f)==="repository"?l(U):l(S,!1)})}a(y);var _={};p(()=>{_!==(_=(e(s),v(()=>e(s).id)))&&(y.value=(y.__value=(e(s),v(()=>e(s).id)))??"")}),u(c,y)}),a(b),p(()=>M(L,`Select a ${e(f)??""}`)),Y(b,()=>e(m),c=>d(m,c)),u(t,b)};E(Kr,t=>{e(ve)?t(Ur):t(Wr,!1)})}a(Se);var ur=r(Se,2),Qr=r(o(ur),2);{var Xr=t=>{var b=ht();u(t,b)},Yr=t=>{var b=wt();p(()=>{e(G),Q(()=>{e(be)})});var w=o(b);w.value=w.__value="";var L=r(w);ie(L,1,()=>e(be),se,(A,c)=>{var s=kt(),y=o(s,!0);a(s);var j={};p(()=>{M(y,(e(c),v(()=>e(c).name))),j!==(j=(e(c),v(()=>e(c).name)))&&(s.value=(s.__value=(e(c),v(()=>e(c).name)))??"")}),u(A,s)}),a(b),Y(b,()=>e(G),A=>d(G,A)),u(t,b)};E(Qr,t=>{e(ce)?t(Xr):t(Yr,!1)})}a(ur),a(te),a(N);var ze=r(N,2),Ie=r(o(ze),2),Ae=o(Ie),br=r(o(Ae),2);C(br),a(Ae);var je=r(Ae,2),vr=r(o(je),2);C(vr),a(je);var $e=r(je,2),Oe=r(o($e),2);p(()=>{e(T),Q(()=>{})});var Be=o(Oe);Be.value=Be.__value="linux";var cr=r(Be);cr.value=cr.__value="windows",a(Oe),a($e);var gr=r($e,2),He=r(o(gr),2);p(()=>{e(re),Q(()=>{})});var Le=o(He);Le.value=Le.__value="amd64";var pr=r(Le);pr.value=pr.__value="arm64",a(He),a(gr),a(Ie);var fr=r(Ie,2),Zr=r(o(fr),2);{var et=t=>{var b=Et();u(t,b)},rt=t=>{var b=Ir(),w=de(b);{var L=c=>{var s=Mt(),y=de(s);p(()=>{e(I),Q(()=>{e(P)})}),ie(y,5,()=>e(P),se,(_,l)=>{var h=Tt(),W=o(h),We=r(W);{var Qe=Xe=>{var Cr=X();p(()=>M(Cr,`- ${e(l),v(()=>e(l).description)??""}`)),u(Xe,Cr)};E(We,Xe=>{e(l),v(()=>e(l).description)&&Xe(Qe)})}a(h);var oe={};p(()=>{M(W,`${e(l),v(()=>e(l).name)??""} ${e(l),v(()=>e(l).owner_id==="system"?"(System)":"")??""} `),oe!==(oe=(e(l),v(()=>e(l).id)))&&(h.value=(h.__value=(e(l),v(()=>e(l).id)))??"")}),u(_,h)}),a(y);var j=r(y,2),U=r(o(j));{var S=_=>{var l=X();p(h=>M(l,`Showing templates for ${h??""} ${e(T)??""}.`),[()=>v(ke)]),u(_,l)};E(U,_=>{e(m)&&_(S)})}a(j),Y(y,()=>e(I),_=>d(I,_)),u(c,s)},A=c=>{var s=Ir(),y=de(s);{var j=S=>{var _=Pt(),l=o(_),h=o(l);a(l);var W=r(l,2),We=o(W);Ye(),a(W),a(_),p((Qe,oe)=>{M(h,`No templates found for ${Qe??""} ${e(T)??""}.`),jr(We,"href",oe)},[()=>v(ke),()=>(vt($r),v(()=>$r("/templates")))]),u(S,_)},U=S=>{var _=Rt();u(S,_)};E(y,S=>{e(m)?S(j):S(U,!1)},!0)}u(c,s)};E(w,c=>{e(P),v(()=>e(P).length>0)?c(L):c(A,!1)},!0)}u(t,b)};E(Zr,t=>{e(ge)?t(et):t(rt,!1)})}a(fr),a(ze);var qe=r(ze,2),mr=r(o(qe),2),De=o(mr),yr=r(o(De),2);C(yr),a(De);var Ge=r(De,2),xr=r(o(Ge),2);C(xr),a(Ge);var _r=r(Ge,2),hr=r(o(_r),2);C(hr),a(_r),a(mr),a(qe);var kr=r(qe,2),Je=r(o(kr),2),Ne=o(Je),wr=r(o(Ne),2);C(wr),a(Ne);var Ve=r(Ne,2),Er=r(o(Ve),2);C(Er),a(Ve);var Tr=r(Ve,2),Mr=r(o(Tr),2);C(Mr),a(Tr),a(Je);var Fe=r(Je,2),Pr=r(o(Fe),2),Ke=o(Pr),ae=o(Ke);C(ae);var tt=r(ae,2);a(Ke);var at=r(Ke,2);{var ot=t=>{var b=Ct();ie(b,5,()=>e(z),se,(w,L,A)=>{var c=St(),s=o(c),y=r(s);a(c),p(()=>{M(s,`${e(L)??""} `),jr(y,"aria-label",`Remove tag ${e(L)}`)}),q("click",y,()=>Hr(A)),u(w,c)}),a(b),u(t,b)};E(at,t=>{e(z),v(()=>e(z).length>0)&&t(ot)})}a(Pr),a(Fe);var Ue=r(Fe,2),dt=r(o(Ue),2);ft(dt,{rows:4,placeholder:"{}",get value(){return e(K)},set value(t){d(K,t)},$$legacy:!0}),a(Ue);var Rr=r(Ue,2),Sr=o(Rr);C(Sr),Ye(2),a(Rr),a(kr),p(t=>M(Fr,`${t??""} `),[()=>(e(f),v(()=>e(f).charAt(0).toUpperCase()+e(f).slice(1)))]),$(br,()=>e(V),t=>d(V,t)),$(vr,()=>e(F),t=>d(F,t)),Y(Oe,()=>e(T),t=>d(T,t)),Y(He,()=>e(re),t=>d(re,t)),$(yr,()=>e(fe),t=>d(fe,t)),$(xr,()=>e(pe),t=>d(pe,t)),$(hr,()=>e(me),t=>d(me,t)),$(wr,()=>e(xe),t=>d(xe,t)),$(Er,()=>e(ye),t=>d(ye,t)),$(Mr,()=>e(_e),t=>d(_e,t)),$(ae,()=>e(J),t=>d(J,t)),q("keydown",ae,Lr),q("click",tt,ar),ct(Sr,()=>e(he),t=>d(he,t)),u(k,R)};E(sr,k=>{e(f)&&k(Gr)})}var lr=r(sr,2),nr=o(lr),Re=r(nr,2),Jr=o(Re);{var Nr=k=>{var R=It();u(k,R)},Vr=k=>{var R=X("Create Pool");u(k,R)};E(Jr,k=>{e(ee)?k(Nr):k(Vr,!1)})}a(Re),a(lr),a(Ee),a(H),p(()=>{Ze(Me,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(f)==="repository"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),Ze(Pe,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(f)==="organization"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),Ze(ir,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(f)==="enterprise"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),Re.disabled=e(ee)||!e(f)||!e(m)||!e(G)||!e(V)||!e(F)}),q("click",Me,()=>we("repository")),q("click",Pe,()=>we("organization")),q("click",ir,()=>we("enterprise")),q("click",nr,()=>Z("close")),q("submit",Ee,gt(qr)),u(i,H)},$$slots:{default:!0}}),bt()}export{Vt as C}; diff --git a/webapp/assets/_app/immutable/chunks/B0m3rqSR.js b/webapp/assets/_app/immutable/chunks/DVsSf1wv.js similarity index 71% rename from webapp/assets/_app/immutable/chunks/B0m3rqSR.js rename to webapp/assets/_app/immutable/chunks/DVsSf1wv.js index 94b72004..05ef291e 100644 --- a/webapp/assets/_app/immutable/chunks/B0m3rqSR.js +++ b/webapp/assets/_app/immutable/chunks/DVsSf1wv.js @@ -1 +1 @@ -import{s as e}from"./Dkb9lSSG.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p}; +import{s as e}from"./CTvJf3dP.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p}; diff --git a/webapp/assets/_app/immutable/chunks/Ddit_D7n.js b/webapp/assets/_app/immutable/chunks/Ddit_D7n.js deleted file mode 100644 index edc3fc19..00000000 --- a/webapp/assets/_app/immutable/chunks/Ddit_D7n.js +++ /dev/null @@ -1 +0,0 @@ -import{K as l,L as u,M as m,N as _,O as p,P as h,Q as v,R as b,T,U as g}from"./CRKWEg6v.js";function y(s,i,d){l&&u();var r=s,a,n,e=null,t=null;function f(){n&&(g(n),n=null),e&&(e.lastChild.remove(),r.before(e),e=null),n=t,t=null}m(()=>{if(a!==(a=i())){var c=b();if(a){var o=r;c&&(e=document.createDocumentFragment(),e.append(o=p())),t=h(()=>d(o,a))}c?v.add_callback(f):f()}},_),l&&(r=T)}export{y as c}; diff --git a/webapp/assets/_app/immutable/chunks/Djd10kRn.js b/webapp/assets/_app/immutable/chunks/Djd10kRn.js deleted file mode 100644 index a4e4f67d..00000000 --- a/webapp/assets/_app/immutable/chunks/Djd10kRn.js +++ /dev/null @@ -1 +0,0 @@ -import{I as p,J as l}from"./CRKWEg6v.js";import{g as d}from"./-esynYXT.js";import{w as r}from"./C73ZVvpW.js";const f={repositories:[],organizations:[],enterprises:[],pools:[],scalesets:[],credentials:[],endpoints:[],controllerInfo:null,loading:{repositories:!1,organizations:!1,enterprises:!1,pools:!1,scalesets:!1,credentials:!1,endpoints:!1,controllerInfo:!1},loaded:{repositories:!1,organizations:!1,enterprises:!1,pools:!1,scalesets:!1,credentials:!1,endpoints:!1,controllerInfo:!1},errorMessages:{repositories:"",organizations:"",enterprises:"",pools:"",scalesets:"",credentials:"",endpoints:"",controllerInfo:""}},a=p(f);class u{unsubscribers=[];loadingPromises=new Map;retryAttempts=new Map;MAX_RETRIES=3;RETRY_DELAY_MS=1e3;websocketStatusUnsubscriber=null;async loadResource(e,t=!1){if(this.loadingPromises.has(e))return this.loadingPromises.get(e);a.update(o=>({...o,loading:{...o.loading,[e]:!0},errorMessages:{...o.errorMessages,[e]:""}}));const s=this.attemptLoad(e);this.loadingPromises.set(e,s);try{const o=await s;return a.update(n=>({...n,[e]:o,loading:{...n.loading,[e]:!1},loaded:{...n.loaded,[e]:!0},errorMessages:{...n.errorMessages,[e]:""}})),this.retryAttempts.delete(e),t&&this.startBackgroundLoading(e),o}catch(o){const n=o instanceof Error?o.message:"Failed to load data";throw a.update(i=>({...i,loading:{...i.loading,[e]:!1},errorMessages:{...i.errorMessages,[e]:n}})),console.error(`Failed to load ${e}:`,o),o}finally{this.loadingPromises.delete(e)}}async attemptLoad(e){const t=(this.retryAttempts.get(e)||0)+1;this.retryAttempts.set(e,t);try{let s;switch(e){case"repositories":s=d.listRepositories();break;case"organizations":s=d.listOrganizations();break;case"enterprises":s=d.listEnterprises();break;case"pools":s=d.listAllPools();break;case"scalesets":s=d.listScaleSets();break;case"credentials":s=d.listAllCredentials();break;case"endpoints":s=d.listAllEndpoints();break;case"controllerInfo":s=d.getControllerInfo();break;default:throw new Error(`Unknown resource type: ${e}`)}return await s}catch(s){if(tsetTimeout(n,o)),this.attemptLoad(e)}else throw console.error(`All ${this.MAX_RETRIES} attempts failed for ${e}:`,s),s}}async startBackgroundLoading(e){const s=["repositories","organizations","enterprises","pools","scalesets","credentials","endpoints"].filter(o=>o!==e);for(const o of s)setTimeout(()=>{this.loadResource(o,!1).catch(n=>{console.warn(`Background loading failed for ${o}:`,n)})},100*s.indexOf(o))}retryResource(e){return this.retryAttempts.delete(e),this.loadResource(e,!0)}setupWebSocketSubscriptions(){this.cleanup();const e=[r.subscribeToEntity("repository",["create","update","delete"],this.handleRepositoryEvent.bind(this)),r.subscribeToEntity("organization",["create","update","delete"],this.handleOrganizationEvent.bind(this)),r.subscribeToEntity("enterprise",["create","update","delete"],this.handleEnterpriseEvent.bind(this)),r.subscribeToEntity("pool",["create","update","delete"],this.handlePoolEvent.bind(this)),r.subscribeToEntity("scaleset",["create","update","delete"],this.handleScaleSetEvent.bind(this)),r.subscribeToEntity("controller",["update"],this.handleControllerEvent.bind(this)),r.subscribeToEntity("github_credentials",["create","update","delete"],this.handleCredentialsEvent.bind(this)),r.subscribeToEntity("gitea_credentials",["create","update","delete"],this.handleCredentialsEvent.bind(this)),r.subscribeToEntity("github_endpoint",["create","update","delete"],this.handleEndpointEvent.bind(this))];this.unsubscribers=e,this.setupWebSocketStatusMonitoring()}setupWebSocketStatusMonitoring(){this.websocketStatusUnsubscriber&&this.websocketStatusUnsubscriber();let e=!1;this.websocketStatusUnsubscriber=r.subscribe(t=>{t.connected&&!e&&(console.log("[EagerCache] WebSocket connected - reinitializing cache"),this.initializeAllResources()),e=t.connected})}async initializeAllResources(){const t=["repositories","organizations","enterprises","pools","scalesets","credentials","endpoints","controllerInfo"].map(s=>this.loadResource(s,!0).catch(o=>{console.warn(`Failed to reload ${s} on WebSocket reconnect:`,o)}));await Promise.allSettled(t)}handleRepositoryEvent(e){a.update(t=>{if(!t.loaded.repositories)return t;const s=[...t.repositories],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,repositories:s}})}handleOrganizationEvent(e){a.update(t=>{if(!t.loaded.organizations)return t;const s=[...t.organizations],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,organizations:s}})}handleEnterpriseEvent(e){a.update(t=>{if(!t.loaded.enterprises)return t;const s=[...t.enterprises],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,enterprises:s}})}handlePoolEvent(e){a.update(t=>{if(!t.loaded.pools)return t;const s=[...t.pools],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,pools:s}})}handleScaleSetEvent(e){a.update(t=>{if(!t.loaded.scalesets)return t;const s=[...t.scalesets],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,scalesets:s}})}handleCredentialsEvent(e){a.update(t=>{if(!t.loaded.credentials)return t;const s=[...t.credentials],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,credentials:s}})}handleEndpointEvent(e){a.update(t=>{if(!t.loaded.endpoints)return t;const s=[...t.endpoints],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.name===o.name);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.name:o,i=s.findIndex(c=>c.name===n);i!==-1&&s.splice(i,1)}return{...t,endpoints:s}})}cleanup(){this.unsubscribers.forEach(e=>e()),this.unsubscribers=[],this.websocketStatusUnsubscriber&&(this.websocketStatusUnsubscriber(),this.websocketStatusUnsubscriber=null)}shouldUseCache(){return l(r).connected}async getRepositories(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching repositories directly from API"),await d.listRepositories();const t=l(a);return t.loaded.repositories?t.repositories:this.loadResource("repositories",!0)}async getOrganizations(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching organizations directly from API"),await d.listOrganizations();const t=l(a);return t.loaded.organizations?t.organizations:this.loadResource("organizations",!0)}async getEnterprises(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching enterprises directly from API"),await d.listEnterprises();const t=l(a);return t.loaded.enterprises?t.enterprises:this.loadResource("enterprises",!0)}async getPools(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching pools directly from API"),await d.listAllPools();const t=l(a);return t.loaded.pools?t.pools:this.loadResource("pools",!0)}async getScaleSets(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching scalesets directly from API"),await d.listScaleSets();const t=l(a);return t.loaded.scalesets?t.scalesets:this.loadResource("scalesets",!0)}async getCredentials(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching credentials directly from API"),await d.listAllCredentials();const t=l(a);return t.loaded.credentials?t.credentials:this.loadResource("credentials",!0)}async getEndpoints(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching endpoints directly from API"),await d.listAllEndpoints();const t=l(a);return t.loaded.endpoints?t.endpoints:this.loadResource("endpoints",!0)}async getControllerInfo(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching controller info directly from API"),await d.getControllerInfo();const t=l(a);return t.loaded.controllerInfo?t.controllerInfo:this.loadResource("controllerInfo",!0)}handleControllerEvent(e){a.update(t=>{if(!t.loaded.controllerInfo)return t;const s=e.payload;return e.operation==="update"?{...t,controllerInfo:s}:t})}}const h=new u;typeof window<"u"&&h.setupWebSocketSubscriptions();export{h as a,a as e}; diff --git a/webapp/assets/_app/immutable/chunks/DliFOxtc.js b/webapp/assets/_app/immutable/chunks/DliFOxtc.js new file mode 100644 index 00000000..76835d62 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/DliFOxtc.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as D}from"./C7KraPli.js";import{p as P,f as I,d as s,r as n,s as u,u as l,q as i,t as w,e as S,b as N,c as A}from"./cPTQ2Ibn.js";import{d as f,c as F}from"./DqbUkQgD.js";import{p as d}from"./DqFqoVWr.js";import{D as E,G,A as j}from"./Du50aAe5.js";import{E as q}from"./CPFytHjx.js";import{S as g}from"./BZ2WxPPD.js";var L=I('');function O(y,a){P(a,!1);let e=d(a,"instances",8),h=d(a,"entityType",8),v=d(a,"onDeleteInstance",8);const b=[{key:"name",title:"Name",cellComponent:q,cellProps:{entityType:"instance",nameField:"name"}},{key:"status",title:"Status",cellComponent:g,cellProps:{statusType:"instance",statusField:"status"}},{key:"runner_status",title:"Runner Status",cellComponent:g,cellProps:{statusType:"instance",statusField:"runner_status"}},{key:"created",title:"Created",cellComponent:G,cellProps:{field:"created_at",type:"date"}},{key:"actions",title:"Actions",align:"right",cellComponent:j,cellProps:{actions:[{type:"delete",label:"Delete",title:"Delete instance",ariaLabel:"Delete instance",action:"delete"}]}}],x={entityType:"instance",primaryText:{field:"name",isClickable:!0,href:"/instances/{name}"},secondaryText:{field:"provider_id"},badges:[{type:"status",field:"status"}],actions:[{type:"delete",handler:t=>m(t)}]};function m(t){v()(t)}function C(t){m(t.detail.item)}D();var r=L(),p=s(r),o=s(p),c=s(o),T=s(c);n(c);var _=u(c,2);n(o);var k=u(o,2);E(k,{get columns(){return b},get data(){return e()},loading:!1,error:"",searchTerm:"",showSearch:!1,showPagination:!1,currentPage:1,get perPage(){return i(e()),l(()=>e().length)},totalPages:1,get totalItems(){return i(e()),l(()=>e().length)},itemName:"instances",emptyTitle:"No instances running",get emptyMessage(){return`No instances running for this ${h()??""}.`},emptyIconType:"cog",get mobileCardConfig(){return x},$$events:{delete:C}}),n(p),n(r),w(t=>{S(T,`Instances (${i(e()),l(()=>e().length)??""})`),F(_,"href",t)},[()=>(i(f),l(()=>f("/instances")))]),N(y,r),A()}export{O as I}; diff --git a/webapp/assets/_app/immutable/chunks/DqFqoVWr.js b/webapp/assets/_app/immutable/chunks/DqFqoVWr.js new file mode 100644 index 00000000..a4446885 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/DqFqoVWr.js @@ -0,0 +1 @@ +import{J as Y,H as T,I as C,K as F,T as j,U as G,V as H,R as $,W as x,L as q,M as A,N as z,at as J,O as Z,a3 as Q,Q as V,P as W,au as D,m as X,av as k,k as U,G as ee,g as P,aw as re,ax as ne,ay as w,az as se,aA as M,ar as ae,v as ie,aB as te,ac as R,aC as ue,_ as fe,aD as le,u as oe,aE as ce,aF as de,aG as _e,aH as N,aI as L,aJ as pe,aK as ve,ai as B,aL as K,aM as m}from"./cPTQ2Ibn.js";function Ie(e,r,s=!1){T&&C();var n=e,a=null,i=null,l=J,d=s?F:0,p=!1;const S=(o,u=!0)=>{p=!0,_(u,o)};var f=null;function I(){f!==null&&(f.lastChild.remove(),n.before(f),f=null);var o=l?a:i,u=l?i:a;o&&Q(o),u&&V(u,()=>{l?i=null:a=null})}const _=(o,u)=>{if(l===(l=o))return;let g=!1;if(T){const E=j(n)===G;!!l===E&&(n=H(),$(n),x(!1),g=!0)}var b=Z(),c=n;if(b&&(f=document.createDocumentFragment(),f.append(c=q())),l?a??=u&&A(()=>u(c)):i??=u&&A(()=>u(c)),b){var h=z,t=l?a:i,v=l?i:a;t&&h.skipped_effects.delete(t),v&&h.skipped_effects.add(v),h.add_callback(I)}else I();g&&x(!0)};Y(()=>{p=!1,r(S),p||_(null,null)},d),T&&(n=W)}let O=!1,y=Symbol();function ge(e,r,s){const n=s[r]??={store:null,source:X(void 0),unsubscribe:D};if(n.store!==e&&!(y in s))if(n.unsubscribe(),n.store=e??null,e==null)n.source.v=void 0,n.unsubscribe=D;else{var a=!0;n.unsubscribe=k(e,i=>{a?n.source.v=i:U(n.source,i)}),a=!1}return e&&y in s?ee(e):P(n.source)}function Ee(){const e={};function r(){re(()=>{for(var s in e)e[s].unsubscribe();ne(e,y,{enumerable:!1,value:!0})})}return[e,r]}function be(e){var r=O;try{return O=!1,[e(),O]}finally{O=r}}const he={get(e,r){if(!e.exclude.includes(r))return P(e.version),r in e.special?e.special[r]():e.props[r]},set(e,r,s){if(!(r in e.special)){var n=R;try{L(e.parent_effect),e.special[r]=Pe({get[r](){return e.props[r]}},r,M)}finally{L(n)}}return e.special[r](s),N(e.version),!0},getOwnPropertyDescriptor(e,r){if(!e.exclude.includes(r)&&r in e.props)return{enumerable:!0,configurable:!0,value:e.props[r]}},deleteProperty(e,r){return e.exclude.includes(r)||(e.exclude.push(r),N(e.version)),!0},has(e,r){return e.exclude.includes(r)?!1:r in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(r=>!e.exclude.includes(r))}};function Oe(e,r){return new Proxy({props:e,exclude:r,special:{},version:fe(0),parent_effect:R},he)}const me={get(e,r){let s=e.props.length;for(;s--;){let n=e.props[s];if(m(n)&&(n=n()),typeof n=="object"&&n!==null&&r in n)return n[r]}},set(e,r,s){let n=e.props.length;for(;n--;){let a=e.props[n];m(a)&&(a=a());const i=w(a,r);if(i&&i.set)return i.set(s),!0}return!1},getOwnPropertyDescriptor(e,r){let s=e.props.length;for(;s--;){let n=e.props[s];if(m(n)&&(n=n()),typeof n=="object"&&n!==null&&r in n){const a=w(n,r);return a&&!a.configurable&&(a.configurable=!0),a}}},has(e,r){if(r===B||r===K)return!1;for(let s of e.props)if(m(s)&&(s=s()),s!=null&&r in s)return!0;return!1},ownKeys(e){const r=[];for(let s of e.props)if(m(s)&&(s=s()),!!s){for(const n in s)r.includes(n)||r.push(n);for(const n of Object.getOwnPropertySymbols(s))r.includes(n)||r.push(n)}return r}};function Te(...e){return new Proxy({props:e},me)}function Pe(e,r,s,n){var a=!ce||(s&de)!==0,i=(s&le)!==0,l=(s&pe)!==0,d=n,p=!0,S=()=>(p&&(p=!1,d=l?oe(n):n),d),f;if(i){var I=B in e||K in e;f=w(e,r)?.set??(I&&r in e?t=>e[r]=t:void 0)}var _,o=!1;i?[_,o]=be(()=>e[r]):_=e[r],_===void 0&&n!==void 0&&(_=S(),f&&(a&&se(),f(_)));var u;if(a?u=()=>{var t=e[r];return t===void 0?S():(p=!0,t)}:u=()=>{var t=e[r];return t!==void 0&&(d=void 0),t===void 0?d:t},a&&(s&M)===0)return u;if(f){var g=e.$$legacy;return function(t,v){return arguments.length>0?((!a||!v||g||o)&&f(v?u():t),t):u()}}var b=!1,c=((s&_e)!==0?ae:ie)(()=>(b=!1,u()));i&&P(c);var h=R;return function(t,v){if(arguments.length>0){const E=v?P(c):a&&i?te(t):t;return U(c,E),b=!0,d!==void 0&&(d=E),t}return ve&&b||(h.f&ue)!==0?c.v:P(c)}}export{ge as a,Te as b,Ie as i,Oe as l,Pe as p,Ee as s}; diff --git a/webapp/assets/_app/immutable/chunks/DqbUkQgD.js b/webapp/assets/_app/immutable/chunks/DqbUkQgD.js new file mode 100644 index 00000000..8ab1387c --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/DqbUkQgD.js @@ -0,0 +1,7 @@ +import{b as zr,r as Gr}from"./D7e9zx6w.js";import"./DsnmJJEf.js";import{i as _r}from"./C7KraPli.js";import{t as ke,H as ee,I as ot,ac as qr,aW as Hr,P as At,X as $r,a8 as Nr,aX as Wr,aY as Qr,aZ as Rt,R as Mr,a_ as Jr,S as Le,J as nr,a7 as nt,M as lr,ag as ut,a1 as Kr,a$ as Xr,b0 as Yr,aw as Zr,ak as es,b1 as ts,b2 as rs,b3 as ss,b4 as as,g as F,b5 as os,b6 as ns,W as yt,b7 as ls,b8 as is,b9 as cs,ba as ps,bb as ds,at as hs,bc as us,bd as Os,be as Ps,p as ms,E as bs,l as se,h as Vs,f as Ss,i as As,b as ye,c as Rs,q as ce,m as ae,k as oe,d as Xe,s as ft,r as Ye,C as Ot,B as ys,a as fs}from"./cPTQ2Ibn.js";import{l as wt,p as ne,i as Ze}from"./DqFqoVWr.js";function It(r,e,t=!1,s=!1,o=!1){var a=r,n="";ke(()=>{var l=qr;if(n===(n=e()??"")){ee&&ot();return}if(l.nodes_start!==null&&(Hr(l.nodes_start,l.nodes_end),l.nodes_start=l.nodes_end=null),n!==""){if(ee){At.data;for(var i=ot(),c=i;i!==null&&(i.nodeType!==$r||i.data!=="");)c=i,i=Nr(i);if(i===null)throw Wr(),Qr;Rt(At,c),a=Mr(i);return}var p=n+"";t?p=`${p}`:s&&(p=`${p}`);var R=Jr(p);if((t||s)&&(R=Le(R)),Rt(Le(R),R.lastChild),t||s)for(;Le(R);)a.before(Le(R));else a.before(R)}})}function ws(r,e,t,s,o){ee&&ot();var a=e.$$slots?.[t],n=!1;a===!0&&(a=e[t==="default"?"children":t],n=!0),a===void 0||a(r,n?()=>s:s)}function Is(r,e){var t=void 0,s;nr(()=>{t!==(t=e())&&(s&&(nt(s),s=null),t&&(s=lr(()=>{ut(()=>t(r))})))})}function ir(r){var e,t,s="";if(typeof r=="string"||typeof r=="number")s+=r;else if(typeof r=="object")if(Array.isArray(r)){var o=r.length;for(e=0;e=0;){var l=n+a;(n===0||Et.includes(s[n-1]))&&(l===s.length||Et.includes(s[l]))?s=(n===0?"":s.substring(0,n))+s.substring(l+1):n=l}}return s===""?null:s}function gt(r,e=!1){var t=e?" !important;":";",s="";for(var o in r){var a=r[o];a!=null&&a!==""&&(s+=" "+o+": "+a+t)}return s}function et(r){return r[0]!=="-"||r[1]!=="-"?r.toLowerCase():r}function vs(r,e){if(e){var t="",s,o;if(Array.isArray(e)?(s=e[0],o=e[1]):s=e,r){r=String(r).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var a=!1,n=0,l=!1,i=[];s&&i.push(...Object.keys(s).map(et)),o&&i.push(...Object.keys(o).map(et));var c=0,p=-1;const f=r.length;for(var R=0;R{qe(r,r.__value)});e.observe(r,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Zr(()=>{e.disconnect()})}function _o(r,e,t=e){var s=!0;es(r,"change",o=>{var a=o?"[selected]":":checked",n;if(r.multiple)n=[].map.call(r.querySelectorAll(a),ge);else{var l=r.querySelector(a)??r.querySelector("option:not([disabled])");n=l&&ge(l)}t(n)}),ut(()=>{var o=e();if(qe(r,o,s),s&&o===void 0){var a=r.querySelector(":checked");a!==null&&(o=ge(a),t(o))}r.__value=o,s=!1}),cr(r)}function ge(r){return"__value"in r?r.__value:r.value}const fe=Symbol("class"),we=Symbol("style"),pr=Symbol("is custom element"),dr=Symbol("is html");function qo(r){if(ee){var e=!1,t=()=>{if(!e){if(e=!0,r.hasAttribute("value")){var s=r.value;He(r,"value",null),r.value=s}if(r.hasAttribute("checked")){var o=r.checked;He(r,"checked",null),r.checked=o}}};r.__on_r=t,us(t),Os()}}function Ho(r,e){var t=Pt(r);t.value===(t.value=e??void 0)||r.value===e&&(e!==0||r.nodeName!=="PROGRESS")||(r.value=e??"")}function Cs(r,e){e?r.hasAttribute("selected")||r.setAttribute("selected",""):r.removeAttribute("selected")}function He(r,e,t,s){var o=Pt(r);ee&&(o[e]=r.getAttribute(e),e==="src"||e==="srcset"||e==="href"&&r.nodeName==="LINK")||o[e]!==(o[e]=t)&&(e==="loading"&&(r[rs]=t),t==null?r.removeAttribute(e):typeof t!="string"&&hr(r).includes(e)?r[e]=t:r.setAttribute(e,t))}function Ts(r,e,t,s,o=!1){var a=Pt(r),n=a[pr],l=!a[dr];let i=ee&&n;i&&yt(!1);var c=e||{},p=r.tagName==="OPTION";for(var R in e)R in t||(t[R]=null);t.class?t.class=gs(t.class):t[fe]&&(t.class=null),t[we]&&(t.style??=null);var I=hr(r);for(const E in t){let g=t[E];if(p&&E==="value"&&g==null){r.value=r.__value="",c[E]=g;continue}if(E==="class"){var B=r.namespaceURI==="http://www.w3.org/1999/xhtml";Fe(r,B,g,s,e?.[fe],t[fe]),c[E]=g,c[fe]=t[fe];continue}if(E==="style"){Us(r,g,e?.[we],t[we]),c[E]=g,c[we]=t[we];continue}var y=c[E];if(!(g===y&&!(g===void 0&&r.hasAttribute(E)))){c[E]=g;var f=E[0]+E[1];if(f!=="$$")if(f==="on"){const T={},D="$$"+E;let C=E.slice(2);var w=Ps(C);if(ls(C)&&(C=C.slice(0,-7),T.capture=!0),!w&&y){if(g!=null)continue;r.removeEventListener(C,c[D],T),c[D]=null}if(g!=null)if(w)r[`__${C}`]=g,cs([C]);else{let ie=function(te){c[E].call(this,te)};c[D]=is(C,r,ie,T)}else w&&(r[`__${C}`]=void 0)}else if(E==="style")He(r,E,g);else if(E==="autofocus")ps(r,!!g);else if(!n&&(E==="__value"||E==="value"&&g!=null))r.value=r.__value=g;else if(E==="selected"&&p)Cs(r,g);else{var U=E;l||(U=ds(U));var j=U==="defaultValue"||U==="defaultChecked";if(g==null&&!n&&!j)if(a[E]=null,U==="value"||U==="checked"){let T=r;const D=e===void 0;if(U==="value"){let C=T.defaultValue;T.removeAttribute(U),T.defaultValue=C,T.value=T.__value=D?C:null}else{let C=T.defaultChecked;T.removeAttribute(U),T.defaultChecked=C,T.checked=D?C:!1}}else r.removeAttribute(E);else j||I.includes(U)&&(n||typeof g!="string")?(r[U]=g,U in a&&(a[U]=hs)):typeof g!="function"&&He(r,U,g)}}}return i&&yt(!0),c}function Bs(r,e,t=[],s=[],o,a=!1){ts(t,s,n=>{var l=void 0,i={},c=r.nodeName==="SELECT",p=!1;if(nr(()=>{var I=e(...n.map(F)),B=Ts(r,l,I,o,a);p&&c&&"value"in I&&qe(r,I.value);for(let f of Object.getOwnPropertySymbols(i))I[f]||nt(i[f]);for(let f of Object.getOwnPropertySymbols(I)){var y=I[f];f.description===os&&(!l||y!==l[f])&&(i[f]&&nt(i[f]),i[f]=lr(()=>Is(r,()=>y))),B[f]=y}l=B}),c){var R=r;ut(()=>{qe(R,l.value,!0),cr(R)})}p=!0})}function Pt(r){return r.__attributes??={[pr]:r.nodeName.includes("-"),[dr]:r.namespaceURI===ss}}var xt=new Map;function hr(r){var e=xt.get(r.nodeName);if(e)return e;xt.set(r.nodeName,e=[]);for(var t,s=r,o=Element.prototype;o!==s;){t=ns(s);for(var a in t)t[a].set&&e.push(a);s=as(s)}return e}function $o(r,e){return zr+Gr(r,e)}function ur(r,e){return function(){return r.apply(e,arguments)}}const{toString:Ds}=Object.prototype,{getPrototypeOf:mt}=Object,{iterator:Ne,toStringTag:Or}=Symbol,We=(r=>e=>{const t=Ds.call(e);return r[t]||(r[t]=t.slice(8,-1).toLowerCase())})(Object.create(null)),J=r=>(r=r.toLowerCase(),e=>We(e)===r),Qe=r=>e=>typeof e===r,{isArray:Se}=Array,Ve=Qe("undefined");function xe(r){return r!==null&&!Ve(r)&&r.constructor!==null&&!Ve(r.constructor)&&$(r.constructor.isBuffer)&&r.constructor.isBuffer(r)}const Pr=J("ArrayBuffer");function Ls(r){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(r):e=r&&r.buffer&&Pr(r.buffer),e}const js=Qe("string"),$=Qe("function"),mr=Qe("number"),ve=r=>r!==null&&typeof r=="object",ks=r=>r===!0||r===!1,ze=r=>{if(We(r)!=="object")return!1;const e=mt(r);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Or in r)&&!(Ne in r)},Fs=r=>{if(!ve(r)||xe(r))return!1;try{return Object.keys(r).length===0&&Object.getPrototypeOf(r)===Object.prototype}catch{return!1}},zs=J("Date"),Gs=J("File"),_s=J("Blob"),qs=J("FileList"),Hs=r=>ve(r)&&$(r.pipe),$s=r=>{let e;return r&&(typeof FormData=="function"&&r instanceof FormData||$(r.append)&&((e=We(r))==="formdata"||e==="object"&&$(r.toString)&&r.toString()==="[object FormData]"))},Ns=J("URLSearchParams"),[Ws,Qs,Ms,Js]=["ReadableStream","Request","Response","Headers"].map(J),Ks=r=>r.trim?r.trim():r.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ue(r,e,{allOwnKeys:t=!1}={}){if(r===null||typeof r>"u")return;let s,o;if(typeof r!="object"&&(r=[r]),Se(r))for(s=0,o=r.length;s0;)if(o=t[s],e===o.toLowerCase())return o;return null}const pe=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Vr=r=>!Ve(r)&&r!==pe;function lt(){const{caseless:r,skipUndefined:e}=Vr(this)&&this||{},t={},s=(o,a)=>{const n=r&&br(t,a)||a;ze(t[n])&&ze(o)?t[n]=lt(t[n],o):ze(o)?t[n]=lt({},o):Se(o)?t[n]=o.slice():(!e||!Ve(o))&&(t[n]=o)};for(let o=0,a=arguments.length;o(Ue(e,(o,a)=>{t&&$(o)?r[a]=ur(o,t):r[a]=o},{allOwnKeys:s}),r),Ys=r=>(r.charCodeAt(0)===65279&&(r=r.slice(1)),r),Zs=(r,e,t,s)=>{r.prototype=Object.create(e.prototype,s),r.prototype.constructor=r,Object.defineProperty(r,"super",{value:e.prototype}),t&&Object.assign(r.prototype,t)},ea=(r,e,t,s)=>{let o,a,n;const l={};if(e=e||{},r==null)return e;do{for(o=Object.getOwnPropertyNames(r),a=o.length;a-- >0;)n=o[a],(!s||s(n,r,e))&&!l[n]&&(e[n]=r[n],l[n]=!0);r=t!==!1&&mt(r)}while(r&&(!t||t(r,e))&&r!==Object.prototype);return e},ta=(r,e,t)=>{r=String(r),(t===void 0||t>r.length)&&(t=r.length),t-=e.length;const s=r.indexOf(e,t);return s!==-1&&s===t},ra=r=>{if(!r)return null;if(Se(r))return r;let e=r.length;if(!mr(e))return null;const t=new Array(e);for(;e-- >0;)t[e]=r[e];return t},sa=(r=>e=>r&&e instanceof r)(typeof Uint8Array<"u"&&mt(Uint8Array)),aa=(r,e)=>{const s=(r&&r[Ne]).call(r);let o;for(;(o=s.next())&&!o.done;){const a=o.value;e.call(r,a[0],a[1])}},oa=(r,e)=>{let t;const s=[];for(;(t=r.exec(e))!==null;)s.push(t);return s},na=J("HTMLFormElement"),la=r=>r.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(t,s,o){return s.toUpperCase()+o}),vt=(({hasOwnProperty:r})=>(e,t)=>r.call(e,t))(Object.prototype),ia=J("RegExp"),Sr=(r,e)=>{const t=Object.getOwnPropertyDescriptors(r),s={};Ue(t,(o,a)=>{let n;(n=e(o,a,r))!==!1&&(s[a]=n||o)}),Object.defineProperties(r,s)},ca=r=>{Sr(r,(e,t)=>{if($(r)&&["arguments","caller","callee"].indexOf(t)!==-1)return!1;const s=r[t];if($(s)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+t+"'")})}})},pa=(r,e)=>{const t={},s=o=>{o.forEach(a=>{t[a]=!0})};return Se(r)?s(r):s(String(r).split(e)),t},da=()=>{},ha=(r,e)=>r!=null&&Number.isFinite(r=+r)?r:e;function ua(r){return!!(r&&$(r.append)&&r[Or]==="FormData"&&r[Ne])}const Oa=r=>{const e=new Array(10),t=(s,o)=>{if(ve(s)){if(e.indexOf(s)>=0)return;if(xe(s))return s;if(!("toJSON"in s)){e[o]=s;const a=Se(s)?[]:{};return Ue(s,(n,l)=>{const i=t(n,o+1);!Ve(i)&&(a[l]=i)}),e[o]=void 0,a}}return s};return t(r,0)},Pa=J("AsyncFunction"),ma=r=>r&&(ve(r)||$(r))&&$(r.then)&&$(r.catch),Ar=((r,e)=>r?setImmediate:e?((t,s)=>(pe.addEventListener("message",({source:o,data:a})=>{o===pe&&a===t&&s.length&&s.shift()()},!1),o=>{s.push(o),pe.postMessage(t,"*")}))(`axios@${Math.random()}`,[]):t=>setTimeout(t))(typeof setImmediate=="function",$(pe.postMessage)),ba=typeof queueMicrotask<"u"?queueMicrotask.bind(pe):typeof process<"u"&&process.nextTick||Ar,Va=r=>r!=null&&$(r[Ne]),h={isArray:Se,isArrayBuffer:Pr,isBuffer:xe,isFormData:$s,isArrayBufferView:Ls,isString:js,isNumber:mr,isBoolean:ks,isObject:ve,isPlainObject:ze,isEmptyObject:Fs,isReadableStream:Ws,isRequest:Qs,isResponse:Ms,isHeaders:Js,isUndefined:Ve,isDate:zs,isFile:Gs,isBlob:_s,isRegExp:ia,isFunction:$,isStream:Hs,isURLSearchParams:Ns,isTypedArray:sa,isFileList:qs,forEach:Ue,merge:lt,extend:Xs,trim:Ks,stripBOM:Ys,inherits:Zs,toFlatObject:ea,kindOf:We,kindOfTest:J,endsWith:ta,toArray:ra,forEachEntry:aa,matchAll:oa,isHTMLForm:na,hasOwnProperty:vt,hasOwnProp:vt,reduceDescriptors:Sr,freezeMethods:ca,toObjectSet:pa,toCamelCase:la,noop:da,toFiniteNumber:ha,findKey:br,global:pe,isContextDefined:Vr,isSpecCompliantForm:ua,toJSONObject:Oa,isAsyncFn:Pa,isThenable:ma,setImmediate:Ar,asap:ba,isIterable:Va};function v(r,e,t,s,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=r,this.name="AxiosError",e&&(this.code=e),t&&(this.config=t),s&&(this.request=s),o&&(this.response=o,this.status=o.status?o.status:null)}h.inherits(v,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:h.toJSONObject(this.config),code:this.code,status:this.status}}});const Rr=v.prototype,yr={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(r=>{yr[r]={value:r}});Object.defineProperties(v,yr);Object.defineProperty(Rr,"isAxiosError",{value:!0});v.from=(r,e,t,s,o,a)=>{const n=Object.create(Rr);h.toFlatObject(r,n,function(p){return p!==Error.prototype},c=>c!=="isAxiosError");const l=r&&r.message?r.message:"Error",i=e==null&&r?r.code:e;return v.call(n,l,i,t,s,o),r&&n.cause==null&&Object.defineProperty(n,"cause",{value:r,configurable:!0}),n.name=r&&r.name||"Error",a&&Object.assign(n,a),n};const Sa=null;function it(r){return h.isPlainObject(r)||h.isArray(r)}function fr(r){return h.endsWith(r,"[]")?r.slice(0,-2):r}function Ut(r,e,t){return r?r.concat(e).map(function(o,a){return o=fr(o),!t&&a?"["+o+"]":o}).join(t?".":""):e}function Aa(r){return h.isArray(r)&&!r.some(it)}const Ra=h.toFlatObject(h,{},null,function(e){return/^is[A-Z]/.test(e)});function Me(r,e,t){if(!h.isObject(r))throw new TypeError("target must be an object");e=e||new FormData,t=h.toFlatObject(t,{metaTokens:!0,dots:!1,indexes:!1},!1,function(f,w){return!h.isUndefined(w[f])});const s=t.metaTokens,o=t.visitor||p,a=t.dots,n=t.indexes,i=(t.Blob||typeof Blob<"u"&&Blob)&&h.isSpecCompliantForm(e);if(!h.isFunction(o))throw new TypeError("visitor must be a function");function c(y){if(y===null)return"";if(h.isDate(y))return y.toISOString();if(h.isBoolean(y))return y.toString();if(!i&&h.isBlob(y))throw new v("Blob is not supported. Use a Buffer instead.");return h.isArrayBuffer(y)||h.isTypedArray(y)?i&&typeof Blob=="function"?new Blob([y]):Buffer.from(y):y}function p(y,f,w){let U=y;if(y&&!w&&typeof y=="object"){if(h.endsWith(f,"{}"))f=s?f:f.slice(0,-2),y=JSON.stringify(y);else if(h.isArray(y)&&Aa(y)||(h.isFileList(y)||h.endsWith(f,"[]"))&&(U=h.toArray(y)))return f=fr(f),U.forEach(function(E,g){!(h.isUndefined(E)||E===null)&&e.append(n===!0?Ut([f],g,a):n===null?f:f+"[]",c(E))}),!1}return it(y)?!0:(e.append(Ut(w,f,a),c(y)),!1)}const R=[],I=Object.assign(Ra,{defaultVisitor:p,convertValue:c,isVisitable:it});function B(y,f){if(!h.isUndefined(y)){if(R.indexOf(y)!==-1)throw Error("Circular reference detected in "+f.join("."));R.push(y),h.forEach(y,function(U,j){(!(h.isUndefined(U)||U===null)&&o.call(e,U,h.isString(j)?j.trim():j,f,I))===!0&&B(U,f?f.concat(j):[j])}),R.pop()}}if(!h.isObject(r))throw new TypeError("data must be an object");return B(r),e}function Ct(r){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(r).replace(/[!'()~]|%20|%00/g,function(s){return e[s]})}function bt(r,e){this._pairs=[],r&&Me(r,this,e)}const wr=bt.prototype;wr.append=function(e,t){this._pairs.push([e,t])};wr.toString=function(e){const t=e?function(s){return e.call(this,s,Ct)}:Ct;return this._pairs.map(function(o){return t(o[0])+"="+t(o[1])},"").join("&")};function ya(r){return encodeURIComponent(r).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Ir(r,e,t){if(!e)return r;const s=t&&t.encode||ya;h.isFunction(t)&&(t={serialize:t});const o=t&&t.serialize;let a;if(o?a=o(e,t):a=h.isURLSearchParams(e)?e.toString():new bt(e,t).toString(s),a){const n=r.indexOf("#");n!==-1&&(r=r.slice(0,n)),r+=(r.indexOf("?")===-1?"?":"&")+a}return r}class Tt{constructor(){this.handlers=[]}use(e,t,s){return this.handlers.push({fulfilled:e,rejected:t,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){h.forEach(this.handlers,function(s){s!==null&&e(s)})}}const Er={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},fa=typeof URLSearchParams<"u"?URLSearchParams:bt,wa=typeof FormData<"u"?FormData:null,Ia=typeof Blob<"u"?Blob:null,Ea={isBrowser:!0,classes:{URLSearchParams:fa,FormData:wa,Blob:Ia},protocols:["http","https","file","blob","url","data"]},Vt=typeof window<"u"&&typeof document<"u",ct=typeof navigator=="object"&&navigator||void 0,ga=Vt&&(!ct||["ReactNative","NativeScript","NS"].indexOf(ct.product)<0),xa=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",va=Vt&&window.location.href||"http://localhost",Ua=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Vt,hasStandardBrowserEnv:ga,hasStandardBrowserWebWorkerEnv:xa,navigator:ct,origin:va},Symbol.toStringTag,{value:"Module"})),q={...Ua,...Ea};function Ca(r,e){return Me(r,new q.classes.URLSearchParams,{visitor:function(t,s,o,a){return q.isNode&&h.isBuffer(t)?(this.append(s,t.toString("base64")),!1):a.defaultVisitor.apply(this,arguments)},...e})}function Ta(r){return h.matchAll(/\w+|\[(\w*)]/g,r).map(e=>e[0]==="[]"?"":e[1]||e[0])}function Ba(r){const e={},t=Object.keys(r);let s;const o=t.length;let a;for(s=0;s=t.length;return n=!n&&h.isArray(o)?o.length:n,i?(h.hasOwnProp(o,n)?o[n]=[o[n],s]:o[n]=s,!l):((!o[n]||!h.isObject(o[n]))&&(o[n]=[]),e(t,s,o[n],a)&&h.isArray(o[n])&&(o[n]=Ba(o[n])),!l)}if(h.isFormData(r)&&h.isFunction(r.entries)){const t={};return h.forEachEntry(r,(s,o)=>{e(Ta(s),o,t,0)}),t}return null}function Da(r,e,t){if(h.isString(r))try{return(e||JSON.parse)(r),h.trim(r)}catch(s){if(s.name!=="SyntaxError")throw s}return(t||JSON.stringify)(r)}const Ce={transitional:Er,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const s=t.getContentType()||"",o=s.indexOf("application/json")>-1,a=h.isObject(e);if(a&&h.isHTMLForm(e)&&(e=new FormData(e)),h.isFormData(e))return o?JSON.stringify(gr(e)):e;if(h.isArrayBuffer(e)||h.isBuffer(e)||h.isStream(e)||h.isFile(e)||h.isBlob(e)||h.isReadableStream(e))return e;if(h.isArrayBufferView(e))return e.buffer;if(h.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let l;if(a){if(s.indexOf("application/x-www-form-urlencoded")>-1)return Ca(e,this.formSerializer).toString();if((l=h.isFileList(e))||s.indexOf("multipart/form-data")>-1){const i=this.env&&this.env.FormData;return Me(l?{"files[]":e}:e,i&&new i,this.formSerializer)}}return a||o?(t.setContentType("application/json",!1),Da(e)):e}],transformResponse:[function(e){const t=this.transitional||Ce.transitional,s=t&&t.forcedJSONParsing,o=this.responseType==="json";if(h.isResponse(e)||h.isReadableStream(e))return e;if(e&&h.isString(e)&&(s&&!this.responseType||o)){const n=!(t&&t.silentJSONParsing)&&o;try{return JSON.parse(e,this.parseReviver)}catch(l){if(n)throw l.name==="SyntaxError"?v.from(l,v.ERR_BAD_RESPONSE,this,null,this.response):l}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:q.classes.FormData,Blob:q.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};h.forEach(["delete","get","head","post","put","patch"],r=>{Ce.headers[r]={}});const La=h.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ja=r=>{const e={};let t,s,o;return r&&r.split(` +`).forEach(function(n){o=n.indexOf(":"),t=n.substring(0,o).trim().toLowerCase(),s=n.substring(o+1).trim(),!(!t||e[t]&&La[t])&&(t==="set-cookie"?e[t]?e[t].push(s):e[t]=[s]:e[t]=e[t]?e[t]+", "+s:s)}),e},Bt=Symbol("internals");function Ie(r){return r&&String(r).trim().toLowerCase()}function Ge(r){return r===!1||r==null?r:h.isArray(r)?r.map(Ge):String(r)}function ka(r){const e=Object.create(null),t=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=t.exec(r);)e[s[1]]=s[2];return e}const Fa=r=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(r.trim());function rt(r,e,t,s,o){if(h.isFunction(s))return s.call(this,e,t);if(o&&(e=t),!!h.isString(e)){if(h.isString(s))return e.indexOf(s)!==-1;if(h.isRegExp(s))return s.test(e)}}function za(r){return r.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,s)=>t.toUpperCase()+s)}function Ga(r,e){const t=h.toCamelCase(" "+e);["get","set","has"].forEach(s=>{Object.defineProperty(r,s+t,{value:function(o,a,n){return this[s].call(this,e,o,a,n)},configurable:!0})})}let N=class{constructor(e){e&&this.set(e)}set(e,t,s){const o=this;function a(l,i,c){const p=Ie(i);if(!p)throw new Error("header name must be a non-empty string");const R=h.findKey(o,p);(!R||o[R]===void 0||c===!0||c===void 0&&o[R]!==!1)&&(o[R||i]=Ge(l))}const n=(l,i)=>h.forEach(l,(c,p)=>a(c,p,i));if(h.isPlainObject(e)||e instanceof this.constructor)n(e,t);else if(h.isString(e)&&(e=e.trim())&&!Fa(e))n(ja(e),t);else if(h.isObject(e)&&h.isIterable(e)){let l={},i,c;for(const p of e){if(!h.isArray(p))throw TypeError("Object iterator must return a key-value pair");l[c=p[0]]=(i=l[c])?h.isArray(i)?[...i,p[1]]:[i,p[1]]:p[1]}n(l,t)}else e!=null&&a(t,e,s);return this}get(e,t){if(e=Ie(e),e){const s=h.findKey(this,e);if(s){const o=this[s];if(!t)return o;if(t===!0)return ka(o);if(h.isFunction(t))return t.call(this,o,s);if(h.isRegExp(t))return t.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=Ie(e),e){const s=h.findKey(this,e);return!!(s&&this[s]!==void 0&&(!t||rt(this,this[s],s,t)))}return!1}delete(e,t){const s=this;let o=!1;function a(n){if(n=Ie(n),n){const l=h.findKey(s,n);l&&(!t||rt(s,s[l],l,t))&&(delete s[l],o=!0)}}return h.isArray(e)?e.forEach(a):a(e),o}clear(e){const t=Object.keys(this);let s=t.length,o=!1;for(;s--;){const a=t[s];(!e||rt(this,this[a],a,e,!0))&&(delete this[a],o=!0)}return o}normalize(e){const t=this,s={};return h.forEach(this,(o,a)=>{const n=h.findKey(s,a);if(n){t[n]=Ge(o),delete t[a];return}const l=e?za(a):String(a).trim();l!==a&&delete t[a],t[l]=Ge(o),s[l]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return h.forEach(this,(s,o)=>{s!=null&&s!==!1&&(t[o]=e&&h.isArray(s)?s.join(", "):s)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+": "+t).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const s=new this(e);return t.forEach(o=>s.set(o)),s}static accessor(e){const s=(this[Bt]=this[Bt]={accessors:{}}).accessors,o=this.prototype;function a(n){const l=Ie(n);s[l]||(Ga(o,n),s[l]=!0)}return h.isArray(e)?e.forEach(a):a(e),this}};N.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);h.reduceDescriptors(N.prototype,({value:r},e)=>{let t=e[0].toUpperCase()+e.slice(1);return{get:()=>r,set(s){this[t]=s}}});h.freezeMethods(N);function st(r,e){const t=this||Ce,s=e||t,o=N.from(s.headers);let a=s.data;return h.forEach(r,function(l){a=l.call(t,a,o.normalize(),e?e.status:void 0)}),o.normalize(),a}function xr(r){return!!(r&&r.__CANCEL__)}function Ae(r,e,t){v.call(this,r??"canceled",v.ERR_CANCELED,e,t),this.name="CanceledError"}h.inherits(Ae,v,{__CANCEL__:!0});function vr(r,e,t){const s=t.config.validateStatus;!t.status||!s||s(t.status)?r(t):e(new v("Request failed with status code "+t.status,[v.ERR_BAD_REQUEST,v.ERR_BAD_RESPONSE][Math.floor(t.status/100)-4],t.config,t.request,t))}function _a(r){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(r);return e&&e[1]||""}function qa(r,e){r=r||10;const t=new Array(r),s=new Array(r);let o=0,a=0,n;return e=e!==void 0?e:1e3,function(i){const c=Date.now(),p=s[a];n||(n=c),t[o]=i,s[o]=c;let R=a,I=0;for(;R!==o;)I+=t[R++],R=R%r;if(o=(o+1)%r,o===a&&(a=(a+1)%r),c-n{t=p,o=null,a&&(clearTimeout(a),a=null),r(...c)};return[(...c)=>{const p=Date.now(),R=p-t;R>=s?n(c,p):(o=c,a||(a=setTimeout(()=>{a=null,n(o)},s-R)))},()=>o&&n(o)]}const $e=(r,e,t=3)=>{let s=0;const o=qa(50,250);return Ha(a=>{const n=a.loaded,l=a.lengthComputable?a.total:void 0,i=n-s,c=o(i),p=n<=l;s=n;const R={loaded:n,total:l,progress:l?n/l:void 0,bytes:i,rate:c||void 0,estimated:c&&l&&p?(l-n)/c:void 0,event:a,lengthComputable:l!=null,[e?"download":"upload"]:!0};r(R)},t)},Dt=(r,e)=>{const t=r!=null;return[s=>e[0]({lengthComputable:t,total:r,loaded:s}),e[1]]},Lt=r=>(...e)=>h.asap(()=>r(...e)),$a=q.hasStandardBrowserEnv?((r,e)=>t=>(t=new URL(t,q.origin),r.protocol===t.protocol&&r.host===t.host&&(e||r.port===t.port)))(new URL(q.origin),q.navigator&&/(msie|trident)/i.test(q.navigator.userAgent)):()=>!0,Na=q.hasStandardBrowserEnv?{write(r,e,t,s,o,a){const n=[r+"="+encodeURIComponent(e)];h.isNumber(t)&&n.push("expires="+new Date(t).toGMTString()),h.isString(s)&&n.push("path="+s),h.isString(o)&&n.push("domain="+o),a===!0&&n.push("secure"),document.cookie=n.join("; ")},read(r){const e=document.cookie.match(new RegExp("(^|;\\s*)("+r+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove(r){this.write(r,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Wa(r){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(r)}function Qa(r,e){return e?r.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):r}function Ur(r,e,t){let s=!Wa(e);return r&&(s||t==!1)?Qa(r,e):e}const jt=r=>r instanceof N?{...r}:r;function he(r,e){e=e||{};const t={};function s(c,p,R,I){return h.isPlainObject(c)&&h.isPlainObject(p)?h.merge.call({caseless:I},c,p):h.isPlainObject(p)?h.merge({},p):h.isArray(p)?p.slice():p}function o(c,p,R,I){if(h.isUndefined(p)){if(!h.isUndefined(c))return s(void 0,c,R,I)}else return s(c,p,R,I)}function a(c,p){if(!h.isUndefined(p))return s(void 0,p)}function n(c,p){if(h.isUndefined(p)){if(!h.isUndefined(c))return s(void 0,c)}else return s(void 0,p)}function l(c,p,R){if(R in e)return s(c,p);if(R in r)return s(void 0,c)}const i={url:a,method:a,data:a,baseURL:n,transformRequest:n,transformResponse:n,paramsSerializer:n,timeout:n,timeoutMessage:n,withCredentials:n,withXSRFToken:n,adapter:n,responseType:n,xsrfCookieName:n,xsrfHeaderName:n,onUploadProgress:n,onDownloadProgress:n,decompress:n,maxContentLength:n,maxBodyLength:n,beforeRedirect:n,transport:n,httpAgent:n,httpsAgent:n,cancelToken:n,socketPath:n,responseEncoding:n,validateStatus:l,headers:(c,p,R)=>o(jt(c),jt(p),R,!0)};return h.forEach(Object.keys({...r,...e}),function(p){const R=i[p]||o,I=R(r[p],e[p],p);h.isUndefined(I)&&R!==l||(t[p]=I)}),t}const Cr=r=>{const e=he({},r);let{data:t,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:a,headers:n,auth:l}=e;if(e.headers=n=N.from(n),e.url=Ir(Ur(e.baseURL,e.url,e.allowAbsoluteUrls),r.params,r.paramsSerializer),l&&n.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),h.isFormData(t)){if(q.hasStandardBrowserEnv||q.hasStandardBrowserWebWorkerEnv)n.setContentType(void 0);else if(h.isFunction(t.getHeaders)){const i=t.getHeaders(),c=["content-type","content-length"];Object.entries(i).forEach(([p,R])=>{c.includes(p.toLowerCase())&&n.set(p,R)})}}if(q.hasStandardBrowserEnv&&(s&&h.isFunction(s)&&(s=s(e)),s||s!==!1&&$a(e.url))){const i=o&&a&&Na.read(a);i&&n.set(o,i)}return e},Ma=typeof XMLHttpRequest<"u",Ja=Ma&&function(r){return new Promise(function(t,s){const o=Cr(r);let a=o.data;const n=N.from(o.headers).normalize();let{responseType:l,onUploadProgress:i,onDownloadProgress:c}=o,p,R,I,B,y;function f(){B&&B(),y&&y(),o.cancelToken&&o.cancelToken.unsubscribe(p),o.signal&&o.signal.removeEventListener("abort",p)}let w=new XMLHttpRequest;w.open(o.method.toUpperCase(),o.url,!0),w.timeout=o.timeout;function U(){if(!w)return;const E=N.from("getAllResponseHeaders"in w&&w.getAllResponseHeaders()),T={data:!l||l==="text"||l==="json"?w.responseText:w.response,status:w.status,statusText:w.statusText,headers:E,config:r,request:w};vr(function(C){t(C),f()},function(C){s(C),f()},T),w=null}"onloadend"in w?w.onloadend=U:w.onreadystatechange=function(){!w||w.readyState!==4||w.status===0&&!(w.responseURL&&w.responseURL.indexOf("file:")===0)||setTimeout(U)},w.onabort=function(){w&&(s(new v("Request aborted",v.ECONNABORTED,r,w)),w=null)},w.onerror=function(g){const T=g&&g.message?g.message:"Network Error",D=new v(T,v.ERR_NETWORK,r,w);D.event=g||null,s(D),w=null},w.ontimeout=function(){let g=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const T=o.transitional||Er;o.timeoutErrorMessage&&(g=o.timeoutErrorMessage),s(new v(g,T.clarifyTimeoutError?v.ETIMEDOUT:v.ECONNABORTED,r,w)),w=null},a===void 0&&n.setContentType(null),"setRequestHeader"in w&&h.forEach(n.toJSON(),function(g,T){w.setRequestHeader(T,g)}),h.isUndefined(o.withCredentials)||(w.withCredentials=!!o.withCredentials),l&&l!=="json"&&(w.responseType=o.responseType),c&&([I,y]=$e(c,!0),w.addEventListener("progress",I)),i&&w.upload&&([R,B]=$e(i),w.upload.addEventListener("progress",R),w.upload.addEventListener("loadend",B)),(o.cancelToken||o.signal)&&(p=E=>{w&&(s(!E||E.type?new Ae(null,r,w):E),w.abort(),w=null)},o.cancelToken&&o.cancelToken.subscribe(p),o.signal&&(o.signal.aborted?p():o.signal.addEventListener("abort",p)));const j=_a(o.url);if(j&&q.protocols.indexOf(j)===-1){s(new v("Unsupported protocol "+j+":",v.ERR_BAD_REQUEST,r));return}w.send(a||null)})},Ka=(r,e)=>{const{length:t}=r=r?r.filter(Boolean):[];if(e||t){let s=new AbortController,o;const a=function(c){if(!o){o=!0,l();const p=c instanceof Error?c:this.reason;s.abort(p instanceof v?p:new Ae(p instanceof Error?p.message:p))}};let n=e&&setTimeout(()=>{n=null,a(new v(`timeout ${e} of ms exceeded`,v.ETIMEDOUT))},e);const l=()=>{r&&(n&&clearTimeout(n),n=null,r.forEach(c=>{c.unsubscribe?c.unsubscribe(a):c.removeEventListener("abort",a)}),r=null)};r.forEach(c=>c.addEventListener("abort",a));const{signal:i}=s;return i.unsubscribe=()=>h.asap(l),i}},Xa=function*(r,e){let t=r.byteLength;if(t{const o=Ya(r,e);let a=0,n,l=i=>{n||(n=!0,s&&s(i))};return new ReadableStream({async pull(i){try{const{done:c,value:p}=await o.next();if(c){l(),i.close();return}let R=p.byteLength;if(t){let I=a+=R;t(I)}i.enqueue(new Uint8Array(p))}catch(c){throw l(c),c}},cancel(i){return l(i),o.return()}},{highWaterMark:2})},Ft=64*1024,{isFunction:je}=h,eo=(({Request:r,Response:e})=>({Request:r,Response:e}))(h.global),{ReadableStream:zt,TextEncoder:Gt}=h.global,_t=(r,...e)=>{try{return!!r(...e)}catch{return!1}},to=r=>{r=h.merge.call({skipUndefined:!0},eo,r);const{fetch:e,Request:t,Response:s}=r,o=e?je(e):typeof fetch=="function",a=je(t),n=je(s);if(!o)return!1;const l=o&&je(zt),i=o&&(typeof Gt=="function"?(y=>f=>y.encode(f))(new Gt):async y=>new Uint8Array(await new t(y).arrayBuffer())),c=a&&l&&_t(()=>{let y=!1;const f=new t(q.origin,{body:new zt,method:"POST",get duplex(){return y=!0,"half"}}).headers.has("Content-Type");return y&&!f}),p=n&&l&&_t(()=>h.isReadableStream(new s("").body)),R={stream:p&&(y=>y.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(y=>{!R[y]&&(R[y]=(f,w)=>{let U=f&&f[y];if(U)return U.call(f);throw new v(`Response type '${y}' is not supported`,v.ERR_NOT_SUPPORT,w)})});const I=async y=>{if(y==null)return 0;if(h.isBlob(y))return y.size;if(h.isSpecCompliantForm(y))return(await new t(q.origin,{method:"POST",body:y}).arrayBuffer()).byteLength;if(h.isArrayBufferView(y)||h.isArrayBuffer(y))return y.byteLength;if(h.isURLSearchParams(y)&&(y=y+""),h.isString(y))return(await i(y)).byteLength},B=async(y,f)=>{const w=h.toFiniteNumber(y.getContentLength());return w??I(f)};return async y=>{let{url:f,method:w,data:U,signal:j,cancelToken:E,timeout:g,onDownloadProgress:T,onUploadProgress:D,responseType:C,headers:ie,withCredentials:te="same-origin",fetchOptions:Re}=Cr(y),Te=e||fetch;C=C?(C+"").toLowerCase():"text";let ue=Ka([j,E&&E.toAbortSignal()],g),z=null;const k=ue&&ue.unsubscribe&&(()=>{ue.unsubscribe()});let Oe;try{if(D&&c&&w!=="get"&&w!=="head"&&(Oe=await B(ie,U))!==0){let re=new t(f,{method:"POST",body:U,duplex:"half"}),me;if(h.isFormData(U)&&(me=re.headers.get("content-type"))&&ie.setContentType(me),re.body){const[Ke,De]=Dt(Oe,$e(Lt(D)));U=kt(re.body,Ft,Ke,De)}}h.isString(te)||(te=te?"include":"omit");const M=a&&"credentials"in t.prototype,Pe={...Re,signal:ue,method:w.toUpperCase(),headers:ie.normalize().toJSON(),body:U,duplex:"half",credentials:M?te:void 0};z=a&&new t(f,Pe);let W=await(a?Te(z,Re):Te(f,Pe));const Be=p&&(C==="stream"||C==="response");if(p&&(T||Be&&k)){const re={};["status","statusText","headers"].forEach(St=>{re[St]=W[St]});const me=h.toFiniteNumber(W.headers.get("content-length")),[Ke,De]=T&&Dt(me,$e(Lt(T),!0))||[];W=new s(kt(W.body,Ft,Ke,()=>{De&&De(),k&&k()}),re)}C=C||"text";let Fr=await R[h.findKey(R,C)||"text"](W,y);return!Be&&k&&k(),await new Promise((re,me)=>{vr(re,me,{data:Fr,headers:N.from(W.headers),status:W.status,statusText:W.statusText,config:y,request:z})})}catch(M){throw k&&k(),M&&M.name==="TypeError"&&/Load failed|fetch/i.test(M.message)?Object.assign(new v("Network Error",v.ERR_NETWORK,y,z),{cause:M.cause||M}):v.from(M,M&&M.code,y,z)}}},ro=new Map,Tr=r=>{let e=r?r.env:{};const{fetch:t,Request:s,Response:o}=e,a=[s,o,t];let n=a.length,l=n,i,c,p=ro;for(;l--;)i=a[l],c=p.get(i),c===void 0&&p.set(i,c=l?new Map:to(e)),p=c;return c};Tr();const pt={http:Sa,xhr:Ja,fetch:{get:Tr}};h.forEach(pt,(r,e)=>{if(r){try{Object.defineProperty(r,"name",{value:e})}catch{}Object.defineProperty(r,"adapterName",{value:e})}});const qt=r=>`- ${r}`,so=r=>h.isFunction(r)||r===null||r===!1,Br={getAdapter:(r,e)=>{r=h.isArray(r)?r:[r];const{length:t}=r;let s,o;const a={};for(let n=0;n`adapter ${i} `+(c===!1?"is not supported by the environment":"is not available in the build"));let l=t?n.length>1?`since : +`+n.map(qt).join(` +`):" "+qt(n[0]):"as no adapter specified";throw new v("There is no suitable adapter to dispatch the request "+l,"ERR_NOT_SUPPORT")}return o},adapters:pt};function at(r){if(r.cancelToken&&r.cancelToken.throwIfRequested(),r.signal&&r.signal.aborted)throw new Ae(null,r)}function Ht(r){return at(r),r.headers=N.from(r.headers),r.data=st.call(r,r.transformRequest),["post","put","patch"].indexOf(r.method)!==-1&&r.headers.setContentType("application/x-www-form-urlencoded",!1),Br.getAdapter(r.adapter||Ce.adapter,r)(r).then(function(s){return at(r),s.data=st.call(r,r.transformResponse,s),s.headers=N.from(s.headers),s},function(s){return xr(s)||(at(r),s&&s.response&&(s.response.data=st.call(r,r.transformResponse,s.response),s.response.headers=N.from(s.response.headers))),Promise.reject(s)})}const Dr="1.12.2",Je={};["object","boolean","number","function","string","symbol"].forEach((r,e)=>{Je[r]=function(s){return typeof s===r||"a"+(e<1?"n ":" ")+r}});const $t={};Je.transitional=function(e,t,s){function o(a,n){return"[Axios v"+Dr+"] Transitional option '"+a+"'"+n+(s?". "+s:"")}return(a,n,l)=>{if(e===!1)throw new v(o(n," has been removed"+(t?" in "+t:"")),v.ERR_DEPRECATED);return t&&!$t[n]&&($t[n]=!0,console.warn(o(n," has been deprecated since v"+t+" and will be removed in the near future"))),e?e(a,n,l):!0}};Je.spelling=function(e){return(t,s)=>(console.warn(`${s} is likely a misspelling of ${e}`),!0)};function ao(r,e,t){if(typeof r!="object")throw new v("options must be an object",v.ERR_BAD_OPTION_VALUE);const s=Object.keys(r);let o=s.length;for(;o-- >0;){const a=s[o],n=e[a];if(n){const l=r[a],i=l===void 0||n(l,a,r);if(i!==!0)throw new v("option "+a+" must be "+i,v.ERR_BAD_OPTION_VALUE);continue}if(t!==!0)throw new v("Unknown option "+a,v.ERR_BAD_OPTION)}}const _e={assertOptions:ao,validators:Je},K=_e.validators;let de=class{constructor(e){this.defaults=e||{},this.interceptors={request:new Tt,response:new Tt}}async request(e,t){try{return await this._request(e,t)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const a=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?a&&!String(s.stack).endsWith(a.replace(/^.+\n.+\n/,""))&&(s.stack+=` +`+a):s.stack=a}catch{}}throw s}}_request(e,t){typeof e=="string"?(t=t||{},t.url=e):t=e||{},t=he(this.defaults,t);const{transitional:s,paramsSerializer:o,headers:a}=t;s!==void 0&&_e.assertOptions(s,{silentJSONParsing:K.transitional(K.boolean),forcedJSONParsing:K.transitional(K.boolean),clarifyTimeoutError:K.transitional(K.boolean)},!1),o!=null&&(h.isFunction(o)?t.paramsSerializer={serialize:o}:_e.assertOptions(o,{encode:K.function,serialize:K.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),_e.assertOptions(t,{baseUrl:K.spelling("baseURL"),withXsrfToken:K.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let n=a&&h.merge(a.common,a[t.method]);a&&h.forEach(["delete","get","head","post","put","patch","common"],y=>{delete a[y]}),t.headers=N.concat(n,a);const l=[];let i=!0;this.interceptors.request.forEach(function(f){typeof f.runWhen=="function"&&f.runWhen(t)===!1||(i=i&&f.synchronous,l.unshift(f.fulfilled,f.rejected))});const c=[];this.interceptors.response.forEach(function(f){c.push(f.fulfilled,f.rejected)});let p,R=0,I;if(!i){const y=[Ht.bind(this),void 0];for(y.unshift(...l),y.push(...c),I=y.length,p=Promise.resolve(t);R{if(!s._listeners)return;let a=s._listeners.length;for(;a-- >0;)s._listeners[a](o);s._listeners=null}),this.promise.then=o=>{let a;const n=new Promise(l=>{s.subscribe(l),a=l}).then(o);return n.cancel=function(){s.unsubscribe(a)},n},e(function(a,n,l){s.reason||(s.reason=new Ae(a,n,l),t(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=s=>{e.abort(s)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new Lr(function(o){e=o}),cancel:e}}};function no(r){return function(t){return r.apply(null,t)}}function lo(r){return h.isObject(r)&&r.isAxiosError===!0}const dt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(dt).forEach(([r,e])=>{dt[e]=r});function jr(r){const e=new de(r),t=ur(de.prototype.request,e);return h.extend(t,de.prototype,e,{allOwnKeys:!0}),h.extend(t,e,null,{allOwnKeys:!0}),t.create=function(o){return jr(he(r,o))},t}const u=jr(Ce);u.Axios=de;u.CanceledError=Ae;u.CancelToken=oo;u.isCancel=xr;u.VERSION=Dr;u.toFormData=Me;u.AxiosError=v;u.Cancel=u.CanceledError;u.all=function(e){return Promise.all(e)};u.spread=no;u.isAxiosError=lo;u.mergeConfig=he;u.AxiosHeaders=N;u.formToJSON=r=>gr(h.isHTMLForm(r)?new FormData(r):r);u.getAdapter=Br.getAdapter;u.HttpStatusCode=dt;u.default=u;const{Axios:Qo,AxiosError:Mo,CanceledError:Jo,isCancel:Ko,CancelToken:Xo,VERSION:Yo,all:Zo,Cancel:en,isAxiosError:tn,spread:rn,toFormData:sn,AxiosHeaders:an,HttpStatusCode:on,formToJSON:nn,getAdapter:ln,mergeConfig:cn}=u,O="/api/v1".replace(/\/+$/,"");class H{constructor(e,t=O,s=u){this.basePath=t,this.axios=s,e&&(this.configuration=e,this.basePath=e.basePath??t)}configuration}class io extends Error{constructor(e,t){super(t),this.field=e,this.name="RequiredError"}}const P={},m="https://example.com",d=function(r,e,t){if(t==null)throw new io(e,`Required parameter ${e} was null or undefined when calling ${r}.`)},b=async function(r,e,t){if(t&&t.apiKey){const s=typeof t.apiKey=="function"?await t.apiKey(e):await t.apiKey;r[e]=s}};function ht(r,e,t=""){e!=null&&(typeof e=="object"?Array.isArray(e)?e.forEach(s=>ht(r,s,t)):Object.keys(e).forEach(s=>ht(r,e[s],`${t}${t!==""?".":""}${s}`)):r.has(t)?r.append(t,e):r.set(t,e))}const V=function(r,...e){const t=new URLSearchParams(r.search);ht(t,e),r.search=t.toString()},x=function(r,e,t){const s=typeof r!="string";return(s&&t&&t.isJsonMime?t.isJsonMime(e.headers["Content-Type"]):s)?JSON.stringify(r!==void 0?r:{}):r||""},S=function(r){return r.pathname+r.search+r.hash},A=function(r,e,t,s){return(o=e,a=t)=>{const n={...r.options,url:(o.defaults.baseURL?"":s?.basePath??a)+r.url};return o.request(n)}},co=function(r){return{updateController:async(e,t={})=>{d("updateController","body",e);const s="/controller",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"PUT",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}}}},po=function(r){const e=co(r);return{async updateController(t,s){const o=await e.updateController(t,s),a=r?.serverIndex??0,n=P["ControllerApi.updateController"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)}}};class Nt extends H{updateController(e,t){return po(this.configuration).updateController(e,t).then(s=>s(this.axios,this.basePath))}}const ho=function(r){return{controllerInfo:async(e={})=>{const t="/controller-info",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}}}},uo=function(r){const e=ho(r);return{async controllerInfo(t){const s=await e.controllerInfo(t),o=r?.serverIndex??0,a=P["ControllerInfoApi.controllerInfo"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)}}};class Wt extends H{controllerInfo(e){return uo(this.configuration).controllerInfo(e).then(t=>t(this.axios,this.basePath))}}const Oo=function(r){return{createCredentials:async(e,t={})=>{d("createCredentials","body",e);const s="/github/credentials",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},createGiteaCredentials:async(e,t={})=>{d("createGiteaCredentials","body",e);const s="/gitea/credentials",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},deleteCredentials:async(e,t={})=>{d("deleteCredentials","id",e);const s="/github/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},deleteGiteaCredentials:async(e,t={})=>{d("deleteGiteaCredentials","id",e);const s="/gitea/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getCredentials:async(e,t={})=>{d("getCredentials","id",e);const s="/github/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getGiteaCredentials:async(e,t={})=>{d("getGiteaCredentials","id",e);const s="/gitea/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listCredentials:async(e={})=>{const t="/github/credentials",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listGiteaCredentials:async(e={})=>{const t="/gitea/credentials",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},updateCredentials:async(e,t,s={})=>{d("updateCredentials","id",e),d("updateCredentials","body",t);const o="/github/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},updateGiteaCredentials:async(e,t,s={})=>{d("updateGiteaCredentials","id",e),d("updateGiteaCredentials","body",t);const o="/gitea/credentials/{id}".replace("{id}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}}}},X=function(r){const e=Oo(r);return{async createCredentials(t,s){const o=await e.createCredentials(t,s),a=r?.serverIndex??0,n=P["CredentialsApi.createCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async createGiteaCredentials(t,s){const o=await e.createGiteaCredentials(t,s),a=r?.serverIndex??0,n=P["CredentialsApi.createGiteaCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async deleteCredentials(t,s){const o=await e.deleteCredentials(t,s),a=r?.serverIndex??0,n=P["CredentialsApi.deleteCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async deleteGiteaCredentials(t,s){const o=await e.deleteGiteaCredentials(t,s),a=r?.serverIndex??0,n=P["CredentialsApi.deleteGiteaCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getCredentials(t,s){const o=await e.getCredentials(t,s),a=r?.serverIndex??0,n=P["CredentialsApi.getCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getGiteaCredentials(t,s){const o=await e.getGiteaCredentials(t,s),a=r?.serverIndex??0,n=P["CredentialsApi.getGiteaCredentials"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listCredentials(t){const s=await e.listCredentials(t),o=r?.serverIndex??0,a=P["CredentialsApi.listCredentials"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)},async listGiteaCredentials(t){const s=await e.listGiteaCredentials(t),o=r?.serverIndex??0,a=P["CredentialsApi.listGiteaCredentials"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)},async updateCredentials(t,s,o){const a=await e.updateCredentials(t,s,o),n=r?.serverIndex??0,l=P["CredentialsApi.updateCredentials"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async updateGiteaCredentials(t,s,o){const a=await e.updateGiteaCredentials(t,s,o),n=r?.serverIndex??0,l=P["CredentialsApi.updateGiteaCredentials"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)}}};class Qt extends H{createCredentials(e,t){return X(this.configuration).createCredentials(e,t).then(s=>s(this.axios,this.basePath))}createGiteaCredentials(e,t){return X(this.configuration).createGiteaCredentials(e,t).then(s=>s(this.axios,this.basePath))}deleteCredentials(e,t){return X(this.configuration).deleteCredentials(e,t).then(s=>s(this.axios,this.basePath))}deleteGiteaCredentials(e,t){return X(this.configuration).deleteGiteaCredentials(e,t).then(s=>s(this.axios,this.basePath))}getCredentials(e,t){return X(this.configuration).getCredentials(e,t).then(s=>s(this.axios,this.basePath))}getGiteaCredentials(e,t){return X(this.configuration).getGiteaCredentials(e,t).then(s=>s(this.axios,this.basePath))}listCredentials(e){return X(this.configuration).listCredentials(e).then(t=>t(this.axios,this.basePath))}listGiteaCredentials(e){return X(this.configuration).listGiteaCredentials(e).then(t=>t(this.axios,this.basePath))}updateCredentials(e,t,s){return X(this.configuration).updateCredentials(e,t,s).then(o=>o(this.axios,this.basePath))}updateGiteaCredentials(e,t,s){return X(this.configuration).updateGiteaCredentials(e,t,s).then(o=>o(this.axios,this.basePath))}}const Po=function(r){return{createGiteaEndpoint:async(e,t={})=>{d("createGiteaEndpoint","body",e);const s="/gitea/endpoints",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},createGithubEndpoint:async(e,t={})=>{d("createGithubEndpoint","body",e);const s="/github/endpoints",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},deleteGiteaEndpoint:async(e,t={})=>{d("deleteGiteaEndpoint","name",e);const s="/gitea/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},deleteGithubEndpoint:async(e,t={})=>{d("deleteGithubEndpoint","name",e);const s="/github/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getGiteaEndpoint:async(e,t={})=>{d("getGiteaEndpoint","name",e);const s="/gitea/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getGithubEndpoint:async(e,t={})=>{d("getGithubEndpoint","name",e);const s="/github/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listGiteaEndpoints:async(e={})=>{const t="/gitea/endpoints",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listGithubEndpoints:async(e={})=>{const t="/github/endpoints",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},updateGiteaEndpoint:async(e,t,s={})=>{d("updateGiteaEndpoint","name",e),d("updateGiteaEndpoint","body",t);const o="/gitea/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},updateGithubEndpoint:async(e,t,s={})=>{d("updateGithubEndpoint","name",e),d("updateGithubEndpoint","body",t);const o="/github/endpoints/{name}".replace("{name}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}}}},Y=function(r){const e=Po(r);return{async createGiteaEndpoint(t,s){const o=await e.createGiteaEndpoint(t,s),a=r?.serverIndex??0,n=P["EndpointsApi.createGiteaEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async createGithubEndpoint(t,s){const o=await e.createGithubEndpoint(t,s),a=r?.serverIndex??0,n=P["EndpointsApi.createGithubEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async deleteGiteaEndpoint(t,s){const o=await e.deleteGiteaEndpoint(t,s),a=r?.serverIndex??0,n=P["EndpointsApi.deleteGiteaEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async deleteGithubEndpoint(t,s){const o=await e.deleteGithubEndpoint(t,s),a=r?.serverIndex??0,n=P["EndpointsApi.deleteGithubEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getGiteaEndpoint(t,s){const o=await e.getGiteaEndpoint(t,s),a=r?.serverIndex??0,n=P["EndpointsApi.getGiteaEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getGithubEndpoint(t,s){const o=await e.getGithubEndpoint(t,s),a=r?.serverIndex??0,n=P["EndpointsApi.getGithubEndpoint"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listGiteaEndpoints(t){const s=await e.listGiteaEndpoints(t),o=r?.serverIndex??0,a=P["EndpointsApi.listGiteaEndpoints"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)},async listGithubEndpoints(t){const s=await e.listGithubEndpoints(t),o=r?.serverIndex??0,a=P["EndpointsApi.listGithubEndpoints"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)},async updateGiteaEndpoint(t,s,o){const a=await e.updateGiteaEndpoint(t,s,o),n=r?.serverIndex??0,l=P["EndpointsApi.updateGiteaEndpoint"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async updateGithubEndpoint(t,s,o){const a=await e.updateGithubEndpoint(t,s,o),n=r?.serverIndex??0,l=P["EndpointsApi.updateGithubEndpoint"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)}}};class Mt extends H{createGiteaEndpoint(e,t){return Y(this.configuration).createGiteaEndpoint(e,t).then(s=>s(this.axios,this.basePath))}createGithubEndpoint(e,t){return Y(this.configuration).createGithubEndpoint(e,t).then(s=>s(this.axios,this.basePath))}deleteGiteaEndpoint(e,t){return Y(this.configuration).deleteGiteaEndpoint(e,t).then(s=>s(this.axios,this.basePath))}deleteGithubEndpoint(e,t){return Y(this.configuration).deleteGithubEndpoint(e,t).then(s=>s(this.axios,this.basePath))}getGiteaEndpoint(e,t){return Y(this.configuration).getGiteaEndpoint(e,t).then(s=>s(this.axios,this.basePath))}getGithubEndpoint(e,t){return Y(this.configuration).getGithubEndpoint(e,t).then(s=>s(this.axios,this.basePath))}listGiteaEndpoints(e){return Y(this.configuration).listGiteaEndpoints(e).then(t=>t(this.axios,this.basePath))}listGithubEndpoints(e){return Y(this.configuration).listGithubEndpoints(e).then(t=>t(this.axios,this.basePath))}updateGiteaEndpoint(e,t,s){return Y(this.configuration).updateGiteaEndpoint(e,t,s).then(o=>o(this.axios,this.basePath))}updateGithubEndpoint(e,t,s){return Y(this.configuration).updateGithubEndpoint(e,t,s).then(o=>o(this.axios,this.basePath))}}const mo=function(r){return{createEnterprise:async(e,t={})=>{d("createEnterprise","body",e);const s="/enterprises",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},createEnterprisePool:async(e,t,s={})=>{d("createEnterprisePool","enterpriseID",e),d("createEnterprisePool","body",t);const o="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},createEnterpriseScaleSet:async(e,t,s={})=>{d("createEnterpriseScaleSet","enterpriseID",e),d("createEnterpriseScaleSet","body",t);const o="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},deleteEnterprise:async(e,t={})=>{d("deleteEnterprise","enterpriseID",e);const s="/enterprises/{enterpriseID}".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},deleteEnterprisePool:async(e,t,s={})=>{d("deleteEnterprisePool","enterpriseID",e),d("deleteEnterprisePool","poolID",t);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getEnterprise:async(e,t={})=>{d("getEnterprise","enterpriseID",e);const s="/enterprises/{enterpriseID}".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getEnterprisePool:async(e,t,s={})=>{d("getEnterprisePool","enterpriseID",e),d("getEnterprisePool","poolID",t);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},listEnterpriseInstances:async(e,t={})=>{d("listEnterpriseInstances","enterpriseID",e);const s="/enterprises/{enterpriseID}/instances".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listEnterprisePools:async(e,t={})=>{d("listEnterprisePools","enterpriseID",e);const s="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listEnterpriseScaleSets:async(e,t={})=>{d("listEnterpriseScaleSets","enterpriseID",e);const s="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listEnterprises:async(e,t,s={})=>{const o="/enterprises",a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),e!==void 0&&(c.name=e),t!==void 0&&(c.endpoint=t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},updateEnterprise:async(e,t,s={})=>{d("updateEnterprise","enterpriseID",e),d("updateEnterprise","body",t);const o="/enterprises/{enterpriseID}".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},updateEnterprisePool:async(e,t,s,o={})=>{d("updateEnterprisePool","enterpriseID",e),d("updateEnterprisePool","poolID",t),d("updateEnterprisePool","body",s);const a="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await b(c,"Authorization",r),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,r),{url:S(n),options:i}}}},Q=function(r){const e=mo(r);return{async createEnterprise(t,s){const o=await e.createEnterprise(t,s),a=r?.serverIndex??0,n=P["EnterprisesApi.createEnterprise"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async createEnterprisePool(t,s,o){const a=await e.createEnterprisePool(t,s,o),n=r?.serverIndex??0,l=P["EnterprisesApi.createEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async createEnterpriseScaleSet(t,s,o){const a=await e.createEnterpriseScaleSet(t,s,o),n=r?.serverIndex??0,l=P["EnterprisesApi.createEnterpriseScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteEnterprise(t,s){const o=await e.deleteEnterprise(t,s),a=r?.serverIndex??0,n=P["EnterprisesApi.deleteEnterprise"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async deleteEnterprisePool(t,s,o){const a=await e.deleteEnterprisePool(t,s,o),n=r?.serverIndex??0,l=P["EnterprisesApi.deleteEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getEnterprise(t,s){const o=await e.getEnterprise(t,s),a=r?.serverIndex??0,n=P["EnterprisesApi.getEnterprise"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getEnterprisePool(t,s,o){const a=await e.getEnterprisePool(t,s,o),n=r?.serverIndex??0,l=P["EnterprisesApi.getEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async listEnterpriseInstances(t,s){const o=await e.listEnterpriseInstances(t,s),a=r?.serverIndex??0,n=P["EnterprisesApi.listEnterpriseInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listEnterprisePools(t,s){const o=await e.listEnterprisePools(t,s),a=r?.serverIndex??0,n=P["EnterprisesApi.listEnterprisePools"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listEnterpriseScaleSets(t,s){const o=await e.listEnterpriseScaleSets(t,s),a=r?.serverIndex??0,n=P["EnterprisesApi.listEnterpriseScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listEnterprises(t,s,o){const a=await e.listEnterprises(t,s,o),n=r?.serverIndex??0,l=P["EnterprisesApi.listEnterprises"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async updateEnterprise(t,s,o){const a=await e.updateEnterprise(t,s,o),n=r?.serverIndex??0,l=P["EnterprisesApi.updateEnterprise"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async updateEnterprisePool(t,s,o,a){const n=await e.updateEnterprisePool(t,s,o,a),l=r?.serverIndex??0,i=P["EnterprisesApi.updateEnterprisePool"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)}}};class Jt extends H{createEnterprise(e,t){return Q(this.configuration).createEnterprise(e,t).then(s=>s(this.axios,this.basePath))}createEnterprisePool(e,t,s){return Q(this.configuration).createEnterprisePool(e,t,s).then(o=>o(this.axios,this.basePath))}createEnterpriseScaleSet(e,t,s){return Q(this.configuration).createEnterpriseScaleSet(e,t,s).then(o=>o(this.axios,this.basePath))}deleteEnterprise(e,t){return Q(this.configuration).deleteEnterprise(e,t).then(s=>s(this.axios,this.basePath))}deleteEnterprisePool(e,t,s){return Q(this.configuration).deleteEnterprisePool(e,t,s).then(o=>o(this.axios,this.basePath))}getEnterprise(e,t){return Q(this.configuration).getEnterprise(e,t).then(s=>s(this.axios,this.basePath))}getEnterprisePool(e,t,s){return Q(this.configuration).getEnterprisePool(e,t,s).then(o=>o(this.axios,this.basePath))}listEnterpriseInstances(e,t){return Q(this.configuration).listEnterpriseInstances(e,t).then(s=>s(this.axios,this.basePath))}listEnterprisePools(e,t){return Q(this.configuration).listEnterprisePools(e,t).then(s=>s(this.axios,this.basePath))}listEnterpriseScaleSets(e,t){return Q(this.configuration).listEnterpriseScaleSets(e,t).then(s=>s(this.axios,this.basePath))}listEnterprises(e,t,s){return Q(this.configuration).listEnterprises(e,t,s).then(o=>o(this.axios,this.basePath))}updateEnterprise(e,t,s){return Q(this.configuration).updateEnterprise(e,t,s).then(o=>o(this.axios,this.basePath))}updateEnterprisePool(e,t,s,o){return Q(this.configuration).updateEnterprisePool(e,t,s,o).then(a=>a(this.axios,this.basePath))}}const bo=function(r){return{firstRun:async(e,t={})=>{d("firstRun","body",e);const s="/first-run",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}}}},Vo=function(r){const e=bo(r);return{async firstRun(t,s){const o=await e.firstRun(t,s),a=r?.serverIndex??0,n=P["FirstRunApi.firstRun"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)}}};class Kt extends H{firstRun(e,t){return Vo(this.configuration).firstRun(e,t).then(s=>s(this.axios,this.basePath))}}const So=function(r){return{getOrgWebhookInfo:async(e,t={})=>{d("getOrgWebhookInfo","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getRepoWebhookInfo:async(e,t={})=>{d("getRepoWebhookInfo","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},installOrgWebhook:async(e,t,s={})=>{d("installOrgWebhook","orgID",e),d("installOrgWebhook","body",t);const o="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},installRepoWebhook:async(e,t,s={})=>{d("installRepoWebhook","repoID",e),d("installRepoWebhook","body",t);const o="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},uninstallOrgWebhook:async(e,t={})=>{d("uninstallOrgWebhook","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},uninstallRepoWebhook:async(e,t={})=>{d("uninstallRepoWebhook","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}}}},be=function(r){const e=So(r);return{async getOrgWebhookInfo(t,s){const o=await e.getOrgWebhookInfo(t,s),a=r?.serverIndex??0,n=P["HooksApi.getOrgWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getRepoWebhookInfo(t,s){const o=await e.getRepoWebhookInfo(t,s),a=r?.serverIndex??0,n=P["HooksApi.getRepoWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async installOrgWebhook(t,s,o){const a=await e.installOrgWebhook(t,s,o),n=r?.serverIndex??0,l=P["HooksApi.installOrgWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async installRepoWebhook(t,s,o){const a=await e.installRepoWebhook(t,s,o),n=r?.serverIndex??0,l=P["HooksApi.installRepoWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async uninstallOrgWebhook(t,s){const o=await e.uninstallOrgWebhook(t,s),a=r?.serverIndex??0,n=P["HooksApi.uninstallOrgWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async uninstallRepoWebhook(t,s){const o=await e.uninstallRepoWebhook(t,s),a=r?.serverIndex??0,n=P["HooksApi.uninstallRepoWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)}}};class Xt extends H{getOrgWebhookInfo(e,t){return be(this.configuration).getOrgWebhookInfo(e,t).then(s=>s(this.axios,this.basePath))}getRepoWebhookInfo(e,t){return be(this.configuration).getRepoWebhookInfo(e,t).then(s=>s(this.axios,this.basePath))}installOrgWebhook(e,t,s){return be(this.configuration).installOrgWebhook(e,t,s).then(o=>o(this.axios,this.basePath))}installRepoWebhook(e,t,s){return be(this.configuration).installRepoWebhook(e,t,s).then(o=>o(this.axios,this.basePath))}uninstallOrgWebhook(e,t){return be(this.configuration).uninstallOrgWebhook(e,t).then(s=>s(this.axios,this.basePath))}uninstallRepoWebhook(e,t){return be(this.configuration).uninstallRepoWebhook(e,t).then(s=>s(this.axios,this.basePath))}}const Ao=function(r){return{deleteInstance:async(e,t,s,o={})=>{d("deleteInstance","instanceName",e);const a="/instances/{instanceName}".replace("{instanceName}",encodeURIComponent(String(e))),n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"DELETE",...l,...o},c={},p={};await b(c,"Authorization",r),t!==void 0&&(p.forceRemove=t),s!==void 0&&(p.bypassGHUnauthorized=s),V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},{url:S(n),options:i}},getInstance:async(e,t={})=>{d("getInstance","instanceName",e);const s="/instances/{instanceName}".replace("{instanceName}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listEnterpriseInstances:async(e,t={})=>{d("listEnterpriseInstances","enterpriseID",e);const s="/enterprises/{enterpriseID}/instances".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listInstances:async(e={})=>{const t="/instances",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listOrgInstances:async(e,t={})=>{d("listOrgInstances","orgID",e);const s="/organizations/{orgID}/instances".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listPoolInstances:async(e,t={})=>{d("listPoolInstances","poolID",e);const s="/pools/{poolID}/instances".replace("{poolID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listRepoInstances:async(e,t={})=>{d("listRepoInstances","repoID",e);const s="/repositories/{repoID}/instances".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listScaleSetInstances:async(e,t={})=>{d("listScaleSetInstances","scalesetID",e);const s="/scalesets/{scalesetID}/instances".replace("{scalesetID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}}}},le=function(r){const e=Ao(r);return{async deleteInstance(t,s,o,a){const n=await e.deleteInstance(t,s,o,a),l=r?.serverIndex??0,i=P["InstancesApi.deleteInstance"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)},async getInstance(t,s){const o=await e.getInstance(t,s),a=r?.serverIndex??0,n=P["InstancesApi.getInstance"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listEnterpriseInstances(t,s){const o=await e.listEnterpriseInstances(t,s),a=r?.serverIndex??0,n=P["InstancesApi.listEnterpriseInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listInstances(t){const s=await e.listInstances(t),o=r?.serverIndex??0,a=P["InstancesApi.listInstances"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)},async listOrgInstances(t,s){const o=await e.listOrgInstances(t,s),a=r?.serverIndex??0,n=P["InstancesApi.listOrgInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listPoolInstances(t,s){const o=await e.listPoolInstances(t,s),a=r?.serverIndex??0,n=P["InstancesApi.listPoolInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listRepoInstances(t,s){const o=await e.listRepoInstances(t,s),a=r?.serverIndex??0,n=P["InstancesApi.listRepoInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listScaleSetInstances(t,s){const o=await e.listScaleSetInstances(t,s),a=r?.serverIndex??0,n=P["InstancesApi.listScaleSetInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)}}};class Yt extends H{deleteInstance(e,t,s,o){return le(this.configuration).deleteInstance(e,t,s,o).then(a=>a(this.axios,this.basePath))}getInstance(e,t){return le(this.configuration).getInstance(e,t).then(s=>s(this.axios,this.basePath))}listEnterpriseInstances(e,t){return le(this.configuration).listEnterpriseInstances(e,t).then(s=>s(this.axios,this.basePath))}listInstances(e){return le(this.configuration).listInstances(e).then(t=>t(this.axios,this.basePath))}listOrgInstances(e,t){return le(this.configuration).listOrgInstances(e,t).then(s=>s(this.axios,this.basePath))}listPoolInstances(e,t){return le(this.configuration).listPoolInstances(e,t).then(s=>s(this.axios,this.basePath))}listRepoInstances(e,t){return le(this.configuration).listRepoInstances(e,t).then(s=>s(this.axios,this.basePath))}listScaleSetInstances(e,t){return le(this.configuration).listScaleSetInstances(e,t).then(s=>s(this.axios,this.basePath))}}const Ro=function(r){return{login:async(e,t={})=>{d("login","body",e);const s="/auth/login",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}}}},yo=function(r){const e=Ro(r);return{async login(t,s){const o=await e.login(t,s),a=r?.serverIndex??0,n=P["LoginApi.login"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)}}};class Zt extends H{login(e,t){return yo(this.configuration).login(e,t).then(s=>s(this.axios,this.basePath))}}const fo=function(r){return{createOrg:async(e,t={})=>{d("createOrg","body",e);const s="/organizations",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},createOrgPool:async(e,t,s={})=>{d("createOrgPool","orgID",e),d("createOrgPool","body",t);const o="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},createOrgScaleSet:async(e,t,s={})=>{d("createOrgScaleSet","orgID",e),d("createOrgScaleSet","body",t);const o="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},deleteOrg:async(e,t,s={})=>{d("deleteOrg","orgID",e);const o="/organizations/{orgID}".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),t!==void 0&&(c.keepWebhook=t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deleteOrgPool:async(e,t,s={})=>{d("deleteOrgPool","orgID",e),d("deleteOrgPool","poolID",t);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getOrg:async(e,t={})=>{d("getOrg","orgID",e);const s="/organizations/{orgID}".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getOrgPool:async(e,t,s={})=>{d("getOrgPool","orgID",e),d("getOrgPool","poolID",t);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getOrgWebhookInfo:async(e,t={})=>{d("getOrgWebhookInfo","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},installOrgWebhook:async(e,t,s={})=>{d("installOrgWebhook","orgID",e),d("installOrgWebhook","body",t);const o="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},listOrgInstances:async(e,t={})=>{d("listOrgInstances","orgID",e);const s="/organizations/{orgID}/instances".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listOrgPools:async(e,t={})=>{d("listOrgPools","orgID",e);const s="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listOrgScaleSets:async(e,t={})=>{d("listOrgScaleSets","orgID",e);const s="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listOrgs:async(e,t,s={})=>{const o="/organizations",a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),e!==void 0&&(c.name=e),t!==void 0&&(c.endpoint=t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},uninstallOrgWebhook:async(e,t={})=>{d("uninstallOrgWebhook","orgID",e);const s="/organizations/{orgID}/webhook".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},updateOrg:async(e,t,s={})=>{d("updateOrg","orgID",e),d("updateOrg","body",t);const o="/organizations/{orgID}".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},updateOrgPool:async(e,t,s,o={})=>{d("updateOrgPool","orgID",e),d("updateOrgPool","poolID",t),d("updateOrgPool","body",s);const a="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await b(c,"Authorization",r),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,r),{url:S(n),options:i}}}},G=function(r){const e=fo(r);return{async createOrg(t,s){const o=await e.createOrg(t,s),a=r?.serverIndex??0,n=P["OrganizationsApi.createOrg"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async createOrgPool(t,s,o){const a=await e.createOrgPool(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.createOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async createOrgScaleSet(t,s,o){const a=await e.createOrgScaleSet(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.createOrgScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteOrg(t,s,o){const a=await e.deleteOrg(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.deleteOrg"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteOrgPool(t,s,o){const a=await e.deleteOrgPool(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.deleteOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getOrg(t,s){const o=await e.getOrg(t,s),a=r?.serverIndex??0,n=P["OrganizationsApi.getOrg"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getOrgPool(t,s,o){const a=await e.getOrgPool(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.getOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getOrgWebhookInfo(t,s){const o=await e.getOrgWebhookInfo(t,s),a=r?.serverIndex??0,n=P["OrganizationsApi.getOrgWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async installOrgWebhook(t,s,o){const a=await e.installOrgWebhook(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.installOrgWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async listOrgInstances(t,s){const o=await e.listOrgInstances(t,s),a=r?.serverIndex??0,n=P["OrganizationsApi.listOrgInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listOrgPools(t,s){const o=await e.listOrgPools(t,s),a=r?.serverIndex??0,n=P["OrganizationsApi.listOrgPools"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listOrgScaleSets(t,s){const o=await e.listOrgScaleSets(t,s),a=r?.serverIndex??0,n=P["OrganizationsApi.listOrgScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listOrgs(t,s,o){const a=await e.listOrgs(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.listOrgs"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async uninstallOrgWebhook(t,s){const o=await e.uninstallOrgWebhook(t,s),a=r?.serverIndex??0,n=P["OrganizationsApi.uninstallOrgWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async updateOrg(t,s,o){const a=await e.updateOrg(t,s,o),n=r?.serverIndex??0,l=P["OrganizationsApi.updateOrg"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async updateOrgPool(t,s,o,a){const n=await e.updateOrgPool(t,s,o,a),l=r?.serverIndex??0,i=P["OrganizationsApi.updateOrgPool"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)}}};class er extends H{createOrg(e,t){return G(this.configuration).createOrg(e,t).then(s=>s(this.axios,this.basePath))}createOrgPool(e,t,s){return G(this.configuration).createOrgPool(e,t,s).then(o=>o(this.axios,this.basePath))}createOrgScaleSet(e,t,s){return G(this.configuration).createOrgScaleSet(e,t,s).then(o=>o(this.axios,this.basePath))}deleteOrg(e,t,s){return G(this.configuration).deleteOrg(e,t,s).then(o=>o(this.axios,this.basePath))}deleteOrgPool(e,t,s){return G(this.configuration).deleteOrgPool(e,t,s).then(o=>o(this.axios,this.basePath))}getOrg(e,t){return G(this.configuration).getOrg(e,t).then(s=>s(this.axios,this.basePath))}getOrgPool(e,t,s){return G(this.configuration).getOrgPool(e,t,s).then(o=>o(this.axios,this.basePath))}getOrgWebhookInfo(e,t){return G(this.configuration).getOrgWebhookInfo(e,t).then(s=>s(this.axios,this.basePath))}installOrgWebhook(e,t,s){return G(this.configuration).installOrgWebhook(e,t,s).then(o=>o(this.axios,this.basePath))}listOrgInstances(e,t){return G(this.configuration).listOrgInstances(e,t).then(s=>s(this.axios,this.basePath))}listOrgPools(e,t){return G(this.configuration).listOrgPools(e,t).then(s=>s(this.axios,this.basePath))}listOrgScaleSets(e,t){return G(this.configuration).listOrgScaleSets(e,t).then(s=>s(this.axios,this.basePath))}listOrgs(e,t,s){return G(this.configuration).listOrgs(e,t,s).then(o=>o(this.axios,this.basePath))}uninstallOrgWebhook(e,t){return G(this.configuration).uninstallOrgWebhook(e,t).then(s=>s(this.axios,this.basePath))}updateOrg(e,t,s){return G(this.configuration).updateOrg(e,t,s).then(o=>o(this.axios,this.basePath))}updateOrgPool(e,t,s,o){return G(this.configuration).updateOrgPool(e,t,s,o).then(a=>a(this.axios,this.basePath))}}const wo=function(r){return{createEnterprisePool:async(e,t,s={})=>{d("createEnterprisePool","enterpriseID",e),d("createEnterprisePool","body",t);const o="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},createOrgPool:async(e,t,s={})=>{d("createOrgPool","orgID",e),d("createOrgPool","body",t);const o="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},createRepoPool:async(e,t,s={})=>{d("createRepoPool","repoID",e),d("createRepoPool","body",t);const o="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},deleteEnterprisePool:async(e,t,s={})=>{d("deleteEnterprisePool","enterpriseID",e),d("deleteEnterprisePool","poolID",t);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deleteOrgPool:async(e,t,s={})=>{d("deleteOrgPool","orgID",e),d("deleteOrgPool","poolID",t);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deletePool:async(e,t={})=>{d("deletePool","poolID",e);const s="/pools/{poolID}".replace("{poolID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},deleteRepoPool:async(e,t,s={})=>{d("deleteRepoPool","repoID",e),d("deleteRepoPool","poolID",t);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getEnterprisePool:async(e,t,s={})=>{d("getEnterprisePool","enterpriseID",e),d("getEnterprisePool","poolID",t);const o="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getOrgPool:async(e,t,s={})=>{d("getOrgPool","orgID",e),d("getOrgPool","poolID",t);const o="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getPool:async(e,t={})=>{d("getPool","poolID",e);const s="/pools/{poolID}".replace("{poolID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getRepoPool:async(e,t,s={})=>{d("getRepoPool","repoID",e),d("getRepoPool","poolID",t);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},listEnterprisePools:async(e,t={})=>{d("listEnterprisePools","enterpriseID",e);const s="/enterprises/{enterpriseID}/pools".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listOrgPools:async(e,t={})=>{d("listOrgPools","orgID",e);const s="/organizations/{orgID}/pools".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listPools:async(e={})=>{const t="/pools",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},listRepoPools:async(e,t={})=>{d("listRepoPools","repoID",e);const s="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},updateEnterprisePool:async(e,t,s,o={})=>{d("updateEnterprisePool","enterpriseID",e),d("updateEnterprisePool","poolID",t),d("updateEnterprisePool","body",s);const a="/enterprises/{enterpriseID}/pools/{poolID}".replace("{enterpriseID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await b(c,"Authorization",r),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,r),{url:S(n),options:i}},updateOrgPool:async(e,t,s,o={})=>{d("updateOrgPool","orgID",e),d("updateOrgPool","poolID",t),d("updateOrgPool","body",s);const a="/organizations/{orgID}/pools/{poolID}".replace("{orgID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await b(c,"Authorization",r),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,r),{url:S(n),options:i}},updatePool:async(e,t,s={})=>{d("updatePool","poolID",e),d("updatePool","body",t);const o="/pools/{poolID}".replace("{poolID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},updateRepoPool:async(e,t,s,o={})=>{d("updateRepoPool","repoID",e),d("updateRepoPool","poolID",t),d("updateRepoPool","body",s);const a="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await b(c,"Authorization",r),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,r),{url:S(n),options:i}}}},L=function(r){const e=wo(r);return{async createEnterprisePool(t,s,o){const a=await e.createEnterprisePool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.createEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async createOrgPool(t,s,o){const a=await e.createOrgPool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.createOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async createRepoPool(t,s,o){const a=await e.createRepoPool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.createRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteEnterprisePool(t,s,o){const a=await e.deleteEnterprisePool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.deleteEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteOrgPool(t,s,o){const a=await e.deleteOrgPool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.deleteOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deletePool(t,s){const o=await e.deletePool(t,s),a=r?.serverIndex??0,n=P["PoolsApi.deletePool"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async deleteRepoPool(t,s,o){const a=await e.deleteRepoPool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.deleteRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getEnterprisePool(t,s,o){const a=await e.getEnterprisePool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.getEnterprisePool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getOrgPool(t,s,o){const a=await e.getOrgPool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.getOrgPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getPool(t,s){const o=await e.getPool(t,s),a=r?.serverIndex??0,n=P["PoolsApi.getPool"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getRepoPool(t,s,o){const a=await e.getRepoPool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.getRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async listEnterprisePools(t,s){const o=await e.listEnterprisePools(t,s),a=r?.serverIndex??0,n=P["PoolsApi.listEnterprisePools"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listOrgPools(t,s){const o=await e.listOrgPools(t,s),a=r?.serverIndex??0,n=P["PoolsApi.listOrgPools"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listPools(t){const s=await e.listPools(t),o=r?.serverIndex??0,a=P["PoolsApi.listPools"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)},async listRepoPools(t,s){const o=await e.listRepoPools(t,s),a=r?.serverIndex??0,n=P["PoolsApi.listRepoPools"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async updateEnterprisePool(t,s,o,a){const n=await e.updateEnterprisePool(t,s,o,a),l=r?.serverIndex??0,i=P["PoolsApi.updateEnterprisePool"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)},async updateOrgPool(t,s,o,a){const n=await e.updateOrgPool(t,s,o,a),l=r?.serverIndex??0,i=P["PoolsApi.updateOrgPool"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)},async updatePool(t,s,o){const a=await e.updatePool(t,s,o),n=r?.serverIndex??0,l=P["PoolsApi.updatePool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async updateRepoPool(t,s,o,a){const n=await e.updateRepoPool(t,s,o,a),l=r?.serverIndex??0,i=P["PoolsApi.updateRepoPool"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)}}};class tr extends H{createEnterprisePool(e,t,s){return L(this.configuration).createEnterprisePool(e,t,s).then(o=>o(this.axios,this.basePath))}createOrgPool(e,t,s){return L(this.configuration).createOrgPool(e,t,s).then(o=>o(this.axios,this.basePath))}createRepoPool(e,t,s){return L(this.configuration).createRepoPool(e,t,s).then(o=>o(this.axios,this.basePath))}deleteEnterprisePool(e,t,s){return L(this.configuration).deleteEnterprisePool(e,t,s).then(o=>o(this.axios,this.basePath))}deleteOrgPool(e,t,s){return L(this.configuration).deleteOrgPool(e,t,s).then(o=>o(this.axios,this.basePath))}deletePool(e,t){return L(this.configuration).deletePool(e,t).then(s=>s(this.axios,this.basePath))}deleteRepoPool(e,t,s){return L(this.configuration).deleteRepoPool(e,t,s).then(o=>o(this.axios,this.basePath))}getEnterprisePool(e,t,s){return L(this.configuration).getEnterprisePool(e,t,s).then(o=>o(this.axios,this.basePath))}getOrgPool(e,t,s){return L(this.configuration).getOrgPool(e,t,s).then(o=>o(this.axios,this.basePath))}getPool(e,t){return L(this.configuration).getPool(e,t).then(s=>s(this.axios,this.basePath))}getRepoPool(e,t,s){return L(this.configuration).getRepoPool(e,t,s).then(o=>o(this.axios,this.basePath))}listEnterprisePools(e,t){return L(this.configuration).listEnterprisePools(e,t).then(s=>s(this.axios,this.basePath))}listOrgPools(e,t){return L(this.configuration).listOrgPools(e,t).then(s=>s(this.axios,this.basePath))}listPools(e){return L(this.configuration).listPools(e).then(t=>t(this.axios,this.basePath))}listRepoPools(e,t){return L(this.configuration).listRepoPools(e,t).then(s=>s(this.axios,this.basePath))}updateEnterprisePool(e,t,s,o){return L(this.configuration).updateEnterprisePool(e,t,s,o).then(a=>a(this.axios,this.basePath))}updateOrgPool(e,t,s,o){return L(this.configuration).updateOrgPool(e,t,s,o).then(a=>a(this.axios,this.basePath))}updatePool(e,t,s){return L(this.configuration).updatePool(e,t,s).then(o=>o(this.axios,this.basePath))}updateRepoPool(e,t,s,o){return L(this.configuration).updateRepoPool(e,t,s,o).then(a=>a(this.axios,this.basePath))}}const Io=function(r){return{listProviders:async(e={})=>{const t="/providers",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}}}},Eo=function(r){const e=Io(r);return{async listProviders(t){const s=await e.listProviders(t),o=r?.serverIndex??0,a=P["ProvidersApi.listProviders"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)}}};class rr extends H{listProviders(e){return Eo(this.configuration).listProviders(e).then(t=>t(this.axios,this.basePath))}}const go=function(r){return{createRepo:async(e,t={})=>{d("createRepo","body",e);const s="/repositories",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},createRepoPool:async(e,t,s={})=>{d("createRepoPool","repoID",e),d("createRepoPool","body",t);const o="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},createRepoScaleSet:async(e,t,s={})=>{d("createRepoScaleSet","repoID",e),d("createRepoScaleSet","body",t);const o="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},deleteRepo:async(e,t,s={})=>{d("deleteRepo","repoID",e);const o="/repositories/{repoID}".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),t!==void 0&&(c.keepWebhook=t),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},deleteRepoPool:async(e,t,s={})=>{d("deleteRepoPool","repoID",e),d("deleteRepoPool","poolID",t);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"DELETE",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getRepo:async(e,t={})=>{d("getRepo","repoID",e);const s="/repositories/{repoID}".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getRepoPool:async(e,t,s={})=>{d("getRepoPool","repoID",e),d("getRepoPool","poolID",t);const o="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"GET",...n,...s},i={},c={};await b(i,"Authorization",r),V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},{url:S(a),options:l}},getRepoWebhookInfo:async(e,t={})=>{d("getRepoWebhookInfo","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},installRepoWebhook:async(e,t,s={})=>{d("installRepoWebhook","repoID",e),d("installRepoWebhook","body",t);const o="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},listRepoInstances:async(e,t={})=>{d("listRepoInstances","repoID",e);const s="/repositories/{repoID}/instances".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listRepoPools:async(e,t={})=>{d("listRepoPools","repoID",e);const s="/repositories/{repoID}/pools".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listRepoScaleSets:async(e,t={})=>{d("listRepoScaleSets","repoID",e);const s="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listRepos:async(e,t,s,o={})=>{const a="/repositories",n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"GET",...l,...o},c={},p={};await b(c,"Authorization",r),e!==void 0&&(p.owner=e),t!==void 0&&(p.name=t),s!==void 0&&(p.endpoint=s),V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},{url:S(n),options:i}},uninstallRepoWebhook:async(e,t={})=>{d("uninstallRepoWebhook","repoID",e);const s="/repositories/{repoID}/webhook".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},updateRepo:async(e,t,s={})=>{d("updateRepo","repoID",e),d("updateRepo","body",t);const o="/repositories/{repoID}".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},updateRepoPool:async(e,t,s,o={})=>{d("updateRepoPool","repoID",e),d("updateRepoPool","poolID",t),d("updateRepoPool","body",s);const a="/repositories/{repoID}/pools/{poolID}".replace("{repoID}",encodeURIComponent(String(e))).replace("{poolID}",encodeURIComponent(String(t))),n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"PUT",...l,...o},c={},p={};await b(c,"Authorization",r),c["Content-Type"]="application/json",V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},i.data=x(s,i,r),{url:S(n),options:i}}}},_=function(r){const e=go(r);return{async createRepo(t,s){const o=await e.createRepo(t,s),a=r?.serverIndex??0,n=P["RepositoriesApi.createRepo"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async createRepoPool(t,s,o){const a=await e.createRepoPool(t,s,o),n=r?.serverIndex??0,l=P["RepositoriesApi.createRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async createRepoScaleSet(t,s,o){const a=await e.createRepoScaleSet(t,s,o),n=r?.serverIndex??0,l=P["RepositoriesApi.createRepoScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteRepo(t,s,o){const a=await e.deleteRepo(t,s,o),n=r?.serverIndex??0,l=P["RepositoriesApi.deleteRepo"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteRepoPool(t,s,o){const a=await e.deleteRepoPool(t,s,o),n=r?.serverIndex??0,l=P["RepositoriesApi.deleteRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getRepo(t,s){const o=await e.getRepo(t,s),a=r?.serverIndex??0,n=P["RepositoriesApi.getRepo"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getRepoPool(t,s,o){const a=await e.getRepoPool(t,s,o),n=r?.serverIndex??0,l=P["RepositoriesApi.getRepoPool"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async getRepoWebhookInfo(t,s){const o=await e.getRepoWebhookInfo(t,s),a=r?.serverIndex??0,n=P["RepositoriesApi.getRepoWebhookInfo"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async installRepoWebhook(t,s,o){const a=await e.installRepoWebhook(t,s,o),n=r?.serverIndex??0,l=P["RepositoriesApi.installRepoWebhook"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async listRepoInstances(t,s){const o=await e.listRepoInstances(t,s),a=r?.serverIndex??0,n=P["RepositoriesApi.listRepoInstances"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listRepoPools(t,s){const o=await e.listRepoPools(t,s),a=r?.serverIndex??0,n=P["RepositoriesApi.listRepoPools"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listRepoScaleSets(t,s){const o=await e.listRepoScaleSets(t,s),a=r?.serverIndex??0,n=P["RepositoriesApi.listRepoScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listRepos(t,s,o,a){const n=await e.listRepos(t,s,o,a),l=r?.serverIndex??0,i=P["RepositoriesApi.listRepos"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)},async uninstallRepoWebhook(t,s){const o=await e.uninstallRepoWebhook(t,s),a=r?.serverIndex??0,n=P["RepositoriesApi.uninstallRepoWebhook"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async updateRepo(t,s,o){const a=await e.updateRepo(t,s,o),n=r?.serverIndex??0,l=P["RepositoriesApi.updateRepo"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async updateRepoPool(t,s,o,a){const n=await e.updateRepoPool(t,s,o,a),l=r?.serverIndex??0,i=P["RepositoriesApi.updateRepoPool"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)}}};class sr extends H{createRepo(e,t){return _(this.configuration).createRepo(e,t).then(s=>s(this.axios,this.basePath))}createRepoPool(e,t,s){return _(this.configuration).createRepoPool(e,t,s).then(o=>o(this.axios,this.basePath))}createRepoScaleSet(e,t,s){return _(this.configuration).createRepoScaleSet(e,t,s).then(o=>o(this.axios,this.basePath))}deleteRepo(e,t,s){return _(this.configuration).deleteRepo(e,t,s).then(o=>o(this.axios,this.basePath))}deleteRepoPool(e,t,s){return _(this.configuration).deleteRepoPool(e,t,s).then(o=>o(this.axios,this.basePath))}getRepo(e,t){return _(this.configuration).getRepo(e,t).then(s=>s(this.axios,this.basePath))}getRepoPool(e,t,s){return _(this.configuration).getRepoPool(e,t,s).then(o=>o(this.axios,this.basePath))}getRepoWebhookInfo(e,t){return _(this.configuration).getRepoWebhookInfo(e,t).then(s=>s(this.axios,this.basePath))}installRepoWebhook(e,t,s){return _(this.configuration).installRepoWebhook(e,t,s).then(o=>o(this.axios,this.basePath))}listRepoInstances(e,t){return _(this.configuration).listRepoInstances(e,t).then(s=>s(this.axios,this.basePath))}listRepoPools(e,t){return _(this.configuration).listRepoPools(e,t).then(s=>s(this.axios,this.basePath))}listRepoScaleSets(e,t){return _(this.configuration).listRepoScaleSets(e,t).then(s=>s(this.axios,this.basePath))}listRepos(e,t,s,o){return _(this.configuration).listRepos(e,t,s,o).then(a=>a(this.axios,this.basePath))}uninstallRepoWebhook(e,t){return _(this.configuration).uninstallRepoWebhook(e,t).then(s=>s(this.axios,this.basePath))}updateRepo(e,t,s){return _(this.configuration).updateRepo(e,t,s).then(o=>o(this.axios,this.basePath))}updateRepoPool(e,t,s,o){return _(this.configuration).updateRepoPool(e,t,s,o).then(a=>a(this.axios,this.basePath))}}const xo=function(r){return{createEnterpriseScaleSet:async(e,t,s={})=>{d("createEnterpriseScaleSet","enterpriseID",e),d("createEnterpriseScaleSet","body",t);const o="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},createOrgScaleSet:async(e,t,s={})=>{d("createOrgScaleSet","orgID",e),d("createOrgScaleSet","body",t);const o="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},createRepoScaleSet:async(e,t,s={})=>{d("createRepoScaleSet","repoID",e),d("createRepoScaleSet","body",t);const o="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"POST",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}},deleteScaleSet:async(e,t={})=>{d("deleteScaleSet","scalesetID",e);const s="/scalesets/{scalesetID}".replace("{scalesetID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getScaleSet:async(e,t={})=>{d("getScaleSet","scalesetID",e);const s="/scalesets/{scalesetID}".replace("{scalesetID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listEnterpriseScaleSets:async(e,t={})=>{d("listEnterpriseScaleSets","enterpriseID",e);const s="/enterprises/{enterpriseID}/scalesets".replace("{enterpriseID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listOrgScaleSets:async(e,t={})=>{d("listOrgScaleSets","orgID",e);const s="/organizations/{orgID}/scalesets".replace("{orgID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listRepoScaleSets:async(e,t={})=>{d("listRepoScaleSets","repoID",e);const s="/repositories/{repoID}/scalesets".replace("{repoID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listScalesets:async(e={})=>{const t="/scalesets",s=new URL(t,m);let o;r&&(o=r.baseOptions);const a={method:"GET",...o,...e},n={},l={};await b(n,"Authorization",r),V(s,l);let i=o&&o.headers?o.headers:{};return a.headers={...n,...i,...e.headers},{url:S(s),options:a}},updateScaleSet:async(e,t,s={})=>{d("updateScaleSet","scalesetID",e),d("updateScaleSet","body",t);const o="/scalesets/{scalesetID}".replace("{scalesetID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}}}},Z=function(r){const e=xo(r);return{async createEnterpriseScaleSet(t,s,o){const a=await e.createEnterpriseScaleSet(t,s,o),n=r?.serverIndex??0,l=P["ScalesetsApi.createEnterpriseScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async createOrgScaleSet(t,s,o){const a=await e.createOrgScaleSet(t,s,o),n=r?.serverIndex??0,l=P["ScalesetsApi.createOrgScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async createRepoScaleSet(t,s,o){const a=await e.createRepoScaleSet(t,s,o),n=r?.serverIndex??0,l=P["ScalesetsApi.createRepoScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)},async deleteScaleSet(t,s){const o=await e.deleteScaleSet(t,s),a=r?.serverIndex??0,n=P["ScalesetsApi.deleteScaleSet"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getScaleSet(t,s){const o=await e.getScaleSet(t,s),a=r?.serverIndex??0,n=P["ScalesetsApi.getScaleSet"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listEnterpriseScaleSets(t,s){const o=await e.listEnterpriseScaleSets(t,s),a=r?.serverIndex??0,n=P["ScalesetsApi.listEnterpriseScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listOrgScaleSets(t,s){const o=await e.listOrgScaleSets(t,s),a=r?.serverIndex??0,n=P["ScalesetsApi.listOrgScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listRepoScaleSets(t,s){const o=await e.listRepoScaleSets(t,s),a=r?.serverIndex??0,n=P["ScalesetsApi.listRepoScaleSets"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listScalesets(t){const s=await e.listScalesets(t),o=r?.serverIndex??0,a=P["ScalesetsApi.listScalesets"]?.[o]?.url;return(n,l)=>A(s,u,O,r)(n,a||l)},async updateScaleSet(t,s,o){const a=await e.updateScaleSet(t,s,o),n=r?.serverIndex??0,l=P["ScalesetsApi.updateScaleSet"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)}}};class ar extends H{createEnterpriseScaleSet(e,t,s){return Z(this.configuration).createEnterpriseScaleSet(e,t,s).then(o=>o(this.axios,this.basePath))}createOrgScaleSet(e,t,s){return Z(this.configuration).createOrgScaleSet(e,t,s).then(o=>o(this.axios,this.basePath))}createRepoScaleSet(e,t,s){return Z(this.configuration).createRepoScaleSet(e,t,s).then(o=>o(this.axios,this.basePath))}deleteScaleSet(e,t){return Z(this.configuration).deleteScaleSet(e,t).then(s=>s(this.axios,this.basePath))}getScaleSet(e,t){return Z(this.configuration).getScaleSet(e,t).then(s=>s(this.axios,this.basePath))}listEnterpriseScaleSets(e,t){return Z(this.configuration).listEnterpriseScaleSets(e,t).then(s=>s(this.axios,this.basePath))}listOrgScaleSets(e,t){return Z(this.configuration).listOrgScaleSets(e,t).then(s=>s(this.axios,this.basePath))}listRepoScaleSets(e,t){return Z(this.configuration).listRepoScaleSets(e,t).then(s=>s(this.axios,this.basePath))}listScalesets(e){return Z(this.configuration).listScalesets(e).then(t=>t(this.axios,this.basePath))}updateScaleSet(e,t,s){return Z(this.configuration).updateScaleSet(e,t,s).then(o=>o(this.axios,this.basePath))}}const vo=function(r){return{createTemplate:async(e,t={})=>{d("createTemplate","body",e);const s="/templates",o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"POST",...a,...t},l={},i={};await b(l,"Authorization",r),l["Content-Type"]="application/json",V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},n.data=x(e,n,r),{url:S(o),options:n}},deleteTemplate:async(e,t={})=>{d("deleteTemplate","templateID",e);const s="/templates/{templateID}".replace("{templateID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"DELETE",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},getTemplate:async(e,t={})=>{d("getTemplate","templateID",e);const s="/templates/{templateID}".replace("{templateID}",encodeURIComponent(String(e))),o=new URL(s,m);let a;r&&(a=r.baseOptions);const n={method:"GET",...a,...t},l={},i={};await b(l,"Authorization",r),V(o,i);let c=a&&a.headers?a.headers:{};return n.headers={...l,...c,...t.headers},{url:S(o),options:n}},listTemplates:async(e,t,s,o={})=>{const a="/templates",n=new URL(a,m);let l;r&&(l=r.baseOptions);const i={method:"GET",...l,...o},c={},p={};await b(c,"Authorization",r),e!==void 0&&(p.osType=e),t!==void 0&&(p.partialName=t),s!==void 0&&(p.forgeType=s),V(n,p);let R=l&&l.headers?l.headers:{};return i.headers={...c,...R,...o.headers},{url:S(n),options:i}},updateTemplate:async(e,t,s={})=>{d("updateTemplate","templateID",e),d("updateTemplate","body",t);const o="/templates/{templateID}".replace("{templateID}",encodeURIComponent(String(e))),a=new URL(o,m);let n;r&&(n=r.baseOptions);const l={method:"PUT",...n,...s},i={},c={};await b(i,"Authorization",r),i["Content-Type"]="application/json",V(a,c);let p=n&&n.headers?n.headers:{};return l.headers={...i,...p,...s.headers},l.data=x(t,l,r),{url:S(a),options:l}}}},Ee=function(r){const e=vo(r);return{async createTemplate(t,s){const o=await e.createTemplate(t,s),a=r?.serverIndex??0,n=P["TemplatesApi.createTemplate"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async deleteTemplate(t,s){const o=await e.deleteTemplate(t,s),a=r?.serverIndex??0,n=P["TemplatesApi.deleteTemplate"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async getTemplate(t,s){const o=await e.getTemplate(t,s),a=r?.serverIndex??0,n=P["TemplatesApi.getTemplate"]?.[a]?.url;return(l,i)=>A(o,u,O,r)(l,n||i)},async listTemplates(t,s,o,a){const n=await e.listTemplates(t,s,o,a),l=r?.serverIndex??0,i=P["TemplatesApi.listTemplates"]?.[l]?.url;return(c,p)=>A(n,u,O,r)(c,i||p)},async updateTemplate(t,s,o){const a=await e.updateTemplate(t,s,o),n=r?.serverIndex??0,l=P["TemplatesApi.updateTemplate"]?.[n]?.url;return(i,c)=>A(a,u,O,r)(i,l||c)}}};class Uo extends H{createTemplate(e,t){return Ee(this.configuration).createTemplate(e,t).then(s=>s(this.axios,this.basePath))}deleteTemplate(e,t){return Ee(this.configuration).deleteTemplate(e,t).then(s=>s(this.axios,this.basePath))}getTemplate(e,t){return Ee(this.configuration).getTemplate(e,t).then(s=>s(this.axios,this.basePath))}listTemplates(e,t,s,o){return Ee(this.configuration).listTemplates(e,t,s,o).then(a=>a(this.axios,this.basePath))}updateTemplate(e,t,s){return Ee(this.configuration).updateTemplate(e,t,s).then(o=>o(this.axios,this.basePath))}}class or{apiKey;username;password;accessToken;basePath;serverIndex;baseOptions;formDataCtor;constructor(e={}){this.apiKey=e.apiKey,this.username=e.username,this.password=e.password,this.accessToken=e.accessToken,this.basePath=e.basePath,this.serverIndex=e.serverIndex,this.baseOptions={...e.baseOptions,headers:{...e.baseOptions?.headers}},this.formDataCtor=e.formDataCtor}isJsonMime(e){const t=new RegExp("^(application/json|[^;/ ]+/[^;/ ]+[+]json)[ ]*(;.*)?$","i");return e!==null&&(t.test(e)||e.toLowerCase()==="application/json-patch+json")}}class kr{baseUrl;token;config;isDevelopmentMode(){return typeof window>"u"?!1:window.location.port==="5173"}loginApi;controllerInfoApi;controllerApi;endpointsApi;credentialsApi;repositoriesApi;organizationsApi;enterprisesApi;poolsApi;scaleSetsApi;instancesApi;providersApi;firstRunApi;hooksApi;templatesApi;constructor(e=""){this.baseUrl=e||window.location.origin;const t=this.isDevelopmentMode();this.config=new or({basePath:`${this.baseUrl}/api/v1`,accessToken:()=>this.token||"",baseOptions:{withCredentials:!t}}),this.loginApi=new Zt(this.config),this.controllerInfoApi=new Wt(this.config),this.controllerApi=new Nt(this.config),this.endpointsApi=new Mt(this.config),this.credentialsApi=new Qt(this.config),this.repositoriesApi=new sr(this.config),this.organizationsApi=new er(this.config),this.enterprisesApi=new Jt(this.config),this.poolsApi=new tr(this.config),this.scaleSetsApi=new ar(this.config),this.instancesApi=new Yt(this.config),this.providersApi=new rr(this.config),this.firstRunApi=new Kt(this.config),this.hooksApi=new Xt(this.config),this.templatesApi=new Uo(this.config)}setToken(e){this.token=e;const t=this.isDevelopmentMode();this.config=new or({basePath:`${this.baseUrl}/api/v1`,accessToken:()=>e,baseOptions:{withCredentials:!t}}),this.loginApi=new Zt(this.config),this.controllerInfoApi=new Wt(this.config),this.controllerApi=new Nt(this.config),this.endpointsApi=new Mt(this.config),this.credentialsApi=new Qt(this.config),this.repositoriesApi=new sr(this.config),this.organizationsApi=new er(this.config),this.enterprisesApi=new Jt(this.config),this.poolsApi=new tr(this.config),this.scaleSetsApi=new ar(this.config),this.instancesApi=new Yt(this.config),this.providersApi=new rr(this.config),this.firstRunApi=new Kt(this.config),this.hooksApi=new Xt(this.config)}async login(e){const t={username:e.username,password:e.password},o=(await this.loginApi.login(t)).data.token;if(o)return this.setToken(o),{token:o};throw new Error("Login failed")}async getControllerInfo(){return(await this.controllerInfoApi.controllerInfo()).data}async listGithubEndpoints(){return(await this.endpointsApi.listGithubEndpoints()).data||[]}async getGithubEndpoint(e){return(await this.endpointsApi.getGithubEndpoint(e)).data}async createGithubEndpoint(e){return(await this.endpointsApi.createGithubEndpoint(e)).data}async updateGithubEndpoint(e,t){return(await this.endpointsApi.updateGithubEndpoint(e,t)).data}async deleteGithubEndpoint(e){await this.endpointsApi.deleteGithubEndpoint(e)}async listGiteaEndpoints(){return(await this.endpointsApi.listGiteaEndpoints()).data||[]}async getGiteaEndpoint(e){return(await this.endpointsApi.getGiteaEndpoint(e)).data}async createGiteaEndpoint(e){return(await this.endpointsApi.createGiteaEndpoint(e)).data}async updateGiteaEndpoint(e,t){return(await this.endpointsApi.updateGiteaEndpoint(e,t)).data}async deleteGiteaEndpoint(e){await this.endpointsApi.deleteGiteaEndpoint(e)}async listAllEndpoints(){const[e,t]=await Promise.all([this.listGithubEndpoints().catch(()=>[]),this.listGiteaEndpoints().catch(()=>[])]);return[...e.map(s=>({...s,endpoint_type:"github"})),...t.map(s=>({...s,endpoint_type:"gitea"}))]}async listGithubCredentials(){return(await this.credentialsApi.listCredentials()).data||[]}async getGithubCredentials(e){return(await this.credentialsApi.getCredentials(e)).data}async createGithubCredentials(e){return(await this.credentialsApi.createCredentials(e)).data}async updateGithubCredentials(e,t){return(await this.credentialsApi.updateCredentials(e,t)).data}async deleteGithubCredentials(e){await this.credentialsApi.deleteCredentials(e)}async listGiteaCredentials(){return(await this.credentialsApi.listGiteaCredentials()).data||[]}async getGiteaCredentials(e){return(await this.credentialsApi.getGiteaCredentials(e)).data}async createGiteaCredentials(e){return(await this.credentialsApi.createGiteaCredentials(e)).data}async updateGiteaCredentials(e,t){return(await this.credentialsApi.updateGiteaCredentials(e,t)).data}async deleteGiteaCredentials(e){await this.credentialsApi.deleteGiteaCredentials(e)}async listAllCredentials(){const[e,t]=await Promise.all([this.listGithubCredentials().catch(()=>[]),this.listGiteaCredentials().catch(()=>[])]);return[...e,...t]}async installRepositoryWebhook(e,t={}){await this.repositoriesApi.installRepoWebhook(e,t)}async uninstallRepositoryWebhook(e){await this.hooksApi.uninstallRepoWebhook(e)}async getRepositoryWebhookInfo(e){return(await this.hooksApi.getRepoWebhookInfo(e)).data}async listRepositories(){return(await this.repositoriesApi.listRepos()).data||[]}async getRepository(e){return(await this.repositoriesApi.getRepo(e)).data}async createRepository(e){return(await this.repositoriesApi.createRepo(e)).data}async updateRepository(e,t){return(await this.repositoriesApi.updateRepo(e,t)).data}async deleteRepository(e){await this.repositoriesApi.deleteRepo(e)}async installRepoWebhook(e){await this.repositoriesApi.installRepoWebhook(e,{})}async listRepositoryPools(e){return(await this.repositoriesApi.listRepoPools(e)).data||[]}async listRepositoryInstances(e){return(await this.repositoriesApi.listRepoInstances(e)).data||[]}async createRepositoryPool(e,t){return(await this.repositoriesApi.createRepoPool(e,t)).data}async installOrganizationWebhook(e,t={}){await this.organizationsApi.installOrgWebhook(e,t)}async uninstallOrganizationWebhook(e){await this.hooksApi.uninstallOrgWebhook(e)}async getOrganizationWebhookInfo(e){return(await this.hooksApi.getOrgWebhookInfo(e)).data}async listOrganizations(){return(await this.organizationsApi.listOrgs()).data||[]}async getOrganization(e){return(await this.organizationsApi.getOrg(e)).data}async createOrganization(e){return(await this.organizationsApi.createOrg(e)).data}async updateOrganization(e,t){return(await this.organizationsApi.updateOrg(e,t)).data}async deleteOrganization(e){await this.organizationsApi.deleteOrg(e)}async listOrganizationPools(e){return(await this.organizationsApi.listOrgPools(e)).data||[]}async listOrganizationInstances(e){return(await this.organizationsApi.listOrgInstances(e)).data||[]}async createOrganizationPool(e,t){return(await this.organizationsApi.createOrgPool(e,t)).data}async listEnterprises(){return(await this.enterprisesApi.listEnterprises()).data||[]}async getEnterprise(e){return(await this.enterprisesApi.getEnterprise(e)).data}async createEnterprise(e){return(await this.enterprisesApi.createEnterprise(e)).data}async updateEnterprise(e,t){return(await this.enterprisesApi.updateEnterprise(e,t)).data}async deleteEnterprise(e){await this.enterprisesApi.deleteEnterprise(e)}async listEnterprisePools(e){return(await this.enterprisesApi.listEnterprisePools(e)).data||[]}async listEnterpriseInstances(e){return(await this.enterprisesApi.listEnterpriseInstances(e)).data||[]}async createEnterprisePool(e,t){return(await this.enterprisesApi.createEnterprisePool(e,t)).data}async createRepositoryScaleSet(e,t){return(await this.repositoriesApi.createRepoScaleSet(e,t)).data}async listRepositoryScaleSets(e){return(await this.repositoriesApi.listRepoScaleSets(e)).data||[]}async createOrganizationScaleSet(e,t){return(await this.organizationsApi.createOrgScaleSet(e,t)).data}async listOrganizationScaleSets(e){return(await this.organizationsApi.listOrgScaleSets(e)).data||[]}async createEnterpriseScaleSet(e,t){return(await this.enterprisesApi.createEnterpriseScaleSet(e,t)).data}async listEnterpriseScaleSets(e){return(await this.enterprisesApi.listEnterpriseScaleSets(e)).data||[]}async listPools(){return(await this.poolsApi.listPools()).data||[]}async listAllPools(){return this.listPools()}async getPool(e){return(await this.poolsApi.getPool(e)).data}async updatePool(e,t){return(await this.poolsApi.updatePool(e,t)).data}async deletePool(e){await this.poolsApi.deletePool(e)}async listScaleSets(){return(await this.scaleSetsApi.listScalesets()).data||[]}async getScaleSet(e){return(await this.scaleSetsApi.getScaleSet(e.toString())).data}async updateScaleSet(e,t){return(await this.scaleSetsApi.updateScaleSet(e.toString(),t)).data}async deleteScaleSet(e){await this.scaleSetsApi.deleteScaleSet(e.toString())}async listInstances(){return(await this.instancesApi.listInstances()).data||[]}async getInstance(e){return(await this.instancesApi.getInstance(e)).data}async deleteInstance(e){await this.instancesApi.deleteInstance(e)}async listProviders(){return(await this.providersApi.listProviders()).data||[]}async listCredentials(){return this.listAllCredentials()}async listEndpoints(){return this.listAllEndpoints()}async firstRun(e){return(await this.firstRunApi.firstRun(e)).data}async updateController(e){return(await this.controllerApi.updateController(e)).data}async listTemplates(e,t,s){return(await this.templatesApi.listTemplates(e,t,s)).data||[]}async getTemplate(e){return(await this.templatesApi.getTemplate(e)).data}async createTemplate(e){return(await this.templatesApi.createTemplate(e)).data}async updateTemplate(e,t){return(await this.templatesApi.updateTemplate(e.toString(),t)).data}async deleteTemplate(e){await this.templatesApi.deleteTemplate(e)}}new kr;class Co extends kr{constructor(e=""){super(e)}}const pn=new Co;var To=Ot(''),Bo=Ot(''),Do=Ot(''),Lo=Ss("");function dn(r,e){const t=wt(e,["children","$$slots","$$events","$$legacy"]),s=wt(t,["variant","size","disabled","loading","type","fullWidth","icon","iconPosition"]);ms(e,!1);const o=ae(),a=ae(),n=ae(),l=ae(),i=ae(),c=ae(),p=ae(),R=ae(),I=bs();let B=ne(e,"variant",8,"primary"),y=ne(e,"size",8,"md"),f=ne(e,"disabled",8,!1),w=ne(e,"loading",8,!1),U=ne(e,"type",8,"button"),j=ne(e,"fullWidth",8,!1),E=ne(e,"icon",8,null),g=ne(e,"iconPosition",8,"left");function T(){!f()&&!w()&&I("click")}se(()=>{},()=>{oe(o,"inline-flex items-center justify-center font-medium rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-900 cursor-pointer disabled:cursor-not-allowed")}),se(()=>ce(y()),()=>{oe(a,{sm:"px-3 py-2 text-sm",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"}[y()])}),se(()=>ce(B()),()=>{oe(n,{primary:"text-white bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 disabled:bg-gray-400 disabled:hover:bg-gray-400",secondary:"text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600 focus:ring-blue-500",danger:"text-white bg-red-600 hover:bg-red-700 focus:ring-red-500 disabled:bg-gray-400 disabled:hover:bg-gray-400",ghost:"text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800 focus:ring-blue-500"}[B()])}),se(()=>ce(j()),()=>{oe(l,j()?"w-full":"")}),se(()=>ce(f()),()=>{oe(i,f()?"opacity-50":"")}),se(()=>(F(o),F(a),F(n),F(l),F(i)),()=>{oe(c,[F(o),F(a),F(n),F(l),F(i)].filter(Boolean).join(" "))}),se(()=>ce(y()),()=>{oe(p,{sm:"h-4 w-4",md:"h-5 w-5",lg:"h-6 w-6"}[y()])}),se(()=>(ce(g()),ce(y())),()=>{oe(R,{sm:g()==="left"?"-ml-0.5 mr-2":"ml-2 -mr-0.5",md:g()==="left"?"-ml-1 mr-2":"ml-2 -mr-1",lg:g()==="left"?"-ml-1 mr-3":"ml-3 -mr-1"}[y()])}),Vs(),_r();var D=Lo();Bs(D,()=>({type:U(),disabled:f(),class:F(c),...s}));var C=Xe(D);{var ie=z=>{var k=To();ke(()=>Fe(k,0,`animate-spin ${F(p)??""} ${g()==="left"?"-ml-1 mr-2":"ml-2 -mr-1"}`)),ye(z,k)},te=z=>{var k=ys(),Oe=fs(k);{var M=Pe=>{var W=Bo(),Be=Xe(W);It(Be,E,!0),Ye(W),ke(()=>Fe(W,0,`${F(p)??""} ${F(R)??""}`)),ye(Pe,W)};Ze(Oe,Pe=>{E()&&g()==="left"&&Pe(M)},!0)}ye(z,k)};Ze(C,z=>{w()?z(ie):z(te,!1)})}var Re=ft(C,2);ws(Re,e,"default",{});var Te=ft(Re,2);{var ue=z=>{var k=Do(),Oe=Xe(k);It(Oe,E,!0),Ye(k),ke(()=>Fe(k,0,`${F(p)??""} ${F(R)??""}`)),ye(z,k)};Ze(Te,z=>{E()&&g()==="right"&&!w()&&z(ue)})}Ye(D),As("click",D,T),ye(r,D),Rs()}export{dn as B,Ho as a,_o as b,He as c,$o as d,Bs as e,gs as f,pn as g,It as h,ws as i,Us as j,qo as r,Fe as s}; diff --git a/webapp/assets/_app/immutable/chunks/Du50aAe5.js b/webapp/assets/_app/immutable/chunks/Du50aAe5.js new file mode 100644 index 00000000..b8664f0a --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/Du50aAe5.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as pe}from"./C7KraPli.js";import{aj as gt,aU as ft,aV as ht,J as mt,L as pt,M as xt,N as kt,O as yt,at as _t,H as We,I as bt,Q as wt,P as Mt,a1 as Pt,p as ue,l as we,k as Me,m as Pe,q as p,h as Ee,C as xe,d as s,g as e,r as i,t as R,b as n,c as ge,f as T,s as P,e as U,z as Be,D as Te,B as F,a as V,E as Ce,i as et,y as Ct,v as Q,u as c}from"./cPTQ2Ibn.js";import{p as d,i as z,b as jt}from"./DqFqoVWr.js";import{e as se,i as ve}from"./CiWDXYQd.js";import{h as Fe,s as me,B as be,r as zt,c as Ae,b as Tt,d as It,i as Xe,j as Lt}from"./DqbUkQgD.js";import{c as Ht}from"./41x1-UqF.js";import{b as St}from"./B-_QCM7E.js";import{A as tt}from"./C2rI8IaC.js";import{B as Bt,g as Ye,b as At}from"./DJsB5Z5V.js";function $e(H,r,g){We&&bt();var a=H,t=_t,x,h,m=null,u=gt()?ft:ht;function I(){x&&wt(x),m!==null&&(m.lastChild.remove(),a.before(m),m=null),x=h}mt(()=>{if(u(t,t=r())){var b=a,S=yt();S&&(m=document.createDocumentFragment(),m.append(b=pt())),h=xt(()=>g(b)),S?kt.add_callback(I):I()}}),We&&(a=Mt)}function Se(H,r){var g=H.$$events?.[r.type],a=Pt(g)?g.slice():g==null?[]:[g];for(var t of a)t.call(this,r)}var Et=xe('');function Dt(H,r){ue(r,!1);const g=Pe();let a=d(r,"name",8),t=d(r,"class",8,"h-5 w-5");const x={plus:'',edit:'',delete:'',view:'',close:'',check:'',x:'',"chevron-left":'',"chevron-right":'',"chevron-down":'',"chevron-up":'',search:'',refresh:'',menu:'',settings:'',"check-circle":'',"x-circle":'',"exclamation-circle":'',"information-circle":'',loading:'',sun:'',moon:'',document:'',folder:''};we(()=>p(a()),()=>{Me(g,x[a()]||"")}),Ee();var h=Et(),m=s(h);Fe(m,()=>e(g),!0),i(h),R(()=>me(h,0,`${t()}`)),n(H,h),ge()}var Nt=T('

');function Vt(H,r){let g=d(r,"message",8,"Loading...");var a=Nt(),t=P(s(a),2),x=s(t,!0);i(t),i(a),R(()=>U(x,g())),n(H,a)}var Rt=T('
'),Ut=T('

');function qt(H,r){let g=d(r,"title",8,"Error"),a=d(r,"message",8),t=d(r,"showRetry",8,!1),x=d(r,"onRetry",8,void 0);var h=Ut(),m=s(h),u=s(m),I=P(s(u),2),b=s(I),S=s(b,!0);i(b);var G=P(b,2),q=s(G,!0);i(G);var E=P(G,2);{var K=B=>{var w=Rt(),A=s(w);be(A,{variant:"secondary",size:"sm",icon:"",class:"text-red-700 dark:text-red-200 bg-red-100 dark:bg-red-800 hover:bg-red-200 dark:hover:bg-red-700 focus:outline-none focus:bg-red-200 dark:focus:bg-red-700",$$events:{click(...N){x()?.apply(this,N)}},children:(N,X)=>{Be();var ee=Te("Retry");n(N,ee)},$$slots:{default:!0}}),i(w),n(B,w)};z(E,B=>{t()&&x()&&B(K)})}i(I),i(u),i(m),i(h),R(()=>{U(S,g()),U(q,a())}),n(H,h)}var Ot=xe(''),Ft=xe(''),Gt=xe(''),Jt=xe(''),Qt=xe(''),Zt=xe(''),Kt=T('

');function Wt(H,r){let g=d(r,"title",8),a=d(r,"message",8),t=d(r,"iconType",8,"document");var x=Kt(),h=s(x);{var m=q=>{var E=Ot();n(q,E)},u=q=>{var E=F(),K=V(E);{var B=A=>{var N=Ft();n(A,N)},w=A=>{var N=F(),X=V(N);{var ee=v=>{var l=Gt();n(v,l)},o=v=>{var l=F(),f=V(l);{var D=_=>{var L=Jt();n(_,L)},Z=_=>{var L=F(),C=V(L);{var M=j=>{var J=Qt();n(j,J)},k=j=>{var J=F(),W=V(J);{var $=re=>{var le=Zt();n(re,le)};z(W,re=>{t()==="settings"&&re($)},!0)}n(j,J)};z(C,j=>{t()==="key"?j(M):j(k,!1)},!0)}n(_,L)};z(f,_=>{t()==="cog"?_(D):_(Z,!1)},!0)}n(v,l)};z(X,v=>{t()==="users"?v(ee):v(o,!1)},!0)}n(A,N)};z(K,A=>{t()==="building"?A(B):A(w,!1)},!0)}n(q,E)};z(h,q=>{t()==="document"?q(m):q(u,!1)})}var I=P(h,2),b=s(I,!0);i(I);var S=P(I,2),G=s(S,!0);i(S),i(x),R(()=>{U(b,g()),U(G,a())}),n(H,x)}var Xt=T('
');function Yt(H,r){ue(r,!1);let g=d(r,"value",12,""),a=d(r,"placeholder",8,"Search..."),t=d(r,"disabled",8,!1);const x=Ce();function h(){x("input",g())}pe();var m=Xt(),u=s(m),I=s(u);Dt(I,{name:"search",class:"h-5 w-5 text-gray-400"}),i(u);var b=P(u,2);zt(b),i(m),R(()=>{Ae(b,"placeholder",a()),b.disabled=t()}),St(b,g),et("input",b,h),n(H,m),ge()}var $t=T(""),er=T('
'),tr=T('
');function rr(H,r){ue(r,!1);let g=d(r,"searchTerm",12,""),a=d(r,"perPage",12,25),t=d(r,"placeholder",8,"Search..."),x=d(r,"showPerPageSelector",8,!0),h=d(r,"perPageOptions",24,()=>[25,50,100]);const m=Ce();function u(){m("search",{term:g()})}function I(){m("perPageChange",{perPage:a()})}pe();var b=tr(),S=s(b),G=s(S),q=s(G),E=P(s(q),2);Yt(E,{get placeholder(){return t()},get value(){return g()},set value(w){g(w)},$$events:{input:u},$$legacy:!0}),i(q),i(G);var K=P(G,2);{var B=w=>{var A=er(),N=s(A),X=P(s(N),2);R(()=>{a(),Ct(()=>{h()})}),se(X,5,h,ve,(ee,o)=>{var v=$t(),l=s(v,!0);i(v);var f={};R(()=>{U(l,e(o)),f!==(f=e(o))&&(v.value=(v.__value=e(o))??"")}),n(ee,v)}),i(X),i(N),i(A),Tt(X,a),et("change",X,I),n(w,A)};z(K,w=>{x()&&w(B)})}i(S),i(b),n(H,b),ge()}var ar=T('Showing to of ',1),nr=T('
');function ir(H,r){ue(r,!1);const g=Pe(),a=Pe();let t=d(r,"currentPage",8,1),x=d(r,"totalPages",8,1),h=d(r,"perPage",8,25),m=d(r,"totalItems",8,0),u=d(r,"itemName",8,"results");const I=Ce();function b(E){E>=1&&E<=x()&&E!==t()&&I("pageChange",{page:E})}we(()=>(p(m()),p(t()),p(h())),()=>{Me(g,m()===0?0:(t()-1)*h()+1)}),we(()=>(p(t()),p(h()),p(m())),()=>{Me(a,Math.min(t()*h(),m()))}),Ee(),pe();var S=F(),G=V(S);{var q=E=>{var K=nr(),B=s(K),w=s(B);{let C=Q(()=>t()===1);be(w,{variant:"secondary",get disabled(){return e(C)},$$events:{click:()=>b(t()-1)},children:(M,k)=>{Be();var j=Te("Previous");n(M,j)},$$slots:{default:!0}})}var A=P(w,2);{let C=Q(()=>t()===x());be(A,{variant:"secondary",get disabled(){return e(C)},class:"ml-3",$$events:{click:()=>b(t()+1)},children:(M,k)=>{Be();var j=Te("Next");n(M,j)},$$slots:{default:!0}})}i(B);var N=P(B,2),X=s(N),ee=s(X),o=s(ee);{var v=C=>{var M=Te();R(()=>U(M,`No ${u()??""}`)),n(C,M)},l=C=>{var M=ar(),k=P(V(M)),j=s(k,!0);i(k);var J=P(k,2),W=s(J,!0);i(J);var $=P(J,2),re=s($,!0);i($);var le=P($);R(()=>{U(j,e(g)),U(W,e(a)),U(re,m()),U(le,` ${u()??""}`)}),n(C,M)};z(o,C=>{m()===0?C(v):C(l,!1)})}i(ee),i(X);var f=P(X,2),D=s(f),Z=s(D);{let C=Q(()=>t()===1);be(Z,{variant:"secondary",size:"sm",get disabled(){return e(C)},class:"rounded-r-none","aria-label":"Previous page",icon:"",$$events:{click:()=>b(t()-1)}})}var _=P(Z,2);se(_,1,()=>(p(x()),c(()=>Array(x()))),ve,(C,M,k)=>{const j=Q(()=>k+1);{let J=Q(()=>e(j)===t()?"primary":"secondary");be(C,{get variant(){return e(J)},size:"sm",class:"rounded-none border-l-0 first:border-l first:rounded-l-md",$$events:{click:()=>b(e(j))},children:(W,$)=>{Be();var re=Te();R(()=>U(re,e(j))),n(W,re)},$$slots:{default:!0}})}});var L=P(_,2);{let C=Q(()=>t()===x());be(L,{variant:"secondary",size:"sm",get disabled(){return e(C)},class:"rounded-l-none","aria-label":"Next page",icon:"",$$events:{click:()=>b(t()+1)}})}i(D),i(f),i(N),i(K),n(E,K)};z(G,E=>{x()>1&&E(q)})}n(H,S),ge()}var or=T('

'),sr=T('

'),lr=T('

'),dr=T('

'),vr=T('
'),cr=T('
'),ur=T('
'),gr=T(" "),fr=T('
'),hr=T('
');function mr(H,r){ue(r,!1);const g=Ce();let a=d(r,"item",8),t=d(r,"config",8);function x(){if(!a())return"Unknown";const{field:o,useId:v,showOwner:l}=t().primaryText,f=a()[o];return v&&f?`${f.slice(0,8)}...`:l&&a().owner&&a().name?`${a().owner}/${a().name}`:f||"Unknown"}function h(){if(!t().secondaryText)return"";const{field:o,computedValue:v}=t().secondaryText;return v!==void 0?typeof v=="function"?v(a()):v:a()?.[o]||""}function m(){if(!t().primaryText.href||!a())return"#";let o=t().primaryText.href;return o=o.replace("{id}",a().id||""),o=o.replace("{name}",encodeURIComponent(a().name||"")),It(o)}function u(o){if(!a())return;const v=t().actions?.find(l=>l.type===o);v&&v.handler(a()),o==="edit"?g("edit",{item:a()}):o==="delete"?g("delete",{item:a()}):o==="clone"?g("clone",{item:a()}):g("action",{type:o,item:a()})}function I(o){switch(o.type){case"status":if(t().entityType==="instance"){const l=a()?.[o.field]||"unknown";let f="neutral",D=l.charAt(0).toUpperCase()+l.slice(1);return o.field==="status"?f=l==="running"?"success":l==="pending"||l==="creating"?"info":l==="failed"||l==="error"?"error":"neutral":o.field==="runner_status"&&(f=l==="idle"?"info":l==="active"||l==="running"?"success":l==="failed"||l==="error"?"error":"neutral"),{variant:f,text:D}}return{variant:"neutral",text:a()?.[o.field]||"Unknown"};case"forge":return{variant:"neutral",text:a()?.[o.field]||"unknown"};case"auth":const v=a()?.[o.field]||"pat";return{variant:v==="pat"?"success":"info",text:v.toUpperCase()};case"custom":if(typeof o.value=="function"){const l=o.value(a());return{variant:l?.variant||"neutral",text:l?.text||""}}return{variant:o.value?.variant||"neutral",text:o.value?.text||""};default:return{variant:"neutral",text:""}}}pe();var b=hr(),S=s(b),G=s(S);{var q=o=>{var v=sr(),l=s(v),f=s(l,!0);i(l);var D=P(l,2);{var Z=_=>{var L=or(),C=s(L,!0);i(L),R(M=>U(C,M),[()=>c(h)]),n(_,L)};z(D,_=>{p(t()),c(()=>t().secondaryText)&&_(Z)})}i(v),R((_,L)=>{Ae(v,"href",_),me(l,1,`text-sm font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300 truncate${p(t()),c(()=>t().primaryText.isMonospace?" font-mono":"")??""}`),U(f,L)},[()=>c(m),()=>c(x)]),n(o,v)},E=o=>{var v=dr(),l=s(v),f=s(l,!0);i(l);var D=P(l,2);{var Z=_=>{var L=lr(),C=s(L,!0);i(L),R(M=>U(C,M),[()=>c(h)]),n(_,L)};z(D,_=>{p(t()),c(()=>t().secondaryText)&&_(Z)})}i(v),R(_=>U(f,_),[()=>c(x)]),n(o,v)};z(G,o=>{p(t()),c(()=>t().primaryText.isClickable)?o(q):o(E,!1)})}var K=P(G,2);{var B=o=>{var v=ur(),l=s(v);{var f=_=>{var L=F(),C=V(L);se(C,1,()=>(p(t()),c(()=>t().customInfo)),ve,(M,k)=>{const j=Q(()=>(e(k),p(a()),c(()=>typeof e(k).icon=="function"?e(k).icon(a()):e(k).icon))),J=Q(()=>(e(k),p(a()),c(()=>typeof e(k).text=="function"?e(k).text(a()):e(k).text)));var W=vr(),$=s(W);{var re=je=>{var Le=F(),De=V(Le);Fe(De,()=>e(j)),n(je,Le)};z($,je=>{e(j)&&je(re)})}var le=P($,2),Ie=s(le,!0);i(le),i(W),R(()=>U(Ie,e(J))),n(M,W)}),n(_,L)};z(l,_=>{p(t()),c(()=>t().customInfo)&&_(f)})}var D=P(l,2);{var Z=_=>{var L=F(),C=V(L);se(C,1,()=>(p(t()),c(()=>t().badges.filter(M=>M.type==="forge"))),ve,(M,k)=>{var j=cr(),J=s(j);Fe(J,()=>(p(Ye),e(k),p(a()),c(()=>Ye(e(k).field?a()?.[e(k).field]||"unknown":a()?.endpoint?.endpoint_type||"unknown"))));var W=P(J,2),$=s(W,!0);i(W),i(j),R(()=>U($,(p(a()),c(()=>a()?.endpoint?.name||"Unknown")))),n(M,j)}),n(_,L)};z(D,_=>{p(t()),c(()=>t().badges)&&_(Z)})}i(v),n(o,v)};z(K,o=>{p(t()),c(()=>t().customInfo||t().badges?.some(v=>v.type==="forge"))&&o(B)})}i(S);var w=P(S,2),A=s(w);{var N=o=>{var v=F(),l=V(v);se(l,1,()=>(p(t()),c(()=>t().badges.filter(f=>f.type!=="forge"))),ve,(f,D)=>{var Z=F(),_=V(Z);{var L=M=>{const k=Q(()=>(e(D),c(()=>I(e(D)))));var j=gr(),J=s(j,!0);i(j),R(()=>{me(j,1,`inline-flex items-center rounded-full px-2 py-1 text-xs font-medium ring-1 ring-inset ${p(e(k)),c(()=>e(k).variant==="success"?"bg-green-50 text-green-700 ring-green-600/20 dark:bg-green-900/50 dark:text-green-300 dark:ring-green-400/20":e(k).variant==="info"?"bg-blue-50 text-blue-700 ring-blue-600/20 dark:bg-blue-900/50 dark:text-blue-300 dark:ring-blue-400/20":e(k).variant==="error"?"bg-red-50 text-red-700 ring-red-600/20 dark:bg-red-900/50 dark:text-red-300 dark:ring-red-400/20":"bg-gray-50 text-gray-700 ring-gray-600/20 dark:bg-gray-900/50 dark:text-gray-300 dark:ring-gray-400/20")??""}`),U(J,(p(e(k)),c(()=>e(k).text)))}),n(M,j)},C=M=>{const k=Q(()=>(e(D),c(()=>I(e(D)))));Bt(M,{get variant(){return p(e(k)),c(()=>e(k).variant)},get text(){return p(e(k)),c(()=>e(k).text)}})};z(_,M=>{e(D),c(()=>e(D).type==="status")?M(L):M(C,!1)})}n(f,Z)}),n(o,v)};z(A,o=>{p(t()),c(()=>t().badges)&&o(N)})}var X=P(A,2);{var ee=o=>{var v=fr();se(v,5,()=>(p(t()),c(()=>t().actions)),ve,(l,f)=>{{let D=Q(()=>(e(f),c(()=>e(f).type==="clone"?"copy":e(f).type))),Z=Q(()=>(e(f),p(t()),c(()=>e(f).type==="edit"?`Edit ${t().entityType}`:e(f).type==="delete"?`Delete ${t().entityType}`:e(f).type==="clone"?`Clone ${t().entityType}`:e(f).type))),_=Q(()=>(e(f),p(t()),c(()=>e(f).type==="edit"?`Edit ${t().entityType}`:e(f).type==="delete"?`Delete ${t().entityType}`:e(f).type==="clone"?`Clone ${t().entityType}`:e(f).type)));tt(l,{get action(){return e(D)},size:"sm",get title(){return e(Z)},get ariaLabel(){return e(_)},$$events:{click:()=>u(e(f).type)}})}}),i(v),n(o,v)};z(X,o=>{p(t()),c(()=>t().actions)&&o(ee)})}i(w),i(b),n(H,b),ge()}var pr=T('
'),xr=T('
'),kr=T("
"),yr=T("
"),_r=T(' ',1),br=T('
');function Er(H,r){ue(r,!1);const g=Pe();let a=d(r,"columns",24,()=>[]),t=d(r,"data",24,()=>[]),x=d(r,"loading",8,!1),h=d(r,"error",8,""),m=d(r,"totalItems",8,0),u=d(r,"itemName",8,"results"),I=d(r,"searchTerm",12,""),b=d(r,"searchPlaceholder",8,"Search..."),S=d(r,"showSearch",8,!0),G=d(r,"currentPage",8,1),q=d(r,"perPage",12,25),E=d(r,"totalPages",8,1),K=d(r,"showPagination",8,!0),B=d(r,"showPerPageSelector",8,!0),w=d(r,"emptyTitle",8,"No items found"),A=d(r,"emptyMessage",8,""),N=d(r,"emptyIconType",8,"document"),X=d(r,"errorTitle",8,"Error loading data"),ee=d(r,"showRetry",8,!1),o=d(r,"showMobileCards",8,!0),v=d(r,"mobileCardConfig",8,null);const l=Ce();function f(y){l("search",y.detail)}function D(y){l("pageChange",y.detail)}function Z(y){l("perPageChange",y.detail)}function _(){l("retry")}function L(y){l("edit",y.detail)}function C(y){l("delete",y.detail)}function M(y){l("clone",y.detail)}function k(y){l("action",y.detail)}function j(y){const de="px-6 py-4 text-sm",Ne=y.align==="right"?"text-right":y.align==="center"?"text-center":"text-left",Ve=y.key==="actions"?"font-medium":"text-gray-900 dark:text-white",Re=y.flexible?"min-w-0":"";return`${de} ${Ne} ${Ve} ${Re}`.trim()}function J(){return a().map(y=>y.flexible?`${y.flexRatio||1}fr`:"auto").join(" ")}we(()=>(p(A()),p(I()),p(u())),()=>{Me(g,A()||(I()?`No items found matching "${I()}"`:`No ${u()} found`))}),Ee(),pe();var W=br(),$=s(W);{var re=y=>{rr(y,{get placeholder(){return b()},get showPerPageSelector(){return B()},get searchTerm(){return I()},set searchTerm(de){I(de)},get perPage(){return q()},set perPage(de){q(de)},$$events:{search:f,perPageChange:Z},$$legacy:!0})};z($,y=>{S()&&y(re)})}var le=P($,2),Ie=s(le);{var je=y=>{Vt(y,{get message(){return`Loading ${u()??""}...`}})},Le=y=>{var de=F(),Ne=V(de);{var Ve=ke=>{{let He=Q(()=>ee()?_:void 0);qt(ke,{get title(){return X()},get message(){return h()},get showRetry(){return ee()},get onRetry(){return e(He)}})}},Re=ke=>{var He=F(),at=V(He);{var nt=ye=>{Wt(ye,{get title(){return w()},get message(){return e(g)},get iconType(){return N()}})},it=ye=>{var Ge=_r(),Je=V(Ge);{var ot=ae=>{var O=xr();se(O,7,t,(ie,te)=>ie.id||ie.name||te,(ie,te,qe)=>{var ze=pr(),Y=s(ze);{var _e=ce=>{var fe=F(),ne=V(fe);$e(ne,()=>(e(te),c(()=>`${e(te).id||e(te).name}-${e(te).updated_at}-mobile`)),he=>{mr(he,{get item(){return e(te)},get config(){return v()},$$events:{edit(oe){Se.call(this,r,oe)},delete(oe){Se.call(this,r,oe)},clone(oe){Se.call(this,r,oe)},action(oe){Se.call(this,r,oe)}}})}),n(ce,fe)},Oe=ce=>{var fe=F(),ne=V(fe);Xe(ne,r,"mobile-card",{get item(){return e(te)},get index(){return e(qe)}}),n(ce,fe)};z(Y,ce=>{v()?ce(_e):ce(Oe,!1)})}i(ze),n(ie,ze)}),i(O),n(ae,O)};z(Je,ae=>{o()&&ae(ot)})}var Qe=P(Je,2),Ue=s(Qe),Ze=s(Ue);se(Ze,1,a,ve,(ae,O)=>{var ie=kr(),te=s(ie,!0);i(ie),R(()=>{me(ie,1,`px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider bg-gray-50 dark:bg-gray-700 border-b border-gray-200 dark:border-gray-600 ${e(O),c(()=>e(O).align==="right"?"text-right":e(O).align==="center"?"text-center":"text-left")??""}`),U(te,(e(O),c(()=>e(O).title)))}),n(ae,ie)});var st=P(Ze,2);se(st,3,t,(ae,O)=>ae.id||ae.name||O,(ae,O,ie)=>{var te=F(),qe=V(te);se(qe,1,a,ve,(ze,Y)=>{var _e=yr(),Oe=s(_e);{var ce=ne=>{var he=F(),oe=V(he);$e(oe,()=>(e(O),e(Y),c(()=>`${e(O).id||e(O).name}-${e(O).updated_at}-${e(Y).key}`)),lt=>{var Ke=F(),dt=V(Ke);{let vt=Q(()=>typeof e(Y).cellProps=="function"?e(Y).cellProps(e(O)):e(Y).cellProps);Ht(dt,()=>e(Y).cellComponent,(ct,ut)=>{ut(ct,jt({get item(){return e(O)}},()=>e(vt),{$$events:{edit:L,delete:C,clone:M,action:k}}))})}n(lt,Ke)}),n(ne,he)},fe=ne=>{var he=F(),oe=V(he);Xe(oe,r,"cell",{get item(){return e(O)},get column(){return e(Y)},get index(){return e(ie)},get value(){return e(O),e(Y),c(()=>e(O)[e(Y).key])}}),n(ne,he)};z(Oe,ne=>{e(Y),c(()=>e(Y).cellComponent)?ne(ce):ne(fe,!1)})}i(_e),R(ne=>me(_e,1,`${ne??""} border-b border-gray-200 dark:border-gray-700`),[()=>(e(Y),c(()=>j(e(Y))))]),n(ze,_e)}),n(ae,te)}),i(Ue),i(Qe),R(ae=>Lt(Ue,`grid-template-columns: ${ae??""}`),[()=>c(J)]),n(ye,Ge)};z(at,ye=>{p(t()),c(()=>t().length===0)?ye(nt):ye(it,!1)},!0)}n(ke,He)};z(Ne,ke=>{h()?ke(Ve):ke(Re,!1)},!0)}n(y,de)};z(Ie,y=>{x()?y(je):y(Le,!1)})}var De=P(Ie,2);{var rt=y=>{ir(y,{get currentPage(){return G()},get totalPages(){return E()},get perPage(){return q()},get totalItems(){return m()},get itemName(){return u()},$$events:{pageChange:D}})};z(De,y=>{p(K()),p(x()),p(h()),p(t()),c(()=>K()&&!x()&&!h()&&t().length>0)&&y(rt)})}i(le),i(W),n(H,W),ge()}var wr=T('
');function Dr(H,r){ue(r,!1);const g=Ce();let a=d(r,"item",8),t=d(r,"actions",24,()=>[{type:"edit",title:"Edit",ariaLabel:"Edit item",action:"edit"},{type:"delete",title:"Delete",ariaLabel:"Delete item",action:"delete"}]);function x(m){a()&&(m==="edit"?g("edit",{item:a()}):m==="delete"?g("delete",{item:a()}):m==="copy"?g("clone",{item:a()}):g("action",{type:m,item:a()}))}pe();var h=wr();se(h,5,t,ve,(m,u)=>{{let I=Q(()=>(e(u),c(()=>e(u).action==="clone"?"copy":e(u).action||(e(u).type==="edit"?"edit":e(u).type==="delete"?"delete":e(u).type==="copy"?"copy":"view")))),b=Q(()=>(e(u),c(()=>e(u).title||(e(u).type==="edit"?"Edit":e(u).type==="delete"?"Delete":e(u).type==="copy"?"Clone":e(u).label)))),S=Q(()=>(e(u),c(()=>e(u).ariaLabel||(e(u).type==="edit"?"Edit item":e(u).type==="delete"?"Delete item":e(u).type==="copy"?"Clone item":e(u).label))));tt(m,{get action(){return e(I)},get title(){return e(b)},get ariaLabel(){return e(S)},$$events:{click:()=>x(e(u).type)}})}}),i(h),n(H,h),ge()}var Mr=T(" "),Pr=T(" ");function Nr(H,r){ue(r,!1);const g=Pe(),a=Pe();let t=d(r,"item",8),x=d(r,"field",8),h=d(r,"type",8,"text"),m=d(r,"truncateLength",8,50),u=d(r,"showTitle",8,!1);function I(){return t()&&x().split(".").reduce((B,w)=>B?.[w],t())||""}function b(){return h()==="date"?At(e(g)):h()==="truncated"&&e(g).length>m()?`${e(g).slice(0,m())}...`:e(g)}function S(){switch(h()){case"code":return"inline-block max-w-full truncate bg-gray-100 dark:bg-gray-700 px-2 py-1 rounded text-xs font-mono";case"description":return"block w-full truncate text-sm text-gray-500 dark:text-gray-300";case"date":return"block w-full truncate text-sm text-gray-900 dark:text-white font-mono";default:return"block w-full truncate text-sm text-gray-900 dark:text-white"}}we(()=>{},()=>{Me(g,I())}),we(()=>{},()=>{Me(a,b())}),Ee(),pe();var G=F(),q=V(G);{var E=B=>{var w=Mr(),A=s(w,!0);i(w),R(N=>{me(w,1,`${N??""} ${u()?"cursor-default":""}`),Ae(w,"title",u()?e(g):""),U(A,e(a))},[()=>c(S)]),n(B,w)},K=B=>{var w=Pr(),A=s(w,!0);i(w),R(N=>{me(w,1,`${N??""} ${u()?"cursor-default":""}`),Ae(w,"title",u()?e(g):""),U(A,e(a))},[()=>c(S)]),n(B,w)};z(q,B=>{h()==="code"?B(E):B(K,!1)})}n(H,G),ge()}export{Dr as A,Er as D,Nr as G,Vt as L,$e as k}; diff --git a/webapp/assets/_app/immutable/chunks/JUkrBp3F.js b/webapp/assets/_app/immutable/chunks/JUkrBp3F.js new file mode 100644 index 00000000..c1018030 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/JUkrBp3F.js @@ -0,0 +1 @@ +import{F as p,G as l}from"./cPTQ2Ibn.js";import{g as d}from"./DqbUkQgD.js";import{w as r}from"./BV_mDmfH.js";const f={repositories:[],organizations:[],enterprises:[],pools:[],scalesets:[],credentials:[],endpoints:[],controllerInfo:null,templates:[],loading:{repositories:!1,organizations:!1,enterprises:!1,pools:!1,scalesets:!1,credentials:!1,endpoints:!1,controllerInfo:!1,templates:!1},loaded:{repositories:!1,organizations:!1,enterprises:!1,pools:!1,scalesets:!1,credentials:!1,endpoints:!1,controllerInfo:!1,templates:!1},errorMessages:{repositories:"",organizations:"",enterprises:"",pools:"",scalesets:"",credentials:"",endpoints:"",controllerInfo:"",templates:""}},a=p(f);class u{unsubscribers=[];loadingPromises=new Map;retryAttempts=new Map;MAX_RETRIES=3;RETRY_DELAY_MS=1e3;websocketStatusUnsubscriber=null;async loadResource(e,t=!1){if(this.loadingPromises.has(e))return this.loadingPromises.get(e);a.update(o=>({...o,loading:{...o.loading,[e]:!0},errorMessages:{...o.errorMessages,[e]:""}}));const s=this.attemptLoad(e);this.loadingPromises.set(e,s);try{const o=await s;return a.update(n=>({...n,[e]:o,loading:{...n.loading,[e]:!1},loaded:{...n.loaded,[e]:!0},errorMessages:{...n.errorMessages,[e]:""}})),this.retryAttempts.delete(e),t&&this.startBackgroundLoading(e),o}catch(o){const n=o instanceof Error?o.message:"Failed to load data";throw a.update(i=>({...i,loading:{...i.loading,[e]:!1},errorMessages:{...i.errorMessages,[e]:n}})),console.error(`Failed to load ${e}:`,o),o}finally{this.loadingPromises.delete(e)}}async attemptLoad(e){const t=(this.retryAttempts.get(e)||0)+1;this.retryAttempts.set(e,t);try{let s;switch(e){case"repositories":s=d.listRepositories();break;case"organizations":s=d.listOrganizations();break;case"enterprises":s=d.listEnterprises();break;case"pools":s=d.listAllPools();break;case"scalesets":s=d.listScaleSets();break;case"credentials":s=d.listAllCredentials();break;case"endpoints":s=d.listAllEndpoints();break;case"controllerInfo":s=d.getControllerInfo();break;case"templates":s=d.listTemplates();break;default:throw new Error(`Unknown resource type: ${e}`)}return await s}catch(s){if(tsetTimeout(n,o)),this.attemptLoad(e)}else throw console.error(`All ${this.MAX_RETRIES} attempts failed for ${e}:`,s),s}}async startBackgroundLoading(e){const s=["repositories","organizations","enterprises","pools","scalesets","credentials","endpoints","templates"].filter(o=>o!==e);for(const o of s)setTimeout(()=>{this.loadResource(o,!1).catch(n=>{console.warn(`Background loading failed for ${o}:`,n)})},100*s.indexOf(o))}retryResource(e){return this.retryAttempts.delete(e),this.loadResource(e,!0)}setupWebSocketSubscriptions(){this.cleanup();const e=[r.subscribeToEntity("repository",["create","update","delete"],this.handleRepositoryEvent.bind(this)),r.subscribeToEntity("organization",["create","update","delete"],this.handleOrganizationEvent.bind(this)),r.subscribeToEntity("enterprise",["create","update","delete"],this.handleEnterpriseEvent.bind(this)),r.subscribeToEntity("pool",["create","update","delete"],this.handlePoolEvent.bind(this)),r.subscribeToEntity("scaleset",["create","update","delete"],this.handleScaleSetEvent.bind(this)),r.subscribeToEntity("controller",["update"],this.handleControllerEvent.bind(this)),r.subscribeToEntity("github_credentials",["create","update","delete"],this.handleCredentialsEvent.bind(this)),r.subscribeToEntity("gitea_credentials",["create","update","delete"],this.handleCredentialsEvent.bind(this)),r.subscribeToEntity("github_endpoint",["create","update","delete"],this.handleEndpointEvent.bind(this)),r.subscribeToEntity("template",["create","update","delete"],this.handleTemplateEvent.bind(this))];this.unsubscribers=e,this.setupWebSocketStatusMonitoring()}setupWebSocketStatusMonitoring(){this.websocketStatusUnsubscriber&&this.websocketStatusUnsubscriber();let e=!1;this.websocketStatusUnsubscriber=r.subscribe(t=>{t.connected&&!e&&(console.log("[EagerCache] WebSocket connected - reinitializing cache"),this.initializeAllResources()),e=t.connected})}async initializeAllResources(){const t=["repositories","organizations","enterprises","pools","scalesets","credentials","endpoints","controllerInfo","templates"].map(s=>this.loadResource(s,!0).catch(o=>{console.warn(`Failed to reload ${s} on WebSocket reconnect:`,o)}));await Promise.allSettled(t)}handleRepositoryEvent(e){a.update(t=>{if(!t.loaded.repositories)return t;const s=[...t.repositories],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,repositories:s}})}handleOrganizationEvent(e){a.update(t=>{if(!t.loaded.organizations)return t;const s=[...t.organizations],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,organizations:s}})}handleEnterpriseEvent(e){a.update(t=>{if(!t.loaded.enterprises)return t;const s=[...t.enterprises],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,enterprises:s}})}handlePoolEvent(e){a.update(t=>{if(!t.loaded.pools)return t;const s=[...t.pools],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,pools:s}})}handleScaleSetEvent(e){a.update(t=>{if(!t.loaded.scalesets)return t;const s=[...t.scalesets],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,scalesets:s}})}handleCredentialsEvent(e){a.update(t=>{if(!t.loaded.credentials)return t;const s=[...t.credentials],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,credentials:s}})}handleEndpointEvent(e){a.update(t=>{if(!t.loaded.endpoints)return t;const s=[...t.endpoints],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.name===o.name);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.name:o,i=s.findIndex(c=>c.name===n);i!==-1&&s.splice(i,1)}return{...t,endpoints:s}})}cleanup(){this.unsubscribers.forEach(e=>e()),this.unsubscribers=[],this.websocketStatusUnsubscriber&&(this.websocketStatusUnsubscriber(),this.websocketStatusUnsubscriber=null)}shouldUseCache(){return l(r).connected}async getRepositories(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching repositories directly from API"),await d.listRepositories();const t=l(a);return t.loaded.repositories?t.repositories:this.loadResource("repositories",!0)}async getOrganizations(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching organizations directly from API"),await d.listOrganizations();const t=l(a);return t.loaded.organizations?t.organizations:this.loadResource("organizations",!0)}async getEnterprises(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching enterprises directly from API"),await d.listEnterprises();const t=l(a);return t.loaded.enterprises?t.enterprises:this.loadResource("enterprises",!0)}async getPools(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching pools directly from API"),await d.listAllPools();const t=l(a);return t.loaded.pools?t.pools:this.loadResource("pools",!0)}async getScaleSets(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching scalesets directly from API"),await d.listScaleSets();const t=l(a);return t.loaded.scalesets?t.scalesets:this.loadResource("scalesets",!0)}async getCredentials(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching credentials directly from API"),await d.listAllCredentials();const t=l(a);return t.loaded.credentials?t.credentials:this.loadResource("credentials",!0)}async getEndpoints(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching endpoints directly from API"),await d.listAllEndpoints();const t=l(a);return t.loaded.endpoints?t.endpoints:this.loadResource("endpoints",!0)}async getControllerInfo(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching controller info directly from API"),await d.getControllerInfo();const t=l(a);return t.loaded.controllerInfo?t.controllerInfo:this.loadResource("controllerInfo",!0)}async getTemplates(){if(!l(r).connected)return console.log("[EagerCache] WebSocket disconnected - fetching templates directly from API"),await d.listTemplates();const t=l(a);return t.loaded.templates?t.templates:this.loadResource("templates",!0)}handleControllerEvent(e){a.update(t=>{if(!t.loaded.controllerInfo)return t;const s=e.payload;return e.operation==="update"?{...t,controllerInfo:s}:t})}handleTemplateEvent(e){a.update(t=>{if(!t.loaded.templates)return t;const s=[...t.templates],o=e.payload;if(e.operation==="create")s.push(o);else if(e.operation==="update"){const n=s.findIndex(i=>i.id===o.id);n!==-1&&(s[n]=o)}else if(e.operation==="delete"){const n=typeof o=="object"?o.id:o,i=s.findIndex(c=>c.id===n);i!==-1&&s.splice(i,1)}return{...t,templates:s}})}}const h=new u;typeof window<"u"&&h.setupWebSocketSubscriptions();export{h as a,a as e}; diff --git a/webapp/assets/_app/immutable/chunks/R3ADTHgb.js b/webapp/assets/_app/immutable/chunks/R3ADTHgb.js new file mode 100644 index 00000000..7ebebcee --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/R3ADTHgb.js @@ -0,0 +1,19 @@ +import"./DsnmJJEf.js";import{i as Vh}from"./C7KraPli.js";import{ay as ud,aw as dd,p as Nh,E as Fh,o as pd,A as md,g as j,m as Wi,l as Wt,k as zi,q as zt,h as Xh,f as _h,b as St,c as Uh,d as $t,r as Bt,s as Sn,z as Cl,D as Pl,t as ti,e as kn,v as gd,C as $o,B as Od,a as yd}from"./cPTQ2Ibn.js";import{b as bd}from"./Cwu7L3Xf.js";import{p as Be,a as xd,s as Sd,i as Ql}from"./DqFqoVWr.js";import{t as kd}from"./CCFUzH5i.js";import{B as Al,s as wn}from"./DqbUkQgD.js";import{M as wd}from"./Bo3f8OIz.js";function vd(n,e,t){var i=ud(n,e);i&&i.set&&(n[e]=t,dd(()=>{n[e]=null}))}let qr=[],Hh=[];(()=>{let n="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e>1;if(n=Hh[i])e=i+1;else return!0;if(e==t)return!1}}function Ml(n){return n>=127462&&n<=127487}const Rl=8205;function Cd(n,e,t=!0,i=!0){return(t?jh:Pd)(n,e,i)}function jh(n,e,t){if(e==n.length)return e;e&&Gh(n.charCodeAt(e))&&Zh(n.charCodeAt(e-1))&&e--;let i=Js(n,e);for(e+=Dl(i);e=0&&Ml(Js(n,o));)r++,o-=2;if(r%2==0)break;e+=2}else break}return e}function Pd(n,e,t){for(;e>0;){let i=jh(n,e-2,t);if(i=56320&&n<57344}function Zh(n){return n>=55296&&n<56320}function Dl(n){return n<65536?1:2}class V{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=pi(this,e,t);let s=[];return this.decompose(0,e,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(t,this.length,s,1),Ye.from(s,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=pi(this,e,t);let i=[];return this.decompose(e,t,i,0),Ye.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),s=new Ii(this),r=new Ii(e);for(let o=t,l=t;;){if(s.next(o),r.next(o),o=0,s.lineBreak!=r.lineBreak||s.done!=r.done||s.value!=r.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(e=1){return new Ii(this,e)}iterRange(e,t=this.length){return new Yh(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let s=this.line(e).from;i=this.iterRange(s,Math.max(s,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Kh(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?V.empty:e.length<=32?new J(e):Ye.from(J.split(e,[]))}}class J extends V{constructor(e,t=Qd(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,s){for(let r=0;;r++){let o=this.text[r],l=s+o.length;if((t?i:l)>=e)return new Ad(s,l,i,o);s=l+1,i++}}decompose(e,t,i,s){let r=e<=0&&t>=this.length?this:new J(El(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(s&1){let o=i.pop(),l=Gn(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new J(l,o.length+r.length));else{let a=l.length>>1;i.push(new J(l.slice(0,a)),new J(l.slice(a)))}}else i.push(r)}replace(e,t,i){if(!(i instanceof J))return super.replace(e,t,i);[e,t]=pi(this,e,t);let s=Gn(this.text,Gn(i.text,El(this.text,0,e)),t),r=this.length+i.length-(t-e);return s.length<=32?new J(s,r):Ye.from(J.split(s,[]),r)}sliceString(e,t=this.length,i=` +`){[e,t]=pi(this,e,t);let s="";for(let r=0,o=0;r<=t&&oe&&o&&(s+=i),er&&(s+=l.slice(Math.max(0,e-r),t-r)),r=a+1}return s}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],s=-1;for(let r of e)i.push(r),s+=r.length+1,i.length==32&&(t.push(new J(i,s)),i=[],s=-1);return s>-1&&t.push(new J(i,s)),t}}class Ye extends V{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,t,i,s){for(let r=0;;r++){let o=this.children[r],l=s+o.length,a=i+o.lines-1;if((t?a:l)>=e)return o.lineInner(e,t,i,s);s=l+1,i=a+1}}decompose(e,t,i,s){for(let r=0,o=0;o<=t&&r=o){let h=s&((o<=e?1:0)|(a>=t?2:0));o>=e&&a<=t&&!h?i.push(l):l.decompose(e-o,t-o,i,h)}o=a+1}}replace(e,t,i){if([e,t]=pi(this,e,t),i.lines=r&&t<=l){let a=o.replace(e-r,t-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let c=this.children.slice();return c[s]=a,new Ye(c,this.length-(t-e)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i=` +`){[e,t]=pi(this,e,t);let s="";for(let r=0,o=0;re&&r&&(s+=i),eo&&(s+=l.sliceString(e-o,t-o,i)),o=a+1}return s}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof Ye))return 0;let i=0,[s,r,o,l]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;s+=t,r+=t){if(s==o||r==l)return i;let a=this.children[s],h=e.children[r];if(a!=h)return i+a.scanIdentical(h,t);i+=a.length+1}}static from(e,t=e.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let d of e)i+=d.lines;if(i<32){let d=[];for(let p of e)p.flatten(d);return new J(d,t)}let s=Math.max(32,i>>5),r=s<<1,o=s>>1,l=[],a=0,h=-1,c=[];function f(d){let p;if(d.lines>r&&d instanceof Ye)for(let m of d.children)f(m);else d.lines>o&&(a>o||!a)?(u(),l.push(d)):d instanceof J&&a&&(p=c[c.length-1])instanceof J&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,c[c.length-1]=new J(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>s&&u(),a+=d.lines,h+=d.length+1,c.push(d))}function u(){a!=0&&(l.push(c.length==1?c[0]:Ye.from(c,h)),h=-1,a=c.length=0)}for(let d of e)f(d);return u(),l.length==1?l[0]:new Ye(l,t)}}V.empty=new J([""],0);function Qd(n){let e=-1;for(let t of n)e+=t.length+1;return e}function Gn(n,e,t=0,i=1e9){for(let s=0,r=0,o=!0;r=t&&(a>i&&(l=l.slice(0,i-s)),s0?1:(e instanceof J?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],r=this.offsets[i],o=r>>1,l=s instanceof J?s.text.length:s.children.length;if(o==(t>0?l:0)){if(i==0)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(t>0?0:1)){if(this.offsets[i]+=t,e==0)return this.lineBreak=!0,this.value=` +`,this;e--}else if(s instanceof J){let a=s.text[o+(t<0?-1:0)];if(this.offsets[i]+=t,a.length>Math.max(0,e))return this.value=e==0?a:t>0?a.slice(e):a.slice(0,a.length-e),this;e-=a.length}else{let a=s.children[o+(t<0?-1:0)];e>a.length?(e-=a.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(t>0?1:(a instanceof J?a.text.length:a.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class Yh{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new Ii(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:s}=this.cursor.next(e);return this.pos+=(s.length+e)*t,this.value=s.length<=i?s:t<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}}class Kh{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:s}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}}typeof Symbol<"u"&&(V.prototype[Symbol.iterator]=function(){return this.iter()},Ii.prototype[Symbol.iterator]=Yh.prototype[Symbol.iterator]=Kh.prototype[Symbol.iterator]=function(){return this});class Ad{constructor(e,t,i,s){this.from=e,this.to=t,this.number=i,this.text=s}get length(){return this.to-this.from}}function pi(n,e,t){return e=Math.max(0,Math.min(n.length,e)),[e,Math.max(e,Math.min(n.length,t))]}function Oe(n,e,t=!0,i=!0){return Cd(n,e,t,i)}function Md(n){return n>=56320&&n<57344}function Rd(n){return n>=55296&&n<56320}function Ce(n,e){let t=n.charCodeAt(e);if(!Rd(t)||e+1==n.length)return t;let i=n.charCodeAt(e+1);return Md(i)?(t-55296<<10)+(i-56320)+65536:t}function Bo(n){return n<=65535?String.fromCharCode(n):(n-=65536,String.fromCharCode((n>>10)+55296,(n&1023)+56320))}function Ke(n){return n<65536?1:2}const $r=/\r\n?|\n/;var ge=function(n){return n[n.Simple=0]="Simple",n[n.TrackDel=1]="TrackDel",n[n.TrackBefore=2]="TrackBefore",n[n.TrackAfter=3]="TrackAfter",n}(ge||(ge={}));class st{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return r+(e-s);r+=l}else{if(i!=ge.Simple&&h>=e&&(i==ge.TrackDel&&se||i==ge.TrackBefore&&se))return null;if(h>e||h==e&&t<0&&!l)return e==s||t<0?r:r+a;r+=a}s=h}if(e>s)throw new RangeError(`Position ${e} is out of range for changeset of length ${s}`);return r}touchesRange(e,t=e){for(let i=0,s=0;i=0&&s<=t&&l>=e)return st?"cover":!0;s=l}return!1}toString(){let e="";for(let t=0;t=0?":"+s:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new st(e)}static create(e){return new st(e)}}class ae extends st{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Br(this,(t,i,s,r,o)=>e=e.replace(s,s+(i-t),o),!1),e}mapDesc(e,t=!1){return Lr(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let s=0,r=0;s=0){t[s]=l,t[s+1]=o;let a=s>>1;for(;i.length0&&Tt(i,t,r.text),r.forward(c),l+=c}let h=e[o++];for(;l>1].toJSON()))}return e}static of(e,t,i){let s=[],r=[],o=0,l=null;function a(c=!1){if(!c&&!s.length)return;ou||f<0||u>t)throw new RangeError(`Invalid change range ${f} to ${u} (in doc of length ${t})`);let p=d?typeof d=="string"?V.of(d.split(i||$r)):d:V.empty,m=p.length;if(f==u&&m==0)return;fo&&ye(s,f-o,-1),ye(s,u-f,m),Tt(r,s,p),o=u}}return h(e),a(!l),l}static empty(e){return new ae(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],i=[];for(let s=0;sl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)t.push(r[0],0);else{for(;i.length=0&&t<=0&&t==n[s+1]?n[s]+=e:s>=0&&e==0&&n[s]==0?n[s+1]+=t:i?(n[s]+=e,n[s+1]+=t):n.push(e,t)}function Tt(n,e,t){if(t.length==0)return;let i=e.length-2>>1;if(i>1])),!(t||o==n.sections.length||n.sections[o+1]<0);)l=n.sections[o++],a=n.sections[o++];e(s,h,r,c,f),s=h,r=c}}}function Lr(n,e,t,i=!1){let s=[],r=i?[]:null,o=new Ui(n),l=new Ui(e);for(let a=-1;;){if(o.done&&l.len||l.done&&o.len)throw new Error("Mismatched change set lengths");if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);ye(s,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,c=o.len;for(;c;)if(l.ins==-1){let f=Math.min(c,l.len);h+=f,c-=f,l.forward(f)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}class Ui{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?V.empty:e[t]}textBit(e){let{inserted:t}=this.set,i=this.i-2>>1;return i>=t.length&&!e?V.empty:t[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class Nt{constructor(e,t,i){this.from=e,this.to=t,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,t=-1){let i,s;return this.empty?i=s=e.mapPos(this.from,t):(i=e.mapPos(this.from,1),s=e.mapPos(this.to,-1)),i==this.from&&s==this.to?this:new Nt(i,s,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return b.range(e,t);let i=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return b.range(this.anchor,i)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return b.range(e.anchor,e.head)}static create(e,t,i){return new Nt(e,t,i)}}class b{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:b.create(this.ranges.map(i=>i.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new b(e.ranges.map(t=>Nt.fromJSON(t)),e.main)}static single(e,t=e){return new b([b.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,s=0;se?8:0)|r)}static normalized(e,t=0){let i=e[t];e.sort((s,r)=>s.from-r.from),t=e.indexOf(i);for(let s=1;sr.head?b.range(a,l):b.range(l,a))}}return new b(e,t)}}function ec(n,e){for(let t of n.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}let Lo=0;class M{constructor(e,t,i,s,r){this.combine=e,this.compareInput=t,this.compare=i,this.isStatic=s,this.id=Lo++,this.default=e([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(e={}){return new M(e.combine||(t=>t),e.compareInput||((t,i)=>t===i),e.compare||(e.combine?(t,i)=>t===i:Wo),!!e.static,e.enables)}of(e){return new Zn([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new Zn(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new Zn(e,this,2,t)}from(e,t){return t||(t=i=>i),this.compute([e],i=>t(i.field(e)))}}function Wo(n,e){return n==e||n.length==e.length&&n.every((t,i)=>t===e[i])}class Zn{constructor(e,t,i,s){this.dependencies=e,this.facet=t,this.type=i,this.value=s,this.id=Lo++}dynamicSlot(e){var t;let i=this.value,s=this.facet.compareInput,r=this.id,o=e[r]>>1,l=this.type==2,a=!1,h=!1,c=[];for(let f of this.dependencies)f=="doc"?a=!0:f=="selection"?h=!0:(((t=e[f.id])!==null&&t!==void 0?t:1)&1)==0&&c.push(e[f.id]);return{create(f){return f.values[o]=i(f),1},update(f,u){if(a&&u.docChanged||h&&(u.docChanged||u.selection)||Wr(f,c)){let d=i(f);if(l?!ql(d,f.values[o],s):!s(d,f.values[o]))return f.values[o]=d,1}return 0},reconfigure:(f,u)=>{let d,p=u.config.address[r];if(p!=null){let m=cs(u,p);if(this.dependencies.every(g=>g instanceof M?u.facet(g)===f.facet(g):g instanceof ue?u.field(g,!1)==f.field(g,!1):!0)||(l?ql(d=i(f),m,s):s(d=i(f),m)))return f.values[o]=m,0}else d=i(f);return f.values[o]=d,1}}}}function ql(n,e,t){if(n.length!=e.length)return!1;for(let i=0;in[a.id]),s=t.map(a=>a.type),r=i.filter(a=>!(a&1)),o=n[e.id]>>1;function l(a){let h=[];for(let c=0;ci===s),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(vn).find(i=>i.field==this);return(t?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:i=>(i.values[t]=this.create(i),1),update:(i,s)=>{let r=i.values[t],o=this.updateF(r,s);return this.compareF(r,o)?0:(i.values[t]=o,1)},reconfigure:(i,s)=>{let r=i.facet(vn),o=s.facet(vn),l;return(l=r.find(a=>a.field==this))&&l!=o.find(a=>a.field==this)?(i.values[t]=l.create(i),1):s.config.address[this.id]!=null?(i.values[t]=s.field(this),0):(i.values[t]=this.create(i),1)}}}init(e){return[this,vn.of({field:this,create:e})]}get extension(){return this}}const It={lowest:4,low:3,default:2,high:1,highest:0};function Qi(n){return e=>new tc(e,n)}const Et={highest:Qi(It.highest),high:Qi(It.high),default:Qi(It.default),low:Qi(It.low),lowest:Qi(It.lowest)};class tc{constructor(e,t){this.inner=e,this.prec=t}}class $s{of(e){return new zr(this,e)}reconfigure(e){return $s.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class zr{constructor(e,t){this.compartment=e,this.inner=t}}class hs{constructor(e,t,i,s,r,o){for(this.base=e,this.compartments=t,this.dynamicSlots=i,this.address=s,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,i){let s=[],r=Object.create(null),o=new Map;for(let u of Ed(e,t,o))u instanceof ue?s.push(u):(r[u.facet.id]||(r[u.facet.id]=[])).push(u);let l=Object.create(null),a=[],h=[];for(let u of s)l[u.id]=h.length<<1,h.push(d=>u.slot(d));let c=i?.config.facets;for(let u in r){let d=r[u],p=d[0].facet,m=c&&c[u]||[];if(d.every(g=>g.type==0))if(l[p.id]=a.length<<1|1,Wo(m,d))a.push(i.facet(p));else{let g=p.combine(d.map(y=>y.value));a.push(i&&p.compare(g,i.facet(p))?i.facet(p):g)}else{for(let g of d)g.type==0?(l[g.id]=a.length<<1|1,a.push(g.value)):(l[g.id]=h.length<<1,h.push(y=>g.dynamicSlot(y)));l[p.id]=h.length<<1,h.push(g=>Dd(g,p,d))}}let f=h.map(u=>u(l));return new hs(e,o,f,l,a,r)}}function Ed(n,e,t){let i=[[],[],[],[],[]],s=new Map;function r(o,l){let a=s.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof zr&&t.delete(o.compartment)}if(s.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof zr){if(t.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=e.get(o.compartment)||o.inner;t.set(o.compartment,h),r(h,l)}else if(o instanceof tc)r(o.inner,o.prec);else if(o instanceof ue)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof Zn)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,It.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(n,It.default),i.reduce((o,l)=>o.concat(l))}function Vi(n,e){if(e&1)return 2;let t=e>>1,i=n.status[t];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;n.status[t]=4;let s=n.computeSlot(n,n.config.dynamicSlots[t]);return n.status[t]=2|s}function cs(n,e){return e&1?n.config.staticValues[e>>1]:n.values[e>>1]}const ic=M.define(),Ir=M.define({combine:n=>n.some(e=>e),static:!0}),nc=M.define({combine:n=>n.length?n[0]:void 0,static:!0}),sc=M.define(),rc=M.define(),oc=M.define(),lc=M.define({combine:n=>n.length?n[0]:!1});class bt{constructor(e,t){this.type=e,this.value=t}static define(){return new qd}}class qd{of(e){return new bt(this,e)}}class $d{constructor(e){this.map=e}of(e){return new B(this,e)}}class B{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new B(this.type,t)}is(e){return this.type==e}static define(e={}){return new $d(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let i=[];for(let s of e){let r=s.map(t);r&&i.push(r)}return i}}B.reconfigure=B.define();B.appendConfig=B.define();class oe{constructor(e,t,i,s,r,o){this.startState=e,this.changes=t,this.selection=i,this.effects=s,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&ec(i,t.newLength),r.some(l=>l.type==oe.time)||(this.annotations=r.concat(oe.time.of(Date.now())))}static create(e,t,i,s,r,o){return new oe(e,t,i,s,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(oe.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}}oe.time=bt.define();oe.userEvent=bt.define();oe.addToHistory=bt.define();oe.remote=bt.define();function Bd(n,e){let t=[];for(let i=0,s=0;;){let r,o;if(i=n[i]))r=n[i++],o=n[i++];else if(s=0;s--){let r=i[s](n);r instanceof oe?n=r:Array.isArray(r)&&r.length==1&&r[0]instanceof oe?n=r[0]:n=hc(e,ai(r),!1)}return n}function Wd(n){let e=n.startState,t=e.facet(oc),i=n;for(let s=t.length-1;s>=0;s--){let r=t[s](n);r&&Object.keys(r).length&&(i=ac(i,Vr(e,r,n.changes.newLength),!0))}return i==n?n:oe.create(e,n.changes,n.selection,i.effects,i.annotations,i.scrollIntoView)}const zd=[];function ai(n){return n==null?zd:Array.isArray(n)?n:[n]}var Y=function(n){return n[n.Word=0]="Word",n[n.Space=1]="Space",n[n.Other=2]="Other",n}(Y||(Y={}));const Id=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let Nr;try{Nr=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function Vd(n){if(Nr)return Nr.test(n);for(let e=0;e"€"&&(t.toUpperCase()!=t.toLowerCase()||Id.test(t)))return!0}return!1}function Nd(n){return e=>{if(!/\S/.test(e))return Y.Space;if(Vd(e))return Y.Word;for(let t=0;t-1)return Y.Word;return Y.Other}}class I{constructor(e,t,i,s,r,o){this.config=e,this.doc=t,this.selection=i,this.values=s,this.status=e.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ls.set(h,a)),t=null),s.set(l.value.compartment,l.value.extension)):l.is(B.reconfigure)?(t=null,i=l.value):l.is(B.appendConfig)&&(t=null,i=ai(i).concat(l.value));let r;t?r=e.startState.values.slice():(t=hs.resolve(i,s,this),r=new I(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=e.startState.facet(Ir)?e.newSelection:e.newSelection.asSingle();new I(t,e.newDoc,o,r,(l,a)=>a.update(l,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:b.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,i=e(t.ranges[0]),s=this.changes(i.changes),r=[i.range],o=ai(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return I.create({doc:e.doc,selection:b.fromJSON(e.selection),extensions:t.extensions?s.concat([t.extensions]):s})}static create(e={}){let t=hs.resolve(e.extensions||[],new Map),i=e.doc instanceof V?e.doc:V.of((e.doc||"").split(t.staticFacet(I.lineSeparator)||$r)),s=e.selection?e.selection instanceof b?e.selection:b.single(e.selection.anchor,e.selection.head):b.single(0);return ec(s,i.length),t.staticFacet(Ir)||(s=s.asSingle()),new I(t,i,s,t.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(I.tabSize)}get lineBreak(){return this.facet(I.lineSeparator)||` +`}get readOnly(){return this.facet(lc)}phrase(e,...t){for(let i of this.facet(I.phrases))if(Object.prototype.hasOwnProperty.call(i,e)){e=i[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(i,s)=>{if(s=="$")return"$";let r=+(s||1);return!r||r>t.length?i:t[r-1]})),e}languageDataAt(e,t,i=-1){let s=[];for(let r of this.facet(ic))for(let o of r(this,t,i))Object.prototype.hasOwnProperty.call(o,e)&&s.push(o[e]);return s}charCategorizer(e){return Nd(this.languageDataAt("wordChars",e).join(""))}wordAt(e){let{text:t,from:i,length:s}=this.doc.lineAt(e),r=this.charCategorizer(e),o=e-i,l=e-i;for(;o>0;){let a=Oe(t,o,!1);if(r(t.slice(a,o))!=Y.Word)break;o=a}for(;ln.length?n[0]:4});I.lineSeparator=nc;I.readOnly=lc;I.phrases=M.define({compare(n,e){let t=Object.keys(n),i=Object.keys(e);return t.length==i.length&&t.every(s=>n[s]==e[s])}});I.languageData=ic;I.changeFilter=sc;I.transactionFilter=rc;I.transactionExtender=oc;$s.reconfigure=B.define();function ot(n,e,t={}){let i={};for(let s of n)for(let r of Object.keys(s)){let o=s[r],l=i[r];if(l===void 0)i[r]=o;else if(!(l===o||o===void 0))if(Object.hasOwnProperty.call(t,r))i[r]=t[r](l,o);else throw new Error("Config merge conflict for field "+r)}for(let s in e)i[s]===void 0&&(i[s]=e[s]);return i}class Ht{eq(e){return this==e}range(e,t=e){return Fr.create(e,t,this)}}Ht.prototype.startSide=Ht.prototype.endSide=0;Ht.prototype.point=!1;Ht.prototype.mapMode=ge.TrackDel;let Fr=class cc{constructor(e,t,i){this.from=e,this.to=t,this.value=i}static create(e,t,i){return new cc(e,t,i)}};function Xr(n,e){return n.from-e.from||n.value.startSide-e.value.startSide}class zo{constructor(e,t,i,s){this.from=e,this.to=t,this.value=i,this.maxPoint=s}get length(){return this.to[this.to.length-1]}findIndex(e,t,i,s=0){let r=i?this.to:this.from;for(let o=s,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-e||(i?this.value[a].endSide:this.value[a].startSide)-t;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(e,t,i,s){for(let r=this.findIndex(t,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||u==d&&h.startSide>0&&h.endSide<=0)continue;(d-u||h.endSide-h.startSide)<0||(o<0&&(o=u),h.point&&(l=Math.max(l,d-u)),i.push(h),s.push(u-o),r.push(d-o))}return{mapped:i.length?new zo(s,r,i,l):null,pos:o}}}class F{constructor(e,t,i,s){this.chunkPos=e,this.chunk=t,this.nextLayer=i,this.maxPoint=s}static create(e,t,i,s){return new F(e,t,i,s)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:i=!1,filterFrom:s=0,filterTo:r=this.length}=e,o=e.filter;if(t.length==0&&!o)return this;if(i&&(t=t.slice().sort(Xr)),this.isEmpty)return t.length?F.of(t):this;let l=new fc(this,null,-1).goto(0),a=0,h=[],c=new gt;for(;l.value||a=0){let f=t[a++];c.addInner(f.from,f.to,f.value)||h.push(f)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&e<=r+o.length&&o.between(r,e-r,t-r,i)===!1)return}this.nextLayer.between(e,t,i)}}iter(e=0){return Hi.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return Hi.from(e).goto(t)}static compare(e,t,i,s,r=-1){let o=e.filter(f=>f.maxPoint>0||!f.isEmpty&&f.maxPoint>=r),l=t.filter(f=>f.maxPoint>0||!f.isEmpty&&f.maxPoint>=r),a=$l(o,l,i),h=new Ai(o,a,r),c=new Ai(l,a,r);i.iterGaps((f,u,d)=>Bl(h,f,c,u,d,s)),i.empty&&i.length==0&&Bl(h,0,c,0,0,s)}static eq(e,t,i=0,s){s==null&&(s=999999999);let r=e.filter(c=>!c.isEmpty&&t.indexOf(c)<0),o=t.filter(c=>!c.isEmpty&&e.indexOf(c)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=$l(r,o),a=new Ai(r,l,0).goto(i),h=new Ai(o,l,0).goto(i);for(;;){if(a.to!=h.to||!_r(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>s)return!0;a.next(),h.next()}}static spans(e,t,i,s,r=-1){let o=new Ai(e,null,r).goto(t),l=t,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let c=o.activeForPoint(o.to),f=o.pointFroml&&(s.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(e,t=!1){let i=new gt;for(let s of e instanceof Fr?[e]:t?Fd(e):e)i.add(s.from,s.to,s.value);return i.finish()}static join(e){if(!e.length)return F.empty;let t=e[e.length-1];for(let i=e.length-2;i>=0;i--)for(let s=e[i];s!=F.empty;s=s.nextLayer)t=new F(s.chunkPos,s.chunk,t,Math.max(s.maxPoint,t.maxPoint));return t}}F.empty=new F([],[],null,-1);function Fd(n){if(n.length>1)for(let e=n[0],t=1;t0)return n.slice().sort(Xr);e=i}return n}F.empty.nextLayer=F.empty;class gt{finishChunk(e){this.chunks.push(new zo(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,i){this.addInner(e,t,i)||(this.nextLayer||(this.nextLayer=new gt)).add(e,t,i)}addInner(e,t,i){let s=e-this.lastTo||i.startSide-this.last.endSide;if(s<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=t,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let i=t.value.length-1;return this.last=t.value[i],this.lastFrom=t.from[i]+e,this.lastTo=t.to[i]+e,!0}finish(){return this.finishInner(F.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let t=F.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function $l(n,e,t){let i=new Map;for(let r of n)for(let o=0;o=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&s.push(new fc(o,t,i,r));return s.length==1?s[0]:new Hi(s)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let i of this.heap)i.goto(e,t);for(let i=this.heap.length>>1;i>=0;i--)er(this.heap,i);return this.next(),this}forward(e,t){for(let i of this.heap)i.forward(e,t);for(let i=this.heap.length>>1;i>=0;i--)er(this.heap,i);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),er(this.heap,0)}}}function er(n,e){for(let t=n[e];;){let i=(e<<1)+1;if(i>=n.length)break;let s=n[i];if(i+1=0&&(s=n[i+1],i++),t.compare(s)<0)break;n[i]=t,n[e]=s,e=i}}class Ai{constructor(e,t,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Hi.from(e,t,i)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){Tn(this.active,e),Tn(this.activeTo,e),Tn(this.activeRank,e),this.minActive=Ll(this.active,this.activeTo)}addActive(e){let t=0,{value:i,to:s,rank:r}=this.cursor;for(;t0;)t++;Cn(this.active,t,i),Cn(this.activeTo,t,s),Cn(this.activeRank,t,r),e&&Cn(e,t,this.cursor.from),this.minActive=Ll(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let s=this.minActive;if(s>-1&&(this.activeTo[s]-this.cursor.from||this.active[s].endSide-this.cursor.startSide)<0){if(this.activeTo[s]>e){this.to=this.activeTo[s],this.endSide=this.active[s].endSide;break}this.removeActive(s),i&&Tn(i,s)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(t&&this.cursor.to==this.to&&this.cursor.from=0&&i[s]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&t.push(this.active[i]);return t.reverse()}openEnd(e){let t=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)t++;return t}}function Bl(n,e,t,i,s,r){n.goto(e),t.goto(i);let o=i+s,l=i,a=i-e;for(;;){let h=n.to+a-t.to,c=h||n.endSide-t.endSide,f=c<0?n.to+a:t.to,u=Math.min(f,o);if(n.point||t.point?n.point&&t.point&&(n.point==t.point||n.point.eq(t.point))&&_r(n.activeForPoint(n.to),t.activeForPoint(t.to))||r.comparePoint(l,u,n.point,t.point):u>l&&!_r(n.active,t.active)&&r.compareRange(l,u,n.active,t.active),f>o)break;(h||n.openEnd!=t.openEnd)&&r.boundChange&&r.boundChange(f),l=f,c<=0&&n.next(),c>=0&&t.next()}}function _r(n,e){if(n.length!=e.length)return!1;for(let t=0;t=e;i--)n[i+1]=n[i];n[e]=t}function Ll(n,e){let t=-1,i=1e9;for(let s=0;s=e)return s;if(s==n.length)break;r+=n.charCodeAt(s)==9?t-r%t:1,s=Oe(n,s)}return i===!0?-1:n.length}const Hr="ͼ",Wl=typeof Symbol>"u"?"__"+Hr:Symbol.for(Hr),jr=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),zl=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{};let mi=class{constructor(e,t){this.rules=[];let{finish:i}=t||{};function s(o){return/^@/.test(o)?[o]:o.split(/,\s*/)}function r(o,l,a,h){let c=[],f=/^@(\w+)\b/.exec(o[0]),u=f&&f[1]=="keyframes";if(f&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\s*/).map(m=>o.map(g=>m.replace(/&/,g))).reduce((m,g)=>m.concat(g)),p,a);else if(p&&typeof p=="object"){if(!f)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(s(d),p,c,u)}else p!=null&&c.push(d.replace(/_.*/,"").replace(/[A-Z]/g,m=>"-"+m.toLowerCase())+": "+p+";")}(c.length||u)&&a.push((i&&!f&&!h?o.map(i):o).join(", ")+" {"+c.join(" ")+"}")}for(let o in e)r(s(o),e[o],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let e=zl[Wl]||1;return zl[Wl]=e+1,Hr+e.toString(36)}static mount(e,t,i){let s=e[jr],r=i&&i.nonce;s?r&&s.setNonce(r):s=new Xd(e,r),s.mount(Array.isArray(t)?t:[t],e)}},Il=new Map,Xd=class{constructor(e,t){let i=e.ownerDocument||e,s=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&s.CSSStyleSheet){let r=Il.get(i);if(r)return e[jr]=r;this.sheet=new s.CSSStyleSheet,Il.set(i,this)}else this.styleTag=i.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[jr]=this}mount(e,t){let i=this.sheet,s=0,r=0;for(let o=0;o-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;h",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},_d=typeof navigator<"u"&&/Mac/.test(navigator.platform),Ud=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(var me=0;me<10;me++)At[48+me]=At[96+me]=String(me);for(var me=1;me<=24;me++)At[me+111]="F"+me;for(var me=65;me<=90;me++)At[me]=String.fromCharCode(me+32),ji[me]=String.fromCharCode(me);for(var tr in At)ji.hasOwnProperty(tr)||(ji[tr]=At[tr]);function Hd(n){var e=_d&&n.metaKey&&n.shiftKey&&!n.ctrlKey&&!n.altKey||Ud&&n.shiftKey&&n.key&&n.key.length==1||n.key=="Unidentified",t=!e&&n.key||(n.shiftKey?ji:At)[n.keyCode]||n.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}function Gi(n){let e;return n.nodeType==11?e=n.getSelection?n:n.ownerDocument:e=n,e.getSelection()}function Gr(n,e){return e?n==e||n.contains(e.nodeType!=1?e.parentNode:e):!1}function Yn(n,e){if(!e.anchorNode)return!1;try{return Gr(n,e.anchorNode)}catch{return!1}}function Zi(n){return n.nodeType==3?Gt(n,0,n.nodeValue.length).getClientRects():n.nodeType==1?n.getClientRects():[]}function Ni(n,e,t,i){return t?Vl(n,e,t,i,-1)||Vl(n,e,t,i,1):!1}function jt(n){for(var e=0;;e++)if(n=n.previousSibling,!n)return e}function fs(n){return n.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(n.nodeName)}function Vl(n,e,t,i,s){for(;;){if(n==t&&e==i)return!0;if(e==(s<0?0:rt(n))){if(n.nodeName=="DIV")return!1;let r=n.parentNode;if(!r||r.nodeType!=1)return!1;e=jt(n)+(s<0?0:1),n=r}else if(n.nodeType==1){if(n=n.childNodes[e+(s<0?-1:0)],n.nodeType==1&&n.contentEditable=="false")return!1;e=s<0?rt(n):0}else return!1}}function rt(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function Bs(n,e){let t=e?n.left:n.right;return{left:t,right:t,top:n.top,bottom:n.bottom}}function jd(n){let e=n.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:n.innerWidth,top:0,bottom:n.innerHeight}}function uc(n,e){let t=e.width/n.offsetWidth,i=e.height/n.offsetHeight;return(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.width-n.offsetWidth)<1)&&(t=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-n.offsetHeight)<1)&&(i=1),{scaleX:t,scaleY:i}}function Gd(n,e,t,i,s,r,o,l){let a=n.ownerDocument,h=a.defaultView||window;for(let c=n,f=!1;c&&!f;)if(c.nodeType==1){let u,d=c==a.body,p=1,m=1;if(d)u=jd(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(f=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let S=c.getBoundingClientRect();({scaleX:p,scaleY:m}=uc(c,S)),u={left:S.left,right:S.left+c.clientWidth*p,top:S.top,bottom:S.top+c.clientHeight*m}}let g=0,y=0;if(s=="nearest")e.top0&&e.bottom>u.bottom+y&&(y=e.bottom-u.bottom+o)):e.bottom>u.bottom&&(y=e.bottom-u.bottom+o,t<0&&e.top-y0&&e.right>u.right+g&&(g=e.right-u.right+r)):e.right>u.right&&(g=e.right-u.right+r,t<0&&e.leftu.bottom||e.leftu.right)&&(e={left:Math.max(e.left,u.left),right:Math.min(e.right,u.right),top:Math.max(e.top,u.top),bottom:Math.min(e.bottom,u.bottom)}),c=c.assignedSlot||c.parentNode}else if(c.nodeType==11)c=c.host;else break}function Zd(n){let e=n.ownerDocument,t,i;for(let s=n.parentNode;s&&!(s==e.body||t&&i);)if(s.nodeType==1)!i&&s.scrollHeight>s.clientHeight&&(i=s),!t&&s.scrollWidth>s.clientWidth&&(t=s),s=s.assignedSlot||s.parentNode;else if(s.nodeType==11)s=s.host;else break;return{x:t,y:i}}class Yd{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:i}=e;this.set(t,Math.min(e.anchorOffset,t?rt(t):0),i,Math.min(e.focusOffset,i?rt(i):0))}set(e,t,i,s){this.anchorNode=e,this.anchorOffset=t,this.focusNode=i,this.focusOffset=s}}let ii=null;function dc(n){if(n.setActive)return n.setActive();if(ii)return n.focus(ii);let e=[];for(let t=n;t&&(e.push(t,t.scrollTop,t.scrollLeft),t!=t.ownerDocument);t=t.parentNode);if(n.focus(ii==null?{get preventScroll(){return ii={preventScroll:!0},!0}}:void 0),!ii){ii=!1;for(let t=0;tMath.max(1,n.scrollHeight-n.clientHeight-4)}function gc(n,e){for(let t=n,i=e;;){if(t.nodeType==3&&i>0)return{node:t,offset:i};if(t.nodeType==1&&i>0){if(t.contentEditable=="false")return null;t=t.childNodes[i-1],i=rt(t)}else if(t.parentNode&&!fs(t))i=jt(t),t=t.parentNode;else return null}}function Oc(n,e){for(let t=n,i=e;;){if(t.nodeType==3&&it)return f.domBoundsAround(e,t,h);if(u>=e&&s==-1&&(s=a,r=h),h>t&&f.dom.parentNode==this.dom){o=a,l=c;break}c=u,h=u+f.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(s?this.children[s-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(e=!1){this.flags|=2,this.markParentsDirty(e)}markParentsDirty(e){for(let t=this.parent;t;t=t.parent){if(e&&(t.flags|=2),t.flags&1)return;t.flags|=1,e=!1}}setParent(e){this.parent!=e&&(this.parent=e,this.flags&7&&this.markParentsDirty(!0))}setDOM(e){this.dom!=e&&(this.dom&&(this.dom.cmView=null),this.dom=e,e.cmView=this)}get rootView(){for(let e=this;;){let t=e.parent;if(!t)return e;e=t}}replaceChildren(e,t,i=Io){this.markDirty();for(let s=e;sthis.pos||e==this.pos&&(t>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=e-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}}function bc(n,e,t,i,s,r,o,l,a){let{children:h}=n,c=h.length?h[e]:null,f=r.length?r[r.length-1]:null,u=f?f.breakAfter:o;if(!(e==i&&c&&!o&&!u&&r.length<2&&c.merge(t,s,r.length?f:null,t==0,l,a))){if(i0&&(!o&&r.length&&c.merge(t,c.length,r[0],!1,l,0)?c.breakAfter=r.shift().breakAfter:(t2);var A={mac:_l||/Mac/.test(Pe.platform),windows:/Win/.test(Pe.platform),linux:/Linux|X11/.test(Pe.platform),ie:Ls,ie_version:Sc?Zr.documentMode||6:Kr?+Kr[1]:Yr?+Yr[1]:0,gecko:Xl,gecko_version:Xl?+(/Firefox\/(\d+)/.exec(Pe.userAgent)||[0,0])[1]:0,chrome:!!ir,chrome_version:ir?+ir[1]:0,ios:_l,android:/Android\b/.test(Pe.userAgent),safari:kc,webkit_version:ep?+(/\bAppleWebKit\/(\d+)/.exec(Pe.userAgent)||[0,0])[1]:0,tabSize:Zr.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};const tp=256;class Xe extends _{constructor(e){super(),this.text=e}get length(){return this.text.length}createDOM(e){this.setDOM(e||document.createTextNode(this.text))}sync(e,t){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(t&&t.node==this.dom&&(t.written=!0),this.dom.nodeValue=this.text)}reuseDOM(e){e.nodeType==3&&this.createDOM(e)}merge(e,t,i){return this.flags&8||i&&(!(i instanceof Xe)||this.length-(t-e)+i.length>tp||i.flags&8)?!1:(this.text=this.text.slice(0,e)+(i?i.text:"")+this.text.slice(t),this.markDirty(),!0)}split(e){let t=new Xe(this.text.slice(e));return this.text=this.text.slice(0,e),this.markDirty(),t.flags|=this.flags&8,t}localPosFromDOM(e,t){return e==this.dom?t:t?this.text.length:0}domAtPos(e){return new be(this.dom,e)}domBoundsAround(e,t,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(e,t){return ip(this.dom,e,t)}}class Ot extends _{constructor(e,t=[],i=0){super(),this.mark=e,this.children=t,this.length=i;for(let s of t)s.setParent(this)}setAttrs(e){if(pc(e),this.mark.class&&(e.className=this.mark.class),this.mark.attrs)for(let t in this.mark.attrs)e.setAttribute(t,this.mark.attrs[t]);return e}canReuseDOM(e){return super.canReuseDOM(e)&&!((this.flags|e.flags)&8)}reuseDOM(e){e.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(e),this.flags|=6)}sync(e,t){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(e,t)}merge(e,t,i,s,r,o){return i&&(!(i instanceof Ot&&i.mark.eq(this.mark))||e&&r<=0||te&&t.push(i=e&&(s=r),i=a,r++}let o=this.length-e;return this.length=e,s>-1&&(this.children.length=s,this.markDirty()),new Ot(this.mark,t,o)}domAtPos(e){return wc(this,e)}coordsAt(e,t){return Tc(this,e,t)}}function ip(n,e,t){let i=n.nodeValue.length;e>i&&(e=i);let s=e,r=e,o=0;e==0&&t<0||e==i&&t>=0?A.chrome||A.gecko||(e?(s--,o=1):r=0)?0:l.length-1];return A.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?Bs(a,o<0):a||null}class Ct extends _{static create(e,t,i){return new Ct(e,t,i)}constructor(e,t,i){super(),this.widget=e,this.length=t,this.side=i,this.prevWidget=null}split(e){let t=Ct.create(this.widget,this.length-e,this.side);return this.length-=e,t}sync(e){(!this.dom||!this.widget.updateDOM(this.dom,e))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(e)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(e,t,i,s,r,o){return i&&(!(i instanceof Ct)||!this.widget.compare(i.widget)||e>0&&r<=0||t0)?be.before(this.dom):be.after(this.dom,e==this.length)}domBoundsAround(){return null}coordsAt(e,t){let i=this.widget.coordsAt(this.dom,e,t);if(i)return i;let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.side?this.side<0:e>0;for(let l=o?s.length-1:0;r=s[l],!(e>0?l==0:l==s.length-1||r.top0?be.before(this.dom):be.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(e){return this.dom.getBoundingClientRect()}get overrideDOMText(){return V.empty}get isHidden(){return!0}}Xe.prototype.children=Ct.prototype.children=gi.prototype.children=Io;function wc(n,e){let t=n.dom,{children:i}=n,s=0;for(let r=0;sr&&e0;r--){let o=i[r-1];if(o.dom.parentNode==t)return o.domAtPos(o.length)}for(let r=s;r0&&e instanceof Ot&&s.length&&(i=s[s.length-1])instanceof Ot&&i.mark.eq(e.mark)?vc(i,e.children[0],t-1):(s.push(e),e.setParent(n)),n.length+=e.length}function Tc(n,e,t){let i=null,s=-1,r=null,o=-1;function l(h,c){for(let f=0,u=0;f=c&&(d.children.length?l(d,c-u):(!r||r.isHidden&&(t>0||sp(r,d)))&&(p>c||u==p&&d.getSide()>0)?(r=d,o=c-u):(u-1?1:0)!=s.length-(t&&s.indexOf(t)>-1?1:0))return!1;for(let r of i)if(r!=t&&(s.indexOf(r)==-1||n[r]!==e[r]))return!1;return!0}function eo(n,e,t){let i=!1;if(e)for(let s in e)t&&s in t||(i=!0,s=="style"?n.style.cssText="":n.removeAttribute(s));if(t)for(let s in t)e&&e[s]==t[s]||(i=!0,s=="style"?n.style.cssText=t[s]:n.setAttribute(s,t[s]));return i}function rp(n){let e=Object.create(null);for(let t=0;t0?3e8:-4e8:t>0?1e8:-1e8,new Mt(e,t,t,i,e.widget||null,!1)}static replace(e){let t=!!e.block,i,s;if(e.isBlockGap)i=-5e8,s=4e8;else{let{start:r,end:o}=Cc(e,t);i=(r?t?-3e8:-1:5e8)-1,s=(o?t?2e8:1:-6e8)+1}return new Mt(e,i,s,t,e.widget||null,!0)}static line(e){return new dn(e)}static set(e,t=!1){return F.of(e,t)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}}D.none=F.empty;class un extends D{constructor(e){let{start:t,end:i}=Cc(e);super(t?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.class=e.class||"",this.attrs=e.attributes||null}eq(e){var t,i;return this==e||e instanceof un&&this.tagName==e.tagName&&(this.class||((t=this.attrs)===null||t===void 0?void 0:t.class))==(e.class||((i=e.attrs)===null||i===void 0?void 0:i.class))&&us(this.attrs,e.attrs,"class")}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}}un.prototype.point=!1;class dn extends D{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof dn&&this.spec.class==e.spec.class&&us(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}}dn.prototype.mapMode=ge.TrackBefore;dn.prototype.point=!0;class Mt extends D{constructor(e,t,i,s,r,o){super(t,i,r,e),this.block=s,this.isReplace=o,this.mapMode=s?t<=0?ge.TrackBefore:ge.TrackAfter:ge.TrackDel}get type(){return this.startSide!=this.endSide?we.WidgetRange:this.startSide<=0?we.WidgetBefore:we.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof Mt&&op(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}}Mt.prototype.point=!0;function Cc(n,e=!1){let{inclusiveStart:t,inclusiveEnd:i}=n;return t==null&&(t=n.inclusive),i==null&&(i=n.inclusive),{start:t??e,end:i??e}}function op(n,e){return n==e||!!(n&&e&&n.compare(e))}function Kn(n,e,t,i=0){let s=t.length-1;s>=0&&t[s]+i>=n?t[s]=Math.max(t[s],e):t.push(n,e)}class re extends _{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(e,t,i,s,r,o){if(i){if(!(i instanceof re))return!1;this.dom||i.transferDOM(this)}return s&&this.setDeco(i?i.attrs:null),xc(this,e,t,i?i.children.slice():[],r,o),!0}split(e){let t=new re;if(t.breakAfter=this.breakAfter,this.length==0)return t;let{i,off:s}=this.childPos(e);s&&(t.append(this.children[i].split(s),0),this.children[i].merge(s,this.children[i].length,null,!1,0,0),i++);for(let r=i;r0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=e,t}transferDOM(e){this.dom&&(this.markDirty(),e.setDOM(this.dom),e.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(e){us(this.attrs,e)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=e)}append(e,t){vc(this,e,t)}addLineDeco(e){let t=e.spec.attributes,i=e.spec.class;t&&(this.attrs=Jr(t,this.attrs||{})),i&&(this.attrs=Jr({class:i},this.attrs||{}))}domAtPos(e){return wc(this,e)}reuseDOM(e){e.nodeName=="DIV"&&(this.setDOM(e),this.flags|=6)}sync(e,t){var i;this.dom?this.flags&4&&(pc(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(eo(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(e,t);let s=this.dom.lastChild;for(;s&&_.get(s)instanceof Ot;)s=s.lastChild;if(!s||!this.length||s.nodeName!="BR"&&((i=_.get(s))===null||i===void 0?void 0:i.isEditable)==!1&&(!A.ios||!this.children.some(r=>r instanceof Xe))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let e=0,t;for(let i of this.children){if(!(i instanceof Xe)||/[^ -~]/.test(i.text))return null;let s=Zi(i.dom);if(s.length!=1)return null;e+=s[0].width,t=s[0].height}return e?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:e/this.length,textHeight:t}:null}coordsAt(e,t){let i=Tc(this,e,t);if(!this.children.length&&i&&this.parent){let{heightOracle:s}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-s.lineHeight)<2&&s.textHeight=t){if(r instanceof re)return r;if(o>t)break}s=o+r.breakAfter}return null}}class mt extends _{constructor(e,t,i){super(),this.widget=e,this.length=t,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(e,t,i,s,r,o){return i&&(!(i instanceof mt)||!this.widget.compare(i.widget)||e>0&&r<=0||t0}}class to extends xt{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}class Fi{constructor(e,t,i,s){this.doc=e,this.pos=t,this.end=i,this.disallowBlockEffectsFor=s,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=e.iter(),this.skip=t}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let e=this.content[this.content.length-1];return!(e.breakAfter||e instanceof mt&&e.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new re),this.atCursorPos=!0),this.curLine}flushBuffer(e=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(Pn(new gi(-1),e),e.length),this.pendingBuffer=0)}addBlockWidget(e){this.flushBuffer(),this.curLine=null,this.content.push(e)}finish(e){this.pendingBuffer&&e<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(e&&this.content.length&&this.content[this.content.length-1]instanceof mt)&&this.getLine()}buildText(e,t,i){for(;e>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,e--;continue}else this.text=r,this.textOff=0}let s=Math.min(this.text.length-this.textOff,e,512);this.flushBuffer(t.slice(t.length-i)),this.getLine().append(Pn(new Xe(this.text.slice(this.textOff,this.textOff+s)),t),i),this.atCursorPos=!0,this.textOff+=s,e-=s,i=0}}span(e,t,i,s){this.buildText(t-e,i,s),this.pos=t,this.openStart<0&&(this.openStart=s)}point(e,t,i,s,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof Mt){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(t>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=t-e;if(i instanceof Mt)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new mt(i.widget||Oi.block,l,i));else{let a=Ct.create(i.widget||Oi.inline,l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=s.length&&(e0),c=!a.isEditable&&(es.length||i.startSide<=0),f=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(s),h&&(f.append(Pn(new gi(1),s),r),r=s.length+Math.max(0,r-s.length)),f.append(Pn(a,s),r),this.atCursorPos=c,this.pendingBuffer=c?es.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=s.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=t),this.openStart<0&&(this.openStart=r)}static build(e,t,i,s,r){let o=new Fi(e,t,i,r);return o.openEnd=F.spans(s,t,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}}function Pn(n,e){for(let t of e)n=new Ot(t,[n],n.length);return n}class Oi extends xt{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}Oi.inline=new Oi("span");Oi.block=new Oi("div");var Z=function(n){return n[n.LTR=0]="LTR",n[n.RTL=1]="RTL",n}(Z||(Z={}));const Zt=Z.LTR,Vo=Z.RTL;function Pc(n){let e=[];for(let t=0;t=t){if(l.level==i)return o;(r<0||(s!=0?s<0?l.fromt:e[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}}function Ac(n,e){if(n.length!=e.length)return!1;for(let t=0;t=0;m-=3)if(He[m+1]==-d){let g=He[m+2],y=g&2?s:g&4?g&1?r:s:0;y&&(X[f]=X[He[m]]=y),l=m;break}}else{if(He.length==189)break;He[l++]=f,He[l++]=u,He[l++]=a}else if((p=X[f])==2||p==1){let m=p==s;a=m?0:1;for(let g=l-3;g>=0;g-=3){let y=He[g+2];if(y&2)break;if(m)He[g+2]|=2;else{if(y&4)break;He[g+2]|=4}}}}}function up(n,e,t,i){for(let s=0,r=i;s<=t.length;s++){let o=s?t[s-1].to:n,l=sa;)p==g&&(p=t[--m].from,g=m?t[m-1].to:n),X[--p]=d;a=c}else r=h,a++}}}function no(n,e,t,i,s,r,o){let l=i%2?2:1;if(i%2==s%2)for(let a=e,h=0;aa&&o.push(new Pt(a,m.from,d));let g=m.direction==Zt!=!(d%2);so(n,g?i+1:i,s,m.inner,m.from,m.to,o),a=m.to}p=m.to}else{if(p==t||(c?X[p]!=l:X[p]==l))break;p++}u?no(n,a,p,i+1,s,u,o):ae;){let c=!0,f=!1;if(!h||a>r[h-1].to){let m=X[a-1];m!=l&&(c=!1,f=m==16)}let u=!c&&l==1?[]:null,d=c?i:i+1,p=a;e:for(;;)if(h&&p==r[h-1].to){if(f)break e;let m=r[--h];if(!c)for(let g=m.from,y=h;;){if(g==e)break e;if(y&&r[y-1].to==g)g=r[--y].from;else{if(X[g-1]==l)break e;break}}if(u)u.push(m);else{m.toX.length;)X[X.length]=256;let i=[],s=e==Zt?0:1;return so(n,s,s,t,0,n.length,i),i}function Mc(n){return[new Pt(0,n,0)]}let Rc="";function pp(n,e,t,i,s){var r;let o=i.head-n.from,l=Pt.find(e,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=e[l],h=a.side(s,t);if(o==h){let u=l+=s?1:-1;if(u<0||u>=e.length)return null;a=e[l=u],o=a.side(!s,t),h=a.side(s,t)}let c=Oe(n.text,o,a.forward(s,t));(ca.to)&&(c=h),Rc=n.text.slice(Math.min(o,c),Math.max(o,c));let f=l==(s?e.length-1:0)?null:e[l+(s?1:-1)];return f&&c==h&&f.level+(s?0:1)n.some(e=>e)}),zc=M.define({combine:n=>n.some(e=>e)}),Ic=M.define();class ci{constructor(e,t="nearest",i="nearest",s=5,r=5,o=!1){this.range=e,this.y=t,this.x=i,this.yMargin=s,this.xMargin=r,this.isSnapshot=o}map(e){return e.empty?this:new ci(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new ci(b.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const Qn=B.define({map:(n,e)=>n.map(e)}),Vc=B.define();function Ae(n,e,t){let i=n.facet($c);i.length?i[0](e):window.onerror&&window.onerror(String(e),t,void 0,void 0,e)||(t?console.error(t+":",e):console.error(e))}const pt=M.define({combine:n=>n.length?n[0]:!0});let gp=0;const ri=M.define({combine(n){return n.filter((e,t)=>{for(let i=0;i{let a=[];return o&&a.push(Yi.of(h=>{let c=h.plugin(l);return c?o(c):D.none})),r&&a.push(r(l)),a})}static fromClass(e,t){return le.define((i,s)=>new e(i,s),t)}}class nr{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(i){if(Ae(t.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(t){Ae(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(!((t=this.value)===null||t===void 0)&&t.destroy)try{this.value.destroy()}catch(i){Ae(e.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const Nc=M.define(),Xo=M.define(),Yi=M.define(),Fc=M.define(),_o=M.define(),Xc=M.define();function Hl(n,e){let t=n.state.facet(Xc);if(!t.length)return t;let i=t.map(r=>r instanceof Function?r(n):r),s=[];return F.spans(i,e.from,e.to,{point(){},span(r,o,l,a){let h=r-e.from,c=o-e.from,f=s;for(let u=l.length-1;u>=0;u--,a--){let d=l[u].spec.bidiIsolate,p;if(d==null&&(d=mp(e.text,h,c)),a>0&&f.length&&(p=f[f.length-1]).to==h&&p.direction==d)p.to=c,f=p.inner;else{let m={from:h,to:c,direction:d,inner:[]};f.push(m),f=m.inner}}}}),s}const _c=M.define();function Uo(n){let e=0,t=0,i=0,s=0;for(let r of n.state.facet(_c)){let o=r(n);o&&(o.left!=null&&(e=Math.max(e,o.left)),o.right!=null&&(t=Math.max(t,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(s=Math.max(s,o.bottom)))}return{left:e,right:t,top:i,bottom:s}}const qi=M.define();class Ve{constructor(e,t,i,s){this.fromA=e,this.toA=t,this.fromB=i,this.toB=s}join(e){return new Ve(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let t=e.length,i=this;for(;t>0;t--){let s=e[t-1];if(!(s.fromA>i.toA)){if(s.toAc)break;r+=2}if(!a)return i;new Ve(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}}class ds{constructor(e,t,i){this.view=e,this.state=t,this.transactions=i,this.flags=0,this.startState=e.state,this.changes=ae.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let s=[];this.changes.iterChangedRanges((r,o,l,a)=>s.push(new Ve(r,o,l,a))),this.changedRanges=s}static create(e,t,i){return new ds(e,t,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}}class jl extends _{get length(){return this.view.state.doc.length}constructor(e){super(),this.view=e,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=D.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(e.contentDOM),this.children=[new re],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Ve(0,0,0,e.state.doc.length)],0,null)}update(e){var t;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:c})=>cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let s=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((t=this.domChanged)===null||t===void 0)&&t.newSel?s=this.domChanged.newSel.head:!wp(e.changes,this.hasComposition)&&!e.selectionSet&&(s=e.state.selection.main.head));let r=s>-1?yp(this.view,e.changes,s):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:c}=this.hasComposition;i=new Ve(h,c,e.changes.mapPos(h,-1),e.changes.mapPos(c,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(A.ie||A.chrome)&&!r&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=Sp(o,l,e.changes);return i=Ve.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,e.startState.doc.length,r),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(e,t,i);let{observer:s}=this.view;s.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=A.chrome||A.ios?{node:s.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||s.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?s[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:c,toB:f}=l,u,d,p,m;if(i&&i.range.fromBc){let v=Fi.build(this.view.state.doc,c,i.range.fromB,this.decorations,this.dynamicDecorationMap),x=Fi.build(this.view.state.doc,i.range.toB,f,this.decorations,this.dynamicDecorationMap);d=v.breakAtStart,p=v.openStart,m=x.openEnd;let w=this.compositionView(i);x.breakAtStart?w.breakAfter=1:x.content.length&&w.merge(w.length,w.length,x.content[0],!1,x.openStart,0)&&(w.breakAfter=x.content[0].breakAfter,x.content.shift()),v.content.length&&w.merge(0,0,v.content[v.content.length-1],!0,0,v.openEnd)&&v.content.pop(),u=v.content.concat(w).concat(x.content)}else({content:u,breakAtStart:d,openStart:p,openEnd:m}=Fi.build(this.view.state.doc,c,f,this.decorations,this.dynamicDecorationMap));let{i:g,off:y}=r.findPos(h,1),{i:S,off:k}=r.findPos(a,-1);bc(this,S,k,g,y,u,d,p,m)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(e){this.editContextFormatting=this.editContextFormatting.map(e.changes);for(let t of e.transactions)for(let i of t.effects)i.is(Vc)&&(this.editContextFormatting=i.value)}compositionView(e){let t=new Xe(e.text.nodeValue);t.flags|=8;for(let{deco:s}of e.marks)t=new Ot(s,[t],t.length);let i=new re;return i.append(t,0),i}fixCompositionDOM(e){let t=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=_.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(e.range.fromB,1),s=this.children[i.i];t(e.line,s);for(let r=e.marks.length-1;r>=-1;r--)i=s.childPos(i.off,1),s=s.children[i.i],t(r>=0?e.marks[r].node:e.text,s)}updateSelection(e=!1,t=!1){(e||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,s=i==this.dom,r=!s&&!(this.view.state.facet(pt)||this.dom.tabIndex>-1)&&Yn(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(s||t||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(A.gecko&&l.empty&&!this.hasComposition&&Op(a)){let f=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(f,a.node.childNodes[a.offset]||null)),a=h=new be(f,0),o=!0}let c=this.view.observer.selectionRange;(o||!c.focusNode||(!Ni(a.node,a.offset,c.anchorNode,c.anchorOffset)||!Ni(h.node,h.offset,c.focusNode,c.focusOffset))&&!this.suppressWidgetCursorChange(c,l))&&(this.view.observer.ignore(()=>{A.android&&A.chrome&&this.dom.contains(c.focusNode)&&kp(c.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let f=Gi(this.view.root);if(f)if(l.empty){if(A.gecko){let u=bp(a.node,a.offset);if(u&&u!=3){let d=(u==1?gc:Oc)(a.node,a.offset);d&&(a=new be(d.node,d.offset))}}f.collapse(a.node,a.offset),l.bidiLevel!=null&&f.caretBidiLevel!==void 0&&(f.caretBidiLevel=l.bidiLevel)}else if(f.extend){f.collapse(a.node,a.offset);try{f.extend(h.node,h.offset)}catch{}}else{let u=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),u.setEnd(h.node,h.offset),u.setStart(a.node,a.offset),f.removeAllRanges(),f.addRange(u)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new be(c.anchorNode,c.anchorOffset),this.impreciseHead=h.precise?null:new be(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&Ni(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==t.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,i=Gi(e.root),{anchorNode:s,anchorOffset:r}=e.observer.selectionRange;if(!i||!t.empty||!t.assoc||!i.modify)return;let o=re.find(this,t.head);if(!o)return;let l=o.posAtStart;if(t.head==l||t.head==l+o.length)return;let a=this.coordsAt(t.head,-1),h=this.coordsAt(t.head,1);if(!a||!h||a.bottom>h.top)return;let c=this.domAtPos(t.head+t.assoc);i.collapse(c.node,c.offset),i.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let f=e.observer.selectionRange;e.docView.posFromDOM(f.anchorNode,f.anchorOffset)!=t.from&&i.collapse(s,r)}moveToLine(e){let t=this.dom,i;if(e.node!=t)return e;for(let s=e.offset;!i&&s=0;s--){let r=_.get(t.childNodes[s]);r instanceof re&&(i=r.domAtPos(r.length))}return i?new be(i.node,i.offset,!0):e}nearest(e){for(let t=e;t;){let i=_.get(t);if(i&&i.rootView==this)return i;t=t.parentNode}return null}posFromDOM(e,t){let i=this.nearest(e);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(e,t)+i.posAtStart}domAtPos(e){let{i:t,off:i}=this.childCursor().findPos(e,-1);for(;t=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(ae||l.covers(1))&&(!i||l instanceof re&&!(i instanceof re&&t>=0)))i=l,s=h;else if(i&&h==e&&a==e&&l instanceof mt&&Math.abs(t)<2){if(l.deco.startSide<0)break;o&&(i=null)}r=h}return i?i.coordsAt(e-s,t):null}coordsForChar(e){let{i:t,off:i}=this.childPos(e,1),s=this.children[t];if(!(s instanceof re))return null;for(;s.children.length;){let{i:l,off:a}=s.childPos(i,1);for(;;l++){if(l==s.children.length)return null;if((s=s.children[l]).length)break}i=a}if(!(s instanceof Xe))return null;let r=Oe(s.text,i);if(r==i)return null;let o=Gt(s.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==Z.LTR;for(let h=0,c=0;cs)break;if(h>=i){let d=f.dom.getBoundingClientRect();if(t.push(d.height),o){let p=f.dom.lastChild,m=p?Zi(p):[];if(m.length){let g=m[m.length-1],y=a?g.right-d.left:d.right-g.left;y>l&&(l=y,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=u)}}}h=u+f.breakAfter}return t}textDirectionAt(e){let{i:t}=this.childPos(e,1);return getComputedStyle(this.children[t].dom).direction=="rtl"?Z.RTL:Z.LTR}measureTextSize(){for(let r of this.children)if(r instanceof re){let o=r.measureTextSize();if(o)return o}let e=document.createElement("div"),t,i,s;return e.className="cm-line",e.style.width="99999px",e.style.position="absolute",e.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(e);let r=Zi(e.firstChild)[0];t=e.getBoundingClientRect().height,i=r?r.width/27:7,s=r?r.height:t,e.remove()}),{lineHeight:t,charWidth:i,textHeight:s}}childCursor(e=this.length){let t=this.children.length;return t&&(e-=this.children[--t].length),new yc(this.children,e,t)}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let i=0,s=0;;s++){let r=s==t.viewports.length?null:t.viewports[s],o=r?r.from-1:this.length;if(o>i){let l=(t.lineBlockAt(o).bottom-t.lineBlockAt(i).top)/this.view.scaleY;e.push(D.replace({widget:new to(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return D.set(e)}updateDeco(){let e=1,t=this.view.state.facet(Yi).map(r=>(this.dynamicDecorationMap[e++]=typeof r=="function")?r(this.view):r),i=!1,s=this.view.state.facet(Fc).map((r,o)=>{let l=typeof r=="function";return l&&(i=!0),l?r(this.view):r});for(s.length&&(this.dynamicDecorationMap[e++]=i,t.push(F.join(s))),this.decorations=[this.editContextFormatting,...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];et.anchor?-1:1),s;if(!i)return;!t.empty&&(s=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(i={left:Math.min(i.left,s.left),top:Math.min(i.top,s.top),right:Math.max(i.right,s.right),bottom:Math.max(i.bottom,s.bottom)});let r=Uo(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;Gd(this.view.scrollDOM,o,t.head{ie.from&&(t=!0)}),t}function vp(n,e,t=1){let i=n.charCategorizer(e),s=n.doc.lineAt(e),r=e-s.from;if(s.length==0)return b.cursor(e);r==0?t=1:r==s.length&&(t=-1);let o=r,l=r;t<0?o=Oe(s.text,r,!1):l=Oe(s.text,r);let a=i(s.text.slice(o,l));for(;o>0;){let h=Oe(s.text,o,!1);if(i(s.text.slice(h,o))!=a)break;o=h}for(;ln?e.left-n:Math.max(0,n-e.right)}function Cp(n,e){return e.top>n?e.top-n:Math.max(0,n-e.bottom)}function sr(n,e){return n.tope.top+1}function Gl(n,e){return en.bottom?{top:n.top,left:n.left,right:n.right,bottom:e}:n}function oo(n,e,t){let i,s,r,o,l=!1,a,h,c,f;for(let p=n.firstChild;p;p=p.nextSibling){let m=Zi(p);for(let g=0;gk||o==k&&r>S)&&(i=p,s=y,r=S,o=k,l=S?e0:gy.bottom&&(!c||c.bottomy.top)&&(h=p,f=y):c&&sr(c,y)?c=Zl(c,y.bottom):f&&sr(f,y)&&(f=Gl(f,y.top))}}if(c&&c.bottom>=t?(i=a,s=c):f&&f.top<=t&&(i=h,s=f),!i)return{node:n,offset:0};let u=Math.max(s.left,Math.min(s.right,e));if(i.nodeType==3)return Yl(i,u,t);if(l&&i.contentEditable!="false")return oo(i,u,t);let d=Array.prototype.indexOf.call(n.childNodes,i)+(e>=(s.left+s.right)/2?1:0);return{node:n,offset:d}}function Yl(n,e,t){let i=n.nodeValue.length,s=-1,r=1e9,o=0;for(let l=0;lt?c.top-t:t-c.bottom)-1;if(c.left-1<=e&&c.right+1>=e&&f=(c.left+c.right)/2,d=u;if((A.chrome||A.gecko)&&Gt(n,l).getBoundingClientRect().left==c.right&&(d=!u),f<=0)return{node:n,offset:l+(d?1:0)};s=l+(d?1:0),r=f}}}return{node:n,offset:s>-1?s:o>0?n.nodeValue.length:0}}function Hc(n,e,t,i=-1){var s,r;let o=n.contentDOM.getBoundingClientRect(),l=o.top+n.viewState.paddingTop,a,{docHeight:h}=n.viewState,{x:c,y:f}=e,u=f-l;if(u<0)return 0;if(u>h)return n.state.doc.length;for(let v=n.viewState.heightOracle.textHeight/2,x=!1;a=n.elementAtHeight(u),a.type!=we.Text;)for(;u=i>0?a.bottom+v:a.top-v,!(u>=0&&u<=h);){if(x)return t?null:0;x=!0,i=-i}f=l+u;let d=a.from;if(dn.viewport.to)return n.viewport.to==n.state.doc.length?n.state.doc.length:t?null:Kl(n,o,a,c,f);let p=n.dom.ownerDocument,m=n.root.elementFromPoint?n.root:p,g=m.elementFromPoint(c,f);g&&!n.contentDOM.contains(g)&&(g=null),g||(c=Math.max(o.left+1,Math.min(o.right-1,c)),g=m.elementFromPoint(c,f),g&&!n.contentDOM.contains(g)&&(g=null));let y,S=-1;if(g&&((s=n.docView.nearest(g))===null||s===void 0?void 0:s.isEditable)!=!1){if(p.caretPositionFromPoint){let v=p.caretPositionFromPoint(c,f);v&&({offsetNode:y,offset:S}=v)}else if(p.caretRangeFromPoint){let v=p.caretRangeFromPoint(c,f);v&&({startContainer:y,startOffset:S}=v,(!n.contentDOM.contains(y)||A.safari&&Pp(y,S,c)||A.chrome&&Qp(y,S,c))&&(y=void 0))}y&&(S=Math.min(rt(y),S))}if(!y||!n.docView.dom.contains(y)){let v=re.find(n.docView,d);if(!v)return u>a.top+a.height/2?a.to:a.from;({node:y,offset:S}=oo(v.dom,c,f))}let k=n.docView.nearest(y);if(!k)return null;if(k.isWidget&&((r=k.dom)===null||r===void 0?void 0:r.nodeType)==1){let v=k.dom.getBoundingClientRect();return e.yn.defaultLineHeight*1.5){let l=n.viewState.heightOracle.textHeight,a=Math.floor((s-t.top-(n.defaultLineHeight-l)*.5)/l);r+=a*n.viewState.heightOracle.lineLength}let o=n.state.sliceDoc(t.from,t.to);return t.from+Ur(o,r,n.state.tabSize)}function Pp(n,e,t){let i,s=n;if(n.nodeType!=3||e!=(i=n.nodeValue.length))return!1;for(;;){let r=s.nextSibling;if(r){if(r.nodeName=="BR")break;return!1}else{let o=s.parentNode;if(!o||o.nodeName=="DIV")break;s=o}}return Gt(n,i-1,i).getBoundingClientRect().right>t}function Qp(n,e,t){if(e!=0)return!1;for(let s=n;;){let r=s.parentNode;if(!r||r.nodeType!=1||r.firstChild!=s)return!1;if(r.classList.contains("cm-line"))break;s=r}let i=n.nodeType==1?n.getBoundingClientRect():Gt(n,0,Math.max(n.nodeValue.length,1)).getBoundingClientRect();return t-i.left>5}function lo(n,e,t){let i=n.lineBlockAt(e);if(Array.isArray(i.type)){let s;for(let r of i.type){if(r.from>e)break;if(!(r.toe)return r;(!s||r.type==we.Text&&(s.type!=r.type||(t<0?r.frome)))&&(s=r)}}return s||i}return i}function Ap(n,e,t,i){let s=lo(n,e.head,e.assoc||-1),r=!i||s.type!=we.Text||!(n.lineWrapping||s.widgetLineBreaks)?null:n.coordsAtPos(e.assoc<0&&e.head>s.from?e.head-1:e.head);if(r){let o=n.dom.getBoundingClientRect(),l=n.textDirectionAt(s.from),a=n.posAtCoords({x:t==(l==Z.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return b.cursor(a,t?-1:1)}return b.cursor(t?s.to:s.from,t?-1:1)}function Jl(n,e,t,i){let s=n.state.doc.lineAt(e.head),r=n.bidiSpans(s),o=n.textDirectionAt(s.from);for(let l=e,a=null;;){let h=pp(s,r,o,l,t),c=Rc;if(!h){if(s.number==(t?n.state.doc.lines:1))return l;c=` +`,s=n.state.doc.line(s.number+(t?1:-1)),r=n.bidiSpans(s),h=n.visualLineSide(s,!t)}if(a){if(!a(c))return l}else{if(!i)return h;a=i(c)}l=h}}function Mp(n,e,t){let i=n.state.charCategorizer(e),s=i(t);return r=>{let o=i(r);return s==Y.Space&&(s=o),s==o}}function Rp(n,e,t,i){let s=e.head,r=t?1:-1;if(s==(t?n.state.doc.length:0))return b.cursor(s,e.assoc);let o=e.goalColumn,l,a=n.contentDOM.getBoundingClientRect(),h=n.coordsAtPos(s,e.assoc||-1),c=n.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=n.viewState.lineBlockAt(s);o==null&&(o=Math.min(a.right-a.left,n.defaultCharacterWidth*(s-d.from))),l=(r<0?d.top:d.bottom)+c}let f=a.left+o,u=i??n.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(u+d)*r,m=Hc(n,{x:f,y:p},!1,r);if(pa.bottom||(r<0?ms)){let g=n.docView.coordsForChar(m),y=!g||p{if(e>r&&es(n)),t.from,e.head>t.from?-1:1);return i==t.from?t:b.cursor(i,ir)&&this.lineBreak(),s=o}return this.findPointBefore(i,t),this}readTextNode(e){let t=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,t.length));for(let i=0,s=this.lineSeparator?null:/\r\n?|\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=t.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=s.exec(t))&&(r=l.index,o=l[0].length),this.append(t.slice(i,r<0?t.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==e&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(e){if(e.cmIgnore)return;let t=_.get(e),i=t&&t.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let s=i.iter();!s.next().done;)s.lineBreak?this.lineBreak():this.append(s.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==t&&(i.pos=this.text.length)}findPointInside(e,t){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(Ep(e,i.node,i.offset)?t:0))}}function Ep(n,e,t){for(;;){if(!e||t-1;let{impreciseHead:r,impreciseAnchor:o}=e.docView;if(e.state.readOnly&&t>-1)this.newSel=null;else if(t>-1&&(this.bounds=e.docView.domBoundsAround(t,i,0))){let l=r||o?[]:Lp(e),a=new Dp(l,e.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=Wp(l,this.bounds.from)}else{let l=e.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!Gr(e.contentDOM,l.focusNode)?e.state.selection.main.head:e.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!Gr(e.contentDOM,l.anchorNode)?e.state.selection.main.anchor:e.docView.posFromDOM(l.anchorNode,l.anchorOffset),c=e.viewport;if((A.ios||A.chrome)&&e.state.selection.main.empty&&a!=h&&(c.from>0||c.toDate.now()-100?n.inputState.lastKeyCode:-1;if(e.bounds){let{from:o,to:l}=e.bounds,a=s.from,h=null;(r===8||A.android&&e.text.length=s.from&&t.to<=s.to&&(t.from!=s.from||t.to!=s.to)&&s.to-s.from-(t.to-t.from)<=4?t={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,t.from).append(t.insert).append(n.state.doc.slice(t.to,s.to))}:A.chrome&&t&&t.from==t.to&&t.from==s.head&&t.insert.toString()==` + `&&n.lineWrapping&&(i&&(i=b.single(i.main.anchor-1,i.main.head-1)),t={from:s.from,to:s.to,insert:V.of([" "])}),t)return Ho(n,t,i,r);if(i&&!i.main.eq(s)){let o=!1,l="select";return n.inputState.lastSelectionTime>Date.now()-50&&(n.inputState.lastSelectionOrigin=="select"&&(o=!0),l=n.inputState.lastSelectionOrigin),n.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function Ho(n,e,t,i=-1){if(A.ios&&n.inputState.flushIOSKey(e))return!0;let s=n.state.selection.main;if(A.android&&(e.to==s.to&&(e.from==s.from||e.from==s.from-1&&n.state.sliceDoc(e.from,s.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&hi(n.contentDOM,"Enter",13)||(e.from==s.from-1&&e.to==s.to&&e.insert.length==0||i==8&&e.insert.lengths.head)&&hi(n.contentDOM,"Backspace",8)||e.from==s.from&&e.to==s.to+1&&e.insert.length==0&&hi(n.contentDOM,"Delete",46)))return!0;let r=e.insert.toString();n.inputState.composing>=0&&n.inputState.composing++;let o,l=()=>o||(o=$p(n,e,t));return n.state.facet(Bc).some(a=>a(n,e.from,e.to,r,l))||n.dispatch(l()),!0}function $p(n,e,t){let i,s=n.state,r=s.selection.main;if(e.from>=r.from&&e.to<=r.to&&e.to-e.from>=(r.to-r.from)/3&&(!t||t.main.empty&&t.main.from==e.from+e.insert.length)&&n.inputState.composing<0){let l=r.frome.to?s.sliceDoc(e.to,r.to):"";i=s.replaceSelection(n.state.toText(l+e.insert.sliceString(0,void 0,n.state.lineBreak)+a))}else{let l=s.changes(e),a=t&&t.main.to<=l.newLength?t.main:void 0;if(s.selection.ranges.length>1&&n.inputState.composing>=0&&e.to<=r.to&&e.to>=r.to-10){let h=n.state.sliceDoc(e.from,e.to),c,f=t&&Uc(n,t.main.head);if(f){let p=e.insert.length-(e.to-e.from);c={from:f.from,to:f.to-p}}else c=n.state.doc.lineAt(r.head);let u=r.to-e.to,d=r.to-r.from;i=s.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let m=p.to-u,g=m-h.length;if(p.to-p.from!=d||n.state.sliceDoc(g,m)!=h||p.to>=c.from&&p.from<=c.to)return{range:p};let y=s.changes({from:g,to:m,insert:e.insert}),S=p.to-r.to;return{changes:y,range:a?b.range(Math.max(0,a.anchor+S),Math.max(0,a.head+S)):p.map(y)}})}else i={changes:l,selection:a&&s.selection.replaceRange(a)}}let o="input.type";return(n.composing||n.inputState.compositionPendingChange&&n.inputState.compositionEndedAt>Date.now()-50)&&(n.inputState.compositionPendingChange=!1,o+=".compose",n.inputState.compositionFirstChange&&(o+=".start",n.inputState.compositionFirstChange=!1)),s.update(i,{userEvent:o,scrollIntoView:!0})}function Bp(n,e,t,i){let s=Math.min(n.length,e.length),r=0;for(;r0&&l>0&&n.charCodeAt(o-1)==e.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));t-=o+a-r}if(o=o?r-t:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-t:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function Lp(n){let e=[];if(n.root.activeElement!=n.contentDOM)return e;let{anchorNode:t,anchorOffset:i,focusNode:s,focusOffset:r}=n.observer.selectionRange;return t&&(e.push(new ea(t,i)),(s!=t||r!=i)&&e.push(new ea(s,r))),e}function Wp(n,e){if(n.length==0)return null;let t=n[0].pos,i=n.length==2?n[1].pos:t;return t>-1&&i>-1?b.single(t+e,i+e):null}class zp{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,A.safari&&e.contentDOM.addEventListener("input",()=>null),A.gecko&&tm(e.contentDOM.ownerDocument)}handleEvent(e){!Hp(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,t){let i=this.handlers[e];if(i){for(let s of i.observers)s(this.view,t);for(let s of i.handlers){if(t.defaultPrevented)break;if(s(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=Ip(e),i=this.handlers,s=this.view.contentDOM;for(let r in t)if(r!="scroll"){let o=!t[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(s.removeEventListener(r,this.handleEvent),l=null),l||s.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!t[r]&&s.removeEventListener(r,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&Zc.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),A.android&&A.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let t;return A.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&((t=Gc.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||Vp.indexOf(e.key)>-1&&e.ctrlKey&&!e.shiftKey)?(this.pendingIOSKey=t||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let t=this.pendingIOSKey;return!t||t.key=="Enter"&&e&&e.from0?!0:A.safari&&!A.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function ta(n,e){return(t,i)=>{try{return e.call(n,i,t)}catch(s){Ae(t.state,s)}}}function Ip(n){let e=Object.create(null);function t(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of n){let s=i.spec,r=s&&s.plugin.domEventHandlers,o=s&&s.plugin.domEventObservers;if(r)for(let l in r){let a=r[l];a&&t(l).handlers.push(ta(i.value,a))}if(o)for(let l in o){let a=o[l];a&&t(l).observers.push(ta(i.value,a))}}for(let i in _e)t(i).handlers.push(_e[i]);for(let i in Ne)t(i).observers.push(Ne[i]);return e}const Gc=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Vp="dthko",Zc=[16,17,18,20,91,92,224,225],An=6;function Mn(n){return Math.max(0,n)*.7+8}function Np(n,e){return Math.max(Math.abs(n.clientX-e.clientX),Math.abs(n.clientY-e.clientY))}class Fp{constructor(e,t,i,s){this.view=e,this.startEvent=t,this.style=i,this.mustSelect=s,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParents=Zd(e.contentDOM),this.atoms=e.state.facet(_o).map(o=>o(e));let r=e.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(I.allowMultipleSelections)&&Xp(e,t),this.dragging=Up(e,t)&&Jc(t)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&Np(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let t=0,i=0,s=0,r=0,o=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:s,right:o}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let a=Uo(this.view);e.clientX-a.left<=s+An?t=-Mn(s-e.clientX):e.clientX+a.right>=o-An&&(t=Mn(e.clientX-o)),e.clientY-a.top<=r+An?i=-Mn(r-e.clientY):e.clientY+a.bottom>=l-An&&(i=Mn(e.clientY-l)),this.setScrollSpeed(t,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),t&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=t,t=0),(e||t)&&this.view.win.scrollBy(e,t),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(e){let t=null;for(let i=0;it.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}}function Xp(n,e){let t=n.state.facet(Dc);return t.length?t[0](e):A.mac?e.metaKey:e.ctrlKey}function _p(n,e){let t=n.state.facet(Ec);return t.length?t[0](e):A.mac?!e.altKey:!e.ctrlKey}function Up(n,e){let{main:t}=n.state.selection;if(t.empty)return!1;let i=Gi(n.root);if(!i||i.rangeCount==0)return!0;let s=i.getRangeAt(0).getClientRects();for(let r=0;r=e.clientX&&o.top<=e.clientY&&o.bottom>=e.clientY)return!0}return!1}function Hp(n,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target,i;t!=n.contentDOM;t=t.parentNode)if(!t||t.nodeType==11||(i=_.get(t))&&i.ignoreEvent(e))return!1;return!0}const _e=Object.create(null),Ne=Object.create(null),Yc=A.ie&&A.ie_version<15||A.ios&&A.webkit_version<604;function jp(n){let e=n.dom.parentNode;if(!e)return;let t=e.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.focus(),setTimeout(()=>{n.focus(),t.remove(),Kc(n,t.value)},50)}function Ws(n,e,t){for(let i of n.facet(e))t=i(t,n);return t}function Kc(n,e){e=Ws(n.state,No,e);let{state:t}=n,i,s=1,r=t.toText(e),o=r.lines==t.selection.ranges.length;if(ao!=null&&t.selection.ranges.every(a=>a.empty)&&ao==r.toString()){let a=-1;i=t.changeByRange(h=>{let c=t.doc.lineAt(h.from);if(c.from==a)return{range:h};a=c.from;let f=t.toText((o?r.line(s++).text:e)+t.lineBreak);return{changes:{from:c.from,insert:f},range:b.cursor(h.from+f.length)}})}else o?i=t.changeByRange(a=>{let h=r.line(s++);return{changes:{from:a.from,to:a.to,insert:h.text},range:b.cursor(a.from+h.length)}}):i=t.replaceSelection(r);n.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}Ne.scroll=n=>{n.inputState.lastScrollTop=n.scrollDOM.scrollTop,n.inputState.lastScrollLeft=n.scrollDOM.scrollLeft};_e.keydown=(n,e)=>(n.inputState.setSelectionOrigin("select"),e.keyCode==27&&n.inputState.tabFocusMode!=0&&(n.inputState.tabFocusMode=Date.now()+2e3),!1);Ne.touchstart=(n,e)=>{n.inputState.lastTouchTime=Date.now(),n.inputState.setSelectionOrigin("select.pointer")};Ne.touchmove=n=>{n.inputState.setSelectionOrigin("select.pointer")};_e.mousedown=(n,e)=>{if(n.observer.flush(),n.inputState.lastTouchTime>Date.now()-2e3)return!1;let t=null;for(let i of n.state.facet(qc))if(t=i(n,e),t)break;if(!t&&e.button==0&&(t=Yp(n,e)),t){let i=!n.hasFocus;n.inputState.startMouseSelection(new Fp(n,e,t,i)),i&&n.observer.ignore(()=>{dc(n.contentDOM);let r=n.root.activeElement;r&&!r.contains(n.contentDOM)&&r.blur()});let s=n.inputState.mouseSelection;if(s)return s.start(e),s.dragging===!1}return!1};function ia(n,e,t,i){if(i==1)return b.cursor(e,t);if(i==2)return vp(n.state,e,t);{let s=re.find(n.docView,e),r=n.state.doc.lineAt(s?s.posAtEnd:e),o=s?s.posAtStart:r.from,l=s?s.posAtEnd:r.to;return le>=t.top&&e<=t.bottom&&n>=t.left&&n<=t.right;function Gp(n,e,t,i){let s=re.find(n.docView,e);if(!s)return 1;let r=e-s.posAtStart;if(r==0)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&na(t,i,o))return-1;let l=s.coordsAt(r,1);return l&&na(t,i,l)?1:o&&o.bottom>=i?-1:1}function sa(n,e){let t=n.posAtCoords({x:e.clientX,y:e.clientY},!1);return{pos:t,bias:Gp(n,t,e.clientX,e.clientY)}}const Zp=A.ie&&A.ie_version<=11;let ra=null,oa=0,la=0;function Jc(n){if(!Zp)return n.detail;let e=ra,t=la;return ra=n,la=Date.now(),oa=!e||t>Date.now()-400&&Math.abs(e.clientX-n.clientX)<2&&Math.abs(e.clientY-n.clientY)<2?(oa+1)%3:1}function Yp(n,e){let t=sa(n,e),i=Jc(e),s=n.state.selection;return{update(r){r.docChanged&&(t.pos=r.changes.mapPos(t.pos),s=s.map(r.changes))},get(r,o,l){let a=sa(n,r),h,c=ia(n,a.pos,a.bias,i);if(t.pos!=a.pos&&!o){let f=ia(n,t.pos,t.bias,i),u=Math.min(f.from,c.from),d=Math.max(f.to,c.to);c=u1&&(h=Kp(s,a.pos))?h:l?s.addRange(c):b.create([c])}}}function Kp(n,e){for(let t=0;t=e)return b.create(n.ranges.slice(0,t).concat(n.ranges.slice(t+1)),n.mainIndex==t?0:n.mainIndex-(n.mainIndex>t?1:0))}return null}_e.dragstart=(n,e)=>{let{selection:{main:t}}=n.state;if(e.target.draggable){let s=n.docView.nearest(e.target);if(s&&s.isWidget){let r=s.posAtStart,o=r+s.length;(r>=t.to||o<=t.from)&&(t=b.range(r,o))}}let{inputState:i}=n;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=t,e.dataTransfer&&(e.dataTransfer.setData("Text",Ws(n.state,Fo,n.state.sliceDoc(t.from,t.to))),e.dataTransfer.effectAllowed="copyMove"),!1};_e.dragend=n=>(n.inputState.draggedContent=null,!1);function aa(n,e,t,i){if(t=Ws(n.state,No,t),!t)return;let s=n.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:r}=n.inputState,o=i&&r&&_p(n,e)?{from:r.from,to:r.to}:null,l={from:s,insert:t},a=n.state.changes(o?[o,l]:l);n.focus(),n.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),n.inputState.draggedContent=null}_e.drop=(n,e)=>{if(!e.dataTransfer)return!1;if(n.state.readOnly)return!0;let t=e.dataTransfer.files;if(t&&t.length){let i=Array(t.length),s=0,r=()=>{++s==t.length&&aa(n,e,i.filter(o=>o!=null).join(n.state.lineBreak),!1)};for(let o=0;o{/[\x00-\x08\x0e-\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(t[o])}return!0}else{let i=e.dataTransfer.getData("Text");if(i)return aa(n,e,i,!0),!0}return!1};_e.paste=(n,e)=>{if(n.state.readOnly)return!0;n.observer.flush();let t=Yc?null:e.clipboardData;return t?(Kc(n,t.getData("text/plain")||t.getData("text/uri-list")),!0):(jp(n),!1)};function Jp(n,e){let t=n.dom.parentNode;if(!t)return;let i=t.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),n.focus()},50)}function em(n){let e=[],t=[],i=!1;for(let s of n.selection.ranges)s.empty||(e.push(n.sliceDoc(s.from,s.to)),t.push(s));if(!e.length){let s=-1;for(let{from:r}of n.selection.ranges){let o=n.doc.lineAt(r);o.number>s&&(e.push(o.text),t.push({from:o.from,to:Math.min(n.doc.length,o.to+1)})),s=o.number}i=!0}return{text:Ws(n,Fo,e.join(n.lineBreak)),ranges:t,linewise:i}}let ao=null;_e.copy=_e.cut=(n,e)=>{let{text:t,ranges:i,linewise:s}=em(n.state);if(!t&&!s)return!1;ao=s?t:null,e.type=="cut"&&!n.state.readOnly&&n.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=Yc?null:e.clipboardData;return r?(r.clearData(),r.setData("text/plain",t),!0):(Jp(n,t),!1)};const ef=bt.define();function tf(n,e){let t=[];for(let i of n.facet(Lc)){let s=i(n,e);s&&t.push(s)}return t.length?n.update({effects:t,annotations:ef.of(!0)}):null}function nf(n){setTimeout(()=>{let e=n.hasFocus;if(e!=n.inputState.notifiedFocused){let t=tf(n.state,e);t?n.dispatch(t):n.update([])}},10)}Ne.focus=n=>{n.inputState.lastFocusTime=Date.now(),!n.scrollDOM.scrollTop&&(n.inputState.lastScrollTop||n.inputState.lastScrollLeft)&&(n.scrollDOM.scrollTop=n.inputState.lastScrollTop,n.scrollDOM.scrollLeft=n.inputState.lastScrollLeft),nf(n)};Ne.blur=n=>{n.observer.clearSelectionRange(),nf(n)};Ne.compositionstart=Ne.compositionupdate=n=>{n.observer.editContext||(n.inputState.compositionFirstChange==null&&(n.inputState.compositionFirstChange=!0),n.inputState.composing<0&&(n.inputState.composing=0))};Ne.compositionend=n=>{n.observer.editContext||(n.inputState.composing=-1,n.inputState.compositionEndedAt=Date.now(),n.inputState.compositionPendingKey=!0,n.inputState.compositionPendingChange=n.observer.pendingRecords().length>0,n.inputState.compositionFirstChange=null,A.chrome&&A.android?n.observer.flushSoon():n.inputState.compositionPendingChange?Promise.resolve().then(()=>n.observer.flush()):setTimeout(()=>{n.inputState.composing<0&&n.docView.hasComposition&&n.update([])},50))};Ne.contextmenu=n=>{n.inputState.lastContextMenu=Date.now()};_e.beforeinput=(n,e)=>{var t,i;if(e.inputType=="insertReplacementText"&&n.observer.editContext){let r=(t=e.dataTransfer)===null||t===void 0?void 0:t.getData("text/plain"),o=e.getTargetRanges();if(r&&o.length){let l=o[0],a=n.posAtDOM(l.startContainer,l.startOffset),h=n.posAtDOM(l.endContainer,l.endOffset);return Ho(n,{from:a,to:h,insert:n.state.toText(r)},null),!0}}let s;if(A.chrome&&A.android&&(s=Gc.find(r=>r.inputType==e.inputType))&&(n.observer.delayAndroidKey(s.key,s.keyCode),s.key=="Backspace"||s.key=="Delete")){let r=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var o;(((o=window.visualViewport)===null||o===void 0?void 0:o.height)||0)>r+10&&n.hasFocus&&(n.contentDOM.blur(),n.focus())},100)}return A.ios&&e.inputType=="deleteContentForward"&&n.observer.flushSoon(),A.safari&&e.inputType=="insertText"&&n.inputState.composing>=0&&setTimeout(()=>Ne.compositionend(n,e),20),!1};const ha=new Set;function tm(n){ha.has(n)||(ha.add(n),n.addEventListener("copy",()=>{}),n.addEventListener("cut",()=>{}))}const ca=["pre-wrap","normal","pre-line","break-spaces"];let yi=!1;function fa(){yi=!1}class im{constructor(e){this.lineWrapping=e,this.doc=V.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,t){let i=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((t-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return ca.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let i=0;i-1,a=Math.round(t)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=t,this.charWidth=i,this.textHeight=s,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>es&&(yi=!0),this.height=e)}replace(e,t,i){return ve.of(i)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,i,s){let r=this,o=i.doc;for(let l=s.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:c,toB:f}=s[l],u=r.lineAt(a,G.ByPosNoHeight,i.setDoc(t),0,0),d=u.to>=h?u:r.lineAt(h,G.ByPosNoHeight,i,0,0);for(f+=d.to-h,h=d.to;l>0&&u.from<=s[l-1].toA;)a=s[l-1].fromA,c=s[l-1].fromB,l--,ar*2){let l=e[t-1];l.break?e.splice(--t,1,l.left,null,l.right):e.splice(--t,1,l.left,l.right),i+=1+l.break,s-=l.size}else if(r>s*2){let l=e[i];l.break?e.splice(i,1,l.left,null,l.right):e.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(s=r&&o(this.blockAt(0,i,s,r))}updateHeight(e,t=0,i=!1,s){return s&&s.from<=t&&s.more&&this.setHeight(s.heights[s.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}}class qe extends sf{constructor(e,t){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(e,t,i,s){return new Je(s,this.length,i,this.height,this.breaks)}replace(e,t,i){let s=i[0];return i.length==1&&(s instanceof qe||s instanceof pe&&s.flags&4)&&Math.abs(this.length-s.length)<10?(s instanceof pe?s=new qe(s.length,this.height):s.height=this.height,this.outdated||(s.outdated=!1),s):ve.of(i)}updateHeight(e,t=0,i=!1,s){return s&&s.from<=t&&s.more?this.setHeight(s.heights[s.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class pe extends ve{constructor(e){super(e,0)}heightMetrics(e,t){let i=e.doc.lineAt(t).number,s=e.doc.lineAt(t+this.length).number,r=s-i+1,o,l=0;if(e.lineWrapping){let a=Math.min(this.height,e.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:s,perLine:o,perChar:l}}blockAt(e,t,i,s){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(t,s);if(t.lineWrapping){let h=s+(e0){let r=i[i.length-1];r instanceof pe?i[i.length-1]=new pe(r.length+s):i.push(null,new pe(s-1))}if(e>0){let r=i[0];r instanceof pe?i[0]=new pe(e+r.length):i.unshift(new pe(e-1),null)}return ve.of(i)}decomposeLeft(e,t){t.push(new pe(e-1),null)}decomposeRight(e,t){t.push(null,new pe(this.length-e-1))}updateHeight(e,t=0,i=!1,s){let r=t+this.length;if(s&&s.from<=t+this.length&&s.more){let o=[],l=Math.max(t,s.from),a=-1;for(s.from>t&&o.push(new pe(s.from-t-1).updateHeight(e,t));l<=r&&s.more;){let c=e.doc.lineAt(l).length;o.length&&o.push(null);let f=s.heights[s.index++];a==-1?a=f:Math.abs(f-a)>=es&&(a=-2);let u=new qe(c,f);u.outdated=!1,o.push(u),l+=c+1}l<=r&&o.push(null,new pe(r-l).updateHeight(e,l));let h=ve.of(o);return(a<0||Math.abs(h.height-this.height)>=es||Math.abs(a-this.heightMetrics(e,t).perLine)>=es)&&(yi=!0),ps(this,h)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(t,t+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}}class sm extends ve{constructor(e,t,i){super(e.length+t+i.length,e.height+i.height,t|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,t,i,s){let r=i+this.left.height;return el))return h;let c=t==G.ByPosNoHeight?G.ByPosNoHeight:G.ByPos;return a?h.join(this.right.lineAt(l,c,i,o,l)):this.left.lineAt(l,c,i,s,r).join(h)}forEachLine(e,t,i,s,r,o){let l=s+this.left.height,a=r+this.left.length+this.break;if(this.break)e=a&&this.right.forEachLine(e,t,i,l,a,o);else{let h=this.lineAt(a,G.ByPos,i,s,r);e=e&&h.from<=t&&o(h),t>h.to&&this.right.forEachLine(h.to+1,t,i,l,a,o)}}replace(e,t,i){let s=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-s,t-s,i));let r=[];e>0&&this.decomposeLeft(e,r);let o=r.length;for(let l of i)r.push(l);if(e>0&&ua(r,o-1),t=i&&t.push(null)),e>i&&this.right.decomposeLeft(e-i,t)}decomposeRight(e,t){let i=this.left.length,s=i+this.break;if(e>=s)return this.right.decomposeRight(e-s,t);e2*t.size||t.size>2*e.size?ve.of(this.break?[e,null,t]:[e,t]):(this.left=ps(this.left,e),this.right=ps(this.right,t),this.setHeight(e.height+t.height),this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,i=!1,s){let{left:r,right:o}=this,l=t+r.length+this.break,a=null;return s&&s.from<=t+r.length&&s.more?a=r=r.updateHeight(e,t,i,s):r.updateHeight(e,t,i),s&&s.from<=l+o.length&&s.more?a=o=o.updateHeight(e,l,i,s):o.updateHeight(e,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function ua(n,e){let t,i;n[e]==null&&(t=n[e-1])instanceof pe&&(i=n[e+1])instanceof pe&&n.splice(e-1,3,new pe(t.length+1+i.length))}const rm=5;class jo{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let i=Math.min(t,this.lineEnd),s=this.nodes[this.nodes.length-1];s instanceof qe?s.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new qe(i-this.pos,-1)),this.writtenTo=i,t>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,i){if(e=rm)&&this.addLineDeco(s,r,o)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new qe(this.pos-e,-1)),this.writtenTo=this.pos}blankContent(e,t){let i=new pe(t-e);return this.oracle.doc.lineAt(e).to==t&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof qe)return e;let t=new qe(0,-1);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,i){let s=this.ensureLine();s.length+=i,s.collapsed+=i,s.widgetHeight=Math.max(s.widgetHeight,e),s.breaks+=t,this.writtenTo=this.pos=this.pos+i}finish(e){let t=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(t instanceof qe)&&!this.isCovered?this.nodes.push(new qe(0,-1)):(this.writtenToc.clientHeight||c.scrollWidth>c.clientWidth)&&f.overflow!="visible"){let u=c.getBoundingClientRect();r=Math.max(r,u.left),o=Math.min(o,u.right),l=Math.max(l,u.top),a=Math.min(h==n.parentNode?s.innerHeight:a,u.bottom)}h=f.position=="absolute"||f.position=="fixed"?c.offsetParent:c.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-t.left,right:Math.max(r,o)-t.left,top:l-(t.top+e),bottom:Math.max(l,a)-(t.top+e)}}function hm(n){let e=n.getBoundingClientRect(),t=n.ownerDocument.defaultView||window;return e.left0&&e.top0}function cm(n,e){let t=n.getBoundingClientRect();return{left:0,right:t.right-t.left,top:e,bottom:t.bottom-(t.top+e)}}class or{constructor(e,t,i,s){this.from=e,this.to=t,this.size=i,this.displaySize=s}static same(e,t){if(e.length!=t.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new im(t),this.stateDeco=e.facet(Yi).filter(i=>typeof i!="function"),this.heightMap=ve.empty().applyChanges(this.stateDeco,V.empty,this.heightOracle.setDoc(e.doc),[new Ve(0,0,0,e.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=D.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let i=0;i<=1;i++){let s=i?t.head:t.anchor;if(!e.some(({from:r,to:o})=>s>=r&&s<=o)){let{from:r,to:o}=this.lineBlockAt(s);e.push(new Rn(r,o))}}return this.viewports=e.sort((i,s)=>i.from-s.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?pa:new Go(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(Bi(e,this.scaler))})}update(e,t=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Yi).filter(c=>typeof c!="function");let s=e.changedRanges,r=Ve.extendWithRanges(s,om(i,this.stateDeco,e?e.changes:ae.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);fa(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),r),(this.heightMap.height!=o||yi)&&(e.flags|=2),l?(this.scrollAnchorPos=e.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=o);let a=r.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,t));let h=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,e.flags|=this.updateForViewport(),(h||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&e.selectionSet&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(zc)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let t=e.contentDOM,i=window.getComputedStyle(t),s=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?Z.RTL:Z.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=t.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,c=0;if(l.width&&l.height){let{scaleX:v,scaleY:x}=uc(t,l);(v>.005&&Math.abs(this.scaleX-v)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=v,this.scaleY=x,h|=16,o=a=!0)}let f=(parseInt(i.paddingTop)||0)*this.scaleY,u=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=f||this.paddingBottom!=u)&&(this.paddingTop=f,this.paddingBottom=u,h|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=e.scrollDOM.clientWidth,h|=16);let d=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=mc(e.scrollDOM);let p=(this.printing?cm:am)(t,this.paddingTop),m=p.top-this.pixelViewport.top,g=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let y=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(y!=this.inView&&(this.inView=y,y&&(a=!0)),!this.inView&&!this.scrollTarget&&!hm(e.dom))return 0;let S=l.width;if((this.contentDOMWidth!=S||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=e.scrollDOM.clientHeight,h|=16),a){let v=e.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(v)&&(o=!0),o||s.lineWrapping&&Math.abs(S-this.contentDOMWidth)>s.charWidth){let{lineHeight:x,charWidth:w,textHeight:T}=e.docView.measureTextSize();o=x>0&&s.refresh(r,x,w,T,Math.max(5,S/w),v),o&&(e.docView.minWidth=0,h|=16)}m>0&&g>0?c=Math.max(m,g):m<0&&g<0&&(c=Math.min(m,g)),fa();for(let x of this.viewports){let w=x.from==this.viewport.from?v:e.docView.measureVisibleLineHeights(x);this.heightMap=(o?ve.empty().applyChanges(this.stateDeco,V.empty,this.heightOracle,[new Ve(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new nm(x.from,w))}yi&&(h|=2)}let k=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return k&&(h&2&&(h|=this.updateScaler()),this.viewport=this.getViewport(c,this.scrollTarget),h|=this.updateForViewport()),(h&2||k)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,e)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),s=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new Rn(s.lineAt(o-i*1e3,G.ByHeight,r,0,0).from,s.lineAt(l+(1-i)*1e3,G.ByHeight,r,0,0).to);if(t){let{head:h}=t.range;if(ha.to){let c=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),f=s.lineAt(h,G.ByPos,r,0,0),u;t.y=="center"?u=(f.top+f.bottom)/2-c/2:t.y=="start"||t.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&s>o-2*1e3&&r>1,o=s<<1;if(this.defaultTextDirection!=Z.LTR&&!i)return[];let l=[],a=(c,f,u,d)=>{if(f-cc&&yy.from>=u.from&&y.to<=u.to&&Math.abs(y.from-c)y.fromS));if(!g){if(fk.from<=f&&k.to>=f)){let k=t.moveToLineBoundary(b.cursor(f),!1,!0).head;k>c&&(f=k)}let y=this.gapSize(u,c,f,d),S=i||y<2e6?y:2e6;g=new or(c,f,y,S)}l.push(g)},h=c=>{if(c.length2e6)for(let w of e)w.from>=c.from&&w.fromc.from&&a(c.from,d,c,f),pt.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let i=[];F.spans(t,this.viewport.from,this.viewport.to,{span(r,o){i.push({from:r,to:o})},point(){}},20);let s=0;if(i.length!=this.visibleRanges.length)s=12;else for(let r=0;r=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(t=>t.from<=e&&t.to>=e)||Bi(this.heightMap.lineAt(e,G.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(t=>t.top<=e&&t.bottom>=e)||Bi(this.heightMap.lineAt(this.scaler.fromDOM(e),G.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+8);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return Bi(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class Rn{constructor(e,t){this.from=e,this.to=t}}function um(n,e,t){let i=[],s=n,r=0;return F.spans(t,n,e,{span(){},point(o,l){o>s&&(i.push({from:s,to:o}),r+=o-s),s=l}},20),s=1)return e[e.length-1].to;let i=Math.floor(n*t);for(let s=0;;s++){let{from:r,to:o}=e[s],l=o-r;if(i<=l)return r+i;i-=l}}function En(n,e){let t=0;for(let{from:i,to:s}of n.ranges){if(e<=s){t+=e-i;break}t+=s-i}return t/n.total}function dm(n,e){for(let t of n)if(e(t))return t}const pa={toDOM(n){return n},fromDOM(n){return n},scale:1,eq(n){return n==this}};class Go{constructor(e,t,i){let s=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=t.lineAt(l,G.ByPos,e,0,0).top,c=t.lineAt(a,G.ByPos,e,0,0).bottom;return s+=c-h,{from:l,to:a,top:h,bottom:c,domTop:0,domBottom:0}}),this.scale=(7e6-s)/(t.height-s);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(e){for(let t=0,i=0,s=0;;t++){let r=tt.from==e.viewports[i].from&&t.to==e.viewports[i].to):!1}}function Bi(n,e){if(e.scale==1)return n;let t=e.toDOM(n.top),i=e.toDOM(n.bottom);return new Je(n.from,n.length,t,i-t,Array.isArray(n._content)?n._content.map(s=>Bi(s,e)):n._content)}const qn=M.define({combine:n=>n.join(" ")}),ho=M.define({combine:n=>n.indexOf(!0)>-1}),co=mi.newName(),rf=mi.newName(),of=mi.newName(),lf={"&light":"."+rf,"&dark":"."+of};function fo(n,e,t){return new mi(e,{finish(i){return/&/.test(i)?i.replace(/&\w*/,s=>{if(s=="&")return n;if(!t||!t[s])throw new RangeError(`Unsupported selector: ${s}`);return t[s]}):n+" "+i}})}const pm=fo("."+co,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},lf),mm={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},lr=A.ie&&A.ie_version<=11;class gm{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new Yd,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(t=>{for(let i of t)this.queue.push(i);(A.ie&&A.ie_version<=11||A.ios&&e.composing)&&t.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&A.android&&e.constructor.EDIT_CONTEXT!==!1&&!(A.chrome&&A.chrome_version<126)&&(this.editContext=new ym(e),e.state.facet(pt)&&(e.contentDOM.editContext=this.editContext.editContext)),lr&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var t;((t=this.view.docView)===null||t===void 0?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((t,i)=>t!=e[i]))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,s=this.selectionRange;if(i.state.facet(pt)?i.root.activeElement!=this.dom:!Yn(this.dom,s))return;let r=s.anchorNode&&i.docView.nearest(s.anchorNode);if(r&&r.ignoreEvent(e)){t||(this.selectionChanged=!1);return}(A.ie&&A.ie_version<=11||A.android&&A.chrome)&&!i.state.selection.main.empty&&s.focusNode&&Ni(s.focusNode,s.focusOffset,s.anchorNode,s.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=Gi(e.root);if(!t)return!1;let i=A.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&Om(this.view,t)||t;if(!i||this.selectionRange.eq(i))return!1;let s=Yn(this.dom,i);return s&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&hi(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(s)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,i=-1,s=!1;for(let r of e){let o=this.readMutation(r);o&&(o.typeOver&&(s=!0),t==-1?{from:t,to:i}=o:(t=Math.min(o.from,t),i=Math.max(o.to,i)))}return{from:t,to:i,typeOver:s}}readChange(){let{from:e,to:t,typeOver:i}=this.processRecords(),s=this.selectionChanged&&Yn(this.dom,this.selectionRange);if(e<0&&!s)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new qp(this.view,e,t,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.readChange();if(!t)return this.view.requestMeasure(),!1;let i=this.view.state,s=jc(this.view,t);return this.view.state==i&&(t.domChanged||t.newSel&&!t.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),s}readMutation(e){let t=this.view.docView.nearest(e.target);if(!t||t.ignoreMutation(e))return null;if(t.markDirty(e.type=="attributes"),e.type=="attributes"&&(t.flags|=4),e.type=="childList"){let i=ma(t,e.previousSibling||e.target.previousSibling,-1),s=ma(t,e.nextSibling||e.target.nextSibling,1);return{from:i?t.posAfter(i):t.posAtStart,to:s?t.posBefore(s):t.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(pt)!=e.state.facet(pt)&&(e.view.contentDOM.editContext=e.state.facet(pt)?this.editContext.editContext:null))}destroy(){var e,t,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(t=this.gapIntersection)===null||t===void 0||t.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let s of this.scrollTargets)s.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function ma(n,e,t){for(;e;){let i=_.get(e);if(i&&i.parent==n)return i;let s=e.parentNode;e=s!=n.dom?s:t>0?e.nextSibling:e.previousSibling}return null}function ga(n,e){let t=e.startContainer,i=e.startOffset,s=e.endContainer,r=e.endOffset,o=n.docView.domAtPos(n.state.selection.main.anchor);return Ni(o.node,o.offset,s,r)&&([t,i,s,r]=[s,r,t,i]),{anchorNode:t,anchorOffset:i,focusNode:s,focusOffset:r}}function Om(n,e){if(e.getComposedRanges){let s=e.getComposedRanges(n.root)[0];if(s)return ga(n,s)}let t=null;function i(s){s.preventDefault(),s.stopImmediatePropagation(),t=s.getTargetRanges()[0]}return n.contentDOM.addEventListener("beforeinput",i,!0),n.dom.ownerDocument.execCommand("indent"),n.contentDOM.removeEventListener("beforeinput",i,!0),t?ga(n,t):null}class ym{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let t=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let s=e.state.selection.main,{anchor:r,head:o}=s,l=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:l,drifted:!1});let h={from:l,to:a,insert:V.of(i.text.split(` +`))};if(h.from==this.from&&rthis.to&&(h.to=r),h.from==h.to&&!h.insert.length){let c=b.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));c.main.eq(s)||e.dispatch({selection:c,userEvent:"select"});return}if((A.mac||A.android)&&h.from==o-1&&/^\. ?$/.test(i.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:l,to:a,insert:V.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!e.state.readOnly){let c=this.to-this.from+(h.to-h.from+h.insert.length);Ho(e,h,b.single(this.toEditorPos(i.selectionStart,c),this.toEditorPos(i.selectionEnd,c)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state))},this.handlers.characterboundsupdate=i=>{let s=[],r=null;for(let o=this.toEditorPos(i.rangeStart),l=this.toEditorPos(i.rangeEnd);o{let s=[];for(let r of i.getTextFormats()){let o=r.underlineStyle,l=r.underlineThickness;if(o!="None"&&l!="None"){let a=this.toEditorPos(r.rangeStart),h=this.toEditorPos(r.rangeEnd);if(a{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)t.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let s=Gi(i.root);s&&s.rangeCount&&this.editContext.updateSelectionBounds(s.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let t=0,i=!1,s=this.pendingContextChange;return e.changes.iterChanges((r,o,l,a,h)=>{if(i)return;let c=h.length-(o-r);if(s&&o>=s.to)if(s.from==r&&s.to==o&&s.insert.eq(h)){s=this.pendingContextChange=null,t+=c,this.to+=c;return}else s=null,this.revertPending(e.state);if(r+=t,o+=t,o<=this.from)this.from+=c,this.to+=c;else if(rthis.to||this.to-this.from+h.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(r),this.toContextPos(o),h.toString()),this.to+=c}t+=c}),s&&!i&&this.revertPending(e.state),!i}update(e){let t=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(s=>!s.isUserEvent("input.type")&&s.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||t)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),this.to=Math.min(e.doc.length,t+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let t=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(t.from),this.toContextPos(t.from+t.insert.length),e.doc.sliceString(t.from,t.to))}setSelection(e){let{main:t}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,t.anchor))),s=this.toContextPos(t.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=s)&&this.editContext.updateSelection(i,s)}rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this.from<500||this.to1e4*3)}toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(e-t.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}}class Q{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:i}=e;this.dispatchTransactions=e.dispatchTransactions||i&&(s=>s.forEach(r=>i(r,this)))||(s=>this.update(s)),this.dispatch=this.dispatch.bind(this),this._root=e.root||Kd(e.parent)||document,this.viewState=new da(e.state||I.create(e)),e.scrollTo&&e.scrollTo.is(Qn)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(ri).map(s=>new nr(s));for(let s of this.plugins)s.update(this);this.observer=new gm(this),this.inputState=new zp(this),this.inputState.ensureHandlers(this.plugins),this.docView=new jl(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...e){let t=e.length==1&&e[0]instanceof oe?e:e.length==1&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,i=!1,s,r=this.state;for(let u of e){if(u.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");r=u.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;e.some(u=>u.annotation(ef))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=tf(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,c=null;if(h?(this.observer.clearDelayedAndroidKey(),c=this.observer.readChange(),(c&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(c=null)):this.observer.clear(),r.facet(I.phrases)!=this.state.facet(I.phrases))return this.setState(r);s=ds.create(this,r,e),s.flags|=l;let f=this.viewState.scrollTarget;try{this.updateState=2;for(let u of e){if(f&&(f=f.map(u.changes)),u.scrollIntoView){let{main:d}=u.state.selection;f=new ci(d.empty?d:b.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of u.effects)d.is(Qn)&&(f=d.value.clip(this.state))}this.viewState.update(s,f),this.bidiCache=ms.update(this.bidiCache,s.changes),s.empty||(this.updatePlugins(s),this.inputState.update(s)),t=this.docView.update(s),this.state.facet(qi)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(t,e.some(u=>u.isUserEvent("select.pointer")))}finally{this.updateState=0}if(s.startState.facet(qn)!=s.state.facet(qn)&&(this.viewState.mustMeasureContent=!0),(t||i||f||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!s.empty)for(let u of this.state.facet(ro))try{u(s)}catch(d){Ae(this.state,d,"update listener")}(a||c)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),c&&!jc(this,c)&&h.force&&hi(this.contentDOM,h.key,h.keyCode)})}setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=e;return}this.updateState=2;let t=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new da(e),this.plugins=e.facet(ri).map(i=>new nr(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new jl(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(ri),i=e.state.facet(ri);if(t!=i){let s=[];for(let r of i){let o=t.indexOf(r);if(o<0)s.push(new nr(r));else{let l=this.plugins[o];l.mustUpdate=e,s.push(l)}}for(let r of this.plugins)r.mustUpdate!=e&&r.destroy(this);this.plugins=s,this.pluginMap.clear()}else for(let s of this.plugins)s.mustUpdate=e;for(let s=0;s-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,i=this.scrollDOM,s=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(s-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(mc(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(s);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let c=h.map(d=>{try{return d.read(this)}catch(p){return Ae(this.state,p),Oa}}),f=ds.create(this,this.state,[]),u=!1;f.flags|=a,t?t.flags|=a:t=f,this.updateState=2,f.empty||(this.updatePlugins(f),this.inputState.update(f),this.updateAttrs(),u=this.docView.update(f),u&&this.docViewUpdate());for(let d=0;d1||p<-1){s=s+p,i.scrollTop=s/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let l of this.state.facet(ro))l(t)}get themeClasses(){return co+" "+(this.state.facet(ho)?of:rf)+" "+this.state.facet(qn)}updateAttrs(){let e=ya(this,Nc,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(pt)?"true":"false",class:"cm-content",style:`${A.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),ya(this,Xo,t);let i=this.observer.ignore(()=>{let s=eo(this.contentDOM,this.contentAttrs,t),r=eo(this.dom,this.editorAttrs,e);return s||r});return this.editorAttrs=e,this.contentAttrs=t,i}showAnnouncements(e){let t=!0;for(let i of e)for(let s of i.effects)if(s.is(Q.announce)){t&&(this.announceDOM.textContent=""),t=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=s.value}}mountStyles(){this.styleModules=this.state.facet(qi);let e=this.state.facet(Q.cspNonce);mi.mount(this.root,this.styleModules.concat(pm).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(e.key!=null){for(let t=0;ti.plugin==e)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,i){return rr(this,e,Jl(this,e,t,i))}moveByGroup(e,t){return rr(this,e,Jl(this,e,t,i=>Mp(this,e.head,i)))}visualLineSide(e,t){let i=this.bidiSpans(e),s=this.textDirectionAt(e.from),r=i[t?i.length-1:0];return b.cursor(r.side(t,s)+e.from,r.forward(!t,s)?1:-1)}moveToLineBoundary(e,t,i=!0){return Ap(this,e,t,i)}moveVertically(e,t,i){return rr(this,e,Rp(this,e,t,i))}domAtPos(e){return this.docView.domAtPos(e)}posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}posAtCoords(e,t=!0){return this.readMeasured(),Hc(this,e,t)}coordsAtPos(e,t=1){this.readMeasured();let i=this.docView.coordsAt(e,t);if(!i||i.left==i.right)return i;let s=this.state.doc.lineAt(e),r=this.bidiSpans(s),o=r[Pt.find(r,e-s.from,-1,t)];return Bs(i,o.dir==Z.LTR==t>0)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(Wc)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>bm)return Mc(e.length);let t=this.textDirectionAt(e.from),i;for(let r of this.bidiCache)if(r.from==e.from&&r.dir==t&&(r.fresh||Ac(r.isolates,i=Hl(this,e))))return r.order;i||(i=Hl(this,e));let s=dp(e.text,t,i);return this.bidiCache.push(new ms(e.from,e.to,t,i,!0,s)),s}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||A.safari&&((e=this.inputState)===null||e===void 0?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{dc(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeType==9?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){return Qn.of(new ci(typeof e=="number"?b.cursor(e):e,t.y,t.x,t.yMargin,t.xMargin))}scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,i=this.viewState.scrollAnchorAt(e);return Qn.of(new ci(b.cursor(i.from),"start","start",i.top-e,t,!0))}setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof e=="boolean"?this.inputState.tabFocusMode=e?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return le.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return le.define(()=>({}),{eventObservers:e})}static theme(e,t){let i=mi.newName(),s=[qn.of(i),qi.of(fo(`.${i}`,e))];return t&&t.dark&&s.push(ho.of(!0)),s}static baseTheme(e){return Et.lowest(qi.of(fo("."+co,e,lf)))}static findFromDOM(e){var t;let i=e.querySelector(".cm-content"),s=i&&_.get(i)||_.get(e);return((t=s?.rootView)===null||t===void 0?void 0:t.view)||null}}Q.styleModule=qi;Q.inputHandler=Bc;Q.clipboardInputFilter=No;Q.clipboardOutputFilter=Fo;Q.scrollHandler=Ic;Q.focusChangeEffect=Lc;Q.perLineTextDirection=Wc;Q.exceptionSink=$c;Q.updateListener=ro;Q.editable=pt;Q.mouseSelectionStyle=qc;Q.dragMovesSelection=Ec;Q.clickAddsSelectionRange=Dc;Q.decorations=Yi;Q.outerDecorations=Fc;Q.atomicRanges=_o;Q.bidiIsolatedRanges=Xc;Q.scrollMargins=_c;Q.darkTheme=ho;Q.cspNonce=M.define({combine:n=>n.length?n[0]:""});Q.contentAttributes=Xo;Q.editorAttributes=Nc;Q.lineWrapping=Q.contentAttributes.of({class:"cm-lineWrapping"});Q.announce=B.define();const bm=4096,Oa={};class ms{constructor(e,t,i,s,r,o){this.from=e,this.to=t,this.dir=i,this.isolates=s,this.fresh=r,this.order=o}static update(e,t){if(t.empty&&!e.some(r=>r.fresh))return e;let i=[],s=e.length?e[e.length-1].dir:Z.LTR;for(let r=Math.max(0,e.length-10);r=0;s--){let r=i[s],o=typeof r=="function"?r(n):r;o&&Jr(o,t)}return t}const xm=A.mac?"mac":A.windows?"win":A.linux?"linux":"key";function Sm(n,e){const t=n.split(/-(?!$)/);let i=t[t.length-1];i=="Space"&&(i=" ");let s,r,o,l;for(let a=0;ai.concat(s),[]))),t}function wm(n,e,t){return hf(af(n.state),e,n,t)}let vt=null;const vm=4e3;function Tm(n,e=xm){let t=Object.create(null),i=Object.create(null),s=(o,l)=>{let a=i[o];if(a==null)i[o]=l;else if(a!=l)throw new Error("Key binding "+o+" is used both as a regular binding and as a multi-stroke prefix")},r=(o,l,a,h,c)=>{var f,u;let d=t[o]||(t[o]=Object.create(null)),p=l.split(/ (?!$)/).map(y=>Sm(y,e));for(let y=1;y{let v=vt={view:k,prefix:S,scope:o};return setTimeout(()=>{vt==v&&(vt=null)},vm),!0}]})}let m=p.join(" ");s(m,!1);let g=d[m]||(d[m]={preventDefault:!1,stopPropagation:!1,run:((u=(f=d._any)===null||f===void 0?void 0:f.run)===null||u===void 0?void 0:u.slice())||[]});a&&g.run.push(a),h&&(g.preventDefault=!0),c&&(g.stopPropagation=!0)};for(let o of n){let l=o.scope?o.scope.split(" "):["editor"];if(o.any)for(let h of l){let c=t[h]||(t[h]=Object.create(null));c._any||(c._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:f}=o;for(let u in c)c[u].run.push(d=>f(d,uo))}let a=o[e]||o.key;if(a)for(let h of l)r(h,a,o.run,o.preventDefault,o.stopPropagation),o.shift&&r(h,"Shift-"+a,o.shift,o.preventDefault,o.stopPropagation)}return t}let uo=null;function hf(n,e,t,i){uo=e;let s=Hd(e),r=Ce(s,0),o=Ke(r)==s.length&&s!=" ",l="",a=!1,h=!1,c=!1;vt&&vt.view==t&&vt.scope==i&&(l=vt.prefix+" ",Zc.indexOf(e.keyCode)<0&&(h=!0,vt=null));let f=new Set,u=g=>{if(g){for(let y of g.run)if(!f.has(y)&&(f.add(y),y(t)))return g.stopPropagation&&(c=!0),!0;g.preventDefault&&(g.stopPropagation&&(c=!0),h=!0)}return!1},d=n[i],p,m;return d&&(u(d[l+$n(s,e,!o)])?a=!0:o&&(e.altKey||e.metaKey||e.ctrlKey)&&!(A.windows&&e.ctrlKey&&e.altKey)&&!(A.mac&&e.altKey&&!e.ctrlKey)&&(p=At[e.keyCode])&&p!=s?(u(d[l+$n(p,e,!0)])||e.shiftKey&&(m=ji[e.keyCode])!=s&&m!=p&&u(d[l+$n(m,e,!1)]))&&(a=!0):o&&e.shiftKey&&u(d[l+$n(s,e,!0)])&&(a=!0),!a&&u(d._any)&&(a=!0)),h&&(a=!0),a&&c&&e.stopPropagation(),uo=null,a}class pn{constructor(e,t,i,s,r){this.className=e,this.left=t,this.top=i,this.width=s,this.height=r}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,i){if(i.empty){let s=e.coordsAtPos(i.head,i.assoc||1);if(!s)return[];let r=cf(e);return[new pn(t,s.left-r.left,s.top-r.top,null,s.bottom-s.top)]}else return Cm(e,t,i)}}function cf(n){let e=n.scrollDOM.getBoundingClientRect();return{left:(n.textDirection==Z.LTR?e.left:e.right-n.scrollDOM.clientWidth*n.scaleX)-n.scrollDOM.scrollLeft*n.scaleX,top:e.top-n.scrollDOM.scrollTop*n.scaleY}}function xa(n,e,t,i){let s=n.coordsAtPos(e,t*2);if(!s)return i;let r=n.dom.getBoundingClientRect(),o=(s.top+s.bottom)/2,l=n.posAtCoords({x:r.left+1,y:o}),a=n.posAtCoords({x:r.right-1,y:o});return l==null||a==null?i:{from:Math.max(i.from,Math.min(l,a)),to:Math.min(i.to,Math.max(l,a))}}function Cm(n,e,t){if(t.to<=n.viewport.from||t.from>=n.viewport.to)return[];let i=Math.max(t.from,n.viewport.from),s=Math.min(t.to,n.viewport.to),r=n.textDirection==Z.LTR,o=n.contentDOM,l=o.getBoundingClientRect(),a=cf(n),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),f=l.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),u=l.right-(c?parseInt(c.paddingRight):0),d=lo(n,i,1),p=lo(n,s,-1),m=d.type==we.Text?d:null,g=p.type==we.Text?p:null;if(m&&(n.lineWrapping||d.widgetLineBreaks)&&(m=xa(n,i,1,m)),g&&(n.lineWrapping||p.widgetLineBreaks)&&(g=xa(n,s,-1,g)),m&&g&&m.from==g.from&&m.to==g.to)return S(k(t.from,t.to,m));{let x=m?k(t.from,null,m):v(d,!1),w=g?k(null,t.to,g):v(p,!0),T=[];return(m||d).to<(g||p).from-(m&&g?1:0)||d.widgetLineBreaks>1&&x.bottom+n.defaultLineHeight/2P&&W.from=ee)break;Se>N&&E(Math.max(ie,N),x==null&&ie<=P,Math.min(Se,ee),w==null&&Se>=q,te.dir)}if(N=K.to+1,N>=ee)break}return R.length==0&&E(P,x==null,q,w==null,n.textDirection),{top:$,bottom:L,horizontal:R}}function v(x,w){let T=l.top+(w?x.top:x.bottom);return{top:T,bottom:T,horizontal:[]}}}function Pm(n,e){return n.constructor==e.constructor&&n.eq(e)}class Qm{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(ts)!=e.state.facet(ts)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let t=0,i=e.facet(ts);for(;t!Pm(t,this.drawn[i]))){let t=this.dom.firstChild,i=0;for(let s of e)s.update&&t&&s.constructor&&this.drawn[i].constructor&&s.update(t,this.drawn[i])?(t=t.nextSibling,i++):this.dom.insertBefore(s.draw(),t);for(;t;){let s=t.nextSibling;t.remove(),t=s}this.drawn=e}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const ts=M.define();function ff(n){return[le.define(e=>new Qm(e,n)),ts.of(n)]}const Ki=M.define({combine(n){return ot(n,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(e,t)=>Math.min(e,t),drawRangeCursor:(e,t)=>e||t})}});function Am(n={}){return[Ki.of(n),Mm,Rm,Dm,zc.of(!0)]}function uf(n){return n.startState.facet(Ki)!=n.state.facet(Ki)}const Mm=ff({above:!0,markers(n){let{state:e}=n,t=e.facet(Ki),i=[];for(let s of e.selection.ranges){let r=s==e.selection.main;if(s.empty||t.drawRangeCursor){let o=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",l=s.empty?s:b.cursor(s.head,s.head>s.anchor?-1:1);for(let a of pn.forRange(n,o,l))i.push(a)}}return i},update(n,e){n.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let t=uf(n);return t&&Sa(n.state,e),n.docChanged||n.selectionSet||t},mount(n,e){Sa(e.state,n)},class:"cm-cursorLayer"});function Sa(n,e){e.style.animationDuration=n.facet(Ki).cursorBlinkRate+"ms"}const Rm=ff({above:!1,markers(n){return n.state.selection.ranges.map(e=>e.empty?[]:pn.forRange(n,"cm-selectionBackground",e)).reduce((e,t)=>e.concat(t))},update(n,e){return n.docChanged||n.selectionSet||n.viewportChanged||uf(n)},class:"cm-selectionLayer"}),Dm=Et.highest(Q.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),df=B.define({map(n,e){return n==null?null:e.mapPos(n)}}),Li=ue.define({create(){return null},update(n,e){return n!=null&&(n=e.changes.mapPos(n)),e.effects.reduce((t,i)=>i.is(df)?i.value:t,n)}}),Em=le.fromClass(class{constructor(n){this.view=n,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(n){var e;let t=n.state.field(Li);t==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(n.startState.field(Li)!=t||n.docChanged||n.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:n}=this,e=n.state.field(Li),t=e!=null&&n.coordsAtPos(e);if(!t)return null;let i=n.scrollDOM.getBoundingClientRect();return{left:t.left-i.left+n.scrollDOM.scrollLeft*n.scaleX,top:t.top-i.top+n.scrollDOM.scrollTop*n.scaleY,height:t.bottom-t.top}}drawCursor(n){if(this.cursor){let{scaleX:e,scaleY:t}=this.view;n?(this.cursor.style.left=n.left/e+"px",this.cursor.style.top=n.top/t+"px",this.cursor.style.height=n.height/t+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(n){this.view.state.field(Li)!=n&&this.view.dispatch({effects:df.of(n)})}},{eventObservers:{dragover(n){this.setDropPos(this.view.posAtCoords({x:n.clientX,y:n.clientY}))},dragleave(n){(n.target==this.view.contentDOM||!this.view.contentDOM.contains(n.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function qm(){return[Li,Em]}function ka(n,e,t,i,s){e.lastIndex=0;for(let r=n.iterRange(t,i),o=t,l;!r.next().done;o+=r.value.length)if(!r.lineBreak)for(;l=e.exec(r.value);)s(o+l.index,l)}function $m(n,e){let t=n.visibleRanges;if(t.length==1&&t[0].from==n.viewport.from&&t[0].to==n.viewport.to)return t;let i=[];for(let{from:s,to:r}of t)s=Math.max(n.state.doc.lineAt(s).from,s-e),r=Math.min(n.state.doc.lineAt(r).to,r+e),i.length&&i[i.length-1].to>=s?i[i.length-1].to=r:i.push({from:s,to:r});return i}class Bm{constructor(e){const{regexp:t,decoration:i,decorate:s,boundary:r,maxLength:o=1e3}=e;if(!t.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=t,s)this.addMatch=(l,a,h,c)=>s(c,h,h+l[0].length,l,a);else if(typeof i=="function")this.addMatch=(l,a,h,c)=>{let f=i(l,a,h);f&&c(h,h+l[0].length,f)};else if(i)this.addMatch=(l,a,h,c)=>c(h,h+l[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=r,this.maxLength=o}createDeco(e){let t=new gt,i=t.add.bind(t);for(let{from:s,to:r}of $m(e,this.maxLength))ka(e.state.doc,this.regexp,s,r,(o,l)=>this.addMatch(l,e,o,i));return t.finish()}updateDeco(e,t){let i=1e9,s=-1;return e.docChanged&&e.changes.iterChanges((r,o,l,a)=>{a>=e.view.viewport.from&&l<=e.view.viewport.to&&(i=Math.min(l,i),s=Math.max(a,s))}),e.viewportMoved||s-i>1e3?this.createDeco(e.view):s>-1?this.updateRange(e.view,t.map(e.changes),i,s):t}updateRange(e,t,i,s){for(let r of e.visibleRanges){let o=Math.max(r.from,i),l=Math.min(r.to,s);if(l>=o){let a=e.state.doc.lineAt(o),h=a.toa.from;o--)if(this.boundary.test(a.text[o-1-a.from])){c=o;break}for(;lu.push(y.range(m,g));if(a==h)for(this.regexp.lastIndex=c-a.from;(d=this.regexp.exec(a.text))&&d.indexthis.addMatch(g,e,m,p));t=t.update({filterFrom:c,filterTo:f,filter:(m,g)=>mf,add:u})}}return t}}const po=/x/.unicode!=null?"gu":"g",Lm=new RegExp(`[\0-\b +--Ÿ­؜​‎‏\u2028\u2029‭‮⁦⁧⁩\uFEFF-]`,po),Wm={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let ar=null;function zm(){var n;if(ar==null&&typeof document<"u"&&document.body){let e=document.body.style;ar=((n=e.tabSize)!==null&&n!==void 0?n:e.MozTabSize)!=null}return ar||!1}const is=M.define({combine(n){let e=ot(n,{render:null,specialChars:Lm,addSpecialChars:null});return(e.replaceTabs=!zm())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,po)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,po)),e}});function Im(n={}){return[is.of(n),Vm()]}let wa=null;function Vm(){return wa||(wa=le.fromClass(class{constructor(n){this.view=n,this.decorations=D.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(n.state.facet(is)),this.decorations=this.decorator.createDeco(n)}makeDecorator(n){return new Bm({regexp:n.specialChars,decoration:(e,t,i)=>{let{doc:s}=t.state,r=Ce(e[0],0);if(r==9){let o=s.lineAt(i),l=t.state.tabSize,a=vi(o.text,l,i-o.from);return D.replace({widget:new _m((l-a%l)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=D.replace({widget:new Xm(n,r)}))},boundary:n.replaceTabs?void 0:/[^]/})}update(n){let e=n.state.facet(is);n.startState.facet(is)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(n.view)):this.decorations=this.decorator.updateDeco(n,this.decorations)}},{decorations:n=>n.decorations}))}const Nm="•";function Fm(n){return n>=32?Nm:n==10?"␤":String.fromCharCode(9216+n)}class Xm extends xt{constructor(e,t){super(),this.options=e,this.code=t}eq(e){return e.code==this.code}toDOM(e){let t=Fm(this.code),i=e.state.phrase("Control character")+" "+(Wm[this.code]||"0x"+this.code.toString(16)),s=this.options.render&&this.options.render(this.code,i,t);if(s)return s;let r=document.createElement("span");return r.textContent=t,r.title=i,r.setAttribute("aria-label",i),r.className="cm-specialChar",r}ignoreEvent(){return!1}}class _m extends xt{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}}function Um(){return jm}const Hm=D.line({class:"cm-activeLine"}),jm=le.fromClass(class{constructor(n){this.decorations=this.getDeco(n)}update(n){(n.docChanged||n.selectionSet)&&(this.decorations=this.getDeco(n.view))}getDeco(n){let e=-1,t=[];for(let i of n.state.selection.ranges){let s=n.lineBlockAt(i.head);s.from>e&&(t.push(Hm.range(s.from)),e=s.from)}return D.set(t)}},{decorations:n=>n.decorations}),mo=2e3;function Gm(n,e,t){let i=Math.min(e.line,t.line),s=Math.max(e.line,t.line),r=[];if(e.off>mo||t.off>mo||e.col<0||t.col<0){let o=Math.min(e.off,t.off),l=Math.max(e.off,t.off);for(let a=i;a<=s;a++){let h=n.doc.line(a);h.length<=l&&r.push(b.range(h.from+o,h.to+l))}}else{let o=Math.min(e.col,t.col),l=Math.max(e.col,t.col);for(let a=i;a<=s;a++){let h=n.doc.line(a),c=Ur(h.text,o,n.tabSize,!0);if(c<0)r.push(b.cursor(h.to));else{let f=Ur(h.text,l,n.tabSize);r.push(b.range(h.from+c,h.from+f))}}}return r}function Zm(n,e){let t=n.coordsAtPos(n.viewport.from);return t?Math.round(Math.abs((t.left-e)/n.defaultCharacterWidth)):-1}function va(n,e){let t=n.posAtCoords({x:e.clientX,y:e.clientY},!1),i=n.state.doc.lineAt(t),s=t-i.from,r=s>mo?-1:s==i.length?Zm(n,e.clientX):vi(i.text,n.state.tabSize,t-i.from);return{line:i.number,col:r,off:s}}function Ym(n,e){let t=va(n,e),i=n.state.selection;return t?{update(s){if(s.docChanged){let r=s.changes.mapPos(s.startState.doc.line(t.line).from),o=s.state.doc.lineAt(r);t={line:o.number,col:t.col,off:Math.min(t.off,o.length)},i=i.map(s.changes)}},get(s,r,o){let l=va(n,s);if(!l)return i;let a=Gm(n.state,t,l);return a.length?o?b.create(a.concat(i.ranges)):b.create(a):i}}:null}function Km(n){let e=t=>t.altKey&&t.button==0;return Q.mouseSelectionStyle.of((t,i)=>e(i)?Ym(t,i):null)}const Jm={Alt:[18,n=>!!n.altKey],Control:[17,n=>!!n.ctrlKey],Shift:[16,n=>!!n.shiftKey],Meta:[91,n=>!!n.metaKey]},eg={style:"cursor: crosshair"};function tg(n={}){let[e,t]=Jm[n.key||"Alt"],i=le.fromClass(class{constructor(s){this.view=s,this.isDown=!1}set(s){this.isDown!=s&&(this.isDown=s,this.view.update([]))}},{eventObservers:{keydown(s){this.set(s.keyCode==e||t(s))},keyup(s){(s.keyCode==e||!t(s))&&this.set(!1)},mousemove(s){this.set(t(s))}}});return[i,Q.contentAttributes.of(s=>{var r;return!((r=s.plugin(i))===null||r===void 0)&&r.isDown?eg:null})]}const Mi="-10000px";class pf{constructor(e,t,i,s){this.facet=t,this.createTooltipView=i,this.removeTooltipView=s,this.input=e.state.facet(t),this.tooltips=this.input.filter(o=>o);let r=null;this.tooltipViews=this.tooltips.map(o=>r=i(o,r))}update(e,t){var i;let s=e.state.facet(this.facet),r=s.filter(a=>a);if(s===this.input){for(let a of this.tooltipViews)a.update&&a.update(e);return!1}let o=[],l=t?[]:null;for(let a=0;at[h]=a),t.length=l.length),this.input=s,this.tooltips=r,this.tooltipViews=o,!0}}function ig(n){let e=n.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}const hr=M.define({combine:n=>{var e,t,i;return{position:A.ios?"absolute":((e=n.find(s=>s.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((t=n.find(s=>s.parent))===null||t===void 0?void 0:t.parent)||null,tooltipSpace:((i=n.find(s=>s.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||ig}}}),Ta=new WeakMap,Zo=le.fromClass(class{constructor(n){this.view=n,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=n.state.facet(hr);this.position=e.position,this.parent=e.parent,this.classes=n.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new pf(n,Yo,(t,i)=>this.createTooltip(t,i),t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()}),this.above=this.manager.tooltips.map(t=>!!t.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),n.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let n of this.manager.tooltipViews)this.intersectionObserver.observe(n.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(n){n.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(n,this.above);e&&this.observeIntersection();let t=e||n.geometryChanged,i=n.state.facet(hr);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let s of this.manager.tooltipViews)s.dom.style.position=this.position;t=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let s of this.manager.tooltipViews)this.container.appendChild(s.dom);t=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);t&&this.maybeMeasure()}createTooltip(n,e){let t=n.create(this.view),i=e?e.dom:null;if(t.dom.classList.add("cm-tooltip"),n.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let s=document.createElement("div");s.className="cm-tooltip-arrow",t.dom.appendChild(s)}return t.dom.style.position=this.position,t.dom.style.top=Mi,t.dom.style.left="0px",this.container.insertBefore(t.dom,i),t.mount&&t.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(t.dom),t}destroy(){var n,e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(n=i.destroy)===null||n===void 0||n.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(t=this.intersectionObserver)===null||t===void 0||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let n=1,e=1,t=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:r}=this.manager.tooltipViews[0];if(A.gecko)t=r.offsetParent!=this.container.ownerDocument.body;else if(r.style.top==Mi&&r.style.left=="0px"){let o=r.getBoundingClientRect();t=Math.abs(o.top+1e4)>1||Math.abs(o.left)>1}}if(t||this.position=="absolute")if(this.parent){let r=this.parent.getBoundingClientRect();r.width&&r.height&&(n=r.width/this.parent.offsetWidth,e=r.height/this.parent.offsetHeight)}else({scaleX:n,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),s=Uo(this.view);return{visible:{left:i.left+s.left,top:i.top+s.top,right:i.right-s.right,bottom:i.bottom-s.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((r,o)=>{let l=this.manager.tooltipViews[o];return l.getCoords?l.getCoords(r.pos):this.view.coordsAtPos(r.pos)}),size:this.manager.tooltipViews.map(({dom:r})=>r.getBoundingClientRect()),space:this.view.state.facet(hr).tooltipSpace(this.view),scaleX:n,scaleY:e,makeAbsolute:t}}writeMeasure(n){var e;if(n.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let l of this.manager.tooltipViews)l.dom.style.position="absolute"}let{visible:t,space:i,scaleX:s,scaleY:r}=n,o=[];for(let l=0;l=Math.min(t.bottom,i.bottom)||f.rightMath.min(t.right,i.right)+.1)){c.style.top=Mi;continue}let d=a.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,p=d?7:0,m=u.right-u.left,g=(e=Ta.get(h))!==null&&e!==void 0?e:u.bottom-u.top,y=h.offset||sg,S=this.view.textDirection==Z.LTR,k=u.width>i.right-i.left?S?i.left:i.right-u.width:S?Math.max(i.left,Math.min(f.left-(d?14:0)+y.x,i.right-m)):Math.min(Math.max(i.left,f.left-m+(d?14:0)-y.x),i.right-m),v=this.above[l];!a.strictSide&&(v?f.top-g-p-y.yi.bottom)&&v==i.bottom-f.bottom>f.top-i.top&&(v=this.above[l]=!v);let x=(v?f.top-i.top:i.bottom-f.bottom)-p;if(xk&&$.topw&&(w=v?$.top-g-2-p:$.bottom+p+2);if(this.position=="absolute"?(c.style.top=(w-n.parent.top)/r+"px",Ca(c,(k-n.parent.left)/s)):(c.style.top=w/r+"px",Ca(c,k/s)),d){let $=f.left+(S?y.x:-y.x)-(k+14-7);d.style.left=$/s+"px"}h.overlap!==!0&&o.push({left:k,top:w,right:T,bottom:w+g}),c.classList.toggle("cm-tooltip-above",v),c.classList.toggle("cm-tooltip-below",!v),h.positioned&&h.positioned(n.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let n of this.manager.tooltipViews)n.dom.style.top=Mi}},{eventObservers:{scroll(){this.maybeMeasure()}}});function Ca(n,e){let t=parseInt(n.style.left,10);(isNaN(t)||Math.abs(e-t)>1)&&(n.style.left=e+"px")}const ng=Q.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),sg={x:0,y:0},Yo=M.define({enables:[Zo,ng]}),gs=M.define({combine:n=>n.reduce((e,t)=>e.concat(t),[])});class Is{static create(e){return new Is(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new pf(e,gs,(t,i)=>this.createHostedView(t,i),t=>t.dom.remove())}createHostedView(e,t){let i=e.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,t?t.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let t of this.manager.tooltipViews)t.mount&&t.mount(e);this.mounted=!0}positioned(e){for(let t of this.manager.tooltipViews)t.positioned&&t.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let t of this.manager.tooltipViews)(e=t.destroy)===null||e===void 0||e.call(t)}passProp(e){let t;for(let i of this.manager.tooltipViews){let s=i[e];if(s!==void 0){if(t===void 0)t=s;else if(t!==s)return}}return t}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const rg=Yo.compute([gs],n=>{let e=n.facet(gs);return e.length===0?null:{pos:Math.min(...e.map(t=>t.pos)),end:Math.max(...e.map(t=>{var i;return(i=t.end)!==null&&i!==void 0?i:t.pos})),create:Is.create,above:e[0].above,arrow:e.some(t=>t.arrow)}});class og{constructor(e,t,i,s,r){this.view=e,this.source=t,this.field=i,this.setHover=s,this.hoverTime=r,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;el.bottom||t.xl.right+e.defaultCharacterWidth)return;let a=e.bidiSpans(e.state.doc.lineAt(s)).find(c=>c.from<=s&&c.to>=s),h=a&&a.dir==Z.RTL?-1:1;r=t.x{this.pending==l&&(this.pending=null,a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])}))},a=>Ae(e.state,a,"hover tooltip"))}else o&&!(Array.isArray(o)&&!o.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(o)?o:[o])})}get tooltip(){let e=this.view.plugin(Zo),t=e?e.manager.tooltips.findIndex(i=>i.create==Is.create):-1;return t>-1?e.manager.tooltipViews[t]:null}mousemove(e){var t,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:s,tooltip:r}=this;if(s.length&&r&&!lg(r.dom,e)||this.pending){let{pos:o}=s[0]||this.pending,l=(i=(t=s[0])===null||t===void 0?void 0:t.end)!==null&&i!==void 0?i:o;(o==l?this.view.posAtCoords(this.lastMove)!=o:!ag(this.view,o,l,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:t}=this;if(t.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let t=i=>{e.removeEventListener("mouseleave",t),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",t)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}const Bn=4;function lg(n,e){let{left:t,right:i,top:s,bottom:r}=n.getBoundingClientRect(),o;if(o=n.querySelector(".cm-tooltip-arrow")){let l=o.getBoundingClientRect();s=Math.min(l.top,s),r=Math.max(l.bottom,r)}return e.clientX>=t-Bn&&e.clientX<=i+Bn&&e.clientY>=s-Bn&&e.clientY<=r+Bn}function ag(n,e,t,i,s,r){let o=n.scrollDOM.getBoundingClientRect(),l=n.documentTop+n.documentPadding.top+n.contentHeight;if(o.left>i||o.rights||Math.min(o.bottom,l)=e&&a<=t}function hg(n,e={}){let t=B.define(),i=ue.define({create(){return[]},update(s,r){if(s.length&&(e.hideOnChange&&(r.docChanged||r.selection)?s=[]:e.hideOn&&(s=s.filter(o=>!e.hideOn(r,o))),r.docChanged)){let o=[];for(let l of s){let a=r.changes.mapPos(l.pos,-1,ge.TrackDel);if(a!=null){let h=Object.assign(Object.create(null),l);h.pos=a,h.end!=null&&(h.end=r.changes.mapPos(h.end)),o.push(h)}}s=o}for(let o of r.effects)o.is(t)&&(s=o.value),o.is(cg)&&(s=[]);return s},provide:s=>gs.from(s)});return{active:i,extension:[i,le.define(s=>new og(s,n,i,t,e.hoverTime||300)),rg]}}function mf(n,e){let t=n.plugin(Zo);if(!t)return null;let i=t.manager.tooltips.indexOf(e);return i<0?null:t.manager.tooltipViews[i]}const cg=B.define(),Pa=M.define({combine(n){let e,t;for(let i of n)e=e||i.topContainer,t=t||i.bottomContainer;return{topContainer:e,bottomContainer:t}}});function Ji(n,e){let t=n.plugin(gf),i=t?t.specs.indexOf(e):-1;return i>-1?t.panels[i]:null}const gf=le.fromClass(class{constructor(n){this.input=n.state.facet(en),this.specs=this.input.filter(t=>t),this.panels=this.specs.map(t=>t(n));let e=n.state.facet(Pa);this.top=new Ln(n,!0,e.topContainer),this.bottom=new Ln(n,!1,e.bottomContainer),this.top.sync(this.panels.filter(t=>t.top)),this.bottom.sync(this.panels.filter(t=>!t.top));for(let t of this.panels)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}update(n){let e=n.state.facet(Pa);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new Ln(n.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new Ln(n.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let t=n.state.facet(en);if(t!=this.input){let i=t.filter(a=>a),s=[],r=[],o=[],l=[];for(let a of i){let h=this.specs.indexOf(a),c;h<0?(c=a(n.view),l.push(c)):(c=this.panels[h],c.update&&c.update(n)),s.push(c),(c.top?r:o).push(c)}this.specs=i,this.panels=s,this.top.sync(r),this.bottom.sync(o);for(let a of l)a.dom.classList.add("cm-panel"),a.mount&&a.mount()}else for(let i of this.panels)i.update&&i.update(n)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:n=>Q.scrollMargins.of(e=>{let t=e.plugin(n);return t&&{top:t.top.scrollMargin(),bottom:t.bottom.scrollMargin()}})});class Ln{constructor(e,t,i){this.view=e,this.top=t,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let t of this.panels)t.destroy&&e.indexOf(t)<0&&t.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let t=this.container||this.view.dom;t.insertBefore(this.dom,this.top?t.firstChild:null)}let e=this.dom.firstChild;for(let t of this.panels)if(t.dom.parentNode==this.dom){for(;e!=t.dom;)e=Qa(e);e=e.nextSibling}else this.dom.insertBefore(t.dom,e);for(;e;)e=Qa(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}}function Qa(n){let e=n.nextSibling;return n.remove(),e}const en=M.define({enables:gf});class yt extends Ht{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}}yt.prototype.elementClass="";yt.prototype.toDOM=void 0;yt.prototype.mapMode=ge.TrackBefore;yt.prototype.startSide=yt.prototype.endSide=-1;yt.prototype.point=!0;const ns=M.define(),fg=M.define(),ug={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>F.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},Xi=M.define();function dg(n){return[Of(),Xi.of({...ug,...n})]}const Aa=M.define({combine:n=>n.some(e=>e)});function Of(n){return[pg]}const pg=le.fromClass(class{constructor(n){this.view=n,this.domAfter=null,this.prevViewport=n.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=n.state.facet(Xi).map(e=>new Ra(n,e)),this.fixed=!n.state.facet(Aa);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),n.scrollDOM.insertBefore(this.dom,n.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(n){if(this.updateGutters(n)){let e=this.prevViewport,t=n.view.viewport,i=Math.min(e.to,t.to)-Math.max(e.from,t.from);this.syncGutters(i<(t.to-t.from)*.8)}if(n.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(Aa)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=n.view.viewport}syncGutters(n){let e=this.dom.nextSibling;n&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let t=F.iter(this.view.state.facet(ns),this.view.viewport.from),i=[],s=this.gutters.map(r=>new mg(r,this.view.viewport,-this.view.documentPadding.top));for(let r of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(r.type)){let o=!0;for(let l of r.type)if(l.type==we.Text&&o){go(t,i,l.from);for(let a of s)a.line(this.view,l,i);o=!1}else if(l.widget)for(let a of s)a.widget(this.view,l)}else if(r.type==we.Text){go(t,i,r.from);for(let o of s)o.line(this.view,r,i)}else if(r.widget)for(let o of s)o.widget(this.view,r);for(let r of s)r.finish();n&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(n){let e=n.startState.facet(Xi),t=n.state.facet(Xi),i=n.docChanged||n.heightChanged||n.viewportChanged||!F.eq(n.startState.facet(ns),n.state.facet(ns),n.view.viewport.from,n.view.viewport.to);if(e==t)for(let s of this.gutters)s.update(n)&&(i=!0);else{i=!0;let s=[];for(let r of t){let o=e.indexOf(r);o<0?s.push(new Ra(this.view,r)):(this.gutters[o].update(n),s.push(this.gutters[o]))}for(let r of this.gutters)r.dom.remove(),s.indexOf(r)<0&&r.destroy();for(let r of s)r.config.side=="after"?this.getDOMAfter().appendChild(r.dom):this.dom.appendChild(r.dom);this.gutters=s}return i}destroy(){for(let n of this.gutters)n.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:n=>Q.scrollMargins.of(e=>{let t=e.plugin(n);if(!t||t.gutters.length==0||!t.fixed)return null;let i=t.dom.offsetWidth*e.scaleX,s=t.domAfter?t.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==Z.LTR?{left:i,right:s}:{right:i,left:s}})});function Ma(n){return Array.isArray(n)?n:[n]}function go(n,e,t){for(;n.value&&n.from<=t;)n.from==t&&e.push(n.value),n.next()}class mg{constructor(e,t,i){this.gutter=e,this.height=i,this.i=0,this.cursor=F.iter(e.markers,t.from)}addElement(e,t,i){let{gutter:s}=this,r=(t.top-this.height)/e.scaleY,o=t.height/e.scaleY;if(this.i==s.elements.length){let l=new yf(e,o,r,i);s.elements.push(l),s.dom.appendChild(l.dom)}else s.elements[this.i].update(e,o,r,i);this.height=t.bottom,this.i++}line(e,t,i){let s=[];go(this.cursor,s,t.from),i.length&&(s=s.concat(i));let r=this.gutter.config.lineMarker(e,t,s);r&&s.unshift(r);let o=this.gutter;s.length==0&&!o.config.renderEmptyElements||this.addElement(e,t,s)}widget(e,t){let i=this.gutter.config.widgetMarker(e,t.widget,t),s=i?[i]:null;for(let r of e.state.facet(fg)){let o=r(e,t.widget,t);o&&(s||(s=[])).push(o)}s&&this.addElement(e,t,s)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}}class Ra{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in t.domEventHandlers)this.dom.addEventListener(i,s=>{let r=s.target,o;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let a=r.getBoundingClientRect();o=(a.top+a.bottom)/2}else o=s.clientY;let l=e.lineBlockAtHeight(o-e.documentTop);t.domEventHandlers[i](e,l,s)&&s.preventDefault()});this.markers=Ma(t.markers(e)),t.initialSpacer&&(this.spacer=new yf(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=Ma(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let s=this.config.updateSpacer(this.spacer.markers[0],e);s!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[s])}let i=e.view.viewport;return!F.eq(this.markers,t,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}}class yf{constructor(e,t,i,s){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,i,s)}update(e,t,i,s){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),gg(this.markers,s)||this.setMarkers(e,s)}setMarkers(e,t){let i="cm-gutterElement",s=this.dom.firstChild;for(let r=0,o=0;;){let l=o,a=rr(l,a,h)||o(l,a,h):o}return i}})}});class cr extends yt{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}}function fr(n,e){return n.state.facet(oi).formatNumber(e,n.state)}const bg=Xi.compute([oi],n=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(Og)},lineMarker(e,t,i){return i.some(s=>s.toDOM)?null:new cr(fr(e,e.state.doc.lineAt(t.from).number))},widgetMarker:(e,t,i)=>{for(let s of e.state.facet(yg)){let r=s(e,t,i);if(r)return r}return null},lineMarkerChange:e=>e.startState.facet(oi)!=e.state.facet(oi),initialSpacer(e){return new cr(fr(e,Da(e.state.doc.lines)))},updateSpacer(e,t){let i=fr(t.view,Da(t.view.state.doc.lines));return i==e.number?e:new cr(i)},domEventHandlers:n.facet(oi).domEventHandlers,side:"before"}));function xg(n={}){return[oi.of(n),Of(),bg]}function Da(n){let e=9;for(;e{let e=[],t=-1;for(let i of n.selection.ranges){let s=n.doc.lineAt(i.head).from;s>t&&(t=s,e.push(Sg.range(s)))}return F.of(e)});function wg(){return kg}const bf=1024;let vg=0;class ur{constructor(e,t){this.from=e,this.to=t}}class z{constructor(e={}){this.id=vg++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Te.match(e)),t=>{let i=e(t);return i===void 0?null:[this,i]}}}z.closedBy=new z({deserialize:n=>n.split(" ")});z.openedBy=new z({deserialize:n=>n.split(" ")});z.group=new z({deserialize:n=>n.split(" ")});z.isolate=new z({deserialize:n=>{if(n&&n!="rtl"&&n!="ltr"&&n!="auto")throw new RangeError("Invalid value for isolate: "+n);return n||"auto"}});z.contextHash=new z({perNode:!0});z.lookAhead=new z({perNode:!0});z.mounted=new z({perNode:!0});class Os{constructor(e,t,i){this.tree=e,this.overlay=t,this.parser=i}static get(e){return e&&e.props&&e.props[z.mounted.id]}}const Tg=Object.create(null);class Te{constructor(e,t,i,s=0){this.name=e,this.props=t,this.id=i,this.flags=s}static define(e){let t=e.props&&e.props.length?Object.create(null):Tg,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),s=new Te(e.name||"",t,e.id,i);if(e.props){for(let r of e.props)if(Array.isArray(r)||(r=r(s)),r){if(r[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[r[0].id]=r[1]}}return s}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(z.group);return t?t.indexOf(e)>-1:!1}return this.id==e}static match(e){let t=Object.create(null);for(let i in e)for(let s of i.split(" "))t[s]=e[i];return i=>{for(let s=i.prop(z.group),r=-1;r<(s?s.length:0);r++){let o=t[r<0?i.name:s[r]];if(o)return o}}}}Te.none=new Te("",Object.create(null),0,8);class Vs{constructor(e){this.types=e;for(let t=0;t0;for(let a=this.cursor(o|he.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=s&&(!l&&a.type.isAnonymous||t(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:el(Te.none,this.children,this.positions,0,this.children.length,0,this.length,(t,i,s)=>new U(this.type,t,i,s,this.propValues),e.makeTree||((t,i,s)=>new U(Te.none,t,i,s)))}static build(e){return Ag(e)}}U.empty=new U(Te.none,[],[],0);class Ko{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new Ko(this.buffer,this.index)}}class Rt{constructor(e,t,i){this.buffer=e,this.length=t,this.set=i}get type(){return Te.none}toString(){let e=[];for(let t=0;t0));a=o[a+3]);return l}slice(e,t,i){let s=this.buffer,r=new Uint16Array(t-e),o=0;for(let l=e,a=0;l=e&&te;case 1:return t<=e&&i>e;case 2:return i>e;case 4:return!0}}function tn(n,e,t,i){for(var s;n.from==n.to||(t<1?n.from>=e:n.from>e)||(t>-1?n.to<=e:n.to0?l.length:-1;e!=h;e+=t){let c=l[e],f=a[e]+o.from;if(xf(s,i,f,f+c.length)){if(c instanceof Rt){if(r&he.ExcludeBuffers)continue;let u=c.findChild(0,c.buffer.length,t,i-f,s);if(u>-1)return new tt(new Cg(o,c,e,f),null,u)}else if(r&he.IncludeAnonymous||!c.type.isAnonymous||Jo(c)){let u;if(!(r&he.IgnoreMounts)&&(u=Os.get(c))&&!u.overlay)return new Re(u.tree,f,e,o);let d=new Re(c,f,e,o);return r&he.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(t<0?c.children.length-1:0,t,i,s)}}}if(r&he.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?e=o.index+t:e=t<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}enter(e,t,i=0){let s;if(!(i&he.IgnoreOverlays)&&(s=Os.get(this._tree))&&s.overlay){let r=e-this.from;for(let{from:o,to:l}of s.overlay)if((t>0?o<=r:o=r:l>r))return new Re(s.tree,s.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function qa(n,e,t,i){let s=n.cursor(),r=[];if(!s.firstChild())return r;if(t!=null){for(let o=!1;!o;)if(o=s.type.is(t),!s.nextSibling())return r}for(;;){if(i!=null&&s.type.is(i))return r;if(s.type.is(e)&&r.push(s.node),!s.nextSibling())return i==null?r:[]}}function Oo(n,e,t=e.length-1){for(let i=n;t>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[t]&&e[t]!=i.name)return!1;t--}}return!0}class Cg{constructor(e,t,i,s){this.parent=e,this.buffer=t,this.index=i,this.start=s}}class tt extends Sf{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,i){super(),this.context=e,this._parent=t,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,t,i){let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],e,t-this.context.start,i);return r<0?null:new tt(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}enter(e,t,i=0){if(i&he.ExcludeBuffers)return null;let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return r<0?null:new tt(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new tt(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new tt(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:i}=this.context,s=this.index+4,r=i.buffer[this.index+3];if(r>s){let o=i.buffer[this.index+1];e.push(i.slice(s,r,o)),t.push(0)}return new U(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function kf(n){if(!n.length)return null;let e=0,t=n[0];for(let r=1;rt.from||o.to=e){let l=new Re(o.tree,o.overlay[0].from+r.from,-1,r);(s||(s=[i])).push(tn(l,e,t,!1))}}return s?kf(s):i}class yo{get name(){return this.type.name}constructor(e,t=0){if(this.mode=t,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,e instanceof Re)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,t){this.index=e;let{start:i,buffer:s}=this.buffer;return this.type=t||s.set.types[s.buffer[e]],this.from=i+s.buffer[e+1],this.to=i+s.buffer[e+2],!0}yield(e){return e?e instanceof Re?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,t,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,t,i,this.mode));let{buffer:s}=this.buffer,r=s.findChild(this.index+4,s.buffer[this.index+3],e,t-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,t,i=this.mode){return this.buffer?i&he.ExcludeBuffers?!1:this.enterChild(1,e,t):this.yield(this._tree.enter(e,t,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&he.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&he.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:t}=this.buffer,i=this.stack.length-1;if(e<0){let s=i<0?0:this.stack[i]+4;if(this.index!=s)return this.yieldBuf(t.findChild(s,this.index,-1,0,4))}else{let s=t.buffer[this.index+3];if(s<(i<0?t.buffer.length:t.buffer[this.stack[i]+3]))return this.yieldBuf(s)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let t,i,{buffer:s}=this;if(s){if(e>0){if(this.index-1)for(let r=t+e,o=e<0?-1:i._tree.children.length;r!=o;r+=e){let l=i._tree.children[r];if(this.mode&he.IncludeAnonymous||l instanceof Rt||!l.type.isAnonymous||Jo(l))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let o=e;o;o=o._parent)if(o.index==s){if(s==this.index)return o;t=o,i=r+1;break e}s=this.stack[--r]}for(let s=i;s=0;r--){if(r<0)return Oo(this._tree,e,s);let o=i[t.buffer[this.stack[r]]];if(!o.isAnonymous){if(e[s]&&e[s]!=o.name)return!1;s--}}return!0}}function Jo(n){return n.children.some(e=>e instanceof Rt||!e.type.isAnonymous||Jo(e))}function Ag(n){var e;let{buffer:t,nodeSet:i,maxBufferLength:s=bf,reused:r=[],minRepeatType:o=i.types.length}=n,l=Array.isArray(t)?new Ko(t,t.length):t,a=i.types,h=0,c=0;function f(x,w,T,$,L,R){let{id:E,start:P,end:q,size:W}=l,N=c,ee=h;for(;W<0;)if(l.next(),W==-1){let H=r[E];T.push(H),$.push(P-x);return}else if(W==-3){h=E;return}else if(W==-4){c=E;return}else throw new RangeError(`Unrecognized record size: ${W}`);let K=a[E],te,ie,Se=P-x;if(q-P<=s&&(ie=g(l.pos-w,L))){let H=new Uint16Array(ie.size-ie.skip),ke=l.pos-ie.size,ne=H.length;for(;l.pos>ke;)ne=y(ie.start,H,ne);te=new Rt(H,q-ie.start,i),Se=ie.start-x}else{let H=l.pos-W;l.next();let ke=[],ne=[],se=E>=o?E:-1,ei=0,xn=q;for(;l.pos>H;)se>=0&&l.id==se&&l.size>=0?(l.end<=xn-s&&(p(ke,ne,P,ei,l.end,xn,se,N,ee),ei=ke.length,xn=l.end),l.next()):R>2500?u(P,H,ke,ne):f(P,H,ke,ne,se,R+1);if(se>=0&&ei>0&&ei-1&&ei>0){let Tl=d(K,ee);te=el(K,ke,ne,0,ke.length,0,q-P,Tl,Tl)}else te=m(K,ke,ne,q-P,N-q,ee)}T.push(te),$.push(Se)}function u(x,w,T,$){let L=[],R=0,E=-1;for(;l.pos>w;){let{id:P,start:q,end:W,size:N}=l;if(N>4)l.next();else{if(E>-1&&q=0;W-=3)P[N++]=L[W],P[N++]=L[W+1]-q,P[N++]=L[W+2]-q,P[N++]=N;T.push(new Rt(P,L[2]-q,i)),$.push(q-x)}}function d(x,w){return(T,$,L)=>{let R=0,E=T.length-1,P,q;if(E>=0&&(P=T[E])instanceof U){if(!E&&P.type==x&&P.length==L)return P;(q=P.prop(z.lookAhead))&&(R=$[E]+P.length+q)}return m(x,T,$,L,R,w)}}function p(x,w,T,$,L,R,E,P,q){let W=[],N=[];for(;x.length>$;)W.push(x.pop()),N.push(w.pop()+T-L);x.push(m(i.types[E],W,N,R-L,P-R,q)),w.push(L-T)}function m(x,w,T,$,L,R,E){if(R){let P=[z.contextHash,R];E=E?[P].concat(E):[P]}if(L>25){let P=[z.lookAhead,L];E=E?[P].concat(E):[P]}return new U(x,w,T,$,E)}function g(x,w){let T=l.fork(),$=0,L=0,R=0,E=T.end-s,P={size:0,start:0,skip:0};e:for(let q=T.pos-x;T.pos>q;){let W=T.size;if(T.id==w&&W>=0){P.size=$,P.start=L,P.skip=R,R+=4,$+=4,T.next();continue}let N=T.pos-W;if(W<0||N=o?4:0,K=T.start;for(T.next();T.pos>N;){if(T.size<0)if(T.size==-3)ee+=4;else break e;else T.id>=o&&(ee+=4);T.next()}L=K,$+=W,R+=ee}return(w<0||$==x)&&(P.size=$,P.start=L,P.skip=R),P.size>4?P:void 0}function y(x,w,T){let{id:$,start:L,end:R,size:E}=l;if(l.next(),E>=0&&$4){let q=l.pos-(E-4);for(;l.pos>q;)T=y(x,w,T)}w[--T]=P,w[--T]=R-x,w[--T]=L-x,w[--T]=$}else E==-3?h=$:E==-4&&(c=$);return T}let S=[],k=[];for(;l.pos>0;)f(n.start||0,n.bufferStart||0,S,k,-1,0);let v=(e=n.length)!==null&&e!==void 0?e:S.length?k[0]+S[0].length:0;return new U(a[n.topID],S.reverse(),k.reverse(),v)}const $a=new WeakMap;function ss(n,e){if(!n.isAnonymous||e instanceof Rt||e.type!=n)return 1;let t=$a.get(e);if(t==null){t=1;for(let i of e.children){if(i.type!=n||!(i instanceof U)){t=1;break}t+=ss(n,i)}$a.set(e,t)}return t}function el(n,e,t,i,s,r,o,l,a){let h=0;for(let p=i;p=c)break;w+=T}if(k==v+1){if(w>c){let T=p[v];d(T.children,T.positions,0,T.children.length,m[v]+S);continue}f.push(p[v])}else{let T=m[k-1]+p[k-1].length-x;f.push(el(n,p,m,v,k,x,T,null,a))}u.push(x+S-r)}}return d(e,t,i,s,0),(l||a)(f,u,o)}class Mg{constructor(){this.map=new WeakMap}setBuffer(e,t,i){let s=this.map.get(e);s||this.map.set(e,s=new Map),s.set(t,i)}getBuffer(e,t){let i=this.map.get(e);return i&&i.get(t)}set(e,t){e instanceof tt?this.setBuffer(e.context.buffer,e.index,t):e instanceof Re&&this.map.set(e.tree,t)}get(e){return e instanceof tt?this.getBuffer(e.context.buffer,e.index):e instanceof Re?this.map.get(e.tree):void 0}cursorSet(e,t){e.buffer?this.setBuffer(e.buffer.buffer,e.index,t):this.map.set(e.tree,t)}cursorGet(e){return e.buffer?this.getBuffer(e.buffer.buffer,e.index):this.map.get(e.tree)}}class _t{constructor(e,t,i,s,r=!1,o=!1){this.from=e,this.to=t,this.tree=i,this.offset=s,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,t=[],i=!1){let s=[new _t(0,e.length,e,0,!1,i)];for(let r of t)r.to>e.length&&s.push(r);return s}static applyChanges(e,t,i=128){if(!t.length)return e;let s=[],r=1,o=e.length?e[0]:null;for(let l=0,a=0,h=0;;l++){let c=l=i)for(;o&&o.from=u.from||f<=u.to||h){let d=Math.max(u.from,a)-h,p=Math.min(u.to,f)-h;u=d>=p?null:new _t(d,p,u.tree,u.offset+h,l>0,!!c)}if(u&&s.push(u),o.to>f)break;o=rnew ur(s.from,s.to)):[new ur(0,0)]:[new ur(0,e.length)],this.createParse(e,t||[],i)}parse(e,t,i){let s=this.startParse(e,t,i);for(;;){let r=s.advance();if(r)return r}}}class Rg{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}new z({perNode:!0});let Dg=0;class Le{constructor(e,t,i,s){this.name=e,this.set=t,this.base=i,this.modified=s,this.id=Dg++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let i=typeof e=="string"?e:"?";if(e instanceof Le&&(t=e),t?.base)throw new Error("Can not derive from a modified tag");let s=new Le(i,[],null,[]);if(s.set.push(s),t)for(let r of t.set)s.set.push(r);return s}static defineModifier(e){let t=new ys(e);return i=>i.modified.indexOf(t)>-1?i:ys.get(i.base||i,i.modified.concat(t).sort((s,r)=>s.id-r.id))}}let Eg=0;class ys{constructor(e){this.name=e,this.instances=[],this.id=Eg++}static get(e,t){if(!t.length)return e;let i=t[0].instances.find(l=>l.base==e&&qg(t,l.modified));if(i)return i;let s=[],r=new Le(e.name,s,e,t);for(let l of t)l.instances.push(r);let o=$g(t);for(let l of e.set)if(!l.modified.length)for(let a of o)s.push(ys.get(l,a));return r}}function qg(n,e){return n.length==e.length&&n.every((t,i)=>t==e[i])}function $g(n){let e=[[]];for(let t=0;ti.length-t.length)}function wf(n){let e=Object.create(null);for(let t in n){let i=n[t];Array.isArray(i)||(i=[i]);for(let s of t.split(" "))if(s){let r=[],o=2,l=s;for(let f=0;;){if(l=="..."&&f>0&&f+3==s.length){o=1;break}let u=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(l);if(!u)throw new RangeError("Invalid path: "+s);if(r.push(u[0]=="*"?"":u[0][0]=='"'?JSON.parse(u[0]):u[0]),f+=u[0].length,f==s.length)break;let d=s[f++];if(f==s.length&&d=="!"){o=0;break}if(d!="/")throw new RangeError("Invalid path: "+s);l=s.slice(f)}let a=r.length-1,h=r[a];if(!h)throw new RangeError("Invalid path: "+s);let c=new bs(i,o,a>0?r.slice(0,a):null);e[h]=c.sort(e[h])}}return vf.add(e)}const vf=new z;class bs{constructor(e,t,i,s){this.tags=e,this.mode=t,this.context=i,this.next=s}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let o=s;for(let l of r)for(let a of l.set){let h=t[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}function Bg(n,e){let t=null;for(let i of n){let s=i.style(e);s&&(t=t?t+" "+s:s)}return t}function Lg(n,e,t,i=0,s=n.length){let r=new Wg(i,Array.isArray(e)?e:[e],t);r.highlightRange(n.cursor(),i,s,"",r.highlighters),r.flush(s)}class Wg{constructor(e,t,i){this.at=e,this.highlighters=t,this.span=i,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,i,s,r){let{type:o,from:l,to:a}=e;if(l>=i||a<=t)return;o.isTop&&(r=this.highlighters.filter(d=>!d.scope||d.scope(o)));let h=s,c=zg(e)||bs.empty,f=Bg(r,c.tags);if(f&&(h&&(h+=" "),h+=f,c.mode==1&&(s+=(s?" ":"")+f)),this.startSpan(Math.max(t,l),h),c.opaque)return;let u=e.tree&&e.tree.prop(z.mounted);if(u&&u.overlay){let d=e.node.enter(u.overlay[0].from+l,1),p=this.highlighters.filter(g=>!g.scope||g.scope(u.tree.type)),m=e.firstChild();for(let g=0,y=l;;g++){let S=g=k||!e.nextSibling())););if(!S||k>i)break;y=S.to+l,y>t&&(this.highlightRange(d.cursor(),Math.max(t,S.from+l),Math.min(i,y),"",p),this.startSpan(Math.min(i,y),h))}m&&e.parent()}else if(e.firstChild()){u&&(s="");do if(!(e.to<=t)){if(e.from>=i)break;this.highlightRange(e,t,i,s,r),this.startSpan(Math.min(i,e.to),h)}while(e.nextSibling());e.parent()}}}function zg(n){let e=n.type.prop(vf);for(;e&&e.context&&!n.matchContext(e.context);)e=e.next;return e||null}const C=Le.define,zn=C(),kt=C(),Ba=C(kt),La=C(kt),wt=C(),In=C(wt),dr=C(wt),Ze=C(),Lt=C(Ze),je=C(),Ge=C(),bo=C(),Ri=C(bo),Vn=C(),O={comment:zn,lineComment:C(zn),blockComment:C(zn),docComment:C(zn),name:kt,variableName:C(kt),typeName:Ba,tagName:C(Ba),propertyName:La,attributeName:C(La),className:C(kt),labelName:C(kt),namespace:C(kt),macroName:C(kt),literal:wt,string:In,docString:C(In),character:C(In),attributeValue:C(In),number:dr,integer:C(dr),float:C(dr),bool:C(wt),regexp:C(wt),escape:C(wt),color:C(wt),url:C(wt),keyword:je,self:C(je),null:C(je),atom:C(je),unit:C(je),modifier:C(je),operatorKeyword:C(je),controlKeyword:C(je),definitionKeyword:C(je),moduleKeyword:C(je),operator:Ge,derefOperator:C(Ge),arithmeticOperator:C(Ge),logicOperator:C(Ge),bitwiseOperator:C(Ge),compareOperator:C(Ge),updateOperator:C(Ge),definitionOperator:C(Ge),typeOperator:C(Ge),controlOperator:C(Ge),punctuation:bo,separator:C(bo),bracket:Ri,angleBracket:C(Ri),squareBracket:C(Ri),paren:C(Ri),brace:C(Ri),content:Ze,heading:Lt,heading1:C(Lt),heading2:C(Lt),heading3:C(Lt),heading4:C(Lt),heading5:C(Lt),heading6:C(Lt),contentSeparator:C(Ze),list:C(Ze),quote:C(Ze),emphasis:C(Ze),strong:C(Ze),link:C(Ze),monospace:C(Ze),strikethrough:C(Ze),inserted:C(),deleted:C(),changed:C(),invalid:C(),meta:Vn,documentMeta:C(Vn),annotation:C(Vn),processingInstruction:C(Vn),definition:Le.defineModifier("definition"),constant:Le.defineModifier("constant"),function:Le.defineModifier("function"),standard:Le.defineModifier("standard"),local:Le.defineModifier("local"),special:Le.defineModifier("special")};for(let n in O){let e=O[n];e instanceof Le&&(e.name=n)}Tf([{tag:O.link,class:"tok-link"},{tag:O.heading,class:"tok-heading"},{tag:O.emphasis,class:"tok-emphasis"},{tag:O.strong,class:"tok-strong"},{tag:O.keyword,class:"tok-keyword"},{tag:O.atom,class:"tok-atom"},{tag:O.bool,class:"tok-bool"},{tag:O.url,class:"tok-url"},{tag:O.labelName,class:"tok-labelName"},{tag:O.inserted,class:"tok-inserted"},{tag:O.deleted,class:"tok-deleted"},{tag:O.literal,class:"tok-literal"},{tag:O.string,class:"tok-string"},{tag:O.number,class:"tok-number"},{tag:[O.regexp,O.escape,O.special(O.string)],class:"tok-string2"},{tag:O.variableName,class:"tok-variableName"},{tag:O.local(O.variableName),class:"tok-variableName tok-local"},{tag:O.definition(O.variableName),class:"tok-variableName tok-definition"},{tag:O.special(O.variableName),class:"tok-variableName2"},{tag:O.definition(O.propertyName),class:"tok-propertyName tok-definition"},{tag:O.typeName,class:"tok-typeName"},{tag:O.namespace,class:"tok-namespace"},{tag:O.className,class:"tok-className"},{tag:O.macroName,class:"tok-macroName"},{tag:O.propertyName,class:"tok-propertyName"},{tag:O.operator,class:"tok-operator"},{tag:O.comment,class:"tok-comment"},{tag:O.meta,class:"tok-meta"},{tag:O.invalid,class:"tok-invalid"},{tag:O.punctuation,class:"tok-punctuation"}]);const xo="ͼ",Wa=typeof Symbol>"u"?"__"+xo:Symbol.for(xo),So=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),za=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{};class Ia{constructor(e,t){this.rules=[];let{finish:i}=t||{};function s(o){return/^@/.test(o)?[o]:o.split(/,\s*/)}function r(o,l,a,h){let c=[],f=/^@(\w+)\b/.exec(o[0]),u=f&&f[1]=="keyframes";if(f&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\s*/).map(m=>o.map(g=>m.replace(/&/,g))).reduce((m,g)=>m.concat(g)),p,a);else if(p&&typeof p=="object"){if(!f)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(s(d),p,c,u)}else p!=null&&c.push(d.replace(/_.*/,"").replace(/[A-Z]/g,m=>"-"+m.toLowerCase())+": "+p+";")}(c.length||u)&&a.push((i&&!f&&!h?o.map(i):o).join(", ")+" {"+c.join(" ")+"}")}for(let o in e)r(s(o),e[o],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let e=za[Wa]||1;return za[Wa]=e+1,xo+e.toString(36)}static mount(e,t,i){let s=e[So],r=i&&i.nonce;s?r&&s.setNonce(r):s=new Ig(e,r),s.mount(Array.isArray(t)?t:[t],e)}}let Va=new Map;class Ig{constructor(e,t){let i=e.ownerDocument||e,s=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&s.CSSStyleSheet){let r=Va.get(i);if(r)return e[So]=r;this.sheet=new s.CSSStyleSheet,Va.set(i,this)}else this.styleTag=i.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[So]=this}mount(e,t){let i=this.sheet,s=0,r=0;for(let o=0;o-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;he.concat(n):void 0})}const Vg=new z;class We{constructor(e,t,i=[],s=""){this.data=e,this.name=s,I.prototype.hasOwnProperty("tree")||Object.defineProperty(I.prototype,"tree",{get(){return fe(this)}}),this.parser=t,this.extension=[Dt.of(this),I.languageData.of((r,o,l)=>{let a=Na(r,o,l),h=a.type.prop(Ft);if(!h)return[];let c=r.facet(h),f=a.type.prop(Vg);if(f){let u=a.resolve(o-a.from,l);for(let d of f)if(d.test(u,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(c)}}return c})].concat(i)}isActiveAt(e,t,i=-1){return Na(e,t,i).type.prop(Ft)==this.data}findRegions(e){let t=e.facet(Dt);if(t?.data==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let i=[],s=(r,o)=>{if(r.prop(Ft)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(z.mounted);if(l){if(l.tree.prop(Ft)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(s(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;ai.isTop?t:void 0)]}),e.name)}configure(e,t){return new xs(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function fe(n){let e=n.field(We.state,!1);return e?e.tree:U.empty}class Ng{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-i,t-i)}}let Di=null;class bi{constructor(e,t,i=[],s,r,o,l,a){this.parser=e,this.state=t,this.fragments=i,this.tree=s,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(e,t,i){return new bi(e,t,[],U.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Ng(this.state.doc),this.fragments)}work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree!=U.empty&&this.isDone(t??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e=="number"){let s=Date.now()+e;e=()=>Date.now()>s}for(this.parse||(this.parse=this.startParse()),t!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&t=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(_t.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=Di;Di=this;try{return e()}finally{Di=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=Fa(e,t.from,t.to);return e}changes(e,t){let{fragments:i,tree:s,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!e.empty){let a=[];if(e.iterChangedRanges((h,c,f,u)=>a.push({fromA:h,toA:c,fromB:f,toB:u})),i=_t.applyChanges(i,a),s=U.empty,r=0,o={from:e.mapPos(o.from,-1),to:e.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let c=e.mapPos(h.from,1),f=e.mapPos(h.to,-1);ce.from&&(this.fragments=Fa(this.fragments,s,r),this.skipped.splice(i--,1))}return this.skipped.length>=t?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends tl{createParse(t,i,s){let r=s[0].from,o=s[s.length-1].to;return{parsedPos:r,advance(){let a=Di;if(a){for(let h of s)a.tempSkipped.push(h);e&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,e]):e)}return this.parsedPos=o,new U(Te.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&t[0].from==0&&t[0].to>=e}static get(){return Di}}function Fa(n,e,t){return _t.applyChanges(n,[{fromA:e,toA:t,fromB:e,toB:t}])}class xi{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,i)||t.takeTree(),new xi(t)}static init(e){let t=Math.min(3e3,e.doc.length),i=bi.create(e.facet(Dt).parser,e,{from:0,to:t});return i.work(20,t)||i.takeTree(),new xi(i)}}We.state=ue.define({create:xi.init,update(n,e){for(let t of e.effects)if(t.is(We.setState))return t.value;return e.startState.facet(Dt)!=e.state.facet(Dt)?xi.init(e.state):n.apply(e)}});let Pf=n=>{let e=setTimeout(()=>n(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(Pf=n=>{let e=-1,t=setTimeout(()=>{e=requestIdleCallback(n,{timeout:400})},100);return()=>e<0?clearTimeout(t):cancelIdleCallback(e)});const mr=typeof navigator<"u"&&(!((pr=navigator.scheduling)===null||pr===void 0)&&pr.isInputPending)?()=>navigator.scheduling.isInputPending():null,Fg=le.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(We.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(We.state);(t.tree!=t.context.tree||!t.context.isDone(e.doc.length))&&(this.working=Pf(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEnds+1e3,a=r.context.work(()=>mr&&mr()||Date.now()>o,s+(l?0:1e5));this.chunkBudget-=Date.now()-t,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:We.setState.of(new xi(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(t=>Ae(this.view.state,t)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Dt=M.define({combine(n){return n.length?n[0]:null},enables:n=>[We.state,Fg,Q.contentAttributes.compute([n],e=>{let t=e.facet(n);return t&&t.name?{"data-language":t.name}:{}})]});class Xg{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}}const _g=M.define(),Ns=M.define({combine:n=>{if(!n.length)return" ";let e=n[0];if(!e||/\S/.test(e)||Array.from(e).some(t=>t!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(n[0]));return e}});function Yt(n){let e=n.facet(Ns);return e.charCodeAt(0)==9?n.tabSize*e.length:e.length}function nn(n,e){let t="",i=n.tabSize,s=n.facet(Ns)[0];if(s==" "){for(;e>=i;)t+=" ",e-=i;s=" "}for(let r=0;r=e?Ug(n,t,e):null}class Fs{constructor(e,t={}){this.state=e,this.options=t,this.unit=Yt(e)}lineAt(e,t=1){let i=this.state.doc.lineAt(e),{simulateBreak:s,simulateDoubleBreak:r}=this.options;return s!=null&&s>=i.from&&s<=i.to?r&&s==e?{text:"",from:e}:(t<0?s-1&&(r+=o-this.countColumn(i,i.search(/\S|$/))),r}countColumn(e,t=e.length){return vi(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:i,from:s}=this.lineAt(e,t),r=this.options.overrideIndentation;if(r){let o=r(s);if(o>-1)return o}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const nl=new z;function Ug(n,e,t){let i=e.resolveStack(t),s=e.resolveInner(t,-1).resolve(t,0).enterUnfinishedNodesBefore(t);if(s!=i.node){let r=[];for(let o=s;o&&!(o.fromi.node.to||o.from==i.node.from&&o.type==i.node.type);o=o.parent)r.push(o);for(let o=r.length-1;o>=0;o--)i={node:r[o],next:i}}return Qf(i,n,t)}function Qf(n,e,t){for(let i=n;i;i=i.next){let s=jg(i.node);if(s)return s(sl.create(e,t,i))}return 0}function Hg(n){return n.pos==n.options.simulateBreak&&n.options.simulateDoubleBreak}function jg(n){let e=n.type.prop(nl);if(e)return e;let t=n.firstChild,i;if(t&&(i=t.type.prop(z.closedBy))){let s=n.lastChild,r=s&&i.indexOf(s.name)>-1;return o=>Af(o,!0,1,void 0,r&&!Hg(o)?s.from:void 0)}return n.parent==null?Gg:null}function Gg(){return 0}class sl extends Fs{constructor(e,t,i){super(e.state,e.options),this.base=e,this.pos=t,this.context=i}get node(){return this.context.node}static create(e,t,i){return new sl(e,t,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(t.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(Zg(i,e))break;t=this.state.doc.lineAt(i.from)}return this.lineIndent(t.from)}continue(){return Qf(this.context.next,this.base,this.pos)}}function Zg(n,e){for(let t=e;t;t=t.parent)if(n==t)return!0;return!1}function Yg(n){let e=n.node,t=e.childAfter(e.from),i=e.lastChild;if(!t)return null;let s=n.options.simulateBreak,r=n.state.doc.lineAt(t.from),o=s==null||s<=r.from?r.to:Math.min(r.to,s);for(let l=t.to;;){let a=e.childAfter(l);if(!a||a==i)return null;if(!a.type.isSkipped){if(a.from>=o)return null;let h=/^ */.exec(r.text.slice(t.to-r.from))[0].length;return{from:t.from,to:t.to+h}}l=a.to}}function gr({closing:n,align:e=!0,units:t=1}){return i=>Af(i,e,t,n)}function Af(n,e,t,i,s){let r=n.textAfter,o=r.match(/^\s*/)[0].length,l=i&&r.slice(o,o+i.length)==i||s==n.pos+o,a=e?Yg(n):null;return a?l?n.column(a.from):n.column(a.to):n.baseIndent+(l?0:n.unit*t)}const Kg=200;function Jg(){return I.transactionFilter.of(n=>{if(!n.docChanged||!n.isUserEvent("input.type")&&!n.isUserEvent("input.complete"))return n;let e=n.startState.languageDataAt("indentOnInput",n.startState.selection.main.head);if(!e.length)return n;let t=n.newDoc,{head:i}=n.newSelection.main,s=t.lineAt(i);if(i>s.from+Kg)return n;let r=t.sliceString(s.from,i);if(!e.some(h=>h.test(r)))return n;let{state:o}=n,l=-1,a=[];for(let{head:h}of o.selection.ranges){let c=o.doc.lineAt(h);if(c.from==l)continue;l=c.from;let f=il(o,c.from);if(f==null)continue;let u=/^\s*/.exec(c.text)[0],d=nn(o,f);u!=d&&a.push({from:c.from,to:c.from+u.length,insert:d})}return a.length?[n,{changes:a,sequential:!0}]:n})}const eO=M.define(),Mf=new z;function tO(n){let e=n.firstChild,t=n.lastChild;return e&&e.tot)continue;if(r&&l.from=e&&h.to>t&&(r=h)}}return r}function nO(n){let e=n.lastChild;return e&&e.to==n.to&&e.type.isError}function Ss(n,e,t){for(let i of n.facet(eO)){let s=i(n,e,t);if(s)return s}return iO(n,e,t)}function Rf(n,e){let t=e.mapPos(n.from,1),i=e.mapPos(n.to,-1);return t>=i?void 0:{from:t,to:i}}const Xs=B.define({map:Rf}),mn=B.define({map:Rf});function Df(n){let e=[];for(let{head:t}of n.state.selection.ranges)e.some(i=>i.from<=t&&i.to>=t)||e.push(n.lineBlockAt(t));return e}const Kt=ue.define({create(){return D.none},update(n,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((t,i)=>n=Xa(n,t,i)),n=n.map(e.changes);for(let t of e.effects)if(t.is(Xs)&&!sO(n,t.value.from,t.value.to)){let{preparePlaceholder:i}=e.state.facet($f),s=i?D.replace({widget:new fO(i(e.state,t.value))}):_a;n=n.update({add:[s.range(t.value.from,t.value.to)]})}else t.is(mn)&&(n=n.update({filter:(i,s)=>t.value.from!=i||t.value.to!=s,filterFrom:t.value.from,filterTo:t.value.to}));return e.selection&&(n=Xa(n,e.selection.main.head)),n},provide:n=>Q.decorations.from(n),toJSON(n,e){let t=[];return n.between(0,e.doc.length,(i,s)=>{t.push(i,s)}),t},fromJSON(n){if(!Array.isArray(n)||n.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let t=0;t{se&&(i=!0)}),i?n.update({filterFrom:e,filterTo:t,filter:(s,r)=>s>=t||r<=e}):n}function ks(n,e,t){var i;let s=null;return(i=n.field(Kt,!1))===null||i===void 0||i.between(e,t,(r,o)=>{(!s||s.from>r)&&(s={from:r,to:o})}),s}function sO(n,e,t){let i=!1;return n.between(e,e,(s,r)=>{s==e&&r==t&&(i=!0)}),i}function Ef(n,e){return n.field(Kt,!1)?e:e.concat(B.appendConfig.of(Bf()))}const rO=n=>{for(let e of Df(n)){let t=Ss(n.state,e.from,e.to);if(t)return n.dispatch({effects:Ef(n.state,[Xs.of(t),qf(n,t)])}),!0}return!1},oO=n=>{if(!n.state.field(Kt,!1))return!1;let e=[];for(let t of Df(n)){let i=ks(n.state,t.from,t.to);i&&e.push(mn.of(i),qf(n,i,!1))}return e.length&&n.dispatch({effects:e}),e.length>0};function qf(n,e,t=!0){let i=n.state.doc.lineAt(e.from).number,s=n.state.doc.lineAt(e.to).number;return Q.announce.of(`${n.state.phrase(t?"Folded lines":"Unfolded lines")} ${i} ${n.state.phrase("to")} ${s}.`)}const lO=n=>{let{state:e}=n,t=[];for(let i=0;i{let e=n.state.field(Kt,!1);if(!e||!e.size)return!1;let t=[];return e.between(0,n.state.doc.length,(i,s)=>{t.push(mn.of({from:i,to:s}))}),n.dispatch({effects:t}),!0},hO=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:rO},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:oO},{key:"Ctrl-Alt-[",run:lO},{key:"Ctrl-Alt-]",run:aO}],cO={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},$f=M.define({combine(n){return ot(n,cO)}});function Bf(n){return[Kt,pO]}function Lf(n,e){let{state:t}=n,i=t.facet($f),s=o=>{let l=n.lineBlockAt(n.posAtDOM(o.target)),a=ks(n.state,l.from,l.to);a&&n.dispatch({effects:mn.of(a)}),o.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(n,s,e);let r=document.createElement("span");return r.textContent=i.placeholderText,r.setAttribute("aria-label",t.phrase("folded code")),r.title=t.phrase("unfold"),r.className="cm-foldPlaceholder",r.onclick=s,r}const _a=D.replace({widget:new class extends xt{toDOM(n){return Lf(n,null)}}});class fO extends xt{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return Lf(e,this.value)}}const uO={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class Or extends yt{constructor(e,t){super(),this.config=e,this.open=t}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let t=document.createElement("span");return t.textContent=this.open?this.config.openText:this.config.closedText,t.title=e.state.phrase(this.open?"Fold line":"Unfold line"),t}}function dO(n={}){let e={...uO,...n},t=new Or(e,!0),i=new Or(e,!1),s=le.fromClass(class{constructor(o){this.from=o.viewport.from,this.markers=this.buildMarkers(o)}update(o){(o.docChanged||o.viewportChanged||o.startState.facet(Dt)!=o.state.facet(Dt)||o.startState.field(Kt,!1)!=o.state.field(Kt,!1)||fe(o.startState)!=fe(o.state)||e.foldingChanged(o))&&(this.markers=this.buildMarkers(o.view))}buildMarkers(o){let l=new gt;for(let a of o.viewportLineBlocks){let h=ks(o.state,a.from,a.to)?i:Ss(o.state,a.from,a.to)?t:null;h&&l.add(a.from,a.from,h)}return l.finish()}}),{domEventHandlers:r}=e;return[s,dg({class:"cm-foldGutter",markers(o){var l;return((l=o.plugin(s))===null||l===void 0?void 0:l.markers)||F.empty},initialSpacer(){return new Or(e,!1)},domEventHandlers:{...r,click:(o,l,a)=>{if(r.click&&r.click(o,l,a))return!0;let h=ks(o.state,l.from,l.to);if(h)return o.dispatch({effects:mn.of(h)}),!0;let c=Ss(o.state,l.from,l.to);return c?(o.dispatch({effects:Xs.of(c)}),!0):!1}}}),Bf()]}const pO=Q.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class gn{constructor(e,t){this.specs=e;let i;function s(l){let a=Ia.newName();return(i||(i=Object.create(null)))["."+a]=l,a}const r=typeof t.all=="string"?t.all:t.all?s(t.all):void 0,o=t.scope;this.scope=o instanceof We?l=>l.prop(Ft)==o.data:o?l=>l==o:void 0,this.style=Tf(e.map(l=>({tag:l.tag,class:l.class||s(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new Ia(i):null,this.themeType=t.themeType}static define(e,t){return new gn(e,t||{})}}const ko=M.define(),Wf=M.define({combine(n){return n.length?[n[0]]:null}});function yr(n){let e=n.facet(ko);return e.length?e:n.facet(Wf)}function zf(n,e){let t=[gO],i;return n instanceof gn&&(n.module&&t.push(Q.styleModule.of(n.module)),i=n.themeType),e?.fallback?t.push(Wf.of(n)):i?t.push(ko.computeN([Q.darkTheme],s=>s.facet(Q.darkTheme)==(i=="dark")?[n]:[])):t.push(ko.of(n)),t}class mO{constructor(e){this.markCache=Object.create(null),this.tree=fe(e.state),this.decorations=this.buildDeco(e,yr(e.state)),this.decoratedTo=e.viewport.to}update(e){let t=fe(e.state),i=yr(e.state),s=i!=yr(e.startState),{viewport:r}=e.view,o=e.changes.mapPos(this.decoratedTo,1);t.length=r.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=o):(t!=this.tree||e.viewportChanged||s)&&(this.tree=t,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=r.to)}buildDeco(e,t){if(!t||!this.tree.length)return D.none;let i=new gt;for(let{from:s,to:r}of e.visibleRanges)Lg(this.tree,t,(o,l,a)=>{i.add(o,l,this.markCache[a]||(this.markCache[a]=D.mark({class:a})))},s,r);return i.finish()}}const gO=Et.high(le.fromClass(mO,{decorations:n=>n.decorations})),OO=gn.define([{tag:O.meta,color:"#404740"},{tag:O.link,textDecoration:"underline"},{tag:O.heading,textDecoration:"underline",fontWeight:"bold"},{tag:O.emphasis,fontStyle:"italic"},{tag:O.strong,fontWeight:"bold"},{tag:O.strikethrough,textDecoration:"line-through"},{tag:O.keyword,color:"#708"},{tag:[O.atom,O.bool,O.url,O.contentSeparator,O.labelName],color:"#219"},{tag:[O.literal,O.inserted],color:"#164"},{tag:[O.string,O.deleted],color:"#a11"},{tag:[O.regexp,O.escape,O.special(O.string)],color:"#e40"},{tag:O.definition(O.variableName),color:"#00f"},{tag:O.local(O.variableName),color:"#30a"},{tag:[O.typeName,O.namespace],color:"#085"},{tag:O.className,color:"#167"},{tag:[O.special(O.variableName),O.macroName],color:"#256"},{tag:O.definition(O.propertyName),color:"#00c"},{tag:O.comment,color:"#940"},{tag:O.invalid,color:"#f00"}]),yO=Q.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),If=1e4,Vf="()[]{}",Nf=M.define({combine(n){return ot(n,{afterCursor:!0,brackets:Vf,maxScanDistance:If,renderMatch:SO})}}),bO=D.mark({class:"cm-matchingBracket"}),xO=D.mark({class:"cm-nonmatchingBracket"});function SO(n){let e=[],t=n.matched?bO:xO;return e.push(t.range(n.start.from,n.start.to)),n.end&&e.push(t.range(n.end.from,n.end.to)),e}const kO=ue.define({create(){return D.none},update(n,e){if(!e.docChanged&&!e.selection)return n;let t=[],i=e.state.facet(Nf);for(let s of e.state.selection.ranges){if(!s.empty)continue;let r=it(e.state,s.head,-1,i)||s.head>0&&it(e.state,s.head-1,1,i)||i.afterCursor&&(it(e.state,s.head,1,i)||s.headQ.decorations.from(n)}),wO=[kO,yO];function vO(n={}){return[Nf.of(n),wO]}const TO=new z;function wo(n,e,t){let i=n.prop(e<0?z.openedBy:z.closedBy);if(i)return i;if(n.name.length==1){let s=t.indexOf(n.name);if(s>-1&&s%2==(e<0?1:0))return[t[s+e]]}return null}function vo(n){let e=n.type.prop(TO);return e?e(n.node):n}function it(n,e,t,i={}){let s=i.maxScanDistance||If,r=i.brackets||Vf,o=fe(n),l=o.resolveInner(e,t);for(let a=l;a;a=a.parent){let h=wo(a.type,t,r);if(h&&a.from0?e>=c.from&&ec.from&&e<=c.to))return CO(n,e,t,a,c,h,r)}}return PO(n,e,t,o,l.type,s,r)}function CO(n,e,t,i,s,r,o){let l=i.parent,a={from:s.from,to:s.to},h=0,c=l?.cursor();if(c&&(t<0?c.childBefore(i.from):c.childAfter(i.to)))do if(t<0?c.to<=i.from:c.from>=i.to){if(h==0&&r.indexOf(c.type.name)>-1&&c.from0)return null;let h={from:t<0?e-1:e,to:t>0?e+1:e},c=n.doc.iterRange(e,t>0?n.doc.length:0),f=0;for(let u=0;!c.next().done&&u<=r;){let d=c.value;t<0&&(u+=d.length);let p=e+u*t;for(let m=t>0?0:d.length-1,g=t>0?d.length:-1;m!=g;m+=t){let y=o.indexOf(d[m]);if(!(y<0||i.resolveInner(p+m,1).type!=s))if(y%2==0==t>0)f++;else{if(f==1)return{start:h,end:{from:p+m,to:p+m+1},matched:y>>1==a>>1};f--}}t>0&&(u+=d.length)}return c.done?{start:h,matched:!1}:null}function Ua(n,e,t,i=0,s=0){e==null&&(e=n.search(/[^\s\u00a0]/),e==-1&&(e=n.length));let r=s;for(let o=i;o=this.string.length}sol(){return this.pos==0}peek(){return this.string.charAt(this.pos)||void 0}next(){if(this.post}eatSpace(){let e=this.pos;for(;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e}skipToEnd(){this.pos=this.string.length}skipTo(e){let t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0}backUp(e){this.pos-=e}column(){return this.lastColumnPosi?o.toLowerCase():o,r=this.string.substr(this.pos,e.length);return s(r)==s(e)?(t!==!1&&(this.pos+=e.length),!0):null}else{let s=this.string.slice(this.pos).match(e);return s&&s.index>0?null:(s&&t!==!1&&(this.pos+=s[0].length),s)}}current(){return this.string.slice(this.start,this.pos)}}function QO(n){return{name:n.name||"",token:n.token,blankLine:n.blankLine||(()=>{}),startState:n.startState||(()=>!0),copyState:n.copyState||AO,indent:n.indent||(()=>null),languageData:n.languageData||{},tokenTable:n.tokenTable||ol,mergeTokens:n.mergeTokens!==!1}}function AO(n){if(typeof n!="object")return n;let e={};for(let t in n){let i=n[t];e[t]=i instanceof Array?i.slice():i}return e}const Ha=new WeakMap;class ws extends We{constructor(e){let t=Cf(e.languageData),i=QO(e),s,r=new class extends tl{createParse(o,l,a){return new RO(s,o,l,a)}};super(t,r,[],e.name),this.topNode=qO(t,this),s=this,this.streamParser=i,this.stateAfter=new z({perNode:!0}),this.tokenTable=e.tokenTable?new Hf(i.tokenTable):EO}static define(e){return new ws(e)}getIndent(e){let t,{overrideIndentation:i}=e.options;i&&(t=Ha.get(e.state),t!=null&&t1e4)return null;for(;r=i&&t+e.length<=s&&e.prop(n.stateAfter);if(r)return{state:n.streamParser.copyState(r),pos:t+e.length};for(let o=e.children.length-1;o>=0;o--){let l=e.children[o],a=t+e.positions[o],h=l instanceof U&&a=e.length)return e;!s&&t==0&&e.type==n.topNode&&(s=!0);for(let r=e.children.length-1;r>=0;r--){let o=e.positions[r],l=e.children[r],a;if(ot&&rl(n,r.tree,0-r.offset,t,l),h;if(a&&a.pos<=i&&(h=Xf(n,r.tree,t+r.offset,a.pos+r.offset,!1)))return{state:a.state,tree:h}}return{state:n.streamParser.startState(s?Yt(s):4),tree:U.empty}}let RO=class{constructor(e,t,i,s){this.lang=e,this.input=t,this.fragments=i,this.ranges=s,this.stoppedAt=null,this.chunks=[],this.chunkPos=[],this.chunk=[],this.chunkReused=void 0,this.rangeIndex=0,this.to=s[s.length-1].to;let r=bi.get(),o=s[0].from,{state:l,tree:a}=MO(e,i,o,this.to,r?.state);this.state=l,this.parsedPos=this.chunkStart=o+a.length;for(let h=0;hh.from<=r.viewport.from&&h.to>=r.viewport.from)&&(this.state=this.lang.streamParser.startState(Yt(r.state)),r.skipUntilInView(this.parsedPos,r.viewport.from),this.parsedPos=r.viewport.from),this.moveRangeIndex()}advance(){let e=bi.get(),t=this.stoppedAt==null?this.to:Math.min(this.to,this.stoppedAt),i=Math.min(t,this.chunkStart+512);for(e&&(i=Math.min(i,e.viewport.to));this.parsedPos=t?this.finish():e&&this.parsedPos>=e.viewport.to?(e.skipUntilInView(this.parsedPos,t),this.finish()):null}stopAt(e){this.stoppedAt=e}lineAfter(e){let t=this.input.chunk(e);if(this.input.lineChunks)t==` +`&&(t="");else{let i=t.indexOf(` +`);i>-1&&(t=t.slice(0,i))}return e+t.length<=this.to?t:t.slice(0,this.to-e)}nextLine(){let e=this.parsedPos,t=this.lineAfter(e),i=e+t.length;for(let s=this.rangeIndex;;){let r=this.ranges[s].to;if(r>=i||(t=t.slice(0,r-(i-t.length)),s++,s==this.ranges.length))break;let o=this.ranges[s].from,l=this.lineAfter(o);t+=l,i=o+l.length}return{line:t,end:i}}skipGapsTo(e,t,i){for(;;){let s=this.ranges[this.rangeIndex].to,r=e+t;if(i>0?s>r:s>=r)break;let o=this.ranges[++this.rangeIndex].from;t+=o-s}return t}moveRangeIndex(){for(;this.ranges[this.rangeIndex].to1){s=this.skipGapsTo(t,s,1),t+=s;let l=this.chunk.length;s=this.skipGapsTo(i,s,-1),i+=s,r+=this.chunk.length-l}let o=this.chunk.length-4;return this.lang.streamParser.mergeTokens&&r==4&&o>=0&&this.chunk[o]==e&&this.chunk[o+2]==t?this.chunk[o+2]=i:this.chunk.push(e,t,i,r),s}parseLine(e){let{line:t,end:i}=this.nextLine(),s=0,{streamParser:r}=this.lang,o=new Ff(t,e?e.state.tabSize:4,e?Yt(e.state):2);if(o.eol())r.blankLine(this.state,o.indentUnit);else for(;!o.eol();){let l=_f(r.token,o,this.state);if(l&&(s=this.emitToken(this.lang.tokenTable.resolve(l),this.parsedPos+o.start,this.parsedPos+o.pos,s)),o.start>1e4)break}this.parsedPos=i,this.moveRangeIndex(),this.parsedPose.start)return s}throw new Error("Stream parser failed to advance stream.")}const ol=Object.create(null),sn=[Te.none],DO=new Vs(sn),ja=[],Ga=Object.create(null),Uf=Object.create(null);for(let[n,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])Uf[n]=jf(ol,e);class Hf{constructor(e){this.extra=e,this.table=Object.assign(Object.create(null),Uf)}resolve(e){return e?this.table[e]||(this.table[e]=jf(this.extra,e)):0}}const EO=new Hf(ol);function br(n,e){ja.indexOf(n)>-1||(ja.push(n),console.warn(e))}function jf(n,e){let t=[];for(let l of e.split(" ")){let a=[];for(let h of l.split(".")){let c=n[h]||O[h];c?typeof c=="function"?a.length?a=a.map(c):br(h,`Modifier ${h} used at start of tag`):a.length?br(h,`Tag ${h} used as modifier`):a=Array.isArray(c)?c:[c]:br(h,`Unknown highlighting tag ${h}`)}for(let h of a)t.push(h)}if(!t.length)return 0;let i=e.replace(/ /g,"_"),s=i+" "+t.map(l=>l.id),r=Ga[s];if(r)return r.id;let o=Ga[s]=Te.define({id:sn.length,name:i,props:[wf({[i]:t})]});return sn.push(o),o.id}function qO(n,e){let t=Te.define({id:sn.length,name:"Document",props:[Ft.add(()=>n),nl.add(()=>i=>e.getIndent(i))],top:!0});return sn.push(t),t}Z.RTL,Z.LTR;const $O=n=>{let{state:e}=n,t=e.doc.lineAt(e.selection.main.from),i=al(n.state,t.from);return i.line?BO(n):i.block?WO(n):!1};function ll(n,e){return({state:t,dispatch:i})=>{if(t.readOnly)return!1;let s=n(e,t);return s?(i(t.update(s)),!0):!1}}const BO=ll(VO,0),LO=ll(Gf,0),WO=ll((n,e)=>Gf(n,e,IO(e)),0);function al(n,e){let t=n.languageDataAt("commentTokens",e,1);return t.length?t[0]:{}}const Ei=50;function zO(n,{open:e,close:t},i,s){let r=n.sliceDoc(i-Ei,i),o=n.sliceDoc(s,s+Ei),l=/\s*$/.exec(r)[0].length,a=/^\s*/.exec(o)[0].length,h=r.length-l;if(r.slice(h-e.length,h)==e&&o.slice(a,a+t.length)==t)return{open:{pos:i-l,margin:l&&1},close:{pos:s+a,margin:a&&1}};let c,f;s-i<=2*Ei?c=f=n.sliceDoc(i,s):(c=n.sliceDoc(i,i+Ei),f=n.sliceDoc(s-Ei,s));let u=/^\s*/.exec(c)[0].length,d=/\s*$/.exec(f)[0].length,p=f.length-d-t.length;return c.slice(u,u+e.length)==e&&f.slice(p,p+t.length)==t?{open:{pos:i+u+e.length,margin:/\s/.test(c.charAt(u+e.length))?1:0},close:{pos:s-d-t.length,margin:/\s/.test(f.charAt(p-1))?1:0}}:null}function IO(n){let e=[];for(let t of n.selection.ranges){let i=n.doc.lineAt(t.from),s=t.to<=i.to?i:n.doc.lineAt(t.to);s.from>i.from&&s.from==t.to&&(s=t.to==i.to+1?i:n.doc.lineAt(t.to-1));let r=e.length-1;r>=0&&e[r].to>i.from?e[r].to=s.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:s.to})}return e}function Gf(n,e,t=e.selection.ranges){let i=t.map(r=>al(e,r.from).block);if(!i.every(r=>r))return null;let s=t.map((r,o)=>zO(e,i[o],r.from,r.to));if(n!=2&&!s.every(r=>r))return{changes:e.changes(t.map((r,o)=>s[o]?[]:[{from:r.from,insert:i[o].open+" "},{from:r.to,insert:" "+i[o].close}]))};if(n!=1&&s.some(r=>r)){let r=[];for(let o=0,l;os&&(r==o||o>f.from)){s=f.from;let u=/^\s*/.exec(f.text)[0].length,d=u==f.length,p=f.text.slice(u,u+h.length)==h?u:-1;ur.comment<0&&(!r.empty||r.single))){let r=[];for(let{line:l,token:a,indent:h,empty:c,single:f}of i)(f||!c)&&r.push({from:l.from+h,insert:a+" "});let o=e.changes(r);return{changes:o,selection:e.selection.map(o,1)}}else if(n!=1&&i.some(r=>r.comment>=0)){let r=[];for(let{line:o,comment:l,token:a}of i)if(l>=0){let h=o.from+l,c=h+a.length;o.text[c-o.from]==" "&&c++,r.push({from:h,to:c})}return{changes:r}}return null}const To=bt.define(),NO=bt.define(),FO=M.define(),Zf=M.define({combine(n){return ot(n,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)=>t},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,t)=>(i,s)=>e(i,s)||t(i,s)})}}),Yf=ue.define({create(){return nt.empty},update(n,e){let t=e.state.facet(Zf),i=e.annotation(To);if(i){let a=Me.fromTransaction(e,i.selection),h=i.side,c=h==0?n.undone:n.done;return a?c=vs(c,c.length,t.minDepth,a):c=eu(c,e.startState.selection),new nt(h==0?i.rest:c,h==0?c:i.rest)}let s=e.annotation(NO);if((s=="full"||s=="before")&&(n=n.isolate()),e.annotation(oe.addToHistory)===!1)return e.changes.empty?n:n.addMapping(e.changes.desc);let r=Me.fromTransaction(e),o=e.annotation(oe.time),l=e.annotation(oe.userEvent);return r?n=n.addChanges(r,o,l,t,e):e.selection&&(n=n.addSelection(e.startState.selection,o,l,t.newGroupDelay)),(s=="full"||s=="after")&&(n=n.isolate()),n},toJSON(n){return{done:n.done.map(e=>e.toJSON()),undone:n.undone.map(e=>e.toJSON())}},fromJSON(n){return new nt(n.done.map(Me.fromJSON),n.undone.map(Me.fromJSON))}});function XO(n={}){return[Yf,Zf.of(n),Q.domEventHandlers({beforeinput(e,t){let i=e.inputType=="historyUndo"?Kf:e.inputType=="historyRedo"?Co:null;return i?(e.preventDefault(),i(t)):!1}})]}function _s(n,e){return function({state:t,dispatch:i}){if(!e&&t.readOnly)return!1;let s=t.field(Yf,!1);if(!s)return!1;let r=s.pop(n,t,e);return r?(i(r),!0):!1}}const Kf=_s(0,!1),Co=_s(1,!1),_O=_s(0,!0),UO=_s(1,!0);class Me{constructor(e,t,i,s,r){this.changes=e,this.effects=t,this.mapped=i,this.startSelection=s,this.selectionsAfter=r}setSelAfter(e){return new Me(this.changes,this.effects,this.mapped,this.startSelection,e)}toJSON(){var e,t,i;return{changes:(e=this.changes)===null||e===void 0?void 0:e.toJSON(),mapped:(t=this.mapped)===null||t===void 0?void 0:t.toJSON(),startSelection:(i=this.startSelection)===null||i===void 0?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map(s=>s.toJSON())}}static fromJSON(e){return new Me(e.changes&&ae.fromJSON(e.changes),[],e.mapped&&st.fromJSON(e.mapped),e.startSelection&&b.fromJSON(e.startSelection),e.selectionsAfter.map(b.fromJSON))}static fromTransaction(e,t){let i=ze;for(let s of e.startState.facet(FO)){let r=s(e);r.length&&(i=i.concat(r))}return!i.length&&e.changes.empty?null:new Me(e.changes.invert(e.startState.doc),i,void 0,t||e.startState.selection,ze)}static selection(e){return new Me(void 0,ze,void 0,void 0,e)}}function vs(n,e,t,i){let s=e+1>t+20?e-t-1:0,r=n.slice(s,e);return r.push(i),r}function HO(n,e){let t=[],i=!1;return n.iterChangedRanges((s,r)=>t.push(s,r)),e.iterChangedRanges((s,r,o,l)=>{for(let a=0;a=h&&o<=c&&(i=!0)}}),i}function jO(n,e){return n.ranges.length==e.ranges.length&&n.ranges.filter((t,i)=>t.empty!=e.ranges[i].empty).length===0}function Jf(n,e){return n.length?e.length?n.concat(e):n:e}const ze=[],GO=200;function eu(n,e){if(n.length){let t=n[n.length-1],i=t.selectionsAfter.slice(Math.max(0,t.selectionsAfter.length-GO));return i.length&&i[i.length-1].eq(e)?n:(i.push(e),vs(n,n.length-1,1e9,t.setSelAfter(i)))}else return[Me.selection([e])]}function ZO(n){let e=n[n.length-1],t=n.slice();return t[n.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),t}function xr(n,e){if(!n.length)return n;let t=n.length,i=ze;for(;t;){let s=YO(n[t-1],e,i);if(s.changes&&!s.changes.empty||s.effects.length){let r=n.slice(0,t);return r[t-1]=s,r}else e=s.mapped,t--,i=s.selectionsAfter}return i.length?[Me.selection(i)]:ze}function YO(n,e,t){let i=Jf(n.selectionsAfter.length?n.selectionsAfter.map(l=>l.map(e)):ze,t);if(!n.changes)return Me.selection(i);let s=n.changes.map(e),r=e.mapDesc(n.changes,!0),o=n.mapped?n.mapped.composeDesc(r):r;return new Me(s,B.mapEffects(n.effects,e),o,n.startSelection.map(r),i)}const KO=/^(input\.type|delete)($|\.)/;class nt{constructor(e,t,i=0,s=void 0){this.done=e,this.undone=t,this.prevTime=i,this.prevUserEvent=s}isolate(){return this.prevTime?new nt(this.done,this.undone):this}addChanges(e,t,i,s,r){let o=this.done,l=o[o.length-1];return l&&l.changes&&!l.changes.empty&&e.changes&&(!i||KO.test(i))&&(!l.selectionsAfter.length&&t-this.prevTime0&&t-this.prevTimet.empty?n.moveByChar(t,e):Us(t,e))}function xe(n){return n.textDirectionAt(n.state.selection.main.head)==Z.LTR}const iu=n=>tu(n,!xe(n)),nu=n=>tu(n,xe(n));function su(n,e){return Ue(n,t=>t.empty?n.moveByGroup(t,e):Us(t,e))}const e0=n=>su(n,!xe(n)),t0=n=>su(n,xe(n));function i0(n,e,t){if(e.type.prop(t))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(n.sliceDoc(e.from,e.to)))||e.firstChild}function Hs(n,e,t){let i=fe(n).resolveInner(e.head),s=t?z.closedBy:z.openedBy;for(let a=e.head;;){let h=t?i.childAfter(a):i.childBefore(a);if(!h)break;i0(n,h,s)?i=h:a=t?h.to:h.from}let r=i.type.prop(s),o,l;return r&&(o=t?it(n,i.from,1):it(n,i.to,-1))&&o.matched?l=t?o.end.to:o.end.from:l=t?i.to:i.from,b.cursor(l,t?-1:1)}const n0=n=>Ue(n,e=>Hs(n.state,e,!xe(n))),s0=n=>Ue(n,e=>Hs(n.state,e,xe(n)));function ru(n,e){return Ue(n,t=>{if(!t.empty)return Us(t,e);let i=n.moveVertically(t,e);return i.head!=t.head?i:n.moveToLineBoundary(t,e)})}const ou=n=>ru(n,!1),lu=n=>ru(n,!0);function au(n){let e=n.scrollDOM.clientHeighto.empty?n.moveVertically(o,e,t.height):Us(o,e));if(s.eq(i.selection))return!1;let r;if(t.selfScroll){let o=n.coordsAtPos(i.selection.main.head),l=n.scrollDOM.getBoundingClientRect(),a=l.top+t.marginTop,h=l.bottom-t.marginBottom;o&&o.top>a&&o.bottomhu(n,!1),Po=n=>hu(n,!0);function qt(n,e,t){let i=n.lineBlockAt(e.head),s=n.moveToLineBoundary(e,t);if(s.head==e.head&&s.head!=(t?i.to:i.from)&&(s=n.moveToLineBoundary(e,t,!1)),!t&&s.head==i.from&&i.length){let r=/^\s*/.exec(n.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;r&&e.head!=i.from+r&&(s=b.cursor(i.from+r))}return s}const r0=n=>Ue(n,e=>qt(n,e,!0)),o0=n=>Ue(n,e=>qt(n,e,!1)),l0=n=>Ue(n,e=>qt(n,e,!xe(n))),a0=n=>Ue(n,e=>qt(n,e,xe(n))),h0=n=>Ue(n,e=>b.cursor(n.lineBlockAt(e.head).from,1)),c0=n=>Ue(n,e=>b.cursor(n.lineBlockAt(e.head).to,-1));function f0(n,e,t){let i=!1,s=Ti(n.selection,r=>{let o=it(n,r.head,-1)||it(n,r.head,1)||r.head>0&&it(n,r.head-1,1)||r.headf0(n,e);function Fe(n,e){let t=Ti(n.state.selection,i=>{let s=e(i);return b.range(i.anchor,s.head,s.goalColumn,s.bidiLevel||void 0)});return t.eq(n.state.selection)?!1:(n.dispatch(lt(n.state,t)),!0)}function cu(n,e){return Fe(n,t=>n.moveByChar(t,e))}const fu=n=>cu(n,!xe(n)),uu=n=>cu(n,xe(n));function du(n,e){return Fe(n,t=>n.moveByGroup(t,e))}const d0=n=>du(n,!xe(n)),p0=n=>du(n,xe(n)),m0=n=>Fe(n,e=>Hs(n.state,e,!xe(n))),g0=n=>Fe(n,e=>Hs(n.state,e,xe(n)));function pu(n,e){return Fe(n,t=>n.moveVertically(t,e))}const mu=n=>pu(n,!1),gu=n=>pu(n,!0);function Ou(n,e){return Fe(n,t=>n.moveVertically(t,e,au(n).height))}const Ya=n=>Ou(n,!1),Ka=n=>Ou(n,!0),O0=n=>Fe(n,e=>qt(n,e,!0)),y0=n=>Fe(n,e=>qt(n,e,!1)),b0=n=>Fe(n,e=>qt(n,e,!xe(n))),x0=n=>Fe(n,e=>qt(n,e,xe(n))),S0=n=>Fe(n,e=>b.cursor(n.lineBlockAt(e.head).from)),k0=n=>Fe(n,e=>b.cursor(n.lineBlockAt(e.head).to)),Ja=({state:n,dispatch:e})=>(e(lt(n,{anchor:0})),!0),eh=({state:n,dispatch:e})=>(e(lt(n,{anchor:n.doc.length})),!0),th=({state:n,dispatch:e})=>(e(lt(n,{anchor:n.selection.main.anchor,head:0})),!0),ih=({state:n,dispatch:e})=>(e(lt(n,{anchor:n.selection.main.anchor,head:n.doc.length})),!0),w0=({state:n,dispatch:e})=>(e(n.update({selection:{anchor:0,head:n.doc.length},userEvent:"select"})),!0),v0=({state:n,dispatch:e})=>{let t=js(n).map(({from:i,to:s})=>b.range(i,Math.min(s+1,n.doc.length)));return e(n.update({selection:b.create(t),userEvent:"select"})),!0},T0=({state:n,dispatch:e})=>{let t=Ti(n.selection,i=>{let s=fe(n),r=s.resolveStack(i.from,1);if(i.empty){let o=s.resolveStack(i.from,-1);o.node.from>=r.node.from&&o.node.to<=r.node.to&&(r=o)}for(let o=r;o;o=o.next){let{node:l}=o;if((l.from=i.to||l.to>i.to&&l.from<=i.from)&&o.next)return b.range(l.to,l.from)}return i});return t.eq(n.selection)?!1:(e(lt(n,t)),!0)},C0=({state:n,dispatch:e})=>{let t=n.selection,i=null;return t.ranges.length>1?i=b.create([t.main]):t.main.empty||(i=b.create([b.cursor(t.main.head)])),i?(e(lt(n,i)),!0):!1};function On(n,e){if(n.state.readOnly)return!1;let t="delete.selection",{state:i}=n,s=i.changeByRange(r=>{let{from:o,to:l}=r;if(o==l){let a=e(r);ao&&(t="delete.forward",a=Nn(n,a,!0)),o=Math.min(o,a),l=Math.max(l,a)}else o=Nn(n,o,!1),l=Nn(n,l,!0);return o==l?{range:r}:{changes:{from:o,to:l},range:b.cursor(o,os(n)))i.between(e,e,(s,r)=>{se&&(e=t?r:s)});return e}const yu=(n,e,t)=>On(n,i=>{let s=i.from,{state:r}=n,o=r.doc.lineAt(s),l,a;if(t&&!e&&s>o.from&&syu(n,!1,!0),bu=n=>yu(n,!0,!1),xu=(n,e)=>On(n,t=>{let i=t.head,{state:s}=n,r=s.doc.lineAt(i),o=s.charCategorizer(i);for(let l=null;;){if(i==(e?r.to:r.from)){i==t.head&&r.number!=(e?s.doc.lines:1)&&(i+=e?1:-1);break}let a=Oe(r.text,i-r.from,e)+r.from,h=r.text.slice(Math.min(i,a)-r.from,Math.max(i,a)-r.from),c=o(h);if(l!=null&&c!=l)break;(h!=" "||i!=t.head)&&(l=c),i=a}return i}),Su=n=>xu(n,!1),P0=n=>xu(n,!0),Q0=n=>On(n,e=>{let t=n.lineBlockAt(e.head).to;return e.headOn(n,e=>{let t=n.moveToLineBoundary(e,!1).head;return e.head>t?t:Math.max(0,e.head-1)}),M0=n=>On(n,e=>{let t=n.moveToLineBoundary(e,!0).head;return e.head{if(n.readOnly)return!1;let t=n.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:V.of(["",""])},range:b.cursor(i.from)}));return e(n.update(t,{scrollIntoView:!0,userEvent:"input"})),!0},D0=({state:n,dispatch:e})=>{if(n.readOnly)return!1;let t=n.changeByRange(i=>{if(!i.empty||i.from==0||i.from==n.doc.length)return{range:i};let s=i.from,r=n.doc.lineAt(s),o=s==r.from?s-1:Oe(r.text,s-r.from,!1)+r.from,l=s==r.to?s+1:Oe(r.text,s-r.from,!0)+r.from;return{changes:{from:o,to:l,insert:n.doc.slice(s,l).append(n.doc.slice(o,s))},range:b.cursor(l)}});return t.changes.empty?!1:(e(n.update(t,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function js(n){let e=[],t=-1;for(let i of n.selection.ranges){let s=n.doc.lineAt(i.from),r=n.doc.lineAt(i.to);if(!i.empty&&i.to==r.from&&(r=n.doc.lineAt(i.to-1)),t>=s.number){let o=e[e.length-1];o.to=r.to,o.ranges.push(i)}else e.push({from:s.from,to:r.to,ranges:[i]});t=r.number+1}return e}function ku(n,e,t){if(n.readOnly)return!1;let i=[],s=[];for(let r of js(n)){if(t?r.to==n.doc.length:r.from==0)continue;let o=n.doc.lineAt(t?r.to+1:r.from-1),l=o.length+1;if(t){i.push({from:r.to,to:o.to},{from:r.from,insert:o.text+n.lineBreak});for(let a of r.ranges)s.push(b.range(Math.min(n.doc.length,a.anchor+l),Math.min(n.doc.length,a.head+l)))}else{i.push({from:o.from,to:r.from},{from:r.to,insert:n.lineBreak+o.text});for(let a of r.ranges)s.push(b.range(a.anchor-l,a.head-l))}}return i.length?(e(n.update({changes:i,scrollIntoView:!0,selection:b.create(s,n.selection.mainIndex),userEvent:"move.line"})),!0):!1}const E0=({state:n,dispatch:e})=>ku(n,e,!1),q0=({state:n,dispatch:e})=>ku(n,e,!0);function wu(n,e,t){if(n.readOnly)return!1;let i=[];for(let s of js(n))t?i.push({from:s.from,insert:n.doc.slice(s.from,s.to)+n.lineBreak}):i.push({from:s.to,insert:n.lineBreak+n.doc.slice(s.from,s.to)});return e(n.update({changes:i,scrollIntoView:!0,userEvent:"input.copyline"})),!0}const $0=({state:n,dispatch:e})=>wu(n,e,!1),B0=({state:n,dispatch:e})=>wu(n,e,!0),L0=n=>{if(n.state.readOnly)return!1;let{state:e}=n,t=e.changes(js(e).map(({from:s,to:r})=>(s>0?s--:r{let r;if(n.lineWrapping){let o=n.lineBlockAt(s.head),l=n.coordsAtPos(s.head,s.assoc||1);l&&(r=o.bottom+n.documentTop-l.bottom+n.defaultLineHeight/2)}return n.moveVertically(s,!0,r)}).map(t);return n.dispatch({changes:t,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function W0(n,e){if(/\(\)|\[\]|\{\}/.test(n.sliceDoc(e-1,e+1)))return{from:e,to:e};let t=fe(n).resolveInner(e),i=t.childBefore(e),s=t.childAfter(e),r;return i&&s&&i.to<=e&&s.from>=e&&(r=i.type.prop(z.closedBy))&&r.indexOf(s.name)>-1&&n.doc.lineAt(i.to).from==n.doc.lineAt(s.from).from&&!/\S/.test(n.sliceDoc(i.to,s.from))?{from:i.to,to:s.from}:null}const nh=vu(!1),z0=vu(!0);function vu(n){return({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=e.changeByRange(s=>{let{from:r,to:o}=s,l=e.doc.lineAt(r),a=!n&&r==o&&W0(e,r);n&&(r=o=(o<=l.to?l:e.doc.lineAt(o)).to);let h=new Fs(e,{simulateBreak:r,simulateDoubleBreak:!!a}),c=il(h,r);for(c==null&&(c=vi(/^\s*/.exec(e.doc.lineAt(r).text)[0],e.tabSize));ol.from&&r{let s=[];for(let o=i.from;o<=i.to;){let l=n.doc.lineAt(o);l.number>t&&(i.empty||i.to>l.from)&&(e(l,s,i),t=l.number),o=l.to+1}let r=n.changes(s);return{changes:s,range:b.range(r.mapPos(i.anchor,1),r.mapPos(i.head,1))}})}const I0=({state:n,dispatch:e})=>{if(n.readOnly)return!1;let t=Object.create(null),i=new Fs(n,{overrideIndentation:r=>{let o=t[r];return o??-1}}),s=hl(n,(r,o,l)=>{let a=il(i,r.from);if(a==null)return;/\S/.test(r.text)||(a=0);let h=/^\s*/.exec(r.text)[0],c=nn(n,a);(h!=c||l.fromn.readOnly?!1:(e(n.update(hl(n,(t,i)=>{i.push({from:t.from,insert:n.facet(Ns)})}),{userEvent:"input.indent"})),!0),N0=({state:n,dispatch:e})=>n.readOnly?!1:(e(n.update(hl(n,(t,i)=>{let s=/^\s*/.exec(t.text)[0];if(!s)return;let r=vi(s,n.tabSize),o=0,l=nn(n,Math.max(0,r-Yt(n)));for(;o(n.setTabFocusMode(),!0),X0=[{key:"Ctrl-b",run:iu,shift:fu,preventDefault:!0},{key:"Ctrl-f",run:nu,shift:uu},{key:"Ctrl-p",run:ou,shift:mu},{key:"Ctrl-n",run:lu,shift:gu},{key:"Ctrl-a",run:h0,shift:S0},{key:"Ctrl-e",run:c0,shift:k0},{key:"Ctrl-d",run:bu},{key:"Ctrl-h",run:Qo},{key:"Ctrl-k",run:Q0},{key:"Ctrl-Alt-h",run:Su},{key:"Ctrl-o",run:R0},{key:"Ctrl-t",run:D0},{key:"Ctrl-v",run:Po}],_0=[{key:"ArrowLeft",run:iu,shift:fu,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:e0,shift:d0,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:l0,shift:b0,preventDefault:!0},{key:"ArrowRight",run:nu,shift:uu,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:t0,shift:p0,preventDefault:!0},{mac:"Cmd-ArrowRight",run:a0,shift:x0,preventDefault:!0},{key:"ArrowUp",run:ou,shift:mu,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Ja,shift:th},{mac:"Ctrl-ArrowUp",run:Za,shift:Ya},{key:"ArrowDown",run:lu,shift:gu,preventDefault:!0},{mac:"Cmd-ArrowDown",run:eh,shift:ih},{mac:"Ctrl-ArrowDown",run:Po,shift:Ka},{key:"PageUp",run:Za,shift:Ya},{key:"PageDown",run:Po,shift:Ka},{key:"Home",run:o0,shift:y0,preventDefault:!0},{key:"Mod-Home",run:Ja,shift:th},{key:"End",run:r0,shift:O0,preventDefault:!0},{key:"Mod-End",run:eh,shift:ih},{key:"Enter",run:nh,shift:nh},{key:"Mod-a",run:w0},{key:"Backspace",run:Qo,shift:Qo},{key:"Delete",run:bu},{key:"Mod-Backspace",mac:"Alt-Backspace",run:Su},{key:"Mod-Delete",mac:"Alt-Delete",run:P0},{mac:"Mod-Backspace",run:A0},{mac:"Mod-Delete",run:M0}].concat(X0.map(n=>({mac:n.key,run:n.run,shift:n.shift}))),U0=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:n0,shift:m0},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:s0,shift:g0},{key:"Alt-ArrowUp",run:E0},{key:"Shift-Alt-ArrowUp",run:$0},{key:"Alt-ArrowDown",run:q0},{key:"Shift-Alt-ArrowDown",run:B0},{key:"Escape",run:C0},{key:"Mod-Enter",run:z0},{key:"Alt-l",mac:"Ctrl-l",run:v0},{key:"Mod-i",run:T0,preventDefault:!0},{key:"Mod-[",run:N0},{key:"Mod-]",run:V0},{key:"Mod-Alt-\\",run:I0},{key:"Shift-Mod-k",run:L0},{key:"Shift-Mod-\\",run:u0},{key:"Mod-/",run:$O},{key:"Alt-A",run:LO},{key:"Ctrl-m",mac:"Shift-Alt-m",run:F0}].concat(_0);function de(){var n=arguments[0];typeof n=="string"&&(n=document.createElement(n));var e=1,t=arguments[1];if(t&&typeof t=="object"&&t.nodeType==null&&!Array.isArray(t)){for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)){var s=t[i];typeof s=="string"?n.setAttribute(i,s):s!=null&&(n[i]=s)}e++}for(;en.normalize("NFKD"):n=>n;class Si{constructor(e,t,i=0,s=e.length,r,o){this.test=o,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,s),this.bufferStart=i,this.normalize=r?l=>r(sh(l)):sh,this.query=this.normalize(t)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Ce(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let t=Bo(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=Ke(e);let s=this.normalize(t);if(s.length)for(let r=0,o=i;;r++){let l=s.charCodeAt(r),a=this.match(l,o,this.bufferPos+this.bufferStart);if(r==s.length-1){if(a)return this.value=a,this;break}o==i&&rthis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let t=this.matchPos<=this.to&&this.re.exec(this.curLine);if(t){let i=this.curLineStart+t.index,s=i+t[0].length;if(this.matchPos=Ts(this.text,s+(i==s?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,s,t)))return this.value={from:i,to:s,match:t},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||s.to<=t){let l=new fi(t,e.sliceString(t,i));return Sr.set(e,l),l}if(s.from==t&&s.to==i)return s;let{text:r,from:o}=s;return o>t&&(r=e.sliceString(t,o)+r,o=t),s.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,t=this.re.exec(this.flat.text);if(t&&!t[0]&&t.index==e&&(this.re.lastIndex=e+1,t=this.re.exec(this.flat.text)),t){let i=this.flat.from+t.index,s=i+t[0].length;if((this.flat.to>=this.to||t.index+t[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,s,t)))return this.value={from:i,to:s,match:t},this.matchPos=Ts(this.text,s+(i==s?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=fi.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}}typeof Symbol<"u"&&(Pu.prototype[Symbol.iterator]=Qu.prototype[Symbol.iterator]=function(){return this});function H0(n){try{return new RegExp(n,cl),!0}catch{return!1}}function Ts(n,e){if(e>=n.length)return e;let t=n.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}function Ao(n){let e=String(n.state.doc.lineAt(n.state.selection.main.head).number),t=de("input",{class:"cm-textfield",name:"line",value:e}),i=de("form",{class:"cm-gotoLine",onkeydown:r=>{r.keyCode==27?(r.preventDefault(),n.dispatch({effects:_i.of(!1)}),n.focus()):r.keyCode==13&&(r.preventDefault(),s())},onsubmit:r=>{r.preventDefault(),s()}},de("label",n.state.phrase("Go to line"),": ",t)," ",de("button",{class:"cm-button",type:"submit"},n.state.phrase("go")),de("button",{name:"close",onclick:()=>{n.dispatch({effects:_i.of(!1)}),n.focus()},"aria-label":n.state.phrase("close"),type:"button"},["×"]));function s(){let r=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(t.value);if(!r)return;let{state:o}=n,l=o.doc.lineAt(o.selection.main.head),[,a,h,c,f]=r,u=c?+c.slice(1):0,d=h?+h:l.number;if(h&&f){let g=d/100;a&&(g=g*(a=="-"?-1:1)+l.number/o.doc.lines),d=Math.round(o.doc.lines*g)}else h&&a&&(d=d*(a=="-"?-1:1)+l.number);let p=o.doc.line(Math.max(1,Math.min(o.doc.lines,d))),m=b.cursor(p.from+Math.max(0,Math.min(u,p.length)));n.dispatch({effects:[_i.of(!1),Q.scrollIntoView(m.from,{y:"center"})],selection:m}),n.focus()}return{dom:i}}const _i=B.define(),rh=ue.define({create(){return!0},update(n,e){for(let t of e.effects)t.is(_i)&&(n=t.value);return n},provide:n=>en.from(n,e=>e?Ao:null)}),j0=n=>{let e=Ji(n,Ao);if(!e){let t=[_i.of(!0)];n.state.field(rh,!1)==null&&t.push(B.appendConfig.of([rh,G0])),n.dispatch({effects:t}),e=Ji(n,Ao)}return e&&e.dom.querySelector("input").select(),!0},G0=Q.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px",position:"relative","& label":{fontSize:"80%"},"& [name=close]":{position:"absolute",top:"0",bottom:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:"0"}}}),Z0={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},Y0=M.define({combine(n){return ot(n,Z0,{highlightWordAroundCursor:(e,t)=>e||t,minSelectionLength:Math.min,maxMatches:Math.min})}});function K0(n){return[ny,iy]}const J0=D.mark({class:"cm-selectionMatch"}),ey=D.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function oh(n,e,t,i){return(t==0||n(e.sliceDoc(t-1,t))!=Y.Word)&&(i==e.doc.length||n(e.sliceDoc(i,i+1))!=Y.Word)}function ty(n,e,t,i){return n(e.sliceDoc(t,t+1))==Y.Word&&n(e.sliceDoc(i-1,i))==Y.Word}const iy=le.fromClass(class{constructor(n){this.decorations=this.getDeco(n)}update(n){(n.selectionSet||n.docChanged||n.viewportChanged)&&(this.decorations=this.getDeco(n.view))}getDeco(n){let e=n.state.facet(Y0),{state:t}=n,i=t.selection;if(i.ranges.length>1)return D.none;let s=i.main,r,o=null;if(s.empty){if(!e.highlightWordAroundCursor)return D.none;let a=t.wordAt(s.head);if(!a)return D.none;o=t.charCategorizer(s.head),r=t.sliceDoc(a.from,a.to)}else{let a=s.to-s.from;if(a200)return D.none;if(e.wholeWords){if(r=t.sliceDoc(s.from,s.to),o=t.charCategorizer(s.head),!(oh(o,t,s.from,s.to)&&ty(o,t,s.from,s.to)))return D.none}else if(r=t.sliceDoc(s.from,s.to),!r)return D.none}let l=[];for(let a of n.visibleRanges){let h=new Si(t.doc,r,a.from,a.to);for(;!h.next().done;){let{from:c,to:f}=h.value;if((!o||oh(o,t,c,f))&&(s.empty&&c<=s.from&&f>=s.to?l.push(ey.range(c,f)):(c>=s.to||f<=s.from)&&l.push(J0.range(c,f)),l.length>e.maxMatches))return D.none}}return D.set(l)}},{decorations:n=>n.decorations}),ny=Q.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),sy=({state:n,dispatch:e})=>{let{selection:t}=n,i=b.create(t.ranges.map(s=>n.wordAt(s.head)||b.cursor(s.head)),t.mainIndex);return i.eq(t)?!1:(e(n.update({selection:i})),!0)};function ry(n,e){let{main:t,ranges:i}=n.selection,s=n.wordAt(t.head),r=s&&s.from==t.from&&s.to==t.to;for(let o=!1,l=new Si(n.doc,e,i[i.length-1].to);;)if(l.next(),l.done){if(o)return null;l=new Si(n.doc,e,0,Math.max(0,i[i.length-1].from-1)),o=!0}else{if(o&&i.some(a=>a.from==l.value.from))continue;if(r){let a=n.wordAt(l.value.from);if(!a||a.from!=l.value.from||a.to!=l.value.to)continue}return l.value}}const oy=({state:n,dispatch:e})=>{let{ranges:t}=n.selection;if(t.some(r=>r.from===r.to))return sy({state:n,dispatch:e});let i=n.sliceDoc(t[0].from,t[0].to);if(n.selection.ranges.some(r=>n.sliceDoc(r.from,r.to)!=i))return!1;let s=ry(n,i);return s?(e(n.update({selection:n.selection.addRange(b.range(s.from,s.to),!1),effects:Q.scrollIntoView(s.to)})),!0):!1},Ci=M.define({combine(n){return ot(n,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new yy(e),scrollToMatch:e=>Q.scrollIntoView(e)})}});class Au{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||H0(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(t,i)=>i=="n"?` +`:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord}create(){return this.regexp?new cy(this):new ay(this)}getCursor(e,t=0,i){let s=e.doc?e:I.create({doc:e});return i==null&&(i=s.doc.length),this.regexp?si(this,s,t,i):ni(this,s,t,i)}}class Mu{constructor(e){this.spec=e}}function ni(n,e,t,i){return new Si(e.doc,n.unquoted,t,i,n.caseSensitive?void 0:s=>s.toLowerCase(),n.wholeWord?ly(e.doc,e.charCategorizer(e.selection.main.head)):void 0)}function ly(n,e){return(t,i,s,r)=>((r>t||r+s.length=t)return null;s.push(i.value)}return s}highlight(e,t,i,s){let r=ni(this.spec,e,Math.max(0,t-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!r.next().done;)s(r.value.from,r.value.to)}}function si(n,e,t,i){return new Pu(e.doc,n.search,{ignoreCase:!n.caseSensitive,test:n.wholeWord?hy(e.charCategorizer(e.selection.main.head)):void 0},t,i)}function Cs(n,e){return n.slice(Oe(n,e,!1),e)}function Ps(n,e){return n.slice(e,Oe(n,e))}function hy(n){return(e,t,i)=>!i[0].length||(n(Cs(i.input,i.index))!=Y.Word||n(Ps(i.input,i.index))!=Y.Word)&&(n(Ps(i.input,i.index+i[0].length))!=Y.Word||n(Cs(i.input,i.index+i[0].length))!=Y.Word)}class cy extends Mu{nextMatch(e,t,i){let s=si(this.spec,e,i,e.doc.length).next();return s.done&&(s=si(this.spec,e,0,t).next()),s.done?null:s.value}prevMatchInRange(e,t,i){for(let s=1;;s++){let r=Math.max(t,i-s*1e4),o=si(this.spec,e,r,i),l=null;for(;!o.next().done;)l=o.value;if(l&&(r==t||l.from>r+10))return l;if(r==t)return null}}prevMatch(e,t,i){return this.prevMatchInRange(e,0,t)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(t,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let s=i.length;s>0;s--){let r=+i.slice(0,s);if(r>0&&r=t)return null;s.push(i.value)}return s}highlight(e,t,i,s){let r=si(this.spec,e,Math.max(0,t-250),Math.min(i+250,e.doc.length));for(;!r.next().done;)s(r.value.from,r.value.to)}}const rn=B.define(),fl=B.define(),Qt=ue.define({create(n){return new kr(Mo(n).create(),null)},update(n,e){for(let t of e.effects)t.is(rn)?n=new kr(t.value.create(),n.panel):t.is(fl)&&(n=new kr(n.query,t.value?ul:null));return n},provide:n=>en.from(n,e=>e.panel)});class kr{constructor(e,t){this.query=e,this.panel=t}}const fy=D.mark({class:"cm-searchMatch"}),uy=D.mark({class:"cm-searchMatch cm-searchMatch-selected"}),dy=le.fromClass(class{constructor(n){this.view=n,this.decorations=this.highlight(n.state.field(Qt))}update(n){let e=n.state.field(Qt);(e!=n.startState.field(Qt)||n.docChanged||n.selectionSet||n.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:n,panel:e}){if(!e||!n.spec.valid)return D.none;let{view:t}=this,i=new gt;for(let s=0,r=t.visibleRanges,o=r.length;sr[s+1].from-500;)a=r[++s].to;n.highlight(t.state,l,a,(h,c)=>{let f=t.state.selection.ranges.some(u=>u.from==h&&u.to==c);i.add(h,c,f?uy:fy)})}return i.finish()}},{decorations:n=>n.decorations});function yn(n){return e=>{let t=e.state.field(Qt,!1);return t&&t.query.spec.valid?n(e,t):Eu(e)}}const Qs=yn((n,{query:e})=>{let{to:t}=n.state.selection.main,i=e.nextMatch(n.state,t,t);if(!i)return!1;let s=b.single(i.from,i.to),r=n.state.facet(Ci);return n.dispatch({selection:s,effects:[dl(n,i),r.scrollToMatch(s.main,n)],userEvent:"select.search"}),Du(n),!0}),As=yn((n,{query:e})=>{let{state:t}=n,{from:i}=t.selection.main,s=e.prevMatch(t,i,i);if(!s)return!1;let r=b.single(s.from,s.to),o=n.state.facet(Ci);return n.dispatch({selection:r,effects:[dl(n,s),o.scrollToMatch(r.main,n)],userEvent:"select.search"}),Du(n),!0}),py=yn((n,{query:e})=>{let t=e.matchAll(n.state,1e3);return!t||!t.length?!1:(n.dispatch({selection:b.create(t.map(i=>b.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),my=({state:n,dispatch:e})=>{let t=n.selection;if(t.ranges.length>1||t.main.empty)return!1;let{from:i,to:s}=t.main,r=[],o=0;for(let l=new Si(n.doc,n.sliceDoc(i,s));!l.next().done;){if(r.length>1e3)return!1;l.value.from==i&&(o=r.length),r.push(b.range(l.value.from,l.value.to))}return e(n.update({selection:b.create(r,o),userEvent:"select.search.matches"})),!0},lh=yn((n,{query:e})=>{let{state:t}=n,{from:i,to:s}=t.selection.main;if(t.readOnly)return!1;let r=e.nextMatch(t,i,i);if(!r)return!1;let o=r,l=[],a,h,c=[];o.from==i&&o.to==s&&(h=t.toText(e.getReplacement(o)),l.push({from:o.from,to:o.to,insert:h}),o=e.nextMatch(t,o.from,o.to),c.push(Q.announce.of(t.phrase("replaced match on line $",t.doc.lineAt(i).number)+".")));let f=n.state.changes(l);return o&&(a=b.single(o.from,o.to).map(f),c.push(dl(n,o)),c.push(t.facet(Ci).scrollToMatch(a.main,n))),n.dispatch({changes:f,selection:a,effects:c,userEvent:"input.replace"}),!0}),gy=yn((n,{query:e})=>{if(n.state.readOnly)return!1;let t=e.matchAll(n.state,1e9).map(s=>{let{from:r,to:o}=s;return{from:r,to:o,insert:e.getReplacement(s)}});if(!t.length)return!1;let i=n.state.phrase("replaced $ matches",t.length)+".";return n.dispatch({changes:t,effects:Q.announce.of(i),userEvent:"input.replace.all"}),!0});function ul(n){return n.state.facet(Ci).createPanel(n)}function Mo(n,e){var t,i,s,r,o;let l=n.selection.main,a=l.empty||l.to>l.from+100?"":n.sliceDoc(l.from,l.to);if(e&&!a)return e;let h=n.facet(Ci);return new Au({search:((t=e?.literal)!==null&&t!==void 0?t:h.literal)?a:a.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:h.caseSensitive,literal:(s=e?.literal)!==null&&s!==void 0?s:h.literal,regexp:(r=e?.regexp)!==null&&r!==void 0?r:h.regexp,wholeWord:(o=e?.wholeWord)!==null&&o!==void 0?o:h.wholeWord})}function Ru(n){let e=Ji(n,ul);return e&&e.dom.querySelector("[main-field]")}function Du(n){let e=Ru(n);e&&e==n.root.activeElement&&e.select()}const Eu=n=>{let e=n.state.field(Qt,!1);if(e&&e.panel){let t=Ru(n);if(t&&t!=n.root.activeElement){let i=Mo(n.state,e.query.spec);i.valid&&n.dispatch({effects:rn.of(i)}),t.focus(),t.select()}}else n.dispatch({effects:[fl.of(!0),e?rn.of(Mo(n.state,e.query.spec)):B.appendConfig.of(xy)]});return!0},qu=n=>{let e=n.state.field(Qt,!1);if(!e||!e.panel)return!1;let t=Ji(n,ul);return t&&t.dom.contains(n.root.activeElement)&&n.focus(),n.dispatch({effects:fl.of(!1)}),!0},Oy=[{key:"Mod-f",run:Eu,scope:"editor search-panel"},{key:"F3",run:Qs,shift:As,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:Qs,shift:As,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:qu,scope:"editor search-panel"},{key:"Mod-Shift-l",run:my},{key:"Mod-Alt-g",run:j0},{key:"Mod-d",run:oy,preventDefault:!0}];class yy{constructor(e){this.view=e;let t=this.query=e.state.field(Qt).query.spec;this.commit=this.commit.bind(this),this.searchField=de("input",{value:t.search,placeholder:De(e,"Find"),"aria-label":De(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=de("input",{value:t.replace,placeholder:De(e,"Replace"),"aria-label":De(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=de("input",{type:"checkbox",name:"case",form:"",checked:t.caseSensitive,onchange:this.commit}),this.reField=de("input",{type:"checkbox",name:"re",form:"",checked:t.regexp,onchange:this.commit}),this.wordField=de("input",{type:"checkbox",name:"word",form:"",checked:t.wholeWord,onchange:this.commit});function i(s,r,o){return de("button",{class:"cm-button",name:s,onclick:r,type:"button"},o)}this.dom=de("div",{onkeydown:s=>this.keydown(s),class:"cm-search"},[this.searchField,i("next",()=>Qs(e),[De(e,"next")]),i("prev",()=>As(e),[De(e,"previous")]),i("select",()=>py(e),[De(e,"all")]),de("label",null,[this.caseField,De(e,"match case")]),de("label",null,[this.reField,De(e,"regexp")]),de("label",null,[this.wordField,De(e,"by word")]),...e.state.readOnly?[]:[de("br"),this.replaceField,i("replace",()=>lh(e),[De(e,"replace")]),i("replaceAll",()=>gy(e),[De(e,"replace all")])],de("button",{name:"close",onclick:()=>qu(e),"aria-label":De(e,"close"),type:"button"},["×"])])}commit(){let e=new Au({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:rn.of(e)}))}keydown(e){wm(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?As:Qs)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),lh(this.view))}update(e){for(let t of e.transactions)for(let i of t.effects)i.is(rn)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(Ci).top}}function De(n,e){return n.state.phrase(e)}const Fn=30,Xn=/[\s\.,:;?!]/;function dl(n,{from:e,to:t}){let i=n.state.doc.lineAt(e),s=n.state.doc.lineAt(t).to,r=Math.max(i.from,e-Fn),o=Math.min(s,t+Fn),l=n.state.sliceDoc(r,o);if(r!=i.from){for(let a=0;al.length-Fn;a--)if(!Xn.test(l[a-1])&&Xn.test(l[a])){l=l.slice(0,a);break}}return Q.announce.of(`${n.state.phrase("current match")}. ${l} ${n.state.phrase("on line")} ${i.number}.`)}const by=Q.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),xy=[Qt,Et.low(dy),by];class $u{constructor(e,t,i,s){this.state=e,this.pos=t,this.explicit=i,this.view=s,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let t=fe(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),i=Math.max(t.from,this.pos-250),s=t.text.slice(i-t.from,this.pos-t.from),r=s.search(Lu(e,!1));return r<0?null:{from:i+r,to:this.pos,text:s.slice(r)}}get aborted(){return this.abortListeners==null}addEventListener(e,t,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(t),i&&i.onDocChange&&(this.abortOnDocChange=!0))}}function ah(n){let e=Object.keys(n).join(""),t=/\w/.test(e);return t&&(e=e.replace(/\w/g,"")),`[${t?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function Sy(n){let e=Object.create(null),t=Object.create(null);for(let{label:s}of n){e[s[0]]=!0;for(let r=1;rtypeof s=="string"?{label:s}:s),[t,i]=e.every(s=>/^\w+$/.test(s.label))?[/\w*$/,/\w+$/]:Sy(e);return s=>{let r=s.matchBefore(i);return r||s.explicit?{from:r?r.from:s.pos,options:e,validFor:t}:null}}function ky(n,e){return t=>{for(let i=fe(t.state).resolveInner(t.pos,-1);i;i=i.parent){if(n.indexOf(i.name)>-1)return null;if(i.type.isTop)break}return e(t)}}class hh{constructor(e,t,i,s){this.completion=e,this.source=t,this.match=i,this.score=s}}function Ut(n){return n.selection.main.from}function Lu(n,e){var t;let{source:i}=n,s=e&&i[0]!="^",r=i[i.length-1]!="$";return!s&&!r?n:new RegExp(`${s?"^":""}(?:${i})${r?"$":""}`,(t=n.flags)!==null&&t!==void 0?t:n.ignoreCase?"i":"")}const pl=bt.define();function wy(n,e,t,i){let{main:s}=n.selection,r=t-s.from,o=i-s.from;return{...n.changeByRange(l=>{if(l!=s&&t!=i&&n.sliceDoc(l.from+r,l.from+o)!=n.sliceDoc(t,i))return{range:l};let a=n.toText(e);return{changes:{from:l.from+r,to:i==s.from?l.to:l.from+o,insert:a},range:b.cursor(l.from+r+a.length)}}),scrollIntoView:!0,userEvent:"input.complete"}}const ch=new WeakMap;function vy(n){if(!Array.isArray(n))return n;let e=ch.get(n);return e||ch.set(n,e=Bu(n)),e}const Ms=B.define(),on=B.define();class Ty{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&x<=57||x>=97&&x<=122?2:x>=65&&x<=90?1:0:(w=Bo(x))!=w.toLowerCase()?1:w!=w.toUpperCase()?2:0;(!S||T==1&&g||v==0&&T!=0)&&(t[f]==x||i[f]==x&&(u=!0)?o[f++]=S:o.length&&(y=!1)),v=T,S+=Ke(x)}return f==a&&o[0]==0&&y?this.result(-100+(u?-200:0),o,e):d==a&&p==0?this.ret(-200-e.length+(m==e.length?0:-100),[0,m]):l>-1?this.ret(-700-e.length,[l,l+this.pattern.length]):d==a?this.ret(-900-e.length,[p,m]):f==a?this.result(-100+(u?-200:0)+-700+(y?0:-1100),o,e):t.length==2?null:this.result((s[0]?-700:0)+-200+-1100,s,e)}result(e,t,i){let s=[],r=0;for(let o of t){let l=o+(this.astral?Ke(Ce(i,o)):1);r&&s[r-1]==o?s[r-1]=l:(s[r++]=o,s[r++]=l)}return this.ret(e-i.length,s)}}class Cy{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:Py,filterStrict:!1,compareCompletions:(e,t)=>e.label.localeCompare(t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>i=>fh(e(i),t(i)),optionClass:(e,t)=>i=>fh(e(i),t(i)),addToOptions:(e,t)=>e.concat(t),filterStrict:(e,t)=>e||t})}});function fh(n,e){return n?e?n+" "+e:n:e}function Py(n,e,t,i,s,r){let o=n.textDirection==Z.RTL,l=o,a=!1,h="top",c,f,u=e.left-s.left,d=s.right-e.right,p=i.right-i.left,m=i.bottom-i.top;if(l&&u=m||S>e.top?c=t.bottom-e.top:(h="bottom",c=e.bottom-t.top)}let g=(e.bottom-e.top)/r.offsetHeight,y=(e.right-e.left)/r.offsetWidth;return{style:`${h}: ${c/g}px; max-width: ${f/y}px`,class:"cm-completionInfo-"+(a?o?"left-narrow":"right-narrow":l?"left":"right")}}function Qy(n){let e=n.addToOptions.slice();return n.icons&&e.push({render(t){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),t.type&&i.classList.add(...t.type.split(/\s+/g).map(s=>"cm-completionIcon-"+s)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(t,i,s,r){let o=document.createElement("span");o.className="cm-completionLabel";let l=t.displayLabel||t.label,a=0;for(let h=0;ha&&o.appendChild(document.createTextNode(l.slice(a,c)));let u=o.appendChild(document.createElement("span"));u.appendChild(document.createTextNode(l.slice(c,f))),u.className="cm-completionMatchedText",a=f}return at.position-i.position).map(t=>t.render)}function wr(n,e,t){if(n<=t)return{from:0,to:n};if(e<0&&(e=0),e<=n>>1){let s=Math.floor(e/t);return{from:s*t,to:(s+1)*t}}let i=Math.floor((n-e)/t);return{from:n-(i+1)*t,to:n-i*t}}class Ay{constructor(e,t,i){this.view=e,this.stateField=t,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:a=>this.placeInfo(a),key:this},this.space=null,this.currentClass="";let s=e.state.field(t),{options:r,selected:o}=s.open,l=e.state.facet(ce);this.optionContent=Qy(l),this.optionClass=l.optionClass,this.tooltipClass=l.tooltipClass,this.range=wr(r.length,o,l.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",a=>{let{options:h}=e.state.field(t).open;for(let c=a.target,f;c&&c!=this.dom;c=c.parentNode)if(c.nodeName=="LI"&&(f=/-(\d+)$/.exec(c.id))&&+f[1]{let h=e.state.field(this.stateField,!1);h&&h.tooltip&&e.state.facet(ce).closeOnBlur&&a.relatedTarget!=e.contentDOM&&e.dispatch({effects:on.of(null)})}),this.showOptions(r,s.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var t;let i=e.state.field(this.stateField),s=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=s){let{options:r,selected:o,disabled:l}=i.open;(!s.open||s.open.options!=r)&&(this.range=wr(r.length,o,e.state.facet(ce).maxRenderedOptions),this.showOptions(r,i.id)),this.updateSel(),l!=((t=s.open)===null||t===void 0?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!l)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of t.split(" "))i&&this.dom.classList.add(i);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;if((t.selected>-1&&t.selected=this.range.to)&&(this.range=wr(t.options.length,t.selected,this.view.state.facet(ce).maxRenderedOptions),this.showOptions(t.options,e.id)),this.updateSelectedOption(t.selected)){this.destroyInfo();let{completion:i}=t.options[t.selected],{info:s}=i;if(!s)return;let r=typeof s=="string"?document.createTextNode(s):s(i);if(!r)return;"then"in r?r.then(o=>{o&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(o,i)}).catch(o=>Ae(this.view.state,o,"completion info")):this.addInfoPane(r,i)}}addInfoPane(e,t){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:s,destroy:r}=e;i.appendChild(s),this.infoDestroy=r||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let i=this.list.firstChild,s=this.range.from;i;i=i.nextSibling,s++)i.nodeName!="LI"||!i.id?s--:s==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),t=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected");return t&&Ry(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),s=e.getBoundingClientRect(),r=this.space;if(!r){let o=this.dom.ownerDocument.documentElement;r={left:0,top:0,right:o.clientWidth,bottom:o.clientHeight}}return s.top>Math.min(r.bottom,t.bottom)-10||s.bottom{o.target==s&&o.preventDefault()});let r=null;for(let o=i.from;oi.from||i.from==0))if(r=u,typeof h!="string"&&h.header)s.appendChild(h.header(h));else{let d=s.appendChild(document.createElement("completion-section"));d.textContent=u}}const c=s.appendChild(document.createElement("li"));c.id=t+"-"+o,c.setAttribute("role","option");let f=this.optionClass(l);f&&(c.className=f);for(let u of this.optionContent){let d=u(l,this.view.state,this.view,a);d&&c.appendChild(d)}}return i.from&&s.classList.add("cm-completionListIncompleteTop"),i.tonew Ay(t,n,e)}function Ry(n,e){let t=n.getBoundingClientRect(),i=e.getBoundingClientRect(),s=t.height/n.offsetHeight;i.topt.bottom&&(n.scrollTop+=(i.bottom-t.bottom)/s)}function uh(n){return(n.boost||0)*100+(n.apply?10:0)+(n.info?5:0)+(n.type?1:0)}function Dy(n,e){let t=[],i=null,s=h=>{t.push(h);let{section:c}=h.completion;if(c){i||(i=[]);let f=typeof c=="string"?c:c.name;i.some(u=>u.name==f)||i.push(typeof c=="string"?{name:f}:c)}},r=e.facet(ce);for(let h of n)if(h.hasResult()){let c=h.result.getMatch;if(h.result.filter===!1)for(let f of h.result.options)s(new hh(f,h.source,c?c(f):[],1e9-t.length));else{let f=e.sliceDoc(h.from,h.to),u,d=r.filterStrict?new Cy(f):new Ty(f);for(let p of h.result.options)if(u=d.match(p.label)){let m=p.displayLabel?c?c(p,u.matched):[]:u.matched;s(new hh(p,h.source,m,u.score+(p.boost||0)))}}}if(i){let h=Object.create(null),c=0,f=(u,d)=>{var p,m;return((p=u.rank)!==null&&p!==void 0?p:1e9)-((m=d.rank)!==null&&m!==void 0?m:1e9)||(u.namef.score-c.score||a(c.completion,f.completion))){let c=h.completion;!l||l.label!=c.label||l.detail!=c.detail||l.type!=null&&c.type!=null&&l.type!=c.type||l.apply!=c.apply||l.boost!=c.boost?o.push(h):uh(h.completion)>uh(l)&&(o[o.length-1]=h),l=h.completion}return o}class li{constructor(e,t,i,s,r,o){this.options=e,this.attrs=t,this.tooltip=i,this.timestamp=s,this.selected=r,this.disabled=o}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new li(this.options,dh(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,i,s,r,o){if(s&&!o&&e.some(h=>h.isPending))return s.setDisabled();let l=Dy(e,t);if(!l.length)return s&&e.some(h=>h.isPending)?s.setDisabled():null;let a=t.facet(ce).selectOnOpen?0:-1;if(s&&s.selected!=a&&s.selected!=-1){let h=s.options[s.selected].completion;for(let c=0;cc.hasResult()?Math.min(h,c.from):h,1e8),create:Wy,above:r.aboveCursor},s?s.timestamp:Date.now(),a,!1)}map(e){return new li(this.options,this.attrs,{...this.tooltip,pos:e.mapPos(this.tooltip.pos)},this.timestamp,this.selected,this.disabled)}setDisabled(){return new li(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}}class Rs{constructor(e,t,i){this.active=e,this.id=t,this.open=i}static start(){return new Rs(By,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:t}=e,i=t.facet(ce),r=(i.override||t.languageDataAt("autocomplete",Ut(t)).map(vy)).map(a=>(this.active.find(c=>c.source==a)||new Ie(a,this.active.some(c=>c.state!=0)?1:0)).update(e,i));r.length==this.active.length&&r.every((a,h)=>a==this.active[h])&&(r=this.active);let o=this.open,l=e.effects.some(a=>a.is(ml));o&&e.docChanged&&(o=o.map(e.changes)),e.selection||r.some(a=>a.hasResult()&&e.changes.touchesRange(a.from,a.to))||!Ey(r,this.active)||l?o=li.build(r,t,this.id,o,i,l):o&&o.disabled&&!r.some(a=>a.isPending)&&(o=null),!o&&r.every(a=>!a.isPending)&&r.some(a=>a.hasResult())&&(r=r.map(a=>a.hasResult()?new Ie(a.source,0):a));for(let a of e.effects)a.is(zu)&&(o=o&&o.setSelected(a.value,this.id));return r==this.active&&o==this.open?this:new Rs(r,this.id,o)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?qy:$y}}function Ey(n,e){if(n==e)return!0;for(let t=0,i=0;;){for(;t-1&&(t["aria-activedescendant"]=n+"-"+e),t}const By=[];function Wu(n,e){if(n.isUserEvent("input.complete")){let i=n.annotation(pl);if(i&&e.activateOnCompletion(i))return 12}let t=n.isUserEvent("input.type");return t&&e.activateOnTyping?5:t?1:n.isUserEvent("delete.backward")?2:n.selection?8:n.docChanged?16:0}class Ie{constructor(e,t,i=!1){this.source=e,this.state=t,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,t){let i=Wu(e,t),s=this;(i&8||i&16&&this.touches(e))&&(s=new Ie(s.source,0)),i&4&&s.state==0&&(s=new Ie(this.source,1)),s=s.updateFor(e,i);for(let r of e.effects)if(r.is(Ms))s=new Ie(s.source,1,r.value);else if(r.is(on))s=new Ie(s.source,0);else if(r.is(ml))for(let o of r.value)o.source==s.source&&(s=o);return s}updateFor(e,t){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(Ut(e.state))}}class ui extends Ie{constructor(e,t,i,s,r,o){super(e,3,t),this.limit=i,this.result=s,this.from=r,this.to=o}hasResult(){return!0}updateFor(e,t){var i;if(!(t&3))return this.map(e.changes);let s=this.result;s.map&&!e.changes.empty&&(s=s.map(s,e.changes));let r=e.changes.mapPos(this.from),o=e.changes.mapPos(this.to,1),l=Ut(e.state);if(l>o||!s||t&2&&(Ut(e.startState)==this.from||lt.map(e))}}),zu=B.define(),Qe=ue.define({create(){return Rs.start()},update(n,e){return n.update(e)},provide:n=>[Yo.from(n,e=>e.tooltip),Q.contentAttributes.from(n,e=>e.attrs)]});function gl(n,e){const t=e.completion.apply||e.completion.label;let i=n.state.field(Qe).active.find(s=>s.source==e.source);return i instanceof ui?(typeof t=="string"?n.dispatch({...wy(n.state,t,i.from,i.to),annotations:pl.of(e.completion)}):t(n,e.completion,i.from,i.to),!0):!1}const Wy=My(Qe,gl);function _n(n,e="option"){return t=>{let i=t.state.field(Qe,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+s*(n?1:-1):n?0:o-1;return l<0?l=e=="page"?0:o-1:l>=o&&(l=e=="page"?o-1:0),t.dispatch({effects:zu.of(l)}),!0}}const zy=n=>{let e=n.state.field(Qe,!1);return n.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampn.state.field(Qe,!1)?(n.dispatch({effects:Ms.of(!0)}),!0):!1,Iy=n=>{let e=n.state.field(Qe,!1);return!e||!e.active.some(t=>t.state!=0)?!1:(n.dispatch({effects:on.of(null)}),!0)};class Vy{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}}const Ny=50,Fy=1e3,Xy=le.fromClass(class{constructor(n){this.view=n,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of n.state.field(Qe).active)e.isPending&&this.startQuery(e)}update(n){let e=n.state.field(Qe),t=n.state.facet(ce);if(!n.selectionSet&&!n.docChanged&&n.startState.field(Qe)==e)return;let i=n.transactions.some(r=>{let o=Wu(r,t);return o&8||(r.selection||r.docChanged)&&!(o&3)});for(let r=0;rNy&&Date.now()-o.time>Fy){for(let l of o.context.abortListeners)try{l()}catch(a){Ae(this.view.state,a)}o.context.abortListeners=null,this.running.splice(r--,1)}else o.updates.push(...n.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),n.transactions.some(r=>r.effects.some(o=>o.is(Ms)))&&(this.pendingStart=!0);let s=this.pendingStart?50:t.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(r=>r.isPending&&!this.running.some(o=>o.active.source==r.source))?setTimeout(()=>this.startUpdate(),s):-1,this.composing!=0)for(let r of n.transactions)r.isUserEvent("input.type")?this.composing=2:this.composing==2&&r.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:n}=this.view,e=n.field(Qe);for(let t of e.active)t.isPending&&!this.running.some(i=>i.active.source==t.source)&&this.startQuery(t);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(ce).updateSyncTime))}startQuery(n){let{state:e}=this.view,t=Ut(e),i=new $u(e,t,n.explicit,this.view),s=new Vy(n,i);this.running.push(s),Promise.resolve(n.source(i)).then(r=>{s.context.aborted||(s.done=r||null,this.scheduleAccept())},r=>{this.view.dispatch({effects:on.of(null)}),Ae(this.view.state,r)})}scheduleAccept(){this.running.every(n=>n.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(ce).updateSyncTime))}accept(){var n;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],t=this.view.state.facet(ce),i=this.view.state.field(Qe);for(let s=0;sl.source==r.active.source);if(o&&o.isPending)if(r.done==null){let l=new Ie(r.active.source,0);for(let a of r.updates)l=l.update(a,t);l.isPending||e.push(l)}else this.startQuery(o)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:ml.of(e)})}},{eventHandlers:{blur(n){let e=this.view.state.field(Qe,!1);if(e&&e.tooltip&&this.view.state.facet(ce).closeOnBlur){let t=e.open&&mf(this.view,e.open.tooltip);(!t||!t.dom.contains(n.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:on.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:Ms.of(!1)}),20),this.composing=0}}}),_y=typeof navigator=="object"&&/Win/.test(navigator.platform),Uy=Et.highest(Q.domEventHandlers({keydown(n,e){let t=e.state.field(Qe,!1);if(!t||!t.open||t.open.disabled||t.open.selected<0||n.key.length>1||n.ctrlKey&&!(_y&&n.altKey)||n.metaKey)return!1;let i=t.open.options[t.open.selected],s=t.active.find(o=>o.source==i.source),r=i.completion.commitCharacters||s.result.commitCharacters;return r&&r.indexOf(n.key)>-1&&gl(e,i),!1}})),Iu=Q.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class Hy{constructor(e,t,i,s){this.field=e,this.line=t,this.from=i,this.to=s}}class Ol{constructor(e,t,i){this.field=e,this.from=t,this.to=i}map(e){let t=e.mapPos(this.from,-1,ge.TrackDel),i=e.mapPos(this.to,1,ge.TrackDel);return t==null||i==null?null:new Ol(this.field,t,i)}}class yl{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let i=[],s=[t],r=e.doc.lineAt(t),o=/^\s*/.exec(r.text)[0];for(let a of this.lines){if(i.length){let h=o,c=/^\t*/.exec(a)[0].length;for(let f=0;fnew Ol(a.field,s[a.line]+a.from,s[a.line]+a.to));return{text:i,ranges:l}}static parse(e){let t=[],i=[],s=[],r;for(let o of e.split(/\r\n?|\n/)){for(;r=/[#$]\{(?:(\d+)(?::([^{}]*))?|((?:\\[{}]|[^{}])*))\}/.exec(o);){let l=r[1]?+r[1]:null,a=r[2]||r[3]||"",h=-1,c=a.replace(/\\[{}]/g,f=>f[1]);for(let f=0;f=h&&u.field++}for(let f of s)if(f.line==i.length&&f.from>r.index){let u=r[2]?3+(r[1]||"").length:2;f.from-=u,f.to-=u}s.push(new Hy(h,i.length,r.index,r.index+c.length)),o=o.slice(0,r.index)+a+o.slice(r.index+r[0].length)}o=o.replace(/\\([{}])/g,(l,a,h)=>{for(let c of s)c.line==i.length&&c.from>h&&(c.from--,c.to--);return a}),i.push(o)}return new yl(i,s)}}let jy=D.widget({widget:new class extends xt{toDOM(){let n=document.createElement("span");return n.className="cm-snippetFieldPosition",n}ignoreEvent(){return!1}}}),Gy=D.mark({class:"cm-snippetField"});class Pi{constructor(e,t){this.ranges=e,this.active=t,this.deco=D.set(e.map(i=>(i.from==i.to?jy:Gy).range(i.from,i.to)),!0)}map(e){let t=[];for(let i of this.ranges){let s=i.map(e);if(!s)return null;t.push(s)}return new Pi(t,this.active)}selectionInsideField(e){return e.ranges.every(t=>this.ranges.some(i=>i.field==this.active&&i.from<=t.from&&i.to>=t.to))}}const bn=B.define({map(n,e){return n&&n.map(e)}}),Zy=B.define(),ln=ue.define({create(){return null},update(n,e){for(let t of e.effects){if(t.is(bn))return t.value;if(t.is(Zy)&&n)return new Pi(n.ranges,t.value)}return n&&e.docChanged&&(n=n.map(e.changes)),n&&e.selection&&!n.selectionInsideField(e.selection)&&(n=null),n},provide:n=>Q.decorations.from(n,e=>e?e.deco:D.none)});function bl(n,e){return b.create(n.filter(t=>t.field==e).map(t=>b.range(t.from,t.to)))}function Yy(n){let e=yl.parse(n);return(t,i,s,r)=>{let{text:o,ranges:l}=e.instantiate(t.state,s),{main:a}=t.state.selection,h={changes:{from:s,to:r==a.from?a.to:r,insert:V.of(o)},scrollIntoView:!0,annotations:i?[pl.of(i),oe.userEvent.of("input.complete")]:void 0};if(l.length&&(h.selection=bl(l,0)),l.some(c=>c.field>0)){let c=new Pi(l,0),f=h.effects=[bn.of(c)];t.state.field(ln,!1)===void 0&&f.push(B.appendConfig.of([ln,i1,n1,Iu]))}t.dispatch(t.state.update(h))}}function Vu(n){return({state:e,dispatch:t})=>{let i=e.field(ln,!1);if(!i||n<0&&i.active==0)return!1;let s=i.active+n,r=n>0&&!i.ranges.some(o=>o.field==s+n);return t(e.update({selection:bl(i.ranges,s),effects:bn.of(r?null:new Pi(i.ranges,s)),scrollIntoView:!0})),!0}}const Ky=({state:n,dispatch:e})=>n.field(ln,!1)?(e(n.update({effects:bn.of(null)})),!0):!1,Jy=Vu(1),e1=Vu(-1),t1=[{key:"Tab",run:Jy,shift:e1},{key:"Escape",run:Ky}],ph=M.define({combine(n){return n.length?n[0]:t1}}),i1=Et.highest(zs.compute([ph],n=>n.facet(ph)));function at(n,e){return{...e,apply:Yy(n)}}const n1=Q.domEventHandlers({mousedown(n,e){let t=e.state.field(ln,!1),i;if(!t||(i=e.posAtCoords({x:n.clientX,y:n.clientY}))==null)return!1;let s=t.ranges.find(r=>r.from<=i&&r.to>=i);return!s||s.field==t.active?!1:(e.dispatch({selection:bl(t.ranges,s.field),effects:bn.of(t.ranges.some(r=>r.field>s.field)?new Pi(t.ranges,s.field):null),scrollIntoView:!0}),!0)}}),an={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Xt=B.define({map(n,e){let t=e.mapPos(n,-1,ge.TrackAfter);return t??void 0}}),xl=new class extends Ht{};xl.startSide=1;xl.endSide=-1;const Nu=ue.define({create(){return F.empty},update(n,e){if(n=n.map(e.changes),e.selection){let t=e.state.doc.lineAt(e.selection.main.head);n=n.update({filter:i=>i>=t.from&&i<=t.to})}for(let t of e.effects)t.is(Xt)&&(n=n.update({add:[xl.range(t.value,t.value+1)]}));return n}});function s1(){return[o1,Nu]}const Tr="()[]{}<>«»»«[]{}";function Fu(n){for(let e=0;e{if((r1?n.composing:n.compositionStarted)||n.state.readOnly)return!1;let s=n.state.selection.main;if(i.length>2||i.length==2&&Ke(Ce(i,0))==1||e!=s.from||t!=s.to)return!1;let r=h1(n.state,i);return r?(n.dispatch(r),!0):!1}),l1=({state:n,dispatch:e})=>{if(n.readOnly)return!1;let i=Xu(n,n.selection.main.head).brackets||an.brackets,s=null,r=n.changeByRange(o=>{if(o.empty){let l=c1(n.doc,o.head);for(let a of i)if(a==l&&Gs(n.doc,o.head)==Fu(Ce(a,0)))return{changes:{from:o.head-a.length,to:o.head+a.length},range:b.cursor(o.head-a.length)}}return{range:s=o}});return s||e(n.update(r,{scrollIntoView:!0,userEvent:"delete.backward"})),!s},a1=[{key:"Backspace",run:l1}];function h1(n,e){let t=Xu(n,n.selection.main.head),i=t.brackets||an.brackets;for(let s of i){let r=Fu(Ce(s,0));if(e==s)return r==s?d1(n,s,i.indexOf(s+s+s)>-1,t):f1(n,s,r,t.before||an.before);if(e==r&&_u(n,n.selection.main.from))return u1(n,s,r)}return null}function _u(n,e){let t=!1;return n.field(Nu).between(0,n.doc.length,i=>{i==e&&(t=!0)}),t}function Gs(n,e){let t=n.sliceString(e,e+2);return t.slice(0,Ke(Ce(t,0)))}function c1(n,e){let t=n.sliceString(e-2,e);return Ke(Ce(t,0))==t.length?t:t.slice(1)}function f1(n,e,t,i){let s=null,r=n.changeByRange(o=>{if(!o.empty)return{changes:[{insert:e,from:o.from},{insert:t,from:o.to}],effects:Xt.of(o.to+e.length),range:b.range(o.anchor+e.length,o.head+e.length)};let l=Gs(n.doc,o.head);return!l||/\s/.test(l)||i.indexOf(l)>-1?{changes:{insert:e+t,from:o.head},effects:Xt.of(o.head+e.length),range:b.cursor(o.head+e.length)}:{range:s=o}});return s?null:n.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function u1(n,e,t){let i=null,s=n.changeByRange(r=>r.empty&&Gs(n.doc,r.head)==t?{changes:{from:r.head,to:r.head+t.length,insert:t},range:b.cursor(r.head+t.length)}:i={range:r});return i?null:n.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function d1(n,e,t,i){let s=i.stringPrefixes||an.stringPrefixes,r=null,o=n.changeByRange(l=>{if(!l.empty)return{changes:[{insert:e,from:l.from},{insert:e,from:l.to}],effects:Xt.of(l.to+e.length),range:b.range(l.anchor+e.length,l.head+e.length)};let a=l.head,h=Gs(n.doc,a),c;if(h==e){if(mh(n,a))return{changes:{insert:e+e,from:a},effects:Xt.of(a+e.length),range:b.cursor(a+e.length)};if(_u(n,a)){let u=t&&n.sliceDoc(a,a+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:a,to:a+u.length,insert:u},range:b.cursor(a+u.length)}}}else{if(t&&n.sliceDoc(a-2*e.length,a)==e+e&&(c=gh(n,a-2*e.length,s))>-1&&mh(n,c))return{changes:{insert:e+e+e+e,from:a},effects:Xt.of(a+e.length),range:b.cursor(a+e.length)};if(n.charCategorizer(a)(h)!=Y.Word&&gh(n,a,s)>-1&&!p1(n,a,e,s))return{changes:{insert:e+e,from:a},effects:Xt.of(a+e.length),range:b.cursor(a+e.length)}}return{range:r=l}});return r?null:n.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function mh(n,e){let t=fe(n).resolveInner(e+1);return t.parent&&t.from==e}function p1(n,e,t,i){let s=fe(n).resolveInner(e,-1),r=i.reduce((o,l)=>Math.max(o,l.length),0);for(let o=0;o<5;o++){let l=n.sliceDoc(s.from,Math.min(s.to,s.from+t.length+r)),a=l.indexOf(t);if(!a||a>-1&&i.indexOf(l.slice(0,a))>-1){let c=s.firstChild;for(;c&&c.from==s.from&&c.to-c.from>t.length+a;){if(n.sliceDoc(c.to-t.length,c.to)==t)return!1;c=c.firstChild}return!0}let h=s.to==e&&s.parent;if(!h)break;s=h}return!1}function gh(n,e,t){let i=n.charCategorizer(e);if(i(n.sliceDoc(e-1,e))!=Y.Word)return e;for(let s of t){let r=e-s.length;if(n.sliceDoc(r,e)==s&&i(n.sliceDoc(r-1,r))!=Y.Word)return r}return-1}function Ro(n={}){return[Uy,Qe,ce.of(n),Xy,m1,Iu]}const Uu=[{key:"Ctrl-Space",run:vr},{mac:"Alt-`",run:vr},{mac:"Alt-i",run:vr},{key:"Escape",run:Iy},{key:"ArrowDown",run:_n(!0)},{key:"ArrowUp",run:_n(!1)},{key:"PageDown",run:_n(!0,"page")},{key:"PageUp",run:_n(!1,"page")},{key:"Enter",run:zy}],m1=Et.highest(zs.computeN([ce],n=>n.facet(ce).defaultKeymap?[Uu]:[]));function et(){var n=arguments[0];typeof n=="string"&&(n=document.createElement(n));var e=1,t=arguments[1];if(t&&typeof t=="object"&&t.nodeType==null&&!Array.isArray(t)){for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)){var s=t[i];typeof s=="string"?n.setAttribute(i,s):s!=null&&(n[i]=s)}e++}for(;ec.from-f.from||c.to-f.to),o=new gt,l=[],a=0;for(let c=0;;){let f=c==r.length?null:r[c];if(!f&&!l.length)break;let u,d;for(l.length?(u=a,d=l.reduce((m,g)=>Math.min(m,g.to),f&&f.from>u?f.from:1e8)):(u=f.from,d=f.to,l.push(f),c++);cm.from||m.to==u))l.push(m),c++,d=Math.min(m.to,d);else{d=Math.min(m.from,d);break}}let p=Q1(l);if(l.some(m=>m.from==m.to||m.from==m.to-1&&i.doc.lineAt(m.from).to==m.from))o.add(u,u,D.widget({widget:new v1(p),diagnostics:l.slice()}));else{let m=l.reduce((g,y)=>y.markClass?g+" "+y.markClass:g,"");o.add(u,d,D.mark({class:"cm-lintRange cm-lintRange-"+p+m,diagnostics:l.slice(),inclusiveEnd:l.some(g=>g.to>d)}))}a=d;for(let m=0;m{if(!(e&&o.diagnostics.indexOf(e)<0))if(!i)i=new Oh(s,r,e||o.diagnostics[0]);else{if(o.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new Oh(i.from,r,i.diagnostic)}}),i}function g1(n,e){let t=e.pos,i=e.end||t,s=n.state.facet(hn).hideOn(n,t,i);if(s!=null)return s;let r=n.startState.doc.lineAt(e.pos);return!!(n.effects.some(o=>o.is(ju))||n.changes.touchesRange(r.from,Math.max(r.to,i)))}function O1(n,e){return n.field($e,!1)?e:e.concat(B.appendConfig.of(A1))}const ju=B.define(),Sl=B.define(),Gu=B.define(),$e=ue.define({create(){return new Vt(D.none,null,null)},update(n,e){if(e.docChanged&&n.diagnostics.size){let t=n.diagnostics.map(e.changes),i=null,s=n.panel;if(n.selected){let r=e.changes.mapPos(n.selected.from,1);i=ki(t,n.selected.diagnostic,r)||ki(t,null,r)}!t.size&&s&&e.state.facet(hn).autoPanel&&(s=null),n=new Vt(t,s,i)}for(let t of e.effects)if(t.is(ju)){let i=e.state.facet(hn).autoPanel?t.value.length?cn.open:null:n.panel;n=Vt.init(t.value,i,e.state)}else t.is(Sl)?n=new Vt(n.diagnostics,t.value?cn.open:null,n.selected):t.is(Gu)&&(n=new Vt(n.diagnostics,n.panel,t.value));return n},provide:n=>[en.from(n,e=>e.panel),Q.decorations.from(n,e=>e.diagnostics)]}),y1=D.mark({class:"cm-lintRange cm-lintRange-active"});function b1(n,e,t){let{diagnostics:i}=n.state.field($e),s,r=-1,o=-1;i.between(e-(t<0?1:0),e+(t>0?1:0),(a,h,{spec:c})=>{if(e>=a&&e<=h&&(a==h||(e>a||t>0)&&(eYu(n,t,!1)))}const S1=n=>{let e=n.state.field($e,!1);(!e||!e.panel)&&n.dispatch({effects:O1(n.state,[Sl.of(!0)])});let t=Ji(n,cn.open);return t&&t.dom.querySelector(".cm-panel-lint ul").focus(),!0},yh=n=>{let e=n.state.field($e,!1);return!e||!e.panel?!1:(n.dispatch({effects:Sl.of(!1)}),!0)},k1=n=>{let e=n.state.field($e,!1);if(!e)return!1;let t=n.state.selection.main,i=e.diagnostics.iter(t.to+1);return!i.value&&(i=e.diagnostics.iter(0),!i.value||i.from==t.from&&i.to==t.to)?!1:(n.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)},w1=[{key:"Mod-Shift-m",run:S1,preventDefault:!0},{key:"F8",run:k1}],hn=M.define({combine(n){return Object.assign({sources:n.map(e=>e.source).filter(e=>e!=null)},ot(n.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{needsRefresh:(e,t)=>e?t?i=>e(i)||t(i):e:t}))}});function Zu(n){let e=[];if(n)e:for(let{name:t}of n){for(let i=0;ir.toLowerCase()==s.toLowerCase())){e.push(s);continue e}}e.push("")}return e}function Yu(n,e,t){var i;let s=t?Zu(e.actions):[];return et("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},et("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(n):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((r,o)=>{let l=!1,a=u=>{if(u.preventDefault(),l)return;l=!0;let d=ki(n.state.field($e).diagnostics,e);d&&r.apply(n,d.from,d.to)},{name:h}=r,c=s[o]?h.indexOf(s[o]):-1,f=c<0?h:[h.slice(0,c),et("u",h.slice(c,c+1)),h.slice(c+1)];return et("button",{type:"button",class:"cm-diagnosticAction",onclick:a,onmousedown:a,"aria-label":` Action: ${h}${c<0?"":` (access key "${s[o]})"`}.`},f)}),e.source&&et("div",{class:"cm-diagnosticSource"},e.source))}class v1 extends xt{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return et("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}}class bh{constructor(e,t){this.diagnostic=t,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=Yu(e,t,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class cn{constructor(e){this.view=e,this.items=[];let t=s=>{if(s.keyCode==27)yh(this.view),this.view.focus();else if(s.keyCode==38||s.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(s.keyCode==40||s.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(s.keyCode==36)this.moveSelection(0);else if(s.keyCode==35)this.moveSelection(this.items.length-1);else if(s.keyCode==13)this.view.focus();else if(s.keyCode>=65&&s.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:r}=this.items[this.selectedIndex],o=Zu(r.actions);for(let l=0;l{for(let r=0;ryh(this.view)},"×")),this.update()}get selectedIndex(){let e=this.view.state.field($e).selected;if(!e)return-1;for(let t=0;t{for(let c of h.diagnostics){if(o.has(c))continue;o.add(c);let f=-1,u;for(let d=i;di&&(this.items.splice(i,f-i),s=!0)),t&&u.diagnostic==t.diagnostic?u.dom.hasAttribute("aria-selected")||(u.dom.setAttribute("aria-selected","true"),r=u):u.dom.hasAttribute("aria-selected")&&u.dom.removeAttribute("aria-selected"),i++}});i({sel:r.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:l,panel:a})=>{let h=a.height/this.list.offsetHeight;l.topa.bottom&&(this.list.scrollTop+=(l.bottom-a.bottom)/h)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),s&&this.sync()}sync(){let e=this.list.firstChild;function t(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)t();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)t()}moveSelection(e){if(this.selectedIndex<0)return;let t=this.view.state.field($e),i=ki(t.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:Gu.of(i)})}static open(e){return new cn(e)}}function T1(n,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(n)}')`}function Un(n){return T1(``,'width="6" height="3"')}const C1=Q.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:Un("#d11")},".cm-lintRange-warning":{backgroundImage:Un("orange")},".cm-lintRange-info":{backgroundImage:Un("#999")},".cm-lintRange-hint":{backgroundImage:Un("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}});function P1(n){return n=="error"?4:n=="warning"?3:n=="info"?2:1}function Q1(n){let e="hint",t=1;for(let i of n){let s=P1(i.severity);s>t&&(t=s,e=i.severity)}return e}const A1=[$e,Q.decorations.compute([$e],n=>{let{selected:e,panel:t}=n.field($e);return!e||!t||e.from==e.to?D.none:D.set([y1.range(e.from,e.to)])}),hg(b1,{hideOn:g1}),C1],xh=[xg(),wg(),Im(),XO(),dO(),Am(),qm(),I.allowMultipleSelections.of(!0),Jg(),zf(OO,{fallback:!0}),vO(),s1(),Ro(),Km(),tg(),Um(),K0(),zs.of([...a1,...U0,...Oy,...JO,...hO,...Uu,...w1])],M1="#e5c07b",Sh="#e06c75",R1="#56b6c2",D1="#ffffff",rs="#abb2bf",Do="#7d8799",E1="#61afef",q1="#98c379",kh="#d19a66",$1="#c678dd",B1="#21252b",wh="#2c313a",vh="#282c34",Cr="#353a42",L1="#3E4451",Th="#528bff",W1=Q.theme({"&":{color:rs,backgroundColor:vh},".cm-content":{caretColor:Th},".cm-cursor, .cm-dropCursor":{borderLeftColor:Th},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:L1},".cm-panels":{backgroundColor:B1,color:rs},".cm-panels.cm-panels-top":{borderBottom:"2px solid black"},".cm-panels.cm-panels-bottom":{borderTop:"2px solid black"},".cm-searchMatch":{backgroundColor:"#72a1ff59",outline:"1px solid #457dff"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"#6199ff2f"},".cm-activeLine":{backgroundColor:"#6699ff0b"},".cm-selectionMatch":{backgroundColor:"#aafe661a"},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bad0f847"},".cm-gutters":{backgroundColor:vh,color:Do,border:"none"},".cm-activeLineGutter":{backgroundColor:wh},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:Cr},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:Cr,borderBottomColor:Cr},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:wh,color:rs}}},{dark:!0}),z1=gn.define([{tag:O.keyword,color:$1},{tag:[O.name,O.deleted,O.character,O.propertyName,O.macroName],color:Sh},{tag:[O.function(O.variableName),O.labelName],color:E1},{tag:[O.color,O.constant(O.name),O.standard(O.name)],color:kh},{tag:[O.definition(O.name),O.separator],color:rs},{tag:[O.typeName,O.className,O.number,O.changed,O.annotation,O.modifier,O.self,O.namespace],color:M1},{tag:[O.operator,O.operatorKeyword,O.url,O.escape,O.regexp,O.link,O.special(O.string)],color:R1},{tag:[O.meta,O.comment],color:Do},{tag:O.strong,fontWeight:"bold"},{tag:O.emphasis,fontStyle:"italic"},{tag:O.strikethrough,textDecoration:"line-through"},{tag:O.link,color:Do,textDecoration:"underline"},{tag:O.heading,fontWeight:"bold",color:Sh},{tag:[O.atom,O.bool,O.special(O.variableName)],color:kh},{tag:[O.processingInstruction,O.string,O.inserted],color:q1},{tag:O.invalid,color:D1}]),I1=[W1,zf(z1)];var Ch={};class Ds{constructor(e,t,i,s,r,o,l,a,h,c=0,f){this.p=e,this.stack=t,this.state=i,this.reducePos=s,this.pos=r,this.score=o,this.buffer=l,this.bufferBase=a,this.curContext=h,this.lookAhead=c,this.parent=f}toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,i=0){let s=e.parser.context;return new Ds(e,[],t,i,i,0,[],0,s?new Ph(s,s.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let i=e>>19,s=e&65535,{parser:r}=this.p,o=this.reducePos=2e3&&!(!((t=this.p.parser.nodeSet.types[s])===null||t===void 0)&&t.isAnonymous)&&(h==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=c):this.p.lastBigReductionSizea;)this.stack.pop();this.reduceContext(s,h)}storeNode(e,t,i,s=4,r=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&o.buffer[l-4]==0&&o.buffer[l-1]>-1){if(t==i)return;if(o.buffer[l-2]>=t){o.buffer[l-2]=i;return}}}if(!r||this.pos==i)this.buffer.push(e,t,i,s);else{let o=this.buffer.length;if(o>0&&this.buffer[o-4]!=0){let l=!1;for(let a=o;a>0&&this.buffer[a-2]>i;a-=4)if(this.buffer[a-1]>=0){l=!0;break}if(l)for(;o>0&&this.buffer[o-2]>i;)this.buffer[o]=this.buffer[o-4],this.buffer[o+1]=this.buffer[o-3],this.buffer[o+2]=this.buffer[o-2],this.buffer[o+3]=this.buffer[o-1],o-=4,s>4&&(s-=4)}this.buffer[o]=e,this.buffer[o+1]=t,this.buffer[o+2]=i,this.buffer[o+3]=s}}shift(e,t,i,s){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let r=e,{parser:o}=this.p;(s>this.pos||t<=o.maxNode)&&(this.pos=s,o.stateFlag(r,1)||(this.reducePos=s)),this.pushState(r,i),this.shiftContext(t,i),t<=o.maxNode&&this.buffer.push(t,i,s,4)}else this.pos=s,this.shiftContext(t,i),t<=this.p.parser.maxNode&&this.buffer.push(t,i,s,4)}apply(e,t,i,s){e&65536?this.reduce(e):this.shift(e,t,i,s)}useNode(e,t){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let s=this.pos;this.reducePos=this.pos=s+e.length,this.pushState(t,s),this.buffer.push(i,s,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(;t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let i=e.buffer.slice(t),s=e.bufferBase+t;for(;e&&s==e.bufferBase;)e=e.parent;return new Ds(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,s,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,i?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new V1(this);;){let i=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(i==0)return!1;if((i&65536)==0)return!0;t.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let s=[];for(let r=0,o;ra&1&&l==o)||s.push(t[r],o)}t=s}let i=[];for(let s=0;s>19,s=t&65535,r=this.stack.length-i*3;if(r<0||e.getGoto(this.stack[r],s,!1)<0){let o=this.findForcedReduction();if(o==null)return!1;t=o}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],i=(s,r)=>{if(!t.includes(s))return t.push(s),e.allActions(s,o=>{if(!(o&393216))if(o&65536){let l=(o>>19)-r;if(l>1){let a=o&65535,h=this.stack.length-l*3;if(h>=0&&e.getGoto(this.stack[h],a,!1)>=0)return l<<19|65536|a}}else{let l=i(o,r+1);if(l!=null)return l}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;tthis.lookAhead&&(this.emitLookAhead(),this.lookAhead=e)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}}class Ph{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}}class V1{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let s=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=s}}class Es{constructor(e,t,i){this.stack=e,this.pos=t,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new Es(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new Es(this.stack,this.pos,this.index)}}function Hn(n,e=Uint16Array){if(typeof n!="string")return n;let t=null;for(let i=0,s=0;i=92&&o--,o>=34&&o--;let a=o-32;if(a>=46&&(a-=46,l=!0),r+=a,l)break;r*=46}t?t[s++]=r:t=new e(r)}return t}class os{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Qh=new os;class N1{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Qh,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let i=this.range,s=this.rangeIndex,r=this.pos+e;for(;ri.to:r>=i.to;){if(s==this.ranges.length-1)return null;let o=this.ranges[++s];r+=o.from-i.to,i=o}return r}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t=this.chunkOff+e,i,s;if(t>=0&&t=this.chunk2Pos&&il.to&&(this.chunk2=this.chunk2.slice(0,l.to-i)),s=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),s}acceptToken(e,t=0){let i=t?this.resolveOffset(t,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=Qh,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let i="";for(let s of this.ranges){if(s.from>=t)break;s.to>e&&(i+=this.input.read(Math.max(s.from,e),Math.min(s.to,t)))}return i}}class di{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:i}=t.p;F1(this.data,e,t,this.id,i.data,i.tokenPrecTable)}}di.prototype.contextual=di.prototype.fallback=di.prototype.extend=!1;di.prototype.fallback=di.prototype.extend=!1;class Zs{constructor(e,t={}){this.token=e,this.contextual=!!t.contextual,this.fallback=!!t.fallback,this.extend=!!t.extend}}function F1(n,e,t,i,s,r){let o=0,l=1<0){let p=n[d];if(a.allows(p)&&(e.token.value==-1||e.token.value==p||X1(p,e.token.value,s,r))){e.acceptToken(p);break}}let c=e.next,f=0,u=n[o+2];if(e.next<0&&u>f&&n[h+u*3-3]==65535){o=n[h+u*3-1];continue e}for(;f>1,p=h+d+(d<<1),m=n[p],g=n[p+1]||65536;if(c=g)f=d+1;else{o=n[p+2],e.advance();continue e}}break}}function Ah(n,e,t){for(let i=e,s;(s=n[i])!=65535;i++)if(s==t)return i-e;return-1}function X1(n,e,t,i){let s=Ah(t,i,e);return s<0||Ah(t,i,n)e)&&!i.type.isError)return t<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(n.length,Math.max(i.from+1,e+25));if(t<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return t<0?0:n.length}}class _1{constructor(e,t){this.fragments=e,this.nodeSet=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?Mh(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?Mh(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=o,null;if(r instanceof U){if(o==e){if(o=Math.max(this.safeFrom,e)&&(this.trees.push(r),this.start.push(o),this.index.push(0))}else this.index[t]++,this.nextStart=o+r.length}}}class U1{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new os)}getActions(e){let t=0,i=null,{parser:s}=e.p,{tokenizers:r}=s,o=s.stateSlot(e.state,3),l=e.curContext?e.curContext.hash:0,a=0;for(let h=0;hf.end+25&&(a=Math.max(f.lookAhead,a)),f.value!=0)){let u=t;if(f.extended>-1&&(t=this.addActions(e,f.extended,f.end,t)),t=this.addActions(e,f.value,f.end,t),!c.extend&&(i=f,t>u))break}}for(;this.actions.length>t;)this.actions.pop();return a&&e.setLookAhead(a),!i&&e.pos==this.stream.end&&(i=new os,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,t=this.addActions(e,i.value,i.end,t)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new os,{pos:i,p:s}=e;return t.start=i,t.end=Math.min(i+1,s.stream.end),t.value=i==s.stream.end?s.parser.eofTerm:0,t}updateCachedToken(e,t,i){let s=this.stream.clipPos(i.pos);if(t.token(this.stream.reset(s,e),i),e.value>-1){let{parser:r}=i.p;for(let o=0;o=0&&i.p.parser.dialect.allows(l>>1)){(l&1)==0?e.value=l>>1:e.extended=l>>1;break}}}else e.value=0,e.end=this.stream.clipPos(s+1)}putAction(e,t,i,s){for(let r=0;re.bufferLength*4?new _1(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,t=this.minStackPos,i=this.stacks=[],s,r;if(this.bigReductionCount>300&&e.length==1){let[o]=e;for(;o.forceReduce()&&o.stack.length&&o.stack[o.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let o=0;ot)i.push(l);else{if(this.advanceStack(l,i,e))continue;{s||(s=[],r=[]),s.push(l);let a=this.tokens.getMainToken(l);r.push(a.value,a.end)}}break}}if(!i.length){let o=s&&Z1(s);if(o)return Ee&&console.log("Finish with "+this.stackID(o)),this.stackToTree(o);if(this.parser.strict)throw Ee&&s&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+t);this.recovering||(this.recovering=5)}if(this.recovering&&s){let o=this.stoppedAt!=null&&s[0].pos>this.stoppedAt?s[0]:this.runRecovery(s,r,i);if(o)return Ee&&console.log("Force-finish "+this.stackID(o)),this.stackToTree(o.forceAll())}if(this.recovering){let o=this.recovering==1?1:this.recovering*3;if(i.length>o)for(i.sort((l,a)=>a.score-l.score);i.length>o;)i.pop();i.some(l=>l.reducePos>t)&&this.recovering--}else if(i.length>1){e:for(let o=0;o500&&h.buffer.length>500)if((l.score-h.score||l.buffer.length-h.buffer.length)>0)i.splice(a--,1);else{i.splice(o--,1);continue e}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let o=1;o ":"";if(this.stoppedAt!=null&&s>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let h=e.curContext&&e.curContext.tracker.strict,c=h?e.curContext.hash:0;for(let f=this.fragments.nodeAt(s);f;){let u=this.parser.nodeSet.types[f.type.id]==f.type?r.getGoto(e.state,f.type.id):-1;if(u>-1&&f.length&&(!h||(f.prop(z.contextHash)||0)==c))return e.useNode(f,u),Ee&&console.log(o+this.stackID(e)+` (via reuse of ${r.getName(f.type.id)})`),!0;if(!(f instanceof U)||f.children.length==0||f.positions[0]>0)break;let d=f.children[0];if(d instanceof U&&f.positions[0]==0)f=d;else break}}let l=r.stateSlot(e.state,4);if(l>0)return e.reduce(l),Ee&&console.log(o+this.stackID(e)+` (via always-reduce ${r.getName(l&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let a=this.tokens.getActions(e);for(let h=0;hs?t.push(p):i.push(p)}return!1}advanceFully(e,t){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return Rh(e,t),!0}}runRecovery(e,t,i){let s=null,r=!1;for(let o=0;o ":"";if(l.deadEnd&&(r||(r=!0,l.restart(),Ee&&console.log(c+this.stackID(l)+" (restarted)"),this.advanceFully(l,i))))continue;let f=l.split(),u=c;for(let d=0;f.forceReduce()&&d<10&&(Ee&&console.log(u+this.stackID(f)+" (via force-reduce)"),!this.advanceFully(f,i));d++)Ee&&(u=this.stackID(f)+" -> ");for(let d of l.recoverByInsert(a))Ee&&console.log(c+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>l.pos?(h==l.pos&&(h++,a=0),l.recoverByDelete(a,h),Ee&&console.log(c+this.stackID(l)+` (via recover-delete ${this.parser.getName(a)})`),Rh(l,i)):(!s||s.scoren;class G1{constructor(e){this.start=e.start,this.shift=e.shift||Qr,this.reduce=e.reduce||Qr,this.reuse=e.reuse||Qr,this.hash=e.hash||(()=>0),this.strict=e.strict!==!1}}class qs extends tl{constructor(e){if(super(),this.wrappers=[],e.version!=14)throw new RangeError(`Parser version (${e.version}) doesn't match runtime version (14)`);let t=e.nodeNames.split(" ");this.minRepeatTerm=t.length;for(let l=0;le.topRules[l][1]),s=[];for(let l=0;l=0)r(c,a,l[h++]);else{let f=l[h+-c];for(let u=-c;u>0;u--)r(l[h++],a,f);h++}}}this.nodeSet=new Vs(t.map((l,a)=>Te.define({name:a>=this.minRepeatTerm?void 0:l,id:a,props:s[a],top:i.indexOf(a)>-1,error:a==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(a)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=bf;let o=Hn(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let l=0;ltypeof l=="number"?new di(o,l):l),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,i){let s=new H1(this,e,t,i);for(let r of this.wrappers)s=r(s,e,t,i);return s}getGoto(e,t,i=!1){let s=this.goto;if(t>=s[0])return-1;for(let r=s[t+1];;){let o=s[r++],l=o&1,a=s[r++];if(l&&i)return a;for(let h=r+(o>>1);r0}validAction(e,t){return!!this.allActions(e,i=>i==t?!0:null)}allActions(e,t){let i=this.stateSlot(e,4),s=i?t(i):void 0;for(let r=this.stateSlot(e,1);s==null;r+=3){if(this.data[r]==65535)if(this.data[r+1]==1)r=dt(this.data,r+2);else break;s=t(dt(this.data,r+1))}return s}nextStates(e){let t=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=dt(this.data,i+2);else break;if((this.data[i+2]&1)==0){let s=this.data[i+1];t.some((r,o)=>o&1&&r==s)||t.push(this.data[i],s)}}return t}configure(e){let t=Object.assign(Object.create(qs.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=i}return e.tokenizers&&(t.tokenizers=this.tokenizers.map(i=>{let s=e.tokenizers.find(r=>r.from==i);return s?s.to:i})),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map((i,s)=>{let r=e.specializers.find(l=>l.from==i.external);if(!r)return i;let o=Object.assign(Object.assign({},i),{external:r.to});return t.specializers[s]=Dh(o),o})),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),e.bufferLength!=null&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return t==null?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),i=t.map(()=>!1);if(e)for(let r of e.split(" ")){let o=t.indexOf(r);o>=0&&(i[o]=!0)}let s=null;for(let r=0;ri)&&t.p.parser.stateFlag(t.state,2)&&(!e||e.scoren.external(t,i)<<1|e}return n.get}const Y1=1,Ku=194,Ju=195,K1=196,Eh=197,J1=198,eb=199,tb=200,ib=2,ed=3,qh=201,nb=24,sb=25,rb=49,ob=50,lb=55,ab=56,hb=57,cb=59,fb=60,ub=61,db=62,pb=63,mb=65,gb=238,Ob=71,yb=241,bb=242,xb=243,Sb=244,kb=245,wb=246,vb=247,Tb=248,td=72,Cb=249,Pb=250,Qb=251,Ab=252,Mb=253,Rb=254,Db=255,Eb=256,qb=73,$b=77,Bb=263,Lb=112,Wb=130,zb=151,Ib=152,Vb=155,Jt=10,fn=13,kl=32,Ys=9,wl=35,Nb=40,Fb=46,Eo=123,$h=125,id=39,nd=34,Bh=92,Xb=111,_b=120,Ub=78,Hb=117,jb=85,Gb=new Set([sb,rb,ob,Bb,mb,Wb,ab,hb,gb,db,pb,td,qb,$b,fb,ub,zb,Ib,Vb,Lb]);function Ar(n){return n==Jt||n==fn}function Mr(n){return n>=48&&n<=57||n>=65&&n<=70||n>=97&&n<=102}const Zb=new Zs((n,e)=>{let t;if(n.next<0)n.acceptToken(eb);else if(e.context.flags&ls)Ar(n.next)&&n.acceptToken(J1,1);else if(((t=n.peek(-1))<0||Ar(t))&&e.canShift(Eh)){let i=0;for(;n.next==kl||n.next==Ys;)n.advance(),i++;(n.next==Jt||n.next==fn||n.next==wl)&&n.acceptToken(Eh,-i)}else Ar(n.next)&&n.acceptToken(K1,1)},{contextual:!0}),Yb=new Zs((n,e)=>{let t=e.context;if(t.flags)return;let i=n.peek(-1);if(i==Jt||i==fn){let s=0,r=0;for(;;){if(n.next==kl)s++;else if(n.next==Ys)s+=8-s%8;else break;n.advance(),r++}s!=t.indent&&n.next!=Jt&&n.next!=fn&&n.next!=wl&&(s[n,e|sd])),ex=new G1({start:Kb,reduce(n,e,t,i){return n.flags&ls&&Gb.has(e)||(e==Ob||e==td)&&n.flags&sd?n.parent:n},shift(n,e,t,i){return e==Ku?new as(n,Jb(i.read(i.pos,t.pos)),0):e==Ju?n.parent:e==nb||e==lb||e==cb||e==ed?new as(n,0,ls):Lh.has(e)?new as(n,0,Lh.get(e)|n.flags&ls):n},hash(n){return n.hash}}),tx=new Zs(n=>{for(let e=0;e<5;e++){if(n.next!="print".charCodeAt(e))return;n.advance()}if(!/\w/.test(String.fromCharCode(n.next)))for(let e=0;;e++){let t=n.peek(e);if(!(t==kl||t==Ys)){t!=Nb&&t!=Fb&&t!=Jt&&t!=fn&&t!=wl&&n.acceptToken(Y1);return}}}),ix=new Zs((n,e)=>{let{flags:t}=e.context,i=t&ht?nd:id,s=(t&ct)>0,r=!(t&ft),o=(t&ut)>0,l=n.pos;for(;!(n.next<0);)if(o&&n.next==Eo)if(n.peek(1)==Eo)n.advance(2);else{if(n.pos==l){n.acceptToken(ed,1);return}break}else if(r&&n.next==Bh){if(n.pos==l){n.advance();let a=n.next;a>=0&&(n.advance(),nx(n,a)),n.acceptToken(ib);return}break}else if(n.next==Bh&&!r&&n.peek(1)>-1)n.advance(2);else if(n.next==i&&(!s||n.peek(1)==i&&n.peek(2)==i)){if(n.pos==l){n.acceptToken(qh,s?3:1);return}break}else if(n.next==Jt){if(s)n.advance();else if(n.pos==l){n.acceptToken(qh);return}break}else n.advance();n.pos>l&&n.acceptToken(tb)});function nx(n,e){if(e==Xb)for(let t=0;t<2&&n.next>=48&&n.next<=55;t++)n.advance();else if(e==_b)for(let t=0;t<2&&Mr(n.next);t++)n.advance();else if(e==Hb)for(let t=0;t<4&&Mr(n.next);t++)n.advance();else if(e==jb)for(let t=0;t<8&&Mr(n.next);t++)n.advance();else if(e==Ub&&n.next==Eo){for(n.advance();n.next>=0&&n.next!=$h&&n.next!=id&&n.next!=nd&&n.next!=Jt;)n.advance();n.next==$h&&n.advance()}}const sx=wf({'async "*" "**" FormatConversion FormatSpec':O.modifier,"for while if elif else try except finally return raise break continue with pass assert await yield match case":O.controlKeyword,"in not and or is del":O.operatorKeyword,"from def class global nonlocal lambda":O.definitionKeyword,import:O.moduleKeyword,"with as print":O.keyword,Boolean:O.bool,None:O.null,VariableName:O.variableName,"CallExpression/VariableName":O.function(O.variableName),"FunctionDefinition/VariableName":O.function(O.definition(O.variableName)),"ClassDefinition/VariableName":O.definition(O.className),PropertyName:O.propertyName,"CallExpression/MemberExpression/PropertyName":O.function(O.propertyName),Comment:O.lineComment,Number:O.number,String:O.string,FormatString:O.special(O.string),Escape:O.escape,UpdateOp:O.updateOperator,"ArithOp!":O.arithmeticOperator,BitOp:O.bitwiseOperator,CompareOp:O.compareOperator,AssignOp:O.definitionOperator,Ellipsis:O.punctuation,At:O.meta,"( )":O.paren,"[ ]":O.squareBracket,"{ }":O.brace,".":O.derefOperator,", ;":O.separator}),rx={__proto__:null,await:44,or:54,and:56,in:60,not:62,is:64,if:70,else:72,lambda:76,yield:94,from:96,async:102,for:104,None:162,True:164,False:164,del:178,pass:182,break:186,continue:190,return:194,raise:202,import:206,as:208,global:212,nonlocal:214,assert:218,type:223,elif:236,while:240,try:246,except:248,finally:250,with:254,def:258,class:268,match:279,case:285},ox=qs.deserialize({version:14,states:"##jO`QeOOP$}OSOOO&WQtO'#HUOOQS'#Co'#CoOOQS'#Cp'#CpO'vQdO'#CnO*UQtO'#HTOOQS'#HU'#HUOOQS'#DU'#DUOOQS'#HT'#HTO*rQdO'#D_O+VQdO'#DfO+gQdO'#DjO+zOWO'#DuO,VOWO'#DvO.[QtO'#GuOOQS'#Gu'#GuO'vQdO'#GtO0ZQtO'#GtOOQS'#Eb'#EbO0rQdO'#EcOOQS'#Gs'#GsO0|QdO'#GrOOQV'#Gr'#GrO1XQdO'#FYOOQS'#G^'#G^O1^QdO'#FXOOQV'#IS'#ISOOQV'#Gq'#GqOOQV'#Fq'#FqQ`QeOOO'vQdO'#CqO1lQdO'#C}O1sQdO'#DRO2RQdO'#HYO2cQtO'#EVO'vQdO'#EWOOQS'#EY'#EYOOQS'#E['#E[OOQS'#E^'#E^O2wQdO'#E`O3_QdO'#EdO3rQdO'#EfO3zQtO'#EfO1XQdO'#EiO0rQdO'#ElO1XQdO'#EnO0rQdO'#EtO0rQdO'#EwO4VQdO'#EyO4^QdO'#FOO4iQdO'#EzO0rQdO'#FOO1XQdO'#FQO1XQdO'#FVO4nQdO'#F[P4uOdO'#GpPOOO)CBd)CBdOOQS'#Ce'#CeOOQS'#Cf'#CfOOQS'#Cg'#CgOOQS'#Ch'#ChOOQS'#Ci'#CiOOQS'#Cj'#CjOOQS'#Cl'#ClO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO5TQdO'#DoOOQS,5:Y,5:YO5hQdO'#HdOOQS,5:],5:]O5uQ!fO,5:]O5zQtO,59YO1lQdO,59bO1lQdO,59bO1lQdO,59bO8jQdO,59bO8oQdO,59bO8vQdO,59jO8}QdO'#HTO:TQdO'#HSOOQS'#HS'#HSOOQS'#D['#D[O:lQdO,59aO'vQdO,59aO:zQdO,59aOOQS,59y,59yO;PQdO,5:RO'vQdO,5:ROOQS,5:Q,5:QO;_QdO,5:QO;dQdO,5:XO'vQdO,5:XO'vQdO,5:VOOQS,5:U,5:UO;uQdO,5:UO;zQdO,5:WOOOW'#Fy'#FyOOOOQS'#Ds'#DsOOQS1G/w1G/wOOQS1G.|1G.|O!/[QtO1G.|O!/cQtO1G.|O1lQdO1G.|O!0OQdO1G/UOOQS'#DZ'#DZO0rQdO,59tOOQS1G.{1G.{O!0VQdO1G/eO!0gQdO1G/eO!0oQdO1G/fO'vQdO'#H[O!0tQdO'#H[O!0yQtO1G.{O!1ZQdO,59iO!2aQdO,5=zO!2qQdO,5=zO!2yQdO1G/mO!3OQtO1G/mOOQS1G/l1G/lO!3`QdO,5=uO!4VQdO,5=uO0rQdO1G/qO!4tQdO1G/sO!4yQtO1G/sO!5ZQtO1G/qOOQS1G/p1G/pOOQS1G/r1G/rOOOW-E9w-E9wOOQS1G/{1G/{O!5kQdO'#HxO0rQdO'#HxO!5|QdO,5>cOOOW-E9x-E9xOOQS1G/|1G/|OOQS-E9{-E9{O!6[Q#xO1G2zO!6{QtO1G2zO'vQdO,5kOOQS1G1`1G1`O!8RQdO1G1`OOQS'#DV'#DVO0rQdO,5=qOOQS,5=q,5=qO!8WQdO'#FrO!8cQdO,59oO!8kQdO1G/XO!8uQtO,5=uOOQS1G3`1G3`OOQS,5:m,5:mO!9fQdO'#GtOOQS,5jO!;ZQdO,5>jO1XQdO,5>jO!;lQdO,5>iOOQS-E:R-E:RO!;qQdO1G0lO!;|QdO1G0lO!lO!lO!hO!=VQdO,5>hO!=hQdO'#EpO0rQdO1G0tO!=sQdO1G0tO!=xQgO1G0zO!AvQgO1G0}O!EqQdO,5>oO!E{QdO,5>oO!FTQtO,5>oO0rQdO1G1PO!F_QdO1G1PO4iQdO1G1UO!!vQdO1G1WOOQV,5;a,5;aO!FdQfO,5;aO!FiQgO1G1QO!JjQdO'#GZO4iQdO1G1QO4iQdO1G1QO!JzQdO,5>pO!KXQdO,5>pO1XQdO,5>pOOQV1G1U1G1UO!KaQdO'#FSO!KrQ!fO1G1WO!KzQdO1G1WOOQV1G1]1G1]O4iQdO1G1]O!LPQdO1G1]O!LXQdO'#F^OOQV1G1b1G1bO!#ZQtO1G1bPOOO1G2v1G2vP!L^OSO1G2vOOQS,5=},5=}OOQS'#Dp'#DpO0rQdO,5=}O!LfQdO,5=|O!LyQdO,5=|OOQS1G/u1G/uO!MRQdO,5>PO!McQdO,5>PO!MkQdO,5>PO!NOQdO,5>PO!N`QdO,5>POOQS1G3j1G3jOOQS7+$h7+$hO!8kQdO7+$pO#!RQdO1G.|O#!YQdO1G.|OOQS1G/`1G/`OOQS,5<`,5<`O'vQdO,5<`OOQS7+%P7+%PO#!aQdO7+%POOQS-E9r-E9rOOQS7+%Q7+%QO#!qQdO,5=vO'vQdO,5=vOOQS7+$g7+$gO#!vQdO7+%PO##OQdO7+%QO##TQdO1G3fOOQS7+%X7+%XO##eQdO1G3fO##mQdO7+%XOOQS,5<_,5<_O'vQdO,5<_O##rQdO1G3aOOQS-E9q-E9qO#$iQdO7+%]OOQS7+%_7+%_O#$wQdO1G3aO#%fQdO7+%_O#%kQdO1G3gO#%{QdO1G3gO#&TQdO7+%]O#&YQdO,5>dO#&sQdO,5>dO#&sQdO,5>dOOQS'#Dx'#DxO#'UO&jO'#DzO#'aO`O'#HyOOOW1G3}1G3}O#'fQdO1G3}O#'nQdO1G3}O#'yQ#xO7+(fO#(jQtO1G2UP#)TQdO'#GOOOQS,5nQdO,5sQdO1G4OOOQS-E9y-E9yO#?^QdO1G4OO<[QdO'#H{OOOO'#D{'#D{OOOO'#F|'#F|O#?oO&jO,5:fOOOW,5>e,5>eOOOW7+)i7+)iO#?zQdO7+)iO#@SQdO1G2zO#@mQdO1G2zP'vQdO'#FuO0rQdO<mO#BQQdO,5>mOOQS1G0v1G0vOOQS<rO#KgQdO,5>rO#KrQdO,5>rO#K}QdO,5>qO#L`QdO,5>qOOQS1G1Y1G1YOOQS,5;p,5;pOOQV<VAN>VO$ oQdO<cAN>cO0rQdO1G1|O$!PQtO1G1|P$!ZQdO'#FvOOQS1G2R1G2RP$!hQdO'#F{O$!uQdO7+)jO$#`QdO,5>gOOOO-E9z-E9zOOOW<tO$4{QdO,5>tO1XQdO,5vO$)nQdO,5>vOOQS1G1p1G1pOOQS,5<[,5<[OOQU7+'P7+'PO$+zQdO1G/iO$)nQdO,5wO$8zQdO,5>wOOQS1G1s1G1sOOQS7+'S7+'SP$)nQdO'#GdO$9SQdO1G4bO$9^QdO1G4bO$9fQdO1G4bOOQS7+%T7+%TO$9tQdO1G1tO$:SQtO'#FaO$:ZQdO,5<}OOQS,5<},5<}O$:iQdO1G4cOOQS-E:a-E:aO$)nQdO,5<|O$:pQdO,5<|O$:uQdO7+)|OOQS-E:`-E:`O$;PQdO7+)|O$)nQdO,5S~O%cOS%^OSSOS%]PQ~OPdOVaOfoOhYOopOs!POvqO!PrO!Q{O!T!SO!U!RO!XZO!][O!h`O!r`O!s`O!t`O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO#l!QO#o!TO#s!UO#u!VO#z!WO#}hO$P!XO%oRO%pRO%tSO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O~O%]!YO~OV!aO_!aOa!bOh!iO!X!kO!f!mO%j![O%k!]O%l!^O%m!_O%n!_O%o!`O%p!`O%q!aO%r!aO%s!aO~Ok%xXl%xXm%xXn%xXo%xXp%xXs%xXz%xX{%xX!x%xX#g%xX%[%xX%_%xX%z%xXg%xX!T%xX!U%xX%{%xX!W%xX![%xX!Q%xX#[%xXt%xX!m%xX~P%SOfoOhYO!XZO!][O!h`O!r`O!s`O!t`O%oRO%pRO%tSO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O~Oz%wX{%wX#g%wX%[%wX%_%wX%z%wX~Ok!pOl!qOm!oOn!oOo!rOp!sOs!tO!x%wX~P)pOV!zOg!|Oo0cOv0qO!PrO~P'vOV#OOo0cOv0qO!W#PO~P'vOV#SOa#TOo0cOv0qO![#UO~P'vOQ#XO%`#XO%a#ZO~OQ#^OR#[O%`#^O%a#`O~OV%iX_%iXa%iXh%iXk%iXl%iXm%iXn%iXo%iXp%iXs%iXz%iX!X%iX!f%iX%j%iX%k%iX%l%iX%m%iX%n%iX%o%iX%p%iX%q%iX%r%iX%s%iXg%iX!T%iX!U%iX~O&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O{%iX!x%iX#g%iX%[%iX%_%iX%z%iX%{%iX!W%iX![%iX!Q%iX#[%iXt%iX!m%iX~P,eOz#dO{%hX!x%hX#g%hX%[%hX%_%hX%z%hX~Oo0cOv0qO~P'vO#g#gO%[#iO%_#iO~O%uWO~O!T#nO#u!VO#z!WO#}hO~OopO~P'vOV#sOa#tO%uWO{wP~OV#xOo0cOv0qO!Q#yO~P'vO{#{O!x$QO%z#|O#g!yX%[!yX%_!yX~OV#xOo0cOv0qO#g#SX%[#SX%_#SX~P'vOo0cOv0qO#g#WX%[#WX%_#WX~P'vOh$WO%uWO~O!f$YO!r$YO%uWO~OV$eO~P'vO!U$gO#s$hO#u$iO~O{$jO~OV$qO~P'vOS$sO%[$rO%_$rO%c$tO~OV$}Oa$}Og%POo0cOv0qO~P'vOo0cOv0qO{%SO~P'vO&Y%UO~Oa!bOh!iO!X!kO!f!mOVba_bakbalbambanbaobapbasbazba{ba!xba#gba%[ba%_ba%jba%kba%lba%mba%nba%oba%pba%qba%rba%sba%zbagba!Tba!Uba%{ba!Wba![ba!Qba#[batba!mba~On%ZO~Oo%ZO~P'vOo0cO~P'vOk0eOl0fOm0dOn0dOo0mOp0nOs0rOg%wX!T%wX!U%wX%{%wX!W%wX![%wX!Q%wX#[%wX!m%wX~P)pO%{%]Og%vXz%vX!T%vX!U%vX!W%vX{%vX~Og%_Oz%`O!T%dO!U%cO~Og%_O~Oz%gO!T%dO!U%cO!W&SX~O!W%kO~Oz%lO{%nO!T%dO!U%cO![%}X~O![%rO~O![%sO~OQ#XO%`#XO%a%uO~OV%wOo0cOv0qO!PrO~P'vOQ#^OR#[O%`#^O%a%zO~OV!qa_!qaa!qah!qak!qal!qam!qan!qao!qap!qas!qaz!qa{!qa!X!qa!f!qa!x!qa#g!qa%[!qa%_!qa%j!qa%k!qa%l!qa%m!qa%n!qa%o!qa%p!qa%q!qa%r!qa%s!qa%z!qag!qa!T!qa!U!qa%{!qa!W!qa![!qa!Q!qa#[!qat!qa!m!qa~P#yOz%|O{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~P%SOV&OOopOvqO{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~P'vOz%|O{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~OPdOVaOopOvqO!PrO!Q{O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO#g$zX%[$zX%_$zX~P'vO#g#gO%[&TO%_&TO~O!f&UOh&sX%[&sXz&sX#[&sX#g&sX%_&sX#Z&sXg&sX~Oh!iO%[&WO~Okealeameaneaoeapeaseazea{ea!xea#gea%[ea%_ea%zeagea!Tea!Uea%{ea!Wea![ea!Qea#[eatea!mea~P%SOsqazqa{qa#gqa%[qa%_qa%zqa~Ok!pOl!qOm!oOn!oOo!rOp!sO!xqa~PEcO%z&YOz%yX{%yX~O%uWOz%yX{%yX~Oz&]O{wX~O{&_O~Oz%lO#g%}X%[%}X%_%}Xg%}X{%}X![%}X!m%}X%z%}X~OV0lOo0cOv0qO!PrO~P'vO%z#|O#gUa%[Ua%_Ua~Oz&hO#g&PX%[&PX%_&PXn&PX~P%SOz&kO!Q&jO#g#Wa%[#Wa%_#Wa~Oz&lO#[&nO#g&rX%[&rX%_&rXg&rX~O!f$YO!r$YO#Z&qO%uWO~O#Z&qO~Oz&sO#g&tX%[&tX%_&tX~Oz&uO#g&pX%[&pX%_&pX{&pX~O!X&wO%z&xO~Oz&|On&wX~P%SOn'PO~OPdOVaOopOvqO!PrO!Q{O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO%['UO~P'vOt'YO#p'WO#q'XOP#naV#naf#nah#nao#nas#nav#na!P#na!Q#na!T#na!U#na!X#na!]#na!h#na!r#na!s#na!t#na!{#na!}#na#P#na#R#na#T#na#X#na#Z#na#^#na#_#na#a#na#c#na#l#na#o#na#s#na#u#na#z#na#}#na$P#na%X#na%o#na%p#na%t#na%u#na&Z#na&[#na&]#na&^#na&_#na&`#na&a#na&b#na&c#na&d#na&e#na&f#na&g#na&h#na&i#na&j#na%Z#na%_#na~Oz'ZO#[']O{&xX~Oh'_O!X&wO~Oh!iO{$jO!X&wO~O{'eO~P%SO%['hO%_'hO~OS'iO%['hO%_'hO~OV!aO_!aOa!bOh!iO!X!kO!f!mO%l!^O%m!_O%n!_O%o!`O%p!`O%q!aO%r!aO%s!aOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~O%k!]O~P!#uO%kWi~P!#uOV!aO_!aOa!bOh!iO!X!kO!f!mO%o!`O%p!`O%q!aO%r!aO%s!aOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%kWi%lWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~O%m!_O%n!_O~P!&pO%mWi%nWi~P!&pOa!bOh!iO!X!kO!f!mOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%kWi%lWi%mWi%nWi%oWi%pWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~OV!aO_!aO%q!aO%r!aO%s!aO~P!)nOVWi_Wi%qWi%rWi%sWi~P!)nO!T%dO!U%cOg&VXz&VX~O%z'kO%{'kO~P,eOz'mOg&UX~Og'oO~Oz'pO{'rO!W&XX~Oo0cOv0qOz'pO{'sO!W&XX~P'vO!W'uO~Om!oOn!oOo!rOp!sOkjisjizji{ji!xji#gji%[ji%_ji%zji~Ol!qO~P!.aOlji~P!.aOk0eOl0fOm0dOn0dOo0mOp0nO~Ot'wO~P!/jOV'|Og'}Oo0cOv0qO~P'vOg'}Oz(OO~Og(QO~O!U(SO~Og(TOz(OO!T%dO!U%cO~P%SOk0eOl0fOm0dOn0dOo0mOp0nOgqa!Tqa!Uqa%{qa!Wqa![qa!Qqa#[qatqa!mqa~PEcOV'|Oo0cOv0qO!W&Sa~P'vOz(WO!W&Sa~O!W(XO~Oz(WO!T%dO!U%cO!W&Sa~P%SOV(]Oo0cOv0qO![%}a#g%}a%[%}a%_%}ag%}a{%}a!m%}a%z%}a~P'vOz(^O![%}a#g%}a%[%}a%_%}ag%}a{%}a!m%}a%z%}a~O![(aO~Oz(^O!T%dO!U%cO![%}a~P%SOz(dO!T%dO!U%cO![&Ta~P%SOz(gO{&lX![&lX!m&lX%z&lX~O{(kO![(mO!m(nO%z(jO~OV&OOopOvqO{%hi!x%hi#g%hi%[%hi%_%hi%z%hi~P'vOz(pO{%hi!x%hi#g%hi%[%hi%_%hi%z%hi~O!f&UOh&sa%[&saz&sa#[&sa#g&sa%_&sa#Z&sag&sa~O%[(uO~OV#sOa#tO%uWO~Oz&]O{wa~OopOvqO~P'vOz(^O#g%}a%[%}a%_%}ag%}a{%}a![%}a!m%}a%z%}a~P%SOz(zO#g%hX%[%hX%_%hX%z%hX~O%z#|O#gUi%[Ui%_Ui~O#g&Pa%[&Pa%_&Pan&Pa~P'vOz(}O#g&Pa%[&Pa%_&Pan&Pa~O%uWO#g&ra%[&ra%_&rag&ra~Oz)SO#g&ra%[&ra%_&rag&ra~Og)VO~OV)WOh$WO%uWO~O#Z)XO~O%uWO#g&ta%[&ta%_&ta~Oz)ZO#g&ta%[&ta%_&ta~Oo0cOv0qO#g&pa%[&pa%_&pa{&pa~P'vOz)^O#g&pa%[&pa%_&pa{&pa~OV)`Oa)`O%uWO~O%z)eO~Ot)hO#j)gOP#hiV#hif#hih#hio#his#hiv#hi!P#hi!Q#hi!T#hi!U#hi!X#hi!]#hi!h#hi!r#hi!s#hi!t#hi!{#hi!}#hi#P#hi#R#hi#T#hi#X#hi#Z#hi#^#hi#_#hi#a#hi#c#hi#l#hi#o#hi#s#hi#u#hi#z#hi#}#hi$P#hi%X#hi%o#hi%p#hi%t#hi%u#hi&Z#hi&[#hi&]#hi&^#hi&_#hi&`#hi&a#hi&b#hi&c#hi&d#hi&e#hi&f#hi&g#hi&h#hi&i#hi&j#hi%Z#hi%_#hi~Ot)iOP#kiV#kif#kih#kio#kis#kiv#ki!P#ki!Q#ki!T#ki!U#ki!X#ki!]#ki!h#ki!r#ki!s#ki!t#ki!{#ki!}#ki#P#ki#R#ki#T#ki#X#ki#Z#ki#^#ki#_#ki#a#ki#c#ki#l#ki#o#ki#s#ki#u#ki#z#ki#}#ki$P#ki%X#ki%o#ki%p#ki%t#ki%u#ki&Z#ki&[#ki&]#ki&^#ki&_#ki&`#ki&a#ki&b#ki&c#ki&d#ki&e#ki&f#ki&g#ki&h#ki&i#ki&j#ki%Z#ki%_#ki~OV)kOn&wa~P'vOz)lOn&wa~Oz)lOn&wa~P%SOn)pO~O%Y)tO~Ot)wO#p'WO#q)vOP#niV#nif#nih#nio#nis#niv#ni!P#ni!Q#ni!T#ni!U#ni!X#ni!]#ni!h#ni!r#ni!s#ni!t#ni!{#ni!}#ni#P#ni#R#ni#T#ni#X#ni#Z#ni#^#ni#_#ni#a#ni#c#ni#l#ni#o#ni#s#ni#u#ni#z#ni#}#ni$P#ni%X#ni%o#ni%p#ni%t#ni%u#ni&Z#ni&[#ni&]#ni&^#ni&_#ni&`#ni&a#ni&b#ni&c#ni&d#ni&e#ni&f#ni&g#ni&h#ni&i#ni&j#ni%Z#ni%_#ni~OV)zOo0cOv0qO{$jO~P'vOo0cOv0qO{&xa~P'vOz*OO{&xa~OV*SOa*TOg*WO%q*UO%uWO~O{$jO&{*YO~Oh'_O~Oh!iO{$jO~O%[*_O~O%[*aO%_*aO~OV$}Oa$}Oo0cOv0qOg&Ua~P'vOz*dOg&Ua~Oo0cOv0qO{*gO!W&Xa~P'vOz*hO!W&Xa~Oo0cOv0qOz*hO{*kO!W&Xa~P'vOo0cOv0qOz*hO!W&Xa~P'vOz*hO{*kO!W&Xa~Om0dOn0dOo0mOp0nOgjikjisjizji!Tji!Uji%{ji!Wji{ji![ji#gji%[ji%_ji!Qji#[jitji!mji%zji~Ol0fO~P!NkOlji~P!NkOV'|Og*pOo0cOv0qO~P'vOn*rO~Og*pOz*tO~Og*uO~OV'|Oo0cOv0qO!W&Si~P'vOz*vO!W&Si~O!W*wO~OV(]Oo0cOv0qO![%}i#g%}i%[%}i%_%}ig%}i{%}i!m%}i%z%}i~P'vOz*zO!T%dO!U%cO![&Ti~Oz*}O![%}i#g%}i%[%}i%_%}ig%}i{%}i!m%}i%z%}i~O![+OO~Oa+QOo0cOv0qO![&Ti~P'vOz*zO![&Ti~O![+SO~OV+UOo0cOv0qO{&la![&la!m&la%z&la~P'vOz+VO{&la![&la!m&la%z&la~O!]+YO&n+[O![!nX~O![+^O~O{(kO![+_O~O{(kO![+_O!m+`O~OV&OOopOvqO{%hq!x%hq#g%hq%[%hq%_%hq%z%hq~P'vOz$ri{$ri!x$ri#g$ri%[$ri%_$ri%z$ri~P%SOV&OOopOvqO~P'vOV&OOo0cOv0qO#g%ha%[%ha%_%ha%z%ha~P'vOz+aO#g%ha%[%ha%_%ha%z%ha~Oz$ia#g$ia%[$ia%_$ian$ia~P%SO#g&Pi%[&Pi%_&Pin&Pi~P'vOz+dO#g#Wq%[#Wq%_#Wq~O#[+eOz$va#g$va%[$va%_$vag$va~O%uWO#g&ri%[&ri%_&rig&ri~Oz+gO#g&ri%[&ri%_&rig&ri~OV+iOh$WO%uWO~O%uWO#g&ti%[&ti%_&ti~Oo0cOv0qO#g&pi%[&pi%_&pi{&pi~P'vO{#{Oz#eX!W#eX~Oz+mO!W&uX~O!W+oO~Ot+rO#j)gOP#hqV#hqf#hqh#hqo#hqs#hqv#hq!P#hq!Q#hq!T#hq!U#hq!X#hq!]#hq!h#hq!r#hq!s#hq!t#hq!{#hq!}#hq#P#hq#R#hq#T#hq#X#hq#Z#hq#^#hq#_#hq#a#hq#c#hq#l#hq#o#hq#s#hq#u#hq#z#hq#}#hq$P#hq%X#hq%o#hq%p#hq%t#hq%u#hq&Z#hq&[#hq&]#hq&^#hq&_#hq&`#hq&a#hq&b#hq&c#hq&d#hq&e#hq&f#hq&g#hq&h#hq&i#hq&j#hq%Z#hq%_#hq~On$|az$|a~P%SOV)kOn&wi~P'vOz+yOn&wi~Oz,TO{$jO#[,TO~O#q,VOP#nqV#nqf#nqh#nqo#nqs#nqv#nq!P#nq!Q#nq!T#nq!U#nq!X#nq!]#nq!h#nq!r#nq!s#nq!t#nq!{#nq!}#nq#P#nq#R#nq#T#nq#X#nq#Z#nq#^#nq#_#nq#a#nq#c#nq#l#nq#o#nq#s#nq#u#nq#z#nq#}#nq$P#nq%X#nq%o#nq%p#nq%t#nq%u#nq&Z#nq&[#nq&]#nq&^#nq&_#nq&`#nq&a#nq&b#nq&c#nq&d#nq&e#nq&f#nq&g#nq&h#nq&i#nq&j#nq%Z#nq%_#nq~O#[,WOz%Oa{%Oa~Oo0cOv0qO{&xi~P'vOz,YO{&xi~O{#{O%z,[Og&zXz&zX~O%uWOg&zXz&zX~Oz,`Og&yX~Og,bO~O%Y,eO~O!T%dO!U%cOg&Viz&Vi~OV$}Oa$}Oo0cOv0qOg&Ui~P'vO{,hOz$la!W$la~Oo0cOv0qO{,iOz$la!W$la~P'vOo0cOv0qO{*gO!W&Xi~P'vOz,lO!W&Xi~Oo0cOv0qOz,lO!W&Xi~P'vOz,lO{,oO!W&Xi~Og$hiz$hi!W$hi~P%SOV'|Oo0cOv0qO~P'vOn,qO~OV'|Og,rOo0cOv0qO~P'vOV'|Oo0cOv0qO!W&Sq~P'vOz$gi![$gi#g$gi%[$gi%_$gig$gi{$gi!m$gi%z$gi~P%SOV(]Oo0cOv0qO~P'vOa+QOo0cOv0qO![&Tq~P'vOz,sO![&Tq~O![,tO~OV(]Oo0cOv0qO![%}q#g%}q%[%}q%_%}qg%}q{%}q!m%}q%z%}q~P'vO{,uO~OV+UOo0cOv0qO{&li![&li!m&li%z&li~P'vOz,zO{&li![&li!m&li%z&li~O!]+YO&n+[O![!na~O{(kO![,}O~OV&OOo0cOv0qO#g%hi%[%hi%_%hi%z%hi~P'vOz-OO#g%hi%[%hi%_%hi%z%hi~O%uWO#g&rq%[&rq%_&rqg&rq~Oz-RO#g&rq%[&rq%_&rqg&rq~OV)`Oa)`O%uWO!W&ua~Oz-TO!W&ua~On$|iz$|i~P%SOV)kO~P'vOV)kOn&wq~P'vOt-XOP#myV#myf#myh#myo#mys#myv#my!P#my!Q#my!T#my!U#my!X#my!]#my!h#my!r#my!s#my!t#my!{#my!}#my#P#my#R#my#T#my#X#my#Z#my#^#my#_#my#a#my#c#my#l#my#o#my#s#my#u#my#z#my#}#my$P#my%X#my%o#my%p#my%t#my%u#my&Z#my&[#my&]#my&^#my&_#my&`#my&a#my&b#my&c#my&d#my&e#my&f#my&g#my&h#my&i#my&j#my%Z#my%_#my~O%Z-]O%_-]O~P`O#q-^OP#nyV#nyf#nyh#nyo#nys#nyv#ny!P#ny!Q#ny!T#ny!U#ny!X#ny!]#ny!h#ny!r#ny!s#ny!t#ny!{#ny!}#ny#P#ny#R#ny#T#ny#X#ny#Z#ny#^#ny#_#ny#a#ny#c#ny#l#ny#o#ny#s#ny#u#ny#z#ny#}#ny$P#ny%X#ny%o#ny%p#ny%t#ny%u#ny&Z#ny&[#ny&]#ny&^#ny&_#ny&`#ny&a#ny&b#ny&c#ny&d#ny&e#ny&f#ny&g#ny&h#ny&i#ny&j#ny%Z#ny%_#ny~Oz-aO{$jO#[-aO~Oo0cOv0qO{&xq~P'vOz-dO{&xq~O%z,[Og&zaz&za~O{#{Og&zaz&za~OV*SOa*TO%q*UO%uWOg&ya~Oz-hOg&ya~O$S-lO~OV$}Oa$}Oo0cOv0qO~P'vOo0cOv0qO{-mOz$li!W$li~P'vOo0cOv0qOz$li!W$li~P'vO{-mOz$li!W$li~Oo0cOv0qO{*gO~P'vOo0cOv0qO{*gO!W&Xq~P'vOz-pO!W&Xq~Oo0cOv0qOz-pO!W&Xq~P'vOs-sO!T%dO!U%cOg&Oq!W&Oq![&Oqz&Oq~P!/jOa+QOo0cOv0qO![&Ty~P'vOz$ji![$ji~P%SOa+QOo0cOv0qO~P'vOV+UOo0cOv0qO~P'vOV+UOo0cOv0qO{&lq![&lq!m&lq%z&lq~P'vO{(kO![-xO!m-yO%z-wO~OV&OOo0cOv0qO#g%hq%[%hq%_%hq%z%hq~P'vO%uWO#g&ry%[&ry%_&ryg&ry~OV)`Oa)`O%uWO!W&ui~Ot-}OP#m!RV#m!Rf#m!Rh#m!Ro#m!Rs#m!Rv#m!R!P#m!R!Q#m!R!T#m!R!U#m!R!X#m!R!]#m!R!h#m!R!r#m!R!s#m!R!t#m!R!{#m!R!}#m!R#P#m!R#R#m!R#T#m!R#X#m!R#Z#m!R#^#m!R#_#m!R#a#m!R#c#m!R#l#m!R#o#m!R#s#m!R#u#m!R#z#m!R#}#m!R$P#m!R%X#m!R%o#m!R%p#m!R%t#m!R%u#m!R&Z#m!R&[#m!R&]#m!R&^#m!R&_#m!R&`#m!R&a#m!R&b#m!R&c#m!R&d#m!R&e#m!R&f#m!R&g#m!R&h#m!R&i#m!R&j#m!R%Z#m!R%_#m!R~Oo0cOv0qO{&xy~P'vOV*SOa*TO%q*UO%uWOg&yi~O$S-lO%Z.VO%_.VO~OV.aOh._O!X.^O!].`O!h.YO!s.[O!t.[O%p.XO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O~Oo0cOv0qOz$lq!W$lq~P'vO{.fOz$lq!W$lq~Oo0cOv0qO{*gO!W&Xy~P'vOz.gO!W&Xy~Oo0cOv.kO~P'vOs-sO!T%dO!U%cOg&Oy!W&Oy![&Oyz&Oy~P!/jO{(kO![.nO~O{(kO![.nO!m.oO~OV*SOa*TO%q*UO%uWO~Oh.tO!f.rOz$TX#[$TX%j$TXg$TX~Os$TX{$TX!W$TX![$TX~P$-bO%o.vO%p.vOs$UXz$UX{$UX#[$UX%j$UX!W$UXg$UX![$UX~O!h.xO~Oz.|O#[/OO%j.yOs&|X{&|X!W&|Xg&|X~Oa/RO~P$)zOh.tOs&}Xz&}X{&}X#[&}X%j&}X!W&}Xg&}X![&}X~Os/VO{$jO~Oo0cOv0qOz$ly!W$ly~P'vOo0cOv0qO{*gO!W&X!R~P'vOz/ZO!W&X!R~Og&RXs&RX!T&RX!U&RX!W&RX![&RXz&RX~P!/jOs-sO!T%dO!U%cOg&Qa!W&Qa![&Qaz&Qa~O{(kO![/^O~O!f.rOh$[as$[az$[a{$[a#[$[a%j$[a!W$[ag$[a![$[a~O!h/eO~O%o.vO%p.vOs$Uaz$Ua{$Ua#[$Ua%j$Ua!W$Uag$Ua![$Ua~O%j.yOs$Yaz$Ya{$Ya#[$Ya!W$Yag$Ya![$Ya~Os&|a{&|a!W&|ag&|a~P$)nOz/jOs&|a{&|a!W&|ag&|a~O!W/mO~Og/mO~O{/oO~O![/pO~Oo0cOv0qO{*gO!W&X!Z~P'vO{/sO~O%z/tO~P$-bOz/uO#[/OO%j.yOg'PX~Oz/uOg'PX~Og/wO~O!h/xO~O#[/OOs%Saz%Sa{%Sa%j%Sa!W%Sag%Sa![%Sa~O#[/OO%j.yOs%Waz%Wa{%Wa!W%Wag%Wa~Os&|i{&|i!W&|ig&|i~P$)nOz/zO#[/OO%j.yO!['Oa~Og'Pa~P$)nOz0SOg'Pa~Oa0UO!['Oi~P$)zOz0WO!['Oi~Oz0WO#[/OO%j.yO!['Oi~O#[/OO%j.yOg$biz$bi~O%z0ZO~P$-bO#[/OO%j.yOg%Vaz%Va~Og'Pi~P$)nO{0^O~Oa0UO!['Oq~P$)zOz0`O!['Oq~O#[/OO%j.yOz%Ui![%Ui~Oa0UO~P$)zOa0UO!['Oy~P$)zO#[/OO%j.yOg$ciz$ci~O#[/OO%j.yOz%Uq![%Uq~Oz+aO#g%ha%[%ha%_%ha%z%ha~P%SOV&OOo0cOv0qO~P'vOn0hO~Oo0hO~P'vO{0iO~Ot0jO~P!/jO&]&Z&j&h&i&g&f&d&e&c&b&`&a&_&^&[%u~",goto:"!=j'QPPPPPP'RP'Z*s+[+t,_,y-fP.SP'Z.r.r'ZPPP'Z2[PPPPPP2[5PPP5PP7b7k=sPP=v>h>kPP'Z'ZPP>zPP'Z'ZPP'Z'Z'Z'Z'Z?O?w'ZP?zP@QDXGuGyPG|HWH['ZPPPH_Hk'RP'R'RP'RP'RP'RP'RP'R'R'RP'RPP'RPP'RP'RPHqH}IVPI^IdPI^PI^I^PPPI^PKrPK{LVL]KrPI^LfPI^PLmLsPLwM]MzNeLwLwNkNxLwLwLwLw! ^! d! g! l! o! y!!P!!]!!o!!u!#P!#V!#s!#y!$P!$Z!$a!$g!$y!%T!%Z!%a!%k!%q!%w!%}!&T!&Z!&e!&k!&u!&{!'U!'[!'k!'s!'}!(UPPPPPPPPPPP!([!(_!(e!(n!(x!)TPPPPPPPPPPPP!-u!/Z!3^!6oPP!6w!7W!7a!8Y!8P!8c!8i!8l!8o!8r!8z!9jPPPPPPPPPPPPPPPPP!9m!9q!9wP!:]!:a!:m!:v!;S!;j!;m!;p!;v!;|!_![!]Do!]!^Es!^!_FZ!_!`Gk!`!aHX!a!b%T!b!cIf!c!dJU!d!eK^!e!hJU!h!i!#f!i!tJU!t!u!,|!u!wJU!w!x!.t!x!}JU!}#O!0S#O#P&o#P#Q!0j#Q#R!1Q#R#SJU#S#T%T#T#UJU#U#VK^#V#YJU#Y#Z!#f#Z#fJU#f#g!,|#g#iJU#i#j!.t#j#oJU#o#p!1n#p#q!1s#q#r!2a#r#s!2f#s$g%T$g;'SJU;'S;=`KW<%lOJU`%YT&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T`%lP;=`<%l%To%v]&n`%c_OX%TXY%oY[%T[]%o]p%Tpq%oq#O%T#O#P&o#P#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To&tX&n`OY%TYZ%oZ]%T]^%o^#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc'f[&n`O!_%T!_!`([!`#T%T#T#U(r#U#f%T#f#g(r#g#h(r#h#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc(cTmR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc(yT!mR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk)aV&n`&[ZOr%Trs)vs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk){V&n`Or%Trs*bs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk*iT&n`&^ZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To+PZS_&n`OY*xYZ%TZ]*x]^%T^#o*x#o#p+r#p#q*x#q#r+r#r;'S*x;'S;=`,^<%lO*x_+wTS_OY+rZ]+r^;'S+r;'S;=`,W<%lO+r_,ZP;=`<%l+ro,aP;=`<%l*xj,kV%rQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj-XT!xY&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj-oV%lQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk.]V&n`&ZZOw%Twx.rx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk.wV&n`Ow%Twx/^x#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk/eT&n`&]ZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk/{ThZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc0cTgR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk0yXVZ&n`Oz%Tz{1f{!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk1mVaR&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk2ZV%oZ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc2wTzR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To3_W%pZ&n`O!_%T!_!`-Q!`!a3w!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Td4OT&{S&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk4fX!fQ&n`O!O%T!O!P5R!P!Q%T!Q![6T![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk5WV&n`O!O%T!O!P5m!P#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk5tT!rZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti6[a!hX&n`O!Q%T!Q![6T![!g%T!g!h7a!h!l%T!l!m9s!m#R%T#R#S6T#S#X%T#X#Y7a#Y#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti7fZ&n`O{%T{|8X|}%T}!O8X!O!Q%T!Q![8s![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti8^V&n`O!Q%T!Q![8s![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti8z]!hX&n`O!Q%T!Q![8s![!l%T!l!m9s!m#R%T#R#S8s#S#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti9zT!hX&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk:bX%qR&n`O!P%T!P!Q:}!Q!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj;UV%sQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti;ro!hX&n`O!O%T!O!P=s!P!Q%T!Q![>_![!d%T!d!e?q!e!g%T!g!h7a!h!l%T!l!m9s!m!q%T!q!rA]!r!z%T!z!{Bq!{#R%T#R#S>_#S#U%T#U#V?q#V#X%T#X#Y7a#Y#^%T#^#_9s#_#c%T#c#dA]#d#l%T#l#mBq#m#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti=xV&n`O!Q%T!Q![6T![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti>fc!hX&n`O!O%T!O!P=s!P!Q%T!Q![>_![!g%T!g!h7a!h!l%T!l!m9s!m#R%T#R#S>_#S#X%T#X#Y7a#Y#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti?vY&n`O!Q%T!Q!R@f!R!S@f!S#R%T#R#S@f#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti@mY!hX&n`O!Q%T!Q!R@f!R!S@f!S#R%T#R#S@f#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiAbX&n`O!Q%T!Q!YA}!Y#R%T#R#SA}#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiBUX!hX&n`O!Q%T!Q!YA}!Y#R%T#R#SA}#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiBv]&n`O!Q%T!Q![Co![!c%T!c!iCo!i#R%T#R#SCo#S#T%T#T#ZCo#Z#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiCv]!hX&n`O!Q%T!Q![Co![!c%T!c!iCo!i#R%T#R#SCo#S#T%T#T#ZCo#Z#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%ToDvV{_&n`O!_%T!_!`E]!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TcEdT%{R&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkEzT#gZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkFbXmR&n`O!^%T!^!_F}!_!`([!`!a([!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TjGUV%mQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkGrV%zZ&n`O!_%T!_!`([!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkH`WmR&n`O!_%T!_!`([!`!aHx!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TjIPV%nQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkIoV_Q#}P&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%ToJ_]&n`&YS%uZO!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUoKZP;=`<%lJUoKge&n`&YS%uZOr%Trs)Ysw%Twx.Ux!Q%T!Q![JU![!c%T!c!tJU!t!uLx!u!}JU!}#R%T#R#SJU#S#T%T#T#fJU#f#gLx#g#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUoMRa&n`&YS%uZOr%TrsNWsw%Twx! vx!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUkN_V&n`&`ZOr%TrsNts#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkNyV&n`Or%Trs! `s#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk! gT&n`&bZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk! }V&n`&_ZOw%Twx!!dx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!!iV&n`Ow%Twx!#Ox#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!#VT&n`&aZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!#oe&n`&YS%uZOr%Trs!%Qsw%Twx!&px!Q%T!Q![JU![!c%T!c!tJU!t!u!(`!u!}JU!}#R%T#R#SJU#S#T%T#T#fJU#f#g!(`#g#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!%XV&n`&dZOr%Trs!%ns#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!%sV&n`Or%Trs!&Ys#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!&aT&n`&fZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!&wV&n`&cZOw%Twx!'^x#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!'cV&n`Ow%Twx!'xx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!(PT&n`&eZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!(ia&n`&YS%uZOr%Trs!)nsw%Twx!+^x!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!)uV&n`&hZOr%Trs!*[s#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!*aV&n`Or%Trs!*vs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!*}T&n`&jZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!+eV&n`&gZOw%Twx!+zx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!,PV&n`Ow%Twx!,fx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!,mT&n`&iZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!-Vi&n`&YS%uZOr%TrsNWsw%Twx! vx!Q%T!Q![JU![!c%T!c!dJU!d!eLx!e!hJU!h!i!(`!i!}JU!}#R%T#R#SJU#S#T%T#T#UJU#U#VLx#V#YJU#Y#Z!(`#Z#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUo!.}a&n`&YS%uZOr%Trs)Ysw%Twx.Ux!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!0ZT!XZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc!0qT!WR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj!1XV%kQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T~!1sO!]~k!1zV%jR&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T~!2fO![~i!2mT%tX&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T",tokenizers:[tx,Yb,Zb,ix,0,1,2,3,4],topRules:{Script:[0,5]},specialized:[{term:221,get:n=>rx[n]||-1}],tokenPrec:7668}),Wh=new Mg,rd=new Set(["Script","Body","FunctionDefinition","ClassDefinition","LambdaExpression","ForStatement","MatchClause"]);function jn(n){return(e,t,i)=>{if(i)return!1;let s=e.node.getChild("VariableName");return s&&t(s,n),!0}}const lx={FunctionDefinition:jn("function"),ClassDefinition:jn("class"),ForStatement(n,e,t){if(t){for(let i=n.node.firstChild;i;i=i.nextSibling)if(i.name=="VariableName")e(i,"variable");else if(i.name=="in")break}},ImportStatement(n,e){var t,i;let{node:s}=n,r=((t=s.firstChild)===null||t===void 0?void 0:t.name)=="from";for(let o=s.getChild("import");o;o=o.nextSibling)o.name=="VariableName"&&((i=o.nextSibling)===null||i===void 0?void 0:i.name)!="as"&&e(o,r?"variable":"namespace")},AssignStatement(n,e){for(let t=n.node.firstChild;t;t=t.nextSibling)if(t.name=="VariableName")e(t,"variable");else if(t.name==":"||t.name=="AssignOp")break},ParamList(n,e){for(let t=null,i=n.node.firstChild;i;i=i.nextSibling)i.name=="VariableName"&&(!t||!/\*|AssignOp/.test(t.name))&&e(i,"variable"),t=i},CapturePattern:jn("variable"),AsPattern:jn("variable"),__proto__:null};function od(n,e){let t=Wh.get(e);if(t)return t;let i=[],s=!0;function r(o,l){let a=n.sliceString(o.from,o.to);i.push({label:a,type:l})}return e.cursor(he.IncludeAnonymous).iterate(o=>{if(o.name){let l=lx[o.name];if(l&&l(o,r,s)||!s&&rd.has(o.name))return!1;s=!1}else if(o.to-o.from>8192){for(let l of od(n,o.node))i.push(l);return!1}}),Wh.set(e,i),i}const zh=/^[\w\xa1-\uffff][\w\d\xa1-\uffff]*$/,ld=["String","FormatString","Comment","PropertyName"];function ax(n){let e=fe(n.state).resolveInner(n.pos,-1);if(ld.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&zh.test(n.state.sliceDoc(e.from,e.to));if(!t&&!n.explicit)return null;let i=[];for(let s=e;s;s=s.parent)rd.has(s.name)&&(i=i.concat(od(n.state.doc,s)));return{options:i,from:t?e.from:n.pos,validFor:zh}}const hx=["__annotations__","__builtins__","__debug__","__doc__","__import__","__name__","__loader__","__package__","__spec__","False","None","True"].map(n=>({label:n,type:"constant"})).concat(["ArithmeticError","AssertionError","AttributeError","BaseException","BlockingIOError","BrokenPipeError","BufferError","BytesWarning","ChildProcessError","ConnectionAbortedError","ConnectionError","ConnectionRefusedError","ConnectionResetError","DeprecationWarning","EOFError","Ellipsis","EncodingWarning","EnvironmentError","Exception","FileExistsError","FileNotFoundError","FloatingPointError","FutureWarning","GeneratorExit","IOError","ImportError","ImportWarning","IndentationError","IndexError","InterruptedError","IsADirectoryError","KeyError","KeyboardInterrupt","LookupError","MemoryError","ModuleNotFoundError","NameError","NotADirectoryError","NotImplemented","NotImplementedError","OSError","OverflowError","PendingDeprecationWarning","PermissionError","ProcessLookupError","RecursionError","ReferenceError","ResourceWarning","RuntimeError","RuntimeWarning","StopAsyncIteration","StopIteration","SyntaxError","SyntaxWarning","SystemError","SystemExit","TabError","TimeoutError","TypeError","UnboundLocalError","UnicodeDecodeError","UnicodeEncodeError","UnicodeError","UnicodeTranslateError","UnicodeWarning","UserWarning","ValueError","Warning","ZeroDivisionError"].map(n=>({label:n,type:"type"}))).concat(["bool","bytearray","bytes","classmethod","complex","float","frozenset","int","list","map","memoryview","object","range","set","staticmethod","str","super","tuple","type"].map(n=>({label:n,type:"class"}))).concat(["abs","aiter","all","anext","any","ascii","bin","breakpoint","callable","chr","compile","delattr","dict","dir","divmod","enumerate","eval","exec","exit","filter","format","getattr","globals","hasattr","hash","help","hex","id","input","isinstance","issubclass","iter","len","license","locals","max","min","next","oct","open","ord","pow","print","property","quit","repr","reversed","round","setattr","slice","sorted","sum","vars","zip"].map(n=>({label:n,type:"function"}))),cx=[at("def ${name}(${params}):\n ${}",{label:"def",detail:"function",type:"keyword"}),at("for ${name} in ${collection}:\n ${}",{label:"for",detail:"loop",type:"keyword"}),at("while ${}:\n ${}",{label:"while",detail:"loop",type:"keyword"}),at("try:\n ${}\nexcept ${error}:\n ${}",{label:"try",detail:"/ except block",type:"keyword"}),at(`if \${}: + +`,{label:"if",detail:"block",type:"keyword"}),at("if ${}:\n ${}\nelse:\n ${}",{label:"if",detail:"/ else block",type:"keyword"}),at("class ${name}:\n def __init__(self, ${params}):\n ${}",{label:"class",detail:"definition",type:"keyword"}),at("import ${module}",{label:"import",detail:"statement",type:"keyword"}),at("from ${module} import ${names}",{label:"from",detail:"import",type:"keyword"})],fx=ky(ld,Bu(hx.concat(cx)));function Rr(n){let{node:e,pos:t}=n,i=n.lineIndent(t,-1),s=null;for(;;){let r=e.childBefore(t);if(r)if(r.name=="Comment")t=r.from;else if(r.name=="Body"||r.name=="MatchBody")n.baseIndentFor(r)+n.unit<=i&&(s=r),e=r;else if(r.name=="MatchClause")e=r;else if(r.type.is("Statement"))e=r;else break;else break}return s}function Dr(n,e){let t=n.baseIndentFor(e),i=n.lineAt(n.pos,-1),s=i.from+i.text.length;return/^\s*($|#)/.test(i.text)&&n.node.tot?null:t+n.unit}const Er=xs.define({name:"python",parser:ox.configure({props:[nl.add({Body:n=>{var e;let t=/^\s*(#|$)/.test(n.textAfter)&&Rr(n)||n.node;return(e=Dr(n,t))!==null&&e!==void 0?e:n.continue()},MatchBody:n=>{var e;let t=Rr(n);return(e=Dr(n,t||n.node))!==null&&e!==void 0?e:n.continue()},IfStatement:n=>/^\s*(else:|elif )/.test(n.textAfter)?n.baseIndent:n.continue(),"ForStatement WhileStatement":n=>/^\s*else:/.test(n.textAfter)?n.baseIndent:n.continue(),TryStatement:n=>/^\s*(except[ :]|finally:|else:)/.test(n.textAfter)?n.baseIndent:n.continue(),MatchStatement:n=>/^\s*case /.test(n.textAfter)?n.baseIndent+n.unit:n.continue(),"TupleExpression ComprehensionExpression ParamList ArgList ParenthesizedExpression":gr({closing:")"}),"DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression":gr({closing:"}"}),"ArrayExpression ArrayComprehensionExpression":gr({closing:"]"}),MemberExpression:n=>n.baseIndent+n.unit,"String FormatString":()=>null,Script:n=>{var e;let t=Rr(n);return(e=t&&Dr(n,t))!==null&&e!==void 0?e:n.continue()}}),Mf.add({"ArrayExpression DictionaryExpression SetExpression TupleExpression":tO,Body:(n,e)=>({from:n.from+1,to:n.to-(n.to==e.doc.length?0:1)}),"String FormatString":(n,e)=>({from:e.doc.lineAt(n.from).to,to:n.to})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"'''",'"""'],stringPrefixes:["f","fr","rf","r","u","b","br","rb","F","FR","RF","R","U","B","BR","RB"]},commentTokens:{line:"#"},indentOnInput:/^\s*([\}\]\)]|else:|elif |except |finally:|case\s+[^:]*:?)$/}});function ux(){return new Xg(Er,[Er.data.of({autocomplete:ax}),Er.data.of({autocomplete:fx})])}var qo={};function vl(n,e){for(var t=0;t1&&n.eat("$");var t=n.next();return/['"({]/.test(t)?(e.tokens[0]=Ks(t,t=="("?"quote":t=="{"?"def":"string"),wi(n,e)):(/\d/.test(t)||n.eatWhile(/\w/),e.tokens.shift(),"def")};function mx(n){return function(e,t){return e.sol()&&e.string==n&&t.tokens.shift(),e.skipToEnd(),"string.special"}}function wi(n,e){return(e.tokens[0]||dx)(n,e)}const Ih={name:"shell",startState:function(){return{tokens:[]}},token:function(n,e){return wi(n,e)},languageData:{autocomplete:ad.concat(hd,cd),closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"#"}}};var gx=_h('
');function qx(n,e){Nh(e,!1);const[t,i]=Sd(),s=()=>xd(kd,"$themeStore",t),r=Wi(),o=Fh();let l=Be(e,"value",12,""),a=Be(e,"language",12,"text"),h=Be(e,"readonly",8,!1);const c="";let f=Be(e,"minHeight",8,"200px"),u=Be(e,"autoDetect",8,!0),d=Be(e,"enableTemplateCompletion",8,!1),p=Wi(),m=Wi();function g(R){return R?[I1]:[]}function y(R){switch(R){case"python":return ux();case"bash":return ws.define(Ih);case"powershell":return ws.define(Ih);case"text":default:return[]}}function S(R){const P=R.split(` +`)[0]?.trim()||"";return P.startsWith("#!/bin/bash")||P.startsWith("#!/bin/sh")?"bash":P.startsWith("#!/usr/bin/env pwsh")||P.includes("#ps1_sysnative")?"powershell":P.startsWith("#!/usr/bin/env python")||P.startsWith("#!/usr/bin/python")?"python":R.includes("param(")||R.includes("Write-Host")||R.includes("$_")?"powershell":R.includes("def ")||R.includes("import ")||R.includes("print(")?"python":R.includes("echo ")||R.includes("export ")||R.includes("if [")?"bash":"text"}const k=[{label:"RunnerName",type:"string",detail:"The name of the runner instance"},{label:"MetadataURL",type:"string",detail:"URL for accessing runner metadata service"},{label:"Token",type:"string",detail:"Authentication token for runner registration"},{label:"RepoURL",type:"string",detail:"Repository URL"},{label:"DownloadURL",type:"string",detail:"URL to download the runner package"},{label:"FileName",type:"string",detail:"Name of the downloaded runner file"},{label:"TempDir",type:"string",detail:"Temporary directory path"},{label:"RunnerDir",type:"string",detail:"Runner installation directory"},{label:"GitHubRunnerGroup",type:"string",detail:"GitHub runner group name"},{label:"Labels",type:"[]string",detail:"Array of runner labels"},{label:"CACertBundle",type:"[]byte",detail:"CA certificate bundle"},{label:"OSType",type:"string",detail:"Operating system type (linux/windows)"},{label:"OSArch",type:"string",detail:"Operating system architecture (amd64/arm64)"},{label:"Flavor",type:"string",detail:"Runner flavor/size specification"},{label:"Image",type:"string",detail:"Runner image name"},{label:"ImageOS",type:"string",detail:"Operating system of the image"},{label:"ImageOSVersion",type:"string",detail:"Version of the operating system"},{label:"PoolID",type:"string",detail:"Pool identifier"},{label:"ExtraSpecs",type:"json.RawMessage",detail:"Additional specifications as JSON"},{label:"JitConfigEnabled",type:"bool",detail:"Whether just-in-time configuration is enabled"},{label:"UserDataOptions",type:"UserDataOptions",detail:"User data configuration options"}],v=[{label:"print",type:"function",detail:"Print arguments to output"},{label:"printf",type:"function",detail:"Print formatted string"},{label:"println",type:"function",detail:"Print arguments with newline"},{label:"len",type:"function",detail:"Get length of array, slice, map, or string"},{label:"index",type:"function",detail:"Get element at index from array or slice"},{label:"slice",type:"function",detail:"Create slice from array"},{label:"range",type:"function",detail:"Iterate over array, slice, or map"},{label:"if",type:"function",detail:"Conditional execution"},{label:"else",type:"function",detail:"Alternative execution branch"},{label:"end",type:"function",detail:"End block statement"},{label:"with",type:"function",detail:"Change context to specified value"},{label:"template",type:"function",detail:"Include another template"},{label:"define",type:"function",detail:"Define a named template"},{label:"block",type:"function",detail:"Define a template block"}];function x(R){if(!d())return null;const E=R.state.doc.lineAt(R.pos),P=E.text,q=R.pos-E.from,W=P.slice(0,q),N=P.slice(q),ee=W.lastIndexOf("{{"),K=N.indexOf("}}");if(ee===-1||K===-1)return null;const te=W.slice(ee+2),ie=te.match(/\.(\w*)$/);if(ie){const H=ie[1];return{from:R.pos-H.length,options:k.filter(ne=>ne.label.toLowerCase().startsWith(H.toLowerCase())).map(ne=>({label:ne.label,type:ne.type,detail:ne.detail,info:`${ne.type}: ${ne.detail}`}))}}const Se=te.match(/(\w+)$/);if(Se){const H=Se[1],ke=R.pos-H.length,ne=[...v.map(se=>({label:se.label,type:se.type,detail:se.detail,info:se.detail})),...k.map(se=>({label:`.${se.label}`,type:se.type,detail:se.detail,info:`${se.type}: ${se.detail}`}))];return{from:ke,options:ne.filter(se=>se.label.toLowerCase().includes(H.toLowerCase()))}}return te.trim()===""?{from:R.pos,options:[...v.map(H=>({label:H.label,type:H.type,detail:H.detail,info:H.detail})),...k.map(H=>({label:`.${H.label}`,type:H.type,detail:H.detail,info:`${H.type}: ${H.detail}`}))]}:null}function w(){if(!j(m))return;const R=[xh,...g(j(r)),y(a()),Q.updateListener.of(P=>{if(P.docChanged){const q=P.state.doc.toString();l(q),o("change",{value:q})}}),I.readOnly.of(h()),Q.theme({"&":{minHeight:f()},".cm-editor":{minHeight:f()},".cm-scroller":{minHeight:f()}})];d()&&R.push(Ro({override:[x]}));const E=I.create({doc:l(),extensions:R});zi(p,new Q({state:E,parent:j(m)}))}function T(){if(!j(p))return;const R=j(p).state.doc.toString();R!==l()&&j(p).dispatch({changes:{from:0,to:R.length,insert:l()}});const E=[xh,...g(j(r)),y(a()),Q.updateListener.of(P=>{if(P.docChanged){const q=P.state.doc.toString();l(q),o("change",{value:q})}}),I.readOnly.of(h()),Q.theme({"&":{minHeight:f()},".cm-editor":{minHeight:f()},".cm-scroller":{minHeight:f()}})];d()&&E.push(Ro({override:[x]})),j(p).dispatch({effects:B.reconfigure.of(E)})}pd(()=>{w()}),md(()=>{j(p)&&j(p).destroy()}),Wt(()=>s(),()=>{zi(r,s())}),Wt(()=>(zt(u()),zt(a()),zt(l())),()=>{if(u()&&a()==="text"&&l()){const R=S(l());R!=="text"&&a(R)}}),Wt(()=>(j(p),zt(a())),()=>{j(p)&&a()&&T()}),Wt(()=>(j(p),zt(l())),()=>{j(p)&&l()!==j(p).state.doc.toString()&&T()}),Wt(()=>(j(p),j(r)),()=>{j(p)&&j(r)!==void 0&&T()}),Xh(),Vh();var $=gx();bd($,R=>zi(m,R),()=>j(m)),St(n,$),vd(e,"placeholder",c);var L=Uh({placeholder:c});return i(),L}var Ox=$o(''),yx=$o(''),bx=$o(''),xx=_h('

');function $x(n,e){Nh(e,!1);const t=Wi(),i=Wi();let s=Be(e,"title",8),r=Be(e,"message",8),o=Be(e,"confirmText",8,"Confirm"),l=Be(e,"cancelText",8,"Cancel"),a=Be(e,"variant",8,"warning"),h=Be(e,"loading",8,!1);const c=Fh();function f(){c("confirm")}Wt(()=>zt(a()),()=>{zi(t,a()==="danger"?"text-red-600 dark:text-red-400":a()==="warning"?"text-yellow-600 dark:text-yellow-400":"text-blue-600 dark:text-blue-400")}),Wt(()=>zt(a()),()=>{zi(i,a()==="danger"?"bg-red-100 dark:bg-red-900":a()==="warning"?"bg-yellow-100 dark:bg-yellow-900":"bg-blue-100 dark:bg-blue-900")}),Xh(),Vh(),wd(n,{$$events:{close:()=>c("close")},children:(u,d)=>{var p=xx(),m=$t(p),g=$t(m);{var y=P=>{var q=Ox();ti(()=>wn(q,0,`h-6 w-6 ${j(t)??""}`)),St(P,q)},S=P=>{var q=Od(),W=yd(q);{var N=K=>{var te=yx();ti(()=>wn(te,0,`h-6 w-6 ${j(t)??""}`)),St(K,te)},ee=K=>{var te=bx();ti(()=>wn(te,0,`h-6 w-6 ${j(t)??""}`)),St(K,te)};Ql(W,K=>{a()==="warning"?K(N):K(ee,!1)},!0)}St(P,q)};Ql(g,P=>{a()==="danger"?P(y):P(S,!1)})}Bt(m);var k=Sn(m,2),v=$t(k),x=$t(v,!0);Bt(v);var w=Sn(v,2),T=$t(w),$=$t(T,!0);Bt(T),Bt(w),Bt(k);var L=Sn(k,2),R=$t(L);Al(R,{variant:"secondary",get disabled(){return h()},$$events:{click:()=>c("close")},children:(P,q)=>{Cl();var W=Pl();ti(()=>kn(W,l())),St(P,W)},$$slots:{default:!0}});var E=Sn(R,2);{let P=gd(()=>a()==="info"||a()==="warning"?"primary":a());Al(E,{get variant(){return j(P)},get disabled(){return h()},get loading(){return h()},$$events:{click:f},children:(q,W)=>{Cl();var N=Pl();ti(()=>kn(N,o())),St(q,N)},$$slots:{default:!0}})}Bt(L),Bt(p),ti(()=>{wn(m,1,`mx-auto flex items-center justify-center h-12 w-12 rounded-full ${j(i)??""} mb-4`),kn(x,s()),kn($,r())}),St(u,p)},$$slots:{default:!0}}),Uh()}export{$x as C,qx as a}; diff --git a/webapp/assets/_app/immutable/chunks/U3V4g_hv.js b/webapp/assets/_app/immutable/chunks/U3V4g_hv.js new file mode 100644 index 00000000..e4fb1d5c --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/U3V4g_hv.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as E}from"./C7KraPli.js";import{p as H,E as L,f as h,t as f,b as c,c as z,d as e,r as a,s as x,e as d,z as M,D as q}from"./cPTQ2Ibn.js";import{p as i,i as C}from"./DqFqoVWr.js";import{B as F}from"./DqbUkQgD.js";var G=h('
'),I=h('

');function S(u,t){H(t,!1);const _=L();let b=i(t,"title",8),k=i(t,"description",8),v=i(t,"actionLabel",8,null),g=i(t,"showAction",8,!0);function w(){_("action")}E();var r=I(),s=e(r),o=e(s),y=e(o,!0);a(o);var m=x(o,2),A=e(m,!0);a(m),a(s);var P=x(s,2);{var j=n=>{var l=G(),B=e(l);F(B,{variant:"primary",icon:'',$$events:{click:w},children:(D,J)=>{M();var p=q();f(()=>d(p,v())),c(D,p)},$$slots:{default:!0}}),a(l),c(n,l)};C(P,n=>{g()&&v()&&n(j)})}a(r),f(()=>{d(y,b()),d(A,k())}),c(u,r),z()}export{S as P}; diff --git a/webapp/assets/_app/immutable/chunks/WI-og7-I.js b/webapp/assets/_app/immutable/chunks/WI-og7-I.js new file mode 100644 index 00000000..7b2a363e --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/WI-og7-I.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import{i as K}from"./C7KraPli.js";import{p as O,f as U,d as e,r as t,s,q as c,u as o,z as at,t as W,e as g,b as h,c as Q,E as mt,D as ut,B as Y,a as Z,g as P}from"./cPTQ2Ibn.js";import{p as T,i as H,s as gt,a as pt}from"./DqFqoVWr.js";import{c as rt,d as tt,B as xt}from"./DqbUkQgD.js";import{b as R,B as $,e as ft}from"./DJsB5Z5V.js";import{e as yt}from"./JUkrBp3F.js";import{D as ht,G as et}from"./Du50aAe5.js";import{E as _t}from"./CPFytHjx.js";import{S as bt}from"./BZ2WxPPD.js";import{e as kt,i as wt}from"./CiWDXYQd.js";import{b as Ct}from"./Cwu7L3Xf.js";var Pt=U('

ID
Created At
Updated At
Status
Pool Balancer Type
');function $t(L,v){O(v,!1);let a=T(v,"entity",8),p=T(v,"entityType",8);function N(){return`${p().charAt(0).toUpperCase()+p().slice(1)} Information`}function n(){if(!a().endpoint?.base_url)return"#";switch(p()){case"repository":const d=a();return`${a().endpoint.base_url}/${d.owner}/${a().name}`;case"organization":return`${a().endpoint.base_url}/${a().name}`;case"enterprise":return`${a().endpoint.base_url}/enterprises/${a().name}`;default:return"#"}}function E(){return`${p().charAt(0).toUpperCase()+p().slice(1)} URL`}function V(){const d=a().pool_balancing_type;if(!d||d===""||d==="none")return"Round Robin (default)";switch(d){case"roundrobin":return"Round Robin";case"pack":return"Pack";default:return d}}K();var m=Pt(),x=e(m),_=e(x),I=e(_,!0);t(_);var b=s(_,2),i=e(b),f=s(e(i),2),k=e(f,!0);t(f),t(i);var u=s(i,2),D=s(e(u),2),M=e(D,!0);t(D),t(u);var w=s(u,2),S=s(e(w),2),G=e(S,!0);t(S),t(w);var r=s(w,2),C=s(e(r),2),l=e(C);{var j=d=>{$(d,{variant:"success",text:"Running"})},z=d=>{$(d,{variant:"error",text:"Stopped"})};H(l,d=>{c(a()),o(()=>a().pool_manager_status?.running)?d(j):d(z,!1)})}t(C),t(r);var B=s(r,2),A=s(e(B),2),y=e(A,!0);t(A),t(B);var q=s(B,2),F=e(q),st=e(F,!0);t(F);var X=s(F,2),J=e(X),ot=e(J);at(),t(J),t(X),t(q),t(b),t(x),t(m),W((d,it,dt,nt,lt,vt,ct)=>{g(I,d),g(k,(c(a()),o(()=>a().id))),g(M,it),g(G,dt),g(y,nt),g(st,lt),rt(J,"href",vt),g(ot,`${ct??""} `)},[()=>o(N),()=>(c(R),c(a()),o(()=>R(a().created_at))),()=>(c(R),c(a()),o(()=>R(a().updated_at))),()=>o(V),()=>o(E),()=>o(n),()=>o(n)]),h(L,m),Q()}var Tt=U('

No pools configured

'),Et=U('');function qt(L,v){O(v,!1);const[a,p]=gt(),N=()=>pt(yt,"$eagerCache",a);let n=T(v,"pools",8),E=T(v,"entityType",8),V=T(v,"entityId",8,""),m=T(v,"entityName",8,"");const x=mt();function _(){x("addPool",{entityType:E(),entityId:V(),entityName:m()})}const I=[{key:"id",title:"ID",flexible:!0,cellComponent:_t,cellProps:{entityType:"pool",showId:!0,fontMono:!0}},{key:"image",title:"Image",flexible:!0,cellComponent:et,cellProps:{field:"image",type:"code",showTitle:!0}},{key:"provider",title:"Provider",cellComponent:et,cellProps:{field:"provider_name"}},{key:"status",title:"Status",cellComponent:bt,cellProps:{statusType:"enabled"}}],b={entityType:"pool",primaryText:{field:"id",isClickable:!0,href:"/pools/{id}",useId:!0,isMonospace:!0},secondaryText:{field:"entity_name",computedValue:r=>ft(r,N())},badges:[{type:"custom",value:r=>({variant:r.enabled?"success":"error",text:r.enabled?"Enabled":"Disabled"})}]};K();var i=Et(),f=e(i),k=e(f),u=e(k),D=e(u);t(u);var M=s(u,2);t(k);var w=s(k,2);{var S=r=>{var C=Tt(),l=s(e(C),4),j=e(l);t(l);var z=s(l,2),B=e(z);xt(B,{variant:"primary",size:"sm",$$events:{click:_},children:(A,y)=>{at();var q=ut("Add Pool");h(A,q)},$$slots:{default:!0}}),t(z),t(C),W(()=>g(j,`No pools configured for this ${E()??""}.`)),h(r,C)},G=r=>{ht(r,{get columns(){return I},get data(){return n()},loading:!1,error:"",searchTerm:"",showSearch:!1,showPagination:!1,currentPage:1,get perPage(){return c(n()),o(()=>n().length)},totalPages:1,get totalItems(){return c(n()),o(()=>n().length)},itemName:"pools",emptyTitle:"No pools configured",get emptyMessage(){return`No pools configured for this ${E()??""}.`},emptyIconType:"cog",get mobileCardConfig(){return b}})};H(w,r=>{c(n()),o(()=>n().length===0)?r(S):r(G,!1)})}t(f),t(i),W(r=>{g(D,`Pools (${c(n()),o(()=>n().length)??""})`),rt(M,"href",r)},[()=>(c(tt),o(()=>tt("/pools")))]),h(L,i),Q(),p()}var It=U('

'),Bt=U('

Events

'),Nt=U('

Events

No events available

');function Wt(L,v){O(v,!1);let a=T(v,"events",8),p=T(v,"eventsContainer",12,void 0);K();var N=Y(),n=Z(N);{var E=m=>{var x=Bt(),_=e(x),I=s(e(_),2);kt(I,5,a,wt,(b,i)=>{var f=It(),k=e(f),u=e(k),D=e(u,!0);t(u);var M=s(u,2),w=e(M);{var S=l=>{$(l,{variant:"error",text:"Error"})},G=l=>{var j=Y(),z=Z(j);{var B=y=>{$(y,{variant:"warning",text:"Warning"})},A=y=>{$(y,{variant:"info",text:"Info"})};H(z,y=>{P(i),o(()=>(P(i).event_level||"info").toLowerCase()==="warning")?y(B):y(A,!1)},!0)}h(l,j)};H(w,l=>{P(i),o(()=>(P(i).event_level||"info").toLowerCase()==="error")?l(S):l(G,!1)})}var r=s(w,2),C=e(r,!0);t(r),t(M),t(k),t(f),W(l=>{g(D,(P(i),o(()=>P(i).message))),g(C,l)},[()=>(c(R),P(i),o(()=>R(P(i).created_at)))]),h(b,f)}),t(I),Ct(I,b=>p(b),()=>p()),t(_),t(x),h(m,x)},V=m=>{var x=Nt();h(m,x)};H(n,m=>{c(a()),o(()=>a()&&a().length>0)?m(E):m(V,!1)})}h(L,N),Q()}export{$t as E,qt as P,Wt as a}; diff --git a/webapp/assets/_app/immutable/chunks/b5SBTec5.js b/webapp/assets/_app/immutable/chunks/b5SBTec5.js deleted file mode 100644 index d5397c4c..00000000 --- a/webapp/assets/_app/immutable/chunks/b5SBTec5.js +++ /dev/null @@ -1 +0,0 @@ -import{F as t,G as S,u as b,H as h,S as k}from"./CRKWEg6v.js";function u(r,i){return r===i||r?.[k]===i}function d(r={},i,a,T){return t(()=>{var f,s;return S(()=>{f=s,s=[],b(()=>{r!==a(...s)&&(i(r,...s),f&&u(a(...f),r)&&i(null,...f))})}),()=>{h(()=>{s&&u(a(...s),r)&&i(null,...s)})}}),r}export{d as b}; diff --git a/webapp/assets/_app/immutable/chunks/cPTQ2Ibn.js b/webapp/assets/_app/immutable/chunks/cPTQ2Ibn.js new file mode 100644 index 00000000..0906d752 --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/cPTQ2Ibn.js @@ -0,0 +1,2 @@ +var Je=Array.isArray,wn=Array.prototype.indexOf,yn=Array.from,$e=Object.defineProperty,be=Object.getOwnPropertyDescriptor,gn=Object.getOwnPropertyDescriptors,bn=Object.prototype,mn=Array.prototype,At=Object.getPrototypeOf,dt=Object.isExtensible;function Mr(e){return typeof e=="function"}const Ne=()=>{};function Lr(e){return e()}function St(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}const k=2,Qe=4,qe=8,Ae=16,Y=32,ae=64,kt=128,O=256,De=512,m=1024,P=2048,H=4096,W=8192,de=16384,et=32768,Ct=65536,ht=1<<17,Rt=1<<18,tt=1<<19,nt=1<<20,Be=1<<21,rt=1<<22,X=1<<23,Z=Symbol("$state"),Fr=Symbol("legacy props"),qr=Symbol(""),at=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},st=3,me=8;function Tn(){throw new Error("https://svelte.dev/e/await_outside_boundary")}function he(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function xn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function An(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Sn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function kn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Cn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Rn(){throw new Error("https://svelte.dev/e/get_abort_signal_outside_reaction")}function On(){throw new Error("https://svelte.dev/e/hydration_failed")}function Ot(e){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")}function Vr(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Nn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Pn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Dn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}const Yr=1,Hr=2,Ur=4,$r=8,Br=16,Wr=1,zr=2,Gr=4,Kr=8,Xr=16,Nt=1,In=2,it="[",Mn="[!",Pt="]",oe={},E=Symbol(),Zr="http://www.w3.org/1999/xhtml",Jr="@attach";function je(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function Qr(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}let g=!1;function fe(e){g=e}let w;function I(e){if(e===null)throw je(),oe;return w=e}function ut(){return I(M(w))}function ea(e){if(g){if(M(w)!==null)throw je(),oe;w=e}}function ta(e=1){if(g){for(var t=e,n=w;t--;)n=M(n);w=n}}function na(){for(var e=0,t=w;;){if(t.nodeType===me){var n=t.data;if(n===Pt){if(e===0)return t;e-=1}else(n===it||n===Mn)&&(e+=1)}var r=M(t);t.remove(),t=r}}function ra(e){if(!e||e.nodeType!==me)throw je(),oe;return e.data}function Dt(e){return e===this.v}function It(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function aa(e,t){return e!==t}function Mt(e){return!It(e,this.v)}let Se=!1;function sa(){Se=!0}let p=null;function Ie(e){p=e}function Ln(e){return Ve().get(e)}function Fn(e,t){return Ve().set(e,t),t}function qn(e){return Ve().has(e)}function jn(){return Ve()}function Vn(e,t=!1,n){p={p,c:null,e:null,s:e,x:null,l:Se&&!t?{s:null,u:null,$:[]}:null}}function Yn(e){var t=p,n=t.e;if(n!==null){t.e=null;for(var r of n)Jt(r)}return e!==void 0&&(t.x=e),p=t.p,e??{}}function ke(){return!Se||p!==null&&p.l===null}function Ve(e){return p===null&&he(),p.c??=new Map(Hn(p)||void 0)}function Hn(e){let t=e.p;for(;t!==null;){const n=t.c;if(n!==null)return n;t=t.p}return null}const Un=new WeakMap;function $n(e){var t=h;if(t===null)return d.f|=X,e;if((t.f&et)===0){if((t.f&kt)===0)throw!t.parent&&e instanceof Error&&Lt(e),e;t.b.error(e)}else lt(e,t)}function lt(e,t){for(;t!==null;){if((t.f&kt)!==0)try{t.b.error(e);return}catch(n){e=n}t=t.parent}throw e instanceof Error&&Lt(e),e}function Lt(e){const t=Un.get(e);t&&($e(e,"message",{value:t.message}),$e(e,"stack",{value:t.stack}))}const Bn=typeof requestIdleCallback>"u"?e=>setTimeout(e,1):requestIdleCallback;let Ee=[],Te=[];function Ft(){var e=Ee;Ee=[],St(e)}function qt(){var e=Te;Te=[],St(e)}function jt(e){Ee.length===0&&queueMicrotask(Ft),Ee.push(e)}function ia(e){Te.length===0&&Bn(qt),Te.push(e)}function Wn(){Ee.length>0&&Ft(),Te.length>0&&qt()}function zn(){for(var e=h.b;e!==null&&!e.has_pending_snippet();)e=e.parent;return e===null&&Tn(),e}function ft(e){var t=k|P,n=d!==null&&(d.f&k)!==0?d:null;return h===null||n!==null&&(n.f&O)!==0?t|=O:h.f|=tt,{ctx:p,deps:null,effects:null,equals:Dt,f:t,fn:e,reactions:null,rv:0,v:E,wv:0,parent:n??h,ac:null}}function Gn(e,t){let n=h;n===null&&xn();var r=n.b,s=void 0,a=ct(E),i=null,f=!d;return ar(()=>{try{var u=e()}catch(_){u=Promise.reject(_)}var l=()=>u;s=i?.then(l,l)??Promise.resolve(u),i=s;var o=y,v=r.pending;f&&(r.update_pending_count(1),v||o.increment());const c=(_,b=void 0)=>{i=null,v||o.activate(),b?b!==at&&(a.f|=X,Le(a,b)):((a.f&X)!==0&&(a.f^=X),Le(a,_)),f&&(r.update_pending_count(-1),v||o.decrement()),Ht()};if(s.then(c,_=>c(null,_||"unknown")),o)return()=>{queueMicrotask(()=>o.neuter())}}),new Promise(u=>{function l(o){function v(){o===s?u(a):l(s)}o.then(v,v)}l(s)})}function ua(e){const t=ft(e);return sn(t),t}function Kn(e){const t=ft(e);return t.equals=Mt,t}function Vt(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;nGn(u))).then(u=>{s?.activate(),i();try{n([...e.map(r),...u])}catch(l){(a.f&de)===0&<(l,a)}s?.deactivate(),Ht()}).catch(u=>{f.error(u)})}function Jn(){var e=h,t=d,n=p;return function(){G(e),L(t),Ie(n)}}function Ht(){G(null),L(null),Ie(null)}const we=new Set;let y=null,He=null,ve=null,pt=new Set,Me=[];function Ut(){const e=Me.shift();Me.length>0&&queueMicrotask(Ut),e()}let ee=[],Ye=null,We=!1,Pe=!1;class te{current=new Map;#a=new Map;#s=new Set;#e=0;#f=null;#o=!1;#n=[];#i=[];#r=[];#t=[];#u=[];#c=[];#_=[];skipped_effects=new Set;process(t){ee=[],He=null;var n=null;if(we.size>1){n=new Map,ve=new Map;for(const[a,i]of this.current)n.set(a,{v:a.v,wv:a.wv}),a.v=i;for(const a of we)if(a!==this)for(const[i,f]of a.#a)n.has(i)||(n.set(i,{v:i.v,wv:i.wv}),i.v=f)}for(const a of t)this.#d(a);if(this.#n.length===0&&this.#e===0){this.#v();var r=this.#r,s=this.#t;this.#r=[],this.#t=[],this.#u=[],He=y,y=null,wt(r),wt(s),y===null?y=this:we.delete(this),this.#f?.resolve()}else this.#l(this.#r),this.#l(this.#t),this.#l(this.#u);if(n){for(const[a,{v:i,wv:f}]of n)a.wv<=f&&(a.v=i);ve=null}for(const a of this.#n)_e(a);for(const a of this.#i)_e(a);this.#n=[],this.#i=[]}#d(t){t.f^=m;for(var n=t.first;n!==null;){var r=n.f,s=(r&(Y|ae))!==0,a=s&&(r&m)!==0,i=a||(r&W)!==0||this.skipped_effects.has(n);if(!i&&n.fn!==null){if(s)n.f^=m;else if((r&m)===0)if((r&Qe)!==0)this.#t.push(n);else if((r&rt)!==0){var f=n.b?.pending?this.#i:this.#n;f.push(n)}else Ce(n)&&((n.f&Ae)!==0&&this.#u.push(n),_e(n));var u=n.first;if(u!==null){n=u;continue}}var l=n.parent;for(n=n.next;n===null&&l!==null;)n=l.next,l=l.parent}}#l(t){for(const n of t)((n.f&P)!==0?this.#c:this.#_).push(n),x(n,m);t.length=0}capture(t,n){this.#a.has(t)||this.#a.set(t,n),this.current.set(t,t.v)}activate(){y=this}deactivate(){y=null,He=null;for(const t of pt)if(pt.delete(t),t(),y!==null)break}neuter(){this.#o=!0}flush(){ee.length>0?ze():this.#v(),y===this&&(this.#e===0&&we.delete(this),this.deactivate())}#v(){if(!this.#o)for(const t of this.#s)t();this.#s.clear()}increment(){this.#e+=1}decrement(){if(this.#e-=1,this.#e===0){for(const t of this.#c)x(t,P),ne(t);for(const t of this.#_)x(t,H),ne(t);this.#r=[],this.#t=[],this.flush()}else this.deactivate()}add_callback(t){this.#s.add(t)}settled(){return(this.#f??=En()).promise}static ensure(){if(y===null){const t=y=new te;we.add(y),Pe||te.enqueue(()=>{y===t&&t.flush()})}return y}static enqueue(t){Me.length===0&&queueMicrotask(Ut),Me.unshift(t)}}function $t(e){var t=Pe;Pe=!0;try{var n;for(e&&(ze(),n=e());;){if(Wn(),ee.length===0&&(y?.flush(),ee.length===0))return Ye=null,n;ze()}}finally{Pe=t}}function ze(){var e=ce;We=!0;try{var t=0;for(bt(!0);ee.length>0;){var n=te.ensure();if(t++>1e3){var r,s;Qn()}n.process(ee),J.clear()}}finally{We=!1,bt(e),Ye=null}}function Qn(){try{Cn()}catch(e){lt(e,Ye)}}function wt(e){var t=e.length;if(t!==0){for(var n=0;ns&&(r.f&nt)!==0)break}}for(;nK(e))),t}function j(e,t,n=!1){d!==null&&(!D||(d.f&ht)!==0)&&ke()&&(d.f&(k|Ae|rt|ht))!==0&&!V?.includes(e)&&Dn();let r=n?ye(t):t;return Le(e,r)}function Le(e,t){if(!e.equals(t)){var n=e.v;pe?J.set(e,t):J.set(e,n),e.v=t;var r=te.ensure();r.capture(e,n),(e.f&k)!==0&&((e.f&P)!==0&&ot(e),x(e,(e.f&O)===0?m:H)),e.wv=ln(),Bt(e,P),ke()&&h!==null&&(h.f&m)!==0&&(h.f&(Y|ae))===0&&(R===null?_r([e]):R.push(e))}return t}function oa(e,t=1){var n=K(e),r=t===1?n++:n--;return j(e,n),r}function Ue(e){j(e,e.v+1)}function Bt(e,t){var n=e.reactions;if(n!==null)for(var r=ke(),s=n.length,a=0;a{if(Q===a)return f();var u=d,l=Q;L(null),Et(a);var o=f();return L(u),Et(l),o};return r&&n.set("length",$(e.length)),new Proxy(e,{defineProperty(f,u,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Nn();var o=n.get(u);return o===void 0?o=i(()=>{var v=$(l.value);return n.set(u,v),v}):j(o,l.value,!0),!0},deleteProperty(f,u){var l=n.get(u);if(l===void 0){if(u in f){const o=i(()=>$(E));n.set(u,o),Ue(s)}}else j(l,E),Ue(s);return!0},get(f,u,l){if(u===Z)return e;var o=n.get(u),v=u in f;if(o===void 0&&(!v||be(f,u)?.writable)&&(o=i(()=>{var _=ye(v?f[u]:E),b=$(_);return b}),n.set(u,o)),o!==void 0){var c=K(o);return c===E?void 0:c}return Reflect.get(f,u,l)},getOwnPropertyDescriptor(f,u){var l=Reflect.getOwnPropertyDescriptor(f,u);if(l&&"value"in l){var o=n.get(u);o&&(l.value=K(o))}else if(l===void 0){var v=n.get(u),c=v?.v;if(v!==void 0&&c!==E)return{enumerable:!0,configurable:!0,value:c,writable:!0}}return l},has(f,u){if(u===Z)return!0;var l=n.get(u),o=l!==void 0&&l.v!==E||Reflect.has(f,u);if(l!==void 0||h!==null&&(!o||be(f,u)?.writable)){l===void 0&&(l=i(()=>{var c=o?ye(f[u]):E,_=$(c);return _}),n.set(u,l));var v=K(l);if(v===E)return!1}return o},set(f,u,l,o){var v=n.get(u),c=u in f;if(r&&u==="length")for(var _=l;_$(E)),n.set(_+"",b))}if(v===void 0)(!c||be(f,u)?.writable)&&(v=i(()=>$(void 0)),j(v,ye(l)),n.set(u,v));else{c=v.v!==E;var q=i(()=>ye(l));j(v,q)}var Re=Reflect.getOwnPropertyDescriptor(f,u);if(Re?.set&&Re.set.call(o,l),!c){if(r&&typeof u=="string"){var Oe=n.get("length"),U=Number(u);Number.isInteger(U)&&U>=Oe.v&&j(Oe,U+1)}Ue(s)}return!0},ownKeys(f){K(s);var u=Reflect.ownKeys(f).filter(v=>{var c=n.get(v);return c===void 0||c.v!==E});for(var[l,o]of n)o.v!==E&&!(l in f)&&u.push(l);return u},setPrototypeOf(){Pn()}})}function yt(e){try{if(e!==null&&typeof e=="object"&&Z in e)return e[Z]}catch{}return e}function ca(e,t){return Object.is(yt(e),yt(t))}var gt,er,Wt,zt,Gt;function Ge(){if(gt===void 0){gt=window,er=document,Wt=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;zt=be(t,"firstChild").get,Gt=be(t,"nextSibling").get,dt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),dt(n)&&(n.__t=void 0)}}function z(e=""){return document.createTextNode(e)}function A(e){return zt.call(e)}function M(e){return Gt.call(e)}function _a(e,t){if(!g)return A(e);var n=A(w);if(n===null)n=w.appendChild(z());else if(t&&n.nodeType!==st){var r=z();return n?.before(r),I(r),r}return I(n),n}function va(e,t){if(!g){var n=A(e);return n instanceof Comment&&n.data===""?M(n):n}return w}function da(e,t=1,n=!1){let r=g?w:e;for(var s;t--;)s=r,r=M(r);if(!g)return r;if(n&&r?.nodeType!==st){var a=z();return r===null?s?.after(a):r.before(a),I(a),a}return I(r),r}function Kt(e){e.textContent=""}function ha(){return!1}function Xt(e){h===null&&d===null&&kn(),d!==null&&(d.f&O)!==0&&h===null&&Sn(),pe&&An()}function tr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function F(e,t,n,r=!0){var s=h;s!==null&&(s.f&W)!==0&&(e|=W);var a={ctx:p,deps:null,nodes_start:null,nodes_end:null,f:e|P,first:null,fn:t,last:null,next:null,parent:s,b:s&&s.b,prev:null,teardown:null,transitions:null,wv:0,ac:null};if(n)try{_e(a),a.f|=et}catch(u){throw re(a),u}else t!==null&&ne(a);var i=n&&a.deps===null&&a.first===null&&a.nodes_start===null&&a.teardown===null&&(a.f&tt)===0;if(!i&&r&&(s!==null&&tr(a,s),d!==null&&(d.f&k)!==0&&(e&ae)===0)){var f=d;(f.effects??=[]).push(a)}return a}function Zt(e){const t=F(qe,null,!1);return x(t,m),t.teardown=e,t}function nr(e){Xt();var t=h.f,n=!d&&(t&Y)!==0&&(t&et)===0;if(n){var r=p;(r.e??=[]).push(e)}else return Jt(e)}function Jt(e){return F(Qe|nt,e,!1)}function pa(e){return Xt(),F(qe|nt,e,!0)}function rr(e){te.ensure();const t=F(ae,e,!0);return(n={})=>new Promise(r=>{n.outro?fr(t,()=>{re(t),r(void 0)}):(re(t),r(void 0))})}function wa(e){return F(Qe,e,!1)}function ya(e,t){var n=p,r={effect:null,ran:!1,deps:e};n.l.$.push(r),r.effect=Qt(()=>{e(),!r.ran&&(r.ran=!0,se(t))})}function ga(){var e=p;Qt(()=>{for(var t of e.l.$){t.deps();var n=t.effect;(n.f&m)!==0&&x(n,H),Ce(n)&&_e(n),t.ran=!1}})}function ar(e){return F(rt|tt,e,!0)}function Qt(e,t=0){return F(qe|t,e,!0)}function ba(e,t=[],n=[]){Zn(t,n,r=>{F(qe,()=>e(...r.map(K)),!0)})}function sr(e,t=0){var n=F(Ae|t,e,!0);return n}function ir(e,t=!0){return F(Y,e,!0,t)}function en(e){var t=e.teardown;if(t!==null){const n=pe,r=d;mt(!0),L(null);try{t.call(null)}finally{mt(n),L(r)}}}function tn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){n.ac?.abort(at);var r=n.next;(n.f&ae)!==0?n.parent=null:re(n,t),n=r}}function ur(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&Y)===0&&re(t),t=n}}function re(e,t=!0){var n=!1;(t||(e.f&Rt)!==0)&&e.nodes_start!==null&&e.nodes_end!==null&&(lr(e.nodes_start,e.nodes_end),n=!0),tn(e,t&&!n),Fe(e,0),x(e,de);var r=e.transitions;if(r!==null)for(const a of r)a.stop();en(e);var s=e.parent;s!==null&&s.first!==null&&nn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes_start=e.nodes_end=e.ac=null}function lr(e,t){for(;e!==null;){var n=e===t?null:M(e);e.remove(),e=n}}function nn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function fr(e,t){var n=[];rn(e,n,!0),or(n,()=>{re(e),t&&t()})}function or(e,t){var n=e.length;if(n>0){var r=()=>--n||t();for(var s of e)s.out(r)}else t()}function rn(e,t,n){if((e.f&W)===0){if(e.f^=W,e.transitions!==null)for(const i of e.transitions)(i.is_global||n)&&t.push(i);for(var r=e.first;r!==null;){var s=r.next,a=(r.f&Ct)!==0||(r.f&Y)!==0;rn(r,t,a?n:!1),r=s}}}function ma(e){an(e,!0)}function an(e,t){if((e.f&W)!==0){e.f^=W,(e.f&m)===0&&(x(e,P),ne(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&Ct)!==0||(n.f&Y)!==0;an(n,s?t:!1),n=r}if(e.transitions!==null)for(const a of e.transitions)(a.is_global||t)&&a.in()}}let le=null;function cr(e){var t=le;try{if(le=new Set,se(e),t!==null)for(var n of le)t.add(n);return le}finally{le=t}}function Ea(e){for(var t of cr(e))Le(t,t.v)}let ce=!1;function bt(e){ce=e}let pe=!1;function mt(e){pe=e}let d=null,D=!1;function L(e){d=e}let h=null;function G(e){h=e}let V=null;function sn(e){d!==null&&(V===null?V=[e]:V.push(e))}let T=null,S=0,R=null;function _r(e){R=e}let un=1,xe=0,Q=xe;function Et(e){Q=e}let B=!1;function ln(){return++un}function Ce(e){var t=e.f;if((t&P)!==0)return!0;if((t&H)!==0){var n=e.deps,r=(t&O)!==0;if(n!==null){var s,a,i=(t&De)!==0,f=r&&h!==null&&!B,u=n.length;if((i||f)&&(h===null||(h.f&de)===0)){var l=e,o=l.parent;for(s=0;se.wv)return!0}(!r||h!==null&&!B)&&x(e,m)}return!1}function fn(e,t,n=!0){var r=e.reactions;if(r!==null&&!V?.includes(e))for(var s=0;s0)for(c.length=S+T.length,_=0;_{document.activeElement===n&&e.focus()})}}function Ca(e){g&&A(e)!==null&&Kt(e)}let Tt=!1;function mr(){Tt||(Tt=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function _n(e){var t=d,n=h;L(null),G(null);try{return e()}finally{L(t),G(n)}}function Ra(e,t,n,r=n){e.addEventListener(t,()=>_n(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),mr()}const vn=new Set,Xe=new Set;function Er(e,t,n,r={}){function s(a){if(r.capture||ge.call(t,a),!a.cancelBubble)return _n(()=>n?.call(this,a))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?jt(()=>{t.addEventListener(e,s,r)}):t.addEventListener(e,s,r),s}function Oa(e,t,n,r,s){var a={capture:r,passive:s},i=Er(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&Zt(()=>{t.removeEventListener(e,i,a)})}function Na(e){for(var t=0;t{throw U});throw c}}finally{e.__root=t,delete e.currentTarget,L(o),G(v)}}}let C;function Tr(){C=void 0}function Pa(e){let t=null,n=g;var r;if(g){for(t=w,C===void 0&&(C=A(document.head));C!==null&&(C.nodeType!==me||C.data!==it);)C=M(C);C===null?fe(!1):C=I(M(C))}g||(r=document.head.appendChild(z()));try{sr(()=>e(r),Rt)}finally{n&&(fe(!0),C=w,I(t))}}function _t(e){var t=document.createElement("template");return t.innerHTML=e.replaceAll("",""),t.content}function N(e,t){var n=h;n.nodes_start===null&&(n.nodes_start=e,n.nodes_end=t)}function Da(e,t){var n=(t&Nt)!==0,r=(t&In)!==0,s,a=!e.startsWith("");return()=>{if(g)return N(w,null),w;s===void 0&&(s=_t(a?e:""+e),n||(s=A(s)));var i=r||Wt?document.importNode(s,!0):s.cloneNode(!0);if(n){var f=A(i),u=i.lastChild;N(f,u)}else N(i,i);return i}}function xr(e,t,n="svg"){var r=!e.startsWith(""),s=(t&Nt)!==0,a=`<${n}>${r?e:""+e}`,i;return()=>{if(g)return N(w,null),w;if(!i){var f=_t(a),u=A(f);if(s)for(i=document.createDocumentFragment();A(u);)i.appendChild(A(u));else i=A(u)}var l=i.cloneNode(!0);if(s){var o=A(l),v=l.lastChild;N(o,v)}else N(l,l);return l}}function Ia(e,t){return xr(e,t,"svg")}function Ma(e=""){if(!g){var t=z(e+"");return N(t,t),t}var n=w;return n.nodeType!==st&&(n.before(n=z()),I(n)),N(n,n),n}function La(){if(g)return N(w,null),w;var e=document.createDocumentFragment(),t=document.createComment(""),n=z();return e.append(t,n),N(t,n),e}function Fa(e,t){if(g){h.nodes_end=w,ut();return}e!==null&&e.before(t)}function qa(e,t){var n=t==null?"":typeof t=="object"?t+"":t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=n+"")}function dn(e,t){return hn(e,t)}function Ar(e,t){Ge(),t.intro=t.intro??!1;const n=t.target,r=g,s=w;try{for(var a=A(n);a&&(a.nodeType!==me||a.data!==it);)a=M(a);if(!a)throw oe;fe(!0),I(a),ut();const i=hn(e,{...t,anchor:a});if(w===null||w.nodeType!==me||w.data!==Pt)throw je(),oe;return fe(!1),i}catch(i){if(i instanceof Error&&i.message.split(` +`).some(f=>f.startsWith("https://svelte.dev/e/")))throw i;return i!==oe&&console.warn("Failed to hydrate: ",i),t.recover===!1&&On(),Ge(),Kt(n),fe(!1),dn(e,t)}finally{fe(r),I(s),Tr()}}const ie=new Map;function hn(e,{target:t,anchor:n,props:r={},events:s,context:a,intro:i=!0}){Ge();var f=new Set,u=v=>{for(var c=0;c{var v=n??t.appendChild(z());return ir(()=>{if(a){Vn({});var c=p;c.c=a}s&&(r.$$events=s),g&&N(v,null),l=e(v,r)||{},g&&(h.nodes_end=w),a&&Yn()}),()=>{for(var c of f){t.removeEventListener(c,ge);var _=ie.get(c);--_===0?(document.removeEventListener(c,ge),ie.delete(c)):ie.set(c,_)}Xe.delete(u),v!==n&&v.parentNode?.removeChild(v)}});return Ze.set(l,o),l}let Ze=new WeakMap;function Sr(e,t){const n=Ze.get(e);return n?(Ze.delete(e),n(t)):Promise.resolve()}function kr(e){return(t,...n)=>{var r=e(...n),s;if(g)s=w,ut();else{var a=r.render().trim(),i=_t(a);s=A(i),t.before(s)}const f=r.setup?.(s);N(s,s),typeof f=="function"&&Zt(f)}}function Cr(e,t,n){if(e==null)return t(void 0),Ne;const r=se(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const ue=[];function ja(e,t=Ne){let n=null;const r=new Set;function s(f){if(It(e,f)&&(e=f,n)){const u=!ue.length;for(const l of r)l[1](),ue.push(l,e);if(u){for(let l=0;l{r.delete(l),r.size===0&&n&&(n(),n=null)}}return{set:s,update:a,subscribe:i}}function Va(e){let t;return Cr(e,n=>t=n)(),t}function Rr(){return d===null&&Rn(),(d.ac??=new AbortController).signal}function pn(e){p===null&&he(),Se&&p.l!==null?vt(p).m.push(e):nr(()=>{const t=se(e);if(typeof t=="function")return t})}function Or(e){p===null&&he(),pn(()=>()=>se(e))}function Nr(e,t,{bubbles:n=!1,cancelable:r=!1}={}){return new CustomEvent(e,{detail:t,bubbles:n,cancelable:r})}function Pr(){const e=p;return e===null&&he(),(t,n,r)=>{const s=e.s.$$events?.[t];if(s){const a=Je(s)?s.slice():[s],i=Nr(t,n,r);for(const f of a)f.call(e.x,i);return!i.defaultPrevented}return!0}}function Dr(e){p===null&&he(),p.l===null&&Ot(),vt(p).b.push(e)}function Ir(e){p===null&&he(),p.l===null&&Ot(),vt(p).a.push(e)}function vt(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const Ya=Object.freeze(Object.defineProperty({__proto__:null,afterUpdate:Ir,beforeUpdate:Dr,createEventDispatcher:Pr,createRawSnippet:kr,flushSync:$t,getAbortSignal:Rr,getAllContexts:jn,getContext:Ln,hasContext:qn,hydrate:Ar,mount:dn,onDestroy:Or,onMount:pn,setContext:Fn,settled:hr,tick:dr,unmount:Sr,untrack:se},Symbol.toStringTag,{value:"Module"}));export{er as $,Or as A,La as B,Ia as C,Ma as D,Pr as E,ja as F,Va as G,g as H,ut as I,sr as J,Ct as K,z as L,ir as M,y as N,ha as O,w as P,fr as Q,I as R,A as S,ra as T,Mn as U,na as V,fe as W,me as X,Pt as Y,Le as Z,ct as _,va as a,Qr as a$,yn as a0,Je as a1,Hr as a2,ma as a3,Yr as a4,Br as a5,W as a6,re as a7,M as a8,rn as a9,Gr as aA,ye as aB,de as aC,Kr as aD,Se as aE,zr as aF,Wr as aG,oa as aH,G as aI,Xr as aJ,pe as aK,Fr as aL,Mr as aM,Ar as aN,dn as aO,$t as aP,Sr as aQ,$ as aR,dr as aS,ua as aT,aa as aU,It as aV,lr as aW,je as aX,oe as aY,N as aZ,_t as a_,Kt as aa,or as ab,h as ac,Ur as ad,jt as ae,$r as af,wa as ag,Qt as ah,Z as ai,ke as aj,Ra as ak,He as al,p as am,pa as an,nr as ao,Lr as ap,St as aq,ft as ar,sa as as,E as at,Ne as au,Cr as av,Zt as aw,$e as ax,be as ay,Vr as az,Fa as b,ca as b0,Zn as b1,qr as b2,Zr as b3,At as b4,Jr as b5,gn as b6,xa as b7,Er as b8,Na as b9,ka as ba,Sa as bb,ia as bc,mr as bd,Aa as be,Ya as bf,Yn as c,_a as d,qa as e,Da as f,K as g,ga as h,Oa as i,Pa as j,j as k,ya as l,la as m,gt as n,pn as o,Vn as p,Ta as q,ea as r,da as s,ba as t,se as u,Kn as v,fa as w,Ca as x,Ea as y,ta as z}; diff --git a/webapp/assets/_app/immutable/chunks/e1m7WRO5.js b/webapp/assets/_app/immutable/chunks/e1m7WRO5.js deleted file mode 100644 index 18cde8a7..00000000 --- a/webapp/assets/_app/immutable/chunks/e1m7WRO5.js +++ /dev/null @@ -1 +0,0 @@ -import{M as K,K as T,L as j,N as C,_ as F,a0 as q,a1 as $,Y as z,a2 as x,O as G,P as A,Q as H,at as J,R as Z,aa as Q,U as V,T as W,au as D,m as X,av as k,s as U,J as ee,g as m,aw as re,ax as ne,ay as w,az as se,aA as M,ar as ae,q as ie,aB as te,aj as R,aC as ue,a6 as fe,aD as le,u as oe,aE as ce,aF as de,aG as _e,aH as N,aI as L,aJ as pe,aK as ve,S as Y,aL as B,aM as S}from"./CRKWEg6v.js";function Ie(e,r,s=!1){T&&j();var n=e,a=null,i=null,l=J,d=s?C:0,p=!1;const P=(o,u=!0)=>{p=!0,_(u,o)};var f=null;function I(){f!==null&&(f.lastChild.remove(),n.before(f),f=null);var o=l?a:i,u=l?i:a;o&&Q(o),u&&V(u,()=>{l?i=null:a=null})}const _=(o,u)=>{if(l===(l=o))return;let g=!1;if(T){const E=F(n)===q;!!l===E&&(n=$(),z(n),x(!1),g=!0)}var b=Z(),c=n;if(b&&(f=document.createDocumentFragment(),f.append(c=G())),l?a??=u&&A(()=>u(c)):i??=u&&A(()=>u(c)),b){var h=H,t=l?a:i,v=l?i:a;t&&h.skipped_effects.delete(t),v&&h.skipped_effects.add(v),h.add_callback(I)}else I();g&&x(!0)};K(()=>{p=!1,r(P),p||_(null,null)},d),T&&(n=W)}let O=!1,y=Symbol();function ge(e,r,s){const n=s[r]??={store:null,source:X(void 0),unsubscribe:D};if(n.store!==e&&!(y in s))if(n.unsubscribe(),n.store=e??null,e==null)n.source.v=void 0,n.unsubscribe=D;else{var a=!0;n.unsubscribe=k(e,i=>{a?n.source.v=i:U(n.source,i)}),a=!1}return e&&y in s?ee(e):m(n.source)}function Ee(){const e={};function r(){re(()=>{for(var s in e)e[s].unsubscribe();ne(e,y,{enumerable:!1,value:!0})})}return[e,r]}function be(e){var r=O;try{return O=!1,[e(),O]}finally{O=r}}const he={get(e,r){if(!e.exclude.includes(r))return m(e.version),r in e.special?e.special[r]():e.props[r]},set(e,r,s){if(!(r in e.special)){var n=R;try{L(e.parent_effect),e.special[r]=me({get[r](){return e.props[r]}},r,M)}finally{L(n)}}return e.special[r](s),N(e.version),!0},getOwnPropertyDescriptor(e,r){if(!e.exclude.includes(r)&&r in e.props)return{enumerable:!0,configurable:!0,value:e.props[r]}},deleteProperty(e,r){return e.exclude.includes(r)||(e.exclude.push(r),N(e.version)),!0},has(e,r){return e.exclude.includes(r)?!1:r in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(r=>!e.exclude.includes(r))}};function Oe(e,r){return new Proxy({props:e,exclude:r,special:{},version:fe(0),parent_effect:R},he)}const Se={get(e,r){let s=e.props.length;for(;s--;){let n=e.props[s];if(S(n)&&(n=n()),typeof n=="object"&&n!==null&&r in n)return n[r]}},set(e,r,s){let n=e.props.length;for(;n--;){let a=e.props[n];S(a)&&(a=a());const i=w(a,r);if(i&&i.set)return i.set(s),!0}return!1},getOwnPropertyDescriptor(e,r){let s=e.props.length;for(;s--;){let n=e.props[s];if(S(n)&&(n=n()),typeof n=="object"&&n!==null&&r in n){const a=w(n,r);return a&&!a.configurable&&(a.configurable=!0),a}}},has(e,r){if(r===Y||r===B)return!1;for(let s of e.props)if(S(s)&&(s=s()),s!=null&&r in s)return!0;return!1},ownKeys(e){const r=[];for(let s of e.props)if(S(s)&&(s=s()),!!s){for(const n in s)r.includes(n)||r.push(n);for(const n of Object.getOwnPropertySymbols(s))r.includes(n)||r.push(n)}return r}};function Te(...e){return new Proxy({props:e},Se)}function me(e,r,s,n){var a=!ce||(s&de)!==0,i=(s&le)!==0,l=(s&pe)!==0,d=n,p=!0,P=()=>(p&&(p=!1,d=l?oe(n):n),d),f;if(i){var I=Y in e||B in e;f=w(e,r)?.set??(I&&r in e?t=>e[r]=t:void 0)}var _,o=!1;i?[_,o]=be(()=>e[r]):_=e[r],_===void 0&&n!==void 0&&(_=P(),f&&(a&&se(),f(_)));var u;if(a?u=()=>{var t=e[r];return t===void 0?P():(p=!0,t)}:u=()=>{var t=e[r];return t!==void 0&&(d=void 0),t===void 0?d:t},a&&(s&M)===0)return u;if(f){var g=e.$$legacy;return function(t,v){return arguments.length>0?((!a||!v||g||o)&&f(v?u():t),t):u()}}var b=!1,c=((s&_e)!==0?ae:ie)(()=>(b=!1,u()));i&&m(c);var h=R;return function(t,v){if(arguments.length>0){const E=v?m(c):a&&i?te(t):t;return U(c,E),b=!0,d!==void 0&&(d=E),t}return ve&&b||(h.f&ue)!==0?c.v:m(c)}}export{ge as a,Te as b,Ie as i,Oe as l,me as p,Ee as s}; diff --git a/webapp/assets/_app/immutable/chunks/oOdVuDuv.js b/webapp/assets/_app/immutable/chunks/oOdVuDuv.js new file mode 100644 index 00000000..578ab21b --- /dev/null +++ b/webapp/assets/_app/immutable/chunks/oOdVuDuv.js @@ -0,0 +1 @@ +import"./DsnmJJEf.js";import"./C7KraPli.js";import{f as k,d as a,s as m,r as i,t as g,e as f,b as v,z as p,D as z}from"./cPTQ2Ibn.js";import{p as t,i as u}from"./DqFqoVWr.js";import{s as Y,h as Z,B as H}from"./DqbUkQgD.js";var $=k('
'),ee=k('
'),te=k('

');function se(j,e){let E=t(e,"title",8),M=t(e,"subtitle",8),D=t(e,"forgeIcon",8,""),h=t(e,"onEdit",8,null),x=t(e,"onDelete",8,null),B=t(e,"editLabel",8,"Edit"),C=t(e,"deleteLabel",8,"Delete"),P=t(e,"editVariant",8,"secondary"),A=t(e,"deleteVariant",8,"danger"),q=t(e,"editDisabled",8,!1),F=t(e,"deleteDisabled",8,!1),G=t(e,"editIcon",8,""),J=t(e,"deleteIcon",8,""),K=t(e,"titleClass",8,"");var _=te(),y=a(_),w=a(y),b=a(w),I=a(b);{var N=l=>{var d=$(),c=a(d);Z(c,D),i(d),v(l,d)};u(I,l=>{D()&&l(N)})}var L=m(I,2),o=a(L),O=a(o,!0);i(o);var V=m(o,2),Q=a(V,!0);i(V),i(L),i(b);var R=m(b,2);{var S=l=>{var d=ee(),c=a(d);{var T=r=>{H(r,{get variant(){return P()},size:"md",get disabled(){return q()},get icon(){return G()},$$events:{click(...s){h()?.apply(this,s)}},children:(s,X)=>{p();var n=z();g(()=>f(n,B())),v(s,n)},$$slots:{default:!0}})};u(c,r=>{h()&&r(T)})}var U=m(c,2);{var W=r=>{H(r,{get variant(){return A()},size:"md",get disabled(){return F()},get icon(){return J()},$$events:{click(...s){x()?.apply(this,s)}},children:(s,X)=>{p();var n=z();g(()=>f(n,C())),v(s,n)},$$slots:{default:!0}})};u(U,r=>{x()&&r(W)})}i(d),v(l,d)};u(R,l=>{(h()||x())&&l(S)})}i(w),i(y),i(_),g(()=>{Y(o,1,`text-2xl font-bold text-gray-900 dark:text-white ${K()??""}`),f(O,E()),f(Q,M())}),v(j,_)}export{se as D}; diff --git a/webapp/assets/_app/immutable/chunks/xe-4nY5o.js b/webapp/assets/_app/immutable/chunks/xe-4nY5o.js deleted file mode 100644 index 9b8fccf7..00000000 --- a/webapp/assets/_app/immutable/chunks/xe-4nY5o.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import{i as u}from"./DT0EGONV.js";import{p as v,E as m,f as h,j as r,r as d,e as t,c as k,d as g}from"./CRKWEg6v.js";import{e as b}from"./-esynYXT.js";var w=h('');function j(s,i){v(i,!1);const l=m();function n(){l("close")}function c(o){o.stopPropagation()}function f(o){o.key==="Escape"&&l("close")}u();var a=w(),e=r(a),p=r(e);b(p,i,"default",{}),d(e),d(a),t("click",e,c),t("click",a,n),t("keydown",a,f),k(s,a),g()}export{j as M}; diff --git a/webapp/assets/_app/immutable/entry/app.B4u5nxVj.js b/webapp/assets/_app/immutable/entry/app.B4u5nxVj.js new file mode 100644 index 00000000..54b40e1c --- /dev/null +++ b/webapp/assets/_app/immutable/entry/app.B4u5nxVj.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DYP5Tzsv.js","../chunks/DsnmJJEf.js","../chunks/C7KraPli.js","../chunks/cPTQ2Ibn.js","../chunks/DqFqoVWr.js","../chunks/DqbUkQgD.js","../chunks/D7e9zx6w.js","../chunks/BgSaD1r_.js","../chunks/CTvJf3dP.js","../chunks/BVyy60Ai.js","../chunks/CCFUzH5i.js","../chunks/CiWDXYQd.js","../chunks/DVsSf1wv.js","../chunks/BV_mDmfH.js","../chunks/Bgbd8SZ5.js","../assets/0.CP-xI7De.css","../nodes/1.BQyKnLFk.js","../nodes/2.C24-dbK7.js","../chunks/JUkrBp3F.js","../chunks/B-_QCM7E.js","../chunks/D4Caz1gY.js","../chunks/Bo3f8OIz.js","../chunks/BZiHL9L3.js","../nodes/3.CcPcfE5H.js","../chunks/U3V4g_hv.js","../chunks/Cqnw7O8j.js","../chunks/DJsB5Z5V.js","../chunks/C2rI8IaC.js","../chunks/Du50aAe5.js","../chunks/41x1-UqF.js","../chunks/CYqkNFLz.js","../chunks/BZ2WxPPD.js","../chunks/ow_oMtSd.js","../nodes/4.CdHupLIu.js","../nodes/5.BZ5sZ9vU.js","../chunks/B1V2wE0x.js","../chunks/91PQ6UtW.js","../chunks/CPFytHjx.js","../nodes/6.CAXPtVkl.js","../chunks/WI-og7-I.js","../chunks/Cwu7L3Xf.js","../chunks/oOdVuDuv.js","../chunks/DliFOxtc.js","../chunks/DPR9Z_fe.js","../chunks/D6f8Dk7c.js","../nodes/7.CRLDW2c_.js","../nodes/8.DVlwXnoT.js","../nodes/9.el4sTgm4.js","../nodes/10.BTAzlY6Z.js","../nodes/11.kE-kE_J5.js","../nodes/12.4nNpW1qS.js","../chunks/C7KJ549w.js","../nodes/13.B0F9yHlE.js","../chunks/2Xl6sR6s.js","../chunks/BM4Azg_w.js","../nodes/14.FP7fqeji.js","../nodes/15.1LkKX8Mu.js","../nodes/16.Un1eDEkg.js","../nodes/17.DCq-Dc1c.js","../chunks/BUaPampd.js","../nodes/18.xleZqgRD.js","../nodes/19.CWBEFCxV.js","../chunks/C98nByjP.js","../nodes/20.BcQWH_IW.js","../chunks/R3ADTHgb.js","../nodes/21.Nj7C5iaJ.js"])))=>i.map(i=>d[i]); +import{k as A,aL as z,g as f,aN as U,aO as G,aP as Q,ax as W,aQ as Y,m as F,p as H,an as J,ao as K,o as X,aR as T,aS as Z,f as j,a as y,s as $,b as g,c as tt,B as D,d as et,r as rt,aT as I,D as st,t as ot,e as at}from"../chunks/cPTQ2Ibn.js";import"../chunks/DsnmJJEf.js";import{p as V,i as b}from"../chunks/DqFqoVWr.js";import{c as w}from"../chunks/41x1-UqF.js";import{b as k}from"../chunks/Cwu7L3Xf.js";function it(_){return class extends nt{constructor(t){super({component:_,...t})}}}class nt{#e;#t;constructor(t){var a=new Map,c=(r,e)=>{var o=F(e,!1,!1);return a.set(r,o),o};const u=new Proxy({...t.props||{},$$events:{}},{get(r,e){return f(a.get(e)??c(e,Reflect.get(r,e)))},has(r,e){return e===z?!0:(f(a.get(e)??c(e,Reflect.get(r,e))),Reflect.has(r,e))},set(r,e,o){return A(a.get(e)??c(e,o),o),Reflect.set(r,e,o)}});this.#t=(t.hydrate?U:G)(t.component,{target:t.target,anchor:t.anchor,props:u,context:t.context,intro:t.intro??!1,recover:t.recover}),(!t?.props?.$$host||t.sync===!1)&&Q(),this.#e=u.$$events;for(const r of Object.keys(this.#t))r==="$set"||r==="$destroy"||r==="$on"||W(this,r,{get(){return this.#t[r]},set(e){this.#t[r]=e},enumerable:!0});this.#t.$set=r=>{Object.assign(u,r)},this.#t.$destroy=()=>{Y(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const c=(...u)=>a.call(this,...u);return this.#e[t].push(c),()=>{this.#e[t]=this.#e[t].filter(u=>u!==c)}}$destroy(){this.#t.$destroy()}}const _t="modulepreload",ct=function(_,t){return new URL(_,t).href},C={},s=function(t,a,c){let u=Promise.resolve();if(a&&a.length>0){let L=function(n){return Promise.all(n.map(d=>Promise.resolve(d).then(v=>({status:"fulfilled",value:v}),v=>({status:"rejected",reason:v}))))};const e=document.getElementsByTagName("link"),o=document.querySelector("meta[property=csp-nonce]"),O=o?.nonce||o?.getAttribute("nonce");u=L(a.map(n=>{if(n=ct(n,c),n in C)return;C[n]=!0;const d=n.endsWith(".css"),v=d?'[rel="stylesheet"]':"";if(!!c)for(let i=e.length-1;i>=0;i--){const m=e[i];if(m.href===n&&(!d||m.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${n}"]${v}`))return;const l=document.createElement("link");if(l.rel=d?"stylesheet":_t,d||(l.as="script"),l.crossOrigin="",l.href=n,O&&l.setAttribute("nonce",O),document.head.appendChild(l),d)return new Promise((i,m)=>{l.addEventListener("load",i),l.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${n}`)))})}))}function r(e){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=e,window.dispatchEvent(o),!o.defaultPrevented)throw e}return u.then(e=>{for(const o of e||[])o.status==="rejected"&&r(o.reason);return t().catch(r)})},Rt={};var ut=j('
'),mt=j(" ",1);function lt(_,t){H(t,!0);let a=V(t,"components",23,()=>[]),c=V(t,"data_0",3,null),u=V(t,"data_1",3,null);J(()=>t.stores.page.set(t.page)),K(()=>{t.stores,t.page,t.constructors,a(),t.form,c(),u(),t.stores.page.notify()});let r=T(!1),e=T(!1),o=T(null);X(()=>{const i=t.stores.page.subscribe(()=>{f(r)&&(A(e,!0),Z().then(()=>{A(o,document.title||"untitled page",!0)}))});return A(r,!0),i});const O=I(()=>t.constructors[1]);var L=mt(),n=y(L);{var d=i=>{const m=I(()=>t.constructors[0]);var h=D(),P=y(h);w(P,()=>f(m),(p,E)=>{k(E(p,{get data(){return c()},get form(){return t.form},get params(){return t.page.params},children:(R,vt)=>{var S=D(),B=y(S);w(B,()=>f(O),(N,M)=>{k(M(N,{get data(){return u()},get form(){return t.form},get params(){return t.page.params}}),q=>a()[1]=q,()=>a()?.[1])}),g(R,S)},$$slots:{default:!0}}),R=>a()[0]=R,()=>a()?.[0])}),g(i,h)},v=i=>{const m=I(()=>t.constructors[0]);var h=D(),P=y(h);w(P,()=>f(m),(p,E)=>{k(E(p,{get data(){return c()},get form(){return t.form},get params(){return t.page.params}}),R=>a()[0]=R,()=>a()?.[0])}),g(i,h)};b(n,i=>{t.constructors[1]?i(d):i(v,!1)})}var x=$(n,2);{var l=i=>{var m=ut(),h=et(m);{var P=p=>{var E=st();ot(()=>at(E,f(o))),g(p,E)};b(h,p=>{f(e)&&p(P)})}rt(m),g(i,m)};b(x,i=>{f(r)&&i(l)})}g(_,L),tt()}const Ot=it(lt),Lt=[()=>s(()=>import("../nodes/0.DYP5Tzsv.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]),import.meta.url),()=>s(()=>import("../nodes/1.BQyKnLFk.js"),__vite__mapDeps([16,1,2,3,7,8,6]),import.meta.url),()=>s(()=>import("../nodes/2.C24-dbK7.js"),__vite__mapDeps([17,1,2,3,4,11,5,6,13,18,19,20,21,14,22]),import.meta.url),()=>s(()=>import("../nodes/3.CcPcfE5H.js"),__vite__mapDeps([23,1,2,3,4,11,5,6,19,20,24,25,26,27,28,29,18,13,14,22,30,31,32]),import.meta.url),()=>s(()=>import("../nodes/4.CdHupLIu.js"),__vite__mapDeps([33,1,2,3,4,5,6,19,20,24,25,26,27,18,13,14,22,28,11,29,30]),import.meta.url),()=>s(()=>import("../nodes/5.BZ5sZ9vU.js"),__vite__mapDeps([34,1,2,3,4,5,6,24,11,19,20,21,22,18,13,35,36,14,26,28,29,27,37,30,31,32]),import.meta.url),()=>s(()=>import("../nodes/6.CAXPtVkl.js"),__vite__mapDeps([38,1,2,3,4,5,6,12,8,35,11,19,20,22,21,36,39,26,18,13,28,29,27,37,31,32,40,41,42,14,43,44]),import.meta.url),()=>s(()=>import("../nodes/7.CRLDW2c_.js"),__vite__mapDeps([45,1,2,3,4,5,6,19,20,8,9,14,22]),import.meta.url),()=>s(()=>import("../nodes/8.DVlwXnoT.js"),__vite__mapDeps([46,1,2,3,4,5,6,36,21,24,13,14,28,11,29,19,27,26,22,37,31,32]),import.meta.url),()=>s(()=>import("../nodes/9.el4sTgm4.js"),__vite__mapDeps([47,1,2,3,4,11,5,6,40,12,8,36,21,13,32,26,22]),import.meta.url),()=>s(()=>import("../nodes/10.BTAzlY6Z.js"),__vite__mapDeps([48,1,2,3,4,5,6,19,20,8,9,22]),import.meta.url),()=>s(()=>import("../nodes/11.kE-kE_J5.js"),__vite__mapDeps([49,1,2,3,4,5,6,11,19,20,21,25,26,22,18,13,35,36,24,14,28,29,27,37,30,31,32]),import.meta.url),()=>s(()=>import("../nodes/12.4nNpW1qS.js"),__vite__mapDeps([50,1,2,3,4,5,6,12,8,35,11,19,20,22,21,36,39,26,18,13,28,29,27,37,31,32,40,41,42,51,14,43,44]),import.meta.url),()=>s(()=>import("../nodes/13.B0F9yHlE.js"),__vite__mapDeps([52,1,2,3,4,5,6,24,43,11,19,20,21,22,44,53,18,13,36,28,29,27,26,14,37,30,31,32,54]),import.meta.url),()=>s(()=>import("../nodes/14.FP7fqeji.js"),__vite__mapDeps([55,1,2,3,4,11,5,6,7,8,53,19,20,21,44,22,18,13,36,42,28,29,27,26,37,31,32,41,14]),import.meta.url),()=>s(()=>import("../nodes/15.1LkKX8Mu.js"),__vite__mapDeps([56,1,2,3,4,5,6,11,19,20,21,22,25,26,18,13,35,36,24,14,28,29,27,37,30,31,32]),import.meta.url),()=>s(()=>import("../nodes/16.Un1eDEkg.js"),__vite__mapDeps([57,1,2,3,4,5,6,12,8,35,11,19,20,22,21,36,39,26,18,13,28,29,27,37,31,32,40,41,42,51,14,43,44]),import.meta.url),()=>s(()=>import("../nodes/17.DCq-Dc1c.js"),__vite__mapDeps([58,1,2,3,4,5,6,24,11,19,20,21,44,22,59,18,13,36,28,29,27,26,14,37,30,31,32,54]),import.meta.url),()=>s(()=>import("../nodes/18.xleZqgRD.js"),__vite__mapDeps([60,1,2,3,4,5,6,7,8,59,11,19,20,21,22,44,18,13,36,42,28,29,27,26,37,31,32,41,14]),import.meta.url),()=>s(()=>import("../nodes/19.CWBEFCxV.js"),__vite__mapDeps([61,1,2,3,4,8,6,5,24,27,28,11,29,19,26,14,22,36,21,37,62,18,13]),import.meta.url),()=>s(()=>import("../nodes/20.BcQWH_IW.js"),__vite__mapDeps([63,1,2,3,4,5,6,19,20,7,8,27,14,22,26,41,64,40,10,21,62,13]),import.meta.url),()=>s(()=>import("../nodes/21.Nj7C5iaJ.js"),__vite__mapDeps([65,1,2,3,4,5,6,19,40,20,8,7,14,22,41,64,10,21]),import.meta.url)],yt=[],At={"/":[2],"/credentials":[3],"/endpoints":[4],"/enterprises":[5],"/enterprises/[id]":[6],"/init":[7],"/instances":[8],"/instances/[id]":[9],"/login":[10],"/organizations":[11],"/organizations/[id]":[12],"/pools":[13],"/pools/[id]":[14],"/repositories":[15],"/repositories/[id]":[16],"/scalesets":[17],"/scalesets/[id]":[18],"/templates":[19],"/templates/create":[21],"/templates/[id]":[20]},dt={handleError:({error:_})=>{console.error(_)},reroute:()=>{},transport:{}},ft=Object.fromEntries(Object.entries(dt.transport).map(([_,t])=>[_,t.decode])),Tt=!1,Dt=(_,t)=>ft[_](t);export{Dt as decode,ft as decoders,At as dictionary,Tt as hash,dt as hooks,Rt as matchers,Lt as nodes,Ot as root,yt as server_loads}; diff --git a/webapp/assets/_app/immutable/entry/app.Cfl2QgNR.js b/webapp/assets/_app/immutable/entry/app.Cfl2QgNR.js deleted file mode 100644 index 18b665d4..00000000 --- a/webapp/assets/_app/immutable/entry/app.Cfl2QgNR.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.W3yf06lM.js","../chunks/DsnmJJEf.js","../chunks/DT0EGONV.js","../chunks/CRKWEg6v.js","../chunks/e1m7WRO5.js","../chunks/-esynYXT.js","../chunks/D0m048VH.js","../chunks/B0m3rqSR.js","../chunks/Dkb9lSSG.js","../chunks/D9uxtZe_.js","../chunks/C73ZVvpW.js","../chunks/D6DjlyIQ.js","../assets/0.pWW488Rd.css","../nodes/1.R-OM_0cI.js","../nodes/2.gx-OccLZ.js","../chunks/Djd10kRn.js","../chunks/B3a35v7J.js","../chunks/D4Caz1gY.js","../chunks/xe-4nY5o.js","../chunks/BZiHL9L3.js","../nodes/3.BvdHw7b_.js","../chunks/BAnDfGwP.js","../chunks/CiGy614T.js","../chunks/c_t0vA9G.js","../chunks/B1coRVG4.js","../chunks/Ddit_D7n.js","../chunks/B27KefbC.js","../chunks/B0Y2gXDu.js","../chunks/ow_oMtSd.js","../nodes/4.D_eeR06y.js","../nodes/5.YDqRaTm4.js","../chunks/DxLDbRe7.js","../chunks/BXdh0O4_.js","../chunks/DF8ZTWYj.js","../nodes/6.D20Gw7eV.js","../chunks/Bc0BXFmi.js","../chunks/b5SBTec5.js","../chunks/CrNwrvNH.js","../chunks/BQabvZPm.js","../chunks/DJsbLMno.js","../nodes/7.VnEcY_XD.js","../nodes/8.D4Evg3dB.js","../nodes/9.BqnVeyTj.js","../nodes/10.DJKJweNi.js","../nodes/11.DtXtnXMl.js","../nodes/12.Cnc0Zn3x.js","../chunks/0HF0aP0D.js","../nodes/13.DReyzJRQ.js","../chunks/BxQMwFca.js","../chunks/BMHtEUeX.js","../nodes/14.Cn4SQVXe.js","../nodes/15.D_6PjcIl.js","../nodes/16.Ik_X802Y.js","../nodes/17.BTCY_aol.js","../chunks/DJ6ZD3Tj.js","../nodes/18.MXydOOIa.js"])))=>i.map(i=>d[i]); -import{s as A,aL as z,g as f,aN as U,aO as G,aP as Q,ax as W,aQ as Y,m as F,p as H,an as J,ao as K,o as X,aR as b,aS as Z,f as C,b as L,k as $,c as g,d as tt,B as T,j as et,r as rt,aT as D,D as st,t as ot,v as at}from"../chunks/CRKWEg6v.js";import"../chunks/DsnmJJEf.js";import{p as I,i as V}from"../chunks/e1m7WRO5.js";import{c as w}from"../chunks/Ddit_D7n.js";import{b as k}from"../chunks/b5SBTec5.js";function nt(c){return class extends it{constructor(t){super({component:c,...t})}}}class it{#e;#t;constructor(t){var a=new Map,u=(r,e)=>{var s=F(e,!1,!1);return a.set(r,s),s};const l=new Proxy({...t.props||{},$$events:{}},{get(r,e){return f(a.get(e)??u(e,Reflect.get(r,e)))},has(r,e){return e===z?!0:(f(a.get(e)??u(e,Reflect.get(r,e))),Reflect.has(r,e))},set(r,e,s){return A(a.get(e)??u(e,s),s),Reflect.set(r,e,s)}});this.#t=(t.hydrate?U:G)(t.component,{target:t.target,anchor:t.anchor,props:l,context:t.context,intro:t.intro??!1,recover:t.recover}),(!t?.props?.$$host||t.sync===!1)&&Q(),this.#e=l.$$events;for(const r of Object.keys(this.#t))r==="$set"||r==="$destroy"||r==="$on"||W(this,r,{get(){return this.#t[r]},set(e){this.#t[r]=e},enumerable:!0});this.#t.$set=r=>{Object.assign(l,r)},this.#t.$destroy=()=>{Y(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const u=(...l)=>a.call(this,...l);return this.#e[t].push(u),()=>{this.#e[t]=this.#e[t].filter(l=>l!==u)}}$destroy(){this.#t.$destroy()}}const ct="modulepreload",ut=function(c,t){return new URL(c,t).href},j={},o=function(t,a,u){let l=Promise.resolve();if(a&&a.length>0){let O=function(i){return Promise.all(i.map(d=>Promise.resolve(d).then(v=>({status:"fulfilled",value:v}),v=>({status:"rejected",reason:v}))))};const e=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),y=s?.nonce||s?.getAttribute("nonce");l=O(a.map(i=>{if(i=ut(i,u),i in j)return;j[i]=!0;const d=i.endsWith(".css"),v=d?'[rel="stylesheet"]':"";if(!!u)for(let n=e.length-1;n>=0;n--){const _=e[n];if(_.href===i&&(!d||_.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${v}`))return;const m=document.createElement("link");if(m.rel=d?"stylesheet":ct,d||(m.as="script"),m.crossOrigin="",m.href=i,y&&m.setAttribute("nonce",y),document.head.appendChild(m),d)return new Promise((n,_)=>{m.addEventListener("load",n),m.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${i}`)))})}))}function r(e){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=e,window.dispatchEvent(s),!s.defaultPrevented)throw e}return l.then(e=>{for(const s of e||[])s.status==="rejected"&&r(s.reason);return t().catch(r)})},Rt={};var lt=C('
'),_t=C(" ",1);function mt(c,t){H(t,!0);let a=I(t,"components",23,()=>[]),u=I(t,"data_0",3,null),l=I(t,"data_1",3,null);J(()=>t.stores.page.set(t.page)),K(()=>{t.stores,t.page,t.constructors,a(),t.form,u(),l(),t.stores.page.notify()});let r=b(!1),e=b(!1),s=b(null);X(()=>{const n=t.stores.page.subscribe(()=>{f(r)&&(A(e,!0),Z().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(r,!0),n});const y=D(()=>t.constructors[1]);var O=_t(),i=L(O);{var d=n=>{const _=D(()=>t.constructors[0]);var h=T(),P=L(h);w(P,()=>f(_),(E,p)=>{k(p(E,{get data(){return u()},get form(){return t.form},get params(){return t.page.params},children:(R,vt)=>{var S=T(),B=L(S);w(B,()=>f(y),(N,M)=>{k(M(N,{get data(){return l()},get form(){return t.form},get params(){return t.page.params}}),q=>a()[1]=q,()=>a()?.[1])}),g(R,S)},$$slots:{default:!0}}),R=>a()[0]=R,()=>a()?.[0])}),g(n,h)},v=n=>{const _=D(()=>t.constructors[0]);var h=T(),P=L(h);w(P,()=>f(_),(E,p)=>{k(p(E,{get data(){return u()},get form(){return t.form},get params(){return t.page.params}}),R=>a()[0]=R,()=>a()?.[0])}),g(n,h)};V(i,n=>{t.constructors[1]?n(d):n(v,!1)})}var x=$(i,2);{var m=n=>{var _=lt(),h=et(_);{var P=E=>{var p=st();ot(()=>at(p,f(s))),g(E,p)};V(h,E=>{f(e)&&E(P)})}rt(_),g(n,_)};V(x,n=>{f(r)&&n(m)})}g(c,O),tt()}const yt=nt(mt),Ot=[()=>o(()=>import("../nodes/0.W3yf06lM.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>o(()=>import("../nodes/1.R-OM_0cI.js"),__vite__mapDeps([13,1,2,3,8,6]),import.meta.url),()=>o(()=>import("../nodes/2.gx-OccLZ.js"),__vite__mapDeps([14,1,2,3,4,10,5,6,15,16,17,18,11,19]),import.meta.url),()=>o(()=>import("../nodes/3.BvdHw7b_.js"),__vite__mapDeps([20,1,2,3,4,10,5,6,16,17,21,22,23,24,25,15,11,19,26,27,28]),import.meta.url),()=>o(()=>import("../nodes/4.D_eeR06y.js"),__vite__mapDeps([29,1,2,3,4,5,6,16,17,21,22,23,24,10,25,15,11,19,26]),import.meta.url),()=>o(()=>import("../nodes/5.YDqRaTm4.js"),__vite__mapDeps([30,1,2,3,4,5,6,21,10,16,17,18,19,15,31,32,11,23,24,25,33,26,27,28]),import.meta.url),()=>o(()=>import("../nodes/6.D20Gw7eV.js"),__vite__mapDeps([34,1,2,3,4,5,6,7,8,31,10,16,17,19,18,32,35,23,15,24,25,33,27,28,36,37,11,38,39]),import.meta.url),()=>o(()=>import("../nodes/7.VnEcY_XD.js"),__vite__mapDeps([40,1,2,3,4,5,6,16,17,8,9,11,19]),import.meta.url),()=>o(()=>import("../nodes/8.D4Evg3dB.js"),__vite__mapDeps([41,1,2,3,4,5,6,32,18,21,10,11,24,25,16,23,19,33,27,28]),import.meta.url),()=>o(()=>import("../nodes/9.BqnVeyTj.js"),__vite__mapDeps([42,1,2,3,4,10,5,6,36,7,8,32,18,28,23,19]),import.meta.url),()=>o(()=>import("../nodes/10.DJKJweNi.js"),__vite__mapDeps([43,1,2,3,4,5,6,16,17,8,9,19]),import.meta.url),()=>o(()=>import("../nodes/11.DtXtnXMl.js"),__vite__mapDeps([44,1,2,3,4,5,6,10,16,17,18,22,23,19,15,31,32,21,11,24,25,33,26,27,28]),import.meta.url),()=>o(()=>import("../nodes/12.Cnc0Zn3x.js"),__vite__mapDeps([45,1,2,3,4,5,6,7,8,31,10,16,17,19,18,32,35,23,15,24,25,33,27,28,36,37,46,11,38,39]),import.meta.url),()=>o(()=>import("../nodes/13.DReyzJRQ.js"),__vite__mapDeps([47,1,2,3,4,5,6,21,38,10,16,17,18,19,39,48,15,32,24,25,23,11,33,26,27,28,49]),import.meta.url),()=>o(()=>import("../nodes/14.Cn4SQVXe.js"),__vite__mapDeps([50,1,2,3,4,10,5,6,7,8,48,16,17,18,39,19,15,32,37,24,25,23,33,27,28,11]),import.meta.url),()=>o(()=>import("../nodes/15.D_6PjcIl.js"),__vite__mapDeps([51,1,2,3,4,5,6,10,16,17,18,19,22,23,15,31,32,21,11,24,25,33,26,27,28]),import.meta.url),()=>o(()=>import("../nodes/16.Ik_X802Y.js"),__vite__mapDeps([52,1,2,3,4,5,6,7,8,31,10,16,17,19,18,32,35,23,15,24,25,33,27,28,36,37,46,11,38,39]),import.meta.url),()=>o(()=>import("../nodes/17.BTCY_aol.js"),__vite__mapDeps([53,1,2,3,4,5,6,21,10,16,17,18,39,19,54,32,24,25,23,15,11,33,26,27,28,49]),import.meta.url),()=>o(()=>import("../nodes/18.MXydOOIa.js"),__vite__mapDeps([55,1,2,3,4,5,6,7,8,54,16,17,18,19,39,32,37,24,10,25,23,33,27,28,11]),import.meta.url)],Lt=[],At={"/":[2],"/credentials":[3],"/endpoints":[4],"/enterprises":[5],"/enterprises/[id]":[6],"/init":[7],"/instances":[8],"/instances/[id]":[9],"/login":[10],"/organizations":[11],"/organizations/[id]":[12],"/pools":[13],"/pools/[id]":[14],"/repositories":[15],"/repositories/[id]":[16],"/scalesets":[17],"/scalesets/[id]":[18]},dt={handleError:({error:c})=>{console.error(c)},reroute:()=>{},transport:{}},ft=Object.fromEntries(Object.entries(dt.transport).map(([c,t])=>[c,t.decode])),bt=!1,Tt=(c,t)=>ft[c](t);export{Tt as decode,ft as decoders,At as dictionary,bt as hash,dt as hooks,Rt as matchers,Ot as nodes,yt as root,Lt as server_loads}; diff --git a/webapp/assets/_app/immutable/entry/start.-FfRLqKC.js b/webapp/assets/_app/immutable/entry/start.-FfRLqKC.js new file mode 100644 index 00000000..c4f1cdf1 --- /dev/null +++ b/webapp/assets/_app/immutable/entry/start.-FfRLqKC.js @@ -0,0 +1 @@ +import{l as o,a as r}from"../chunks/CTvJf3dP.js";export{o as load_css,r as start}; diff --git a/webapp/assets/_app/immutable/entry/start.DNVtGLiy.js b/webapp/assets/_app/immutable/entry/start.DNVtGLiy.js deleted file mode 100644 index 52ecba40..00000000 --- a/webapp/assets/_app/immutable/entry/start.DNVtGLiy.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,a as r}from"../chunks/Dkb9lSSG.js";export{o as load_css,r as start}; diff --git a/webapp/assets/_app/immutable/nodes/0.DYP5Tzsv.js b/webapp/assets/_app/immutable/nodes/0.DYP5Tzsv.js new file mode 100644 index 00000000..fcea88fe --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/0.DYP5Tzsv.js @@ -0,0 +1,13 @@ +import"../chunks/DsnmJJEf.js";import{i as $e}from"../chunks/C7KraPli.js";import{p as Ae,o as Ne,l as Q,k as b,m as U,h as Le,f as g,a as O,d as s,s as l,r as t,g as e,u as o,t as G,e as ge,b as i,B as q,C as Y,q as fe,i as V,c as Ve,v as gr,j as hr,$ as ur}from"../chunks/cPTQ2Ibn.js";import{a as xe,i as w,s as Re}from"../chunks/DqFqoVWr.js";import{d as n,c as _,s as N,h as fr,B as mr,i as De}from"../chunks/DqbUkQgD.js";import{p as ve}from"../chunks/BgSaD1r_.js";import{g as me}from"../chunks/CTvJf3dP.js";import{b as Ue,a as xr}from"../chunks/BVyy60Ai.js";import{t as ke}from"../chunks/CCFUzH5i.js";import{e as ne,i as ce}from"../chunks/CiWDXYQd.js";import{p as pr}from"../chunks/DVsSf1wv.js";import{w as br}from"../chunks/BV_mDmfH.js";import{t as qe}from"../chunks/Bgbd8SZ5.js";const kr=async({url:Z})=>({url:Z.pathname}),yr=!1,_r=!1,ua=Object.freeze(Object.defineProperty({__proto__:null,load:kr,prerender:yr,ssr:_r},Symbol.toStringTag,{value:"Module"}));var wr=g('
Live Updates
'),Mr=g('
Connecting
'),jr=g('
Updates Unavailable
'),zr=g('
Manual Refresh
'),Cr=Y(''),Hr=Y(''),Sr=Y(''),Br=Y(''),$r=g(' '),Ar=g(' '),Lr=g('
'),Vr=g('
'),Rr=g('
'),Ir=g('
'),Pr=Y(''),Tr=Y(''),Gr=Y(''),Or=Y(''),Er=g(' '),Dr=g(' '),qr=g('
'),Nr=g('
'),Ur=g('
GARM GARM

GARM

',1);function Qr(Z,ee){Ae(ee,!1);const[re,he]=Re(),p=()=>xe(br,"$websocketStore",re),E=()=>xe(ke,"$themeStore",re),R=()=>xe(pr,"$page",re),h=U(),I=U(),z=U();let M=U(!1),m=U(!1);Ne(()=>{window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",v)});function v(a){(!localStorage.getItem("theme")||localStorage.getItem("theme")==="system")&&ke.set(a.matches)}function u(){ke.toggle()}function C(){Ue.logout(),b(m,!1)}const F=[{href:n("/"),label:"Dashboard",icon:["M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z","M8 5a2 2 0 012-2h4a2 2 0 012 2v2H8V5z"]},{href:n("/repositories"),label:"Repositories",icon:["M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z","M8 5a2 2 0 012-2h4a2 2 0 012 2v2H8V5z"]},{href:n("/organizations"),label:"Organizations",icon:"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"},{href:n("/enterprises"),label:"Enterprises",icon:"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"},{href:n("/pools"),label:"Pools",icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"},{href:n("/scalesets"),label:"Scale Sets",icon:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"},{href:n("/instances"),label:"Runners",icon:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"}],le=[{href:n("/credentials"),label:"Credentials",icon:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1721 9z"},{href:n("/endpoints"),label:"Endpoints",icon:"M13 10V3L4 14h7v7l9-11h-7z"},{href:n("/templates"),label:"Runner Install Templates",icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"}];Q(()=>p(),()=>{b(h,p())}),Q(()=>E(),()=>{b(I,E())}),Q(()=>R(),()=>{R().url.pathname&&b(M,!1)}),Q(()=>R(),()=>{b(z,R().url.pathname)}),Le(),$e();var J=Ur(),j=O(J),D=s(j),ae=s(D),te=s(ae),K=s(te),P=s(K),k=l(P,2);t(K),t(te);var H=l(te,2),oe=s(H),W=s(oe),pe=s(W);{var ye=a=>{var r=wr();i(a,r)},Qe=a=>{var r=q(),c=O(r);{var y=f=>{var S=Mr();i(f,S)},B=f=>{var S=q(),X=O(S);{var $=x=>{var T=jr();i(x,T)},A=x=>{var T=zr();i(x,T)};w(X,x=>{e(h),o(()=>e(h).error)?x($):x(A,!1)},!0)}i(f,S)};w(c,f=>{e(h),o(()=>e(h).connecting)?f(y):f(B,!1)},!0)}i(a,r)};w(pe,a=>{e(h),o(()=>e(h).connected)?a(ye):a(Qe,!1)})}t(W);var be=l(W,2),Fe=s(be);{var Je=a=>{var r=Cr();i(a,r)},Ke=a=>{var r=Hr();i(a,r)};w(Fe,a=>{e(I)?a(Je):a(Ke,!1)})}t(be),t(oe),t(H),t(ae);var Ie=l(ae,2),Pe=s(Ie);ne(Pe,1,()=>F,ce,(a,r)=>{var c=$r(),y=s(c),B=s(y);{var f=$=>{var A=q(),x=O(A);ne(x,1,()=>(e(r),o(()=>e(r).icon)),ce,(T,se)=>{var d=Sr();G(()=>_(d,"d",e(se))),i(T,d)}),i($,A)},S=$=>{var A=Br();G(()=>_(A,"d",(e(r),o(()=>e(r).icon)))),i($,A)};w(B,$=>{e(r),o(()=>Array.isArray(e(r).icon))?$(f):$(S,!1)})}t(y);var X=l(y);t(c),G(()=>{_(c,"href",(e(r),o(()=>e(r).href))),N(c,1,`group flex items-center px-2 py-2 text-sm font-medium rounded-md transition-colors duration-200 + ${e(z),e(r),o(()=>e(z)===e(r).href?"bg-gray-100 text-gray-900 dark:bg-gray-700 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),ge(X,` ${e(r),o(()=>e(r).label)??""}`)}),i(a,c)});var _e=l(Pe,2);ne(_e,5,()=>le,ce,(a,r)=>{var c=Ar(),y=s(c),B=s(y);t(y);var f=l(y);t(c),G(()=>{_(c,"href",(e(r),o(()=>e(r).href))),N(c,1,`group flex items-center px-2 py-2 text-sm font-medium rounded-md transition-colors duration-200 + ${e(z),e(r),o(()=>e(z)===e(r).href?"bg-gray-100 text-gray-900 dark:bg-gray-700 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),_(B,"d",(e(r),o(()=>e(r).icon))),ge(f,` ${e(r),o(()=>e(r).label)??""}`)}),i(a,c)}),t(_e);var Te=l(_e,2),We=s(Te);t(Te),t(Ie),t(D),t(j);var we=l(j,2),Me=s(we),Ge=s(Me),je=l(Ge,2),ze=s(je),Ce=l(ze,2),Oe=l(Ce,4),Xe=s(Oe);{var Ye=a=>{var r=Lr();i(a,r)},Ze=a=>{var r=q(),c=O(r);{var y=f=>{var S=Vr();i(f,S)},B=f=>{var S=q(),X=O(S);{var $=x=>{var T=Rr();i(x,T)},A=x=>{var T=Ir();i(x,T)};w(X,x=>{e(h),o(()=>e(h).error)?x($):x(A,!1)},!0)}i(f,S)};w(c,f=>{e(h),o(()=>e(h).connecting)?f(y):f(B,!1)},!0)}i(a,r)};w(Xe,a=>{e(h),o(()=>e(h).connected)?a(Ye):a(Ze,!1)})}t(Oe),t(je);var He=l(je,2),er=s(He);{var rr=a=>{var r=Pr();i(a,r)},ar=a=>{var r=Tr();i(a,r)};w(er,a=>{e(I)?a(rr):a(ar,!1)})}t(He),t(Me);var tr=l(Me,2);{var or=a=>{var r=qr(),c=s(r),y=l(c,2),B=s(y),f=s(B);t(B);var S=l(B,2),X=s(S),$=s(X);ne($,1,()=>F,ce,(se,d)=>{var L=Er(),ie=s(L),Se=s(ie);{var Be=de=>{var ue=q(),dr=O(ue);ne(dr,1,()=>(e(d),o(()=>e(d).icon)),ce,(vr,cr)=>{var Ee=Gr();G(()=>_(Ee,"d",e(cr))),i(vr,Ee)}),i(de,ue)},nr=de=>{var ue=Or();G(()=>_(ue,"d",(e(d),o(()=>e(d).icon)))),i(de,ue)};w(Se,de=>{e(d),o(()=>Array.isArray(e(d).icon))?de(Be):de(nr,!1)})}t(ie);var lr=l(ie);t(L),G(()=>{_(L,"href",(e(d),o(()=>e(d).href))),N(L,1,`group flex items-center px-2 py-2 text-base font-medium rounded-md transition-colors duration-200 + ${e(z),e(d),o(()=>e(z)===e(d).href?"bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),ge(lr,` ${e(d),o(()=>e(d).label)??""}`)}),V("click",L,()=>b(M,!1)),i(se,L)});var A=l($,2);ne(A,5,()=>le,ce,(se,d)=>{var L=Dr(),ie=s(L),Se=s(ie);t(ie);var Be=l(ie);t(L),G(()=>{_(L,"href",(e(d),o(()=>e(d).href))),N(L,1,`group flex items-center px-2 py-2 text-base font-medium rounded-md transition-colors duration-200 + ${e(z),e(d),o(()=>e(z)===e(d).href?"bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),_(Se,"d",(e(d),o(()=>e(d).icon))),ge(Be,` ${e(d),o(()=>e(d).label)??""}`)}),V("click",L,()=>b(M,!1)),i(se,L)}),t(A);var x=l(A,2),T=s(x);t(x),t(X),t(S),t(y),t(r),V("click",c,()=>b(M,!1)),V("keydown",c,se=>{se.key==="Escape"&&b(M,!1)}),V("click",f,()=>b(M,!1)),V("click",T,C),i(a,r)};w(tr,a=>{e(M)&&a(or)})}t(we);var sr=l(we,2);{var ir=a=>{var r=Nr();V("click",r,()=>b(m,!1)),V("keydown",r,c=>{c.key==="Escape"&&b(m,!1)}),i(a,r)};w(sr,a=>{e(m)&&a(ir)})}G((a,r,c,y,B)=>{_(K,"href",a),_(P,"src",r),_(k,"src",c),_(be,"title",e(I)?"Switch to Light Mode":"Switch to Dark Mode"),_(ze,"src",y),N(ze,1,`${e(I)?"hidden":"block"} h-8 w-8`),_(Ce,"src",B),N(Ce,1,`${e(I)?"block":"hidden"} h-8 w-8`)},[()=>(fe(n),o(()=>n("/"))),()=>(fe(n),o(()=>n("/assets/garm-light.svg"))),()=>(fe(n),o(()=>n("/assets/garm-dark.svg"))),()=>(fe(n),o(()=>n("/assets/garm-light.svg"))),()=>(fe(n),o(()=>n("/assets/garm-dark.svg")))]),V("click",be,u),V("click",We,C),V("click",Ge,()=>b(M,!e(M))),V("click",He,u),i(Z,J),Ve(),he()}var Fr=g("
"),Jr=g('

'),Kr=g('
');function Wr(Z,ee){Ae(ee,!1);const[re,he]=Re(),p=()=>xe(qe,"$toastStore",re),E=U();function R(m){switch(m){case"success":return` + + `;case"error":return` + + `;case"warning":return` + + `;case"info":default:return` + + `}}function h(m){switch(m){case"success":return"bg-green-50 dark:bg-green-900 border-green-200 dark:border-green-700";case"error":return"bg-red-50 dark:bg-red-900 border-red-200 dark:border-red-700";case"warning":return"bg-yellow-50 dark:bg-yellow-900 border-yellow-200 dark:border-yellow-700";case"info":default:return"bg-blue-50 dark:bg-blue-900 border-blue-200 dark:border-blue-700"}}function I(m){switch(m){case"success":return"text-green-800 dark:text-green-200";case"error":return"text-red-800 dark:text-red-200";case"warning":return"text-yellow-800 dark:text-yellow-200";case"info":default:return"text-blue-800 dark:text-blue-200"}}function z(m){switch(m){case"success":return"text-green-700 dark:text-green-300";case"error":return"text-red-700 dark:text-red-300";case"warning":return"text-yellow-700 dark:text-yellow-300";case"info":default:return"text-blue-700 dark:text-blue-300"}}Q(()=>p(),()=>{b(E,p())}),Le(),$e();var M=Kr();ne(M,5,()=>e(E),m=>m.id,(m,v)=>{var u=Jr(),C=s(u),F=s(C),le=s(F);fr(le,()=>(e(v),o(()=>R(e(v).type)))),t(F);var J=l(F,2),j=s(J),D=s(j,!0);t(j);var ae=l(j,2);{var te=k=>{var H=Fr(),oe=s(H,!0);t(H),G(W=>{N(H,1,`mt-1 text-sm ${W??""}`),ge(oe,(e(v),o(()=>e(v).message)))},[()=>(e(v),o(()=>z(e(v).type)))]),i(k,H)};w(ae,k=>{e(v),o(()=>e(v).message)&&k(te)})}t(J);var K=l(J,2),P=s(K);{let k=gr(()=>(e(v),o(()=>e(v).type==="success"?"text-green-400 hover:text-green-500 focus:ring-green-500":e(v).type==="error"?"text-red-400 hover:text-red-500 focus:ring-red-500":e(v).type==="warning"?"text-yellow-400 hover:text-yellow-500 focus:ring-yellow-500":"text-blue-400 hover:text-blue-500 focus:ring-blue-500")));mr(P,{variant:"ghost",size:"sm","aria-label":"Dismiss notification",icon:"",get class(){return e(k)},$$events:{click:()=>qe.remove(e(v).id)}})}t(K),t(C),t(u),G((k,H)=>{N(u,1,`relative rounded-lg border p-4 shadow-lg transition-all duration-300 ease-in-out ${k??""}`),N(j,1,`text-sm font-medium ${H??""}`),ge(D,(e(v),o(()=>e(v).title)))},[()=>(e(v),o(()=>h(e(v).type))),()=>(e(v),o(()=>I(e(v).type)))]),i(m,u)}),t(M),i(Z,M),Ve(),he()}var Xr=g('

Loading...

'),Yr=g('

Redirecting to login...

'),Zr=g('
'),ea=g(" ",1);function fa(Z,ee){Ae(ee,!1);const[re,he]=Re(),p=()=>xe(xr,"$authStore",re),E=U(),R=U(),h=U();Ne(()=>{Ue.init(),ke.init(),setTimeout(()=>{const u=ve.url.pathname===n("/login"),C=ve.url.pathname===n("/init");!u&&!C&&!p().isAuthenticated&&!p().loading&&(p().needsInitialization?me(n("/init")):me(n("/login")))},200)}),Q(()=>(p(),me),()=>{if(!p().loading){const u=ve.url.pathname===n("/login"),C=ve.url.pathname===n("/init");!u&&!C&&!p().isAuthenticated&&(p().needsInitialization?me(n("/init")):me(n("/login")))}}),Q(()=>n,()=>{b(E,ve.url.pathname===n("/login"))}),Q(()=>n,()=>{b(R,ve.url.pathname===n("/init"))}),Q(()=>(e(E),e(R)),()=>{b(h,!e(E)&&!e(R))}),Le(),$e();var I=ea();hr(u=>{ur.title="GARM - GitHub Actions Runner Manager"});var z=O(I);{var M=u=>{var C=Xr();i(u,C)},m=u=>{var C=q(),F=O(C);{var le=j=>{var D=Yr();i(j,D)},J=j=>{var D=q(),ae=O(D);{var te=P=>{var k=q(),H=O(k);De(H,ee,"default",{}),i(P,k)},K=P=>{var k=Zr(),H=s(k);Qr(H,{});var oe=l(H,2),W=s(oe),pe=s(W),ye=s(pe);De(ye,ee,"default",{}),t(pe),t(W),t(oe),t(k),i(P,k)};w(ae,P=>{e(E)||e(R)?P(te):P(K,!1)},!0)}i(j,D)};w(F,j=>{e(h),p(),o(()=>e(h)&&!p().isAuthenticated)?j(le):j(J,!1)},!0)}i(u,C)};w(z,u=>{p(),o(()=>p().loading)?u(M):u(m,!1)})}var v=l(z,2);Wr(v,{}),i(Z,I),Ve(),he()}export{fa as component,ua as universal}; diff --git a/webapp/assets/_app/immutable/nodes/0.W3yf06lM.js b/webapp/assets/_app/immutable/nodes/0.W3yf06lM.js deleted file mode 100644 index 2efc3e07..00000000 --- a/webapp/assets/_app/immutable/nodes/0.W3yf06lM.js +++ /dev/null @@ -1,13 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Le}from"../chunks/DT0EGONV.js";import{p as Be,o as qe,s as h,m as F,g as e,l as X,a as Ae,f as g,b as E,j as s,k as l,r as t,u as o,t as P,v as ge,c as i,B as U,C as Y,n as fe,e as R,d as $e,q as gr,h as hr,$ as ur}from"../chunks/CRKWEg6v.js";import{a as xe,i as M,s as Ve}from"../chunks/e1m7WRO5.js";import{d as n,c as w,s as Q,h as fr,B as mr,e as Oe}from"../chunks/-esynYXT.js";import{p as Ne}from"../chunks/B0m3rqSR.js";import{g as me}from"../chunks/Dkb9lSSG.js";import{b as Ue,a as xr}from"../chunks/D9uxtZe_.js";import{e as ne,i as ce,w as pr}from"../chunks/C73ZVvpW.js";import{t as De}from"../chunks/D6DjlyIQ.js";const kr=async({url:Z})=>({url:Z.pathname}),br=!1,yr=!1,va=Object.freeze(Object.defineProperty({__proto__:null,load:kr,prerender:br,ssr:yr},Symbol.toStringTag,{value:"Module"}));var _r=g('
Live Updates
'),wr=g('
Connecting
'),Mr=g('
Updates Unavailable
'),jr=g('
Manual Refresh
'),zr=Y(''),Cr=Y(''),Hr=Y(''),Sr=Y(''),Lr=g(' '),Br=g(' '),Ar=g('
'),$r=g('
'),Vr=g('
'),Ir=g('
'),Rr=Y(''),Tr=Y(''),Pr=Y(''),Er=Y(''),Gr=g(' '),Or=g(' '),Dr=g('
'),qr=g('
'),Nr=g('
GARM GARM

GARM

',1);function Ur(Z,ee){Be(ee,!1);const[re,he]=Ve(),j=()=>xe(pr,"$websocketStore",re),m=()=>xe(Ne,"$page",re),u=F(),y=F();let z=F(!1),G=F(!1),f=F(!1);qe(()=>{C(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",v)});function C(){const a=localStorage.getItem("theme");a==="dark"?h(f,!0):a==="light"?h(f,!1):h(f,window.matchMedia("(prefers-color-scheme: dark)").matches),p()}function v(a){(!localStorage.getItem("theme")||localStorage.getItem("theme")==="system")&&(h(f,a.matches),p())}function O(){h(f,!e(f)),localStorage.setItem("theme",e(f)?"dark":"light"),p()}function p(){e(f)?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}function H(){Ue.logout(),h(G,!1)}const le=[{href:n("/"),label:"Dashboard",icon:["M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z","M8 5a2 2 0 012-2h4a2 2 0 012 2v2H8V5z"]},{href:n("/repositories"),label:"Repositories",icon:["M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z","M8 5a2 2 0 012-2h4a2 2 0 012 2v2H8V5z"]},{href:n("/organizations"),label:"Organizations",icon:"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"},{href:n("/enterprises"),label:"Enterprises",icon:"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"},{href:n("/pools"),label:"Pools",icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"},{href:n("/scalesets"),label:"Scale Sets",icon:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"},{href:n("/instances"),label:"Runners",icon:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"}],J=[{href:n("/credentials"),label:"Credentials",icon:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1721 9z"},{href:n("/endpoints"),label:"Endpoints",icon:"M13 10V3L4 14h7v7l9-11h-7z"}];X(()=>j(),()=>{h(u,j())}),X(()=>m(),()=>{m().url.pathname&&h(z,!1)}),X(()=>m(),()=>{h(y,m().url.pathname)}),Ae(),Le();var D=Nr(),I=E(D),q=s(I),ae=s(q),K=s(ae),te=s(K),b=s(te),S=l(b,2);t(te),t(K);var N=l(K,2),oe=s(N),de=s(oe),pe=s(de);{var be=a=>{var r=_r();i(a,r)},Qe=a=>{var r=U(),c=E(r);{var _=x=>{var L=wr();i(x,L)},B=x=>{var L=U(),W=E(L);{var A=k=>{var T=Mr();i(k,T)},$=k=>{var T=jr();i(k,T)};M(W,k=>{e(u),o(()=>e(u).error)?k(A):k($,!1)},!0)}i(x,L)};M(c,x=>{e(u),o(()=>e(u).connecting)?x(_):x(B,!1)},!0)}i(a,r)};M(pe,a=>{e(u),o(()=>e(u).connected)?a(be):a(Qe,!1)})}t(de);var ke=l(de,2),Fe=s(ke);{var Je=a=>{var r=zr();i(a,r)},Ke=a=>{var r=Cr();i(a,r)};M(Fe,a=>{e(f)?a(Je):a(Ke,!1)})}t(ke),t(oe),t(N),t(ae);var Ie=l(ae,2),Re=s(Ie);ne(Re,1,()=>le,ce,(a,r)=>{var c=Lr(),_=s(c),B=s(_);{var x=A=>{var $=U(),k=E($);ne(k,1,()=>(e(r),o(()=>e(r).icon)),ce,(T,se)=>{var d=Hr();P(()=>w(d,"d",e(se))),i(T,d)}),i(A,$)},L=A=>{var $=Sr();P(()=>w($,"d",(e(r),o(()=>e(r).icon)))),i(A,$)};M(B,A=>{e(r),o(()=>Array.isArray(e(r).icon))?A(x):A(L,!1)})}t(_);var W=l(_);t(c),P(()=>{w(c,"href",(e(r),o(()=>e(r).href))),Q(c,1,`group flex items-center px-2 py-2 text-sm font-medium rounded-md transition-colors duration-200 - ${e(y),e(r),o(()=>e(y)===e(r).href?"bg-gray-100 text-gray-900 dark:bg-gray-700 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),ge(W,` ${e(r),o(()=>e(r).label)??""}`)}),i(a,c)});var ye=l(Re,2);ne(ye,5,()=>J,ce,(a,r)=>{var c=Br(),_=s(c),B=s(_);t(_);var x=l(_);t(c),P(()=>{w(c,"href",(e(r),o(()=>e(r).href))),Q(c,1,`group flex items-center px-2 py-2 text-sm font-medium rounded-md transition-colors duration-200 - ${e(y),e(r),o(()=>e(y)===e(r).href?"bg-gray-100 text-gray-900 dark:bg-gray-700 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),w(B,"d",(e(r),o(()=>e(r).icon))),ge(x,` ${e(r),o(()=>e(r).label)??""}`)}),i(a,c)}),t(ye);var Te=l(ye,2),We=s(Te);t(Te),t(Ie),t(q),t(I);var _e=l(I,2),we=s(_e),Pe=s(we),Me=l(Pe,2),je=s(Me),ze=l(je,2),Ee=l(ze,4),Xe=s(Ee);{var Ye=a=>{var r=Ar();i(a,r)},Ze=a=>{var r=U(),c=E(r);{var _=x=>{var L=$r();i(x,L)},B=x=>{var L=U(),W=E(L);{var A=k=>{var T=Vr();i(k,T)},$=k=>{var T=Ir();i(k,T)};M(W,k=>{e(u),o(()=>e(u).error)?k(A):k($,!1)},!0)}i(x,L)};M(c,x=>{e(u),o(()=>e(u).connecting)?x(_):x(B,!1)},!0)}i(a,r)};M(Xe,a=>{e(u),o(()=>e(u).connected)?a(Ye):a(Ze,!1)})}t(Ee),t(Me);var Ce=l(Me,2),er=s(Ce);{var rr=a=>{var r=Rr();i(a,r)},ar=a=>{var r=Tr();i(a,r)};M(er,a=>{e(f)?a(rr):a(ar,!1)})}t(Ce),t(we);var tr=l(we,2);{var or=a=>{var r=Dr(),c=s(r),_=l(c,2),B=s(_),x=s(B);t(B);var L=l(B,2),W=s(L),A=s(W);ne(A,1,()=>le,ce,(se,d)=>{var V=Gr(),ie=s(V),He=s(ie);{var Se=ve=>{var ue=U(),dr=E(ue);ne(dr,1,()=>(e(d),o(()=>e(d).icon)),ce,(vr,cr)=>{var Ge=Pr();P(()=>w(Ge,"d",e(cr))),i(vr,Ge)}),i(ve,ue)},nr=ve=>{var ue=Er();P(()=>w(ue,"d",(e(d),o(()=>e(d).icon)))),i(ve,ue)};M(He,ve=>{e(d),o(()=>Array.isArray(e(d).icon))?ve(Se):ve(nr,!1)})}t(ie);var lr=l(ie);t(V),P(()=>{w(V,"href",(e(d),o(()=>e(d).href))),Q(V,1,`group flex items-center px-2 py-2 text-base font-medium rounded-md transition-colors duration-200 - ${e(y),e(d),o(()=>e(y)===e(d).href?"bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),ge(lr,` ${e(d),o(()=>e(d).label)??""}`)}),R("click",V,()=>h(z,!1)),i(se,V)});var $=l(A,2);ne($,5,()=>J,ce,(se,d)=>{var V=Or(),ie=s(V),He=s(ie);t(ie);var Se=l(ie);t(V),P(()=>{w(V,"href",(e(d),o(()=>e(d).href))),Q(V,1,`group flex items-center px-2 py-2 text-base font-medium rounded-md transition-colors duration-200 - ${e(y),e(d),o(()=>e(y)===e(d).href?"bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-white":"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white")??""}`),w(He,"d",(e(d),o(()=>e(d).icon))),ge(Se,` ${e(d),o(()=>e(d).label)??""}`)}),R("click",V,()=>h(z,!1)),i(se,V)}),t($);var k=l($,2),T=s(k);t(k),t(W),t(L),t(_),t(r),R("click",c,()=>h(z,!1)),R("keydown",c,se=>{se.key==="Escape"&&h(z,!1)}),R("click",x,()=>h(z,!1)),R("click",T,H),i(a,r)};M(tr,a=>{e(z)&&a(or)})}t(_e);var sr=l(_e,2);{var ir=a=>{var r=qr();R("click",r,()=>h(G,!1)),R("keydown",r,c=>{c.key==="Escape"&&h(G,!1)}),i(a,r)};M(sr,a=>{e(G)&&a(ir)})}P((a,r,c,_,B)=>{w(te,"href",a),w(b,"src",r),w(S,"src",c),w(ke,"title",e(f)?"Switch to Light Mode":"Switch to Dark Mode"),w(je,"src",_),Q(je,1,`${e(f)?"hidden":"block"} h-8 w-8`),w(ze,"src",B),Q(ze,1,`${e(f)?"block":"hidden"} h-8 w-8`)},[()=>(fe(n),o(()=>n("/"))),()=>(fe(n),o(()=>n("/assets/garm-light.svg"))),()=>(fe(n),o(()=>n("/assets/garm-dark.svg"))),()=>(fe(n),o(()=>n("/assets/garm-light.svg"))),()=>(fe(n),o(()=>n("/assets/garm-dark.svg")))]),R("click",ke,O),R("click",We,H),R("click",Pe,()=>h(z,!e(z))),R("click",Ce,O),i(Z,D),$e(),he()}var Qr=g("
"),Fr=g('

'),Jr=g('
');function Kr(Z,ee){Be(ee,!1);const[re,he]=Ve(),j=()=>xe(De,"$toastStore",re),m=F();function u(C){switch(C){case"success":return` - - `;case"error":return` - - `;case"warning":return` - - `;case"info":default:return` - - `}}function y(C){switch(C){case"success":return"bg-green-50 dark:bg-green-900 border-green-200 dark:border-green-700";case"error":return"bg-red-50 dark:bg-red-900 border-red-200 dark:border-red-700";case"warning":return"bg-yellow-50 dark:bg-yellow-900 border-yellow-200 dark:border-yellow-700";case"info":default:return"bg-blue-50 dark:bg-blue-900 border-blue-200 dark:border-blue-700"}}function z(C){switch(C){case"success":return"text-green-800 dark:text-green-200";case"error":return"text-red-800 dark:text-red-200";case"warning":return"text-yellow-800 dark:text-yellow-200";case"info":default:return"text-blue-800 dark:text-blue-200"}}function G(C){switch(C){case"success":return"text-green-700 dark:text-green-300";case"error":return"text-red-700 dark:text-red-300";case"warning":return"text-yellow-700 dark:text-yellow-300";case"info":default:return"text-blue-700 dark:text-blue-300"}}X(()=>j(),()=>{h(m,j())}),Ae(),Le();var f=Jr();ne(f,5,()=>e(m),C=>C.id,(C,v)=>{var O=Fr(),p=s(O),H=s(p),le=s(H);fr(le,()=>(e(v),o(()=>u(e(v).type)))),t(H);var J=l(H,2),D=s(J),I=s(D,!0);t(D);var q=l(D,2);{var ae=b=>{var S=Qr(),N=s(S,!0);t(S),P(oe=>{Q(S,1,`mt-1 text-sm ${oe??""}`),ge(N,(e(v),o(()=>e(v).message)))},[()=>(e(v),o(()=>G(e(v).type)))]),i(b,S)};M(q,b=>{e(v),o(()=>e(v).message)&&b(ae)})}t(J);var K=l(J,2),te=s(K);{let b=gr(()=>(e(v),o(()=>e(v).type==="success"?"text-green-400 hover:text-green-500 focus:ring-green-500":e(v).type==="error"?"text-red-400 hover:text-red-500 focus:ring-red-500":e(v).type==="warning"?"text-yellow-400 hover:text-yellow-500 focus:ring-yellow-500":"text-blue-400 hover:text-blue-500 focus:ring-blue-500")));mr(te,{variant:"ghost",size:"sm","aria-label":"Dismiss notification",icon:"",get class(){return e(b)},$$events:{click:()=>De.remove(e(v).id)}})}t(K),t(p),t(O),P((b,S)=>{Q(O,1,`relative rounded-lg border p-4 shadow-lg transition-all duration-300 ease-in-out ${b??""}`),Q(D,1,`text-sm font-medium ${S??""}`),ge(I,(e(v),o(()=>e(v).title)))},[()=>(e(v),o(()=>y(e(v).type))),()=>(e(v),o(()=>z(e(v).type)))]),i(C,O)}),t(f),i(Z,f),$e(),he()}var Wr=g('

Loading...

'),Xr=g('

Redirecting to login...

'),Yr=g('
'),Zr=g(" ",1);function ca(Z,ee){Be(ee,!1);const[re,he]=Ve(),j=()=>xe(Ne,"$page",re),m=()=>xe(xr,"$authStore",re),u=F(),y=F(),z=F();qe(()=>{Ue.init(),setTimeout(()=>{const p=j().url.pathname===n("/login"),H=j().url.pathname===n("/init");!p&&!H&&!m().isAuthenticated&&!m().loading&&(m().needsInitialization?me(n("/init")):me(n("/login")))},200)}),X(()=>(m(),j(),me),()=>{if(!m().loading){const p=j().url.pathname===n("/login"),H=j().url.pathname===n("/init");!p&&!H&&!m().isAuthenticated&&(m().needsInitialization?me(n("/init")):me(n("/login")))}}),X(()=>(j(),n),()=>{h(u,j().url.pathname===n("/login"))}),X(()=>(j(),n),()=>{h(y,j().url.pathname===n("/init"))}),X(()=>(e(u),e(y)),()=>{h(z,!e(u)&&!e(y))}),Ae(),Le();var G=Zr();hr(p=>{ur.title="GARM - GitHub Actions Runner Manager"});var f=E(G);{var C=p=>{var H=Wr();i(p,H)},v=p=>{var H=U(),le=E(H);{var J=I=>{var q=Xr();i(I,q)},D=I=>{var q=U(),ae=E(q);{var K=b=>{var S=U(),N=E(S);Oe(N,ee,"default",{}),i(b,S)},te=b=>{var S=Yr(),N=s(S);Ur(N,{});var oe=l(N,2),de=s(oe),pe=s(de),be=s(pe);Oe(be,ee,"default",{}),t(pe),t(de),t(oe),t(S),i(b,S)};M(ae,b=>{e(u)||e(y)?b(K):b(te,!1)},!0)}i(I,q)};M(le,I=>{e(z),m(),o(()=>e(z)&&!m().isAuthenticated)?I(J):I(D,!1)},!0)}i(p,H)};M(f,p=>{m(),o(()=>m().loading)?p(C):p(v,!1)})}var O=l(f,2);Kr(O,{}),i(Z,G),$e(),he()}export{ca as component,va as universal}; diff --git a/webapp/assets/_app/immutable/nodes/1.BQyKnLFk.js b/webapp/assets/_app/immutable/nodes/1.BQyKnLFk.js new file mode 100644 index 00000000..63c5549f --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/1.BQyKnLFk.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as h}from"../chunks/C7KraPli.js";import{p as c,f as l,a as v,t as u,b as _,c as d,d as s,r as e,s as g,e as p}from"../chunks/cPTQ2Ibn.js";import{p as o}from"../chunks/BgSaD1r_.js";var x=l("

",1);function q(i,m){c(m,!1),h();var t=x(),r=v(t),f=s(r,!0);e(r);var a=g(r,2),n=s(a,!0);e(a),u(()=>{p(f,o.status),p(n,o.error?.message)}),_(i,t),d()}export{q as component}; diff --git a/webapp/assets/_app/immutable/nodes/1.R-OM_0cI.js b/webapp/assets/_app/immutable/nodes/1.R-OM_0cI.js deleted file mode 100644 index 430b56f9..00000000 --- a/webapp/assets/_app/immutable/nodes/1.R-OM_0cI.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as u}from"../chunks/DT0EGONV.js";import{p as h,f as g,b as v,t as d,c as l,d as _,j as s,r as a,k as x,v as o}from"../chunks/CRKWEg6v.js";import{s as k,p}from"../chunks/Dkb9lSSG.js";const $={get error(){return p.error},get status(){return p.status}};k.updated.check;const i=$;var b=g("

",1);function y(m,c){h(c,!1),u();var r=b(),t=v(r),n=s(t,!0);a(t);var e=x(t,2),f=s(e,!0);a(e),d(()=>{o(n,i.status),o(f,i.error?.message)}),l(m,r),_()}export{y as component}; diff --git a/webapp/assets/_app/immutable/nodes/10.DJKJweNi.js b/webapp/assets/_app/immutable/nodes/10.BTAzlY6Z.js similarity index 80% rename from webapp/assets/_app/immutable/nodes/10.DJKJweNi.js rename to webapp/assets/_app/immutable/nodes/10.BTAzlY6Z.js index 1f687f4f..a9251324 100644 --- a/webapp/assets/_app/immutable/nodes/10.DJKJweNi.js +++ b/webapp/assets/_app/immutable/nodes/10.BTAzlY6Z.js @@ -1 +1 @@ -import"../chunks/DsnmJJEf.js";import{i as Z}from"../chunks/DT0EGONV.js";import{p as ee,o as ae,l as re,a as te,f as K,h as se,t as _,g as a,e as k,c as w,d as de,$ as oe,k as d,D as ie,m as f,j as r,u as B,n as D,s as i,r as t,z as q,v as I}from"../chunks/CRKWEg6v.js";import{i as le,s as ne,a as ce}from"../chunks/e1m7WRO5.js";import{B as me,d as l,c as T,r as U}from"../chunks/-esynYXT.js";import{b as C}from"../chunks/B3a35v7J.js";import{p as ue}from"../chunks/D4Caz1gY.js";import{g as H}from"../chunks/Dkb9lSSG.js";import{a as pe,b as ve}from"../chunks/D9uxtZe_.js";import{e as fe}from"../chunks/BZiHL9L3.js";var ge=K('

'),he=K('
GARM

Sign in to GARM

GitHub Actions Runner Manager

');function Ae(W,F){ee(F,!1);const[J,N]=ne(),$=()=>ce(pe,"$authStore",J);let m=f(""),u=f(""),o=f(!1),n=f("");ae(()=>{O()});function O(){const e=localStorage.getItem("theme");let s=!1;e==="dark"?s=!0:e==="light"?s=!1:s=window.matchMedia("(prefers-color-scheme: dark)").matches,s?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}async function M(){if(!a(m)||!a(u)){i(n,"Please enter both username and password");return}i(o,!0),i(n,"");try{await ve.login(a(m),a(u)),H(l("/"))}catch(e){i(n,fe(e))}finally{i(o,!1)}}function L(e){e.key==="Enter"&&M()}re(()=>($(),l),()=>{$().isAuthenticated&&H(l("/"))}),te(),Z();var g=he();se(e=>{oe.title="Login - GARM"});var z=r(g),h=r(z),A=r(h),S=r(A),Q=d(S,2);t(A),q(4),t(h);var b=d(h,2),x=r(b),y=r(x),p=d(r(y),2);U(p),t(y);var P=d(y,2),v=d(r(P),2);U(v),t(P),t(x);var G=d(x,2);{var V=e=>{var s=ge(),c=r(s),E=d(r(c),2),j=r(E),Y=r(j,!0);t(j),t(E),t(c),t(s),_(()=>I(Y,a(n))),w(e,s)};le(G,e=>{a(n)&&e(V)})}var R=d(G,2),X=r(R);me(X,{type:"submit",variant:"primary",size:"md",fullWidth:!0,get disabled(){return a(o)},get loading(){return a(o)},children:(e,s)=>{q();var c=ie();_(()=>I(c,a(o)?"Signing in...":"Sign in")),w(e,c)},$$slots:{default:!0}}),t(R),t(b),t(z),t(g),_((e,s)=>{T(S,"src",e),T(Q,"src",s),p.disabled=a(o),v.disabled=a(o)},[()=>(D(l),B(()=>l("/assets/garm-light.svg"))),()=>(D(l),B(()=>l("/assets/garm-dark.svg")))]),C(p,()=>a(m),e=>i(m,e)),k("keypress",p,L),C(v,()=>a(u),e=>i(u,e)),k("keypress",v,L),k("submit",b,ue(M)),w(W,g),de(),N()}export{Ae as component}; +import"../chunks/DsnmJJEf.js";import{i as Z}from"../chunks/C7KraPli.js";import{p as ee,o as ae,l as re,h as te,f as K,j as se,t as _,g as a,i as k,b as w,c as de,$ as oe,s as d,D as ie,m as f,d as r,u as q,q as B,k as i,r as t,z as D,e as I}from"../chunks/cPTQ2Ibn.js";import{i as le,s as ne,a as ce}from"../chunks/DqFqoVWr.js";import{B as me,d as l,c as T,r as U}from"../chunks/DqbUkQgD.js";import{b as C}from"../chunks/B-_QCM7E.js";import{p as ue}from"../chunks/D4Caz1gY.js";import{g as H}from"../chunks/CTvJf3dP.js";import{a as pe,b as ve}from"../chunks/BVyy60Ai.js";import{e as fe}from"../chunks/BZiHL9L3.js";var ge=K('

'),he=K('
GARM

Sign in to GARM

GitHub Actions Runner Manager

');function Ae(W,F){ee(F,!1);const[J,N]=ne(),$=()=>ce(pe,"$authStore",J);let m=f(""),u=f(""),o=f(!1),n=f("");ae(()=>{O()});function O(){const e=localStorage.getItem("theme");let s=!1;e==="dark"?s=!0:e==="light"?s=!1:s=window.matchMedia("(prefers-color-scheme: dark)").matches,s?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}async function M(){if(!a(m)||!a(u)){i(n,"Please enter both username and password");return}i(o,!0),i(n,"");try{await ve.login(a(m),a(u)),H(l("/"))}catch(e){i(n,fe(e))}finally{i(o,!1)}}function L(e){e.key==="Enter"&&M()}re(()=>($(),l),()=>{$().isAuthenticated&&H(l("/"))}),te(),Z();var g=he();se(e=>{oe.title="Login - GARM"});var z=r(g),h=r(z),A=r(h),S=r(A),Q=d(S,2);t(A),D(4),t(h);var b=d(h,2),x=r(b),y=r(x),p=d(r(y),2);U(p),t(y);var P=d(y,2),v=d(r(P),2);U(v),t(P),t(x);var G=d(x,2);{var V=e=>{var s=ge(),c=r(s),E=d(r(c),2),j=r(E),Y=r(j,!0);t(j),t(E),t(c),t(s),_(()=>I(Y,a(n))),w(e,s)};le(G,e=>{a(n)&&e(V)})}var R=d(G,2),X=r(R);me(X,{type:"submit",variant:"primary",size:"md",fullWidth:!0,get disabled(){return a(o)},get loading(){return a(o)},children:(e,s)=>{D();var c=ie();_(()=>I(c,a(o)?"Signing in...":"Sign in")),w(e,c)},$$slots:{default:!0}}),t(R),t(b),t(z),t(g),_((e,s)=>{T(S,"src",e),T(Q,"src",s),p.disabled=a(o),v.disabled=a(o)},[()=>(B(l),q(()=>l("/assets/garm-light.svg"))),()=>(B(l),q(()=>l("/assets/garm-dark.svg")))]),C(p,()=>a(m),e=>i(m,e)),k("keypress",p,L),C(v,()=>a(u),e=>i(u,e)),k("keypress",v,L),k("submit",b,ue(M)),w(W,g),de(),N()}export{Ae as component}; diff --git a/webapp/assets/_app/immutable/nodes/11.DtXtnXMl.js b/webapp/assets/_app/immutable/nodes/11.DtXtnXMl.js deleted file mode 100644 index 61031c1b..00000000 --- a/webapp/assets/_app/immutable/nodes/11.DtXtnXMl.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Le}from"../chunks/DT0EGONV.js";import{p as Ne,E as Qe,o as je,l as x,s as a,m as s,g as e,w as W,a as qe,f as T,k as i,j as o,r as n,c as E,t as Q,v as ie,y as Ae,u as v,z as Fe,e as $e,d as Ge,h as Xe,b as Ze,$ as et,n as P,q as ue}from"../chunks/CRKWEg6v.js";import{a as He,i as X,s as Je}from"../chunks/e1m7WRO5.js";import{r as ge,b as Ue,h as tt,d as Ie,c as at,g as me}from"../chunks/-esynYXT.js";import{e as rt,i as ot}from"../chunks/C73ZVvpW.js";import{b as Re,a as We}from"../chunks/B3a35v7J.js";import{p as nt}from"../chunks/D4Caz1gY.js";import{M as it}from"../chunks/xe-4nY5o.js";import{F as st}from"../chunks/CiGy614T.js";import{e as Pe}from"../chunks/BZiHL9L3.js";import{e as Ve,a as Me}from"../chunks/Djd10kRn.js";import{U as lt}from"../chunks/DxLDbRe7.js";import{D as dt}from"../chunks/BXdh0O4_.js";import{P as ct}from"../chunks/BAnDfGwP.js";import{t as K}from"../chunks/D6DjlyIQ.js";import{B as ut,k as Ce,g as Oe,l as gt}from"../chunks/c_t0vA9G.js";import{D as mt,A as Be,G as pt,a as ft}from"../chunks/B1coRVG4.js";import{E as bt}from"../chunks/DF8ZTWYj.js";import{E as vt}from"../chunks/B27KefbC.js";import{S as yt}from"../chunks/B0Y2gXDu.js";var ht=T('

'),_t=T('

Loading...

'),xt=T(""),kt=T(''),wt=T('

Webhook secret will be automatically generated

'),zt=T('
'),$t=T('

Create Organization

');function Ct(pe,fe){Ne(fe,!1);const[be,ve]=Je(),f=()=>He(Ve,"$eagerCache",be),D=s(),w=s(),z=s(),Z=s(),$=Qe();let C=s(!1),b=s(""),y=s("github"),r=s({name:"",credentials_name:"",webhook_secret:"",pool_balancer_type:"roundrobin"}),k=s(!0),p=s(!0);async function A(){if(!f().loaded.credentials&&!f().loading.credentials)try{await Me.getCredentials()}catch(d){a(b,Pe(d))}}function B(d){a(y,d.detail),W(r,e(r).credentials_name="")}function c(){if(e(r).credentials_name){const d=e(D).find(L=>L.name===e(r).credentials_name);d&&d.forge_type&&a(y,d.forge_type)}}function ye(){const d=new Uint8Array(32);return crypto.getRandomValues(d),Array.from(d,L=>L.toString(16).padStart(2,"0")).join("")}async function he(){if(!e(r).name?.trim()){a(b,"Organization name is required");return}if(!e(r).credentials_name){a(b,"Please select credentials");return}try{a(C,!0),a(b,"");const d={...e(r),install_webhook:e(k),auto_generate_secret:e(p)};$("submit",d)}catch(d){a(b,d instanceof Error?d.message:"Failed to create organization"),a(C,!1)}}je(()=>{A()}),x(()=>f(),()=>{a(D,f().credentials)}),x(()=>f(),()=>{a(w,f().loading.credentials)}),x(()=>(e(D),e(y)),()=>{a(z,e(D).filter(d=>e(y)?d.forge_type===e(y):!0))}),x(()=>e(p),()=>{e(p)?W(r,e(r).webhook_secret=ye()):e(p)||W(r,e(r).webhook_secret="")}),x(()=>(e(r),e(p)),()=>{a(Z,e(r).name?.trim()!==""&&e(r).credentials_name!==""&&(e(p)||e(r).webhook_secret&&e(r).webhook_secret.trim()!==""))}),qe(),Le(),it(pe,{$$events:{close:()=>$("close")},children:(d,L)=>{var ee=$t(),N=i(o(ee),2);{var te=h=>{var _=ht(),F=o(_),U=o(F,!0);n(F),n(_),Q(()=>ie(U,e(b))),E(h,_)};X(N,h=>{e(b)&&h(te)})}var _e=i(N,2);{var xe=h=>{var _=_t();E(h,_)},ke=h=>{var _=zt(),F=o(_);st(F,{get selectedForgeType(){return e(y)},set selectedForgeType(l){a(y,l)},$$events:{select:B},$$legacy:!0});var U=i(F,2),se=i(o(U),2);ge(se),n(U);var j=i(U,2),S=i(o(j),2);Q(()=>{e(r),Ae(()=>{e(z)})});var q=o(S);q.value=q.__value="";var we=i(q);rt(we,1,()=>e(z),ot,(l,m)=>{var O=xt(),de=o(O);n(O);var ce={};Q(()=>{ie(de,`${e(m),v(()=>e(m).name)??""} (${e(m),v(()=>e(m).endpoint?.name||"Unknown endpoint")??""})`),ce!==(ce=(e(m),v(()=>e(m).name)))&&(O.value=(O.__value=(e(m),v(()=>e(m).name)))??"")}),E(l,O)}),n(S),n(j);var G=i(j,2),ae=i(o(G),2);Q(()=>{e(r),Ae(()=>{})});var H=o(ae);H.value=H.__value="roundrobin";var le=i(H);le.value=le.__value="pack",n(ae),n(G);var re=i(G,2),oe=o(re),t=o(oe);ge(t),Fe(2),n(oe);var u=i(oe,2),I=o(u),M=o(I);ge(M),Fe(2),n(I);var g=i(I,2);{var J=l=>{var m=kt();ge(m),Re(m,()=>e(r).webhook_secret,O=>W(r,e(r).webhook_secret=O)),E(l,m)},ne=l=>{var m=wt();E(l,m)};X(g,l=>{e(p)?l(ne,!1):l(J)})}n(u),n(re);var V=i(re,2),Y=o(V),R=i(Y,2),ze=o(R,!0);n(R),n(V),n(_),Q(()=>{R.disabled=e(C)||e(w)||!e(Z),ie(ze,e(C)?"Creating...":"Create Organization")}),Re(se,()=>e(r).name,l=>W(r,e(r).name=l)),Ue(S,()=>e(r).credentials_name,l=>W(r,e(r).credentials_name=l)),$e("change",S,c),Ue(ae,()=>e(r).pool_balancer_type,l=>W(r,e(r).pool_balancer_type=l)),We(t,()=>e(k),l=>a(k,l)),We(M,()=>e(p),l=>a(p,l)),$e("click",Y,()=>$("close")),$e("submit",_,nt(he)),E(h,_)};X(_e,h=>{e(C)?h(xe):h(ke,!1)})}n(ee),E(d,ee)},$$slots:{default:!0}}),Ge(),ve()}var Ot=T(''),Pt=T('
',1);function Kt(pe,fe){Ne(fe,!1);const[be,ve]=Je(),f=()=>He(Ve,"$eagerCache",be),D=s(),w=s(),z=s(),Z=s();let $=s([]),C=s(!0),b=s(""),y=s(""),r=s(1),k=s(25),p=s(!1),A=s(!1),B=s(!1),c=s(null);function ye(){a(p,!1),a(B,!1),a(A,!1)}async function he(t){try{a(b,"");const u=t.detail,I={name:u.name,credentials_name:u.credentials_name,webhook_secret:u.webhook_secret,pool_balancer_type:u.pool_balancer_type},M=await me.createOrganization(I);if(u.install_webhook&&M.id)try{await me.installOrganizationWebhook(M.id),K.success("Webhook Installed",`Webhook for organization ${M.name} has been installed successfully.`)}catch(g){console.warn("Organization created but webhook installation failed:",g),K.error("Webhook Installation Failed",g instanceof Error?g.message:"Failed to install webhook. You can try installing it manually from the organization details page.")}K.success("Organization Created",`Organization ${M.name} has been created successfully.`),a(p,!1)}catch(u){throw a(b,Pe(u)),u}}async function d(t){if(e(c))try{await me.updateOrganization(e(c).id,t),K.success("Organization Updated",`Organization ${e(c).name} has been updated successfully.`),a(A,!1),a(c,null)}catch(u){throw u}}async function L(){if(e(c))try{a(b,""),await me.deleteOrganization(e(c).id),K.success("Organization Deleted",`Organization ${e(c).name} has been deleted successfully.`),a(c,null)}catch(t){const u=Pe(t);K.error("Delete Failed",u)}finally{ye()}}function ee(){a(p,!0)}function N(t){a(c,t),a(A,!0)}function te(t){a(c,t),a(B,!0)}je(async()=>{try{a(C,!0);const t=await Me.getOrganizations();t&&Array.isArray(t)&&a($,t)}catch(t){console.error("Failed to load organizations:",t),a(b,t instanceof Error?t.message:"Failed to load organizations")}finally{a(C,!1)}});async function _e(){try{await Me.retryResource("organizations")}catch(t){console.error("Retry failed:",t)}}const xe=[{key:"name",title:"Name",cellComponent:bt,cellProps:{entityType:"organization"}},{key:"endpoint",title:"Endpoint",cellComponent:vt},{key:"credentials",title:"Credentials",cellComponent:pt,cellProps:{field:"credentials_name"}},{key:"status",title:"Status",cellComponent:yt,cellProps:{statusType:"entity"}},{key:"actions",title:"Actions",align:"right",cellComponent:ft}],ke={entityType:"organization",primaryText:{field:"name",isClickable:!0,href:"/organizations/{id}"},customInfo:[{icon:t=>Oe(t?.endpoint?.endpoint_type||"unknown"),text:t=>t?.endpoint?.name||"Unknown"}],badges:[{type:"custom",value:t=>Ce(t)}],actions:[{type:"edit",handler:t=>N(t)},{type:"delete",handler:t=>te(t)}]};function h(t){a(y,t.detail.term),a(r,1)}function _(t){a(r,t.detail.page)}function F(t){a(k,t.detail.perPage),a(r,1)}function U(t){N(t.detail.item)}function se(t){te(t.detail.item)}x(()=>(e($),f()),()=>{(!e($).length||f().loaded.organizations)&&a($,f().organizations)}),x(()=>f(),()=>{a(C,f().loading.organizations)}),x(()=>f(),()=>{a(D,f().errorMessages.organizations)}),x(()=>(e($),e(y)),()=>{a(w,gt(e($),e(y)))}),x(()=>(e(w),e(k)),()=>{a(z,Math.ceil(e(w).length/e(k)))}),x(()=>(e(r),e(z)),()=>{e(r)>e(z)&&e(z)>0&&a(r,e(z))}),x(()=>(e(w),e(r),e(k)),()=>{a(Z,e(w).slice((e(r)-1)*e(k),e(r)*e(k)))}),qe(),Le();var j=Pt();Xe(t=>{et.title="Organizations - GARM"});var S=Ze(j),q=o(S);ct(q,{title:"Organizations",description:"Manage GitHub and Gitea organizations",actionLabel:"Add Organization",$$events:{action:ee}});var we=i(q,2);{let t=ue(()=>e(D)||e(b)),u=ue(()=>!!e(D));mt(we,{get columns(){return xe},get data(){return e(Z)},get loading(){return e(C)},get error(){return e(t)},get searchTerm(){return e(y)},searchPlaceholder:"Search organizations...",get currentPage(){return e(r)},get perPage(){return e(k)},get totalPages(){return e(z)},get totalItems(){return e(w),v(()=>e(w).length)},itemName:"organizations",emptyIconType:"building",get showRetry(){return e(u)},get mobileCardConfig(){return ke},$$events:{search:h,pageChange:_,perPageChange:F,retry:_e,edit:U,delete:se},$$slots:{"mobile-card":(I,M)=>{const g=ue(()=>M.item),J=ue(()=>(P(Ce),P(e(g)),v(()=>Ce(e(g)))));var ne=Ot(),V=o(ne),Y=o(V),R=o(Y),ze=o(R,!0);n(R);var l=i(R,2),m=o(l),O=o(m);tt(O,()=>(P(Oe),P(e(g)),v(()=>Oe(e(g).endpoint?.endpoint_type||"unknown"))));var de=i(O,2),ce=o(de,!0);n(de),n(m),n(l),n(Y),n(V);var Ee=i(V,2),Te=o(Ee);ut(Te,{get variant(){return P(e(J)),v(()=>e(J).variant)},get text(){return P(e(J)),v(()=>e(J).text)}});var De=i(Te,2),Se=o(De);Be(Se,{action:"edit",size:"sm",title:"Edit organization",ariaLabel:"Edit organization",$$events:{click:()=>N(e(g))}});var Ye=i(Se,2);Be(Ye,{action:"delete",size:"sm",title:"Delete organization",ariaLabel:"Delete organization",$$events:{click:()=>te(e(g))}}),n(De),n(Ee),n(ne),Q(Ke=>{at(Y,"href",Ke),ie(ze,(P(e(g)),v(()=>e(g).name))),ie(ce,(P(e(g)),v(()=>e(g).endpoint?.name||"Unknown")))},[()=>(P(Ie),P(e(g)),v(()=>Ie(`/organizations/${e(g).id}`)))]),E(I,ne)}}})}n(S);var G=i(S,2);{var ae=t=>{Ct(t,{$$events:{close:()=>a(p,!1),submit:he}})};X(G,t=>{e(p)&&t(ae)})}var H=i(G,2);{var le=t=>{lt(t,{get entity(){return e(c)},entityType:"organization",$$events:{close:()=>{a(A,!1),a(c,null)},submit:u=>d(u.detail)}})};X(H,t=>{e(A)&&e(c)&&t(le)})}var re=i(H,2);{var oe=t=>{dt(t,{title:"Delete Organization",message:"Are you sure you want to delete this organization? This action cannot be undone.",get itemName(){return e(c),v(()=>e(c).name)},$$events:{close:()=>{a(B,!1),a(c,null)},confirm:L}})};X(re,t=>{e(B)&&e(c)&&t(oe)})}E(pe,j),Ge(),ve()}export{Kt as component}; diff --git a/webapp/assets/_app/immutable/nodes/11.kE-kE_J5.js b/webapp/assets/_app/immutable/nodes/11.kE-kE_J5.js new file mode 100644 index 00000000..55bd2097 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/11.kE-kE_J5.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as Le}from"../chunks/C7KraPli.js";import{p as Ne,E as Qe,o as je,l as x,k as a,m as s,g as e,w as W,h as qe,f as T,s as i,d as o,r as n,b as E,t as Q,e as ie,y as Ae,u as v,z as Fe,i as $e,c as Ge,j as Xe,a as Ze,$ as et,q as P,v as ue}from"../chunks/cPTQ2Ibn.js";import{a as He,i as X,s as Je}from"../chunks/DqFqoVWr.js";import{r as ge,b as Ue,h as tt,d as Ie,c as at,g as me}from"../chunks/DqbUkQgD.js";import{e as rt,i as ot}from"../chunks/CiWDXYQd.js";import{b as Re,a as We}from"../chunks/B-_QCM7E.js";import{p as nt}from"../chunks/D4Caz1gY.js";import{M as it}from"../chunks/Bo3f8OIz.js";import{F as st}from"../chunks/Cqnw7O8j.js";import{e as Pe}from"../chunks/BZiHL9L3.js";import{e as Ve,a as Me}from"../chunks/JUkrBp3F.js";import{U as lt}from"../chunks/B1V2wE0x.js";import{D as dt}from"../chunks/91PQ6UtW.js";import{P as ct}from"../chunks/U3V4g_hv.js";import{t as K}from"../chunks/Bgbd8SZ5.js";import{B as ut,k as Ce,g as Oe,l as gt}from"../chunks/DJsB5Z5V.js";import{D as mt,G as pt,A as ft}from"../chunks/Du50aAe5.js";import{A as Be}from"../chunks/C2rI8IaC.js";import{E as bt}from"../chunks/CPFytHjx.js";import{E as vt}from"../chunks/CYqkNFLz.js";import{S as yt}from"../chunks/BZ2WxPPD.js";var ht=T('

'),_t=T('

Loading...

'),xt=T(""),kt=T(''),wt=T('

Webhook secret will be automatically generated

'),zt=T('
'),$t=T('

Create Organization

');function Ct(pe,fe){Ne(fe,!1);const[be,ve]=Je(),f=()=>He(Ve,"$eagerCache",be),D=s(),w=s(),z=s(),Z=s(),$=Qe();let C=s(!1),b=s(""),y=s("github"),r=s({name:"",credentials_name:"",webhook_secret:"",pool_balancer_type:"roundrobin"}),k=s(!0),p=s(!0);async function A(){if(!f().loaded.credentials&&!f().loading.credentials)try{await Me.getCredentials()}catch(d){a(b,Pe(d))}}function B(d){a(y,d.detail),W(r,e(r).credentials_name="")}function c(){if(e(r).credentials_name){const d=e(D).find(L=>L.name===e(r).credentials_name);d&&d.forge_type&&a(y,d.forge_type)}}function ye(){const d=new Uint8Array(32);return crypto.getRandomValues(d),Array.from(d,L=>L.toString(16).padStart(2,"0")).join("")}async function he(){if(!e(r).name?.trim()){a(b,"Organization name is required");return}if(!e(r).credentials_name){a(b,"Please select credentials");return}try{a(C,!0),a(b,"");const d={...e(r),install_webhook:e(k),auto_generate_secret:e(p)};$("submit",d)}catch(d){a(b,d instanceof Error?d.message:"Failed to create organization"),a(C,!1)}}je(()=>{A()}),x(()=>f(),()=>{a(D,f().credentials)}),x(()=>f(),()=>{a(w,f().loading.credentials)}),x(()=>(e(D),e(y)),()=>{a(z,e(D).filter(d=>e(y)?d.forge_type===e(y):!0))}),x(()=>e(p),()=>{e(p)?W(r,e(r).webhook_secret=ye()):e(p)||W(r,e(r).webhook_secret="")}),x(()=>(e(r),e(p)),()=>{a(Z,e(r).name?.trim()!==""&&e(r).credentials_name!==""&&(e(p)||e(r).webhook_secret&&e(r).webhook_secret.trim()!==""))}),qe(),Le(),it(pe,{$$events:{close:()=>$("close")},children:(d,L)=>{var ee=$t(),N=i(o(ee),2);{var te=h=>{var _=ht(),F=o(_),U=o(F,!0);n(F),n(_),Q(()=>ie(U,e(b))),E(h,_)};X(N,h=>{e(b)&&h(te)})}var _e=i(N,2);{var xe=h=>{var _=_t();E(h,_)},ke=h=>{var _=zt(),F=o(_);st(F,{get selectedForgeType(){return e(y)},set selectedForgeType(l){a(y,l)},$$events:{select:B},$$legacy:!0});var U=i(F,2),se=i(o(U),2);ge(se),n(U);var j=i(U,2),S=i(o(j),2);Q(()=>{e(r),Ae(()=>{e(z)})});var q=o(S);q.value=q.__value="";var we=i(q);rt(we,1,()=>e(z),ot,(l,m)=>{var O=xt(),de=o(O);n(O);var ce={};Q(()=>{ie(de,`${e(m),v(()=>e(m).name)??""} (${e(m),v(()=>e(m).endpoint?.name||"Unknown endpoint")??""})`),ce!==(ce=(e(m),v(()=>e(m).name)))&&(O.value=(O.__value=(e(m),v(()=>e(m).name)))??"")}),E(l,O)}),n(S),n(j);var G=i(j,2),ae=i(o(G),2);Q(()=>{e(r),Ae(()=>{})});var H=o(ae);H.value=H.__value="roundrobin";var le=i(H);le.value=le.__value="pack",n(ae),n(G);var re=i(G,2),oe=o(re),t=o(oe);ge(t),Fe(2),n(oe);var u=i(oe,2),I=o(u),M=o(I);ge(M),Fe(2),n(I);var g=i(I,2);{var J=l=>{var m=kt();ge(m),Re(m,()=>e(r).webhook_secret,O=>W(r,e(r).webhook_secret=O)),E(l,m)},ne=l=>{var m=wt();E(l,m)};X(g,l=>{e(p)?l(ne,!1):l(J)})}n(u),n(re);var V=i(re,2),Y=o(V),R=i(Y,2),ze=o(R,!0);n(R),n(V),n(_),Q(()=>{R.disabled=e(C)||e(w)||!e(Z),ie(ze,e(C)?"Creating...":"Create Organization")}),Re(se,()=>e(r).name,l=>W(r,e(r).name=l)),Ue(S,()=>e(r).credentials_name,l=>W(r,e(r).credentials_name=l)),$e("change",S,c),Ue(ae,()=>e(r).pool_balancer_type,l=>W(r,e(r).pool_balancer_type=l)),We(t,()=>e(k),l=>a(k,l)),We(M,()=>e(p),l=>a(p,l)),$e("click",Y,()=>$("close")),$e("submit",_,nt(he)),E(h,_)};X(_e,h=>{e(C)?h(xe):h(ke,!1)})}n(ee),E(d,ee)},$$slots:{default:!0}}),Ge(),ve()}var Ot=T(''),Pt=T('
',1);function Qt(pe,fe){Ne(fe,!1);const[be,ve]=Je(),f=()=>He(Ve,"$eagerCache",be),D=s(),w=s(),z=s(),Z=s();let $=s([]),C=s(!0),b=s(""),y=s(""),r=s(1),k=s(25),p=s(!1),A=s(!1),B=s(!1),c=s(null);function ye(){a(p,!1),a(B,!1),a(A,!1)}async function he(t){try{a(b,"");const u=t.detail,I={name:u.name,credentials_name:u.credentials_name,webhook_secret:u.webhook_secret,pool_balancer_type:u.pool_balancer_type},M=await me.createOrganization(I);if(u.install_webhook&&M.id)try{await me.installOrganizationWebhook(M.id),K.success("Webhook Installed",`Webhook for organization ${M.name} has been installed successfully.`)}catch(g){console.warn("Organization created but webhook installation failed:",g),K.error("Webhook Installation Failed",g instanceof Error?g.message:"Failed to install webhook. You can try installing it manually from the organization details page.")}K.success("Organization Created",`Organization ${M.name} has been created successfully.`),a(p,!1)}catch(u){throw a(b,Pe(u)),u}}async function d(t){if(e(c))try{await me.updateOrganization(e(c).id,t),K.success("Organization Updated",`Organization ${e(c).name} has been updated successfully.`),a(A,!1),a(c,null)}catch(u){throw u}}async function L(){if(e(c))try{a(b,""),await me.deleteOrganization(e(c).id),K.success("Organization Deleted",`Organization ${e(c).name} has been deleted successfully.`),a(c,null)}catch(t){const u=Pe(t);K.error("Delete Failed",u)}finally{ye()}}function ee(){a(p,!0)}function N(t){a(c,t),a(A,!0)}function te(t){a(c,t),a(B,!0)}je(async()=>{try{a(C,!0);const t=await Me.getOrganizations();t&&Array.isArray(t)&&a($,t)}catch(t){console.error("Failed to load organizations:",t),a(b,t instanceof Error?t.message:"Failed to load organizations")}finally{a(C,!1)}});async function _e(){try{await Me.retryResource("organizations")}catch(t){console.error("Retry failed:",t)}}const xe=[{key:"name",title:"Name",cellComponent:bt,cellProps:{entityType:"organization"}},{key:"endpoint",title:"Endpoint",cellComponent:vt},{key:"credentials",title:"Credentials",cellComponent:pt,cellProps:{field:"credentials_name"}},{key:"status",title:"Status",cellComponent:yt,cellProps:{statusType:"entity"}},{key:"actions",title:"Actions",align:"right",cellComponent:ft}],ke={entityType:"organization",primaryText:{field:"name",isClickable:!0,href:"/organizations/{id}"},customInfo:[{icon:t=>Oe(t?.endpoint?.endpoint_type||"unknown"),text:t=>t?.endpoint?.name||"Unknown"}],badges:[{type:"custom",value:t=>Ce(t)}],actions:[{type:"edit",handler:t=>N(t)},{type:"delete",handler:t=>te(t)}]};function h(t){a(y,t.detail.term),a(r,1)}function _(t){a(r,t.detail.page)}function F(t){a(k,t.detail.perPage),a(r,1)}function U(t){N(t.detail.item)}function se(t){te(t.detail.item)}x(()=>(e($),f()),()=>{(!e($).length||f().loaded.organizations)&&a($,f().organizations)}),x(()=>f(),()=>{a(C,f().loading.organizations)}),x(()=>f(),()=>{a(D,f().errorMessages.organizations)}),x(()=>(e($),e(y)),()=>{a(w,gt(e($),e(y)))}),x(()=>(e(w),e(k)),()=>{a(z,Math.ceil(e(w).length/e(k)))}),x(()=>(e(r),e(z)),()=>{e(r)>e(z)&&e(z)>0&&a(r,e(z))}),x(()=>(e(w),e(r),e(k)),()=>{a(Z,e(w).slice((e(r)-1)*e(k),e(r)*e(k)))}),qe(),Le();var j=Pt();Xe(t=>{et.title="Organizations - GARM"});var S=Ze(j),q=o(S);ct(q,{title:"Organizations",description:"Manage GitHub and Gitea organizations",actionLabel:"Add Organization",$$events:{action:ee}});var we=i(q,2);{let t=ue(()=>e(D)||e(b)),u=ue(()=>!!e(D));mt(we,{get columns(){return xe},get data(){return e(Z)},get loading(){return e(C)},get error(){return e(t)},get searchTerm(){return e(y)},searchPlaceholder:"Search organizations...",get currentPage(){return e(r)},get perPage(){return e(k)},get totalPages(){return e(z)},get totalItems(){return e(w),v(()=>e(w).length)},itemName:"organizations",emptyIconType:"building",get showRetry(){return e(u)},get mobileCardConfig(){return ke},$$events:{search:h,pageChange:_,perPageChange:F,retry:_e,edit:U,delete:se},$$slots:{"mobile-card":(I,M)=>{const g=ue(()=>M.item),J=ue(()=>(P(Ce),P(e(g)),v(()=>Ce(e(g)))));var ne=Ot(),V=o(ne),Y=o(V),R=o(Y),ze=o(R,!0);n(R);var l=i(R,2),m=o(l),O=o(m);tt(O,()=>(P(Oe),P(e(g)),v(()=>Oe(e(g).endpoint?.endpoint_type||"unknown"))));var de=i(O,2),ce=o(de,!0);n(de),n(m),n(l),n(Y),n(V);var Ee=i(V,2),Te=o(Ee);ut(Te,{get variant(){return P(e(J)),v(()=>e(J).variant)},get text(){return P(e(J)),v(()=>e(J).text)}});var De=i(Te,2),Se=o(De);Be(Se,{action:"edit",size:"sm",title:"Edit organization",ariaLabel:"Edit organization",$$events:{click:()=>N(e(g))}});var Ye=i(Se,2);Be(Ye,{action:"delete",size:"sm",title:"Delete organization",ariaLabel:"Delete organization",$$events:{click:()=>te(e(g))}}),n(De),n(Ee),n(ne),Q(Ke=>{at(Y,"href",Ke),ie(ze,(P(e(g)),v(()=>e(g).name))),ie(ce,(P(e(g)),v(()=>e(g).endpoint?.name||"Unknown")))},[()=>(P(Ie),P(e(g)),v(()=>Ie(`/organizations/${e(g).id}`)))]),E(I,ne)}}})}n(S);var G=i(S,2);{var ae=t=>{Ct(t,{$$events:{close:()=>a(p,!1),submit:he}})};X(G,t=>{e(p)&&t(ae)})}var H=i(G,2);{var le=t=>{lt(t,{get entity(){return e(c)},entityType:"organization",$$events:{close:()=>{a(A,!1),a(c,null)},submit:u=>d(u.detail)}})};X(H,t=>{e(A)&&e(c)&&t(le)})}var re=i(H,2);{var oe=t=>{dt(t,{title:"Delete Organization",message:"Are you sure you want to delete this organization? This action cannot be undone.",get itemName(){return e(c),v(()=>e(c).name)},$$events:{close:()=>{a(B,!1),a(c,null)},confirm:L}})};X(re,t=>{e(B)&&e(c)&&t(oe)})}E(pe,j),Ge(),ve()}export{Qt as component}; diff --git a/webapp/assets/_app/immutable/nodes/12.4nNpW1qS.js b/webapp/assets/_app/immutable/nodes/12.4nNpW1qS.js new file mode 100644 index 00000000..c3a5c1dc --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/12.4nNpW1qS.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as We}from"../chunks/C7KraPli.js";import{p as qe,o as He,A as je,l as Ge,h as Re,f as B,j as Ve,a as C,t as j,b as x,c as Je,u as i,q as de,e as ce,g as e,m as l,d as f,s as d,k as o,$ as Ke,r as m,w as Qe,B as ue,v as g}from"../chunks/cPTQ2Ibn.js";import{i as h,s as Xe,a as Ye}from"../chunks/DqFqoVWr.js";import{d as A,c as Ze,g as _}from"../chunks/DqbUkQgD.js";import{p as et}from"../chunks/DVsSf1wv.js";import{g as fe}from"../chunks/CTvJf3dP.js";import{U as tt}from"../chunks/B1V2wE0x.js";import{D as me}from"../chunks/91PQ6UtW.js";import{E as at,P as nt,a as ot}from"../chunks/WI-og7-I.js";import{D as rt}from"../chunks/oOdVuDuv.js";import{g as ge}from"../chunks/DJsB5Z5V.js";import{e as S}from"../chunks/BZiHL9L3.js";import{I as it}from"../chunks/DliFOxtc.js";import{W as st}from"../chunks/C7KJ549w.js";import{C as lt}from"../chunks/DPR9Z_fe.js";import{w as G}from"../chunks/BV_mDmfH.js";import{t as I}from"../chunks/Bgbd8SZ5.js";var dt=B('

Loading organization...

'),ct=B('

'),ut=B(" ",1),ft=B(' ',1);function Mt(pe,ve){qe(ve,!1);const[ye,he]=Xe(),R=()=>Ye(et,"$page",ye),w=l();let a=l(null),c=l([]),p=l([]),F=l(!0),O=l(""),D=l(!1),P=l(!1),E=l(!1),T=l(!1),u=l(null),M=null,b=l();async function V(){if(e(w))try{o(F,!0),o(O,"");const[t,n,r]=await Promise.all([_.getOrganization(e(w)),_.listOrganizationPools(e(w)).catch(()=>[]),_.listOrganizationInstances(e(w)).catch(()=>[])]);o(a,t),o(c,n),o(p,r)}catch(t){o(O,S(t))}finally{o(F,!1)}}function _e(t,n){const{events:r}=t;return{...n,events:r}}async function be(t){if(e(a))try{await _.updateOrganization(e(a).id,t),await V(),I.success("Organization Updated",`Organization ${e(a).name} has been updated successfully.`),o(D,!1)}catch(n){throw n}}async function ze(){if(e(a)){try{await _.deleteOrganization(e(a).id),fe(A("/organizations"))}catch(t){const n=S(t);I.error("Delete Failed",n)}o(P,!1)}}async function $e(){if(e(u))try{await _.deleteInstance(e(u).name),I.success("Instance Deleted",`Instance ${e(u).name} has been deleted successfully.`),o(E,!1),o(u,null)}catch(t){const n=S(t);I.error("Delete Failed",n),o(E,!1),o(u,null)}}function xe(t){o(u,t),o(E,!0)}function Ie(){o(T,!0)}async function we(t){try{if(!e(a))return;await _.createOrganizationPool(e(a).id,t.detail),I.success("Pool Created",`Pool has been created successfully for organization ${e(a).name}.`),o(T,!1)}catch(n){const r=S(n);I.error("Pool Creation Failed",r)}}function J(){e(b)&&Qe(b,e(b).scrollTop=e(b).scrollHeight)}function Ee(t){if(t.operation==="update"){const n=t.payload;if(e(a)&&n.id===e(a).id){const r=e(a).events?.length||0,s=n.events?.length||0;o(a,_e(e(a),n)),s>r&&setTimeout(()=>{J()},100)}}else if(t.operation==="delete"){const n=t.payload.id||t.payload;e(a)&&e(a).id===n&&fe(A("/organizations"))}}function Oe(t){if(!e(a))return;const n=t.payload;if(n.org_id===e(a).id){if(t.operation==="create")o(c,[...e(c),n]);else if(t.operation==="update")o(c,e(c).map(r=>r.id===n.id?n:r));else if(t.operation==="delete"){const r=n.id||n;o(c,e(c).filter(s=>s.id!==r))}}}function De(t){if(!e(a)||!e(c))return;const n=t.payload;if(e(c).some(s=>s.id===n.pool_id)){if(t.operation==="create")o(p,[...e(p),n]);else if(t.operation==="update")o(p,e(p).map(s=>s.id===n.id?n:s));else if(t.operation==="delete"){const s=n.id||n;o(p,e(p).filter(W=>W.id!==s))}}}He(()=>{V().then(()=>{e(a)?.events?.length&&setTimeout(()=>{J()},100)});const t=G.subscribeToEntity("organization",["update","delete"],Ee),n=G.subscribeToEntity("pool",["create","update","delete"],Oe),r=G.subscribeToEntity("instance",["create","update","delete"],De);M=()=>{t(),n(),r()}}),je(()=>{M&&(M(),M=null)}),Ge(()=>R(),()=>{o(w,R().params.id)}),Re(),We();var K=ft();Ve(t=>{j(()=>Ke.title=`${e(a),i(()=>e(a)?`${e(a).name} - Organization Details`:"Organization Details")??""} - GARM`)});var U=C(K),L=f(U),Q=f(L),N=f(Q),Pe=f(N);m(N);var X=d(N,2),Y=f(X),Z=d(f(Y),2),Te=f(Z,!0);m(Z),m(Y),m(X),m(Q),m(L);var Me=d(L,2);{var ke=t=>{var n=dt();x(t,n)},Ce=t=>{var n=ue(),r=C(n);{var s=z=>{var $=ct(),k=f($),q=f(k,!0);m(k),m($),j(()=>ce(q,e(O))),x(z,$)},W=z=>{var $=ue(),k=C($);{var q=H=>{var ne=ut(),oe=C(ne);{let v=g(()=>(e(a),i(()=>e(a).name||"Organization"))),y=g(()=>(e(a),i(()=>e(a).endpoint?.name))),Ne=g(()=>(de(ge),e(a),i(()=>ge(e(a).endpoint?.endpoint_type||"unknown"))));rt(oe,{get title(){return e(v)},get subtitle(){return`Endpoint: ${e(y)??""}`},get forgeIcon(){return e(Ne)},onEdit:()=>o(D,!0),onDelete:()=>o(P,!0)})}var re=d(oe,2);at(re,{get entity(){return e(a)},entityType:"organization"});var ie=d(re,2);{let v=g(()=>(e(a),i(()=>e(a).id||""))),y=g(()=>(e(a),i(()=>e(a).name||"")));st(ie,{entityType:"organization",get entityId(){return e(v)},get entityName(){return e(y)}})}var se=d(ie,2);{let v=g(()=>(e(a),i(()=>e(a).id||""))),y=g(()=>(e(a),i(()=>e(a).name||"")));nt(se,{get pools(){return e(c)},entityType:"organization",get entityId(){return e(v)},get entityName(){return e(y)},$$events:{addPool:Ie}})}var le=d(se,2);it(le,{get instances(){return e(p)},entityType:"organization",onDeleteInstance:xe});var Le=d(le,2);{let v=g(()=>(e(a),i(()=>e(a)?.events)));ot(Le,{get events(){return e(v)},get eventsContainer(){return e(b)},set eventsContainer(y){o(b,y)},$$legacy:!0})}x(H,ne)};h(k,H=>{e(a)&&H(q)},!0)}x(z,$)};h(r,z=>{e(O)?z(s):z(W,!1)},!0)}x(t,n)};h(Me,t=>{e(F)?t(ke):t(Ce,!1)})}m(U);var ee=d(U,2);{var Ae=t=>{tt(t,{get entity(){return e(a)},entityType:"organization",$$events:{close:()=>o(D,!1),submit:n=>be(n.detail)}})};h(ee,t=>{e(D)&&e(a)&&t(Ae)})}var te=d(ee,2);{var Se=t=>{me(t,{title:"Delete Organization",message:"Are you sure you want to delete this organization? This action cannot be undone and will remove all associated pools and instances.",get itemName(){return e(a),i(()=>e(a).name)},$$events:{close:()=>o(P,!1),confirm:ze}})};h(te,t=>{e(P)&&e(a)&&t(Se)})}var ae=d(te,2);{var Be=t=>{me(t,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(u),i(()=>e(u).name)},$$events:{close:()=>{o(E,!1),o(u,null)},confirm:$e}})};h(ae,t=>{e(E)&&e(u)&&t(Be)})}var Fe=d(ae,2);{var Ue=t=>{{let n=g(()=>(e(a),i(()=>e(a).id||"")));lt(t,{initialEntityType:"organization",get initialEntityId(){return e(n)},$$events:{close:()=>o(T,!1),submit:we}})}};h(Fe,t=>{e(T)&&e(a)&&t(Ue)})}j(t=>{Ze(Pe,"href",t),ce(Te,(e(a),i(()=>e(a)?e(a).name:"Loading...")))},[()=>(de(A),i(()=>A("/organizations")))]),x(pe,K),Je(),he()}export{Mt as component}; diff --git a/webapp/assets/_app/immutable/nodes/12.Cnc0Zn3x.js b/webapp/assets/_app/immutable/nodes/12.Cnc0Zn3x.js deleted file mode 100644 index 911542b8..00000000 --- a/webapp/assets/_app/immutable/nodes/12.Cnc0Zn3x.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as We}from"../chunks/DT0EGONV.js";import{p as qe,o as He,A as je,l as Ge,a as Re,f as B,h as Ve,b as C,t as j,c as x,d as Je,u as i,n as de,v as ce,g as e,m as l,j as f,k as d,s as o,$ as Ke,r as g,w as Qe,B as ue,q as m}from"../chunks/CRKWEg6v.js";import{i as h,s as Xe,a as Ye}from"../chunks/e1m7WRO5.js";import{d as A,c as Ze,g as _}from"../chunks/-esynYXT.js";import{p as et}from"../chunks/B0m3rqSR.js";import{g as fe}from"../chunks/Dkb9lSSG.js";import{U as tt}from"../chunks/DxLDbRe7.js";import{D as ge}from"../chunks/BXdh0O4_.js";import{E as at,P as nt,a as ot}from"../chunks/Bc0BXFmi.js";import{D as rt,I as it}from"../chunks/CrNwrvNH.js";import{g as me}from"../chunks/c_t0vA9G.js";import{e as S}from"../chunks/BZiHL9L3.js";import{W as st}from"../chunks/0HF0aP0D.js";import{C as lt}from"../chunks/BQabvZPm.js";import{w as G}from"../chunks/C73ZVvpW.js";import{t as I}from"../chunks/D6DjlyIQ.js";var dt=B('

Loading organization...

'),ct=B('

'),ut=B(" ",1),ft=B(' ',1);function Tt(pe,ve){qe(ve,!1);const[ye,he]=Xe(),R=()=>Ye(et,"$page",ye),w=l();let a=l(null),c=l([]),p=l([]),F=l(!0),O=l(""),D=l(!1),P=l(!1),E=l(!1),T=l(!1),u=l(null),M=null,b=l();async function V(){if(e(w))try{o(F,!0),o(O,"");const[t,n,r]=await Promise.all([_.getOrganization(e(w)),_.listOrganizationPools(e(w)).catch(()=>[]),_.listOrganizationInstances(e(w)).catch(()=>[])]);o(a,t),o(c,n),o(p,r)}catch(t){o(O,S(t))}finally{o(F,!1)}}function _e(t,n){const{events:r}=t;return{...n,events:r}}async function be(t){if(e(a))try{await _.updateOrganization(e(a).id,t),await V(),I.success("Organization Updated",`Organization ${e(a).name} has been updated successfully.`),o(D,!1)}catch(n){throw n}}async function ze(){if(e(a)){try{await _.deleteOrganization(e(a).id),fe(A("/organizations"))}catch(t){const n=S(t);I.error("Delete Failed",n)}o(P,!1)}}async function $e(){if(e(u))try{await _.deleteInstance(e(u).name),I.success("Instance Deleted",`Instance ${e(u).name} has been deleted successfully.`),o(E,!1),o(u,null)}catch(t){const n=S(t);I.error("Delete Failed",n),o(E,!1),o(u,null)}}function xe(t){o(u,t),o(E,!0)}function Ie(){o(T,!0)}async function we(t){try{if(!e(a))return;await _.createOrganizationPool(e(a).id,t.detail),I.success("Pool Created",`Pool has been created successfully for organization ${e(a).name}.`),o(T,!1)}catch(n){const r=S(n);I.error("Pool Creation Failed",r)}}function J(){e(b)&&Qe(b,e(b).scrollTop=e(b).scrollHeight)}function Ee(t){if(t.operation==="update"){const n=t.payload;if(e(a)&&n.id===e(a).id){const r=e(a).events?.length||0,s=n.events?.length||0;o(a,_e(e(a),n)),s>r&&setTimeout(()=>{J()},100)}}else if(t.operation==="delete"){const n=t.payload.id||t.payload;e(a)&&e(a).id===n&&fe(A("/organizations"))}}function Oe(t){if(!e(a))return;const n=t.payload;if(n.org_id===e(a).id){if(t.operation==="create")o(c,[...e(c),n]);else if(t.operation==="update")o(c,e(c).map(r=>r.id===n.id?n:r));else if(t.operation==="delete"){const r=n.id||n;o(c,e(c).filter(s=>s.id!==r))}}}function De(t){if(!e(a)||!e(c))return;const n=t.payload;if(e(c).some(s=>s.id===n.pool_id)){if(t.operation==="create")o(p,[...e(p),n]);else if(t.operation==="update")o(p,e(p).map(s=>s.id===n.id?n:s));else if(t.operation==="delete"){const s=n.id||n;o(p,e(p).filter(W=>W.id!==s))}}}He(()=>{V().then(()=>{e(a)?.events?.length&&setTimeout(()=>{J()},100)});const t=G.subscribeToEntity("organization",["update","delete"],Ee),n=G.subscribeToEntity("pool",["create","update","delete"],Oe),r=G.subscribeToEntity("instance",["create","update","delete"],De);M=()=>{t(),n(),r()}}),je(()=>{M&&(M(),M=null)}),Ge(()=>R(),()=>{o(w,R().params.id)}),Re(),We();var K=ft();Ve(t=>{j(()=>Ke.title=`${e(a),i(()=>e(a)?`${e(a).name} - Organization Details`:"Organization Details")??""} - GARM`)});var U=C(K),L=f(U),Q=f(L),N=f(Q),Pe=f(N);g(N);var X=d(N,2),Y=f(X),Z=d(f(Y),2),Te=f(Z,!0);g(Z),g(Y),g(X),g(Q),g(L);var Me=d(L,2);{var ke=t=>{var n=dt();x(t,n)},Ce=t=>{var n=ue(),r=C(n);{var s=z=>{var $=ct(),k=f($),q=f(k,!0);g(k),g($),j(()=>ce(q,e(O))),x(z,$)},W=z=>{var $=ue(),k=C($);{var q=H=>{var ne=ut(),oe=C(ne);{let v=m(()=>(e(a),i(()=>e(a).name||"Organization"))),y=m(()=>(e(a),i(()=>e(a).endpoint?.name))),Ne=m(()=>(de(me),e(a),i(()=>me(e(a).endpoint?.endpoint_type||"unknown"))));rt(oe,{get title(){return e(v)},get subtitle(){return`Endpoint: ${e(y)??""}`},get forgeIcon(){return e(Ne)},onEdit:()=>o(D,!0),onDelete:()=>o(P,!0)})}var re=d(oe,2);at(re,{get entity(){return e(a)},entityType:"organization"});var ie=d(re,2);{let v=m(()=>(e(a),i(()=>e(a).id||""))),y=m(()=>(e(a),i(()=>e(a).name||"")));st(ie,{entityType:"organization",get entityId(){return e(v)},get entityName(){return e(y)}})}var se=d(ie,2);{let v=m(()=>(e(a),i(()=>e(a).id||""))),y=m(()=>(e(a),i(()=>e(a).name||"")));nt(se,{get pools(){return e(c)},entityType:"organization",get entityId(){return e(v)},get entityName(){return e(y)},$$events:{addPool:Ie}})}var le=d(se,2);it(le,{get instances(){return e(p)},entityType:"organization",onDeleteInstance:xe});var Le=d(le,2);{let v=m(()=>(e(a),i(()=>e(a)?.events)));ot(Le,{get events(){return e(v)},get eventsContainer(){return e(b)},set eventsContainer(y){o(b,y)},$$legacy:!0})}x(H,ne)};h(k,H=>{e(a)&&H(q)},!0)}x(z,$)};h(r,z=>{e(O)?z(s):z(W,!1)},!0)}x(t,n)};h(Me,t=>{e(F)?t(ke):t(Ce,!1)})}g(U);var ee=d(U,2);{var Ae=t=>{tt(t,{get entity(){return e(a)},entityType:"organization",$$events:{close:()=>o(D,!1),submit:n=>be(n.detail)}})};h(ee,t=>{e(D)&&e(a)&&t(Ae)})}var te=d(ee,2);{var Se=t=>{ge(t,{title:"Delete Organization",message:"Are you sure you want to delete this organization? This action cannot be undone and will remove all associated pools and instances.",get itemName(){return e(a),i(()=>e(a).name)},$$events:{close:()=>o(P,!1),confirm:ze}})};h(te,t=>{e(P)&&e(a)&&t(Se)})}var ae=d(te,2);{var Be=t=>{ge(t,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(u),i(()=>e(u).name)},$$events:{close:()=>{o(E,!1),o(u,null)},confirm:$e}})};h(ae,t=>{e(E)&&e(u)&&t(Be)})}var Fe=d(ae,2);{var Ue=t=>{{let n=m(()=>(e(a),i(()=>e(a).id||"")));lt(t,{initialEntityType:"organization",get initialEntityId(){return e(n)},$$events:{close:()=>o(T,!1),submit:we}})}};h(Fe,t=>{e(T)&&e(a)&&t(Ue)})}j(t=>{Ze(Pe,"href",t),ce(Te,(e(a),i(()=>e(a)?e(a).name:"Loading...")))},[()=>(de(A),i(()=>A("/organizations")))]),x(pe,K),Je(),he()}export{Tt as component}; diff --git a/webapp/assets/_app/immutable/nodes/13.DReyzJRQ.js b/webapp/assets/_app/immutable/nodes/13.B0F9yHlE.js similarity index 83% rename from webapp/assets/_app/immutable/nodes/13.DReyzJRQ.js rename to webapp/assets/_app/immutable/nodes/13.B0F9yHlE.js index 2db03565..0b05c384 100644 --- a/webapp/assets/_app/immutable/nodes/13.DReyzJRQ.js +++ b/webapp/assets/_app/immutable/nodes/13.B0F9yHlE.js @@ -1 +1 @@ -import"../chunks/DsnmJJEf.js";import{i as ye}from"../chunks/DT0EGONV.js";import{p as he,o as Pe,l as p,a as ve,f as J,h as Ce,b as _e,c as V,d as $e,g as t,m as r,$ as be,j as q,q as w,u as j,k as y,s as o,r as H,n as Me}from"../chunks/CRKWEg6v.js";import{i as _,s as Te,a as De}from"../chunks/e1m7WRO5.js";import{g as k}from"../chunks/-esynYXT.js";import{P as Ee}from"../chunks/BAnDfGwP.js";import{C as we}from"../chunks/BQabvZPm.js";import{U as ke}from"../chunks/BxQMwFca.js";import{D as Ae}from"../chunks/BXdh0O4_.js";import{M as Ie}from"../chunks/xe-4nY5o.js";import{D as Se,G as A,a as xe,L as Fe}from"../chunks/B1coRVG4.js";import{e as Ue,a as z}from"../chunks/Djd10kRn.js";import{t as u}from"../chunks/D6DjlyIQ.js";import{e as $,h as Le}from"../chunks/c_t0vA9G.js";import{e as b}from"../chunks/BZiHL9L3.js";import{E as Ne}from"../chunks/DF8ZTWYj.js";import{E as Re}from"../chunks/B27KefbC.js";import{S as Ge}from"../chunks/B0Y2gXDu.js";import{P as Ve}from"../chunks/BMHtEUeX.js";import"../chunks/D0m048VH.js";const B={};var qe=J('
'),je=J('
',1);function ct(K,O){he(O,!1);const[Q,W]=Te(),s=()=>De(Ue,"$eagerCache",Q),M=r(),c=r(),m=r(),I=r();let f=r([]),h=r(!0),S=r(""),P=r(""),n=r(1),d=r(25),v=r(!1),C=r(!1),g=r(!1),a=r(null),T=r(!1);async function X(e){try{u.success("Pool Created","Pool has been created successfully."),o(v,!1)}catch(l){const i=b(l);u.error("Pool Creation Failed",i)}}async function Y(e){if(t(a))try{await k.updatePool(t(a).id,e),o(C,!1),u.add({type:"success",title:"Pool Updated",message:`Pool ${t(a).id.slice(0,8)}... has been updated successfully.`}),o(a,null)}catch(l){const i=b(l);throw u.add({type:"error",title:"Update Failed",message:i}),l}}async function Z(){if(!t(a))return;const e=`Pool ${t(a).id.slice(0,8)}...`;try{await k.deletePool(t(a).id),o(g,!1),u.add({type:"success",title:"Pool Deleted",message:`${e} has been deleted successfully.`}),o(a,null)}catch(l){const i=b(l);u.add({type:"error",title:"Delete Failed",message:i})}o(g,!1),o(a,null)}function ee(){o(v,!0)}async function x(e){try{o(T,!0);const l=await k.getPool(e.id);o(a,l),o(C,!0)}catch(l){const i=b(l);u.error("Failed to Load Pool Details",i)}finally{o(T,!1)}}function F(e){o(a,e),o(g,!0)}Pe(async()=>{try{o(h,!0);const e=await z.getPools();e&&Array.isArray(e)&&o(f,e)}catch(e){B?.VITEST||console.error("Failed to load pools:",e),o(S,e instanceof Error?e.message:"Failed to load pools")}finally{o(h,!1)}});async function te(){try{await z.retryResource("pools")}catch(e){B?.VITEST||console.error("Retry failed:",e)}}const oe=[{key:"id",title:"ID",flexible:!0,cellComponent:Ne,cellProps:{entityType:"pool",showId:!0,fontMono:!0}},{key:"image",title:"Image",flexible:!0,cellComponent:A,cellProps:{field:"image",type:"code",showTitle:!0}},{key:"provider",title:"Provider",cellComponent:A,cellProps:{field:"provider_name"}},{key:"flavor",title:"Flavor",cellComponent:A,cellProps:{field:"flavor"}},{key:"entity",title:"Entity",cellComponent:Ve},{key:"endpoint",title:"Endpoint",cellComponent:Re},{key:"status",title:"Status",cellComponent:Ge,cellProps:{statusType:"enabled"}},{key:"actions",title:"Actions",align:"right",cellComponent:xe}],ae={entityType:"pool",primaryText:{field:"id",isClickable:!0,href:"/pools/{id}",useId:!0,isMonospace:!0},secondaryText:{field:"entity_name",computedValue:e=>$(e,s())},badges:[{type:"custom",value:e=>({variant:e.enabled?"success":"error",text:e.enabled?"Enabled":"Disabled"})}],actions:[{type:"edit",handler:e=>x(e)},{type:"delete",handler:e=>F(e)}]};function le(e){o(P,e.detail.term),o(n,1)}function re(e){o(n,e.detail.page)}function se(e){o(d,e.detail.perPage),o(n,1)}function ne(e){x(e.detail.item)}function ie(e){F(e.detail.item)}p(()=>(t(f),s()),()=>{(!t(f).length||s().loaded.pools)&&o(f,s().pools)}),p(()=>s(),()=>{o(h,s().loading.pools)}),p(()=>s(),()=>{o(M,s().errorMessages.pools)}),p(()=>(t(f),t(P),s()),()=>{o(c,Le(t(f),t(P),e=>$(e,s())))}),p(()=>(t(c),t(d)),()=>{o(m,Math.ceil(t(c).length/t(d)))}),p(()=>(t(n),t(m)),()=>{t(n)>t(m)&&t(m)>0&&o(n,t(m))}),p(()=>(t(c),t(n),t(d)),()=>{o(I,t(c).slice((t(n)-1)*t(d),t(n)*t(d)))}),ve(),ye();var U=je();Ce(e=>{be.title="Pools - GARM"});var D=_e(U),L=q(D);Ee(L,{title:"Pools",description:"Manage runner pools across all entities",actionLabel:"Add Pool",$$events:{action:ee}});var ce=y(L,2);{let e=w(()=>t(M)||t(S)),l=w(()=>!!t(M));Se(ce,{get columns(){return oe},get data(){return t(I)},get loading(){return t(h)},get error(){return t(e)},get searchTerm(){return t(P)},searchPlaceholder:"Search by entity name...",get currentPage(){return t(n)},get perPage(){return t(d)},get totalPages(){return t(m)},get totalItems(){return t(c),j(()=>t(c).length)},itemName:"pools",emptyIconType:"cog",get showRetry(){return t(l)},get mobileCardConfig(){return ae},$$events:{search:le,pageChange:re,perPageChange:se,retry:te,edit:ne,delete:ie}})}H(D);var N=y(D,2);{var de=e=>{we(e,{$$events:{close:()=>o(v,!1),submit:X}})};_(N,e=>{t(v)&&e(de)})}var R=y(N,2);{var pe=e=>{ke(e,{get pool(){return t(a)},$$events:{close:()=>{o(C,!1),o(a,null)},submit:l=>Y(l.detail)}})};_(R,e=>{t(C)&&t(a)&&e(pe)})}var G=y(R,2);{var ue=e=>{{let l=w(()=>(t(a),Me($),s(),j(()=>`Pool ${t(a).id.slice(0,8)}... (${$(t(a),s())})`)));Ae(e,{title:"Delete Pool",message:"Are you sure you want to delete this pool? This action cannot be undone and will remove all associated runners.",get itemName(){return t(l)},$$events:{close:()=>{o(g,!1),o(a,null)},confirm:Z}})}};_(G,e=>{t(g)&&t(a)&&e(ue)})}var me=y(G,2);{var fe=e=>{Ie(e,{$$events:{close:()=>{}},children:(l,i)=>{var E=qe(),ge=q(E);Fe(ge,{message:"Loading pool details..."}),H(E),V(l,E)},$$slots:{default:!0}})};_(me,e=>{t(T)&&e(fe)})}V(K,U),$e(),W()}export{ct as component}; +import"../chunks/DsnmJJEf.js";import{i as ye}from"../chunks/C7KraPli.js";import{p as he,o as Pe,l as p,h as ve,f as J,j as Ce,a as _e,b as V,c as $e,g as t,m as r,$ as be,d as q,v as w,u as j,s as y,k as o,r as H,q as Me}from"../chunks/cPTQ2Ibn.js";import{i as _,s as Te,a as De}from"../chunks/DqFqoVWr.js";import{g as k}from"../chunks/DqbUkQgD.js";import{P as Ee}from"../chunks/U3V4g_hv.js";import{C as we}from"../chunks/DPR9Z_fe.js";import{U as ke}from"../chunks/2Xl6sR6s.js";import{D as Ae}from"../chunks/91PQ6UtW.js";import{M as Ie}from"../chunks/Bo3f8OIz.js";import{D as Se,G as A,A as xe,L as Fe}from"../chunks/Du50aAe5.js";import{e as Ue,a as z}from"../chunks/JUkrBp3F.js";import{t as u}from"../chunks/Bgbd8SZ5.js";import{e as $,h as Le}from"../chunks/DJsB5Z5V.js";import{e as b}from"../chunks/BZiHL9L3.js";import{E as Ne}from"../chunks/CPFytHjx.js";import{E as Re}from"../chunks/CYqkNFLz.js";import{S as Ge}from"../chunks/BZ2WxPPD.js";import{P as Ve}from"../chunks/BM4Azg_w.js";import"../chunks/D7e9zx6w.js";const B={};var qe=J('
'),je=J('
',1);function ct(K,O){he(O,!1);const[Q,W]=Te(),s=()=>De(Ue,"$eagerCache",Q),M=r(),c=r(),m=r(),I=r();let f=r([]),h=r(!0),S=r(""),P=r(""),n=r(1),d=r(25),v=r(!1),C=r(!1),g=r(!1),a=r(null),T=r(!1);async function X(e){try{u.success("Pool Created","Pool has been created successfully."),o(v,!1)}catch(l){const i=b(l);u.error("Pool Creation Failed",i)}}async function Y(e){if(t(a))try{await k.updatePool(t(a).id,e),o(C,!1),u.add({type:"success",title:"Pool Updated",message:`Pool ${t(a).id.slice(0,8)}... has been updated successfully.`}),o(a,null)}catch(l){const i=b(l);throw u.add({type:"error",title:"Update Failed",message:i}),l}}async function Z(){if(!t(a))return;const e=`Pool ${t(a).id.slice(0,8)}...`;try{await k.deletePool(t(a).id),o(g,!1),u.add({type:"success",title:"Pool Deleted",message:`${e} has been deleted successfully.`}),o(a,null)}catch(l){const i=b(l);u.add({type:"error",title:"Delete Failed",message:i})}o(g,!1),o(a,null)}function ee(){o(v,!0)}async function x(e){try{o(T,!0);const l=await k.getPool(e.id);o(a,l),o(C,!0)}catch(l){const i=b(l);u.error("Failed to Load Pool Details",i)}finally{o(T,!1)}}function F(e){o(a,e),o(g,!0)}Pe(async()=>{try{o(h,!0);const e=await z.getPools();e&&Array.isArray(e)&&o(f,e)}catch(e){B?.VITEST||console.error("Failed to load pools:",e),o(S,e instanceof Error?e.message:"Failed to load pools")}finally{o(h,!1)}});async function te(){try{await z.retryResource("pools")}catch(e){B?.VITEST||console.error("Retry failed:",e)}}const oe=[{key:"id",title:"ID",flexible:!0,cellComponent:Ne,cellProps:{entityType:"pool",showId:!0,fontMono:!0}},{key:"image",title:"Image",flexible:!0,cellComponent:A,cellProps:{field:"image",type:"code",showTitle:!0}},{key:"provider",title:"Provider",cellComponent:A,cellProps:{field:"provider_name"}},{key:"flavor",title:"Flavor",cellComponent:A,cellProps:{field:"flavor"}},{key:"entity",title:"Entity",cellComponent:Ve},{key:"endpoint",title:"Endpoint",cellComponent:Re},{key:"status",title:"Status",cellComponent:Ge,cellProps:{statusType:"enabled"}},{key:"actions",title:"Actions",align:"right",cellComponent:xe}],ae={entityType:"pool",primaryText:{field:"id",isClickable:!0,href:"/pools/{id}",useId:!0,isMonospace:!0},secondaryText:{field:"entity_name",computedValue:e=>$(e,s())},badges:[{type:"custom",value:e=>({variant:e.enabled?"success":"error",text:e.enabled?"Enabled":"Disabled"})}],actions:[{type:"edit",handler:e=>x(e)},{type:"delete",handler:e=>F(e)}]};function le(e){o(P,e.detail.term),o(n,1)}function re(e){o(n,e.detail.page)}function se(e){o(d,e.detail.perPage),o(n,1)}function ne(e){x(e.detail.item)}function ie(e){F(e.detail.item)}p(()=>(t(f),s()),()=>{(!t(f).length||s().loaded.pools)&&o(f,s().pools)}),p(()=>s(),()=>{o(h,s().loading.pools)}),p(()=>s(),()=>{o(M,s().errorMessages.pools)}),p(()=>(t(f),t(P),s()),()=>{o(c,Le(t(f),t(P),e=>$(e,s())))}),p(()=>(t(c),t(d)),()=>{o(m,Math.ceil(t(c).length/t(d)))}),p(()=>(t(n),t(m)),()=>{t(n)>t(m)&&t(m)>0&&o(n,t(m))}),p(()=>(t(c),t(n),t(d)),()=>{o(I,t(c).slice((t(n)-1)*t(d),t(n)*t(d)))}),ve(),ye();var U=je();Ce(e=>{be.title="Pools - GARM"});var D=_e(U),L=q(D);Ee(L,{title:"Pools",description:"Manage runner pools across all entities",actionLabel:"Add Pool",$$events:{action:ee}});var ce=y(L,2);{let e=w(()=>t(M)||t(S)),l=w(()=>!!t(M));Se(ce,{get columns(){return oe},get data(){return t(I)},get loading(){return t(h)},get error(){return t(e)},get searchTerm(){return t(P)},searchPlaceholder:"Search by entity name...",get currentPage(){return t(n)},get perPage(){return t(d)},get totalPages(){return t(m)},get totalItems(){return t(c),j(()=>t(c).length)},itemName:"pools",emptyIconType:"cog",get showRetry(){return t(l)},get mobileCardConfig(){return ae},$$events:{search:le,pageChange:re,perPageChange:se,retry:te,edit:ne,delete:ie}})}H(D);var N=y(D,2);{var de=e=>{we(e,{$$events:{close:()=>o(v,!1),submit:X}})};_(N,e=>{t(v)&&e(de)})}var R=y(N,2);{var pe=e=>{ke(e,{get pool(){return t(a)},$$events:{close:()=>{o(C,!1),o(a,null)},submit:l=>Y(l.detail)}})};_(R,e=>{t(C)&&t(a)&&e(pe)})}var G=y(R,2);{var ue=e=>{{let l=w(()=>(t(a),Me($),s(),j(()=>`Pool ${t(a).id.slice(0,8)}... (${$(t(a),s())})`)));Ae(e,{title:"Delete Pool",message:"Are you sure you want to delete this pool? This action cannot be undone and will remove all associated runners.",get itemName(){return t(l)},$$events:{close:()=>{o(g,!1),o(a,null)},confirm:Z}})}};_(G,e=>{t(g)&&t(a)&&e(ue)})}var me=y(G,2);{var fe=e=>{Ie(e,{$$events:{close:()=>{}},children:(l,i)=>{var E=qe(),ge=q(E);Fe(ge,{message:"Loading pool details..."}),H(E),V(l,E)},$$slots:{default:!0}})};_(me,e=>{t(T)&&e(fe)})}V(K,U),$e(),W()}export{ct as component}; diff --git a/webapp/assets/_app/immutable/nodes/14.Cn4SQVXe.js b/webapp/assets/_app/immutable/nodes/14.Cn4SQVXe.js deleted file mode 100644 index 1f121f45..00000000 --- a/webapp/assets/_app/immutable/nodes/14.Cn4SQVXe.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as ze}from"../chunks/DT0EGONV.js";import{p as He,o as Ve,A as We,l as Ke,a as Qe,f as h,h as Xe,b as F,t as b,c as x,d as Ye,u as i,n as u,v as l,g as t,m as y,j as r,k as s,s as n,$ as Ze,r as a,w as D,B as Kt,q as M}from"../chunks/CRKWEg6v.js";import{i as f,s as ta,a as ea}from"../chunks/e1m7WRO5.js";import{w as Qt,e as aa,i as ra}from"../chunks/C73ZVvpW.js";import{d as R,c as Xt,g as C,s as da}from"../chunks/-esynYXT.js";import{p as sa}from"../chunks/B0m3rqSR.js";import{g as Yt}from"../chunks/Dkb9lSSG.js";import{U as ia}from"../chunks/BxQMwFca.js";import{D as Zt}from"../chunks/BXdh0O4_.js";import{D as oa,I as na}from"../chunks/CrNwrvNH.js";import{t as E}from"../chunks/D6DjlyIQ.js";import{e as P,i as L,j as te,b as O,g as ee}from"../chunks/c_t0vA9G.js";import{e as G}from"../chunks/BZiHL9L3.js";var la=h('

Loading pool...

'),va=h('

'),ca=h('
GitHub Runner Group
'),ma=h(' '),xa=h('
Tags
'),ua=h('

Extra Specifications

 
'),ga=h('

Basic Information

Pool ID
Provider
Image
Flavor
Status
Entity
Created At
Updated At

Configuration

Max Runners
Min Idle Runners
Bootstrap Timeout
Priority
Runner Prefix
OS Type / Architecture
',1),pa=h(' ',1);function Ta(ae,re){He(re,!1);const[de,se]=ta(),gt=()=>ea(sa,"$page",de),J=y();let e=y(null),j=y(!0),A=y(""),T=y(!1),U=y(!1),S=y(!1),g=y(null),B=null;async function ie(){if(t(J))try{n(j,!0),n(A,""),n(e,await C.getPool(t(J))),t(e).instances||D(e,t(e).instances=[])}catch(d){n(A,G(d))}finally{n(j,!1)}}async function oe(d){if(t(e))try{const o=await C.updatePool(t(e).id,d);n(e,o),n(T,!1),E.success("Pool Updated",`Pool ${t(e).id} has been updated successfully.`)}catch(o){const _=G(o);E.error("Update Failed",_)}}async function ne(){if(t(e)){try{await C.deletePool(t(e).id),Yt(R("/pools"))}catch(d){const o=G(d);E.error("Delete Failed",o)}n(U,!1)}}async function le(){if(t(g)){try{await C.deleteInstance(t(g).name),E.success("Instance Deleted",`Instance ${t(g).name} has been deleted successfully.`)}catch(d){const o=G(d);E.error("Delete Failed",o)}n(S,!1),n(g,null)}}function ve(d){n(g,d),n(S,!0)}function ce(d){if(!d)return"{}";try{if(typeof d=="string"){const o=JSON.parse(d);return JSON.stringify(o,null,2)}return JSON.stringify(d,null,2)}catch{return d.toString()}}function me(d){if(d.operation==="update"){const o=d.payload;t(e)&&o.id===t(e).id&&n(e,o)}else if(d.operation==="delete"){const o=d.payload.id||d.payload;t(e)&&t(e).id===o&&Yt(R("/pools"))}}function xe(d){if(!t(e))return;const o=d.payload;if(o.pool_id===t(e).id){if(t(e).instances||D(e,t(e).instances=[]),d.operation==="create")D(e,t(e).instances=[...t(e).instances,o]);else if(d.operation==="update")D(e,t(e).instances=t(e).instances.map(_=>_.id===o.id?o:_));else if(d.operation==="delete"){const _=o.id||o;D(e,t(e).instances=t(e).instances.filter(V=>V.id!==_))}n(e,t(e))}}Ve(()=>{ie();const d=Qt.subscribeToEntity("pool",["update","delete"],me),o=Qt.subscribeToEntity("instance",["create","update","delete"],xe);B=()=>{d(),o()}}),We(()=>{B&&(B(),B=null)}),Ke(()=>gt(),()=>{n(J,gt().params.id)}),Qe(),ze();var pt=pa();Xe(d=>{b(()=>Ze.title=`${t(e),i(()=>t(e)?`Pool ${t(e).id} - Pool Details`:"Pool Details")??""} - GARM`)});var q=F(pt),z=r(q),ft=r(z),H=r(ft),ue=r(H);a(H);var _t=s(H,2),yt=r(_t),ht=s(r(yt),2),ge=r(ht,!0);a(ht),a(yt),a(_t),a(ft),a(z);var pe=s(z,2);{var fe=d=>{var o=la();x(d,o)},_e=d=>{var o=Kt(),_=F(o);{var V=k=>{var w=va(),N=r(w),W=r(N,!0);a(N),a(w),b(()=>l(W,t(A))),x(k,w)},we=k=>{var w=Kt(),N=F(w);{var W=K=>{var wt=ga(),$t=F(wt);{let v=M(()=>(u(P),t(e),i(()=>P(t(e))))),c=M(()=>(u(L),t(e),i(()=>L(t(e))))),m=M(()=>(u(ee),t(e),i(()=>ee(t(e).endpoint?.endpoint_type||"unknown"))));oa($t,{get title(){return t(e),i(()=>t(e).id)},get subtitle(){return`Pool for ${t(v)??""} (${t(c)??""})`},get forgeIcon(){return t(m)},onEdit:()=>n(T,!0),onDelete:()=>n(U,!0)})}var Q=s($t,2),X=r(Q),Pt=r(X),It=s(r(Pt),2),Y=r(It),Dt=s(r(Y),2),$e=r(Dt,!0);a(Dt),a(Y);var Z=s(Y,2),Mt=s(r(Z),2),Pe=r(Mt,!0);a(Mt),a(Z);var tt=s(Z,2),Et=s(r(tt),2),At=r(Et),Ie=r(At,!0);a(At),a(Et),a(tt);var et=s(tt,2),Tt=s(r(et),2),De=r(Tt,!0);a(Tt),a(et);var at=s(et,2),Ut=s(r(at),2),rt=r(Ut),Me=r(rt,!0);a(rt),a(Ut),a(at);var dt=s(at,2),St=s(r(dt),2),Bt=r(St),st=r(Bt),Ee=r(st,!0);a(st);var it=s(st,2),Ae=r(it,!0);a(it),a(Bt),a(St),a(dt);var ot=s(dt,2),Nt=s(r(ot),2),Te=r(Nt,!0);a(Nt),a(ot);var Ft=s(ot,2),Rt=s(r(Ft),2),Ue=r(Rt,!0);a(Rt),a(Ft),a(It),a(Pt),a(X);var Ct=s(X,2),Lt=r(Ct),Ot=s(r(Lt),2),nt=r(Ot),Gt=s(r(nt),2),Se=r(Gt,!0);a(Gt),a(nt);var lt=s(nt,2),Jt=s(r(lt),2),Be=r(Jt,!0);a(Jt),a(lt);var vt=s(lt,2),jt=s(r(vt),2),Ne=r(jt);a(jt),a(vt);var ct=s(vt,2),qt=s(r(ct),2),Fe=r(qt,!0);a(qt),a(ct);var mt=s(ct,2),zt=s(r(mt),2),Re=r(zt,!0);a(zt),a(mt);var xt=s(mt,2),Ht=s(r(xt),2),Ce=r(Ht);a(Ht),a(xt);var Vt=s(xt,2);{var Le=v=>{var c=ca(),m=s(r(c),2),p=r(m,!0);a(m),a(c),b(()=>l(p,(t(e),i(()=>t(e)["github-runner-group"])))),x(v,c)};f(Vt,v=>{t(e),i(()=>t(e)["github-runner-group"])&&v(Le)})}var Oe=s(Vt,2);{var Ge=v=>{var c=xa(),m=s(r(c),2),p=r(m);aa(p,5,()=>(t(e),i(()=>t(e).tags)),ra,(I,$)=>{var ut=ma(),qe=r(ut,!0);a(ut),b(()=>l(qe,(t($),i(()=>typeof t($)=="string"?t($):t($).name)))),x(I,ut)}),a(p),a(m),a(c),x(v,c)};f(Oe,v=>{t(e),i(()=>t(e).tags&&t(e).tags.length>0)&&v(Ge)})}a(Ot),a(Lt),a(Ct),a(Q);var Wt=s(Q,2);{var Je=v=>{var c=ua(),m=r(c),p=s(r(m),2),I=r(p,!0);a(p),a(m),a(c),b($=>l(I,$),[()=>(t(e),i(()=>ce(t(e).extra_specs)))]),x(v,c)};f(Wt,v=>{t(e),i(()=>t(e).extra_specs)&&v(Je)})}var je=s(Wt,2);{let v=M(()=>(t(e),i(()=>t(e).instances||[])));na(je,{get instances(){return t(v)},entityType:"pool",onDeleteInstance:ve})}b((v,c,m,p,I)=>{l($e,(t(e),i(()=>t(e).id))),l(Pe,(t(e),i(()=>t(e).provider_name))),l(Ie,(t(e),i(()=>t(e).image))),l(De,(t(e),i(()=>t(e).flavor))),da(rt,1,`inline-flex px-2 py-1 text-xs font-medium rounded-full ${t(e),i(()=>t(e).enabled?"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200":"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200")??""}`),l(Me,(t(e),i(()=>t(e).enabled?"Enabled":"Disabled"))),l(Ee,v),Xt(it,"href",c),l(Ae,m),l(Te,p),l(Ue,I),l(Se,(t(e),i(()=>t(e).max_runners))),l(Be,(t(e),i(()=>t(e).min_idle_runners))),l(Ne,`${t(e),i(()=>t(e).runner_bootstrap_timeout)??""} minutes`),l(Fe,(t(e),i(()=>t(e).priority))),l(Re,(t(e),i(()=>t(e).runner_prefix||"garm"))),l(Ce,`${t(e),i(()=>t(e).os_type)??""} / ${t(e),i(()=>t(e).os_arch)??""}`)},[()=>(u(L),t(e),i(()=>L(t(e)))),()=>(u(te),t(e),i(()=>te(t(e)))),()=>(u(P),t(e),i(()=>P(t(e)))),()=>(u(O),t(e),i(()=>O(t(e).created_at||""))),()=>(u(O),t(e),i(()=>O(t(e).updated_at||"")))]),x(K,wt)};f(N,K=>{t(e)&&K(W)},!0)}x(k,w)};f(_,k=>{t(A)?k(V):k(we,!1)},!0)}x(d,o)};f(pe,d=>{t(j)?d(fe):d(_e,!1)})}a(q);var bt=s(q,2);{var ye=d=>{ia(d,{get pool(){return t(e)},$$events:{close:()=>n(T,!1),submit:o=>oe(o.detail)}})};f(bt,d=>{t(T)&&t(e)&&d(ye)})}var kt=s(bt,2);{var he=d=>{{let o=M(()=>(t(e),u(P),i(()=>`Pool ${t(e).id} (${P(t(e))})`)));Zt(d,{title:"Delete Pool",message:"Are you sure you want to delete this pool? This action cannot be undone and will remove all associated runners.",get itemName(){return t(o)},$$events:{close:()=>n(U,!1),confirm:ne}})}};f(kt,d=>{t(U)&&t(e)&&d(he)})}var be=s(kt,2);{var ke=d=>{Zt(d,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return t(g),i(()=>t(g).name)},$$events:{close:()=>{n(S,!1),n(g,null)},confirm:le}})};f(be,d=>{t(S)&&t(g)&&d(ke)})}b(d=>{Xt(ue,"href",d),l(ge,(t(e),i(()=>t(e)?t(e).id:"Loading...")))},[()=>(u(R),i(()=>R("/pools")))]),x(ae,pt),Ye(),se()}export{Ta as component}; diff --git a/webapp/assets/_app/immutable/nodes/14.FP7fqeji.js b/webapp/assets/_app/immutable/nodes/14.FP7fqeji.js new file mode 100644 index 00000000..0e667efa --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/14.FP7fqeji.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as ze}from"../chunks/C7KraPli.js";import{p as He,o as Ve,A as We,l as Ke,h as Qe,f as _,j as Xe,a as F,t as b,b as u,c as Ye,u as i,q as g,e as n,g as t,m as k,d as r,s,k as v,$ as Ze,r as a,w as M,B as Qt,v as E}from"../chunks/cPTQ2Ibn.js";import{i as f}from"../chunks/DqFqoVWr.js";import{e as ta,i as ea}from"../chunks/CiWDXYQd.js";import{d as $,c as gt,g as C,s as aa}from"../chunks/DqbUkQgD.js";import{p as Xt}from"../chunks/BgSaD1r_.js";import{g as Yt}from"../chunks/CTvJf3dP.js";import{U as ra}from"../chunks/2Xl6sR6s.js";import{D as Zt}from"../chunks/91PQ6UtW.js";import{I as da}from"../chunks/DliFOxtc.js";import{D as sa}from"../chunks/oOdVuDuv.js";import{w as te}from"../chunks/BV_mDmfH.js";import{t as T}from"../chunks/Bgbd8SZ5.js";import{e as D,i as L,j as ee,b as O,g as ae}from"../chunks/DJsB5Z5V.js";import{e as G}from"../chunks/BZiHL9L3.js";var ia=_('

Loading pool...

'),oa=_('

'),la=_('
Runner Install Template
'),na=_('
GitHub Runner Group
'),va=_(' '),ma=_('
Tags
'),ca=_('

Extra Specifications

 
'),xa=_('

Basic Information

Pool ID
Provider
Image
Flavor
Status
Entity
Created At
Updated At

Configuration

Max Runners
Min Idle Runners
Bootstrap Timeout
Priority
Runner Prefix
OS Type / Architecture
',1),ua=_(' ',1);function Aa(re,de){He(de,!1);const J=k();let e=k(null),j=k(!0),A=k(""),U=k(!1),S=k(!1),B=k(!1),p=k(null),N=null;async function se(){if(t(J))try{v(j,!0),v(A,""),v(e,await C.getPool(t(J))),t(e).instances||M(e,t(e).instances=[])}catch(d){v(A,G(d))}finally{v(j,!1)}}async function ie(d){if(t(e))try{const o=await C.updatePool(t(e).id,d);v(e,o),v(U,!1),T.success("Pool Updated",`Pool ${t(e).id} has been updated successfully.`)}catch(o){const y=G(o);T.error("Update Failed",y)}}async function oe(){if(t(e)){try{await C.deletePool(t(e).id),Yt($("/pools"))}catch(d){const o=G(d);T.error("Delete Failed",o)}v(S,!1)}}async function le(){if(t(p)){try{await C.deleteInstance(t(p).name),T.success("Instance Deleted",`Instance ${t(p).name} has been deleted successfully.`)}catch(d){const o=G(d);T.error("Delete Failed",o)}v(B,!1),v(p,null)}}function ne(d){v(p,d),v(B,!0)}function ve(d){if(!d)return"{}";try{if(typeof d=="string"){const o=JSON.parse(d);return JSON.stringify(o,null,2)}return JSON.stringify(d,null,2)}catch{return d.toString()}}function me(d){if(d.operation==="update"){const o=d.payload;t(e)&&o.id===t(e).id&&v(e,o)}else if(d.operation==="delete"){const o=d.payload.id||d.payload;t(e)&&t(e).id===o&&Yt($("/pools"))}}function ce(d){if(!t(e))return;const o=d.payload;if(o.pool_id===t(e).id){if(t(e).instances||M(e,t(e).instances=[]),d.operation==="create")M(e,t(e).instances=[...t(e).instances,o]);else if(d.operation==="update")M(e,t(e).instances=t(e).instances.map(y=>y.id===o.id?o:y));else if(d.operation==="delete"){const y=o.id||o;M(e,t(e).instances=t(e).instances.filter(V=>V.id!==y))}v(e,t(e))}}Ve(()=>{se();const d=te.subscribeToEntity("pool",["update","delete"],me),o=te.subscribeToEntity("instance",["create","update","delete"],ce);N=()=>{d(),o()}}),We(()=>{N&&(N(),N=null)}),Ke(()=>Xt,()=>{v(J,Xt.params.id)}),Qe(),ze();var ft=ua();Xe(d=>{b(()=>Ze.title=`${t(e),i(()=>t(e)?`Pool ${t(e).id} - Pool Details`:"Pool Details")??""} - GARM`)});var q=F(ft),z=r(q),pt=r(z),H=r(pt),xe=r(H);a(H);var _t=s(H,2),yt=r(_t),ht=s(r(yt),2),ue=r(ht,!0);a(ht),a(yt),a(_t),a(pt),a(z);var ge=s(z,2);{var fe=d=>{var o=ia();u(d,o)},pe=d=>{var o=Qt(),y=F(o);{var V=I=>{var P=oa(),R=r(P),W=r(R,!0);a(R),a(P),b(()=>n(W,t(A))),u(I,P)},ke=I=>{var P=Qt(),R=F(P);{var W=K=>{var wt=xa(),It=F(wt);{let l=E(()=>(g(D),t(e),i(()=>D(t(e))))),m=E(()=>(g(L),t(e),i(()=>L(t(e))))),c=E(()=>(g(ae),t(e),i(()=>ae(t(e).endpoint?.endpoint_type||"unknown"))));sa(It,{get title(){return t(e),i(()=>t(e).id)},get subtitle(){return`Pool for ${t(l)??""} (${t(m)??""})`},get forgeIcon(){return t(c)},onEdit:()=>v(U,!0),onDelete:()=>v(S,!0)})}var Q=s(It,2),X=r(Q),Pt=r(X),$t=s(r(Pt),2),Y=r($t),Dt=s(r(Y),2),we=r(Dt,!0);a(Dt),a(Y);var Z=s(Y,2),Mt=s(r(Z),2),Ie=r(Mt,!0);a(Mt),a(Z);var tt=s(Z,2),Et=s(r(tt),2),Tt=r(Et),Pe=r(Tt,!0);a(Tt),a(Et),a(tt);var et=s(tt,2),At=s(r(et),2),$e=r(At,!0);a(At),a(et);var at=s(et,2),Ut=s(r(at),2),rt=r(Ut),De=r(rt,!0);a(rt),a(Ut),a(at);var dt=s(at,2),St=s(r(dt),2),Bt=r(St),st=r(Bt),Me=r(st,!0);a(st);var it=s(st,2),Ee=r(it,!0);a(it),a(Bt),a(St),a(dt);var ot=s(dt,2),Nt=s(r(ot),2),Te=r(Nt,!0);a(Nt),a(ot);var Rt=s(ot,2),Ft=s(r(Rt),2),Ae=r(Ft,!0);a(Ft),a(Rt),a($t),a(Pt),a(X);var Ct=s(X,2),Lt=r(Ct),Ot=s(r(Lt),2),lt=r(Ot),Gt=s(r(lt),2),Ue=r(Gt,!0);a(Gt),a(lt);var nt=s(lt,2),Jt=s(r(nt),2),Se=r(Jt,!0);a(Jt),a(nt);var vt=s(nt,2),jt=s(r(vt),2),Be=r(jt);a(jt),a(vt);var mt=s(vt,2),qt=s(r(mt),2),Ne=r(qt,!0);a(qt),a(mt);var ct=s(mt,2),zt=s(r(ct),2),Re=r(zt,!0);a(zt),a(ct);var xt=s(ct,2),Ht=s(r(xt),2),Fe=r(Ht);a(Ht),a(xt);var Vt=s(xt,2);{var Ce=l=>{var m=la(),c=s(r(m),2),x=r(c),w=r(x,!0);a(x),a(c),a(m),b(h=>{gt(x,"href",h),n(w,(t(e),i(()=>t(e).template_name)))},[()=>(g($),t(e),i(()=>$(`/templates/${t(e).template_id}`)))]),u(l,m)};f(Vt,l=>{t(e),i(()=>t(e).template_name)&&l(Ce)})}var Wt=s(Vt,2);{var Le=l=>{var m=na(),c=s(r(m),2),x=r(c,!0);a(c),a(m),b(()=>n(x,(t(e),i(()=>t(e)["github-runner-group"])))),u(l,m)};f(Wt,l=>{t(e),i(()=>t(e)["github-runner-group"])&&l(Le)})}var Oe=s(Wt,2);{var Ge=l=>{var m=ma(),c=s(r(m),2),x=r(c);ta(x,5,()=>(t(e),i(()=>t(e).tags)),ea,(w,h)=>{var ut=va(),qe=r(ut,!0);a(ut),b(()=>n(qe,(t(h),i(()=>typeof t(h)=="string"?t(h):t(h).name)))),u(w,ut)}),a(x),a(c),a(m),u(l,m)};f(Oe,l=>{t(e),i(()=>t(e).tags&&t(e).tags.length>0)&&l(Ge)})}a(Ot),a(Lt),a(Ct),a(Q);var Kt=s(Q,2);{var Je=l=>{var m=ca(),c=r(m),x=s(r(c),2),w=r(x,!0);a(x),a(c),a(m),b(h=>n(w,h),[()=>(t(e),i(()=>ve(t(e).extra_specs)))]),u(l,m)};f(Kt,l=>{t(e),i(()=>t(e).extra_specs)&&l(Je)})}var je=s(Kt,2);{let l=E(()=>(t(e),i(()=>t(e).instances||[])));da(je,{get instances(){return t(l)},entityType:"pool",onDeleteInstance:ne})}b((l,m,c,x,w)=>{n(we,(t(e),i(()=>t(e).id))),n(Ie,(t(e),i(()=>t(e).provider_name))),n(Pe,(t(e),i(()=>t(e).image))),n($e,(t(e),i(()=>t(e).flavor))),aa(rt,1,`inline-flex px-2 py-1 text-xs font-medium rounded-full ${t(e),i(()=>t(e).enabled?"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200":"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200")??""}`),n(De,(t(e),i(()=>t(e).enabled?"Enabled":"Disabled"))),n(Me,l),gt(it,"href",m),n(Ee,c),n(Te,x),n(Ae,w),n(Ue,(t(e),i(()=>t(e).max_runners))),n(Se,(t(e),i(()=>t(e).min_idle_runners))),n(Be,`${t(e),i(()=>t(e).runner_bootstrap_timeout)??""} minutes`),n(Ne,(t(e),i(()=>t(e).priority))),n(Re,(t(e),i(()=>t(e).runner_prefix||"garm"))),n(Fe,`${t(e),i(()=>t(e).os_type)??""} / ${t(e),i(()=>t(e).os_arch)??""}`)},[()=>(g(L),t(e),i(()=>L(t(e)))),()=>(g(ee),t(e),i(()=>ee(t(e)))),()=>(g(D),t(e),i(()=>D(t(e)))),()=>(g(O),t(e),i(()=>O(t(e).created_at||""))),()=>(g(O),t(e),i(()=>O(t(e).updated_at||"")))]),u(K,wt)};f(R,K=>{t(e)&&K(W)},!0)}u(I,P)};f(y,I=>{t(A)?I(V):I(ke,!1)},!0)}u(d,o)};f(ge,d=>{t(j)?d(fe):d(pe,!1)})}a(q);var bt=s(q,2);{var _e=d=>{ra(d,{get pool(){return t(e)},$$events:{close:()=>v(U,!1),submit:o=>ie(o.detail)}})};f(bt,d=>{t(U)&&t(e)&&d(_e)})}var kt=s(bt,2);{var ye=d=>{{let o=E(()=>(t(e),g(D),i(()=>`Pool ${t(e).id} (${D(t(e))})`)));Zt(d,{title:"Delete Pool",message:"Are you sure you want to delete this pool? This action cannot be undone and will remove all associated runners.",get itemName(){return t(o)},$$events:{close:()=>v(S,!1),confirm:oe}})}};f(kt,d=>{t(S)&&t(e)&&d(ye)})}var he=s(kt,2);{var be=d=>{Zt(d,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return t(p),i(()=>t(p).name)},$$events:{close:()=>{v(B,!1),v(p,null)},confirm:le}})};f(he,d=>{t(B)&&t(p)&&d(be)})}b(d=>{gt(xe,"href",d),n(ue,(t(e),i(()=>t(e)?t(e).id:"Loading...")))},[()=>(g($),i(()=>$("/pools")))]),u(re,ft),Ye()}export{Aa as component}; diff --git a/webapp/assets/_app/immutable/nodes/15.D_6PjcIl.js b/webapp/assets/_app/immutable/nodes/15.1LkKX8Mu.js similarity index 80% rename from webapp/assets/_app/immutable/nodes/15.D_6PjcIl.js rename to webapp/assets/_app/immutable/nodes/15.1LkKX8Mu.js index 450fca19..abca1d94 100644 --- a/webapp/assets/_app/immutable/nodes/15.D_6PjcIl.js +++ b/webapp/assets/_app/immutable/nodes/15.1LkKX8Mu.js @@ -1 +1 @@ -import"../chunks/DsnmJJEf.js";import{i as Me}from"../chunks/DT0EGONV.js";import{p as Te,E as Ne,o as De,l as w,s as r,m as a,g as e,w as T,a as Se,f as S,k as l,j as c,r as u,c as D,t as Q,v as fe,y as $e,u as j,z as Re,e as ye,d as Fe,h as ze,b as Be,$ as Oe,q as Ce}from"../chunks/CRKWEg6v.js";import{a as Ae,i as V,s as Ie}from"../chunks/e1m7WRO5.js";import{r as X,b as Pe,g as oe}from"../chunks/-esynYXT.js";import{e as He,i as Je}from"../chunks/C73ZVvpW.js";import{b as ve,a as Ee}from"../chunks/B3a35v7J.js";import{p as Ve}from"../chunks/D4Caz1gY.js";import{M as Ye}from"../chunks/xe-4nY5o.js";import{e as ae}from"../chunks/BZiHL9L3.js";import{F as Ke}from"../chunks/CiGy614T.js";import{e as We,a as he}from"../chunks/Djd10kRn.js";import{U as Qe}from"../chunks/DxLDbRe7.js";import{D as Xe}from"../chunks/BXdh0O4_.js";import{P as Ze}from"../chunks/BAnDfGwP.js";import{t as J}from"../chunks/D6DjlyIQ.js";import{k as et,g as tt,c as rt,m as ot,p as at}from"../chunks/c_t0vA9G.js";import{D as st,G as nt,a as it}from"../chunks/B1coRVG4.js";import{E as lt}from"../chunks/DF8ZTWYj.js";import{E as dt}from"../chunks/B27KefbC.js";import{S as ct}from"../chunks/B0Y2gXDu.js";import"../chunks/D0m048VH.js";var ut=S('

'),pt=S('

Loading...

'),mt=S(""),gt=S(''),bt=S('

Webhook secret will be automatically generated

'),ft=S('
'),yt=S('

Create Repository

');function vt(se,ne){Te(ne,!1);const[ie,le]=Ie(),p=()=>Ae(We,"$eagerCache",ie),R=a(),k=a(),G=a(),x=a(),C=Ne();let y=a(!1),g=a(""),b=a("github"),o=a({name:"",owner:"",credentials_name:"",webhook_secret:"",pool_balancer_type:"roundrobin"}),F=a(!0),d=a(!0);async function f(){if(!p().loaded.credentials&&!p().loading.credentials)try{await he.getCredentials()}catch(i){r(g,ae(i))}}function _(i){r(b,i.detail),T(o,e(o).credentials_name="")}function P(){if(e(o).credentials_name){const i=e(R).find(A=>A.name===e(o).credentials_name);i&&i.forge_type&&r(b,i.forge_type)}}function E(){const i=new Uint8Array(32);return crypto.getRandomValues(i),Array.from(i,A=>A.toString(16).padStart(2,"0")).join("")}De(()=>{f()});async function de(){if(!e(o).name?.trim()){r(g,"Repository name is required");return}if(!e(o).owner?.trim()){r(g,"Repository owner is required");return}if(!e(o).credentials_name){r(g,"Please select credentials");return}try{r(y,!0),r(g,"");const i={...e(o),install_webhook:e(F),auto_generate_secret:e(d)};C("submit",i)}catch(i){r(g,ae(i)),r(y,!1)}}w(()=>p(),()=>{r(R,p().credentials)}),w(()=>p(),()=>{r(k,p().loading.credentials)}),w(()=>(e(R),e(b)),()=>{r(G,e(R).filter(i=>e(b)?i.forge_type===e(b):!0))}),w(()=>e(d),()=>{e(d)?T(o,e(o).webhook_secret=E()):e(d)||T(o,e(o).webhook_secret="")}),w(()=>(e(o),e(d)),()=>{r(x,e(o).name?.trim()!==""&&e(o).owner?.trim()!==""&&e(o).credentials_name!==""&&(e(d)||e(o).webhook_secret?.trim()!==""))}),Se(),Me(),Ye(se,{$$events:{close:()=>C("close")},children:(i,A)=>{var M=yt(),Z=l(c(M),2);{var ce=v=>{var h=ut(),I=c(h),W=c(I,!0);u(I),u(h),Q(()=>fe(W,e(g))),D(v,h)};V(Z,v=>{e(g)&&v(ce)})}var ue=l(Z,2);{var pe=v=>{var h=pt();D(v,h)},me=v=>{var h=ft(),I=c(h);Ke(I,{get selectedForgeType(){return e(b)},set selectedForgeType(n){r(b,n)},$$events:{select:_},$$legacy:!0});var W=l(I,2),ee=l(c(W),2);X(ee),u(W);var L=l(W,2),N=l(c(L),2);X(N),u(L);var z=l(L,2),B=l(c(z),2);Q(()=>{e(o),$e(()=>{e(G)})});var O=c(B);O.value=O.__value="";var ge=l(O);He(ge,1,()=>e(G),Je,(n,m)=>{var U=mt(),Le=c(U);u(U);var xe={};Q(()=>{fe(Le,`${e(m),j(()=>e(m).name)??""} (${e(m),j(()=>e(m).endpoint?.name)??""})`),xe!==(xe=(e(m),j(()=>e(m).name)))&&(U.value=(U.__value=(e(m),j(()=>e(m).name)))??"")}),D(n,U)}),u(B),u(z);var H=l(z,2),Y=l(c(H),2);Q(()=>{e(o),$e(()=>{})});var K=c(Y);K.value=K.__value="roundrobin";var te=l(K);te.value=te.__value="pack",u(Y),u(H);var t=l(H,2),s=c(t),re=c(s);X(re),Re(2),u(s);var $=l(s,2),q=c($),_e=c(q);X(_e),Re(2),u(q);var qe=l(q,2);{var Ue=n=>{var m=gt();X(m),ve(m,()=>e(o).webhook_secret,U=>T(o,e(o).webhook_secret=U)),D(n,m)},je=n=>{var m=bt();D(n,m)};V(qe,n=>{e(d)?n(je,!1):n(Ue)})}u($),u(t);var we=l(t,2),ke=c(we),be=l(ke,2),Ge=c(be,!0);u(be),u(we),u(h),Q(()=>{be.disabled=e(y)||e(k)||!e(x),fe(Ge,e(y)?"Creating...":"Create Repository")}),ve(ee,()=>e(o).name,n=>T(o,e(o).name=n)),ve(N,()=>e(o).owner,n=>T(o,e(o).owner=n)),Pe(B,()=>e(o).credentials_name,n=>T(o,e(o).credentials_name=n)),ye("change",B,P),Pe(Y,()=>e(o).pool_balancer_type,n=>T(o,e(o).pool_balancer_type=n)),Ee(re,()=>e(F),n=>r(F,n)),Ee(_e,()=>e(d),n=>r(d,n)),ye("click",ke,()=>C("close")),ye("submit",h,Ve(de)),D(v,h)};V(ue,v=>{e(y)?v(pe):v(me,!1)})}u(M),D(i,M)},$$slots:{default:!0}}),Fe(),le()}var ht=S('
',1);function Nt(se,ne){Te(ne,!1);const[ie,le]=Ie(),p=()=>Ae(We,"$eagerCache",ie),R=a(),k=a(),G=a();let x=a([]),C=a(!0),y=a(""),g=a(""),b=a(!1),o=a(!1),F=a(!1),d=a(null),f=a(null),_=a(1),P=a(25),E=a(1);De(async()=>{try{r(C,!0);const t=await he.getRepositories();t&&Array.isArray(t)&&r(x,t)}catch(t){console.error("Failed to load repositories:",t),r(y,t instanceof Error?t.message:"Failed to load repositories")}finally{r(C,!1)}});async function de(){try{await he.retryResource("repositories")}catch(t){console.error("Retry failed:",t)}}function i(t){r(d,t),r(o,!0)}function A(t){r(f,t),r(F,!0)}function M(){r(b,!1),r(o,!1),r(F,!1),r(d,null),r(f,null),r(y,"")}async function Z(t){try{r(y,"");const s=t.detail,re={name:s.name,owner:s.owner,credentials_name:s.credentials_name,webhook_secret:s.webhook_secret},$=await oe.createRepository(re);if(s.install_webhook&&$.id)try{await oe.installRepoWebhook($.id),J.success("Webhook Installed",`Webhook for repository ${$.owner}/${$.name} has been installed successfully.`)}catch(q){console.warn("Repository created but webhook installation failed:",q),J.error("Webhook Installation Failed",q instanceof Error?q.message:"Failed to install webhook. You can try installing it manually from the repository details page.")}r(b,!1),J.success("Repository Created",`Repository ${$.owner}/${$.name} has been created successfully.`)}catch(s){throw r(y,ae(s)),s}}async function ce(t){if(e(d))try{await oe.updateRepository(e(d).id,t),J.success("Repository Updated",`Repository ${e(d).owner}/${e(d).name} has been updated successfully.`),M()}catch(s){throw s}}async function ue(){if(e(f))try{r(y,""),await oe.deleteRepository(e(f).id),J.success("Repository Deleted",`Repository ${e(f).owner}/${e(f).name} has been deleted successfully.`)}catch(t){const s=ae(t);J.error("Delete Failed",s)}finally{M()}}const pe=[{key:"repository",title:"Repository",cellComponent:lt,cellProps:{entityType:"repository",showOwner:!0}},{key:"endpoint",title:"Endpoint",cellComponent:dt},{key:"credentials",title:"Credentials",cellComponent:nt,cellProps:{field:"credentials_name"}},{key:"status",title:"Status",cellComponent:ct,cellProps:{statusType:"entity"}},{key:"actions",title:"Actions",align:"right",cellComponent:it}],me={entityType:"repository",primaryText:{field:"name",isClickable:!0,href:"/repositories/{id}",showOwner:!0},customInfo:[{icon:t=>tt(t?.endpoint?.endpoint_type||"unknown"),text:t=>t?.endpoint?.name||"Unknown"}],badges:[{type:"custom",value:t=>et(t)}],actions:[{type:"edit",handler:t=>i(t)},{type:"delete",handler:t=>A(t)}]};function v(t){r(g,t.detail.term),r(_,1)}function h(t){r(_,t.detail.page)}function I(t){const s=rt(t.detail.perPage);r(P,s.newPerPage),r(_,s.newCurrentPage)}function W(t){i(t.detail.item)}function ee(t){A(t.detail.item)}w(()=>(e(x),p()),()=>{(!e(x).length||p().loaded.repositories)&&r(x,p().repositories)}),w(()=>p(),()=>{r(C,p().loading.repositories)}),w(()=>p(),()=>{r(R,p().errorMessages.repositories)}),w(()=>(e(x),e(g)),()=>{r(k,ot(e(x),e(g)))}),w(()=>(e(E),e(k),e(P),e(_)),()=>{r(E,Math.ceil(e(k).length/e(P))),e(_)>e(E)&&e(E)>0&&r(_,e(E))}),w(()=>(e(k),e(_),e(P)),()=>{r(G,at(e(k),e(_),e(P)))}),Se(),Me();var L=ht();ze(t=>{Oe.title="Repositories - GARM"});var N=Be(L),z=c(N);Ze(z,{title:"Repositories",description:"Manage your GitHub repositories and their runners",actionLabel:"Add Repository",$$events:{action:()=>{r(b,!0)}}});var B=l(z,2);{let t=Ce(()=>e(R)||e(y)),s=Ce(()=>!!e(R));st(B,{get columns(){return pe},get data(){return e(G)},get loading(){return e(C)},get error(){return e(t)},get searchTerm(){return e(g)},searchPlaceholder:"Search repositories by name or owner...",get currentPage(){return e(_)},get perPage(){return e(P)},get totalPages(){return e(E)},get totalItems(){return e(k),j(()=>e(k).length)},itemName:"repositories",emptyIconType:"building",get showRetry(){return e(s)},get mobileCardConfig(){return me},$$events:{search:v,pageChange:h,perPageChange:I,retry:de,edit:W,delete:ee}})}u(N);var O=l(N,2);{var ge=t=>{vt(t,{$$events:{close:()=>r(b,!1),submit:Z}})};V(O,t=>{e(b)&&t(ge)})}var H=l(O,2);{var Y=t=>{Qe(t,{get entity(){return e(d)},entityType:"repository",$$events:{close:M,submit:s=>ce(s.detail)}})};V(H,t=>{e(o)&&e(d)&&t(Y)})}var K=l(H,2);{var te=t=>{Xe(t,{title:"Delete Repository",message:"Are you sure you want to delete this repository? This action cannot be undone and will remove all associated pools and runners.",get itemName(){return`${e(f),j(()=>e(f).owner)??""}/${e(f),j(()=>e(f).name)??""}`},$$events:{close:M,confirm:ue}})};V(K,t=>{e(F)&&e(f)&&t(te)})}D(se,L),Fe(),le()}export{Nt as component}; +import"../chunks/DsnmJJEf.js";import{i as Me}from"../chunks/C7KraPli.js";import{p as Te,E as Ne,o as De,l as w,k as r,m as a,g as e,w as T,h as Se,f as S,s as l,d as c,r as u,b as D,t as Q,e as fe,y as $e,u as j,z as Re,i as ye,c as Ae,j as ze,a as Be,$ as Oe,v as Ce}from"../chunks/cPTQ2Ibn.js";import{a as Fe,i as V,s as Ie}from"../chunks/DqFqoVWr.js";import{r as X,b as Pe,g as oe}from"../chunks/DqbUkQgD.js";import{e as He,i as Je}from"../chunks/CiWDXYQd.js";import{b as ve,a as Ee}from"../chunks/B-_QCM7E.js";import{p as Ve}from"../chunks/D4Caz1gY.js";import{M as Ye}from"../chunks/Bo3f8OIz.js";import{e as ae}from"../chunks/BZiHL9L3.js";import{F as Ke}from"../chunks/Cqnw7O8j.js";import{e as We,a as he}from"../chunks/JUkrBp3F.js";import{U as Qe}from"../chunks/B1V2wE0x.js";import{D as Xe}from"../chunks/91PQ6UtW.js";import{P as Ze}from"../chunks/U3V4g_hv.js";import{t as J}from"../chunks/Bgbd8SZ5.js";import{k as et,g as tt,c as rt,m as ot,p as at}from"../chunks/DJsB5Z5V.js";import{D as st,G as nt,A as it}from"../chunks/Du50aAe5.js";import{E as lt}from"../chunks/CPFytHjx.js";import{E as dt}from"../chunks/CYqkNFLz.js";import{S as ct}from"../chunks/BZ2WxPPD.js";import"../chunks/D7e9zx6w.js";var ut=S('

'),pt=S('

Loading...

'),mt=S(""),gt=S(''),bt=S('

Webhook secret will be automatically generated

'),ft=S('
'),yt=S('

Create Repository

');function vt(se,ne){Te(ne,!1);const[ie,le]=Ie(),p=()=>Fe(We,"$eagerCache",ie),R=a(),k=a(),G=a(),x=a(),C=Ne();let y=a(!1),g=a(""),b=a("github"),o=a({name:"",owner:"",credentials_name:"",webhook_secret:"",pool_balancer_type:"roundrobin"}),A=a(!0),d=a(!0);async function f(){if(!p().loaded.credentials&&!p().loading.credentials)try{await he.getCredentials()}catch(i){r(g,ae(i))}}function _(i){r(b,i.detail),T(o,e(o).credentials_name="")}function P(){if(e(o).credentials_name){const i=e(R).find(F=>F.name===e(o).credentials_name);i&&i.forge_type&&r(b,i.forge_type)}}function E(){const i=new Uint8Array(32);return crypto.getRandomValues(i),Array.from(i,F=>F.toString(16).padStart(2,"0")).join("")}De(()=>{f()});async function de(){if(!e(o).name?.trim()){r(g,"Repository name is required");return}if(!e(o).owner?.trim()){r(g,"Repository owner is required");return}if(!e(o).credentials_name){r(g,"Please select credentials");return}try{r(y,!0),r(g,"");const i={...e(o),install_webhook:e(A),auto_generate_secret:e(d)};C("submit",i)}catch(i){r(g,ae(i)),r(y,!1)}}w(()=>p(),()=>{r(R,p().credentials)}),w(()=>p(),()=>{r(k,p().loading.credentials)}),w(()=>(e(R),e(b)),()=>{r(G,e(R).filter(i=>e(b)?i.forge_type===e(b):!0))}),w(()=>e(d),()=>{e(d)?T(o,e(o).webhook_secret=E()):e(d)||T(o,e(o).webhook_secret="")}),w(()=>(e(o),e(d)),()=>{r(x,e(o).name?.trim()!==""&&e(o).owner?.trim()!==""&&e(o).credentials_name!==""&&(e(d)||e(o).webhook_secret?.trim()!==""))}),Se(),Me(),Ye(se,{$$events:{close:()=>C("close")},children:(i,F)=>{var M=yt(),Z=l(c(M),2);{var ce=v=>{var h=ut(),I=c(h),W=c(I,!0);u(I),u(h),Q(()=>fe(W,e(g))),D(v,h)};V(Z,v=>{e(g)&&v(ce)})}var ue=l(Z,2);{var pe=v=>{var h=pt();D(v,h)},me=v=>{var h=ft(),I=c(h);Ke(I,{get selectedForgeType(){return e(b)},set selectedForgeType(n){r(b,n)},$$events:{select:_},$$legacy:!0});var W=l(I,2),ee=l(c(W),2);X(ee),u(W);var L=l(W,2),N=l(c(L),2);X(N),u(L);var z=l(L,2),B=l(c(z),2);Q(()=>{e(o),$e(()=>{e(G)})});var O=c(B);O.value=O.__value="";var ge=l(O);He(ge,1,()=>e(G),Je,(n,m)=>{var q=mt(),Le=c(q);u(q);var xe={};Q(()=>{fe(Le,`${e(m),j(()=>e(m).name)??""} (${e(m),j(()=>e(m).endpoint?.name)??""})`),xe!==(xe=(e(m),j(()=>e(m).name)))&&(q.value=(q.__value=(e(m),j(()=>e(m).name)))??"")}),D(n,q)}),u(B),u(z);var H=l(z,2),Y=l(c(H),2);Q(()=>{e(o),$e(()=>{})});var K=c(Y);K.value=K.__value="roundrobin";var te=l(K);te.value=te.__value="pack",u(Y),u(H);var t=l(H,2),s=c(t),re=c(s);X(re),Re(2),u(s);var $=l(s,2),U=c($),_e=c(U);X(_e),Re(2),u(U);var Ue=l(U,2);{var qe=n=>{var m=gt();X(m),ve(m,()=>e(o).webhook_secret,q=>T(o,e(o).webhook_secret=q)),D(n,m)},je=n=>{var m=bt();D(n,m)};V(Ue,n=>{e(d)?n(je,!1):n(qe)})}u($),u(t);var we=l(t,2),ke=c(we),be=l(ke,2),Ge=c(be,!0);u(be),u(we),u(h),Q(()=>{be.disabled=e(y)||e(k)||!e(x),fe(Ge,e(y)?"Creating...":"Create Repository")}),ve(ee,()=>e(o).name,n=>T(o,e(o).name=n)),ve(N,()=>e(o).owner,n=>T(o,e(o).owner=n)),Pe(B,()=>e(o).credentials_name,n=>T(o,e(o).credentials_name=n)),ye("change",B,P),Pe(Y,()=>e(o).pool_balancer_type,n=>T(o,e(o).pool_balancer_type=n)),Ee(re,()=>e(A),n=>r(A,n)),Ee(_e,()=>e(d),n=>r(d,n)),ye("click",ke,()=>C("close")),ye("submit",h,Ve(de)),D(v,h)};V(ue,v=>{e(y)?v(pe):v(me,!1)})}u(M),D(i,M)},$$slots:{default:!0}}),Ae(),le()}var ht=S('
',1);function Nt(se,ne){Te(ne,!1);const[ie,le]=Ie(),p=()=>Fe(We,"$eagerCache",ie),R=a(),k=a(),G=a();let x=a([]),C=a(!0),y=a(""),g=a(""),b=a(!1),o=a(!1),A=a(!1),d=a(null),f=a(null),_=a(1),P=a(25),E=a(1);De(async()=>{try{r(C,!0);const t=await he.getRepositories();t&&Array.isArray(t)&&r(x,t)}catch(t){console.error("Failed to load repositories:",t),r(y,t instanceof Error?t.message:"Failed to load repositories")}finally{r(C,!1)}});async function de(){try{await he.retryResource("repositories")}catch(t){console.error("Retry failed:",t)}}function i(t){r(d,t),r(o,!0)}function F(t){r(f,t),r(A,!0)}function M(){r(b,!1),r(o,!1),r(A,!1),r(d,null),r(f,null),r(y,"")}async function Z(t){try{r(y,"");const s=t.detail,re={name:s.name,owner:s.owner,credentials_name:s.credentials_name,webhook_secret:s.webhook_secret},$=await oe.createRepository(re);if(s.install_webhook&&$.id)try{await oe.installRepoWebhook($.id),J.success("Webhook Installed",`Webhook for repository ${$.owner}/${$.name} has been installed successfully.`)}catch(U){console.warn("Repository created but webhook installation failed:",U),J.error("Webhook Installation Failed",U instanceof Error?U.message:"Failed to install webhook. You can try installing it manually from the repository details page.")}r(b,!1),J.success("Repository Created",`Repository ${$.owner}/${$.name} has been created successfully.`)}catch(s){throw r(y,ae(s)),s}}async function ce(t){if(e(d))try{await oe.updateRepository(e(d).id,t),J.success("Repository Updated",`Repository ${e(d).owner}/${e(d).name} has been updated successfully.`),M()}catch(s){throw s}}async function ue(){if(e(f))try{r(y,""),await oe.deleteRepository(e(f).id),J.success("Repository Deleted",`Repository ${e(f).owner}/${e(f).name} has been deleted successfully.`)}catch(t){const s=ae(t);J.error("Delete Failed",s)}finally{M()}}const pe=[{key:"repository",title:"Repository",cellComponent:lt,cellProps:{entityType:"repository",showOwner:!0}},{key:"endpoint",title:"Endpoint",cellComponent:dt},{key:"credentials",title:"Credentials",cellComponent:nt,cellProps:{field:"credentials_name"}},{key:"status",title:"Status",cellComponent:ct,cellProps:{statusType:"entity"}},{key:"actions",title:"Actions",align:"right",cellComponent:it}],me={entityType:"repository",primaryText:{field:"name",isClickable:!0,href:"/repositories/{id}",showOwner:!0},customInfo:[{icon:t=>tt(t?.endpoint?.endpoint_type||"unknown"),text:t=>t?.endpoint?.name||"Unknown"}],badges:[{type:"custom",value:t=>et(t)}],actions:[{type:"edit",handler:t=>i(t)},{type:"delete",handler:t=>F(t)}]};function v(t){r(g,t.detail.term),r(_,1)}function h(t){r(_,t.detail.page)}function I(t){const s=rt(t.detail.perPage);r(P,s.newPerPage),r(_,s.newCurrentPage)}function W(t){i(t.detail.item)}function ee(t){F(t.detail.item)}w(()=>(e(x),p()),()=>{(!e(x).length||p().loaded.repositories)&&r(x,p().repositories)}),w(()=>p(),()=>{r(C,p().loading.repositories)}),w(()=>p(),()=>{r(R,p().errorMessages.repositories)}),w(()=>(e(x),e(g)),()=>{r(k,ot(e(x),e(g)))}),w(()=>(e(E),e(k),e(P),e(_)),()=>{r(E,Math.ceil(e(k).length/e(P))),e(_)>e(E)&&e(E)>0&&r(_,e(E))}),w(()=>(e(k),e(_),e(P)),()=>{r(G,at(e(k),e(_),e(P)))}),Se(),Me();var L=ht();ze(t=>{Oe.title="Repositories - GARM"});var N=Be(L),z=c(N);Ze(z,{title:"Repositories",description:"Manage your GitHub repositories and their runners",actionLabel:"Add Repository",$$events:{action:()=>{r(b,!0)}}});var B=l(z,2);{let t=Ce(()=>e(R)||e(y)),s=Ce(()=>!!e(R));st(B,{get columns(){return pe},get data(){return e(G)},get loading(){return e(C)},get error(){return e(t)},get searchTerm(){return e(g)},searchPlaceholder:"Search repositories by name or owner...",get currentPage(){return e(_)},get perPage(){return e(P)},get totalPages(){return e(E)},get totalItems(){return e(k),j(()=>e(k).length)},itemName:"repositories",emptyIconType:"building",get showRetry(){return e(s)},get mobileCardConfig(){return me},$$events:{search:v,pageChange:h,perPageChange:I,retry:de,edit:W,delete:ee}})}u(N);var O=l(N,2);{var ge=t=>{vt(t,{$$events:{close:()=>r(b,!1),submit:Z}})};V(O,t=>{e(b)&&t(ge)})}var H=l(O,2);{var Y=t=>{Qe(t,{get entity(){return e(d)},entityType:"repository",$$events:{close:M,submit:s=>ce(s.detail)}})};V(H,t=>{e(o)&&e(d)&&t(Y)})}var K=l(H,2);{var te=t=>{Xe(t,{title:"Delete Repository",message:"Are you sure you want to delete this repository? This action cannot be undone and will remove all associated pools and runners.",get itemName(){return`${e(f),j(()=>e(f).owner)??""}/${e(f),j(()=>e(f).name)??""}`},$$events:{close:M,confirm:ue}})};V(K,t=>{e(A)&&e(f)&&t(te)})}D(se,L),Ae(),le()}export{Nt as component}; diff --git a/webapp/assets/_app/immutable/nodes/16.Ik_X802Y.js b/webapp/assets/_app/immutable/nodes/16.Ik_X802Y.js deleted file mode 100644 index 6f384fce..00000000 --- a/webapp/assets/_app/immutable/nodes/16.Ik_X802Y.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as ze}from"../chunks/DT0EGONV.js";import{p as He,o as je,A as Ge,l as Oe,a as Ve,f as B,h as Je,b as C,t as j,c as w,d as Ke,u as n,n as de,v as ce,g as e,m as l,j as u,k as d,s as r,$ as Qe,r as f,w as Xe,B as pe,q as m}from"../chunks/CRKWEg6v.js";import{i as g,s as Ye,a as Ze}from"../chunks/e1m7WRO5.js";import{d as A,c as et,g as h}from"../chunks/-esynYXT.js";import{p as tt}from"../chunks/B0m3rqSR.js";import{g as ue}from"../chunks/Dkb9lSSG.js";import{U as ot}from"../chunks/DxLDbRe7.js";import{D as fe}from"../chunks/BXdh0O4_.js";import{E as at,P as rt,a as st}from"../chunks/Bc0BXFmi.js";import{D as nt,I as it}from"../chunks/CrNwrvNH.js";import{g as me}from"../chunks/c_t0vA9G.js";import{e as S}from"../chunks/BZiHL9L3.js";import{W as lt}from"../chunks/0HF0aP0D.js";import{C as dt}from"../chunks/BQabvZPm.js";import{w as G}from"../chunks/C73ZVvpW.js";import{t as x}from"../chunks/D6DjlyIQ.js";var ct=B('

Loading repository...

'),pt=B('

'),ut=B(" ",1),ft=B(' ',1);function kt(ye,ve){He(ve,!1);const[ge,he]=Ye(),O=()=>Ze(tt,"$page",ge),I=l();let t=l(null),c=l([]),y=l([]),F=l(!0),E=l(""),D=l(!1),P=l(!1),R=l(!1),T=l(!1),p=l(null),M=null,_=l();async function V(){if(e(I))try{r(F,!0),r(E,"");const[o,a,s]=await Promise.all([h.getRepository(e(I)),h.listRepositoryPools(e(I)).catch(()=>[]),h.listRepositoryInstances(e(I)).catch(()=>[])]);r(t,o),r(c,a),r(y,s)}catch(o){r(E,S(o))}finally{r(F,!1)}}function _e(o,a){const{events:s}=o;return{...a,events:s}}async function $e(o){if(e(t))try{await h.updateRepository(e(t).id,o),await V(),x.success("Repository Updated",`Repository ${e(t).owner}/${e(t).name} has been updated successfully.`),r(D,!1)}catch(a){throw a}}async function be(){if(e(t)){try{await h.deleteRepository(e(t).id),ue(A("/repositories"))}catch(o){const a=S(o);x.error("Delete Failed",a)}r(P,!1)}}async function we(){if(e(p))try{await h.deleteInstance(e(p).name),x.success("Instance Deleted",`Instance ${e(p).name} has been deleted successfully.`),r(R,!1),r(p,null)}catch(o){const a=S(o);x.error("Delete Failed",a),r(R,!1),r(p,null)}}function xe(o){r(p,o),r(R,!0)}function Ie(){r(T,!0)}async function Re(o){try{if(!e(t))return;await h.createRepositoryPool(e(t).id,o.detail),x.success("Pool Created",`Pool has been created successfully for repository ${e(t).owner}/${e(t).name}.`),r(T,!1)}catch(a){const s=S(a);x.error("Pool Creation Failed",s)}}function J(){e(_)&&Xe(_,e(_).scrollTop=e(_).scrollHeight)}function Ee(o){if(o.operation==="update"){const a=o.payload;if(e(t)&&a.id===e(t).id){const s=e(t).events?.length||0,i=a.events?.length||0;r(t,_e(e(t),a)),i>s&&setTimeout(()=>{J()},100)}}else if(o.operation==="delete"){const a=o.payload.id||o.payload;e(t)&&e(t).id===a&&ue(A("/repositories"))}}function De(o){if(!e(t))return;const a=o.payload;if(a.repo_id===e(t).id){if(o.operation==="create")r(c,[...e(c),a]);else if(o.operation==="update")r(c,e(c).map(s=>s.id===a.id?a:s));else if(o.operation==="delete"){const s=a.id||a;r(c,e(c).filter(i=>i.id!==s))}}}function Pe(o){if(!e(t)||!e(c))return;const a=o.payload;if(e(c).some(i=>i.id===a.pool_id)){if(o.operation==="create")r(y,[...e(y),a]);else if(o.operation==="update")r(y,e(y).map(i=>i.id===a.id?a:i));else if(o.operation==="delete"){const i=a.id||a;r(y,e(y).filter(W=>W.id!==i))}}}je(()=>{V().then(()=>{e(t)?.events?.length&&setTimeout(()=>{J()},100)});const o=G.subscribeToEntity("repository",["update","delete"],Ee),a=G.subscribeToEntity("pool",["create","update","delete"],De),s=G.subscribeToEntity("instance",["create","update","delete"],Pe);M=()=>{o(),a(),s()}}),Ge(()=>{M&&(M(),M=null)}),Oe(()=>O(),()=>{r(I,O().params.id)}),Ve(),ze();var K=ft();Je(o=>{j(()=>Qe.title=`${e(t),n(()=>e(t)?`${e(t).name} - Repository Details`:"Repository Details")??""} - GARM`)});var U=C(K),L=u(U),Q=u(L),N=u(Q),Te=u(N);f(N);var X=d(N,2),Y=u(X),Z=d(u(Y),2),Me=u(Z,!0);f(Z),f(Y),f(X),f(Q),f(L);var ke=d(L,2);{var Ce=o=>{var a=ct();w(o,a)},Ae=o=>{var a=pe(),s=C(a);{var i=$=>{var b=pt(),k=u(b),q=u(k,!0);f(k),f(b),j(()=>ce(q,e(E))),w($,b)},W=$=>{var b=pe(),k=C(b);{var q=z=>{var ae=ut(),re=C(ae);{let v=m(()=>(e(t),n(()=>e(t).name||"Repository"))),H=m(()=>(e(t),n(()=>e(t).owner))),We=m(()=>(e(t),n(()=>e(t).endpoint?.name))),qe=m(()=>(de(me),e(t),n(()=>me(e(t).endpoint?.endpoint_type||"unknown"))));nt(re,{get title(){return e(v)},get subtitle(){return`Owner: ${e(H)??""} • Endpoint: ${e(We)??""}`},get forgeIcon(){return e(qe)},onEdit:()=>r(D,!0),onDelete:()=>r(P,!0)})}var se=d(re,2);at(se,{get entity(){return e(t)},entityType:"repository"});var ne=d(se,2);{let v=m(()=>(e(t),n(()=>e(t).id||"")));lt(ne,{entityType:"repository",get entityId(){return e(v)},get entityName(){return`${e(t),n(()=>e(t).owner)??""}/${e(t),n(()=>e(t).name)??""}`}})}var ie=d(ne,2);{let v=m(()=>(e(t),n(()=>e(t).id||"")));rt(ie,{get pools(){return e(c)},entityType:"repository",get entityId(){return e(v)},get entityName(){return`${e(t),n(()=>e(t).owner)??""}/${e(t),n(()=>e(t).name)??""}`},$$events:{addPool:Ie}})}var le=d(ie,2);it(le,{get instances(){return e(y)},entityType:"repository",onDeleteInstance:xe});var Ne=d(le,2);{let v=m(()=>(e(t),n(()=>e(t)?.events)));st(Ne,{get events(){return e(v)},get eventsContainer(){return e(_)},set eventsContainer(H){r(_,H)},$$legacy:!0})}w(z,ae)};g(k,z=>{e(t)&&z(q)},!0)}w($,b)};g(s,$=>{e(E)?$(i):$(W,!1)},!0)}w(o,a)};g(ke,o=>{e(F)?o(Ce):o(Ae,!1)})}f(U);var ee=d(U,2);{var Se=o=>{ot(o,{get entity(){return e(t)},entityType:"repository",$$events:{close:()=>r(D,!1),submit:a=>$e(a.detail)}})};g(ee,o=>{e(D)&&e(t)&&o(Se)})}var te=d(ee,2);{var Be=o=>{{let a=m(()=>(e(t),n(()=>`${e(t).owner}/${e(t).name}`)));fe(o,{title:"Delete Repository",message:"Are you sure you want to delete this repository? This action cannot be undone and will remove all associated pools and instances.",get itemName(){return e(a)},$$events:{close:()=>r(P,!1),confirm:be}})}};g(te,o=>{e(P)&&e(t)&&o(Be)})}var oe=d(te,2);{var Fe=o=>{fe(o,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(p),n(()=>e(p).name)},$$events:{close:()=>{r(R,!1),r(p,null)},confirm:we}})};g(oe,o=>{e(R)&&e(p)&&o(Fe)})}var Ue=d(oe,2);{var Le=o=>{{let a=m(()=>(e(t),n(()=>e(t).id||"")));dt(o,{initialEntityType:"repository",get initialEntityId(){return e(a)},$$events:{close:()=>r(T,!1),submit:Re}})}};g(Ue,o=>{e(T)&&e(t)&&o(Le)})}j(o=>{et(Te,"href",o),ce(Me,(e(t),n(()=>e(t)?e(t).name:"Loading...")))},[()=>(de(A),n(()=>A("/repositories")))]),w(ye,K),Ke(),he()}export{kt as component}; diff --git a/webapp/assets/_app/immutable/nodes/16.Un1eDEkg.js b/webapp/assets/_app/immutable/nodes/16.Un1eDEkg.js new file mode 100644 index 00000000..34da63c3 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/16.Un1eDEkg.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as ze}from"../chunks/C7KraPli.js";import{p as He,o as je,A as Ge,l as Oe,h as Ve,f as B,j as Je,a as C,t as j,b as w,c as Ke,u as n,q as de,e as ce,g as e,m as l,d as u,s as d,k as r,$ as Qe,r as f,w as Xe,B as pe,v as m}from"../chunks/cPTQ2Ibn.js";import{i as g,s as Ye,a as Ze}from"../chunks/DqFqoVWr.js";import{d as A,c as et,g as h}from"../chunks/DqbUkQgD.js";import{p as tt}from"../chunks/DVsSf1wv.js";import{g as ue}from"../chunks/CTvJf3dP.js";import{U as ot}from"../chunks/B1V2wE0x.js";import{D as fe}from"../chunks/91PQ6UtW.js";import{E as at,P as rt,a as st}from"../chunks/WI-og7-I.js";import{D as nt}from"../chunks/oOdVuDuv.js";import{g as me}from"../chunks/DJsB5Z5V.js";import{e as S}from"../chunks/BZiHL9L3.js";import{I as it}from"../chunks/DliFOxtc.js";import{W as lt}from"../chunks/C7KJ549w.js";import{C as dt}from"../chunks/DPR9Z_fe.js";import{w as G}from"../chunks/BV_mDmfH.js";import{t as x}from"../chunks/Bgbd8SZ5.js";var ct=B('

Loading repository...

'),pt=B('

'),ut=B(" ",1),ft=B(' ',1);function Ct(ye,ve){He(ve,!1);const[ge,he]=Ye(),O=()=>Ze(tt,"$page",ge),I=l();let t=l(null),c=l([]),y=l([]),F=l(!0),E=l(""),D=l(!1),P=l(!1),R=l(!1),T=l(!1),p=l(null),M=null,_=l();async function V(){if(e(I))try{r(F,!0),r(E,"");const[o,a,s]=await Promise.all([h.getRepository(e(I)),h.listRepositoryPools(e(I)).catch(()=>[]),h.listRepositoryInstances(e(I)).catch(()=>[])]);r(t,o),r(c,a),r(y,s)}catch(o){r(E,S(o))}finally{r(F,!1)}}function _e(o,a){const{events:s}=o;return{...a,events:s}}async function $e(o){if(e(t))try{await h.updateRepository(e(t).id,o),await V(),x.success("Repository Updated",`Repository ${e(t).owner}/${e(t).name} has been updated successfully.`),r(D,!1)}catch(a){throw a}}async function be(){if(e(t)){try{await h.deleteRepository(e(t).id),ue(A("/repositories"))}catch(o){const a=S(o);x.error("Delete Failed",a)}r(P,!1)}}async function we(){if(e(p))try{await h.deleteInstance(e(p).name),x.success("Instance Deleted",`Instance ${e(p).name} has been deleted successfully.`),r(R,!1),r(p,null)}catch(o){const a=S(o);x.error("Delete Failed",a),r(R,!1),r(p,null)}}function xe(o){r(p,o),r(R,!0)}function Ie(){r(T,!0)}async function Re(o){try{if(!e(t))return;await h.createRepositoryPool(e(t).id,o.detail),x.success("Pool Created",`Pool has been created successfully for repository ${e(t).owner}/${e(t).name}.`),r(T,!1)}catch(a){const s=S(a);x.error("Pool Creation Failed",s)}}function J(){e(_)&&Xe(_,e(_).scrollTop=e(_).scrollHeight)}function Ee(o){if(o.operation==="update"){const a=o.payload;if(e(t)&&a.id===e(t).id){const s=e(t).events?.length||0,i=a.events?.length||0;r(t,_e(e(t),a)),i>s&&setTimeout(()=>{J()},100)}}else if(o.operation==="delete"){const a=o.payload.id||o.payload;e(t)&&e(t).id===a&&ue(A("/repositories"))}}function De(o){if(!e(t))return;const a=o.payload;if(a.repo_id===e(t).id){if(o.operation==="create")r(c,[...e(c),a]);else if(o.operation==="update")r(c,e(c).map(s=>s.id===a.id?a:s));else if(o.operation==="delete"){const s=a.id||a;r(c,e(c).filter(i=>i.id!==s))}}}function Pe(o){if(!e(t)||!e(c))return;const a=o.payload;if(e(c).some(i=>i.id===a.pool_id)){if(o.operation==="create")r(y,[...e(y),a]);else if(o.operation==="update")r(y,e(y).map(i=>i.id===a.id?a:i));else if(o.operation==="delete"){const i=a.id||a;r(y,e(y).filter(W=>W.id!==i))}}}je(()=>{V().then(()=>{e(t)?.events?.length&&setTimeout(()=>{J()},100)});const o=G.subscribeToEntity("repository",["update","delete"],Ee),a=G.subscribeToEntity("pool",["create","update","delete"],De),s=G.subscribeToEntity("instance",["create","update","delete"],Pe);M=()=>{o(),a(),s()}}),Ge(()=>{M&&(M(),M=null)}),Oe(()=>O(),()=>{r(I,O().params.id)}),Ve(),ze();var K=ft();Je(o=>{j(()=>Qe.title=`${e(t),n(()=>e(t)?`${e(t).name} - Repository Details`:"Repository Details")??""} - GARM`)});var U=C(K),L=u(U),Q=u(L),N=u(Q),Te=u(N);f(N);var X=d(N,2),Y=u(X),Z=d(u(Y),2),Me=u(Z,!0);f(Z),f(Y),f(X),f(Q),f(L);var ke=d(L,2);{var Ce=o=>{var a=ct();w(o,a)},Ae=o=>{var a=pe(),s=C(a);{var i=$=>{var b=pt(),k=u(b),q=u(k,!0);f(k),f(b),j(()=>ce(q,e(E))),w($,b)},W=$=>{var b=pe(),k=C(b);{var q=z=>{var ae=ut(),re=C(ae);{let v=m(()=>(e(t),n(()=>e(t).name||"Repository"))),H=m(()=>(e(t),n(()=>e(t).owner))),We=m(()=>(e(t),n(()=>e(t).endpoint?.name))),qe=m(()=>(de(me),e(t),n(()=>me(e(t).endpoint?.endpoint_type||"unknown"))));nt(re,{get title(){return e(v)},get subtitle(){return`Owner: ${e(H)??""} • Endpoint: ${e(We)??""}`},get forgeIcon(){return e(qe)},onEdit:()=>r(D,!0),onDelete:()=>r(P,!0)})}var se=d(re,2);at(se,{get entity(){return e(t)},entityType:"repository"});var ne=d(se,2);{let v=m(()=>(e(t),n(()=>e(t).id||"")));lt(ne,{entityType:"repository",get entityId(){return e(v)},get entityName(){return`${e(t),n(()=>e(t).owner)??""}/${e(t),n(()=>e(t).name)??""}`}})}var ie=d(ne,2);{let v=m(()=>(e(t),n(()=>e(t).id||"")));rt(ie,{get pools(){return e(c)},entityType:"repository",get entityId(){return e(v)},get entityName(){return`${e(t),n(()=>e(t).owner)??""}/${e(t),n(()=>e(t).name)??""}`},$$events:{addPool:Ie}})}var le=d(ie,2);it(le,{get instances(){return e(y)},entityType:"repository",onDeleteInstance:xe});var Ne=d(le,2);{let v=m(()=>(e(t),n(()=>e(t)?.events)));st(Ne,{get events(){return e(v)},get eventsContainer(){return e(_)},set eventsContainer(H){r(_,H)},$$legacy:!0})}w(z,ae)};g(k,z=>{e(t)&&z(q)},!0)}w($,b)};g(s,$=>{e(E)?$(i):$(W,!1)},!0)}w(o,a)};g(ke,o=>{e(F)?o(Ce):o(Ae,!1)})}f(U);var ee=d(U,2);{var Se=o=>{ot(o,{get entity(){return e(t)},entityType:"repository",$$events:{close:()=>r(D,!1),submit:a=>$e(a.detail)}})};g(ee,o=>{e(D)&&e(t)&&o(Se)})}var te=d(ee,2);{var Be=o=>{{let a=m(()=>(e(t),n(()=>`${e(t).owner}/${e(t).name}`)));fe(o,{title:"Delete Repository",message:"Are you sure you want to delete this repository? This action cannot be undone and will remove all associated pools and instances.",get itemName(){return e(a)},$$events:{close:()=>r(P,!1),confirm:be}})}};g(te,o=>{e(P)&&e(t)&&o(Be)})}var oe=d(te,2);{var Fe=o=>{fe(o,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(p),n(()=>e(p).name)},$$events:{close:()=>{r(R,!1),r(p,null)},confirm:we}})};g(oe,o=>{e(R)&&e(p)&&o(Fe)})}var Ue=d(oe,2);{var Le=o=>{{let a=m(()=>(e(t),n(()=>e(t).id||"")));dt(o,{initialEntityType:"repository",get initialEntityId(){return e(a)},$$events:{close:()=>r(T,!1),submit:Re}})}};g(Ue,o=>{e(T)&&e(t)&&o(Le)})}j(o=>{et(Te,"href",o),ce(Me,(e(t),n(()=>e(t)?e(t).name:"Loading...")))},[()=>(de(A),n(()=>A("/repositories")))]),w(ye,K),Ke(),he()}export{Ct as component}; diff --git a/webapp/assets/_app/immutable/nodes/17.BTCY_aol.js b/webapp/assets/_app/immutable/nodes/17.BTCY_aol.js deleted file mode 100644 index aa6ca3f3..00000000 --- a/webapp/assets/_app/immutable/nodes/17.BTCY_aol.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as kr}from"../chunks/DT0EGONV.js";import{p as wr,E as Hr,o as Sr,f as k,k as a,j as o,g as e,m as i,r as s,t as _,s as r,e as be,c as p,v as re,b as $r,z as fr,y as Se,D as We,d as Cr,l as q,a as Ur,h as jr,$ as Nr,q as Ke,u as yr,n as qr}from"../chunks/CRKWEg6v.js";import{i as T,s as Or,a as Fr}from"../chunks/e1m7WRO5.js";import{r as D,s as Qe,b as $e,g as E}from"../chunks/-esynYXT.js";import{P as Br}from"../chunks/BAnDfGwP.js";import{e as hr,i as xr}from"../chunks/C73ZVvpW.js";import{b as G,a as Jr}from"../chunks/B3a35v7J.js";import{p as Vr}from"../chunks/D4Caz1gY.js";import{M as Pr}from"../chunks/xe-4nY5o.js";import{J as Wr}from"../chunks/DJsbLMno.js";import{e as H}from"../chunks/BZiHL9L3.js";import{U as Kr}from"../chunks/DJ6ZD3Tj.js";import{D as Qr}from"../chunks/BXdh0O4_.js";import{D as Xr,G as Xe,a as Yr,L as Zr}from"../chunks/B1coRVG4.js";import{e as et,a as _r}from"../chunks/Djd10kRn.js";import{t as te}from"../chunks/D6DjlyIQ.js";import{e as ve,h as rt}from"../chunks/c_t0vA9G.js";import{E as tt}from"../chunks/DF8ZTWYj.js";import{E as at}from"../chunks/B27KefbC.js";import{S as ot}from"../chunks/B0Y2gXDu.js";import{P as st}from"../chunks/BMHtEUeX.js";import"../chunks/D0m048VH.js";var lt=k('

'),it=k('
'),dt=k(""),nt=k(''),ct=k('
'),ut=k(""),gt=k(''),bt=k('

Entity & Provider Configuration

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Extra Specs (JSON)
',1),vt=k('
Creating...
'),pt=k('

Create New Scale Set

Scale sets are only available for GitHub endpoints

Entity Level *
');function mt(Ce,Pe){wr(Pe,!1);const ae=Hr();let O=i(!1),b=i(""),c=i(""),m=i([]),S=i([]),F=i(!1),$=i(!1),C=i(""),f=i(""),w=i(""),g=i(""),y=i(""),A=i(void 0),I=i(void 0),z=i(void 0),n=i("garm"),L=i("linux"),B=i("amd64"),oe=i(""),se=i(!0),U=i("{}");async function pe(){try{r($,!0),r(S,await E.listProviders())}catch(v){r(b,H(v))}finally{r($,!1)}}async function me(){if(e(c))try{switch(r(F,!0),r(m,[]),e(c)){case"repository":r(m,await E.listRepositories());break;case"organization":r(m,await E.listOrganizations());break;case"enterprise":r(m,await E.listEnterprises());break}}catch(v){r(b,H(v))}finally{r(F,!1)}}function le(v){e(c)!==v&&(r(c,v),r(f,""),me())}async function Me(){if(!e(C)||!e(c)||!e(f)||!e(w)||!e(g)||!e(y)){r(b,"Please fill in all required fields");return}try{r(O,!0),r(b,"");let v={};if(e(U).trim())try{v=JSON.parse(e(U))}catch{throw new Error("Invalid JSON in extra specs")}const J={name:e(C),provider_name:e(w),image:e(g),flavor:e(y),max_runners:e(A)||10,min_idle_runners:e(I)||0,runner_bootstrap_timeout:e(z)||20,runner_prefix:e(n),os_type:e(L),os_arch:e(B),"github-runner-group":e(oe)||void 0,enabled:e(se),extra_specs:e(U).trim()?v:void 0};let P;switch(e(c)){case"repository":P=await E.createRepositoryScaleSet(e(f),J);break;case"organization":P=await E.createOrganizationScaleSet(e(f),J);break;case"enterprise":P=await E.createEnterpriseScaleSet(e(f),J);break;default:throw new Error("Invalid entity level selected")}ae("submit",P)}catch(v){r(b,H(v))}finally{r(O,!1)}}Sr(()=>{pe()}),kr(),Pr(Ce,{$$events:{close:()=>ae("close")},children:(v,J)=>{var P=pt(),V=a(o(P),2),fe=o(V);{var Ee=u=>{var M=lt(),Z=o(M),ke=o(Z,!0);s(Z),s(M),_(()=>re(ke,e(b))),p(u,M)};T(fe,u=>{e(b)&&u(Ee)})}var W=a(fe,2),K=a(o(W),2);D(K),s(W);var Q=a(W,2),ye=o(Q),ie=a(o(ye),2),de=o(ie),X=a(de,2),he=a(X,2);s(ie),s(ye),s(Q);var ne=a(Q,2);{var Te=u=>{var M=bt(),Z=$r(M),ke=a(o(Z),2),Re=o(ke),De=o(Re),Mr=o(De);fr(),s(De);var Er=a(De,2);{var Tr=l=>{var h=it();p(l,h)},Rr=l=>{var h=nt();_(()=>{e(f),Se(()=>{e(c),e(m)})});var R=o(h),Ve=o(R);s(R),R.value=R.__value="";var ue=a(R);hr(ue,1,()=>e(m),xr,(j,x)=>{var N=dt(),we=o(N);{var Lr=ee=>{var ge=We();_(()=>re(ge,`${e(x).owner??""}/${e(x).name??""} (${e(x).endpoint?.name||"Unknown endpoint"})`)),p(ee,ge)},Gr=ee=>{var ge=We();_(()=>re(ge,`${e(x).name??""} (${e(x).endpoint?.name||"Unknown endpoint"})`)),p(ee,ge)};T(we,ee=>{e(c)==="repository"?ee(Lr):ee(Gr,!1)})}s(N);var mr={};_(()=>{mr!==(mr=e(x).id)&&(N.value=(N.__value=e(x).id)??"")}),p(j,N)}),s(h),_(()=>re(Ve,`Select a ${e(c)??""}`)),$e(h,()=>e(f),j=>r(f,j)),p(l,h)};T(Er,l=>{e(F)?l(Tr):l(Rr,!1)})}s(Re);var Ye=a(Re,2),Dr=a(o(Ye),2);{var Ar=l=>{var h=ct();p(l,h)},Ir=l=>{var h=gt();_(()=>{e(w),Se(()=>{e(S)})});var R=o(h);R.value=R.__value="";var Ve=a(R);hr(Ve,1,()=>e(S),xr,(ue,j)=>{var x=ut(),N=o(x,!0);s(x);var we={};_(()=>{re(N,e(j).name),we!==(we=e(j).name)&&(x.value=(x.__value=e(j).name)??"")}),p(ue,x)}),s(h),$e(h,()=>e(w),ue=>r(w,ue)),p(l,h)};T(Dr,l=>{e($)?l(Ar):l(Ir,!1)})}s(Ye),s(ke),s(Z);var Ae=a(Z,2),Ze=a(o(Ae),2),Ie=o(Ze),er=a(o(Ie),2);D(er),s(Ie);var ze=a(Ie,2),rr=a(o(ze),2);D(rr),s(ze);var Le=a(ze,2),Ge=a(o(Le),2);_(()=>{e(L),Se(()=>{})});var He=o(Ge);He.value=He.__value="linux";var tr=a(He);tr.value=tr.__value="windows",s(Ge),s(Le);var ar=a(Le,2),Ue=a(o(ar),2);_(()=>{e(B),Se(()=>{})});var je=o(Ue);je.value=je.__value="amd64";var or=a(je);or.value=or.__value="arm64",s(Ue),s(ar),s(Ze),s(Ae);var Ne=a(Ae,2),sr=a(o(Ne),2),qe=o(sr),lr=a(o(qe),2);D(lr),s(qe);var Oe=a(qe,2),ir=a(o(Oe),2);D(ir),s(Oe);var dr=a(Oe,2),nr=a(o(dr),2);D(nr),s(dr),s(sr),s(Ne);var cr=a(Ne,2),Fe=a(o(cr),2),Be=o(Fe),ur=a(o(Be),2);D(ur),s(Be);var gr=a(Be,2),br=a(o(gr),2);D(br),s(gr),s(Fe);var Je=a(Fe,2),zr=a(o(Je),2);Wr(zr,{rows:4,placeholder:"{}",get value(){return e(U)},set value(l){r(U,l)},$$legacy:!0}),s(Je);var vr=a(Je,2),pr=o(vr);D(pr),fr(2),s(vr),s(cr),_(l=>re(Mr,`${l??""} `),[()=>e(c).charAt(0).toUpperCase()+e(c).slice(1)]),G(er,()=>e(g),l=>r(g,l)),G(rr,()=>e(y),l=>r(y,l)),$e(Ge,()=>e(L),l=>r(L,l)),$e(Ue,()=>e(B),l=>r(B,l)),G(lr,()=>e(I),l=>r(I,l)),G(ir,()=>e(A),l=>r(A,l)),G(nr,()=>e(z),l=>r(z,l)),G(ur,()=>e(n),l=>r(n,l)),G(br,()=>e(oe),l=>r(oe,l)),Jr(pr,()=>e(se),l=>r(se,l)),p(u,M)};T(ne,u=>{e(c)&&u(Te)})}var xe=a(ne,2),_e=o(xe),t=a(_e,2),d=o(t);{var Y=u=>{var M=vt();p(u,M)},ce=u=>{var M=We("Create Scale Set");p(u,M)};T(d,u=>{e(O)?u(Y):u(ce,!1)})}s(t),s(xe),s(V),s(P),_(()=>{Qe(de,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(c)==="repository"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),Qe(X,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(c)==="organization"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),Qe(he,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(c)==="enterprise"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),t.disabled=e(O)||!e(C)||!e(c)||!e(f)||!e(w)||!e(g)||!e(y)}),G(K,()=>e(C),u=>r(C,u)),be("click",de,()=>le("repository")),be("click",X,()=>le("organization")),be("click",he,()=>le("enterprise")),be("click",_e,()=>ae("close")),be("submit",V,Vr(Me)),p(v,P)},$$slots:{default:!0}}),Cr()}const ft={};var yt=k('
'),ht=k('
',1);function Ot(Ce,Pe){wr(Pe,!1);const[ae,O]=Or(),b=()=>Fr(et,"$eagerCache",ae),c=i(),m=i(),S=i(),F=i();let $=i([]),C=i(!0),f=i(""),w=i(""),g=i(1),y=i(25),A=i(!1),I=i(!1),z=i(!1),n=i(null),L=i(!1);async function B(t){try{r(f,""),r(A,!1),te.success("Scale Set Created","Scale set has been created successfully.")}catch(d){throw r(f,H(d)),d}}async function oe(t){if(e(n))try{await E.updateScaleSet(e(n).id,t),te.success("Scale Set Updated",`Scale set ${e(n).name} has been updated successfully.`),r(I,!1),r(n,null)}catch(d){const Y=H(d);throw te.error("Update Failed",Y),d}}async function se(){if(e(n))try{await E.deleteScaleSet(e(n).id),te.success("Scale Set Deleted",`Scale set ${e(n).name} has been deleted successfully.`)}catch(t){const d=H(t);te.error("Delete Failed",d)}finally{r(z,!1),r(n,null)}}function U(){r(A,!0)}async function pe(t){try{r(L,!0);const d=await E.getScaleSet(t.id);r(n,d),r(I,!0)}catch(d){const Y=H(d);te.error("Failed to Load Scale Set Details",Y)}finally{r(L,!1)}}function me(t){r(n,t),r(z,!0)}Sr(async()=>{try{r(C,!0);const t=await _r.getScaleSets();t&&Array.isArray(t)&&r($,t)}catch(t){ft?.VITEST||console.error("Failed to load scale sets:",t),r(f,H(t))}finally{r(C,!1)}});async function le(){try{await _r.retryResource("scalesets")}catch(t){console.error("Retry failed:",t)}}const Me=[{key:"name",title:"Name",cellComponent:tt,cellProps:{entityType:"scaleset"}},{key:"image",title:"Image",cellComponent:Xe,cellProps:{field:"image",type:"code",showTitle:!0}},{key:"provider",title:"Provider",cellComponent:Xe,cellProps:{field:"provider_name"}},{key:"flavor",title:"Flavor",cellComponent:Xe,cellProps:{field:"flavor"}},{key:"entity",title:"Entity",cellComponent:st},{key:"endpoint",title:"Endpoint",cellComponent:at},{key:"status",title:"Status",cellComponent:ot,cellProps:{statusType:"enabled"}},{key:"actions",title:"Actions",align:"right",cellComponent:Yr}],v={entityType:"scaleset",primaryText:{field:"name",isClickable:!0,href:"/scalesets/{id}"},secondaryText:{field:"entity_name",computedValue:t=>ve(t)},badges:[{type:"custom",value:t=>({variant:t.enabled?"success":"error",text:t.enabled?"Enabled":"Disabled"})}],actions:[{type:"edit",handler:t=>pe(t)},{type:"delete",handler:t=>me(t)}]};function J(t){r(w,t.detail.term),r(g,1)}function P(t){r(g,t.detail.page)}function V(t){r(y,t.detail.perPage),r(g,1)}function fe(t){pe(t.detail.item)}function Ee(t){me(t.detail.item)}q(()=>(e($),b()),()=>{(!e($).length||b().loaded.scalesets)&&r($,b().scalesets)}),q(()=>b(),()=>{r(C,b().loading.scalesets)}),q(()=>b(),()=>{r(c,b().errorMessages.scalesets)}),q(()=>(e($),e(w),ve),()=>{r(m,rt(e($),e(w),t=>ve(t)))}),q(()=>(e(m),e(y)),()=>{r(S,Math.ceil(e(m).length/e(y)))}),q(()=>(e(g),e(S)),()=>{e(g)>e(S)&&e(S)>0&&r(g,e(S))}),q(()=>(e(m),e(g),e(y)),()=>{r(F,e(m).slice((e(g)-1)*e(y),e(g)*e(y)))}),Ur(),kr();var W=ht();jr(t=>{Nr.title="Scale Sets - GARM"});var K=$r(W),Q=o(K);Br(Q,{title:"Scale Sets",description:"Manage GitHub runner scale sets",actionLabel:"Add Scale Set",$$events:{action:U}});var ye=a(Q,2);{let t=Ke(()=>e(c)||e(f)),d=Ke(()=>!!e(c));Xr(ye,{get columns(){return Me},get data(){return e(F)},get loading(){return e(C)},get error(){return e(t)},get searchTerm(){return e(w)},searchPlaceholder:"Search by entity name...",get currentPage(){return e(g)},get perPage(){return e(y)},get totalPages(){return e(S)},get totalItems(){return e(m),yr(()=>e(m).length)},itemName:"scale sets",emptyIconType:"cog",get showRetry(){return e(d)},get mobileCardConfig(){return v},$$events:{search:J,pageChange:P,perPageChange:V,retry:le,edit:fe,delete:Ee}})}s(K);var ie=a(K,2);{var de=t=>{mt(t,{$$events:{close:()=>r(A,!1),submit:d=>B(d.detail)}})};T(ie,t=>{e(A)&&t(de)})}var X=a(ie,2);{var he=t=>{Kr(t,{get scaleSet(){return e(n)},$$events:{close:()=>{r(I,!1),r(n,null)},submit:d=>oe(d.detail)}})};T(X,t=>{e(I)&&e(n)&&t(he)})}var ne=a(X,2);{var Te=t=>{{let d=Ke(()=>(e(n),qr(ve),yr(()=>`Scale Set ${e(n).name} (${ve(e(n))})`)));Qr(t,{title:"Delete Scale Set",message:"Are you sure you want to delete this scale set? This action cannot be undone and will remove all associated runners.",get itemName(){return e(d)},$$events:{close:()=>{r(z,!1),r(n,null)},confirm:se}})}};T(ne,t=>{e(z)&&e(n)&&t(Te)})}var xe=a(ne,2);{var _e=t=>{Pr(t,{$$events:{close:()=>{}},children:(d,Y)=>{var ce=yt(),u=o(ce);Zr(u,{message:"Loading scale set details..."}),s(ce),p(d,ce)},$$slots:{default:!0}})};T(xe,t=>{e(L)&&t(_e)})}p(Ce,W),Cr(),O()}export{Ot as component}; diff --git a/webapp/assets/_app/immutable/nodes/17.DCq-Dc1c.js b/webapp/assets/_app/immutable/nodes/17.DCq-Dc1c.js new file mode 100644 index 00000000..da616654 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/17.DCq-Dc1c.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as Gr}from"../chunks/C7KraPli.js";import{p as Hr,E as ot,o as Nr,l as F,k as r,g as e,m as d,h as Ur,f as k,s as a,d as l,r as o,t as _,i as ke,b,e as q,a as Pe,z as ir,y as we,u as p,D as Se,c as jr,B as Ir,q as qr,j as lt,$ as st,v as nr}from"../chunks/cPTQ2Ibn.js";import{i as M,s as dt,a as it}from"../chunks/DqFqoVWr.js";import{r as B,s as cr,b as $e,g as G,d as zr,c as nt}from"../chunks/DqbUkQgD.js";import{P as ct}from"../chunks/U3V4g_hv.js";import{e as ur,i as gr}from"../chunks/CiWDXYQd.js";import{b as Q,a as ut}from"../chunks/B-_QCM7E.js";import{p as gt}from"../chunks/D4Caz1gY.js";import{M as Fr}from"../chunks/Bo3f8OIz.js";import{J as vt}from"../chunks/D6f8Dk7c.js";import{e as V}from"../chunks/BZiHL9L3.js";import{U as bt}from"../chunks/BUaPampd.js";import{D as pt}from"../chunks/91PQ6UtW.js";import{D as mt,G as vr,A as ft,L as yt}from"../chunks/Du50aAe5.js";import{e as xt,a as Lr}from"../chunks/JUkrBp3F.js";import{t as ne}from"../chunks/Bgbd8SZ5.js";import{e as Ce,h as ht}from"../chunks/DJsB5Z5V.js";import{E as _t}from"../chunks/CPFytHjx.js";import{E as kt}from"../chunks/CYqkNFLz.js";import{S as wt}from"../chunks/BZ2WxPPD.js";import{P as St}from"../chunks/BM4Azg_w.js";import"../chunks/D7e9zx6w.js";var $t=k('

'),Ct=k('
'),Pt=k(""),Mt=k(''),Tt=k('
'),Et=k(""),Rt=k(''),Dt=k('
Loading templates...
'),At=k(""),It=k('

Templates define how the runner software is installed and configured.

',1),zt=k('

Create a template first or proceed without a template to use default behavior.

'),Lt=k('

Select an entity first to see available templates

'),Gt=k('

Entity & Provider Configuration

Image & OS Configuration

Runner Limits & Timing

Advanced Settings

Extra Specs (JSON)
',1),Ht=k('
Creating...
'),Nt=k('

Create New Scale Set

Scale sets are only available for GitHub endpoints

Entity Level *
');function Ut(ze,Le){Hr(Le,!1);const ce=d(),ue=ot();let E=d(!1),A=d(""),u=d(""),C=d([]),re=d([]),x=d([]),J=d(!1),W=d(!1),K=d(!1),w=d(""),g=d(""),I=d(""),H=d(""),N=d(""),m=d(void 0),X=d(void 0),ge=d(void 0),ve=d("garm"),R=d("linux"),te=d("amd64"),ae=d(""),oe=d(!0),Y=d("{}"),z=d(void 0);async function Ge(){try{r(W,!0),r(re,await G.listProviders())}catch(i){r(A,V(i))}finally{r(W,!1)}}async function Me(){try{r(K,!0);const i=be();if(!i){r(x,[]);return}if(r(x,await G.listTemplates(e(R),void 0,i)),!e(z)||!e(x).find(f=>f.id===e(z))){const f=e(x).find(D=>D.owner_id==="system");f?r(z,f.id):e(x).length>0&&r(z,e(x)[0].id)}}catch(i){r(A,V(i))}finally{r(K,!1)}}function be(){if(!e(g)||!e(C))return null;const i=e(C).find(f=>f.id===e(g));if(!i)return null;if("forge_type"in i)return i.forge_type;if("endpoint"in i){const f=i.endpoint;if(f&&"endpoint_type"in f)return f.endpoint_type||null}return"github"}async function He(){if(e(u))try{switch(r(J,!0),r(C,[]),e(u)){case"repository":r(C,await G.listRepositories());break;case"organization":r(C,await G.listOrganizations());break;case"enterprise":r(C,await G.listEnterprises());break}}catch(i){r(A,V(i))}finally{r(J,!1)}}function pe(i){e(u)!==i&&(r(u,i),r(g,""),r(z,void 0),He())}async function Ne(){if(!e(ce)){r(A,"Please fill in all required fields");return}try{r(E,!0),r(A,"");let i={};if(e(Y).trim())try{i=JSON.parse(e(Y))}catch{throw new Error("Invalid JSON in extra specs")}const f={name:e(w),provider_name:e(I),image:e(H),flavor:e(N),max_runners:e(m)||10,min_idle_runners:e(X)||0,runner_bootstrap_timeout:e(ge)||20,runner_prefix:e(ve),os_type:e(R),os_arch:e(te),"github-runner-group":e(ae)||void 0,enabled:e(oe),extra_specs:e(Y).trim()?i:void 0,template_id:e(z)};let D;switch(e(u)){case"repository":D=await G.createRepositoryScaleSet(e(g),f);break;case"organization":D=await G.createOrganizationScaleSet(e(g),f);break;case"enterprise":D=await G.createEnterpriseScaleSet(e(g),f);break;default:throw new Error("Invalid entity level selected")}ue("submit",D)}catch(i){r(A,V(i))}finally{r(E,!1)}}Nr(()=>{Ge()}),F(()=>(e(E),e(w),e(u),e(g),e(I),e(H),e(N)),()=>{r(ce,!e(E)&&e(w).trim()!==""&&e(u)!==""&&e(g)!==""&&e(I)!==""&&e(H).trim()!==""&&e(N).trim()!=="")}),F(()=>(e(g),e(R)),()=>{e(g)&&e(R)&&Me()}),F(()=>(e(R),e(g)),()=>{e(R)&&e(g)&&Me()}),Ur(),Gr(),Fr(ze,{$$events:{close:()=>ue("close")},children:(i,f)=>{var D=Nt(),le=a(l(D),2),me=l(le);{var Ue=S=>{var U=$t(),ie=l(U),Ae=l(ie,!0);o(ie),o(U),_(()=>q(Ae,e(A))),b(S,U)};M(me,S=>{e(A)&&S(Ue)})}var se=a(me,2),Te=a(l(se),2);B(Te),o(se);var de=a(se,2),Ee=l(de),Re=a(l(Ee),2),fe=l(Re),t=a(fe,2),v=a(t,2);o(Re),o(Ee),o(de);var Z=a(de,2);{var ye=S=>{var U=Gt(),ie=Pe(U),Ae=a(l(ie),2),qe=l(Ae),Fe=l(qe),Jr=l(Fe);ir(),o(Fe);var Wr=a(Fe,2);{var Kr=s=>{var y=Ct();b(s,y)},Qr=s=>{var y=Mt();_(()=>{e(g),we(()=>{e(u),e(C)})});var L=l(y),xe=l(L);o(L),L.value=L.__value="";var ee=a(L);ur(ee,1,()=>e(C),gr,(h,n)=>{var T=Pt(),O=l(T);{var he=c=>{var P=Se();_(()=>q(P,`${e(n),p(()=>e(n).owner)??""}/${e(n),p(()=>e(n).name)??""} (${e(n),p(()=>e(n).endpoint?.name||"Unknown endpoint")??""})`)),b(c,P)},j=c=>{var P=Se();_(()=>q(P,`${e(n),p(()=>e(n).name)??""} (${e(n),p(()=>e(n).endpoint?.name||"Unknown endpoint")??""})`)),b(c,P)};M(O,c=>{e(u)==="repository"?c(he):c(j,!1)})}o(T);var $={};_(()=>{$!==($=(e(n),p(()=>e(n).id)))&&(T.value=(T.__value=(e(n),p(()=>e(n).id)))??"")}),b(h,T)}),o(y),_(()=>q(xe,`Select a ${e(u)??""}`)),$e(y,()=>e(g),h=>r(g,h)),b(s,y)};M(Wr,s=>{e(J)?s(Kr):s(Qr,!1)})}o(qe);var pr=a(qe,2),Xr=a(l(pr),2);{var Yr=s=>{var y=Tt();b(s,y)},Zr=s=>{var y=Rt();_(()=>{e(I),we(()=>{e(re)})});var L=l(y);L.value=L.__value="";var xe=a(L);ur(xe,1,()=>e(re),gr,(ee,h)=>{var n=Et(),T=l(n,!0);o(n);var O={};_(()=>{q(T,(e(h),p(()=>e(h).name))),O!==(O=(e(h),p(()=>e(h).name)))&&(n.value=(n.__value=(e(h),p(()=>e(h).name)))??"")}),b(ee,n)}),o(y),$e(y,()=>e(I),ee=>r(I,ee)),b(s,y)};M(Xr,s=>{e(W)?s(Yr):s(Zr,!1)})}o(pr),o(Ae),o(ie);var Oe=a(ie,2),Be=a(l(Oe),2),Ve=l(Be),mr=a(l(Ve),2);B(mr),o(Ve);var Je=a(Ve,2),fr=a(l(Je),2);B(fr),o(Je);var We=a(Je,2),Ke=a(l(We),2);_(()=>{e(R),we(()=>{})});var Qe=l(Ke);Qe.value=Qe.__value="linux";var yr=a(Qe);yr.value=yr.__value="windows",o(Ke),o(We);var xr=a(We,2),Xe=a(l(xr),2);_(()=>{e(te),we(()=>{})});var Ye=l(Xe);Ye.value=Ye.__value="amd64";var hr=a(Ye);hr.value=hr.__value="arm64",o(Xe),o(xr),o(Be);var _r=a(Be,2),et=a(l(_r),2);{var rt=s=>{var y=Dt();b(s,y)},tt=s=>{var y=Ir(),L=Pe(y);{var xe=h=>{var n=It(),T=Pe(n);_(()=>{e(z),we(()=>{e(x)})}),ur(T,5,()=>e(x),gr,($,c)=>{var P=At(),_e=l(P),lr=a(_e);{var sr=dr=>{var Ar=Se();_(()=>q(Ar,`- ${e(c),p(()=>e(c).description)??""}`)),b(dr,Ar)};M(lr,dr=>{e(c),p(()=>e(c).description)&&dr(sr)})}o(P);var Ie={};_(()=>{q(_e,`${e(c),p(()=>e(c).name)??""} ${e(c),p(()=>e(c).owner_id==="system"?"(System)":"")??""} `),Ie!==(Ie=(e(c),p(()=>e(c).id)))&&(P.value=(P.__value=(e(c),p(()=>e(c).id)))??"")}),b($,P)}),o(T);var O=a(T,2),he=a(l(O));{var j=$=>{var c=Se();_(P=>q(c,`Showing templates for ${P??""} ${e(R)??""}.`),[()=>p(be)]),b($,c)};M(he,$=>{e(g)&&$(j)})}o(O),$e(T,()=>e(z),$=>r(z,$)),b(h,n)},ee=h=>{var n=Ir(),T=Pe(n);{var O=j=>{var $=zt(),c=l($),P=l(c);o(c);var _e=a(c,2),lr=l(_e);ir(),o(_e),o($),_((sr,Ie)=>{q(P,`No templates found for ${sr??""} ${e(R)??""}.`),nt(lr,"href",Ie)},[()=>p(be),()=>(qr(zr),p(()=>zr("/templates")))]),b(j,$)},he=j=>{var $=Lt();b(j,$)};M(T,j=>{e(g)?j(O):j(he,!1)},!0)}b(h,n)};M(L,h=>{e(x),p(()=>e(x).length>0)?h(xe):h(ee,!1)},!0)}b(s,y)};M(et,s=>{e(K)?s(rt):s(tt,!1)})}o(_r),o(Oe);var Ze=a(Oe,2),kr=a(l(Ze),2),er=l(kr),wr=a(l(er),2);B(wr),o(er);var rr=a(er,2),Sr=a(l(rr),2);B(Sr),o(rr);var $r=a(rr,2),Cr=a(l($r),2);B(Cr),o($r),o(kr),o(Ze);var Pr=a(Ze,2),tr=a(l(Pr),2),ar=l(tr),Mr=a(l(ar),2);B(Mr),o(ar);var Tr=a(ar,2),Er=a(l(Tr),2);B(Er),o(Tr),o(tr);var or=a(tr,2),at=a(l(or),2);vt(at,{rows:4,placeholder:"{}",get value(){return e(Y)},set value(s){r(Y,s)},$$legacy:!0}),o(or);var Rr=a(or,2),Dr=l(Rr);B(Dr),ir(2),o(Rr),o(Pr),_(s=>q(Jr,`${s??""} `),[()=>(e(u),p(()=>e(u).charAt(0).toUpperCase()+e(u).slice(1)))]),Q(mr,()=>e(H),s=>r(H,s)),Q(fr,()=>e(N),s=>r(N,s)),$e(Ke,()=>e(R),s=>r(R,s)),$e(Xe,()=>e(te),s=>r(te,s)),Q(wr,()=>e(X),s=>r(X,s)),Q(Sr,()=>e(m),s=>r(m,s)),Q(Cr,()=>e(ge),s=>r(ge,s)),Q(Mr,()=>e(ve),s=>r(ve,s)),Q(Er,()=>e(ae),s=>r(ae,s)),ut(Dr,()=>e(oe),s=>r(oe,s)),b(S,U)};M(Z,S=>{e(u)&&S(ye)})}var De=a(Z,2),br=l(De),je=a(br,2),Or=l(je);{var Br=S=>{var U=Ht();b(S,U)},Vr=S=>{var U=Se("Create Scale Set");b(S,U)};M(Or,S=>{e(E)?S(Br):S(Vr,!1)})}o(je),o(De),o(le),o(D),_(()=>{cr(fe,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(u)==="repository"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),cr(t,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(u)==="organization"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),cr(v,1,`flex flex-col items-center justify-center p-4 border-2 rounded-lg transition-colors cursor-pointer ${e(u)==="enterprise"?"border-blue-500 bg-blue-50 dark:bg-blue-900":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`),je.disabled=!e(ce)}),Q(Te,()=>e(w),S=>r(w,S)),ke("click",fe,()=>pe("repository")),ke("click",t,()=>pe("organization")),ke("click",v,()=>pe("enterprise")),ke("click",br,()=>ue("close")),ke("submit",le,gt(Ne)),b(i,D)},$$slots:{default:!0}}),jr()}const jt={};var qt=k('
'),Ft=k('
',1);function va(ze,Le){Hr(Le,!1);const[ce,ue]=dt(),E=()=>it(xt,"$eagerCache",ce),A=d(),u=d(),C=d(),re=d();let x=d([]),J=d(!0),W=d(""),K=d(""),w=d(1),g=d(25),I=d(!1),H=d(!1),N=d(!1),m=d(null),X=d(!1);async function ge(t){try{r(W,""),r(I,!1),ne.success("Scale Set Created","Scale set has been created successfully.")}catch(v){throw r(W,V(v)),v}}async function ve(t){if(e(m))try{await G.updateScaleSet(e(m).id,t),ne.success("Scale Set Updated",`Scale set ${e(m).name} has been updated successfully.`),r(H,!1),r(m,null)}catch(v){const Z=V(v);throw ne.error("Update Failed",Z),v}}async function R(){if(e(m))try{await G.deleteScaleSet(e(m).id),ne.success("Scale Set Deleted",`Scale set ${e(m).name} has been deleted successfully.`)}catch(t){const v=V(t);ne.error("Delete Failed",v)}finally{r(N,!1),r(m,null)}}function te(){r(I,!0)}async function ae(t){try{r(X,!0);const v=await G.getScaleSet(t.id);r(m,v),r(H,!0)}catch(v){const Z=V(v);ne.error("Failed to Load Scale Set Details",Z)}finally{r(X,!1)}}function oe(t){r(m,t),r(N,!0)}Nr(async()=>{try{r(J,!0);const t=await Lr.getScaleSets();t&&Array.isArray(t)&&r(x,t)}catch(t){jt?.VITEST||console.error("Failed to load scale sets:",t),r(W,V(t))}finally{r(J,!1)}});async function Y(){try{await Lr.retryResource("scalesets")}catch(t){console.error("Retry failed:",t)}}const z=[{key:"name",title:"Name",cellComponent:_t,cellProps:{entityType:"scaleset"}},{key:"image",title:"Image",cellComponent:vr,cellProps:{field:"image",type:"code",showTitle:!0}},{key:"provider",title:"Provider",cellComponent:vr,cellProps:{field:"provider_name"}},{key:"flavor",title:"Flavor",cellComponent:vr,cellProps:{field:"flavor"}},{key:"entity",title:"Entity",cellComponent:St},{key:"endpoint",title:"Endpoint",cellComponent:kt},{key:"status",title:"Status",cellComponent:wt,cellProps:{statusType:"enabled"}},{key:"actions",title:"Actions",align:"right",cellComponent:ft}],Ge={entityType:"scaleset",primaryText:{field:"name",isClickable:!0,href:"/scalesets/{id}"},secondaryText:{field:"entity_name",computedValue:t=>Ce(t)},badges:[{type:"custom",value:t=>({variant:t.enabled?"success":"error",text:t.enabled?"Enabled":"Disabled"})}],actions:[{type:"edit",handler:t=>ae(t)},{type:"delete",handler:t=>oe(t)}]};function Me(t){r(K,t.detail.term),r(w,1)}function be(t){r(w,t.detail.page)}function He(t){r(g,t.detail.perPage),r(w,1)}function pe(t){ae(t.detail.item)}function Ne(t){oe(t.detail.item)}F(()=>(e(x),E()),()=>{(!e(x).length||E().loaded.scalesets)&&r(x,E().scalesets)}),F(()=>E(),()=>{r(J,E().loading.scalesets)}),F(()=>E(),()=>{r(A,E().errorMessages.scalesets)}),F(()=>(e(x),e(K),Ce),()=>{r(u,ht(e(x),e(K),t=>Ce(t)))}),F(()=>(e(u),e(g)),()=>{r(C,Math.ceil(e(u).length/e(g)))}),F(()=>(e(w),e(C)),()=>{e(w)>e(C)&&e(C)>0&&r(w,e(C))}),F(()=>(e(u),e(w),e(g)),()=>{r(re,e(u).slice((e(w)-1)*e(g),e(w)*e(g)))}),Ur(),Gr();var i=Ft();lt(t=>{st.title="Scale Sets - GARM"});var f=Pe(i),D=l(f);ct(D,{title:"Scale Sets",description:"Manage GitHub runner scale sets",actionLabel:"Add Scale Set",$$events:{action:te}});var le=a(D,2);{let t=nr(()=>e(A)||e(W)),v=nr(()=>!!e(A));mt(le,{get columns(){return z},get data(){return e(re)},get loading(){return e(J)},get error(){return e(t)},get searchTerm(){return e(K)},searchPlaceholder:"Search by entity name...",get currentPage(){return e(w)},get perPage(){return e(g)},get totalPages(){return e(C)},get totalItems(){return e(u),p(()=>e(u).length)},itemName:"scale sets",emptyIconType:"cog",get showRetry(){return e(v)},get mobileCardConfig(){return Ge},$$events:{search:Me,pageChange:be,perPageChange:He,retry:Y,edit:pe,delete:Ne}})}o(f);var me=a(f,2);{var Ue=t=>{Ut(t,{$$events:{close:()=>r(I,!1),submit:v=>ge(v.detail)}})};M(me,t=>{e(I)&&t(Ue)})}var se=a(me,2);{var Te=t=>{bt(t,{get scaleSet(){return e(m)},$$events:{close:()=>{r(H,!1),r(m,null)},submit:v=>ve(v.detail)}})};M(se,t=>{e(H)&&e(m)&&t(Te)})}var de=a(se,2);{var Ee=t=>{{let v=nr(()=>(e(m),qr(Ce),p(()=>`Scale Set ${e(m).name} (${Ce(e(m))})`)));pt(t,{title:"Delete Scale Set",message:"Are you sure you want to delete this scale set? This action cannot be undone and will remove all associated runners.",get itemName(){return e(v)},$$events:{close:()=>{r(N,!1),r(m,null)},confirm:R}})}};M(de,t=>{e(N)&&e(m)&&t(Ee)})}var Re=a(de,2);{var fe=t=>{Fr(t,{$$events:{close:()=>{}},children:(v,Z)=>{var ye=qt(),De=l(ye);yt(De,{message:"Loading scale set details..."}),o(ye),b(v,ye)},$$slots:{default:!0}})};M(Re,t=>{e(X)&&t(fe)})}b(ze,i),jr(),ue()}export{va as component}; diff --git a/webapp/assets/_app/immutable/nodes/18.MXydOOIa.js b/webapp/assets/_app/immutable/nodes/18.MXydOOIa.js deleted file mode 100644 index 7fbfd239..00000000 --- a/webapp/assets/_app/immutable/nodes/18.MXydOOIa.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as He}from"../chunks/DT0EGONV.js";import{p as Je,o as Pe,A as je,l as qe,a as ze,f as $,h as Ve,b as B,t as k,c as f,d as We,u as i,n as m,v as o,g as t,m as p,j as a,k as d,s as l,$ as Ke,r,w as I,B as zt,q as S}from"../chunks/CRKWEg6v.js";import{i as _,s as Qe,a as Xe}from"../chunks/e1m7WRO5.js";import{d as R,c as Vt,g as F,s as Ye}from"../chunks/-esynYXT.js";import{p as Ze}from"../chunks/B0m3rqSR.js";import{g as Wt}from"../chunks/Dkb9lSSG.js";import{U as ta}from"../chunks/DJ6ZD3Tj.js";import{D as Kt}from"../chunks/BXdh0O4_.js";import{D as ea,I as aa}from"../chunks/CrNwrvNH.js";import{w as Qt}from"../chunks/C73ZVvpW.js";import{t as C}from"../chunks/D6DjlyIQ.js";import{e as Xt}from"../chunks/BZiHL9L3.js";import{e as w,i as G,j as Yt,b as L,g as Zt}from"../chunks/c_t0vA9G.js";var ra=$('

Loading scale set...

'),sa=$('

'),da=$('
GitHub Runner Group
'),ia=$('

Extra Specifications

 
'),na=$('

Basic Information

Scale Set ID
Name
Provider
Image
Flavor
Status
Entity
Created At
Updated At

Configuration

Max Runners
Min Idle Runners
Bootstrap Timeout
Runner Prefix
OS Type / Architecture
',1),la=$(' ',1);function Sa(te,ee){Je(ee,!1);const[ae,re]=Qe(),mt=()=>Xe(Ze,"$page",ae),D=p();let e=p(null),O=p(!0),E=p(""),M=p(!1),A=p(!1),N=p(!1),u=p(null),T=null;async function ut(){if(!(!t(D)||isNaN(t(D))))try{l(O,!0),l(E,""),l(e,await F.getScaleSet(t(D))),t(e).instances||I(e,t(e).instances=[])}catch(s){l(E,s instanceof Error?s.message:"Failed to load scale set")}finally{l(O,!1)}}async function se(s){if(t(e))try{await F.updateScaleSet(t(e).id,s),await ut(),C.success("Scale Set Updated",`Scale Set ${t(e).name} has been updated successfully.`),l(M,!1)}catch(n){throw n}}async function de(){if(t(e)){try{await F.deleteScaleSet(t(e).id),Wt(R("/scalesets"))}catch(s){const n=Xt(s);C.error("Delete Failed",n)}l(A,!1)}}async function ie(){if(t(u)){try{await F.deleteInstance(t(u).name),C.success("Instance Deleted",`Instance ${t(u).name} has been deleted successfully.`)}catch(s){const n=Xt(s);C.error("Delete Failed",n)}l(N,!1),l(u,null)}}function ne(s){l(u,s),l(N,!0)}function le(s){if(!s)return"{}";try{if(typeof s=="string"){const n=JSON.parse(s);return JSON.stringify(n,null,2)}return JSON.stringify(s,null,2)}catch{return s.toString()}}function oe(s){if(s.operation==="update"){const n=s.payload;t(e)&&n.id===t(e).id&&l(e,n)}else if(s.operation==="delete"){const n=s.payload.id||s.payload;t(e)&&t(e).id===n&&Wt(R("/scalesets"))}}function ce(s){if(!t(e))return;const n=s.payload;if(n.scale_set_id===t(e).id){if(t(e).instances||I(e,t(e).instances=[]),s.operation==="create")I(e,t(e).instances=[...t(e).instances,n]);else if(s.operation==="update")I(e,t(e).instances=t(e).instances.map(y=>y.id===n.id?n:y));else if(s.operation==="delete"){const y=n.id||n;I(e,t(e).instances=t(e).instances.filter(j=>j.id!==y))}l(e,t(e))}}Pe(()=>{ut();const s=Qt.subscribeToEntity("scaleset",["update","delete"],oe),n=Qt.subscribeToEntity("instance",["create","update","delete"],ce);T=()=>{s(),n()}}),je(()=>{T&&(T(),T=null)}),qe(()=>mt(),()=>{l(D,parseInt(mt().params.id||"0"))}),ze(),He();var xt=la();Ve(s=>{k(()=>Ke.title=`${t(e),i(()=>t(e)?`${t(e).name} - Scale Set Details`:"Scale Set Details")??""} - GARM`)});var H=B(xt),J=a(H),gt=a(J),P=a(gt),ve=a(P);r(P);var ft=d(P,2),pt=a(ft),_t=d(a(pt),2),me=a(_t,!0);r(_t),r(pt),r(ft),r(gt),r(J);var ue=d(J,2);{var xe=s=>{var n=ra();f(s,n)},ge=s=>{var n=zt(),y=B(n);{var j=h=>{var b=sa(),U=a(b),q=a(U,!0);r(U),r(b),k(()=>o(q,t(E))),f(h,b)},he=h=>{var b=zt(),U=B(b);{var q=z=>{var bt=na(),kt=B(bt);{let c=S(()=>(t(e),i(()=>t(e).name||"Scale Set"))),v=S(()=>(m(w),t(e),i(()=>w(t(e))))),x=S(()=>(m(G),t(e),i(()=>G(t(e))))),g=S(()=>(m(Zt),i(()=>Zt("github"))));ea(kt,{get title(){return t(c)},get subtitle(){return`Scale set for ${t(v)??""} (${t(x)??""}) • GitHub Runner Scale Set`},get forgeIcon(){return t(g)},onEdit:()=>l(M,!0),onDelete:()=>l(A,!0)})}var V=d(kt,2),W=a(V),St=a(W),wt=d(a(St),2),K=a(wt),$t=d(a(K),2),be=a($t,!0);r($t),r(K);var Q=d(K,2),It=d(a(Q),2),ke=a(It,!0);r(It),r(Q);var X=d(Q,2),Dt=d(a(X),2),Se=a(Dt,!0);r(Dt),r(X);var Y=d(X,2),Et=d(a(Y),2),Mt=a(Et),we=a(Mt,!0);r(Mt),r(Et),r(Y);var Z=d(Y,2),At=d(a(Z),2),$e=a(At,!0);r(At),r(Z);var tt=d(Z,2),Nt=d(a(tt),2),et=a(Nt),Ie=a(et,!0);r(et),r(Nt),r(tt);var at=d(tt,2),Tt=d(a(at),2),Ut=a(Tt),rt=a(Ut),De=a(rt,!0);r(rt);var st=d(rt,2),Ee=a(st,!0);r(st),r(Ut),r(Tt),r(at);var dt=d(at,2),Bt=d(a(dt),2),Me=a(Bt,!0);r(Bt),r(dt);var Rt=d(dt,2),Ft=d(a(Rt),2),Ae=a(Ft,!0);r(Ft),r(Rt),r(wt),r(St),r(W);var Ct=d(W,2),Gt=a(Ct),Lt=d(a(Gt),2),it=a(Lt),Ot=d(a(it),2),Ne=a(Ot,!0);r(Ot),r(it);var nt=d(it,2),Ht=d(a(nt),2),Te=a(Ht,!0);r(Ht),r(nt);var lt=d(nt,2),Jt=d(a(lt),2),Ue=a(Jt);r(Jt),r(lt);var ot=d(lt,2),Pt=d(a(ot),2),Be=a(Pt,!0);r(Pt),r(ot);var ct=d(ot,2),jt=d(a(ct),2),Re=a(jt);r(jt),r(ct);var Fe=d(ct,2);{var Ce=c=>{var v=da(),x=d(a(v),2),g=a(x,!0);r(x),r(v),k(()=>o(g,(t(e),i(()=>t(e)["github-runner-group"])))),f(c,v)};_(Fe,c=>{t(e),i(()=>t(e)["github-runner-group"])&&c(Ce)})}r(Lt),r(Gt),r(Ct),r(V);var qt=d(V,2);{var Ge=c=>{var v=ia(),x=a(v),g=d(a(x),2),vt=a(g,!0);r(g),r(x),r(v),k(Oe=>o(vt,Oe),[()=>(t(e),i(()=>le(t(e).extra_specs)))]),f(c,v)};_(qt,c=>{t(e),i(()=>t(e).extra_specs)&&c(Ge)})}var Le=d(qt,2);{let c=S(()=>(t(e),i(()=>t(e).instances||[])));aa(Le,{get instances(){return t(c)},entityType:"scaleset",onDeleteInstance:ne})}k((c,v,x,g,vt)=>{o(be,(t(e),i(()=>t(e).id))),o(ke,(t(e),i(()=>t(e).name))),o(Se,(t(e),i(()=>t(e).provider_name))),o(we,(t(e),i(()=>t(e).image))),o($e,(t(e),i(()=>t(e).flavor))),Ye(et,1,`inline-flex px-2 py-1 text-xs font-medium rounded-full ${t(e),i(()=>t(e).enabled?"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200":"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200")??""}`),o(Ie,(t(e),i(()=>t(e).enabled?"Enabled":"Disabled"))),o(De,c),Vt(st,"href",v),o(Ee,x),o(Me,g),o(Ae,vt),o(Ne,(t(e),i(()=>t(e).max_runners))),o(Te,(t(e),i(()=>t(e).min_idle_runners))),o(Ue,`${t(e),i(()=>t(e).runner_bootstrap_timeout)??""} minutes`),o(Be,(t(e),i(()=>t(e).runner_prefix||"garm"))),o(Re,`${t(e),i(()=>t(e).os_type)??""} / ${t(e),i(()=>t(e).os_arch)??""}`)},[()=>(m(G),t(e),i(()=>G(t(e)))),()=>(m(Yt),t(e),i(()=>Yt(t(e)))),()=>(m(w),t(e),i(()=>w(t(e)))),()=>(m(L),t(e),i(()=>L(t(e).created_at||""))),()=>(m(L),t(e),i(()=>L(t(e).updated_at||"")))]),f(z,bt)};_(U,z=>{t(e)&&z(q)},!0)}f(h,b)};_(y,h=>{t(E)?h(j):h(he,!1)},!0)}f(s,n)};_(ue,s=>{t(O)?s(xe):s(ge,!1)})}r(H);var yt=d(H,2);{var fe=s=>{ta(s,{get scaleSet(){return t(e)},$$events:{close:()=>l(M,!1),submit:n=>se(n.detail)}})};_(yt,s=>{t(M)&&t(e)&&s(fe)})}var ht=d(yt,2);{var pe=s=>{{let n=S(()=>(t(e),m(w),i(()=>`Scale Set ${t(e).name} (${w(t(e))})`)));Kt(s,{title:"Delete Scale Set",message:"Are you sure you want to delete this scale set? This action cannot be undone and will remove all associated runners.",get itemName(){return t(n)},$$events:{close:()=>l(A,!1),confirm:de}})}};_(ht,s=>{t(A)&&t(e)&&s(pe)})}var _e=d(ht,2);{var ye=s=>{Kt(s,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return t(u),i(()=>t(u).name)},$$events:{close:()=>{l(N,!1),l(u,null)},confirm:ie}})};_(_e,s=>{t(N)&&t(u)&&s(ye)})}k(s=>{Vt(ve,"href",s),o(me,(t(e),i(()=>t(e)?t(e).name:"Loading...")))},[()=>(m(R),i(()=>R("/scalesets")))]),f(te,xt),We(),re()}export{Sa as component}; diff --git a/webapp/assets/_app/immutable/nodes/18.xleZqgRD.js b/webapp/assets/_app/immutable/nodes/18.xleZqgRD.js new file mode 100644 index 00000000..720c0ab7 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/18.xleZqgRD.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as Ve}from"../chunks/C7KraPli.js";import{p as We,o as Ke,A as Qe,l as Xe,h as Ye,f as _,j as Ze,a as T,t as h,b as u,c as ta,u as i,q as g,e as n,g as t,m as b,d as a,s,k as v,$ as ea,r,w as A,B as ft,v as $}from"../chunks/cPTQ2Ibn.js";import{i as f}from"../chunks/DqFqoVWr.js";import{d as k,c as L,g as O,s as aa}from"../chunks/DqbUkQgD.js";import{p as Xt}from"../chunks/BgSaD1r_.js";import{g as Yt}from"../chunks/CTvJf3dP.js";import{U as ra}from"../chunks/BUaPampd.js";import{D as Zt}from"../chunks/91PQ6UtW.js";import{I as da}from"../chunks/DliFOxtc.js";import{D as sa}from"../chunks/oOdVuDuv.js";import{w as te}from"../chunks/BV_mDmfH.js";import{t as H}from"../chunks/Bgbd8SZ5.js";import{e as ee}from"../chunks/BZiHL9L3.js";import{e as E,i as J,j as ae,b as P,g as re}from"../chunks/DJsB5Z5V.js";var ia=_('

Loading scale set...

'),la=_('

'),na=_(' '),oa=_(' '),va=_('Default system template'),ca=_('
GitHub Runner Group
'),ma=_('

Extra Specifications

 
'),xa=_('

Basic Information

Scale Set ID
Name
Provider
Image
Flavor
Status
Entity
Created At
Updated At

Configuration

Max Runners
Min Idle Runners
Bootstrap Timeout
Runner Prefix
OS Type / Architecture
Runner Install Template
',1),ua=_(' ',1);function Ta(de,se){We(se,!1);const N=b();let e=b(null),j=b(!0),R=b(""),U=b(!1),B=b(!1),F=b(!1),p=b(null),C=null;async function pt(){if(!(!t(N)||isNaN(t(N))))try{v(j,!0),v(R,""),v(e,await O.getScaleSet(t(N))),t(e).instances||A(e,t(e).instances=[])}catch(d){v(R,d instanceof Error?d.message:"Failed to load scale set")}finally{v(j,!1)}}async function ie(d){if(t(e))try{await O.updateScaleSet(t(e).id,d),await pt(),H.success("Scale Set Updated",`Scale Set ${t(e).name} has been updated successfully.`),v(U,!1)}catch(l){throw l}}async function le(){if(t(e)){try{await O.deleteScaleSet(t(e).id),Yt(k("/scalesets"))}catch(d){const l=ee(d);H.error("Delete Failed",l)}v(B,!1)}}async function ne(){if(t(p)){try{await O.deleteInstance(t(p).name),H.success("Instance Deleted",`Instance ${t(p).name} has been deleted successfully.`)}catch(d){const l=ee(d);H.error("Delete Failed",l)}v(F,!1),v(p,null)}}function oe(d){v(p,d),v(F,!0)}function ve(d){if(!d)return"{}";try{if(typeof d=="string"){const l=JSON.parse(d);return JSON.stringify(l,null,2)}return JSON.stringify(d,null,2)}catch{return d.toString()}}function ce(d){if(d.operation==="update"){const l=d.payload;t(e)&&l.id===t(e).id&&v(e,l)}else if(d.operation==="delete"){const l=d.payload.id||d.payload;t(e)&&t(e).id===l&&Yt(k("/scalesets"))}}function me(d){if(!t(e))return;const l=d.payload;if(l.scale_set_id===t(e).id){if(t(e).instances||A(e,t(e).instances=[]),d.operation==="create")A(e,t(e).instances=[...t(e).instances,l]);else if(d.operation==="update")A(e,t(e).instances=t(e).instances.map(S=>S.id===l.id?l:S));else if(d.operation==="delete"){const S=l.id||l;A(e,t(e).instances=t(e).instances.filter(W=>W.id!==S))}v(e,t(e))}}Ke(()=>{pt();const d=te.subscribeToEntity("scaleset",["update","delete"],ce),l=te.subscribeToEntity("instance",["create","update","delete"],me);C=()=>{d(),l()}}),Qe(()=>{C&&(C(),C=null)}),Xe(()=>Xt,()=>{v(N,parseInt(Xt.params.id||"0"))}),Ye(),Ve();var _t=ua();Ze(d=>{h(()=>ea.title=`${t(e),i(()=>t(e)?`${t(e).name} - Scale Set Details`:"Scale Set Details")??""} - GARM`)});var q=T(_t),z=a(q),yt=a(z),V=a(yt),xe=a(V);r(V);var ht=s(V,2),bt=a(ht),kt=s(a(bt),2),ue=a(kt,!0);r(kt),r(bt),r(ht),r(yt),r(z);var ge=s(z,2);{var fe=d=>{var l=ia();u(d,l)},pe=d=>{var l=ft(),S=T(l);{var W=w=>{var I=la(),G=a(I),K=a(G,!0);r(G),r(I),h(()=>n(K,t(R))),u(w,I)},ke=w=>{var I=ft(),G=T(I);{var K=Q=>{var It=xa(),Dt=T(It);{let o=$(()=>(t(e),i(()=>t(e).name||"Scale Set"))),c=$(()=>(g(E),t(e),i(()=>E(t(e))))),m=$(()=>(g(J),t(e),i(()=>J(t(e))))),x=$(()=>(g(re),i(()=>re("github"))));sa(Dt,{get title(){return t(o)},get subtitle(){return`Scale set for ${t(c)??""} (${t(m)??""}) • GitHub Runner Scale Set`},get forgeIcon(){return t(x)},onEdit:()=>v(U,!0),onDelete:()=>v(B,!0)})}var X=s(Dt,2),Y=a(X),$t=a(Y),Et=s(a($t),2),Z=a(Et),Mt=s(a(Z),2),Se=a(Mt,!0);r(Mt),r(Z);var tt=s(Z,2),Tt=s(a(tt),2),we=a(Tt,!0);r(Tt),r(tt);var et=s(tt,2),At=s(a(et),2),Ie=a(At,!0);r(At),r(et);var at=s(et,2),Nt=s(a(at),2),Rt=a(Nt),De=a(Rt,!0);r(Rt),r(Nt),r(at);var rt=s(at,2),Ut=s(a(rt),2),$e=a(Ut,!0);r(Ut),r(rt);var dt=s(rt,2),Bt=s(a(dt),2),st=a(Bt),Ee=a(st,!0);r(st),r(Bt),r(dt);var it=s(dt,2),Ft=s(a(it),2),Ct=a(Ft),lt=a(Ct),Me=a(lt,!0);r(lt);var nt=s(lt,2),Te=a(nt,!0);r(nt),r(Ct),r(Ft),r(it);var ot=s(it,2),Gt=s(a(ot),2),Ae=a(Gt,!0);r(Gt),r(ot);var Lt=s(ot,2),Ot=s(a(Lt),2),Ne=a(Ot,!0);r(Ot),r(Lt),r(Et),r($t),r(Y);var Ht=s(Y,2),Jt=a(Ht),Pt=s(a(Jt),2),vt=a(Pt),jt=s(a(vt),2),Re=a(jt,!0);r(jt),r(vt);var ct=s(vt,2),qt=s(a(ct),2),Ue=a(qt,!0);r(qt),r(ct);var mt=s(ct,2),zt=s(a(mt),2),Be=a(zt);r(zt),r(mt);var xt=s(mt,2),Vt=s(a(xt),2),Fe=a(Vt,!0);r(Vt),r(xt);var ut=s(xt,2),Wt=s(a(ut),2),Ce=a(Wt);r(Wt),r(ut);var gt=s(ut,2),Kt=s(a(gt),2),Ge=a(Kt);{var Le=o=>{var c=na(),m=a(c,!0);r(c),h(x=>{L(c,"href",x),n(m,(t(e),i(()=>t(e).template_name)))},[()=>(g(k),t(e),i(()=>k(`/templates/${t(e).template_id}`)))]),u(o,c)},Oe=o=>{var c=ft(),m=T(c);{var x=y=>{var D=oa(),qe=a(D);r(D),h(ze=>{L(D,"href",ze),n(qe,`Template ID: ${t(e),i(()=>t(e).template_id)??""}`)},[()=>(g(k),t(e),i(()=>k(`/templates/${t(e).template_id}`)))]),u(y,D)},M=y=>{var D=va();u(y,D)};f(m,y=>{t(e),i(()=>t(e).template_id)?y(x):y(M,!1)},!0)}u(o,c)};f(Ge,o=>{t(e),i(()=>t(e).template_name)?o(Le):o(Oe,!1)})}r(Kt),r(gt);var He=s(gt,2);{var Je=o=>{var c=ca(),m=s(a(c),2),x=a(m,!0);r(m),r(c),h(()=>n(x,(t(e),i(()=>t(e)["github-runner-group"])))),u(o,c)};f(He,o=>{t(e),i(()=>t(e)["github-runner-group"])&&o(Je)})}r(Pt),r(Jt),r(Ht),r(X);var Qt=s(X,2);{var Pe=o=>{var c=ma(),m=a(c),x=s(a(m),2),M=a(x,!0);r(x),r(m),r(c),h(y=>n(M,y),[()=>(t(e),i(()=>ve(t(e).extra_specs)))]),u(o,c)};f(Qt,o=>{t(e),i(()=>t(e).extra_specs)&&o(Pe)})}var je=s(Qt,2);{let o=$(()=>(t(e),i(()=>t(e).instances||[])));da(je,{get instances(){return t(o)},entityType:"scaleset",onDeleteInstance:oe})}h((o,c,m,x,M)=>{n(Se,(t(e),i(()=>t(e).id))),n(we,(t(e),i(()=>t(e).name))),n(Ie,(t(e),i(()=>t(e).provider_name))),n(De,(t(e),i(()=>t(e).image))),n($e,(t(e),i(()=>t(e).flavor))),aa(st,1,`inline-flex px-2 py-1 text-xs font-medium rounded-full ${t(e),i(()=>t(e).enabled?"bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200":"bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200")??""}`),n(Ee,(t(e),i(()=>t(e).enabled?"Enabled":"Disabled"))),n(Me,o),L(nt,"href",c),n(Te,m),n(Ae,x),n(Ne,M),n(Re,(t(e),i(()=>t(e).max_runners))),n(Ue,(t(e),i(()=>t(e).min_idle_runners))),n(Be,`${t(e),i(()=>t(e).runner_bootstrap_timeout)??""} minutes`),n(Fe,(t(e),i(()=>t(e).runner_prefix||"garm"))),n(Ce,`${t(e),i(()=>t(e).os_type)??""} / ${t(e),i(()=>t(e).os_arch)??""}`)},[()=>(g(J),t(e),i(()=>J(t(e)))),()=>(g(ae),t(e),i(()=>ae(t(e)))),()=>(g(E),t(e),i(()=>E(t(e)))),()=>(g(P),t(e),i(()=>P(t(e).created_at||""))),()=>(g(P),t(e),i(()=>P(t(e).updated_at||"")))]),u(Q,It)};f(G,Q=>{t(e)&&Q(K)},!0)}u(w,I)};f(S,w=>{t(R)?w(W):w(ke,!1)},!0)}u(d,l)};f(ge,d=>{t(j)?d(fe):d(pe,!1)})}r(q);var St=s(q,2);{var _e=d=>{ra(d,{get scaleSet(){return t(e)},$$events:{close:()=>v(U,!1),submit:l=>ie(l.detail)}})};f(St,d=>{t(U)&&t(e)&&d(_e)})}var wt=s(St,2);{var ye=d=>{{let l=$(()=>(t(e),g(E),i(()=>`Scale Set ${t(e).name} (${E(t(e))})`)));Zt(d,{title:"Delete Scale Set",message:"Are you sure you want to delete this scale set? This action cannot be undone and will remove all associated runners.",get itemName(){return t(l)},$$events:{close:()=>v(B,!1),confirm:le}})}};f(wt,d=>{t(B)&&t(e)&&d(ye)})}var he=s(wt,2);{var be=d=>{Zt(d,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return t(p),i(()=>t(p).name)},$$events:{close:()=>{v(F,!1),v(p,null)},confirm:ne}})};f(he,d=>{t(F)&&t(p)&&d(be)})}h(d=>{L(xe,"href",d),n(ue,(t(e),i(()=>t(e)?t(e).name:"Loading...")))},[()=>(g(k),i(()=>k("/scalesets")))]),u(de,_t),ta()}export{Ta as component}; diff --git a/webapp/assets/_app/immutable/nodes/19.CWBEFCxV.js b/webapp/assets/_app/immutable/nodes/19.CWBEFCxV.js new file mode 100644 index 00000000..7b1fddee --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/19.CWBEFCxV.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as we}from"../chunks/C7KraPli.js";import{p as be,o as Te,l as b,h as $e,f as se,j as ke,a as D,b as h,c as Le,g as e,m as l,$ as Pe,k as a,B as O,u as n,s as T,q as d,v as E,d as $,r as k,z as Ae,D as ee,t as te,e as ae}from"../chunks/cPTQ2Ibn.js";import{i as L,s as Me,a as De}from"../chunks/DqFqoVWr.js";import{g as B}from"../chunks/CTvJf3dP.js";import{d as I,g as Ee}from"../chunks/DqbUkQgD.js";import{P as Be}from"../chunks/U3V4g_hv.js";import{A as Ie}from"../chunks/C2rI8IaC.js";import{D as Se,G as S,A as Fe}from"../chunks/Du50aAe5.js";import{t as q}from"../chunks/Bgbd8SZ5.js";import{e as Ge}from"../chunks/BZiHL9L3.js";import{B as re}from"../chunks/DJsB5Z5V.js";import{D as Re}from"../chunks/91PQ6UtW.js";import{E as ze}from"../chunks/CPFytHjx.js";import{i as Ue}from"../chunks/C98nByjP.js";import{e as Ne,a as oe}from"../chunks/JUkrBp3F.js";var Oe=se('

Error loading templates

'),qe=se(" ",1);function lt(le,ne){be(ne,!1);const[ie,de]=Me(),g=()=>De(Ne,"$eagerCache",ie),F=l(),G=l(),f=l(),H=l();let y=l([]),P=l(""),m=l(""),i=l(1),v=l(25),x=l(1),A=l(!1),c=l(null);async function ce(){try{await oe.retryResource("templates")}catch(t){console.error("Retry failed:",t)}}async function me(){if(e(c)?.id)try{await Ee.deleteTemplate(e(c).id),q.add({type:"success",title:"Template deleted",message:`Template "${e(c).name}" has been deleted successfully.`}),a(A,!1),a(c,null)}catch(t){const r=Ge(t);q.add({type:"error",title:"Failed to delete template",message:r})}}function pe(){B(I("/templates/create"))}async function j(t){if(!t.id){q.add({type:"error",title:"Error",message:"Template ID is missing"});return}B(I(`/templates/create?clone=${t.id}`))}function W(t){a(c,t),a(A,!0)}function J(t){switch(t){case"github":return{color:"blue",text:"GitHub"};case"gitea":return{color:"green",text:"Gitea"};default:return{color:"gray",text:t||"Unknown"}}}function K(t){switch(t){case"linux":return{color:"blue",text:"Linux"};case"windows":return{color:"info",text:"Windows"};default:return{color:"gray",text:t||"Unknown"}}}const ue=[{key:"name",title:"Name",cellComponent:ze,cellProps:{entityType:"template"}},{key:"description",title:"Description",cellComponent:S,cellProps:{field:"description",type:"description"}},{key:"forge_type",title:"Forge Type",cellComponent:S,cellProps:{field:"forge_type"}},{key:"os_type",title:"OS Type",cellComponent:S,cellProps:{field:"os_type"}},{key:"owner_id",title:"Owner",cellComponent:S,cellProps:{field:"owner_id"}},{key:"actions",title:"Actions",align:"right",cellComponent:Fe,cellProps:t=>{const r=Ue(),s=t.owner_id==="system",o=[];return o.push({type:"copy",title:"Clone",ariaLabel:"Clone template",action:"clone"}),(r||!s)&&o.push({type:"edit",title:"Edit",ariaLabel:"Edit template",action:"edit"}),(r||!s)&&o.push({type:"delete",title:"Delete",ariaLabel:"Delete template",action:"delete"}),{actions:o}}}],ge={entityType:"template",primaryText:{field:"name",isClickable:!0,href:"/templates/{id}"},secondaryText:{field:"description"},badges:[{type:"custom",value:t=>{const r=J(t.forge_type);return{variant:r.color,text:r.text}}},{type:"custom",value:t=>{const r=K(t.os_type);return{variant:r.color,text:r.text}}}],actions:[{type:"clone",handler:t=>j(t)},{type:"edit",handler:t=>B(I(`/templates/${t.id}?edit=true`))},{type:"delete",handler:t=>W(t)}]};Te(async()=>{try{const t=await oe.getTemplates();t&&Array.isArray(t)&&a(y,t)}catch(t){console.error("Failed to load templates:",t),a(P,t instanceof Error?t.message:"Failed to load templates")}}),b(()=>(e(y),g()),()=>{(!e(y).length||g().loaded.templates)&&a(y,g().templates)}),b(()=>g(),()=>{a(F,g().loading.templates)}),b(()=>g(),()=>{a(G,g().errorMessages.templates)}),b(()=>(e(m),e(y)),()=>{a(f,e(m)?e(y).filter(t=>t.name?.toLowerCase().includes(e(m).toLowerCase())||t.description?.toLowerCase().includes(e(m).toLowerCase())||t.forge_type?.toLowerCase().includes(e(m).toLowerCase())||t.os_type?.toLowerCase().includes(e(m).toLowerCase())):e(y))}),b(()=>(e(x),e(f),e(v),e(i)),()=>{a(x,Math.ceil(e(f).length/e(v))),e(i)>e(x)&&e(x)>0&&a(i,e(x))}),b(()=>(e(f),e(i),e(v)),()=>{a(H,e(f).slice((e(i)-1)*e(v),e(i)*e(v)))}),$e(),we();var Q=qe();ke(t=>{Pe.title="Runner Install Templates - GARM"});var V=D(Q);Be(V,{title:"Runner Install Templates",description:"Manage templates for configuring runner software installation. These templates can be set on pools or scale sets.",actionLabel:"Create Template",showAction:!0,$$events:{action:pe}});var X=T(V,2);{var fe=t=>{var r=Oe(),s=$(r),o=T($(s),2),C=T($(o),2),R=$(C,!0);k(C);var M=T(C,2),z=$(M);Ie(z,{variant:"secondary",size:"sm",$$events:{click:ce},children:(p,u)=>{Ae();var U=ee("Try Again");h(p,U)},$$slots:{default:!0}}),k(M),k(o),k(s),k(r),te(()=>ae(R,e(P)||e(G))),h(t,r)};L(X,t=>{(e(P)||e(G))&&!e(F)&&t(fe)})}var Y=T(X,2);Se(Y,{get columns(){return ue},get data(){return e(H)},get loading(){return e(F)},get error(){return e(P)},get searchTerm(){return e(m)},searchPlaceholder:"Search templates by name, description, type...",get currentPage(){return e(i)},get perPage(){return e(v)},get totalPages(){return e(x)},get totalItems(){return e(f),n(()=>e(f).length)},get mobileCardConfig(){return ge},emptyMessage:"No templates found",$$events:{search:t=>{a(m,t.detail.term),a(i,1)},pageChange:t=>a(i,t.detail.page),perPageChange:t=>{a(v,t.detail.perPage),a(i,1)},clone:t=>j(t.detail.item),edit:t=>B(I(`/templates/${t.detail.item.id}?edit=true`)),delete:t=>W(t.detail.item)},$$slots:{cell:(t,r)=>{const s=E(()=>r.item),o=E(()=>r.column);var C=O(),R=D(C);{var M=p=>{const u=E(()=>(d(e(s)),n(()=>J(e(s).forge_type))));re(p,{get variant(){return d(e(u)),n(()=>e(u).color)},get text(){return d(e(u)),n(()=>e(u).text)}})},z=p=>{var u=O(),U=D(u);{var _e=w=>{const _=E(()=>(d(e(s)),n(()=>K(e(s).os_type))));re(w,{get variant(){return d(e(_)),n(()=>e(_).color)},get text(){return d(e(_)),n(()=>e(_).text)}})},he=w=>{var _=O(),xe=D(_);{var Ce=N=>{var Z=ee();te(()=>ae(Z,(d(e(s)),n(()=>e(s).owner_id==="system"?"System":e(s).owner_id||"Unknown")))),h(N,Z)};L(xe,N=>{d(e(o)),n(()=>e(o).key==="owner_id")&&N(Ce)},!0)}h(w,_)};L(U,w=>{d(e(o)),n(()=>e(o).key==="os_type")?w(_e):w(he,!1)},!0)}h(p,u)};L(R,p=>{d(e(o)),n(()=>e(o).key==="forge_type")?p(M):p(z,!1)})}h(t,C)}}});var ye=T(Y,2);{var ve=t=>{Re(t,{title:"Delete Template",message:"Are you sure you want to delete this template? This action cannot be undone.",get itemName(){return e(c),n(()=>e(c).name)},$$events:{close:()=>{a(A,!1),a(c,null)},confirm:me}})};L(ye,t=>{e(A)&&e(c)&&t(ve)})}h(le,Q),Le(),de()}export{lt as component}; diff --git a/webapp/assets/_app/immutable/nodes/2.C24-dbK7.js b/webapp/assets/_app/immutable/nodes/2.C24-dbK7.js new file mode 100644 index 00000000..eb3a8799 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/2.C24-dbK7.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as Fe}from"../chunks/C7KraPli.js";import{f as h,s as a,d as r,r as t,t as D,e as S,b as m,B as He,a as ze,p as Oe,E as vt,l as Le,k as v,m as I,g as e,h as Ne,C as ut,z as ve,q as _,u,c as Qe,i as Ge,o as mt,A as gt,j as bt,$ as pt,w as Q}from"../chunks/cPTQ2Ibn.js";import{p as fe,i as z,s as ft,a as xt}from"../chunks/DqFqoVWr.js";import{e as ht,i as kt}from"../chunks/CiWDXYQd.js";import{s as xe,B as yt,r as Me,g as Ke,d as q,c as ue}from"../chunks/DqbUkQgD.js";import{w as Ue}from"../chunks/BV_mDmfH.js";import{e as _t,a as Ce}from"../chunks/JUkrBp3F.js";import{b as Re}from"../chunks/B-_QCM7E.js";import{p as wt}from"../chunks/D4Caz1gY.js";import{M as Mt}from"../chunks/Bo3f8OIz.js";import{t as Je}from"../chunks/Bgbd8SZ5.js";import{e as Ut}from"../chunks/BZiHL9L3.js";var Ct=h('
'),Rt=h('
'),zt=h('
'),Lt=h('
'),St=h('
');function pe(me,V){let f=fe(V,"title",8),re=fe(V,"content",8),s=fe(V,"position",8,"top"),ae=fe(V,"width",8,"w-80");var l=St(),k=a(r(l),2),p=r(k),y=r(p,!0);t(p);var d=a(p,2),L=r(d,!0);t(d);var oe=a(d,2);{var ge=E=>{var P=Ct();m(E,P)},se=E=>{var P=He(),J=ze(P);{var F=j=>{var T=Rt();m(j,T)},K=j=>{var T=He(),ie=ze(T);{var le=$=>{var H=zt();m($,H)},ne=$=>{var H=He(),X=ze(H);{var de=i=>{var o=Lt();m(i,o)};z(X,i=>{s()==="right"&&i(de)},!0)}m($,H)};z(ie,$=>{s()==="left"?$(le):$(ne,!1)},!0)}m(j,T)};z(J,j=>{s()==="bottom"?j(F):j(K,!1)},!0)}m(E,P)};z(oe,E=>{s()==="top"?E(ge):E(se,!1)})}t(k),t(l),D(()=>{xe(k,1,`absolute ${s()==="top"?"bottom-full":s()==="bottom"?"top-full":s()==="left"?"right-full top-1/2 -translate-y-1/2":"left-full top-1/2 -translate-y-1/2"} left-1/2 transform -translate-x-1/2 ${s()==="top"?"mb-2":s()==="bottom"?"mt-2":"mx-2"} ${ae()??""} p-3 bg-gray-900 text-white text-xs rounded-lg shadow-lg opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 z-50`),S(y,f()),S(L,re())}),m(me,l)}var jt=ut(' Settings',1),$t=h('
Metadata
'),Bt=h('
Callback
'),At=h('
Webhook
'),It=h('

No URLs configured

'),Et=h('
Controller Webhook URL

Use this URL in your GitHub organization/repository webhook settings

'),Ht=h('

Please enter a valid URL

'),Gt=h('

Please enter a valid URL

'),qt=h('

Please enter a valid URL

'),Pt=h('

Controller Settings

URL where runners can fetch metadata and setup information

URL where runners send status updates and lifecycle events

URL where GitHub/Gitea will send webhook events for job notifications

Time to wait before spinning up a runner for a new job (0 = immediate)

'),Tt=h('

Controller Information

Identity

Controller ID
Hostname
Job Age Backoff

Integration URLs

',1);function Dt(me,V){Oe(V,!1);const f=I(),re=I();let s=fe(V,"controllerInfo",12);const ae=vt();let l=I(!1),k=I(!1),p=I(""),y=I(""),d=I(""),L=I(null);function oe(){v(p,s().metadata_url||""),v(y,s().callback_url||""),v(d,s().webhook_url||""),v(L,s().minimum_job_age_backoff||null),v(l,!0)}async function ge(){try{v(k,!0);const n={};e(p).trim()&&(n.metadata_url=e(p).trim()),e(y).trim()&&(n.callback_url=e(y).trim()),e(d).trim()&&(n.webhook_url=e(d).trim()),e(L)!==null&&e(L)>=0&&(n.minimum_job_age_backoff=e(L));const c=await Ke.updateController(n);Je.success("Settings Updated","Controller settings have been updated successfully."),v(l,!1),s(c),ae("updated",c)}catch(n){Je.error("Update Failed",n instanceof Error?n.message:"Failed to update controller settings")}finally{v(k,!1)}}function se(){v(l,!1),v(p,""),v(y,""),v(d,""),v(L,null)}Le(()=>{},()=>{v(f,n=>{if(!n.trim())return!0;try{return new URL(n),!0}catch{return!1}})}),Le(()=>(e(f),e(p),e(y),e(d),e(L)),()=>{v(re,e(f)(e(p))&&e(f)(e(y))&&e(f)(e(d))&&(e(L)===null||e(L)>=0))}),Ne(),Fe();var E=Tt(),P=ze(E),J=r(P),F=r(J),K=r(F),j=a(r(K),2),T=a(r(j),2),ie=r(T),le=r(ie);t(ie),t(T),t(j),t(K);var ne=a(K,2);yt(ne,{variant:"secondary",size:"sm",$$events:{click:oe},children:(n,c)=>{var b=jt();ve(),m(n,b)},$$slots:{default:!0}}),t(F);var $=a(F,2),H=r($),X=r(H),de=a(r(X),2),i=r(de),o=a(r(i),2),w=r(o,!0);t(o),t(i);var M=a(i,2),x=a(r(M),2),U=r(x,!0);t(x),t(M);var A=a(M,2),W=r(A),Y=a(r(W),2),Z=r(Y);pe(Z,{title:"Job Age Backoff",content:"Time in seconds GARM waits after receiving a new job before spinning up a runner. This delay allows existing idle runners to pick up jobs first, preventing unnecessary runner creation. Set to 0 for immediate response."}),t(Y),t(W);var O=a(W,2),N=r(O);t(O),t(A),t(de),t(X),t(H);var ee=a(H,2),ce=r(ee),he=a(r(ce),2),ke=r(he);{var Se=n=>{var c=$t(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Metadata URL",content:"URL where runners retrieve setup information and metadata. Runners must be able to connect to this URL during their initialization process. Usually accessible at /api/v1/metadata endpoint."}),t(C),t(b);var R=a(b,2),B=r(R,!0);t(R),t(c),D(()=>S(B,(_(s()),u(()=>s().metadata_url)))),m(n,c)};z(ke,n=>{_(s()),u(()=>s().metadata_url)&&n(Se)})}var qe=a(ke,2);{var Xe=n=>{var c=Bt(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Callback URL",content:"URL where runners send status updates and system information (OS version, runner agent ID, etc.) to the controller. Runners must be able to connect to this URL. Usually accessible at /api/v1/callbacks endpoint."}),t(C),t(b);var R=a(b,2),B=r(R,!0);t(R),t(c),D(()=>S(B,(_(s()),u(()=>s().callback_url)))),m(n,c)};z(qe,n=>{_(s()),u(()=>s().callback_url)&&n(Xe)})}var Pe=a(qe,2);{var Ye=n=>{var c=At(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Webhook Base URL",content:"Base URL for webhooks where GitHub sends job notifications. GARM needs to receive these webhooks to know when to create new runners for jobs. GitHub must be able to connect to this URL. Usually accessible at /webhooks endpoint."}),t(C),t(b);var R=a(b,2),B=r(R,!0);t(R),t(c),D(()=>S(B,(_(s()),u(()=>s().webhook_url)))),m(n,c)};z(Pe,n=>{_(s()),u(()=>s().webhook_url)&&n(Ye)})}var Ze=a(Pe,2);{var et=n=>{var c=It(),b=a(r(c),4);t(c),Ge("click",b,oe),m(n,c)};z(Ze,n=>{_(s()),u(()=>!s().metadata_url&&!s().callback_url&&!s().webhook_url)&&n(et)})}t(he),t(ce),t(ee),t($);var tt=a($,2);{var rt=n=>{var c=Et(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Controller Webhook URL",content:"Unique webhook URL for this GARM controller. This is the preferred URL to use in GitHub webhook settings as it's controller-specific and allows multiple GARM controllers to work with the same repository. Automatically combines the webhook base URL with the controller ID."}),t(C),t(b);var R=a(b,2),B=r(R),be=a(r(B),2),ye=r(be),je=r(ye,!0);t(ye),ve(2),t(be),t(B),t(R),t(c),D(()=>S(je,(_(s()),u(()=>s().controller_webhook_url)))),m(n,c)};z(tt,n=>{_(s()),u(()=>s().controller_webhook_url)&&n(rt)})}t(J),t(P);var at=a(P,2);{var ot=n=>{Mt(n,{$$events:{close:se},children:(c,b)=>{var C=Pt(),G=a(r(C),2),R=r(G),B=a(r(R),2);Me(B);let be;var ye=a(B,2);{var je=g=>{var te=Ht();m(g,te)};z(ye,g=>{e(f),e(p),u(()=>!e(f)(e(p)))&&g(je)})}ve(2),t(R);var $e=a(R,2),_e=a(r($e),2);Me(_e);let Te;var st=a(_e,2);{var it=g=>{var te=Gt();m(g,te)};z(st,g=>{e(f),e(y),u(()=>!e(f)(e(y)))&&g(it)})}ve(2),t($e);var Be=a($e,2),we=a(r(Be),2);Me(we);let De;var lt=a(we,2);{var nt=g=>{var te=qt();m(g,te)};z(lt,g=>{e(f),e(d),u(()=>!e(f)(e(d)))&&g(nt)})}ve(2),t(Be);var Ae=a(Be,2),Ve=a(r(Ae),2);Me(Ve),ve(2),t(Ae);var We=a(Ae,2),Ie=r(We),Ee=a(Ie,2),dt=r(Ee,!0);t(Ee),t(We),t(G),t(C),D((g,te,ct)=>{be=xe(B,1,"block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white sm:text-sm",null,be,g),Te=xe(_e,1,"block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white sm:text-sm",null,Te,te),De=xe(we,1,"block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white sm:text-sm",null,De,ct),Ie.disabled=e(k),Ee.disabled=!e(re)||e(k),S(dt,e(k)?"Saving...":"Save Changes")},[()=>({"border-red-300":!e(f)(e(p))}),()=>({"border-red-300":!e(f)(e(y))}),()=>({"border-red-300":!e(f)(e(d))})]),Re(B,()=>e(p),g=>v(p,g)),Re(_e,()=>e(y),g=>v(y,g)),Re(we,()=>e(d),g=>v(d,g)),Re(Ve,()=>e(L),g=>v(L,g)),Ge("click",Ie,se),Ge("submit",G,wt(ge)),m(c,C)},$$slots:{default:!0}})};z(at,n=>{e(l)&&n(ot)})}D(n=>{S(le,`v${n??""}`),S(w,(_(s()),u(()=>s().controller_id))),S(U,(_(s()),u(()=>s().hostname||"Unknown"))),S(N,`${_(s()),u(()=>s().minimum_job_age_backoff||30)??""}s`)},[()=>(_(s()),u(()=>s().version?.replace(/^v/,"")||"Unknown"))]),m(me,E),Qe()}var Vt=h('

Error loading dashboard

'),Wt=h('
'),Jt=h('

Dashboard

Welcome to GARM - GitHub Actions Runner Manager

');function sr(me,V){Oe(V,!1);const[f,re]=ft(),s=()=>xt(_t,"$eagerCache",f),ae=I();let l=I({repositories:0,organizations:0,pools:0,instances:0}),k=I(null),p=I(""),y=[];function d(i,o,w=1e3){const M=parseInt(i.textContent||"0"),x=(o-M)/(w/16);let U=M;const A=()=>{if(U+=x,x>0&&U>=o||x<0&&U<=o){i.textContent=o.toString();return}i.textContent=Math.floor(U).toString(),requestAnimationFrame(A)};M!==o&&requestAnimationFrame(A)}mt(async()=>{try{const[x,U,A,W,Y]=await Promise.all([Ce.getRepositories(),Ce.getOrganizations(),Ce.getPools(),Ke.listInstances(),Ce.getControllerInfo()]);setTimeout(()=>{const Z=document.querySelector('[data-stat="repositories"]'),O=document.querySelector('[data-stat="organizations"]'),N=document.querySelector('[data-stat="pools"]'),ee=document.querySelector('[data-stat="instances"]');Z&&d(Z,x.length),O&&d(O,U.length),N&&d(N,A.length),ee&&d(ee,W.length)},100),v(l,{repositories:x.length,organizations:U.length,pools:A.length,instances:W.length}),Y&&v(k,Y)}catch(x){v(p,Ut(x)),console.error("Dashboard error:",x)}const i=Ue.subscribeToEntity("repository",["create","delete"],L),o=Ue.subscribeToEntity("organization",["create","delete"],oe),w=Ue.subscribeToEntity("pool",["create","delete"],ge),M=Ue.subscribeToEntity("instance",["create","delete"],se);y=[i,o,w,M]}),gt(()=>{y.forEach(i=>i())});function L(i){const o=document.querySelector('[data-stat="repositories"]');i.operation==="create"?(Q(l,e(l).repositories++),o&&d(o,e(l).repositories,500)):i.operation==="delete"&&(Q(l,e(l).repositories=Math.max(0,e(l).repositories-1)),o&&d(o,e(l).repositories,500))}function oe(i){const o=document.querySelector('[data-stat="organizations"]');i.operation==="create"?(Q(l,e(l).organizations++),o&&d(o,e(l).organizations,500)):i.operation==="delete"&&(Q(l,e(l).organizations=Math.max(0,e(l).organizations-1)),o&&d(o,e(l).organizations,500))}function ge(i){const o=document.querySelector('[data-stat="pools"]');i.operation==="create"?(Q(l,e(l).pools++),o&&d(o,e(l).pools,500)):i.operation==="delete"&&(Q(l,e(l).pools=Math.max(0,e(l).pools-1)),o&&d(o,e(l).pools,500))}function se(i){const o=document.querySelector('[data-stat="instances"]');i.operation==="create"?(Q(l,e(l).instances++),o&&d(o,e(l).instances,500)):i.operation==="delete"&&(Q(l,e(l).instances=Math.max(0,e(l).instances-1)),o&&d(o,e(l).instances,500))}function E(i){v(k,i.detail)}function P(i){return{blue:"bg-blue-500 text-white",green:"bg-green-500 text-white",purple:"bg-purple-500 text-white",yellow:"bg-yellow-500 text-white"}[i]||"bg-gray-500 text-white"}Le(()=>(e(k),s()),()=>{(!e(k)||s().loaded.controllerInfo)&&v(k,s().controllerInfo)}),Le(()=>(e(l),q),()=>{v(ae,[{title:"Repositories",value:e(l).repositories,icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z",color:"blue",href:q("/repositories")},{title:"Organizations",value:e(l).organizations,icon:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z",color:"green",href:q("/organizations")},{title:"Pools",value:e(l).pools,icon:"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z",color:"purple",href:q("/pools")},{title:"Instances",value:e(l).instances,icon:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z",color:"yellow",href:q("/instances")}])}),Ne(),Fe();var J=Jt();bt(i=>{pt.title="Dashboard - GARM"});var F=a(r(J),2);{var K=i=>{var o=Vt(),w=r(o),M=a(r(w),2),x=a(r(M),2),U=r(x,!0);t(x),t(M),t(w),t(o),D(()=>S(U,e(p))),m(i,o)};z(F,i=>{e(p)&&i(K)})}var j=a(F,2);ht(j,5,()=>e(ae),kt,(i,o)=>{var w=Wt(),M=r(w),x=r(M),U=r(x),A=r(U),W=r(A),Y=r(W);t(W),t(A),t(U);var Z=a(U,2),O=r(Z),N=r(O),ee=r(N,!0);t(N);var ce=a(N,2),he=r(ce,!0);t(ce),t(O),t(Z),t(x),t(M),t(w),D((ke,Se)=>{ue(w,"href",(e(o),u(()=>e(o).href))),xe(A,1,`w-8 h-8 rounded-md ${ke??""} flex items-center justify-center`),ue(Y,"d",(e(o),u(()=>e(o).icon))),S(ee,(e(o),u(()=>e(o).title))),ue(ce,"data-stat",Se),S(he,(e(o),u(()=>e(o).value)))},[()=>(e(o),u(()=>P(e(o).color))),()=>(e(o),u(()=>e(o).title.toLowerCase()))]),m(i,w)}),t(j);var T=a(j,2);{var ie=i=>{Dt(i,{get controllerInfo(){return e(k)},$$events:{updated:E}})};z(T,i=>{e(k)&&i(ie)})}var le=a(T,2),ne=r(le),$=a(r(ne),4),H=r($),X=a(H,2),de=a(X,2);t($),t(ne),t(le),t(J),D((i,o,w)=>{ue(H,"href",i),ue(X,"href",o),ue(de,"href",w)},[()=>(_(q),u(()=>q("/repositories"))),()=>(_(q),u(()=>q("/pools"))),()=>(_(q),u(()=>q("/instances")))]),m(me,J),Qe(),re()}export{sr as component}; diff --git a/webapp/assets/_app/immutable/nodes/2.gx-OccLZ.js b/webapp/assets/_app/immutable/nodes/2.gx-OccLZ.js deleted file mode 100644 index fbf136fb..00000000 --- a/webapp/assets/_app/immutable/nodes/2.gx-OccLZ.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Fe}from"../chunks/DT0EGONV.js";import{f as h,k as a,j as r,r as t,t as D,v as S,c as m,B as He,b as ze,p as Oe,E as vt,l as Le,s as v,m as I,g as e,a as Ne,C as ut,z as ve,n as _,u,d as Qe,e as Ge,o as mt,A as gt,h as bt,$ as pt,w as Q}from"../chunks/CRKWEg6v.js";import{p as fe,i as z,s as ft,a as xt}from"../chunks/e1m7WRO5.js";import{e as ht,w as Me,i as kt}from"../chunks/C73ZVvpW.js";import{s as xe,B as yt,r as Ue,g as Ke,d as P,c as ue}from"../chunks/-esynYXT.js";import{e as _t,a as Ce}from"../chunks/Djd10kRn.js";import{b as Re}from"../chunks/B3a35v7J.js";import{p as wt}from"../chunks/D4Caz1gY.js";import{M as Mt}from"../chunks/xe-4nY5o.js";import{t as Je}from"../chunks/D6DjlyIQ.js";import{e as Ut}from"../chunks/BZiHL9L3.js";var Ct=h('
'),Rt=h('
'),zt=h('
'),Lt=h('
'),St=h('
');function pe(me,V){let f=fe(V,"title",8),re=fe(V,"content",8),s=fe(V,"position",8,"top"),ae=fe(V,"width",8,"w-80");var l=St(),k=a(r(l),2),p=r(k),y=r(p,!0);t(p);var d=a(p,2),L=r(d,!0);t(d);var oe=a(d,2);{var ge=E=>{var q=Ct();m(E,q)},se=E=>{var q=He(),J=ze(q);{var F=j=>{var T=Rt();m(j,T)},K=j=>{var T=He(),ie=ze(T);{var le=$=>{var H=zt();m($,H)},ne=$=>{var H=He(),X=ze(H);{var de=i=>{var o=Lt();m(i,o)};z(X,i=>{s()==="right"&&i(de)},!0)}m($,H)};z(ie,$=>{s()==="left"?$(le):$(ne,!1)},!0)}m(j,T)};z(J,j=>{s()==="bottom"?j(F):j(K,!1)},!0)}m(E,q)};z(oe,E=>{s()==="top"?E(ge):E(se,!1)})}t(k),t(l),D(()=>{xe(k,1,`absolute ${s()==="top"?"bottom-full":s()==="bottom"?"top-full":s()==="left"?"right-full top-1/2 -translate-y-1/2":"left-full top-1/2 -translate-y-1/2"} left-1/2 transform -translate-x-1/2 ${s()==="top"?"mb-2":s()==="bottom"?"mt-2":"mx-2"} ${ae()??""} p-3 bg-gray-900 text-white text-xs rounded-lg shadow-lg opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 z-50`),S(y,f()),S(L,re())}),m(me,l)}var jt=ut(' Settings',1),$t=h('
Metadata
'),Bt=h('
Callback
'),At=h('
Webhook
'),It=h('

No URLs configured

'),Et=h('
Controller Webhook URL

Use this URL in your GitHub organization/repository webhook settings

'),Ht=h('

Please enter a valid URL

'),Gt=h('

Please enter a valid URL

'),Pt=h('

Please enter a valid URL

'),qt=h('

Controller Settings

URL where runners can fetch metadata and setup information

URL where runners send status updates and lifecycle events

URL where GitHub/Gitea will send webhook events for job notifications

Time to wait before spinning up a runner for a new job (0 = immediate)

'),Tt=h('

Controller Information

Identity

Controller ID
Hostname
Job Age Backoff

Integration URLs

',1);function Dt(me,V){Oe(V,!1);const f=I(),re=I();let s=fe(V,"controllerInfo",12);const ae=vt();let l=I(!1),k=I(!1),p=I(""),y=I(""),d=I(""),L=I(null);function oe(){v(p,s().metadata_url||""),v(y,s().callback_url||""),v(d,s().webhook_url||""),v(L,s().minimum_job_age_backoff||null),v(l,!0)}async function ge(){try{v(k,!0);const n={};e(p).trim()&&(n.metadata_url=e(p).trim()),e(y).trim()&&(n.callback_url=e(y).trim()),e(d).trim()&&(n.webhook_url=e(d).trim()),e(L)!==null&&e(L)>=0&&(n.minimum_job_age_backoff=e(L));const c=await Ke.updateController(n);Je.success("Settings Updated","Controller settings have been updated successfully."),v(l,!1),s(c),ae("updated",c)}catch(n){Je.error("Update Failed",n instanceof Error?n.message:"Failed to update controller settings")}finally{v(k,!1)}}function se(){v(l,!1),v(p,""),v(y,""),v(d,""),v(L,null)}Le(()=>{},()=>{v(f,n=>{if(!n.trim())return!0;try{return new URL(n),!0}catch{return!1}})}),Le(()=>(e(f),e(p),e(y),e(d),e(L)),()=>{v(re,e(f)(e(p))&&e(f)(e(y))&&e(f)(e(d))&&(e(L)===null||e(L)>=0))}),Ne(),Fe();var E=Tt(),q=ze(E),J=r(q),F=r(J),K=r(F),j=a(r(K),2),T=a(r(j),2),ie=r(T),le=r(ie);t(ie),t(T),t(j),t(K);var ne=a(K,2);yt(ne,{variant:"secondary",size:"sm",$$events:{click:oe},children:(n,c)=>{var b=jt();ve(),m(n,b)},$$slots:{default:!0}}),t(F);var $=a(F,2),H=r($),X=r(H),de=a(r(X),2),i=r(de),o=a(r(i),2),w=r(o,!0);t(o),t(i);var M=a(i,2),x=a(r(M),2),U=r(x,!0);t(x),t(M);var A=a(M,2),W=r(A),Y=a(r(W),2),Z=r(Y);pe(Z,{title:"Job Age Backoff",content:"Time in seconds GARM waits after receiving a new job before spinning up a runner. This delay allows existing idle runners to pick up jobs first, preventing unnecessary runner creation. Set to 0 for immediate response."}),t(Y),t(W);var O=a(W,2),N=r(O);t(O),t(A),t(de),t(X),t(H);var ee=a(H,2),ce=r(ee),he=a(r(ce),2),ke=r(he);{var Se=n=>{var c=$t(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Metadata URL",content:"URL where runners retrieve setup information and metadata. Runners must be able to connect to this URL during their initialization process. Usually accessible at /api/v1/metadata endpoint."}),t(C),t(b);var R=a(b,2),B=r(R,!0);t(R),t(c),D(()=>S(B,(_(s()),u(()=>s().metadata_url)))),m(n,c)};z(ke,n=>{_(s()),u(()=>s().metadata_url)&&n(Se)})}var Pe=a(ke,2);{var Xe=n=>{var c=Bt(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Callback URL",content:"URL where runners send status updates and system information (OS version, runner agent ID, etc.) to the controller. Runners must be able to connect to this URL. Usually accessible at /api/v1/callbacks endpoint."}),t(C),t(b);var R=a(b,2),B=r(R,!0);t(R),t(c),D(()=>S(B,(_(s()),u(()=>s().callback_url)))),m(n,c)};z(Pe,n=>{_(s()),u(()=>s().callback_url)&&n(Xe)})}var qe=a(Pe,2);{var Ye=n=>{var c=At(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Webhook Base URL",content:"Base URL for webhooks where GitHub sends job notifications. GARM needs to receive these webhooks to know when to create new runners for jobs. GitHub must be able to connect to this URL. Usually accessible at /webhooks endpoint."}),t(C),t(b);var R=a(b,2),B=r(R,!0);t(R),t(c),D(()=>S(B,(_(s()),u(()=>s().webhook_url)))),m(n,c)};z(qe,n=>{_(s()),u(()=>s().webhook_url)&&n(Ye)})}var Ze=a(qe,2);{var et=n=>{var c=It(),b=a(r(c),4);t(c),Ge("click",b,oe),m(n,c)};z(Ze,n=>{_(s()),u(()=>!s().metadata_url&&!s().callback_url&&!s().webhook_url)&&n(et)})}t(he),t(ce),t(ee),t($);var tt=a($,2);{var rt=n=>{var c=Et(),b=r(c),C=a(r(b),2),G=r(C);pe(G,{title:"Controller Webhook URL",content:"Unique webhook URL for this GARM controller. This is the preferred URL to use in GitHub webhook settings as it's controller-specific and allows multiple GARM controllers to work with the same repository. Automatically combines the webhook base URL with the controller ID."}),t(C),t(b);var R=a(b,2),B=r(R),be=a(r(B),2),ye=r(be),je=r(ye,!0);t(ye),ve(2),t(be),t(B),t(R),t(c),D(()=>S(je,(_(s()),u(()=>s().controller_webhook_url)))),m(n,c)};z(tt,n=>{_(s()),u(()=>s().controller_webhook_url)&&n(rt)})}t(J),t(q);var at=a(q,2);{var ot=n=>{Mt(n,{$$events:{close:se},children:(c,b)=>{var C=qt(),G=a(r(C),2),R=r(G),B=a(r(R),2);Ue(B);let be;var ye=a(B,2);{var je=g=>{var te=Ht();m(g,te)};z(ye,g=>{e(f),e(p),u(()=>!e(f)(e(p)))&&g(je)})}ve(2),t(R);var $e=a(R,2),_e=a(r($e),2);Ue(_e);let Te;var st=a(_e,2);{var it=g=>{var te=Gt();m(g,te)};z(st,g=>{e(f),e(y),u(()=>!e(f)(e(y)))&&g(it)})}ve(2),t($e);var Be=a($e,2),we=a(r(Be),2);Ue(we);let De;var lt=a(we,2);{var nt=g=>{var te=Pt();m(g,te)};z(lt,g=>{e(f),e(d),u(()=>!e(f)(e(d)))&&g(nt)})}ve(2),t(Be);var Ae=a(Be,2),Ve=a(r(Ae),2);Ue(Ve),ve(2),t(Ae);var We=a(Ae,2),Ie=r(We),Ee=a(Ie,2),dt=r(Ee,!0);t(Ee),t(We),t(G),t(C),D((g,te,ct)=>{be=xe(B,1,"block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white sm:text-sm",null,be,g),Te=xe(_e,1,"block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white sm:text-sm",null,Te,te),De=xe(we,1,"block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white sm:text-sm",null,De,ct),Ie.disabled=e(k),Ee.disabled=!e(re)||e(k),S(dt,e(k)?"Saving...":"Save Changes")},[()=>({"border-red-300":!e(f)(e(p))}),()=>({"border-red-300":!e(f)(e(y))}),()=>({"border-red-300":!e(f)(e(d))})]),Re(B,()=>e(p),g=>v(p,g)),Re(_e,()=>e(y),g=>v(y,g)),Re(we,()=>e(d),g=>v(d,g)),Re(Ve,()=>e(L),g=>v(L,g)),Ge("click",Ie,se),Ge("submit",G,wt(ge)),m(c,C)},$$slots:{default:!0}})};z(at,n=>{e(l)&&n(ot)})}D(n=>{S(le,`v${n??""}`),S(w,(_(s()),u(()=>s().controller_id))),S(U,(_(s()),u(()=>s().hostname||"Unknown"))),S(N,`${_(s()),u(()=>s().minimum_job_age_backoff||30)??""}s`)},[()=>(_(s()),u(()=>s().version?.replace(/^v/,"")||"Unknown"))]),m(me,E),Qe()}var Vt=h('

Error loading dashboard

'),Wt=h('
'),Jt=h('

Dashboard

Welcome to GARM - GitHub Actions Runner Manager

');function or(me,V){Oe(V,!1);const[f,re]=ft(),s=()=>xt(_t,"$eagerCache",f),ae=I();let l=I({repositories:0,organizations:0,pools:0,instances:0}),k=I(null),p=I(""),y=[];function d(i,o,w=1e3){const M=parseInt(i.textContent||"0"),x=(o-M)/(w/16);let U=M;const A=()=>{if(U+=x,x>0&&U>=o||x<0&&U<=o){i.textContent=o.toString();return}i.textContent=Math.floor(U).toString(),requestAnimationFrame(A)};M!==o&&requestAnimationFrame(A)}mt(async()=>{try{const[x,U,A,W,Y]=await Promise.all([Ce.getRepositories(),Ce.getOrganizations(),Ce.getPools(),Ke.listInstances(),Ce.getControllerInfo()]);setTimeout(()=>{const Z=document.querySelector('[data-stat="repositories"]'),O=document.querySelector('[data-stat="organizations"]'),N=document.querySelector('[data-stat="pools"]'),ee=document.querySelector('[data-stat="instances"]');Z&&d(Z,x.length),O&&d(O,U.length),N&&d(N,A.length),ee&&d(ee,W.length)},100),v(l,{repositories:x.length,organizations:U.length,pools:A.length,instances:W.length}),Y&&v(k,Y)}catch(x){v(p,Ut(x)),console.error("Dashboard error:",x)}const i=Me.subscribeToEntity("repository",["create","delete"],L),o=Me.subscribeToEntity("organization",["create","delete"],oe),w=Me.subscribeToEntity("pool",["create","delete"],ge),M=Me.subscribeToEntity("instance",["create","delete"],se);y=[i,o,w,M]}),gt(()=>{y.forEach(i=>i())});function L(i){const o=document.querySelector('[data-stat="repositories"]');i.operation==="create"?(Q(l,e(l).repositories++),o&&d(o,e(l).repositories,500)):i.operation==="delete"&&(Q(l,e(l).repositories=Math.max(0,e(l).repositories-1)),o&&d(o,e(l).repositories,500))}function oe(i){const o=document.querySelector('[data-stat="organizations"]');i.operation==="create"?(Q(l,e(l).organizations++),o&&d(o,e(l).organizations,500)):i.operation==="delete"&&(Q(l,e(l).organizations=Math.max(0,e(l).organizations-1)),o&&d(o,e(l).organizations,500))}function ge(i){const o=document.querySelector('[data-stat="pools"]');i.operation==="create"?(Q(l,e(l).pools++),o&&d(o,e(l).pools,500)):i.operation==="delete"&&(Q(l,e(l).pools=Math.max(0,e(l).pools-1)),o&&d(o,e(l).pools,500))}function se(i){const o=document.querySelector('[data-stat="instances"]');i.operation==="create"?(Q(l,e(l).instances++),o&&d(o,e(l).instances,500)):i.operation==="delete"&&(Q(l,e(l).instances=Math.max(0,e(l).instances-1)),o&&d(o,e(l).instances,500))}function E(i){v(k,i.detail)}function q(i){return{blue:"bg-blue-500 text-white",green:"bg-green-500 text-white",purple:"bg-purple-500 text-white",yellow:"bg-yellow-500 text-white"}[i]||"bg-gray-500 text-white"}Le(()=>(e(k),s()),()=>{(!e(k)||s().loaded.controllerInfo)&&v(k,s().controllerInfo)}),Le(()=>(e(l),P),()=>{v(ae,[{title:"Repositories",value:e(l).repositories,icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z",color:"blue",href:P("/repositories")},{title:"Organizations",value:e(l).organizations,icon:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z",color:"green",href:P("/organizations")},{title:"Pools",value:e(l).pools,icon:"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z",color:"purple",href:P("/pools")},{title:"Instances",value:e(l).instances,icon:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z",color:"yellow",href:P("/instances")}])}),Ne(),Fe();var J=Jt();bt(i=>{pt.title="Dashboard - GARM"});var F=a(r(J),2);{var K=i=>{var o=Vt(),w=r(o),M=a(r(w),2),x=a(r(M),2),U=r(x,!0);t(x),t(M),t(w),t(o),D(()=>S(U,e(p))),m(i,o)};z(F,i=>{e(p)&&i(K)})}var j=a(F,2);ht(j,5,()=>e(ae),kt,(i,o)=>{var w=Wt(),M=r(w),x=r(M),U=r(x),A=r(U),W=r(A),Y=r(W);t(W),t(A),t(U);var Z=a(U,2),O=r(Z),N=r(O),ee=r(N,!0);t(N);var ce=a(N,2),he=r(ce,!0);t(ce),t(O),t(Z),t(x),t(M),t(w),D((ke,Se)=>{ue(w,"href",(e(o),u(()=>e(o).href))),xe(A,1,`w-8 h-8 rounded-md ${ke??""} flex items-center justify-center`),ue(Y,"d",(e(o),u(()=>e(o).icon))),S(ee,(e(o),u(()=>e(o).title))),ue(ce,"data-stat",Se),S(he,(e(o),u(()=>e(o).value)))},[()=>(e(o),u(()=>q(e(o).color))),()=>(e(o),u(()=>e(o).title.toLowerCase()))]),m(i,w)}),t(j);var T=a(j,2);{var ie=i=>{Dt(i,{get controllerInfo(){return e(k)},$$events:{updated:E}})};z(T,i=>{e(k)&&i(ie)})}var le=a(T,2),ne=r(le),$=a(r(ne),4),H=r($),X=a(H,2),de=a(X,2);t($),t(ne),t(le),t(J),D((i,o,w)=>{ue(H,"href",i),ue(X,"href",o),ue(de,"href",w)},[()=>(_(P),u(()=>P("/repositories"))),()=>(_(P),u(()=>P("/pools"))),()=>(_(P),u(()=>P("/instances")))]),m(me,J),Qe(),re()}export{or as component}; diff --git a/webapp/assets/_app/immutable/nodes/20.BcQWH_IW.js b/webapp/assets/_app/immutable/nodes/20.BcQWH_IW.js new file mode 100644 index 00000000..2b496757 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/20.BcQWH_IW.js @@ -0,0 +1,2 @@ +import"../chunks/DsnmJJEf.js";import{i as Dt}from"../chunks/C7KraPli.js";import{p as At,o as Lt,l as pe,h as Ut,f as D,j as Rt,a as se,b as x,c as It,g as e,m as w,t as G,k as s,u as l,$ as Mt,s as o,w as M,B as Je,d as r,r as d,z as H,D as ge,e as j,v,q as U,i as Le,y as Ft}from"../chunks/cPTQ2Ibn.js";import{i as T}from"../chunks/DqFqoVWr.js";import{d as le,g as Ue,r as Ke,b as Et}from"../chunks/DqbUkQgD.js";import{b as Qe}from"../chunks/B-_QCM7E.js";import{p as St}from"../chunks/D4Caz1gY.js";import{p as be}from"../chunks/BgSaD1r_.js";import{g as Re}from"../chunks/CTvJf3dP.js";import{A as xe}from"../chunks/C2rI8IaC.js";import{t as P}from"../chunks/Bgbd8SZ5.js";import{e as Ie}from"../chunks/BZiHL9L3.js";import{g as Xe,B as fe}from"../chunks/DJsB5Z5V.js";import{D as Bt}from"../chunks/oOdVuDuv.js";import{C as Ht,a as Ze}from"../chunks/R3ADTHgb.js";import{i as et}from"../chunks/C98nByjP.js";import{w as jt}from"../chunks/BV_mDmfH.js";var Pt=D('
Loading template...
'),zt=D('

Error loading template

'),Gt=D('
Forge Type

Cannot be changed

OS Type

Cannot be changed

'),Vt=D('
Created
'),Wt=D('
Last Updated
'),Nt=D('
Name
Description
Forge Type
OS Type
Owner
Template ID
'),Ot=D('
'),qt=D('

Available Template Variables

Your template can use the following variables using Go template syntax (e.g., ):

Runner Info
  • .RunnerName - Runner name
  • .RunnerLabels - Comma separated labels
  • .RunnerUsername - Runner service username
  • .RunnerGroup - Runner service group
  • .GitHubRunnerGroup - GitHub runner group
Download & Install
  • .FileName - Download file name
  • .DownloadURL - Runner download URL
  • .TempDownloadToken - Download token
  • .RepoURL - Repository URL
Configuration
  • .MetadataURL - Instance metadata URL
  • .CallbackURL - Status callback URL
  • .CallbackToken - Callback token
  • .CABundle - CA certificate bundle
  • .EnableBootDebug - Enable debug mode
  • .UseJITConfig - Use JIT configuration
  • .ExtraContext - Additional context map

💡 Tip: Use for conditional content, or to iterate over extra context.

'),Yt=D('

'),Jt=D('
',1),Kt=D('

Template Information

Template Content

',1),Qt=D('

Delete Template

Are you sure you want to delete the template " "? This action cannot be undone.

'),Xt=D(" ",1);function ba(tt,at){At(at,!1);const ne=w(),ye=w(),he=w();let ie=w(!0),t=w(null),O=w(""),h=w(!1),n=w({name:"",description:"",data:new Uint8Array}),u=w(""),X=w("text"),V=w(!1),$=w({name:"",description:""}),z=w(""),_e=w(!1),ce=w(!1);async function ke(){try{if(s(ie,!0),s(O,""),s(t,await Ue.getTemplate(e(ne))),!e(t))throw new Error("Template not found");if(M(n,e(n).name=e(t).name||""),M(n,e(n).description=e(t).description||""),M($,e($).name=e(t).name||""),M($,e($).description=e(t).description||""),e(t).data)try{if(Array.isArray(e(t).data)){const a=new Uint8Array(e(t).data);s(u,new TextDecoder().decode(a)),s(z,e(u))}else s(u,atob(e(t).data)),s(z,e(u))}catch(a){console.error("Failed to decode template data:",a),s(u,""),s(z,"")}else s(u,""),s(z,"")}catch(a){s(O,Ie(a)),P.add({type:"error",title:"Failed to load template",message:e(O)})}finally{s(ie,!1)}}async function Me(){if(!(!e(t)?.id||!e(he)))try{const a={name:e(n).name,description:e(n).description||void 0,data:Array.from(new TextEncoder().encode(e(u)))},p=await Ue.updateTemplate(e(t).id,a);s(t,p),P.add({type:"success",title:"Template updated",message:`Template "${e(n).name}" has been updated successfully.`}),M($,e($).name=e(n).name),M($,e($).description=e(n).description),s(z,e(u)),s(h,!1)}catch(a){const p=Ie(a);P.add({type:"error",title:"Failed to update template",message:p})}}async function rt(){if(e(t)?.id)try{await Ue.deleteTemplate(e(t).id),P.add({type:"success",title:"Template deleted",message:`Template "${e(t).name}" has been deleted successfully.`}),Re(le("/templates"))}catch(a){const p=Ie(a);P.add({type:"error",title:"Failed to delete template",message:p})}}function Fe(){s(h,!0),s(V,!1)}function dt(){return e(n).name!==e($).name||e(n).description!==e($).description||e(u)!==e(z)}function ot(){if(dt()){s(ce,!0);return}Ee()}function Ee(){if(s(h,!1),s(V,!1),be.url.searchParams.get("edit")==="true"){Re(le("/templates"));return}if(e(t))if(M(n,e(n).name=e(t).name||""),M(n,e(n).description=e(t).description||""),e(t).data)try{if(Array.isArray(e(t).data)){const a=new Uint8Array(e(t).data);s(u,new TextDecoder().decode(a))}else s(u,atob(e(t).data))}catch(a){console.error("Failed to decode template data:",a),s(u,"")}else s(u,"")}function st(){s(ce,!1),Ee()}function Se(a){switch(a){case"github":return{color:"blue",text:"GitHub"};case"gitea":return{color:"green",text:"Gitea"};default:return{color:"gray",text:a||"Unknown"}}}function Be(a){switch(a){case"linux":return{color:"blue",text:"Linux"};case"windows":return{color:"info",text:"Windows"};default:return{color:"gray",text:a||"Unknown"}}}function we(){if(!e(t)?.data)return"";try{if(Array.isArray(e(t).data)){const a=new Uint8Array(e(t).data);return new TextDecoder().decode(a)}else return atob(e(t).data)}catch(a){return console.error("Failed to decode template data:",a),"Error: Failed to decode template content"}}function He(a){const A=a.split(` +`)[0]?.trim()||"";return A.startsWith("#!/bin/bash")||A.startsWith("#!/bin/sh")?"bash":A.startsWith("#!/usr/bin/env pwsh")||A.includes("#ps1_sysnative")?"powershell":A.startsWith("#!/usr/bin/env python")||A.startsWith("#!/usr/bin/python")?"python":a.includes("param(")||a.includes("Write-Host")||a.includes("$_")?"powershell":a.includes("def ")||a.includes("import ")||a.includes("print(")?"python":a.includes("echo ")||a.includes("export ")||a.includes("if [")?"bash":"text"}async function lt(a){try{await navigator.clipboard.writeText(a),P.add({type:"success",title:"Copied to clipboard",message:"Template content has been copied to your clipboard."})}catch(p){console.error("Failed to copy to clipboard:",p),P.add({type:"error",title:"Copy failed",message:"Failed to copy content to clipboard. Please try again."})}}Lt(()=>{if(e(ne))return ke().then(()=>{be.url.searchParams.get("edit")==="true"&&Fe()}),jt.subscribeToEntity("template",["update","delete"],p=>{p.payload&&p.payload.id===e(ne)&&(p.operation==="update"?e(h)?P.add({type:"info",title:"Template updated",message:"This template has been updated externally. Your changes are preserved."}):ke():p.operation==="delete"&&(P.add({type:"info",title:"Template deleted",message:`Template "${e(t)?.name||"Unknown"}" has been deleted.`}),Re(le("/templates"))))});s(O,"Invalid template ID"),s(ie,!1)}),pe(()=>be,()=>{s(ne,parseInt(be.params.id||"0"))}),pe(()=>(e(u),e(V)),()=>{e(u)&&!e(V)&&s(X,He(e(u)))}),pe(()=>(e(n),e($),e(u),e(z)),()=>{s(ye,e(n).name!==e($).name||e(n).description!==e($).description||e(u)!==e(z))}),pe(()=>(e(ye),e(n),e(u)),()=>{s(he,e(ye)&&e(n).name.trim().length>0&&e(u).trim().length>0)}),Ut(),Dt();var je=Xt();Rt(a=>{G(()=>Mt.title=`${e(t),l(()=>e(t)?.name||"Template")??""} - GARM`)});var Pe=se(je);{var nt=a=>{var p=Pt();x(a,p)},it=a=>{var p=Je(),A=se(p);{var ue=F=>{var E=zt(),q=r(E),W=o(r(q),2),R=o(r(W),2),Y=r(R,!0);d(R);var S=o(R,2),J=r(S);xe(J,{variant:"secondary",size:"sm",$$events:{click:ke},children:(K,ee)=>{H();var te=ge("Try Again");x(K,te)},$$slots:{default:!0}});var N=o(J,2);{let K=v(()=>(U(le),l(()=>le("/templates"))));xe(N,{variant:"secondary",size:"sm",get href(){return e(K)},children:(ee,te)=>{H();var ae=ge("Back to Templates");x(ee,ae)},$$slots:{default:!0}})}d(S),d(W),d(q),d(E),G(()=>j(Y,e(O))),x(F,E)},Z=F=>{var E=Je(),q=se(E);{var W=R=>{const Y=v(()=>(U(et),l(et))),S=v(()=>(e(t),l(()=>e(t).owner_id==="system"))),J=v(()=>e(Y)||!e(S)),N=v(()=>e(Y)||!e(S));var K=Kt(),ee=se(K);{let m=v(()=>(e(t),l(()=>e(t).name||"Unnamed Template"))),i=v(()=>(U(Xe),e(t),l(()=>Xe(e(t).forge_type||"unknown")))),c=v(()=>e(h)?ot:e(J)?Fe:null),g=v(()=>e(h)?Me:e(N)?()=>s(_e,!0):null),f=v(()=>e(h)?"Close":"Edit"),b=v(()=>e(h)?"Save Changes":"Delete"),y=v(()=>(e(h),"secondary")),I=v(()=>e(h)?"primary":"danger"),B=v(()=>e(h)?!e(he):!1),Q=v(()=>e(h)?"":""),re=v(()=>e(h)?"":"");Bt(ee,{get title(){return e(m)},subtitle:"View and manage template details",get forgeIcon(){return e(i)},get onEdit(){return e(c)},get onDelete(){return e(g)},get editLabel(){return e(f)},get deleteLabel(){return e(b)},get editVariant(){return e(y)},get deleteVariant(){return e(I)},get deleteDisabled(){return e(B)},get editIcon(){return e(Q)},get deleteIcon(){return e(re)}})}var te=o(ee,2),ae=r(te),Ge=r(ae),vt=o(r(Ge),2);{var pt=m=>{var i=Gt(),c=r(i),g=r(c),f=o(r(g),2);Ke(f),d(g);var b=o(g,2),y=o(r(b),2);Ke(y),d(b),d(c);var I=o(c,2),B=r(I),Q=o(r(B),2);{var re=C=>{const L=v(()=>(e(t),l(()=>Se(e(t).forge_type))));fe(C,{get variant(){return U(e(L)),l(()=>e(L).color)},get text(){return U(e(L)),l(()=>e(L).text)}})};T(Q,C=>{e(t),l(()=>e(t).forge_type)&&C(re)})}H(2),d(B);var me=o(B,2),de=o(r(me),2);{var ve=C=>{const L=v(()=>(e(t),l(()=>Be(e(t).os_type))));fe(C,{get variant(){return U(e(L)),l(()=>e(L).color)},get text(){return U(e(L)),l(()=>e(L).text)}})};T(de,C=>{e(t),l(()=>e(t).os_type)&&C(ve)})}H(2),d(me),d(I),d(i),Qe(f,()=>e(n).name,C=>M(n,e(n).name=C)),Qe(y,()=>e(n).description,C=>M(n,e(n).description=C)),Le("submit",i,St(Me)),x(m,i)},gt=m=>{var i=Nt(),c=r(i),g=o(r(c),2),f=r(g,!0);d(g),d(c);var b=o(c,2),y=o(r(b),2),I=r(y,!0);d(y),d(b);var B=o(b,2),Q=o(r(B),2),re=r(Q);{var me=k=>{const _=v(()=>(e(t),l(()=>Se(e(t).forge_type))));fe(k,{get variant(){return U(e(_)),l(()=>e(_).color)},get text(){return U(e(_)),l(()=>e(_).text)}})};T(re,k=>{e(t),l(()=>e(t).forge_type)&&k(me)})}d(Q),d(B);var de=o(B,2),ve=o(r(de),2),C=r(ve);{var L=k=>{const _=v(()=>(e(t),l(()=>Be(e(t).os_type))));fe(k,{get variant(){return U(e(_)),l(()=>e(_).color)},get text(){return U(e(_)),l(()=>e(_).text)}})};T(C,k=>{e(t),l(()=>e(t).os_type)&&k(L)})}d(ve),d(de);var $e=o(de,2),Oe=o(r($e),2),kt=r(Oe,!0);d(Oe),d($e);var Ce=o($e,2),qe=o(r(Ce),2),wt=r(qe,!0);d(qe),d(Ce);var Ye=o(Ce,2);{var Tt=k=>{var _=Vt(),oe=o(r(_),2),De=r(oe,!0);d(oe),d(_),G(Ae=>j(De,Ae),[()=>(e(t),l(()=>new Date(e(t).created_at).toLocaleDateString()))]),x(k,_)};T(Ye,k=>{e(t),l(()=>e(t).created_at)&&k(Tt)})}var $t=o(Ye,2);{var Ct=k=>{var _=Wt(),oe=o(r(_),2),De=r(oe,!0);d(oe),d(_),G(Ae=>j(De,Ae),[()=>(e(t),l(()=>new Date(e(t).updated_at).toLocaleDateString()))]),x(k,_)};T($t,k=>{e(t),l(()=>e(t).updated_at)&&k(Ct)})}d(i),G(()=>{j(f,(e(t),l(()=>e(t).name||"Unnamed Template"))),j(I,(e(t),l(()=>e(t).description||"No description"))),j(kt,(e(t),l(()=>e(t).owner_id==="system"?"System":e(t).owner_id||"Unknown"))),j(wt,(e(t),l(()=>e(t).id)))}),x(m,i)};T(vt,m=>{e(h)?m(pt):m(gt,!1)})}d(Ge),d(ae);var Ve=o(ae,2),We=r(Ve),Te=r(We),bt=o(r(Te),2);{var xt=m=>{var i=Ot(),c=o(r(i),2);G(()=>{e(X),Ft(()=>{e(V)})});var g=r(c);g.value=g.__value="bash";var f=o(g);f.value=f.__value="powershell";var b=o(f);b.value=b.__value="python";var y=o(b);y.value=y.__value="text",d(c),d(i),Et(c,()=>e(X),I=>s(X,I)),Le("change",c,()=>s(V,!0)),x(m,i)};T(bt,m=>{e(h)&&m(xt)})}d(Te);var Ne=o(Te,2);{var ft=m=>{var i=qt(),c=o(r(i),2),g=o(r(c));g.textContent="{{ .RunnerName }}",H(),d(c);var f=o(c,4),b=o(r(f),3);b.textContent="{{if .CABundle}}...{{end}}";var y=o(b,2);y.textContent="{{range $key, $value := .ExtraContext}}{{$key}}: {{$value}}{{end}}",H(),d(f),d(i),x(m,i)};T(Ne,m=>{e(h)&&m(ft)})}var yt=o(Ne,2);{var ht=m=>{var i=Yt(),c=r(i);{let b=v(()=>!e(V));Ze(c,{get language(){return e(X)},get autoDetect(){return e(b)},enableTemplateCompletion:!0,minHeight:"400px",placeholder:"Enter your template script content here...",get value(){return e(u)},set value(y){s(u,y)},$$events:{change:y=>s(u,y.detail.value)},$$legacy:!0})}var g=o(c,2),f=r(g);d(g),d(i),G(()=>j(f,`Template content should be a ${e(t),l(()=>e(t).os_type==="windows"?"PowerShell":"bash")??""} script for runner installation and configuration on ${e(t),l(()=>e(t).os_type)??""}.`)),x(m,i)},_t=m=>{var i=Jt(),c=se(i),g=o(r(c),2);d(c);var f=o(c,2),b=r(f);{let y=v(()=>l(we)),I=v(()=>l(()=>He(we())));Ze(b,{get value(){return e(y)},get language(){return e(I)},readonly:!0,minHeight:"400px"})}d(f),Le("click",g,()=>lt(we())),x(m,i)};T(yt,m=>{e(h)?m(ht):m(_t,!1)})}d(We),d(Ve),d(te),x(R,K)};T(q,R=>{e(t)&&R(W)},!0)}x(F,E)};T(A,F=>{e(O)&&!e(t)?F(ue):F(Z,!1)},!0)}x(a,p)};T(Pe,a=>{e(ie)?a(nt):a(it,!1)})}var ze=o(Pe,2);{var ct=a=>{var p=Qt(),A=r(p),ue=r(A),Z=o(r(ue),4),F=r(Z),E=o(r(F)),q=r(E,!0);d(E),H(),d(F),d(Z);var W=o(Z,2),R=r(W);xe(R,{variant:"secondary",$$events:{click:()=>s(_e,!1)},children:(S,J)=>{H();var N=ge("Cancel");x(S,N)},$$slots:{default:!0}});var Y=o(R,2);xe(Y,{variant:"danger",$$events:{click:rt},children:(S,J)=>{H();var N=ge("Delete");x(S,N)},$$slots:{default:!0}}),d(W),d(ue),d(A),d(p),G(()=>j(q,(e(t),l(()=>e(t).name)))),x(a,p)};T(ze,a=>{e(_e)&&e(t)&&a(ct)})}var ut=o(ze,2);{var mt=a=>{Ht(a,{title:"Unsaved Changes",message:"You have unsaved changes. Are you sure you want to discard them?",confirmText:"Discard Changes",cancelText:"Stay on Page",variant:"warning",$$events:{close:()=>s(ce,!1),confirm:st}})};T(ut,a=>{e(ce)&&a(mt)})}x(tt,je),It()}export{ba as component}; diff --git a/webapp/assets/_app/immutable/nodes/21.Nj7C5iaJ.js b/webapp/assets/_app/immutable/nodes/21.Nj7C5iaJ.js new file mode 100644 index 00000000..0e992d12 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/21.Nj7C5iaJ.js @@ -0,0 +1,2 @@ +import"../chunks/DsnmJJEf.js";import{i as Ye}from"../chunks/C7KraPli.js";import{p as Ke,o as Qe,l as Q,h as Xe,f as F,j as Ze,a as Te,b as w,c as et,g as e,m as p,t as C,k as l,u as U,$ as tt,s as r,w as f,v as X,d as o,r as s,y as Z,z as A,e as at,i as D,C as rt}from"../chunks/cPTQ2Ibn.js";import{i as ee}from"../chunks/DqFqoVWr.js";import{g as Le,d as te,r as Re,b as ae}from"../chunks/DqbUkQgD.js";import{b as $e}from"../chunks/B-_QCM7E.js";import{b as lt}from"../chunks/Cwu7L3Xf.js";import{p as ot}from"../chunks/D4Caz1gY.js";import{g as re}from"../chunks/CTvJf3dP.js";import{p as st}from"../chunks/BgSaD1r_.js";import{t as h}from"../chunks/Bgbd8SZ5.js";import{e as Ue}from"../chunks/BZiHL9L3.js";import{D as dt}from"../chunks/oOdVuDuv.js";import{a as nt,C as it}from"../chunks/R3ADTHgb.js";var ut=F('
Loading...
'),ct=F('
Uploading...',1),pt=rt(' Upload File',1),bt=F('

Template Information

Template Content

Available Template Variables

Your template can use the following variables using Go template syntax (e.g., ):

Runner Info
  • .RunnerName - Runner name
  • .RunnerLabels - Comma separated labels
  • .RunnerUsername - Runner service username
  • .RunnerGroup - Runner service group
  • .GitHubRunnerGroup - GitHub runner group
Download & Install
  • .FileName - Download file name
  • .DownloadURL - Runner download URL
  • .TempDownloadToken - Download token
  • .RepoURL - Repository URL
Configuration
  • .MetadataURL - Instance metadata URL
  • .CallbackURL - Status callback URL
  • .CallbackToken - Callback token
  • .CABundle - CA certificate bundle
  • .EnableBootDebug - Enable debug mode
  • .UseJITConfig - Use JIT configuration
  • .ExtraContext - Additional context map

💡 Tip: Use for conditional content, or to iterate over extra context.

',1),gt=F(" ",1);function Ut(Ae,De){Ke(De,!1);const le=p(),M=p();let _=p(!1),i=p(null),t=p({name:"",description:"",forge_type:"github",os_type:"linux",data:new Uint8Array}),u=p(""),v=p("text"),x=p(!1),I=p(),T=p(!1),L={name:"",description:"",forge_type:"github",os_type:"linux"},Fe="",R=p(!1);async function oe(){if(e(M))try{l(_,!0);const a={name:e(t).name,description:e(t).description||void 0,forge_type:e(t).forge_type,os_type:e(t).os_type,data:Array.from(new TextEncoder().encode(e(u)))};await Le.createTemplate(a),h.add({type:"success",title:"Template created",message:`Template "${e(t).name}" has been created successfully.`}),re(te("/templates"))}catch(a){const c=Ue(a);h.add({type:"error",title:"Failed to create template",message:c})}finally{l(_,!1)}}function Me(){return e(le)}function Ie(){if(Me()){l(R,!0);return}se()}function se(){re(te("/templates"))}function We(){l(R,!1),se()}function Ee(){e(I).click()}async function Se(a){const c=a.target,n=c.files?.[0];if(n){if(n.size>1024*1024){h.add({type:"error",title:"File too large",message:"Please select a file smaller than 1MB."});return}try{l(T,!0);const y=await n.text();l(u,y);const b=n.name.toLowerCase();let m="text";b.endsWith(".sh")||b.endsWith(".bash")?m="bash":b.endsWith(".ps1")||b.endsWith(".psm1")?m="powershell":b.endsWith(".py")?m="python":m=W(y),l(v,m),l(x,!1),h.add({type:"success",title:"File uploaded",message:`Successfully loaded content from "${n.name}".`})}catch{h.add({type:"error",title:"Failed to read file",message:"Unable to read the selected file. Please try again."})}finally{l(T,!1),c.value=""}}}function W(a){const n=a.split(` +`)[0]?.trim()||"";return n.startsWith("#!/bin/bash")||n.startsWith("#!/bin/sh")?"bash":n.startsWith("#!/usr/bin/env pwsh")||n.includes("#ps1_sysnative")?"powershell":n.startsWith("#!/usr/bin/env python")||n.startsWith("#!/usr/bin/python")?"python":a.includes("param(")||a.includes("Write-Host")||a.includes("$_")?"powershell":a.includes("def ")||a.includes("import ")||a.includes("print(")?"python":a.includes("echo ")||a.includes("export ")||a.includes("if [")?"bash":"text"}async function Ge(){const a=st.url.searchParams.get("clone");if(a)try{if(l(_,!0),l(i,await Le.getTemplate(parseInt(a))),!e(i))throw new Error("Template not found");if(f(t,e(t).name=`${e(i).name} (Copy)`),f(t,e(t).description=e(i).description||""),f(t,e(t).forge_type=e(i).forge_type||"github"),f(t,e(t).os_type=e(i).os_type||"linux"),e(i).data)try{if(Array.isArray(e(i).data)){const c=new Uint8Array(e(i).data);l(u,new TextDecoder().decode(c))}else l(u,atob(e(i).data));l(v,W(e(u)))}catch(c){console.error("Failed to decode template data:",c),l(u,"")}}catch(c){const n=Ue(c);h.add({type:"error",title:"Failed to load template",message:n}),re(te("/templates"))}finally{l(_,!1)}}Qe(()=>{Ge()}),Q(()=>(e(t),e(u)),()=>{l(le,e(t).name!==L.name||e(t).description!==L.description||e(t).forge_type!==L.forge_type||e(t).os_type!==L.os_type||e(u)!==Fe)}),Q(()=>(e(t),e(u)),()=>{l(M,e(t).name.trim().length>0&&e(u).trim().length>0)}),Q(()=>(e(u),e(x)),()=>{e(u)&&!e(x)&&l(v,W(e(u)))}),Xe(),Ye();var de=gt();Ze(a=>{C(()=>tt.title=`${e(i),U(()=>e(i)?`Clone ${e(i).name}`:"Create Template")??""} - GARM`)});var ne=Te(de);{var He=a=>{var c=ut();w(a,c)},Pe=a=>{var c=bt(),n=Te(c);{let d=X(()=>(e(i),U(()=>e(i)?`Clone Template: ${e(i).name}`:"Create New Template"))),g=X(()=>!e(M));dt(n,{get title(){return e(d)},subtitle:"Create a new runner install template",onEdit:Ie,onDelete:oe,editLabel:"Cancel",deleteLabel:"Create Template",editVariant:"secondary",deleteVariant:"primary",get deleteDisabled(){return e(g)},editIcon:"",deleteIcon:""})}var y=r(n,2),b=o(y),m=o(b),E=r(o(m),2),S=o(E),G=o(S),ie=r(o(G),2);Re(ie),s(G);var ue=r(G,2),ce=r(o(ue),2);Re(ce),s(ue),s(S);var pe=r(S,2),H=o(pe),P=r(o(H),2);C(()=>{e(t),Z(()=>{})});var j=o(P);j.value=j.__value="github";var be=r(j);be.value=be.__value="gitea",s(P),s(H);var ge=r(H,2),B=r(o(ge),2);C(()=>{e(t),Z(()=>{})});var N=o(B);N.value=N.__value="linux";var me=r(N);me.value=me.__value="windows",s(B),s(ge),s(pe),s(E),s(m),s(b);var fe=r(b,2),ve=o(fe),V=o(ve),xe=r(o(V),2),k=o(xe),Ne=o(k);{var Ve=d=>{var g=ct();A(),w(d,g)},qe=d=>{var g=pt();A(),w(d,g)};ee(Ne,d=>{e(T)?d(Ve):d(qe,!1)})}s(k);var $=r(k,4);C(()=>{e(v),Z(()=>{e(x)})});var q=o($);q.value=q.__value="bash";var z=r(q);z.value=z.__value="powershell";var J=r(z);J.value=J.__value="python";var ye=r(J);ye.value=ye.__value="text",s($),s(xe),s(V);var O=r(V,2);lt(O,d=>l(I,d),()=>e(I));var Y=r(O,2),K=r(o(Y),2),ze=r(o(K));ze.textContent="{{ .RunnerName }}",A(),s(K);var he=r(K,4),_e=r(o(he),3);_e.textContent="{{if .CABundle}}...{{end}}";var Je=r(_e,2);Je.textContent="{{range $key, $value := .ExtraContext}}{{$key}}: {{$value}}{{end}}",A(),s(he),s(Y);var ke=r(Y,2),we=o(ke);{let d=X(()=>!e(x));nt(we,{get language(){return e(v)},get autoDetect(){return e(d)},enableTemplateCompletion:!0,minHeight:"400px",placeholder:"Enter your template script content here...",get value(){return e(u)},set value(g){l(u,g)},$$events:{change:g=>l(u,g.detail.value)},$$legacy:!0})}var Ce=r(we,2),Oe=o(Ce);s(Ce),s(ke),s(ve),s(fe),s(y),C(()=>{k.disabled=e(T),at(Oe,`Template content should be a ${e(t),U(()=>e(t).os_type==="windows"?"PowerShell":"bash")??""} script for runner installation and configuration on ${e(t),U(()=>e(t).os_type)??""}.`)}),$e(ie,()=>e(t).name,d=>f(t,e(t).name=d)),$e(ce,()=>e(t).description,d=>f(t,e(t).description=d)),ae(P,()=>e(t).forge_type,d=>f(t,e(t).forge_type=d)),ae(B,()=>e(t).os_type,d=>f(t,e(t).os_type=d)),D("submit",E,ot(oe)),D("click",k,Ee),ae($,()=>e(v),d=>l(v,d)),D("change",$,()=>l(x,!0)),D("change",O,Se),w(a,c)};ee(ne,a=>{e(_)?a(He):a(Pe,!1)})}var je=r(ne,2);{var Be=a=>{it(a,{title:"Unsaved Changes",message:"You have unsaved changes. Are you sure you want to discard them?",confirmText:"Discard Changes",cancelText:"Stay on Page",variant:"danger",$$events:{close:()=>l(R,!1),confirm:We}})};ee(je,a=>{e(R)&&a(Be)})}w(Ae,de),et()}export{Ut as component}; diff --git a/webapp/assets/_app/immutable/nodes/3.BvdHw7b_.js b/webapp/assets/_app/immutable/nodes/3.BvdHw7b_.js deleted file mode 100644 index 08419a73..00000000 --- a/webapp/assets/_app/immutable/nodes/3.BvdHw7b_.js +++ /dev/null @@ -1,7 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as jt}from"../chunks/DT0EGONV.js";import{p as Gt,g as e,o as Ut,l as J,a as zt,f as E,e as v,h as qt,b as Fe,c as $,d as Bt,$ as St,m as p,s as n,i as Lt,j as o,k as a,r as i,u,n as be,q as Ke,t as se,v as W,w as _,x as rt,y as Nt,z as X}from"../chunks/CRKWEg6v.js";import{i as G,s as Kt,a as Vt}from"../chunks/e1m7WRO5.js";import{e as Ht,i as Rt}from"../chunks/C73ZVvpW.js";import{h as Yt,r as L,s as je,b as Ot,a as Jt,g as ve}from"../chunks/-esynYXT.js";import{b as N,a as Qt}from"../chunks/B3a35v7J.js";import{p as at}from"../chunks/D4Caz1gY.js";import{P as Wt}from"../chunks/BAnDfGwP.js";import{F as Xt}from"../chunks/CiGy614T.js";import{D as Zt,A as ot,G as it,a as er}from"../chunks/B1coRVG4.js";import{e as tr,a as Ve}from"../chunks/Djd10kRn.js";import{t as ke}from"../chunks/D6DjlyIQ.js";import{f as rr,p as ar,g as He,B as nt,c as or}from"../chunks/c_t0vA9G.js";import{e as Re}from"../chunks/BZiHL9L3.js";import"../chunks/D0m048VH.js";import{E as ir}from"../chunks/B27KefbC.js";import{S as nr}from"../chunks/B0Y2gXDu.js";var dr=E('

'),sr=E(""),lr=E('

'),cr=E('

Gitea only supports PAT authentication

'),ur=E('
'),pr=E('

or drag and drop

PEM, KEY files only

',1),gr=E(''),yr=E('
'),br=E('

or drag and drop

PEM, KEY files only. Upload new private key.

',1),vr=E(" ",1),fr=E(''),mr=E(''),xr=E('
',1);function qr(dt,st){Gt(st,!1);const[lt,ct]=Kt(),U=()=>Vt(tr,"$eagerCache",lt),Ge=p(),Z=p(),Ye=p(),Ue=p(),ze=p(),y={PAT:"pat",APP:"app"};let we=p(!0),le=p([]),Q=p([]),Ce=p(""),Pe=p(""),K=p(1),ce=p(25),ue=p(1),Ae=p(!1),Te=p(!1),$e=p(!1),D=p(y.PAT),g=p(null),M=p(null),r=p({name:"",description:"",endpoint:"",auth_type:y.PAT,oauth2_token:"",app_id:"",installation_id:"",private_key_bytes:""}),Ee={...e(r)},ee=p(!1);function ut(t){t.key==="Escape"&&(e(Ae)||e(Te)||e($e))&&P()}Ut(async()=>{try{n(we,!0);const[t,d]=await Promise.all([Ve.getCredentials(),Ve.getEndpoints()]);t&&Array.isArray(t)&&n(le,t),d&&Array.isArray(d)&&n(Q,d)}catch(t){console.error("Failed to load credentials:",t),n(Ce,t instanceof Error?t.message:"Failed to load credentials")}finally{n(we,!1)}});async function pt(){try{await Ve.retryResource("credentials")}catch(t){console.error("Retry failed:",t)}}async function gt(){Se(),n(Ae,!0),n(x,"github"),_(r,e(r).auth_type=y.PAT)}let x=p("");function yt(t){n(x,t.detail),Se()}async function qe(t){n(g,t),n(r,{name:t.name||"",description:t.description||"",endpoint:t.endpoint?.name||"",auth_type:t["auth-type"]||y.PAT,oauth2_token:"",app_id:"",installation_id:"",private_key_bytes:""}),n(D,t["auth-type"]||y.PAT),Ee={...e(r)},n(ee,!1),n(Te,!0)}function Be(t){n(M,t),n($e,!0)}function Se(){n(r,{name:"",description:"",endpoint:"",auth_type:y.PAT,oauth2_token:"",app_id:"",installation_id:"",private_key_bytes:""}),Ee={...e(r)},n(D,y.PAT),n(ee,!1)}function P(){n(Ae,!1),n(Te,!1),n($e,!1),n(g,null),n(M,null),n(x,""),Se()}function Oe(t){n(D,t),_(r,e(r).auth_type=t)}function bt(){const t={};if(e(r).name!==Ee.name&&e(r).name.trim()!==""&&(t.name=e(r).name.trim()),e(r).description!==Ee.description&&e(r).description.trim()!==""&&(t.description=e(r).description.trim()),e(ee)&&e(g))if(e(g)["auth-type"]===y.PAT)e(r).oauth2_token.trim()!==""&&(t.pat={oauth2_token:e(r).oauth2_token.trim()});else{const d={};let b=!1;if(e(r).app_id.trim()!==""&&(d.app_id=parseInt(e(r).app_id.trim()),b=!0),e(r).installation_id.trim()!==""&&(d.installation_id=parseInt(e(r).installation_id.trim()),b=!0),e(r).private_key_bytes!=="")try{const f=atob(e(r).private_key_bytes);d.private_key_bytes=Array.from(f,l=>l.charCodeAt(0)),b=!0}catch{}b&&(t.app=d)}return t}async function vt(){try{if(e(x)==="github")await ve.createGithubCredentials(e(r));else if(e(x)==="gitea")await ve.createGiteaCredentials(e(r));else throw new Error("Please select a forge type");ke.success("Credentials Created",`Credentials ${e(r).name} have been created successfully.`),P()}catch(t){n(Ce,Re(t))}}async function ft(){if(!(!e(g)||!e(g).id))try{const t=bt();if(Object.keys(t).length===0){ke.info("No Changes","No fields were modified."),P();return}e(g).forge_type==="github"?await ve.updateGithubCredentials(e(g).id,t):await ve.updateGiteaCredentials(e(g).id,t),ke.success("Credentials Updated",`Credentials ${e(g)?.name||"Unknown"} have been updated successfully.`),P()}catch(t){n(Ce,Re(t))}}async function mt(){if(!(!e(M)||!e(M).id))try{e(M).forge_type==="github"?await ve.deleteGithubCredentials(e(M).id):await ve.deleteGiteaCredentials(e(M).id),ke.success("Credentials Deleted",`Credentials ${e(M)?.name||"Unknown"} have been deleted successfully.`)}catch(t){const d=Re(t);ke.error("Delete Failed",d)}finally{P()}}function Je(t){const b=t.target.files?.[0];if(!b){_(r,e(r).private_key_bytes="");return}const f=new FileReader;f.onload=l=>{const h=l.target?.result;_(r,e(r).private_key_bytes=btoa(h))},f.readAsText(b)}function Qe(){return e(r).name.trim()?e(ee)&&e(g)?e(g)["auth-type"]===y.PAT?!!e(r).oauth2_token.trim():!!e(r).app_id.trim()&&!!e(r).installation_id.trim()&&!!e(r).private_key_bytes:!0:!1}function xt(t){return e(Q).find(b=>b.name===t)?.endpoint_type||""}function _t(t){return xt(t)==="gitea"}const ht=[{key:"name",title:"Name",cellComponent:it,cellProps:{field:"name"}},{key:"description",title:"Description",cellComponent:it,cellProps:{field:"description",type:"description"}},{key:"endpoint",title:"Endpoint",cellComponent:ir},{key:"auth_type",title:"Auth Type",cellComponent:nr,cellProps:{statusType:"custom",statusField:"auth-type"}},{key:"actions",title:"Actions",align:"right",cellComponent:er}],kt={entityType:"credential",primaryText:{field:"name",isClickable:!1},secondaryText:{field:"description"},customInfo:[{icon:t=>He(t?.forge_type||"unknown"),text:t=>t?.endpoint?.name||"Unknown"}],badges:[{type:"auth",field:"auth-type"}],actions:[{type:"edit",handler:t=>qe(t)},{type:"delete",handler:t=>Be(t)}]};function wt(t){n(Pe,t.detail.term),n(K,1)}function Ct(t){n(K,t.detail.page)}function Pt(t){const d=or(t.detail.perPage);n(ce,d.newPerPage),n(K,d.newCurrentPage)}function At(t){qe(t.detail.item)}function Tt(t){Be(t.detail.item)}J(()=>(e(le),U()),()=>{(!e(le).length||U().loaded.credentials)&&n(le,U().credentials)}),J(()=>U(),()=>{n(we,U().loading.credentials)}),J(()=>U(),()=>{n(Ge,U().errorMessages.credentials)}),J(()=>(e(Q),U()),()=>{(!e(Q).length||U().loaded.endpoints)&&n(Q,U().endpoints)}),J(()=>(e(le),e(Pe)),()=>{n(Z,rr(e(le),e(Pe)))}),J(()=>(e(ue),e(Z),e(ce),e(K)),()=>{n(ue,Math.ceil(e(Z).length/e(ce))),e(K)>e(ue)&&e(ue)>0&&n(K,e(ue))}),J(()=>(e(Z),e(K),e(ce)),()=>{n(Ye,ar(e(Z),e(K),e(ce)))}),J(()=>e(r),()=>{n(Ue,!e(r).name||!e(r).endpoint?!1:e(r).auth_type===y.PAT?!!e(r).oauth2_token:!!e(r).app_id&&!!e(r).installation_id&&!!e(r).private_key_bytes)}),J(()=>(e(x),e(Q)),()=>{n(ze,e(x)?e(Q).filter(t=>t.endpoint_type===e(x)):e(Q))}),zt(),jt();var We=xr();v("keydown",Lt,ut),qt(t=>{St.title="Credentials - GARM"});var Le=Fe(We),Xe=o(Le);Wt(Xe,{title:"Credentials",description:"Manage authentication credentials for your GitHub and Gitea endpoints.",actionLabel:"Add Credentials",$$events:{action:gt}});var $t=a(Xe,2);{let t=Ke(()=>e(Ge)||e(Ce)),d=Ke(()=>!!e(Ge));Zt($t,{get columns(){return ht},get data(){return e(Ye)},get loading(){return e(we)},get error(){return e(t)},get searchTerm(){return e(Pe)},searchPlaceholder:"Search credentials by name, description, or endpoint...",get currentPage(){return e(K)},get perPage(){return e(ce)},get totalPages(){return e(ue)},get totalItems(){return e(Z),u(()=>e(Z).length)},itemName:"credentials",emptyIconType:"key",get showRetry(){return e(d)},get mobileCardConfig(){return kt},$$events:{search:wt,pageChange:Ct,perPageChange:Pt,retry:pt,edit:At,delete:Tt},$$slots:{"mobile-card":(b,f)=>{const l=Ke(()=>f.item);var h=dr(),A=o(h),z=o(A),I=o(z),F=o(I,!0);i(I);var k=a(I,2),V=o(k,!0);i(k);var q=a(k,2),B=o(q),S=o(B);Yt(S,()=>(be(He),be(e(l)),u(()=>He(e(l).forge_type||"unknown"))));var te=a(S,2),re=o(te,!0);i(te),i(B),i(q),i(z),i(A);var ae=a(A,2),H=o(ae);{var oe=j=>{nt(j,{variant:"success",text:"PAT"})},R=j=>{nt(j,{variant:"info",text:"App"})};G(H,j=>{be(e(l)),u(()=>(e(l)["auth-type"]||"pat")==="pat")?j(oe):j(R,!1)})}var Y=a(H,2),ie=o(Y);ot(ie,{action:"edit",size:"sm",title:"Edit credentials",ariaLabel:"Edit credentials",$$events:{click:()=>qe(e(l))}});var pe=a(ie,2);ot(pe,{action:"delete",size:"sm",title:"Delete credentials",ariaLabel:"Delete credentials",$$events:{click:()=>Be(e(l))}}),i(Y),i(ae),i(h),se(()=>{W(F,(be(e(l)),u(()=>e(l).name))),W(V,(be(e(l)),u(()=>e(l).description))),W(re,(be(e(l)),u(()=>e(l).endpoint?.name||"Unknown")))}),$(b,h)}}})}i(Le);var Ze=a(Le,2);{var Et=t=>{var d=gr(),b=o(d),f=a(b,2),l=o(f),h=a(o(l),2);i(l);var A=a(l,2),z=o(A);Xt(z,{get selectedForgeType(){return e(x)},set selectedForgeType(s){n(x,s)},$$events:{select:yt},$$legacy:!0});var I=a(z,2),F=a(o(I),2);L(F),i(I);var k=a(I,2),V=a(o(k),2);rt(V),i(k);var q=a(k,2),B=a(o(q),2);se(()=>{e(r),Nt(()=>{e(ze)})});var S=o(B);S.value=S.__value="";var te=a(S);Ht(te,1,()=>e(ze),Rt,(s,c)=>{var m=sr(),C=o(m);i(m);var T={};se(()=>{W(C,`${e(c),u(()=>e(c).name)??""} (${e(c),u(()=>e(c).endpoint_type)??""})`),T!==(T=(e(c),u(()=>e(c).name)))&&(m.value=(m.__value=(e(c),u(()=>e(c).name)))??"")}),$(s,m)}),i(B);var re=a(B,2);{var ae=s=>{var c=lr(),m=o(c);i(c),se(()=>W(m,`Showing only ${e(x)??""} endpoints`)),$(s,c)};G(re,s=>{e(x)&&s(ae)})}i(q);var H=a(q,2),oe=a(o(H),2),R=o(oe),Y=a(R,2);i(oe);var ie=a(oe,2);{var pe=s=>{var c=cr();$(s,c)};G(ie,s=>{e(x)==="gitea"&&s(pe)})}i(H);var j=a(H,2);{var De=s=>{var c=ur(),m=a(o(c),2);L(m),i(c),N(m,()=>e(r).oauth2_token,C=>_(r,e(r).oauth2_token=C)),$(s,c)};G(j,s=>{e(D),u(()=>e(D)===y.PAT)&&s(De)})}var fe=a(j,2);{var Me=s=>{var c=pr(),m=Fe(c),C=a(o(m),2);L(C),i(m);var T=a(m,2),O=a(o(T),2);L(O),i(T);var de=a(T,2),ge=a(o(de),2),xe=o(ge),_e=a(xe,2),he=a(o(_e),2),Ie=o(he);X(),i(he),X(2),i(_e),i(ge),i(de),N(C,()=>e(r).app_id,ye=>_(r,e(r).app_id=ye)),N(O,()=>e(r).installation_id,ye=>_(r,e(r).installation_id=ye)),v("change",xe,Je),v("click",Ie,()=>document.getElementById("private_key")?.click()),$(s,c)};G(fe,s=>{e(D),u(()=>e(D)===y.APP)&&s(Me)})}var w=a(fe,2),ne=o(w),me=a(ne,2);i(w),i(A),i(f),i(d),se(s=>{je(R,1,`flex-1 py-2 px-4 text-sm font-medium rounded-md border focus:outline-none focus:ring-2 focus:ring-blue-500 cursor-pointer - ${e(D),u(()=>e(D)===y.PAT?"bg-blue-600 text-white border-blue-600":"bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600")??""} - ${s??""}`),Y.disabled=e(x)==="gitea",je(Y,1,`flex-1 py-2 px-4 text-sm font-medium rounded-md border focus:outline-none focus:ring-2 focus:ring-blue-500 - ${e(D),u(()=>e(D)===y.APP?"bg-blue-600 text-white border-blue-600":"bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600")??""} - ${e(x)==="gitea"?"opacity-50 cursor-not-allowed":"cursor-pointer"}`),me.disabled=!e(Ue),je(me,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors - ${e(Ue)?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed"}`)},[()=>(e(r),u(()=>(e(r).endpoint&&_t(e(r).endpoint),"")))]),v("click",b,P),v("click",h,P),N(F,()=>e(r).name,s=>_(r,e(r).name=s)),N(V,()=>e(r).description,s=>_(r,e(r).description=s)),Ot(B,()=>e(r).endpoint,s=>_(r,e(r).endpoint=s)),v("click",R,()=>Oe(y.PAT)),v("click",Y,()=>Oe(y.APP)),v("click",ne,P),v("submit",A,at(vt)),$(t,d)};G(Ze,t=>{e(Ae)&&t(Et)})}var et=a(Ze,2);{var Dt=t=>{var d=fr(),b=o(d),f=a(b,2),l=o(f),h=o(l),A=a(o(h),2),z=o(A);i(A),i(h);var I=a(h,2);i(l);var F=a(l,2),k=o(F),V=a(o(k),2);L(V),i(k);var q=a(k,2),B=a(o(q),2);rt(B),i(q);var S=a(q,2),te=a(o(S),2);L(te),X(2),i(S);var re=a(S,2),ae=a(o(re),2),H=o(ae),oe=o(H,!0);i(H),i(ae),X(2),i(re);var R=a(re,2),Y=o(R),ie=o(Y);L(ie),X(2),i(Y),X(2),i(R);var pe=a(R,2);{var j=w=>{var ne=vr(),me=Fe(ne);{var s=C=>{var T=yr(),O=a(o(T),2);L(O),i(T),N(O,()=>e(r).oauth2_token,de=>_(r,e(r).oauth2_token=de)),$(C,T)};G(me,C=>{e(g),u(()=>e(g)["auth-type"]===y.PAT)&&C(s)})}var c=a(me,2);{var m=C=>{var T=br(),O=Fe(T),de=a(o(O),2);L(de),i(O);var ge=a(O,2),xe=a(o(ge),2);L(xe),i(ge);var _e=a(ge,2),he=a(o(_e),2),Ie=o(he),ye=a(Ie,2),tt=a(o(ye),2),Ft=o(tt);X(),i(tt),X(2),i(ye),i(he),i(_e),N(de,()=>e(r).app_id,Ne=>_(r,e(r).app_id=Ne)),N(xe,()=>e(r).installation_id,Ne=>_(r,e(r).installation_id=Ne)),v("change",Ie,Je),v("click",Ft,()=>document.getElementById("edit_private_key")?.click()),$(C,T)};G(c,C=>{e(g),u(()=>e(g)["auth-type"]===y.APP)&&C(m)})}$(w,ne)};G(pe,w=>{e(ee)&&w(j)})}var De=a(pe,2),fe=o(De),Me=a(fe,2);i(De),i(F),i(f),i(d),se((w,ne)=>{W(z,`Update credentials for ${e(g),u(()=>e(g)?.name||"Unknown")??""}`),Jt(te,(e(r),u(()=>e(r).endpoint))),W(oe,(e(g),u(()=>(e(g)?.["auth-type"]||y.PAT)===y.PAT?"Personal Access Token (PAT)":"GitHub App"))),Me.disabled=w,je(Me,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors - ${ne??""}`)},[()=>u(()=>!Qe()),()=>u(()=>Qe()?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed")]),v("click",b,P),v("click",I,P),N(V,()=>e(r).name,w=>_(r,e(r).name=w)),N(B,()=>e(r).description,w=>_(r,e(r).description=w)),Qt(ie,()=>e(ee),w=>n(ee,w)),v("click",fe,P),v("submit",F,at(ft)),$(t,d)};G(et,t=>{e(Te)&&e(g)&&t(Dt)})}var Mt=a(et,2);{var It=t=>{var d=mr(),b=o(d),f=a(b,2),l=o(f),h=o(l),A=a(o(h),2),z=a(o(A),2),I=o(z);i(z),i(A),i(h),i(l);var F=a(l,2),k=o(F),V=a(k,2);i(F),i(f),i(d),se(()=>W(I,`Are you sure you want to delete the credentials "${e(M),u(()=>e(M)?.name||"Unknown")??""}"? This action cannot be undone.`)),v("click",b,P),v("click",k,P),v("click",V,mt),$(t,d)};G(Mt,t=>{e($e)&&e(M)&&t(It)})}$(dt,We),Bt(),ct()}export{qr as component}; diff --git a/webapp/assets/_app/immutable/nodes/3.CcPcfE5H.js b/webapp/assets/_app/immutable/nodes/3.CcPcfE5H.js new file mode 100644 index 00000000..d34f74d4 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/3.CcPcfE5H.js @@ -0,0 +1,7 @@ +import"../chunks/DsnmJJEf.js";import{i as jt}from"../chunks/C7KraPli.js";import{p as Gt,g as e,o as Ut,l as J,h as zt,f as E,i as f,j as qt,a as Fe,b as $,c as Bt,$ as St,m as p,k as n,n as Lt,d as o,s as a,r as i,u,q as be,v as Ke,t as se,e as W,w as _,x as rt,y as Nt,z as X}from"../chunks/cPTQ2Ibn.js";import{i as G,s as Kt,a as Vt}from"../chunks/DqFqoVWr.js";import{e as Ht,i as Rt}from"../chunks/CiWDXYQd.js";import{h as Yt,r as L,s as je,b as Ot,a as Jt,g as fe}from"../chunks/DqbUkQgD.js";import{b as N,a as Qt}from"../chunks/B-_QCM7E.js";import{p as at}from"../chunks/D4Caz1gY.js";import{P as Wt}from"../chunks/U3V4g_hv.js";import{F as Xt}from"../chunks/Cqnw7O8j.js";import{A as ot}from"../chunks/C2rI8IaC.js";import{D as Zt,G as it,A as er}from"../chunks/Du50aAe5.js";import{e as tr,a as Ve}from"../chunks/JUkrBp3F.js";import{t as ke}from"../chunks/Bgbd8SZ5.js";import{f as rr,p as ar,g as He,B as nt,c as or}from"../chunks/DJsB5Z5V.js";import{e as Re}from"../chunks/BZiHL9L3.js";import"../chunks/D7e9zx6w.js";import{E as ir}from"../chunks/CYqkNFLz.js";import{S as nr}from"../chunks/BZ2WxPPD.js";var dr=E('

'),sr=E(""),lr=E('

'),cr=E('

Gitea only supports PAT authentication

'),ur=E('
'),pr=E('

or drag and drop

PEM, KEY files only

',1),gr=E(''),yr=E('
'),br=E('

or drag and drop

PEM, KEY files only. Upload new private key.

',1),fr=E(" ",1),vr=E(''),mr=E(''),xr=E('
',1);function Br(dt,st){Gt(st,!1);const[lt,ct]=Kt(),U=()=>Vt(tr,"$eagerCache",lt),Ge=p(),Z=p(),Ye=p(),Ue=p(),ze=p(),y={PAT:"pat",APP:"app"};let we=p(!0),le=p([]),Q=p([]),Ce=p(""),Pe=p(""),K=p(1),ce=p(25),ue=p(1),Ae=p(!1),Te=p(!1),$e=p(!1),D=p(y.PAT),g=p(null),M=p(null),r=p({name:"",description:"",endpoint:"",auth_type:y.PAT,oauth2_token:"",app_id:"",installation_id:"",private_key_bytes:""}),Ee={...e(r)},ee=p(!1);function ut(t){t.key==="Escape"&&(e(Ae)||e(Te)||e($e))&&P()}Ut(async()=>{try{n(we,!0);const[t,d]=await Promise.all([Ve.getCredentials(),Ve.getEndpoints()]);t&&Array.isArray(t)&&n(le,t),d&&Array.isArray(d)&&n(Q,d)}catch(t){console.error("Failed to load credentials:",t),n(Ce,t instanceof Error?t.message:"Failed to load credentials")}finally{n(we,!1)}});async function pt(){try{await Ve.retryResource("credentials")}catch(t){console.error("Retry failed:",t)}}async function gt(){Se(),n(Ae,!0),n(x,"github"),_(r,e(r).auth_type=y.PAT)}let x=p("");function yt(t){n(x,t.detail),Se()}async function qe(t){n(g,t),n(r,{name:t.name||"",description:t.description||"",endpoint:t.endpoint?.name||"",auth_type:t["auth-type"]||y.PAT,oauth2_token:"",app_id:"",installation_id:"",private_key_bytes:""}),n(D,t["auth-type"]||y.PAT),Ee={...e(r)},n(ee,!1),n(Te,!0)}function Be(t){n(M,t),n($e,!0)}function Se(){n(r,{name:"",description:"",endpoint:"",auth_type:y.PAT,oauth2_token:"",app_id:"",installation_id:"",private_key_bytes:""}),Ee={...e(r)},n(D,y.PAT),n(ee,!1)}function P(){n(Ae,!1),n(Te,!1),n($e,!1),n(g,null),n(M,null),n(x,""),Se()}function Oe(t){n(D,t),_(r,e(r).auth_type=t)}function bt(){const t={};if(e(r).name!==Ee.name&&e(r).name.trim()!==""&&(t.name=e(r).name.trim()),e(r).description!==Ee.description&&e(r).description.trim()!==""&&(t.description=e(r).description.trim()),e(ee)&&e(g))if(e(g)["auth-type"]===y.PAT)e(r).oauth2_token.trim()!==""&&(t.pat={oauth2_token:e(r).oauth2_token.trim()});else{const d={};let b=!1;if(e(r).app_id.trim()!==""&&(d.app_id=parseInt(e(r).app_id.trim()),b=!0),e(r).installation_id.trim()!==""&&(d.installation_id=parseInt(e(r).installation_id.trim()),b=!0),e(r).private_key_bytes!=="")try{const v=atob(e(r).private_key_bytes);d.private_key_bytes=Array.from(v,l=>l.charCodeAt(0)),b=!0}catch{}b&&(t.app=d)}return t}async function ft(){try{if(e(x)==="github")await fe.createGithubCredentials(e(r));else if(e(x)==="gitea")await fe.createGiteaCredentials(e(r));else throw new Error("Please select a forge type");ke.success("Credentials Created",`Credentials ${e(r).name} have been created successfully.`),P()}catch(t){n(Ce,Re(t))}}async function vt(){if(!(!e(g)||!e(g).id))try{const t=bt();if(Object.keys(t).length===0){ke.info("No Changes","No fields were modified."),P();return}e(g).forge_type==="github"?await fe.updateGithubCredentials(e(g).id,t):await fe.updateGiteaCredentials(e(g).id,t),ke.success("Credentials Updated",`Credentials ${e(g)?.name||"Unknown"} have been updated successfully.`),P()}catch(t){n(Ce,Re(t))}}async function mt(){if(!(!e(M)||!e(M).id))try{e(M).forge_type==="github"?await fe.deleteGithubCredentials(e(M).id):await fe.deleteGiteaCredentials(e(M).id),ke.success("Credentials Deleted",`Credentials ${e(M)?.name||"Unknown"} have been deleted successfully.`)}catch(t){const d=Re(t);ke.error("Delete Failed",d)}finally{P()}}function Je(t){const b=t.target.files?.[0];if(!b){_(r,e(r).private_key_bytes="");return}const v=new FileReader;v.onload=l=>{const h=l.target?.result;_(r,e(r).private_key_bytes=btoa(h))},v.readAsText(b)}function Qe(){return e(r).name.trim()?e(ee)&&e(g)?e(g)["auth-type"]===y.PAT?!!e(r).oauth2_token.trim():!!e(r).app_id.trim()&&!!e(r).installation_id.trim()&&!!e(r).private_key_bytes:!0:!1}function xt(t){return e(Q).find(b=>b.name===t)?.endpoint_type||""}function _t(t){return xt(t)==="gitea"}const ht=[{key:"name",title:"Name",cellComponent:it,cellProps:{field:"name"}},{key:"description",title:"Description",cellComponent:it,cellProps:{field:"description",type:"description"}},{key:"endpoint",title:"Endpoint",cellComponent:ir},{key:"auth_type",title:"Auth Type",cellComponent:nr,cellProps:{statusType:"custom",statusField:"auth-type"}},{key:"actions",title:"Actions",align:"right",cellComponent:er}],kt={entityType:"credential",primaryText:{field:"name",isClickable:!1},secondaryText:{field:"description"},customInfo:[{icon:t=>He(t?.forge_type||"unknown"),text:t=>t?.endpoint?.name||"Unknown"}],badges:[{type:"auth",field:"auth-type"}],actions:[{type:"edit",handler:t=>qe(t)},{type:"delete",handler:t=>Be(t)}]};function wt(t){n(Pe,t.detail.term),n(K,1)}function Ct(t){n(K,t.detail.page)}function Pt(t){const d=or(t.detail.perPage);n(ce,d.newPerPage),n(K,d.newCurrentPage)}function At(t){qe(t.detail.item)}function Tt(t){Be(t.detail.item)}J(()=>(e(le),U()),()=>{(!e(le).length||U().loaded.credentials)&&n(le,U().credentials)}),J(()=>U(),()=>{n(we,U().loading.credentials)}),J(()=>U(),()=>{n(Ge,U().errorMessages.credentials)}),J(()=>(e(Q),U()),()=>{(!e(Q).length||U().loaded.endpoints)&&n(Q,U().endpoints)}),J(()=>(e(le),e(Pe)),()=>{n(Z,rr(e(le),e(Pe)))}),J(()=>(e(ue),e(Z),e(ce),e(K)),()=>{n(ue,Math.ceil(e(Z).length/e(ce))),e(K)>e(ue)&&e(ue)>0&&n(K,e(ue))}),J(()=>(e(Z),e(K),e(ce)),()=>{n(Ye,ar(e(Z),e(K),e(ce)))}),J(()=>e(r),()=>{n(Ue,!e(r).name||!e(r).endpoint?!1:e(r).auth_type===y.PAT?!!e(r).oauth2_token:!!e(r).app_id&&!!e(r).installation_id&&!!e(r).private_key_bytes)}),J(()=>(e(x),e(Q)),()=>{n(ze,e(x)?e(Q).filter(t=>t.endpoint_type===e(x)):e(Q))}),zt(),jt();var We=xr();f("keydown",Lt,ut),qt(t=>{St.title="Credentials - GARM"});var Le=Fe(We),Xe=o(Le);Wt(Xe,{title:"Credentials",description:"Manage authentication credentials for your GitHub and Gitea endpoints.",actionLabel:"Add Credentials",$$events:{action:gt}});var $t=a(Xe,2);{let t=Ke(()=>e(Ge)||e(Ce)),d=Ke(()=>!!e(Ge));Zt($t,{get columns(){return ht},get data(){return e(Ye)},get loading(){return e(we)},get error(){return e(t)},get searchTerm(){return e(Pe)},searchPlaceholder:"Search credentials by name, description, or endpoint...",get currentPage(){return e(K)},get perPage(){return e(ce)},get totalPages(){return e(ue)},get totalItems(){return e(Z),u(()=>e(Z).length)},itemName:"credentials",emptyIconType:"key",get showRetry(){return e(d)},get mobileCardConfig(){return kt},$$events:{search:wt,pageChange:Ct,perPageChange:Pt,retry:pt,edit:At,delete:Tt},$$slots:{"mobile-card":(b,v)=>{const l=Ke(()=>v.item);var h=dr(),A=o(h),z=o(A),I=o(z),F=o(I,!0);i(I);var k=a(I,2),V=o(k,!0);i(k);var q=a(k,2),B=o(q),S=o(B);Yt(S,()=>(be(He),be(e(l)),u(()=>He(e(l).forge_type||"unknown"))));var te=a(S,2),re=o(te,!0);i(te),i(B),i(q),i(z),i(A);var ae=a(A,2),H=o(ae);{var oe=j=>{nt(j,{variant:"success",text:"PAT"})},R=j=>{nt(j,{variant:"info",text:"App"})};G(H,j=>{be(e(l)),u(()=>(e(l)["auth-type"]||"pat")==="pat")?j(oe):j(R,!1)})}var Y=a(H,2),ie=o(Y);ot(ie,{action:"edit",size:"sm",title:"Edit credentials",ariaLabel:"Edit credentials",$$events:{click:()=>qe(e(l))}});var pe=a(ie,2);ot(pe,{action:"delete",size:"sm",title:"Delete credentials",ariaLabel:"Delete credentials",$$events:{click:()=>Be(e(l))}}),i(Y),i(ae),i(h),se(()=>{W(F,(be(e(l)),u(()=>e(l).name))),W(V,(be(e(l)),u(()=>e(l).description))),W(re,(be(e(l)),u(()=>e(l).endpoint?.name||"Unknown")))}),$(b,h)}}})}i(Le);var Ze=a(Le,2);{var Et=t=>{var d=gr(),b=o(d),v=a(b,2),l=o(v),h=a(o(l),2);i(l);var A=a(l,2),z=o(A);Xt(z,{get selectedForgeType(){return e(x)},set selectedForgeType(s){n(x,s)},$$events:{select:yt},$$legacy:!0});var I=a(z,2),F=a(o(I),2);L(F),i(I);var k=a(I,2),V=a(o(k),2);rt(V),i(k);var q=a(k,2),B=a(o(q),2);se(()=>{e(r),Nt(()=>{e(ze)})});var S=o(B);S.value=S.__value="";var te=a(S);Ht(te,1,()=>e(ze),Rt,(s,c)=>{var m=sr(),C=o(m);i(m);var T={};se(()=>{W(C,`${e(c),u(()=>e(c).name)??""} (${e(c),u(()=>e(c).endpoint_type)??""})`),T!==(T=(e(c),u(()=>e(c).name)))&&(m.value=(m.__value=(e(c),u(()=>e(c).name)))??"")}),$(s,m)}),i(B);var re=a(B,2);{var ae=s=>{var c=lr(),m=o(c);i(c),se(()=>W(m,`Showing only ${e(x)??""} endpoints`)),$(s,c)};G(re,s=>{e(x)&&s(ae)})}i(q);var H=a(q,2),oe=a(o(H),2),R=o(oe),Y=a(R,2);i(oe);var ie=a(oe,2);{var pe=s=>{var c=cr();$(s,c)};G(ie,s=>{e(x)==="gitea"&&s(pe)})}i(H);var j=a(H,2);{var De=s=>{var c=ur(),m=a(o(c),2);L(m),i(c),N(m,()=>e(r).oauth2_token,C=>_(r,e(r).oauth2_token=C)),$(s,c)};G(j,s=>{e(D),u(()=>e(D)===y.PAT)&&s(De)})}var ve=a(j,2);{var Me=s=>{var c=pr(),m=Fe(c),C=a(o(m),2);L(C),i(m);var T=a(m,2),O=a(o(T),2);L(O),i(T);var de=a(T,2),ge=a(o(de),2),xe=o(ge),_e=a(xe,2),he=a(o(_e),2),Ie=o(he);X(),i(he),X(2),i(_e),i(ge),i(de),N(C,()=>e(r).app_id,ye=>_(r,e(r).app_id=ye)),N(O,()=>e(r).installation_id,ye=>_(r,e(r).installation_id=ye)),f("change",xe,Je),f("click",Ie,()=>document.getElementById("private_key")?.click()),$(s,c)};G(ve,s=>{e(D),u(()=>e(D)===y.APP)&&s(Me)})}var w=a(ve,2),ne=o(w),me=a(ne,2);i(w),i(A),i(v),i(d),se(s=>{je(R,1,`flex-1 py-2 px-4 text-sm font-medium rounded-md border focus:outline-none focus:ring-2 focus:ring-blue-500 cursor-pointer + ${e(D),u(()=>e(D)===y.PAT?"bg-blue-600 text-white border-blue-600":"bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600")??""} + ${s??""}`),Y.disabled=e(x)==="gitea",je(Y,1,`flex-1 py-2 px-4 text-sm font-medium rounded-md border focus:outline-none focus:ring-2 focus:ring-blue-500 + ${e(D),u(()=>e(D)===y.APP?"bg-blue-600 text-white border-blue-600":"bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600")??""} + ${e(x)==="gitea"?"opacity-50 cursor-not-allowed":"cursor-pointer"}`),me.disabled=!e(Ue),je(me,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors + ${e(Ue)?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed"}`)},[()=>(e(r),u(()=>(e(r).endpoint&&_t(e(r).endpoint),"")))]),f("click",b,P),f("click",h,P),N(F,()=>e(r).name,s=>_(r,e(r).name=s)),N(V,()=>e(r).description,s=>_(r,e(r).description=s)),Ot(B,()=>e(r).endpoint,s=>_(r,e(r).endpoint=s)),f("click",R,()=>Oe(y.PAT)),f("click",Y,()=>Oe(y.APP)),f("click",ne,P),f("submit",A,at(ft)),$(t,d)};G(Ze,t=>{e(Ae)&&t(Et)})}var et=a(Ze,2);{var Dt=t=>{var d=vr(),b=o(d),v=a(b,2),l=o(v),h=o(l),A=a(o(h),2),z=o(A);i(A),i(h);var I=a(h,2);i(l);var F=a(l,2),k=o(F),V=a(o(k),2);L(V),i(k);var q=a(k,2),B=a(o(q),2);rt(B),i(q);var S=a(q,2),te=a(o(S),2);L(te),X(2),i(S);var re=a(S,2),ae=a(o(re),2),H=o(ae),oe=o(H,!0);i(H),i(ae),X(2),i(re);var R=a(re,2),Y=o(R),ie=o(Y);L(ie),X(2),i(Y),X(2),i(R);var pe=a(R,2);{var j=w=>{var ne=fr(),me=Fe(ne);{var s=C=>{var T=yr(),O=a(o(T),2);L(O),i(T),N(O,()=>e(r).oauth2_token,de=>_(r,e(r).oauth2_token=de)),$(C,T)};G(me,C=>{e(g),u(()=>e(g)["auth-type"]===y.PAT)&&C(s)})}var c=a(me,2);{var m=C=>{var T=br(),O=Fe(T),de=a(o(O),2);L(de),i(O);var ge=a(O,2),xe=a(o(ge),2);L(xe),i(ge);var _e=a(ge,2),he=a(o(_e),2),Ie=o(he),ye=a(Ie,2),tt=a(o(ye),2),Ft=o(tt);X(),i(tt),X(2),i(ye),i(he),i(_e),N(de,()=>e(r).app_id,Ne=>_(r,e(r).app_id=Ne)),N(xe,()=>e(r).installation_id,Ne=>_(r,e(r).installation_id=Ne)),f("change",Ie,Je),f("click",Ft,()=>document.getElementById("edit_private_key")?.click()),$(C,T)};G(c,C=>{e(g),u(()=>e(g)["auth-type"]===y.APP)&&C(m)})}$(w,ne)};G(pe,w=>{e(ee)&&w(j)})}var De=a(pe,2),ve=o(De),Me=a(ve,2);i(De),i(F),i(v),i(d),se((w,ne)=>{W(z,`Update credentials for ${e(g),u(()=>e(g)?.name||"Unknown")??""}`),Jt(te,(e(r),u(()=>e(r).endpoint))),W(oe,(e(g),u(()=>(e(g)?.["auth-type"]||y.PAT)===y.PAT?"Personal Access Token (PAT)":"GitHub App"))),Me.disabled=w,je(Me,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors + ${ne??""}`)},[()=>u(()=>!Qe()),()=>u(()=>Qe()?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed")]),f("click",b,P),f("click",I,P),N(V,()=>e(r).name,w=>_(r,e(r).name=w)),N(B,()=>e(r).description,w=>_(r,e(r).description=w)),Qt(ie,()=>e(ee),w=>n(ee,w)),f("click",ve,P),f("submit",F,at(vt)),$(t,d)};G(et,t=>{e(Te)&&e(g)&&t(Dt)})}var Mt=a(et,2);{var It=t=>{var d=mr(),b=o(d),v=a(b,2),l=o(v),h=o(l),A=a(o(h),2),z=a(o(A),2),I=o(z);i(z),i(A),i(h),i(l);var F=a(l,2),k=o(F),V=a(k,2);i(F),i(v),i(d),se(()=>W(I,`Are you sure you want to delete the credentials "${e(M),u(()=>e(M)?.name||"Unknown")??""}"? This action cannot be undone.`)),f("click",b,P),f("click",k,P),f("click",V,mt),$(t,d)};G(Mt,t=>{e($e)&&e(M)&&t(It)})}$(dt,We),Bt(),ct()}export{Br as component}; diff --git a/webapp/assets/_app/immutable/nodes/4.CdHupLIu.js b/webapp/assets/_app/immutable/nodes/4.CdHupLIu.js new file mode 100644 index 00000000..80bc853c --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/4.CdHupLIu.js @@ -0,0 +1,3 @@ +import"../chunks/DsnmJJEf.js";import{i as bt}from"../chunks/C7KraPli.js";import{p as gt,g as e,o as ft,l as V,h as _t,f as I,i as b,j as mt,a as Ee,b as F,c as yt,m as u,n as vt,$ as xt,d as o,v as Pe,s as a,t as ye,u as z,k as s,w as g,r as i,q as se,e as ne,x as Ie,z as O}from"../chunks/cPTQ2Ibn.js";import{i as le,s as ht,a as kt}from"../chunks/DqFqoVWr.js";import{h as wt,r as R,c as je,s as Ge,g as ee}from"../chunks/DqbUkQgD.js";import{b as w}from"../chunks/B-_QCM7E.js";import{p as ze}from"../chunks/D4Caz1gY.js";import{P as Ct}from"../chunks/U3V4g_hv.js";import{F as Et}from"../chunks/Cqnw7O8j.js";import{A as qe}from"../chunks/C2rI8IaC.js";import{e as Pt,a as He}from"../chunks/JUkrBp3F.js";import{t as de}from"../chunks/Bgbd8SZ5.js";import{g as $e,c as $t,a as At,p as Rt}from"../chunks/DJsB5Z5V.js";import{e as Ae}from"../chunks/BZiHL9L3.js";import{D as Bt,G as Re,A as Ut}from"../chunks/Du50aAe5.js";import"../chunks/D7e9zx6w.js";import{E as Lt}from"../chunks/CYqkNFLz.js";var Mt=I('

'),Tt=I('
',1),Dt=I('

If empty, Base URL will be used as API Base URL

'),Ft=I(''),It=I('
',1),jt=I('

If empty, Base URL will be used as API Base URL

'),Gt=I(''),zt=I(''),qt=I('
',1);function ir(Ne,Se){gt(Se,!1);const[Ve,Oe]=ht(),q=()=>kt(Pt,"$eagerCache",Ve),ve=u(),H=u(),Be=u(),te=u();let ue=u(!0),K=u([]),ce=u(""),pe=u(""),B=u(1),J=u(25),Q=u(1),be=u(!1),ge=u(!1),fe=u(!1),j=u("github"),m=u(null),P=u(null),r=u({name:"",description:"",endpoint_type:"",base_url:"",api_base_url:"",upload_base_url:"",ca_cert_bundle:""}),h={...e(r)};ft(async()=>{try{s(ue,!0);const t=await He.getEndpoints();t&&Array.isArray(t)&&s(K,t)}catch(t){console.error("Failed to load endpoints:",t),s(ce,t instanceof Error?t.message:"Failed to load endpoints")}finally{s(ue,!1)}});async function Ke(){try{await He.retryResource("endpoints")}catch(t){console.error("Retry failed:",t)}}const Je=[{key:"name",title:"Name",cellComponent:Re,cellProps:{field:"name"}},{key:"description",title:"Description",cellComponent:Re,cellProps:{field:"description"}},{key:"api_url",title:"API URL",cellComponent:Re,cellProps:{field:"api_base_url",fallbackField:"base_url"}},{key:"forge_type",title:"Forge Type",cellComponent:Lt},{key:"actions",title:"Actions",align:"right",cellComponent:Ut}],Qe={entityType:"endpoint",primaryText:{field:"name",isClickable:!1},secondaryText:{field:"description"},customInfo:[{icon:t=>$e(t?.endpoint_type||"unknown"),text:t=>t?.api_base_url||"Unknown"}],actions:[{type:"edit",handler:t=>xe(t)},{type:"delete",handler:t=>he(t)}]};function We(t){s(pe,t.detail.term),s(B,1)}function Xe(t){s(B,t.detail.page)}function Ye(t){const n=$t(t.detail.perPage);s(J,n.newPerPage),s(B,n.newCurrentPage)}function Ze(t){xe(t.detail.item)}function et(t){he(t.detail.item)}function tt(){s(j,"github"),ke(),g(r,e(r).endpoint_type="github"),s(be,!0)}function rt(t){s(j,t.detail),ke(),g(r,e(r).endpoint_type=t.detail)}function xe(t){s(m,t),s(r,{name:t.name||"",description:t.description||"",endpoint_type:t.endpoint_type||"",base_url:t.base_url||"",api_base_url:t.api_base_url||"",upload_base_url:t.upload_base_url||"",ca_cert_bundle:typeof t.ca_cert_bundle=="string"?t.ca_cert_bundle:""}),h={...e(r)},s(ge,!0)}function he(t){s(P,t),s(fe,!0)}function ke(){s(r,{name:"",description:"",endpoint_type:"",base_url:"",api_base_url:"",upload_base_url:"",ca_cert_bundle:""}),h={...e(r)}}function at(t){t.key==="Escape"&&(e(be)||e(ge)||e(fe))&&y()}function y(){s(be,!1),s(ge,!1),s(fe,!1),s(j,"github"),s(m,null),s(P,null),ke()}function ot(){const t={};if(e(r).description!==h.description&&(e(r).description.trim()!==""||h.description!=="")&&(t.description=e(r).description.trim()),e(r).base_url!==h.base_url&&e(r).base_url.trim()!==""&&(t.base_url=e(r).base_url.trim()),e(r).api_base_url!==h.api_base_url&&(e(r).api_base_url.trim()!==""||h.api_base_url!=="")&&(t.api_base_url=e(r).api_base_url.trim()),e(m)?.endpoint_type==="github"&&e(r).upload_base_url!==h.upload_base_url&&(e(r).upload_base_url.trim()!==""||h.upload_base_url!=="")&&(t.upload_base_url=e(r).upload_base_url.trim()),e(r).ca_cert_bundle!==h.ca_cert_bundle)if(e(r).ca_cert_bundle!=="")try{const n=atob(e(r).ca_cert_bundle);t.ca_cert_bundle=Array.from(n,c=>c.charCodeAt(0))}catch{h.ca_cert_bundle!==""&&(t.ca_cert_bundle=[])}else h.ca_cert_bundle!==""&&(t.ca_cert_bundle=[]);return t}async function it(){try{const t={name:e(r).name,description:e(r).description,endpoint_type:e(r).endpoint_type,base_url:e(r).base_url,api_base_url:e(r).api_base_url,upload_base_url:e(r).upload_base_url};if(e(r).ca_cert_bundle&&e(r).ca_cert_bundle.trim()!=="")try{const n=atob(e(r).ca_cert_bundle);t.ca_cert_bundle=Array.from(n,c=>c.charCodeAt(0))}catch{}e(r).endpoint_type==="github"?await ee.createGithubEndpoint(t):await ee.createGiteaEndpoint(t),de.success("Endpoint Created",`Endpoint ${e(r).name} has been created successfully.`),y()}catch(t){s(ce,Ae(t))}}async function st(){if(e(m))try{const t=ot();if(Object.keys(t).length===0){de.info("No Changes","No fields were modified."),y();return}e(m).endpoint_type==="github"?await ee.updateGithubEndpoint(e(m).name,t):await ee.updateGiteaEndpoint(e(m).name,t),de.success("Endpoint Updated",`Endpoint ${e(m).name} has been updated successfully.`),y()}catch(t){s(ce,Ae(t))}}async function nt(){if(e(P)){try{e(P).endpoint_type==="github"?await ee.deleteGithubEndpoint(e(P).name):await ee.deleteGiteaEndpoint(e(P).name),de.success("Endpoint Deleted",`Endpoint ${e(P).name} has been deleted successfully.`)}catch(t){const n=Ae(t);de.error("Delete Failed",n)}y()}}function Ue(t){const c=t.target.files?.[0];if(!c){g(r,e(r).ca_cert_bundle="");return}const v=new FileReader;v.onload=l=>{const f=l.target?.result;g(r,e(r).ca_cert_bundle=btoa(f))},v.readAsText(c)}V(()=>(e(K),q()),()=>{(!e(K).length||q().loaded.endpoints)&&s(K,q().endpoints)}),V(()=>q(),()=>{s(ue,q().loading.endpoints)}),V(()=>q(),()=>{s(ve,q().errorMessages.endpoints)}),V(()=>(e(K),e(pe)),()=>{s(H,At(e(K),e(pe)))}),V(()=>(e(Q),e(H),e(J),e(B)),()=>{s(Q,Math.ceil(e(H).length/e(J))),e(B)>e(Q)&&e(Q)>0&&s(B,e(Q))}),V(()=>(e(H),e(B),e(J)),()=>{s(Be,Rt(e(H),e(B),e(J)))}),V(()=>e(r),()=>{s(te,!(!e(r).name||!e(r).base_url||e(r).endpoint_type==="github"&&!e(r).api_base_url))}),_t(),bt();var Le=qt();b("keydown",vt,at),mt(t=>{xt.title="Endpoints - GARM"});var we=Ee(Le),Me=o(we);Ct(Me,{title:"Endpoints",description:"Manage your GitHub and Gitea endpoints for runner management.",actionLabel:"Add Endpoint",$$events:{action:tt}});var lt=a(Me,2);{let t=Pe(()=>e(ve)||e(ce)),n=Pe(()=>!!e(ve));Bt(lt,{get columns(){return Je},get data(){return e(Be)},get loading(){return e(ue)},get error(){return e(t)},get searchTerm(){return e(pe)},searchPlaceholder:"Search endpoints by name, description, or URL...",get currentPage(){return e(B)},get perPage(){return e(J)},get totalPages(){return e(Q)},get totalItems(){return e(H),z(()=>e(H).length)},itemName:"endpoints",emptyIconType:"settings",get showRetry(){return e(n)},get mobileCardConfig(){return Qe},$$events:{search:We,pageChange:Xe,perPageChange:Ye,retry:Ke,edit:Ze,delete:et},$$slots:{"mobile-card":(c,v)=>{const l=Pe(()=>v.item);var f=Mt(),x=o(f),$=o(x),C=o($),k=o(C,!0);i(C);var _=a(C,2),U=o(_,!0);i(_);var A=a(_,2),L=o(A);wt(L,()=>(se($e),se(e(l)),z(()=>$e(e(l).endpoint_type||"","w-5 h-5"))));var M=a(L,2),W=o(M,!0);i(M),i(A),i($),i(x);var N=a(x,2),G=o(N);qe(G,{action:"edit",size:"sm",title:"Edit endpoint",ariaLabel:"Edit endpoint",$$events:{click:()=>xe(e(l))}});var X=a(G,2);qe(X,{action:"delete",size:"sm",title:"Delete endpoint",ariaLabel:"Delete endpoint",$$events:{click:()=>he(e(l))}}),i(N),i(f),ye(()=>{ne(k,(se(e(l)),z(()=>e(l).name))),ne(U,(se(e(l)),z(()=>e(l).description))),ne(W,(se(e(l)),z(()=>e(l).endpoint_type)))}),F(c,f)}}})}i(we);var Te=a(we,2);{var dt=t=>{var n=Ft(),c=o(n),v=a(c,2),l=o(v),f=a(o(l),2);i(l);var x=a(l,2),$=o(x);Et($,{get selectedForgeType(){return e(j)},set selectedForgeType(p){s(j,p)},$$events:{select:rt},$$legacy:!0});var C=a($,2),k=a(o(C),2);R(k),i(C);var _=a(C,2),U=a(o(_),2);Ie(U),i(_);var A=a(_,2),L=a(o(A),2);R(L),i(A);var M=a(A,2);{var W=p=>{var T=Tt(),d=Ee(T),E=a(o(d),2);R(E),i(d);var D=a(d,2),S=a(o(D),2);R(S),i(D),w(E,()=>e(r).api_base_url,Z=>g(r,e(r).api_base_url=Z)),w(S,()=>e(r).upload_base_url,Z=>g(r,e(r).upload_base_url=Z)),F(p,T)},N=p=>{var T=Dt(),d=a(o(T),2);R(d),O(2),i(T),w(d,()=>e(r).api_base_url,E=>g(r,e(r).api_base_url=E)),F(p,T)};le(M,p=>{e(j)==="github"?p(W):p(N,!1)})}var G=a(M,2),X=a(o(G),2),Y=o(X),re=a(Y,2),ae=a(o(re),2),_e=o(ae);O(),i(ae),O(2),i(re),i(X),i(G);var oe=a(G,2),me=o(oe),ie=a(me,2);i(oe),i(x),i(v),i(n),ye(()=>{je(k,"placeholder",e(j)==="github"?"e.g., github-enterprise or github-com":"e.g., gitea-main or my-gitea"),je(L,"placeholder",e(j)==="github"?"https://github.com or https://github.example.com":"https://gitea.example.com"),ie.disabled=!e(te),Ge(ie,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors + ${e(te)?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed"}`)}),b("click",c,y),b("click",f,y),w(k,()=>e(r).name,p=>g(r,e(r).name=p)),w(U,()=>e(r).description,p=>g(r,e(r).description=p)),w(L,()=>e(r).base_url,p=>g(r,e(r).base_url=p)),b("change",Y,Ue),b("click",_e,()=>document.getElementById("ca_cert_file")?.click()),b("click",me,y),b("submit",x,ze(it)),F(t,n)};le(Te,t=>{e(be)&&t(dt)})}var De=a(Te,2);{var ut=t=>{var n=Gt(),c=o(n),v=a(c,2),l=o(v),f=o(l),x=o(f),$=o(x);i(x),O(2),i(f);var C=a(f,2);i(l);var k=a(l,2),_=o(k),U=a(o(_),2);R(U),i(_);var A=a(_,2),L=a(o(A),2);Ie(L),i(A);var M=a(A,2),W=a(o(M),2);R(W),i(M);var N=a(M,2);{var G=d=>{var E=It(),D=Ee(E),S=a(o(D),2);R(S),i(D);var Z=a(D,2),Fe=a(o(Z),2);R(Fe),i(Z),w(S,()=>e(r).api_base_url,Ce=>g(r,e(r).api_base_url=Ce)),w(Fe,()=>e(r).upload_base_url,Ce=>g(r,e(r).upload_base_url=Ce)),F(d,E)},X=d=>{var E=jt(),D=a(o(E),2);R(D),O(2),i(E),w(D,()=>e(r).api_base_url,S=>g(r,e(r).api_base_url=S)),F(d,E)};le(N,d=>{e(m),z(()=>e(m).endpoint_type==="github")?d(G):d(X,!1)})}var Y=a(N,2),re=a(o(Y),2),ae=o(re),_e=a(ae,2),oe=a(o(_e),2),me=o(oe);O(),i(oe),O(2),i(_e),i(re),i(Y);var ie=a(Y,2),p=o(ie),T=a(p,2);i(ie),i(k),i(v),i(n),ye(()=>{ne($,`Edit ${e(m),z(()=>e(m).endpoint_type==="github"?"GitHub":"Gitea")??""} Endpoint`),T.disabled=!e(te),Ge(T,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors + ${e(te)?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed"}`)}),b("click",c,y),b("click",C,y),w(U,()=>e(r).name,d=>g(r,e(r).name=d)),w(L,()=>e(r).description,d=>g(r,e(r).description=d)),w(W,()=>e(r).base_url,d=>g(r,e(r).base_url=d)),b("change",ae,Ue),b("click",me,()=>document.getElementById("edit_ca_cert_file")?.click()),b("click",p,y),b("submit",k,ze(st)),F(t,n)};le(De,t=>{e(ge)&&e(m)&&t(ut)})}var ct=a(De,2);{var pt=t=>{var n=zt(),c=o(n),v=a(c,2),l=o(v),f=o(l),x=a(o(f),2),$=a(o(x),2),C=o($);i($),i(x),i(f),i(l);var k=a(l,2),_=o(k),U=a(_,2);i(k),i(v),i(n),ye(()=>ne(C,`Are you sure you want to delete the endpoint "${e(P),z(()=>e(P).name)??""}"? This action cannot be undone.`)),b("click",c,y),b("click",_,y),b("click",U,nt),F(t,n)};le(ct,t=>{e(fe)&&e(P)&&t(pt)})}F(Ne,Le),yt(),Oe()}export{ir as component}; diff --git a/webapp/assets/_app/immutable/nodes/4.D_eeR06y.js b/webapp/assets/_app/immutable/nodes/4.D_eeR06y.js deleted file mode 100644 index 6fedec04..00000000 --- a/webapp/assets/_app/immutable/nodes/4.D_eeR06y.js +++ /dev/null @@ -1,3 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as bt}from"../chunks/DT0EGONV.js";import{p as gt,g as e,o as ft,l as V,a as _t,f as I,e as b,h as mt,b as Ee,c as F,d as yt,m as u,i as vt,$ as xt,j as o,q as Pe,k as a,t as ye,u as z,s,w as g,r as i,n as se,v as ne,x as Ie,z as O}from"../chunks/CRKWEg6v.js";import{i as le,s as ht,a as kt}from"../chunks/e1m7WRO5.js";import{h as wt,r as R,c as je,s as Ge,g as ee}from"../chunks/-esynYXT.js";import{b as w}from"../chunks/B3a35v7J.js";import{p as ze}from"../chunks/D4Caz1gY.js";import{P as Ct}from"../chunks/BAnDfGwP.js";import{F as Et}from"../chunks/CiGy614T.js";import{D as Pt,A as qe,G as $e,a as $t}from"../chunks/B1coRVG4.js";import{e as At,a as He}from"../chunks/Djd10kRn.js";import{t as de}from"../chunks/D6DjlyIQ.js";import{g as Ae,c as Rt,a as Bt,p as Ut}from"../chunks/c_t0vA9G.js";import{e as Re}from"../chunks/BZiHL9L3.js";import"../chunks/D0m048VH.js";import{E as Lt}from"../chunks/B27KefbC.js";var Mt=I('

'),Tt=I('
',1),Dt=I('

If empty, Base URL will be used as API Base URL

'),Ft=I(''),It=I('
',1),jt=I('

If empty, Base URL will be used as API Base URL

'),Gt=I(''),zt=I(''),qt=I('
',1);function or(Ne,Se){gt(Se,!1);const[Ve,Oe]=ht(),q=()=>kt(At,"$eagerCache",Ve),ve=u(),H=u(),Be=u(),te=u();let ue=u(!0),K=u([]),ce=u(""),pe=u(""),B=u(1),J=u(25),Q=u(1),be=u(!1),ge=u(!1),fe=u(!1),j=u("github"),m=u(null),P=u(null),r=u({name:"",description:"",endpoint_type:"",base_url:"",api_base_url:"",upload_base_url:"",ca_cert_bundle:""}),h={...e(r)};ft(async()=>{try{s(ue,!0);const t=await He.getEndpoints();t&&Array.isArray(t)&&s(K,t)}catch(t){console.error("Failed to load endpoints:",t),s(ce,t instanceof Error?t.message:"Failed to load endpoints")}finally{s(ue,!1)}});async function Ke(){try{await He.retryResource("endpoints")}catch(t){console.error("Retry failed:",t)}}const Je=[{key:"name",title:"Name",cellComponent:$e,cellProps:{field:"name"}},{key:"description",title:"Description",cellComponent:$e,cellProps:{field:"description"}},{key:"api_url",title:"API URL",cellComponent:$e,cellProps:{field:"api_base_url",fallbackField:"base_url"}},{key:"forge_type",title:"Forge Type",cellComponent:Lt},{key:"actions",title:"Actions",align:"right",cellComponent:$t}],Qe={entityType:"endpoint",primaryText:{field:"name",isClickable:!1},secondaryText:{field:"description"},customInfo:[{icon:t=>Ae(t?.endpoint_type||"unknown"),text:t=>t?.api_base_url||"Unknown"}],actions:[{type:"edit",handler:t=>xe(t)},{type:"delete",handler:t=>he(t)}]};function We(t){s(pe,t.detail.term),s(B,1)}function Xe(t){s(B,t.detail.page)}function Ye(t){const n=Rt(t.detail.perPage);s(J,n.newPerPage),s(B,n.newCurrentPage)}function Ze(t){xe(t.detail.item)}function et(t){he(t.detail.item)}function tt(){s(j,"github"),ke(),g(r,e(r).endpoint_type="github"),s(be,!0)}function rt(t){s(j,t.detail),ke(),g(r,e(r).endpoint_type=t.detail)}function xe(t){s(m,t),s(r,{name:t.name||"",description:t.description||"",endpoint_type:t.endpoint_type||"",base_url:t.base_url||"",api_base_url:t.api_base_url||"",upload_base_url:t.upload_base_url||"",ca_cert_bundle:typeof t.ca_cert_bundle=="string"?t.ca_cert_bundle:""}),h={...e(r)},s(ge,!0)}function he(t){s(P,t),s(fe,!0)}function ke(){s(r,{name:"",description:"",endpoint_type:"",base_url:"",api_base_url:"",upload_base_url:"",ca_cert_bundle:""}),h={...e(r)}}function at(t){t.key==="Escape"&&(e(be)||e(ge)||e(fe))&&y()}function y(){s(be,!1),s(ge,!1),s(fe,!1),s(j,"github"),s(m,null),s(P,null),ke()}function ot(){const t={};if(e(r).description!==h.description&&(e(r).description.trim()!==""||h.description!=="")&&(t.description=e(r).description.trim()),e(r).base_url!==h.base_url&&e(r).base_url.trim()!==""&&(t.base_url=e(r).base_url.trim()),e(r).api_base_url!==h.api_base_url&&(e(r).api_base_url.trim()!==""||h.api_base_url!=="")&&(t.api_base_url=e(r).api_base_url.trim()),e(m)?.endpoint_type==="github"&&e(r).upload_base_url!==h.upload_base_url&&(e(r).upload_base_url.trim()!==""||h.upload_base_url!=="")&&(t.upload_base_url=e(r).upload_base_url.trim()),e(r).ca_cert_bundle!==h.ca_cert_bundle)if(e(r).ca_cert_bundle!=="")try{const n=atob(e(r).ca_cert_bundle);t.ca_cert_bundle=Array.from(n,c=>c.charCodeAt(0))}catch{h.ca_cert_bundle!==""&&(t.ca_cert_bundle=[])}else h.ca_cert_bundle!==""&&(t.ca_cert_bundle=[]);return t}async function it(){try{const t={name:e(r).name,description:e(r).description,endpoint_type:e(r).endpoint_type,base_url:e(r).base_url,api_base_url:e(r).api_base_url,upload_base_url:e(r).upload_base_url};if(e(r).ca_cert_bundle&&e(r).ca_cert_bundle.trim()!=="")try{const n=atob(e(r).ca_cert_bundle);t.ca_cert_bundle=Array.from(n,c=>c.charCodeAt(0))}catch{}e(r).endpoint_type==="github"?await ee.createGithubEndpoint(t):await ee.createGiteaEndpoint(t),de.success("Endpoint Created",`Endpoint ${e(r).name} has been created successfully.`),y()}catch(t){s(ce,Re(t))}}async function st(){if(e(m))try{const t=ot();if(Object.keys(t).length===0){de.info("No Changes","No fields were modified."),y();return}e(m).endpoint_type==="github"?await ee.updateGithubEndpoint(e(m).name,t):await ee.updateGiteaEndpoint(e(m).name,t),de.success("Endpoint Updated",`Endpoint ${e(m).name} has been updated successfully.`),y()}catch(t){s(ce,Re(t))}}async function nt(){if(e(P)){try{e(P).endpoint_type==="github"?await ee.deleteGithubEndpoint(e(P).name):await ee.deleteGiteaEndpoint(e(P).name),de.success("Endpoint Deleted",`Endpoint ${e(P).name} has been deleted successfully.`)}catch(t){const n=Re(t);de.error("Delete Failed",n)}y()}}function Ue(t){const c=t.target.files?.[0];if(!c){g(r,e(r).ca_cert_bundle="");return}const v=new FileReader;v.onload=l=>{const f=l.target?.result;g(r,e(r).ca_cert_bundle=btoa(f))},v.readAsText(c)}V(()=>(e(K),q()),()=>{(!e(K).length||q().loaded.endpoints)&&s(K,q().endpoints)}),V(()=>q(),()=>{s(ue,q().loading.endpoints)}),V(()=>q(),()=>{s(ve,q().errorMessages.endpoints)}),V(()=>(e(K),e(pe)),()=>{s(H,Bt(e(K),e(pe)))}),V(()=>(e(Q),e(H),e(J),e(B)),()=>{s(Q,Math.ceil(e(H).length/e(J))),e(B)>e(Q)&&e(Q)>0&&s(B,e(Q))}),V(()=>(e(H),e(B),e(J)),()=>{s(Be,Ut(e(H),e(B),e(J)))}),V(()=>e(r),()=>{s(te,!(!e(r).name||!e(r).base_url||e(r).endpoint_type==="github"&&!e(r).api_base_url))}),_t(),bt();var Le=qt();b("keydown",vt,at),mt(t=>{xt.title="Endpoints - GARM"});var we=Ee(Le),Me=o(we);Ct(Me,{title:"Endpoints",description:"Manage your GitHub and Gitea endpoints for runner management.",actionLabel:"Add Endpoint",$$events:{action:tt}});var lt=a(Me,2);{let t=Pe(()=>e(ve)||e(ce)),n=Pe(()=>!!e(ve));Pt(lt,{get columns(){return Je},get data(){return e(Be)},get loading(){return e(ue)},get error(){return e(t)},get searchTerm(){return e(pe)},searchPlaceholder:"Search endpoints by name, description, or URL...",get currentPage(){return e(B)},get perPage(){return e(J)},get totalPages(){return e(Q)},get totalItems(){return e(H),z(()=>e(H).length)},itemName:"endpoints",emptyIconType:"settings",get showRetry(){return e(n)},get mobileCardConfig(){return Qe},$$events:{search:We,pageChange:Xe,perPageChange:Ye,retry:Ke,edit:Ze,delete:et},$$slots:{"mobile-card":(c,v)=>{const l=Pe(()=>v.item);var f=Mt(),x=o(f),$=o(x),C=o($),k=o(C,!0);i(C);var _=a(C,2),U=o(_,!0);i(_);var A=a(_,2),L=o(A);wt(L,()=>(se(Ae),se(e(l)),z(()=>Ae(e(l).endpoint_type||"","w-5 h-5"))));var M=a(L,2),W=o(M,!0);i(M),i(A),i($),i(x);var N=a(x,2),G=o(N);qe(G,{action:"edit",size:"sm",title:"Edit endpoint",ariaLabel:"Edit endpoint",$$events:{click:()=>xe(e(l))}});var X=a(G,2);qe(X,{action:"delete",size:"sm",title:"Delete endpoint",ariaLabel:"Delete endpoint",$$events:{click:()=>he(e(l))}}),i(N),i(f),ye(()=>{ne(k,(se(e(l)),z(()=>e(l).name))),ne(U,(se(e(l)),z(()=>e(l).description))),ne(W,(se(e(l)),z(()=>e(l).endpoint_type)))}),F(c,f)}}})}i(we);var Te=a(we,2);{var dt=t=>{var n=Ft(),c=o(n),v=a(c,2),l=o(v),f=a(o(l),2);i(l);var x=a(l,2),$=o(x);Et($,{get selectedForgeType(){return e(j)},set selectedForgeType(p){s(j,p)},$$events:{select:rt},$$legacy:!0});var C=a($,2),k=a(o(C),2);R(k),i(C);var _=a(C,2),U=a(o(_),2);Ie(U),i(_);var A=a(_,2),L=a(o(A),2);R(L),i(A);var M=a(A,2);{var W=p=>{var T=Tt(),d=Ee(T),E=a(o(d),2);R(E),i(d);var D=a(d,2),S=a(o(D),2);R(S),i(D),w(E,()=>e(r).api_base_url,Z=>g(r,e(r).api_base_url=Z)),w(S,()=>e(r).upload_base_url,Z=>g(r,e(r).upload_base_url=Z)),F(p,T)},N=p=>{var T=Dt(),d=a(o(T),2);R(d),O(2),i(T),w(d,()=>e(r).api_base_url,E=>g(r,e(r).api_base_url=E)),F(p,T)};le(M,p=>{e(j)==="github"?p(W):p(N,!1)})}var G=a(M,2),X=a(o(G),2),Y=o(X),re=a(Y,2),ae=a(o(re),2),_e=o(ae);O(),i(ae),O(2),i(re),i(X),i(G);var oe=a(G,2),me=o(oe),ie=a(me,2);i(oe),i(x),i(v),i(n),ye(()=>{je(k,"placeholder",e(j)==="github"?"e.g., github-enterprise or github-com":"e.g., gitea-main or my-gitea"),je(L,"placeholder",e(j)==="github"?"https://github.com or https://github.example.com":"https://gitea.example.com"),ie.disabled=!e(te),Ge(ie,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors - ${e(te)?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed"}`)}),b("click",c,y),b("click",f,y),w(k,()=>e(r).name,p=>g(r,e(r).name=p)),w(U,()=>e(r).description,p=>g(r,e(r).description=p)),w(L,()=>e(r).base_url,p=>g(r,e(r).base_url=p)),b("change",Y,Ue),b("click",_e,()=>document.getElementById("ca_cert_file")?.click()),b("click",me,y),b("submit",x,ze(it)),F(t,n)};le(Te,t=>{e(be)&&t(dt)})}var De=a(Te,2);{var ut=t=>{var n=Gt(),c=o(n),v=a(c,2),l=o(v),f=o(l),x=o(f),$=o(x);i(x),O(2),i(f);var C=a(f,2);i(l);var k=a(l,2),_=o(k),U=a(o(_),2);R(U),i(_);var A=a(_,2),L=a(o(A),2);Ie(L),i(A);var M=a(A,2),W=a(o(M),2);R(W),i(M);var N=a(M,2);{var G=d=>{var E=It(),D=Ee(E),S=a(o(D),2);R(S),i(D);var Z=a(D,2),Fe=a(o(Z),2);R(Fe),i(Z),w(S,()=>e(r).api_base_url,Ce=>g(r,e(r).api_base_url=Ce)),w(Fe,()=>e(r).upload_base_url,Ce=>g(r,e(r).upload_base_url=Ce)),F(d,E)},X=d=>{var E=jt(),D=a(o(E),2);R(D),O(2),i(E),w(D,()=>e(r).api_base_url,S=>g(r,e(r).api_base_url=S)),F(d,E)};le(N,d=>{e(m),z(()=>e(m).endpoint_type==="github")?d(G):d(X,!1)})}var Y=a(N,2),re=a(o(Y),2),ae=o(re),_e=a(ae,2),oe=a(o(_e),2),me=o(oe);O(),i(oe),O(2),i(_e),i(re),i(Y);var ie=a(Y,2),p=o(ie),T=a(p,2);i(ie),i(k),i(v),i(n),ye(()=>{ne($,`Edit ${e(m),z(()=>e(m).endpoint_type==="github"?"GitHub":"Gitea")??""} Endpoint`),T.disabled=!e(te),Ge(T,1,`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors - ${e(te)?"bg-blue-600 hover:bg-blue-700 focus:ring-blue-500 cursor-pointer":"bg-gray-400 cursor-not-allowed"}`)}),b("click",c,y),b("click",C,y),w(U,()=>e(r).name,d=>g(r,e(r).name=d)),w(L,()=>e(r).description,d=>g(r,e(r).description=d)),w(W,()=>e(r).base_url,d=>g(r,e(r).base_url=d)),b("change",ae,Ue),b("click",me,()=>document.getElementById("edit_ca_cert_file")?.click()),b("click",p,y),b("submit",k,ze(st)),F(t,n)};le(De,t=>{e(ge)&&e(m)&&t(ut)})}var ct=a(De,2);{var pt=t=>{var n=zt(),c=o(n),v=a(c,2),l=o(v),f=o(l),x=a(o(f),2),$=a(o(x),2),C=o($);i($),i(x),i(f),i(l);var k=a(l,2),_=o(k),U=a(_,2);i(k),i(v),i(n),ye(()=>ne(C,`Are you sure you want to delete the endpoint "${e(P),z(()=>e(P).name)??""}"? This action cannot be undone.`)),b("click",c,y),b("click",_,y),b("click",U,nt),F(t,n)};le(ct,t=>{e(fe)&&e(P)&&t(pt)})}F(Ne,Le),yt(),Oe()}export{or as component}; diff --git a/webapp/assets/_app/immutable/nodes/5.BZ5sZ9vU.js b/webapp/assets/_app/immutable/nodes/5.BZ5sZ9vU.js new file mode 100644 index 00000000..4c150b69 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/5.BZ5sZ9vU.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as Ge}from"../chunks/C7KraPli.js";import{p as Se,E as Je,o as Be,l as w,k as r,m as n,g as e,h as He,f as M,s as o,d as i,r as l,b as $,t as N,e as K,y as $e,u as b,z as Ve,w as Z,i as Ce,c as Re,B as We,a as Ue,j as Ye,$ as Ke,q as A,v as ee}from"../chunks/cPTQ2Ibn.js";import{a as Le,i as B,s as Ne}from"../chunks/DqFqoVWr.js";import{r as Pe,b as Me,d as De,c as Oe,g as be}from"../chunks/DqbUkQgD.js";import{P as Qe}from"../chunks/U3V4g_hv.js";import{e as Xe,i as Ze}from"../chunks/CiWDXYQd.js";import{b as Te}from"../chunks/B-_QCM7E.js";import{p as et}from"../chunks/D4Caz1gY.js";import{M as tt}from"../chunks/Bo3f8OIz.js";import{e as re}from"../chunks/BZiHL9L3.js";import{e as qe,a as he}from"../chunks/JUkrBp3F.js";import{U as rt}from"../chunks/B1V2wE0x.js";import{D as at}from"../chunks/91PQ6UtW.js";import{t as te}from"../chunks/Bgbd8SZ5.js";import{B as st,k as ye,l as ot}from"../chunks/DJsB5Z5V.js";import{D as nt,G as it,A as lt}from"../chunks/Du50aAe5.js";import{A as Ae}from"../chunks/C2rI8IaC.js";import{E as dt}from"../chunks/CPFytHjx.js";import{E as ct}from"../chunks/CYqkNFLz.js";import{S as ut}from"../chunks/BZ2WxPPD.js";var pt=M('

'),mt=M('

Loading...

'),ft=M(""),gt=M('

Loading credentials...

'),vt=M('

No GitHub credentials found. Please create GitHub credentials first.

'),bt=M(`

You'll need to manually configure this secret in GitHub's enterprise webhook settings.

`),yt=M('

Create Enterprise

Enterprises are only available for GitHub endpoints.

');function ht(ae,se){Se(se,!1);const[oe,ne]=Ne(),u=()=>Le(qe,"$eagerCache",oe),G=n(),h=n(),p=n(),H=n(),E=Je();let x=n(!1),y=n(""),a=n({name:"",credentials_name:"",webhook_secret:"",pool_balancer_type:"roundrobin"});async function _(){if(!u().loaded.credentials&&!u().loading.credentials)try{await he.getCredentials()}catch(m){r(y,re(m))}}async function C(){if(!e(a).name||!e(a).name.trim()){r(y,"Enterprise name is required");return}if(!e(a).credentials_name){r(y,"Please select credentials");return}try{r(x,!0),r(y,"");const m={...e(a)};E("submit",m)}catch(m){r(y,re(m)),r(x,!1)}}Be(()=>{_()}),w(()=>u(),()=>{r(G,u().credentials)}),w(()=>u(),()=>{r(h,u().loading.credentials)}),w(()=>e(G),()=>{r(p,e(G).filter(m=>m.forge_type==="github"))}),w(()=>e(a),()=>{r(H,e(a).name&&e(a).name.trim()!==""&&e(a).credentials_name!==""&&e(a).webhook_secret&&e(a).webhook_secret.trim()!=="")}),He(),Ge(),tt(ae,{$$events:{close:()=>E("close")},children:(m,q)=>{var D=yt(),d=o(i(D),4);{var ie=f=>{var g=pt(),T=i(g),R=i(T,!0);l(T),l(g),N(()=>K(R,e(y))),$(f,g)};B(d,f=>{e(y)&&f(ie)})}var le=o(d,2);{var de=f=>{var g=mt();$(f,g)},ce=f=>{var g=bt(),T=i(g),R=o(i(T),2);Pe(R),l(T);var z=o(T,2),U=o(i(z),2);N(()=>{e(a),$e(()=>{e(p)})});var j=i(U);j.value=j.__value="";var ue=o(j);Xe(ue,1,()=>e(p),Ze,(s,c)=>{var P=ft(),v=i(P);l(P);var k={};N(()=>{K(v,`${e(c),b(()=>e(c).name)??""} (${e(c),b(()=>e(c).endpoint?.name||"Unknown endpoint")??""})`),k!==(k=(e(c),b(()=>e(c).name)))&&(P.value=(P.__value=(e(c),b(()=>e(c).name)))??"")}),$(s,P)}),l(U);var pe=o(U,2);{var me=s=>{var c=gt();$(s,c)},O=s=>{var c=We(),P=Ue(c);{var v=k=>{var Y=vt();$(k,Y)};B(P,k=>{e(p),b(()=>e(p).length===0)&&k(v)},!0)}$(s,c)};B(pe,s=>{e(h)?s(me):s(O,!1)})}l(z);var S=o(z,2),L=o(i(S),2);N(()=>{e(a),$e(()=>{})});var F=i(L);F.value=F.__value="roundrobin";var I=o(F);I.value=I.__value="pack",l(L),l(S);var J=o(S,2),V=o(i(J),2);Pe(V),Ve(2),l(J);var Q=o(J,2),X=i(Q),W=o(X,2),t=i(W,!0);l(W),l(Q),l(g),N(()=>{W.disabled=(e(x),e(h),e(H),e(p),b(()=>e(x)||e(h)||!e(H)||e(p).length===0)),K(t,e(x)?"Creating...":"Create Enterprise")}),Te(R,()=>e(a).name,s=>Z(a,e(a).name=s)),Me(U,()=>e(a).credentials_name,s=>Z(a,e(a).credentials_name=s)),Me(L,()=>e(a).pool_balancer_type,s=>Z(a,e(a).pool_balancer_type=s)),Te(V,()=>e(a).webhook_secret,s=>Z(a,e(a).webhook_secret=s)),Ce("click",X,()=>E("close")),Ce("submit",g,et(C)),$(f,g)};B(le,f=>{e(x)?f(de):f(ce,!1)})}l(D),$(m,D)},$$slots:{default:!0}}),Re(),ne()}var _t=M(''),xt=M('
',1);function Ft(ae,se){Se(se,!1);const[oe,ne]=Ne(),u=()=>Le(qe,"$eagerCache",oe),G=n(),h=n(),p=n(),H=n();let E=n([]),x=n(!0),y=n(""),a=n(""),_=n(1),C=n(25),m=n(!1),q=n(!1),D=n(!1),d=n(null);async function ie(t){try{r(y,""),await be.createEnterprise(t),te.success("Enterprise Created",`Enterprise ${t.name} has been created successfully.`),r(m,!1)}catch(s){throw r(y,re(s)),s}}async function le(t){if(e(d))try{await be.updateEnterprise(e(d).id,t),te.success("Enterprise Updated",`Enterprise ${e(d).name} has been updated successfully.`),r(q,!1),r(d,null)}catch(s){throw s}}async function de(){if(e(d))try{r(y,""),await be.deleteEnterprise(e(d).id),te.success("Enterprise Deleted",`Enterprise ${e(d).name} has been deleted successfully.`),r(D,!1),r(d,null)}catch(t){const s=re(t);te.error("Delete Failed",s)}}function ce(){r(m,!0)}function f(t){r(d,t),r(q,!0)}function g(t){r(d,t),r(D,!0)}Be(async()=>{try{r(x,!0);const t=await he.getEnterprises();t&&Array.isArray(t)&&r(E,t)}catch(t){console.error("Failed to load enterprises:",t),r(y,t instanceof Error?t.message:"Failed to load enterprises")}finally{r(x,!1)}});async function T(){try{await he.retryResource("enterprises")}catch(t){console.error("Retry failed:",t)}}const R=[{key:"name",title:"Name",cellComponent:dt,cellProps:{entityType:"enterprise"}},{key:"endpoint",title:"Endpoint",cellComponent:ct},{key:"credentials",title:"Credentials",cellComponent:it,cellProps:{field:"credentials_name"}},{key:"status",title:"Status",cellComponent:ut,cellProps:{statusType:"entity"}},{key:"actions",title:"Actions",align:"right",cellComponent:lt}],z={entityType:"enterprise",primaryText:{field:"name",isClickable:!0,href:"/enterprises/{id}"},secondaryText:{field:"credentials_name"},badges:[{type:"custom",value:t=>ye(t)}],actions:[{type:"edit",handler:t=>f(t)},{type:"delete",handler:t=>g(t)}]};function U(t){r(a,t.detail.term),r(_,1)}function j(t){r(_,t.detail.page)}function ue(t){r(C,t.detail.perPage),r(_,1)}function pe(t){f(t.detail.item)}function me(t){g(t.detail.item)}w(()=>(e(E),u()),()=>{(!e(E).length||u().loaded.enterprises)&&r(E,u().enterprises)}),w(()=>u(),()=>{r(x,u().loading.enterprises)}),w(()=>u(),()=>{r(G,u().errorMessages.enterprises)}),w(()=>(e(E),e(a)),()=>{r(h,ot(e(E),e(a)))}),w(()=>(e(h),e(C)),()=>{r(p,Math.ceil(e(h).length/e(C)))}),w(()=>(e(_),e(p)),()=>{e(_)>e(p)&&e(p)>0&&r(_,e(p))}),w(()=>(e(h),e(_),e(C)),()=>{r(H,e(h).slice((e(_)-1)*e(C),e(_)*e(C)))}),He(),Ge();var O=xt();Ye(t=>{Ke.title="Enterprises - GARM"});var S=Ue(O),L=i(S);Qe(L,{title:"Enterprises",description:"Manage GitHub enterprises",actionLabel:"Add Enterprise",$$events:{action:ce}});var F=o(L,2);{let t=ee(()=>e(G)||e(y)),s=ee(()=>!!e(G));nt(F,{get columns(){return R},get data(){return e(H)},get loading(){return e(x)},get error(){return e(t)},get searchTerm(){return e(a)},searchPlaceholder:"Search enterprises...",get currentPage(){return e(_)},get perPage(){return e(C)},get totalPages(){return e(p)},get totalItems(){return e(h),b(()=>e(h).length)},itemName:"enterprises",emptyIconType:"building",get showRetry(){return e(s)},get mobileCardConfig(){return z},$$events:{search:U,pageChange:j,perPageChange:ue,retry:T,edit:pe,delete:me},$$slots:{"mobile-card":(c,P)=>{const v=ee(()=>P.item),k=ee(()=>(A(ye),A(e(v)),b(()=>ye(e(v)))));var Y=_t(),fe=i(Y),ge=i(fe),ve=i(ge),ze=i(ve,!0);l(ve);var _e=o(ve,2),je=i(_e,!0);l(_e),l(ge),l(fe);var xe=o(fe,2),ke=i(xe);st(ke,{get variant(){return A(e(k)),b(()=>e(k).variant)},get text(){return A(e(k)),b(()=>e(k).text)}});var we=o(ke,2),Ee=i(we);Ae(Ee,{action:"edit",size:"sm",title:"Edit enterprise",ariaLabel:"Edit enterprise",$$events:{click:()=>f(e(v))}});var Fe=o(Ee,2);Ae(Fe,{action:"delete",size:"sm",title:"Delete enterprise",ariaLabel:"Delete enterprise",$$events:{click:()=>g(e(v))}}),l(we),l(xe),l(Y),N(Ie=>{Oe(ge,"href",Ie),K(ze,(A(e(v)),b(()=>e(v).name))),K(je,(A(e(v)),b(()=>e(v).credentials_name)))},[()=>(A(De),A(e(v)),b(()=>De(`/enterprises/${e(v).id}`)))]),$(c,Y)}}})}l(S);var I=o(S,2);{var J=t=>{ht(t,{$$events:{close:()=>r(m,!1),submit:s=>ie(s.detail)}})};B(I,t=>{e(m)&&t(J)})}var V=o(I,2);{var Q=t=>{rt(t,{get entity(){return e(d)},entityType:"enterprise",$$events:{close:()=>{r(q,!1),r(d,null)},submit:s=>le(s.detail)}})};B(V,t=>{e(q)&&e(d)&&t(Q)})}var X=o(V,2);{var W=t=>{at(t,{title:"Delete Enterprise",message:"Are you sure you want to delete this enterprise? This action cannot be undone.",get itemName(){return e(d),b(()=>e(d).name)},$$events:{close:()=>{r(D,!1),r(d,null)},confirm:de}})};B(X,t=>{e(D)&&e(d)&&t(W)})}$(ae,O),Re(),ne()}export{Ft as component}; diff --git a/webapp/assets/_app/immutable/nodes/5.YDqRaTm4.js b/webapp/assets/_app/immutable/nodes/5.YDqRaTm4.js deleted file mode 100644 index 0472be39..00000000 --- a/webapp/assets/_app/immutable/nodes/5.YDqRaTm4.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Ge}from"../chunks/DT0EGONV.js";import{p as Se,E as Je,o as Be,l as w,s as r,m as n,g as e,a as He,f as M,k as o,j as i,r as l,c as $,t as N,v as K,y as $e,u as b,z as Ve,w as Z,e as Ce,d as Re,B as We,b as Ue,h as Ye,$ as Ke,n as A,q as ee}from"../chunks/CRKWEg6v.js";import{a as Le,i as B,s as Ne}from"../chunks/e1m7WRO5.js";import{r as Pe,b as Me,d as De,c as Oe,g as be}from"../chunks/-esynYXT.js";import{P as Qe}from"../chunks/BAnDfGwP.js";import{e as Xe,i as Ze}from"../chunks/C73ZVvpW.js";import{b as Te}from"../chunks/B3a35v7J.js";import{p as et}from"../chunks/D4Caz1gY.js";import{M as tt}from"../chunks/xe-4nY5o.js";import{e as re}from"../chunks/BZiHL9L3.js";import{e as qe,a as he}from"../chunks/Djd10kRn.js";import{U as rt}from"../chunks/DxLDbRe7.js";import{D as at}from"../chunks/BXdh0O4_.js";import{t as te}from"../chunks/D6DjlyIQ.js";import{B as st,k as ye,l as ot}from"../chunks/c_t0vA9G.js";import{D as nt,A as Ae,G as it,a as lt}from"../chunks/B1coRVG4.js";import{E as dt}from"../chunks/DF8ZTWYj.js";import{E as ct}from"../chunks/B27KefbC.js";import{S as ut}from"../chunks/B0Y2gXDu.js";var pt=M('

'),mt=M('

Loading...

'),ft=M(""),gt=M('

Loading credentials...

'),vt=M('

No GitHub credentials found. Please create GitHub credentials first.

'),bt=M(`

You'll need to manually configure this secret in GitHub's enterprise webhook settings.

`),yt=M('

Create Enterprise

Enterprises are only available for GitHub endpoints.

');function ht(ae,se){Se(se,!1);const[oe,ne]=Ne(),u=()=>Le(qe,"$eagerCache",oe),G=n(),h=n(),p=n(),H=n(),E=Je();let x=n(!1),y=n(""),a=n({name:"",credentials_name:"",webhook_secret:"",pool_balancer_type:"roundrobin"});async function _(){if(!u().loaded.credentials&&!u().loading.credentials)try{await he.getCredentials()}catch(m){r(y,re(m))}}async function C(){if(!e(a).name||!e(a).name.trim()){r(y,"Enterprise name is required");return}if(!e(a).credentials_name){r(y,"Please select credentials");return}try{r(x,!0),r(y,"");const m={...e(a)};E("submit",m)}catch(m){r(y,re(m)),r(x,!1)}}Be(()=>{_()}),w(()=>u(),()=>{r(G,u().credentials)}),w(()=>u(),()=>{r(h,u().loading.credentials)}),w(()=>e(G),()=>{r(p,e(G).filter(m=>m.forge_type==="github"))}),w(()=>e(a),()=>{r(H,e(a).name&&e(a).name.trim()!==""&&e(a).credentials_name!==""&&e(a).webhook_secret&&e(a).webhook_secret.trim()!=="")}),He(),Ge(),tt(ae,{$$events:{close:()=>E("close")},children:(m,q)=>{var D=yt(),d=o(i(D),4);{var ie=f=>{var g=pt(),T=i(g),R=i(T,!0);l(T),l(g),N(()=>K(R,e(y))),$(f,g)};B(d,f=>{e(y)&&f(ie)})}var le=o(d,2);{var de=f=>{var g=mt();$(f,g)},ce=f=>{var g=bt(),T=i(g),R=o(i(T),2);Pe(R),l(T);var z=o(T,2),U=o(i(z),2);N(()=>{e(a),$e(()=>{e(p)})});var j=i(U);j.value=j.__value="";var ue=o(j);Xe(ue,1,()=>e(p),Ze,(s,c)=>{var P=ft(),v=i(P);l(P);var k={};N(()=>{K(v,`${e(c),b(()=>e(c).name)??""} (${e(c),b(()=>e(c).endpoint?.name||"Unknown endpoint")??""})`),k!==(k=(e(c),b(()=>e(c).name)))&&(P.value=(P.__value=(e(c),b(()=>e(c).name)))??"")}),$(s,P)}),l(U);var pe=o(U,2);{var me=s=>{var c=gt();$(s,c)},O=s=>{var c=We(),P=Ue(c);{var v=k=>{var Y=vt();$(k,Y)};B(P,k=>{e(p),b(()=>e(p).length===0)&&k(v)},!0)}$(s,c)};B(pe,s=>{e(h)?s(me):s(O,!1)})}l(z);var S=o(z,2),L=o(i(S),2);N(()=>{e(a),$e(()=>{})});var F=i(L);F.value=F.__value="roundrobin";var I=o(F);I.value=I.__value="pack",l(L),l(S);var J=o(S,2),V=o(i(J),2);Pe(V),Ve(2),l(J);var Q=o(J,2),X=i(Q),W=o(X,2),t=i(W,!0);l(W),l(Q),l(g),N(()=>{W.disabled=(e(x),e(h),e(H),e(p),b(()=>e(x)||e(h)||!e(H)||e(p).length===0)),K(t,e(x)?"Creating...":"Create Enterprise")}),Te(R,()=>e(a).name,s=>Z(a,e(a).name=s)),Me(U,()=>e(a).credentials_name,s=>Z(a,e(a).credentials_name=s)),Me(L,()=>e(a).pool_balancer_type,s=>Z(a,e(a).pool_balancer_type=s)),Te(V,()=>e(a).webhook_secret,s=>Z(a,e(a).webhook_secret=s)),Ce("click",X,()=>E("close")),Ce("submit",g,et(C)),$(f,g)};B(le,f=>{e(x)?f(de):f(ce,!1)})}l(D),$(m,D)},$$slots:{default:!0}}),Re(),ne()}var _t=M(''),xt=M('
',1);function jt(ae,se){Se(se,!1);const[oe,ne]=Ne(),u=()=>Le(qe,"$eagerCache",oe),G=n(),h=n(),p=n(),H=n();let E=n([]),x=n(!0),y=n(""),a=n(""),_=n(1),C=n(25),m=n(!1),q=n(!1),D=n(!1),d=n(null);async function ie(t){try{r(y,""),await be.createEnterprise(t),te.success("Enterprise Created",`Enterprise ${t.name} has been created successfully.`),r(m,!1)}catch(s){throw r(y,re(s)),s}}async function le(t){if(e(d))try{await be.updateEnterprise(e(d).id,t),te.success("Enterprise Updated",`Enterprise ${e(d).name} has been updated successfully.`),r(q,!1),r(d,null)}catch(s){throw s}}async function de(){if(e(d))try{r(y,""),await be.deleteEnterprise(e(d).id),te.success("Enterprise Deleted",`Enterprise ${e(d).name} has been deleted successfully.`),r(D,!1),r(d,null)}catch(t){const s=re(t);te.error("Delete Failed",s)}}function ce(){r(m,!0)}function f(t){r(d,t),r(q,!0)}function g(t){r(d,t),r(D,!0)}Be(async()=>{try{r(x,!0);const t=await he.getEnterprises();t&&Array.isArray(t)&&r(E,t)}catch(t){console.error("Failed to load enterprises:",t),r(y,t instanceof Error?t.message:"Failed to load enterprises")}finally{r(x,!1)}});async function T(){try{await he.retryResource("enterprises")}catch(t){console.error("Retry failed:",t)}}const R=[{key:"name",title:"Name",cellComponent:dt,cellProps:{entityType:"enterprise"}},{key:"endpoint",title:"Endpoint",cellComponent:ct},{key:"credentials",title:"Credentials",cellComponent:it,cellProps:{field:"credentials_name"}},{key:"status",title:"Status",cellComponent:ut,cellProps:{statusType:"entity"}},{key:"actions",title:"Actions",align:"right",cellComponent:lt}],z={entityType:"enterprise",primaryText:{field:"name",isClickable:!0,href:"/enterprises/{id}"},secondaryText:{field:"credentials_name"},badges:[{type:"custom",value:t=>ye(t)}],actions:[{type:"edit",handler:t=>f(t)},{type:"delete",handler:t=>g(t)}]};function U(t){r(a,t.detail.term),r(_,1)}function j(t){r(_,t.detail.page)}function ue(t){r(C,t.detail.perPage),r(_,1)}function pe(t){f(t.detail.item)}function me(t){g(t.detail.item)}w(()=>(e(E),u()),()=>{(!e(E).length||u().loaded.enterprises)&&r(E,u().enterprises)}),w(()=>u(),()=>{r(x,u().loading.enterprises)}),w(()=>u(),()=>{r(G,u().errorMessages.enterprises)}),w(()=>(e(E),e(a)),()=>{r(h,ot(e(E),e(a)))}),w(()=>(e(h),e(C)),()=>{r(p,Math.ceil(e(h).length/e(C)))}),w(()=>(e(_),e(p)),()=>{e(_)>e(p)&&e(p)>0&&r(_,e(p))}),w(()=>(e(h),e(_),e(C)),()=>{r(H,e(h).slice((e(_)-1)*e(C),e(_)*e(C)))}),He(),Ge();var O=xt();Ye(t=>{Ke.title="Enterprises - GARM"});var S=Ue(O),L=i(S);Qe(L,{title:"Enterprises",description:"Manage GitHub enterprises",actionLabel:"Add Enterprise",$$events:{action:ce}});var F=o(L,2);{let t=ee(()=>e(G)||e(y)),s=ee(()=>!!e(G));nt(F,{get columns(){return R},get data(){return e(H)},get loading(){return e(x)},get error(){return e(t)},get searchTerm(){return e(a)},searchPlaceholder:"Search enterprises...",get currentPage(){return e(_)},get perPage(){return e(C)},get totalPages(){return e(p)},get totalItems(){return e(h),b(()=>e(h).length)},itemName:"enterprises",emptyIconType:"building",get showRetry(){return e(s)},get mobileCardConfig(){return z},$$events:{search:U,pageChange:j,perPageChange:ue,retry:T,edit:pe,delete:me},$$slots:{"mobile-card":(c,P)=>{const v=ee(()=>P.item),k=ee(()=>(A(ye),A(e(v)),b(()=>ye(e(v)))));var Y=_t(),fe=i(Y),ge=i(fe),ve=i(ge),ze=i(ve,!0);l(ve);var _e=o(ve,2),je=i(_e,!0);l(_e),l(ge),l(fe);var xe=o(fe,2),ke=i(xe);st(ke,{get variant(){return A(e(k)),b(()=>e(k).variant)},get text(){return A(e(k)),b(()=>e(k).text)}});var we=o(ke,2),Ee=i(we);Ae(Ee,{action:"edit",size:"sm",title:"Edit enterprise",ariaLabel:"Edit enterprise",$$events:{click:()=>f(e(v))}});var Fe=o(Ee,2);Ae(Fe,{action:"delete",size:"sm",title:"Delete enterprise",ariaLabel:"Delete enterprise",$$events:{click:()=>g(e(v))}}),l(we),l(xe),l(Y),N(Ie=>{Oe(ge,"href",Ie),K(ze,(A(e(v)),b(()=>e(v).name))),K(je,(A(e(v)),b(()=>e(v).credentials_name)))},[()=>(A(De),A(e(v)),b(()=>De(`/enterprises/${e(v).id}`)))]),$(c,Y)}}})}l(S);var I=o(S,2);{var J=t=>{ht(t,{$$events:{close:()=>r(m,!1),submit:s=>ie(s.detail)}})};B(I,t=>{e(m)&&t(J)})}var V=o(I,2);{var Q=t=>{rt(t,{get entity(){return e(d)},entityType:"enterprise",$$events:{close:()=>{r(q,!1),r(d,null)},submit:s=>le(s.detail)}})};B(V,t=>{e(q)&&e(d)&&t(Q)})}var X=o(V,2);{var W=t=>{at(t,{title:"Delete Enterprise",message:"Are you sure you want to delete this enterprise? This action cannot be undone.",get itemName(){return e(d),b(()=>e(d).name)},$$events:{close:()=>{r(D,!1),r(d,null)},confirm:de}})};B(X,t=>{e(D)&&e(d)&&t(W)})}$(ae,O),Re(),ne()}export{jt as component}; diff --git a/webapp/assets/_app/immutable/nodes/6.CAXPtVkl.js b/webapp/assets/_app/immutable/nodes/6.CAXPtVkl.js new file mode 100644 index 00000000..6d4331ea --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/6.CAXPtVkl.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as qe}from"../chunks/C7KraPli.js";import{p as ze,o as Ge,A as je,l as Re,h as Ve,f as S,j as We,a as F,t as j,b as E,c as Je,u as i,q as le,e as de,g as e,m as l,d as u,s as d,k as s,$ as Ke,r as f,w as Oe,B as ce,v}from"../chunks/cPTQ2Ibn.js";import{i as g,s as Qe,a as Xe}from"../chunks/DqFqoVWr.js";import{d as B,c as Ye,g as y}from"../chunks/DqbUkQgD.js";import{p as Ze}from"../chunks/DVsSf1wv.js";import{g as pe}from"../chunks/CTvJf3dP.js";import{U as et}from"../chunks/B1V2wE0x.js";import{D as ue}from"../chunks/91PQ6UtW.js";import{E as tt,P as rt,a as at}from"../chunks/WI-og7-I.js";import{D as st}from"../chunks/oOdVuDuv.js";import{I as nt}from"../chunks/DliFOxtc.js";import{g as fe}from"../chunks/DJsB5Z5V.js";import{w as R}from"../chunks/BV_mDmfH.js";import{t as x}from"../chunks/Bgbd8SZ5.js";import{C as ot}from"../chunks/DPR9Z_fe.js";import{e as V}from"../chunks/BZiHL9L3.js";var it=S('

Loading enterprise...

'),lt=S('

'),dt=S(" ",1),ct=S(' ',1);function Tt(me,ve){ze(ve,!1);const[ge,ye]=Qe(),W=()=>Xe(Ze,"$page",ge),$=l();let r=l(null),c=l([]),m=l([]),U=l(!0),P=l(""),T=l(!1),M=l(!1),I=l(!1),C=l(!1),p=l(null),k=null,h=l();async function J(){if(e($))try{s(U,!0),s(P,"");const[t,a,n]=await Promise.all([y.getEnterprise(e($)),y.listEnterprisePools(e($)).catch(()=>[]),y.listEnterpriseInstances(e($)).catch(()=>[])]);s(r,t),s(c,a),s(m,n)}catch(t){s(P,t instanceof Error?t.message:"Failed to load enterprise")}finally{s(U,!1)}}function he(t,a){const{events:n}=t;return{...a,events:n}}async function _e(t){if(e(r))try{await y.updateEnterprise(e(r).id,t),await J(),x.success("Enterprise Updated",`Enterprise ${e(r).name} has been updated successfully.`),s(T,!1)}catch(a){throw a}}async function be(){if(e(r)){try{await y.deleteEnterprise(e(r).id),pe(B("/enterprises"))}catch(t){const a=V(t);x.error("Delete Failed",a)}s(M,!1)}}async function Ee(){if(e(p))try{await y.deleteInstance(e(p).name),x.success("Instance Deleted",`Instance ${e(p).name} has been deleted successfully.`),s(I,!1),s(p,null)}catch(t){const a=V(t);x.error("Delete Failed",a),s(I,!1),s(p,null)}}function xe(t){s(p,t),s(I,!0)}function $e(){s(C,!0)}async function Ie(t){try{if(!e(r))return;await y.createEnterprisePool(e(r).id,t.detail),x.success("Pool Created",`Pool has been created successfully for enterprise ${e(r).name}.`),s(C,!1)}catch(a){const n=V(a);x.error("Pool Creation Failed",n)}}function K(){e(h)&&Oe(h,e(h).scrollTop=e(h).scrollHeight)}function we(t){if(t.operation==="update"){const a=t.payload;if(e(r)&&a.id===e(r).id){const n=e(r).events?.length||0,o=a.events?.length||0;s(r,he(e(r),a)),o>n&&setTimeout(()=>{K()},100)}}else if(t.operation==="delete"){const a=t.payload.id||t.payload;e(r)&&e(r).id===a&&pe(B("/enterprises"))}}function De(t){if(!e(r))return;const a=t.payload;if(a.enterprise_id===e(r).id){if(t.operation==="create")s(c,[...e(c),a]);else if(t.operation==="update")s(c,e(c).map(n=>n.id===a.id?a:n));else if(t.operation==="delete"){const n=a.id||a;s(c,e(c).filter(o=>o.id!==n))}}}function Pe(t){if(!e(r)||!e(c))return;const a=t.payload;if(e(c).some(o=>o.id===a.pool_id)){if(t.operation==="create")s(m,[...e(m),a]);else if(t.operation==="update")s(m,e(m).map(o=>o.id===a.id?a:o));else if(t.operation==="delete"){const o=a.id||a;s(m,e(m).filter(q=>q.id!==o))}}}Ge(()=>{J().then(()=>{e(r)?.events?.length&&setTimeout(()=>{K()},100)});const t=R.subscribeToEntity("enterprise",["update","delete"],we),a=R.subscribeToEntity("pool",["create","update","delete"],De),n=R.subscribeToEntity("instance",["create","update","delete"],Pe);k=()=>{t(),a(),n()}}),je(()=>{k&&(k(),k=null)}),Re(()=>W(),()=>{s($,W().params.id)}),Ve(),qe();var O=ct();We(t=>{j(()=>Ke.title=`${e(r),i(()=>e(r)?`${e(r).name} - Enterprise Details`:"Enterprise Details")??""} - GARM`)});var L=F(O),H=u(L),Q=u(H),N=u(Q),Te=u(N);f(N);var X=d(N,2),Y=u(X),Z=d(u(Y),2),Me=u(Z,!0);f(Z),f(Y),f(X),f(Q),f(H);var Ce=d(H,2);{var ke=t=>{var a=it();E(t,a)},Ae=t=>{var a=ce(),n=F(a);{var o=_=>{var b=lt(),A=u(b),z=u(A,!0);f(A),f(b),j(()=>de(z,e(P))),E(_,b)},q=_=>{var b=ce(),A=F(b);{var z=G=>{var ae=dt(),se=F(ae);{let w=v(()=>(e(r),i(()=>e(r).name||"Enterprise"))),D=v(()=>(e(r),i(()=>e(r).endpoint?.name))),Ne=v(()=>(le(fe),i(()=>fe("github"))));st(se,{get title(){return e(w)},get subtitle(){return`Endpoint: ${e(D)??""} • GitHub Enterprise`},get forgeIcon(){return e(Ne)},onEdit:()=>s(T,!0),onDelete:()=>s(M,!0)})}var ne=d(se,2);tt(ne,{get entity(){return e(r)},entityType:"enterprise"});var oe=d(ne,2);{let w=v(()=>(e(r),i(()=>e(r).id||""))),D=v(()=>(e(r),i(()=>e(r).name||"")));rt(oe,{get pools(){return e(c)},entityType:"enterprise",get entityId(){return e(w)},get entityName(){return e(D)},$$events:{addPool:$e}})}var ie=d(oe,2);nt(ie,{get instances(){return e(m)},entityType:"enterprise",onDeleteInstance:xe});var He=d(ie,2);{let w=v(()=>(e(r),i(()=>e(r)?.events)));at(He,{get events(){return e(w)},get eventsContainer(){return e(h)},set eventsContainer(D){s(h,D)},$$legacy:!0})}E(G,ae)};g(A,G=>{e(r)&&G(z)},!0)}E(_,b)};g(n,_=>{e(P)?_(o):_(q,!1)},!0)}E(t,a)};g(Ce,t=>{e(U)?t(ke):t(Ae,!1)})}f(L);var ee=d(L,2);{var Fe=t=>{et(t,{get entity(){return e(r)},entityType:"enterprise",$$events:{close:()=>s(T,!1),submit:a=>_e(a.detail)}})};g(ee,t=>{e(T)&&e(r)&&t(Fe)})}var te=d(ee,2);{var Be=t=>{ue(t,{title:"Delete Enterprise",message:"Are you sure you want to delete this enterprise? This action cannot be undone and will remove all associated pools and instances.",get itemName(){return e(r),i(()=>e(r).name)},$$events:{close:()=>s(M,!1),confirm:be}})};g(te,t=>{e(M)&&e(r)&&t(Be)})}var re=d(te,2);{var Se=t=>{ue(t,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(p),i(()=>e(p).name)},$$events:{close:()=>{s(I,!1),s(p,null)},confirm:Ee}})};g(re,t=>{e(I)&&e(p)&&t(Se)})}var Ue=d(re,2);{var Le=t=>{{let a=v(()=>(e(r),i(()=>e(r).id||"")));ot(t,{initialEntityType:"enterprise",get initialEntityId(){return e(a)},$$events:{close:()=>s(C,!1),submit:Ie}})}};g(Ue,t=>{e(C)&&e(r)&&t(Le)})}j(t=>{Ye(Te,"href",t),de(Me,(e(r),i(()=>e(r)?e(r).name:"Loading...")))},[()=>(le(B),i(()=>B("/enterprises")))]),E(me,O),Je(),ye()}export{Tt as component}; diff --git a/webapp/assets/_app/immutable/nodes/6.D20Gw7eV.js b/webapp/assets/_app/immutable/nodes/6.D20Gw7eV.js deleted file mode 100644 index 47e36ed2..00000000 --- a/webapp/assets/_app/immutable/nodes/6.D20Gw7eV.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as qe}from"../chunks/DT0EGONV.js";import{p as ze,o as Ge,A as je,l as Re,a as Ve,f as S,h as We,b as F,t as j,c as E,d as Je,u as i,n as le,v as de,g as e,m as l,j as u,k as d,s,$ as Ke,r as f,w as Oe,B as ce,q as v}from"../chunks/CRKWEg6v.js";import{i as g,s as Qe,a as Xe}from"../chunks/e1m7WRO5.js";import{d as B,c as Ye,g as y}from"../chunks/-esynYXT.js";import{p as Ze}from"../chunks/B0m3rqSR.js";import{g as pe}from"../chunks/Dkb9lSSG.js";import{U as et}from"../chunks/DxLDbRe7.js";import{D as ue}from"../chunks/BXdh0O4_.js";import{E as tt,P as rt,a as at}from"../chunks/Bc0BXFmi.js";import{D as st,I as nt}from"../chunks/CrNwrvNH.js";import{g as fe}from"../chunks/c_t0vA9G.js";import{w as R}from"../chunks/C73ZVvpW.js";import{t as x}from"../chunks/D6DjlyIQ.js";import{C as ot}from"../chunks/BQabvZPm.js";import{e as V}from"../chunks/BZiHL9L3.js";var it=S('

Loading enterprise...

'),lt=S('

'),dt=S(" ",1),ct=S(' ',1);function Pt(me,ve){ze(ve,!1);const[ge,ye]=Qe(),W=()=>Xe(Ze,"$page",ge),$=l();let r=l(null),c=l([]),m=l([]),U=l(!0),P=l(""),T=l(!1),M=l(!1),I=l(!1),C=l(!1),p=l(null),k=null,h=l();async function J(){if(e($))try{s(U,!0),s(P,"");const[t,a,n]=await Promise.all([y.getEnterprise(e($)),y.listEnterprisePools(e($)).catch(()=>[]),y.listEnterpriseInstances(e($)).catch(()=>[])]);s(r,t),s(c,a),s(m,n)}catch(t){s(P,t instanceof Error?t.message:"Failed to load enterprise")}finally{s(U,!1)}}function he(t,a){const{events:n}=t;return{...a,events:n}}async function _e(t){if(e(r))try{await y.updateEnterprise(e(r).id,t),await J(),x.success("Enterprise Updated",`Enterprise ${e(r).name} has been updated successfully.`),s(T,!1)}catch(a){throw a}}async function be(){if(e(r)){try{await y.deleteEnterprise(e(r).id),pe(B("/enterprises"))}catch(t){const a=V(t);x.error("Delete Failed",a)}s(M,!1)}}async function Ee(){if(e(p))try{await y.deleteInstance(e(p).name),x.success("Instance Deleted",`Instance ${e(p).name} has been deleted successfully.`),s(I,!1),s(p,null)}catch(t){const a=V(t);x.error("Delete Failed",a),s(I,!1),s(p,null)}}function xe(t){s(p,t),s(I,!0)}function $e(){s(C,!0)}async function Ie(t){try{if(!e(r))return;await y.createEnterprisePool(e(r).id,t.detail),x.success("Pool Created",`Pool has been created successfully for enterprise ${e(r).name}.`),s(C,!1)}catch(a){const n=V(a);x.error("Pool Creation Failed",n)}}function K(){e(h)&&Oe(h,e(h).scrollTop=e(h).scrollHeight)}function we(t){if(t.operation==="update"){const a=t.payload;if(e(r)&&a.id===e(r).id){const n=e(r).events?.length||0,o=a.events?.length||0;s(r,he(e(r),a)),o>n&&setTimeout(()=>{K()},100)}}else if(t.operation==="delete"){const a=t.payload.id||t.payload;e(r)&&e(r).id===a&&pe(B("/enterprises"))}}function De(t){if(!e(r))return;const a=t.payload;if(a.enterprise_id===e(r).id){if(t.operation==="create")s(c,[...e(c),a]);else if(t.operation==="update")s(c,e(c).map(n=>n.id===a.id?a:n));else if(t.operation==="delete"){const n=a.id||a;s(c,e(c).filter(o=>o.id!==n))}}}function Pe(t){if(!e(r)||!e(c))return;const a=t.payload;if(e(c).some(o=>o.id===a.pool_id)){if(t.operation==="create")s(m,[...e(m),a]);else if(t.operation==="update")s(m,e(m).map(o=>o.id===a.id?a:o));else if(t.operation==="delete"){const o=a.id||a;s(m,e(m).filter(q=>q.id!==o))}}}Ge(()=>{J().then(()=>{e(r)?.events?.length&&setTimeout(()=>{K()},100)});const t=R.subscribeToEntity("enterprise",["update","delete"],we),a=R.subscribeToEntity("pool",["create","update","delete"],De),n=R.subscribeToEntity("instance",["create","update","delete"],Pe);k=()=>{t(),a(),n()}}),je(()=>{k&&(k(),k=null)}),Re(()=>W(),()=>{s($,W().params.id)}),Ve(),qe();var O=ct();We(t=>{j(()=>Ke.title=`${e(r),i(()=>e(r)?`${e(r).name} - Enterprise Details`:"Enterprise Details")??""} - GARM`)});var L=F(O),H=u(L),Q=u(H),N=u(Q),Te=u(N);f(N);var X=d(N,2),Y=u(X),Z=d(u(Y),2),Me=u(Z,!0);f(Z),f(Y),f(X),f(Q),f(H);var Ce=d(H,2);{var ke=t=>{var a=it();E(t,a)},Ae=t=>{var a=ce(),n=F(a);{var o=_=>{var b=lt(),A=u(b),z=u(A,!0);f(A),f(b),j(()=>de(z,e(P))),E(_,b)},q=_=>{var b=ce(),A=F(b);{var z=G=>{var ae=dt(),se=F(ae);{let w=v(()=>(e(r),i(()=>e(r).name||"Enterprise"))),D=v(()=>(e(r),i(()=>e(r).endpoint?.name))),Ne=v(()=>(le(fe),i(()=>fe("github"))));st(se,{get title(){return e(w)},get subtitle(){return`Endpoint: ${e(D)??""} • GitHub Enterprise`},get forgeIcon(){return e(Ne)},onEdit:()=>s(T,!0),onDelete:()=>s(M,!0)})}var ne=d(se,2);tt(ne,{get entity(){return e(r)},entityType:"enterprise"});var oe=d(ne,2);{let w=v(()=>(e(r),i(()=>e(r).id||""))),D=v(()=>(e(r),i(()=>e(r).name||"")));rt(oe,{get pools(){return e(c)},entityType:"enterprise",get entityId(){return e(w)},get entityName(){return e(D)},$$events:{addPool:$e}})}var ie=d(oe,2);nt(ie,{get instances(){return e(m)},entityType:"enterprise",onDeleteInstance:xe});var He=d(ie,2);{let w=v(()=>(e(r),i(()=>e(r)?.events)));at(He,{get events(){return e(w)},get eventsContainer(){return e(h)},set eventsContainer(D){s(h,D)},$$legacy:!0})}E(G,ae)};g(A,G=>{e(r)&&G(z)},!0)}E(_,b)};g(n,_=>{e(P)?_(o):_(q,!1)},!0)}E(t,a)};g(Ce,t=>{e(U)?t(ke):t(Ae,!1)})}f(L);var ee=d(L,2);{var Fe=t=>{et(t,{get entity(){return e(r)},entityType:"enterprise",$$events:{close:()=>s(T,!1),submit:a=>_e(a.detail)}})};g(ee,t=>{e(T)&&e(r)&&t(Fe)})}var te=d(ee,2);{var Be=t=>{ue(t,{title:"Delete Enterprise",message:"Are you sure you want to delete this enterprise? This action cannot be undone and will remove all associated pools and instances.",get itemName(){return e(r),i(()=>e(r).name)},$$events:{close:()=>s(M,!1),confirm:be}})};g(te,t=>{e(M)&&e(r)&&t(Be)})}var re=d(te,2);{var Se=t=>{ue(t,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(p),i(()=>e(p).name)},$$events:{close:()=>{s(I,!1),s(p,null)},confirm:Ee}})};g(re,t=>{e(I)&&e(p)&&t(Se)})}var Ue=d(re,2);{var Le=t=>{{let a=v(()=>(e(r),i(()=>e(r).id||"")));ot(t,{initialEntityType:"enterprise",get initialEntityId(){return e(a)},$$events:{close:()=>s(C,!1),submit:Ie}})}};g(Ue,t=>{e(C)&&e(r)&&t(Le)})}j(t=>{Ye(Te,"href",t),de(Me,(e(r),i(()=>e(r)?e(r).name:"Loading...")))},[()=>(le(B),i(()=>B("/enterprises")))]),E(me,O),Je(),ye()}export{Pt as component}; diff --git a/webapp/assets/_app/immutable/nodes/7.CRLDW2c_.js b/webapp/assets/_app/immutable/nodes/7.CRLDW2c_.js new file mode 100644 index 00000000..7e10f0b8 --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/7.CRLDW2c_.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as Ye}from"../chunks/C7KraPli.js";import{p as Ze,o as er,l as A,h as rr,f as m,j as ar,t as re,g as e,i as tr,b as n,c as dr,m as i,$ as lr,d as a,u,q as $e,s as d,k as s,r as t,z as L,C as sr,a as or,D as ir,e as Ue,v as nr}from"../chunks/cPTQ2Ibn.js";import{i as p,s as vr,a as mr}from"../chunks/DqFqoVWr.js";import{B as ze,d as y,c as Me,s as N,r as P}from"../chunks/DqbUkQgD.js";import{b as q}from"../chunks/B-_QCM7E.js";import{p as cr}from"../chunks/D4Caz1gY.js";import{g as W}from"../chunks/CTvJf3dP.js";import{a as ur,b as pr}from"../chunks/BVyy60Ai.js";import{t as br}from"../chunks/Bgbd8SZ5.js";import{e as gr}from"../chunks/BZiHL9L3.js";var fr=m('

Username is required

'),xr=m('

Please enter a valid email address

'),hr=m('

Full name is required

'),yr=m('

Password must be at least 8 characters long

'),kr=m('

Passwords do not match

'),_r=sr(' Advanced Configuration (Optional)',1),wr=m('

URL where runners can fetch metadata and setup information.

URL where runners send status updates and lifecycle events.

URL where GitHub/Gitea will send webhook events for job notifications.

'),$r=m("
  • Enter a username
  • "),Ur=m("
  • Enter a valid email address
  • "),zr=m("
  • Enter your full name
  • "),Mr=m("
  • Enter a password with at least 8 characters
  • "),Rr=m("
  • Confirm your password
  • "),Ar=m('

    Please complete all required fields

    '),Pr=m('

    '),qr=m('
    GARM

    Welcome to GARM

    Complete the first-run setup to get started

    First-Run Initialization

    GARM needs to be initialized before first use. This will create the admin user and generate a unique controller ID for this installation.

    This will create the admin user, generate a unique controller ID, and configure the required URLs for your GARM installation.
    Make sure to remember these credentials as they cannot be recovered.

    ');function Dr(Re,Ae){Ze(Ae,!1);const[Pe,qe]=vr(),C=()=>mr(ur,"$authStore",Pe),_=i(),w=i(),$=i(),U=i(),z=i(),S=i();let f=i("admin"),b=i("admin@garm.local"),c=i(""),x=i(""),h=i("Administrator"),j=i(!1),H=i(""),T=i(!1),I=i(""),E=i(""),V=i("");async function Ce(){if(e(S))try{s(j,!0),s(H,""),await pr.initialize(e(f).trim(),e(b).trim(),e(c),e(h).trim(),{callbackUrl:e(I).trim()||void 0,metadataUrl:e(E).trim()||void 0,webhookUrl:e(V).trim()||void 0}),br.success("GARM Initialized","GARM has been successfully initialized. Welcome!"),W(y("/"))}catch(r){s(H,gr(r))}finally{s(j,!1)}}er(()=>{if(C().isAuthenticated){W(y("/"));return}!C().needsInitialization&&!C().loading&&W(y("/login"))}),A(()=>(e(I),e(E),e(V)),()=>{if(typeof window<"u"){const r=window.location.origin;e(I)||s(I,`${r}/api/v1/callbacks`),e(E)||s(E,`${r}/api/v1/metadata`),e(V)||s(V,`${r}/webhooks`)}}),A(()=>e(b),()=>{s(_,e(b).trim()!==""&&e(b).includes("@"))}),A(()=>e(c),()=>{s(w,e(c).length>=8)}),A(()=>(e(x),e(c)),()=>{s($,e(x).length>0&&e(c)===e(x))}),A(()=>e(f),()=>{s(U,e(f).trim()!=="")}),A(()=>e(h),()=>{s(z,e(h).trim()!=="")}),A(()=>(e(U),e(_),e(z),e(w),e($)),()=>{s(S,e(U)&&e(_)&&e(z)&&e(w)&&e($))}),A(()=>(C(),y),()=>{C().isAuthenticated?W(y("/")):!C().needsInitialization&&!C().loading&&W(y("/login"))}),rr(),Ye();var ae=qr();ar(r=>{lr.title="Initialize GARM - First Run Setup"});var te=a(ae),me=a(te),ce=a(me),Ge=d(ce,2);t(me),L(4),t(te);var ue=d(te,2),pe=d(a(ue),2),de=a(pe),le=a(de),be=d(a(le),2),O=a(be);P(O);var Le=d(O,2);{var Ie=r=>{var l=fr();n(r,l)};p(Le,r=>{e(U),e(f),u(()=>!e(U)&&e(f).length>0)&&r(Ie)})}t(be),t(le);var se=d(le,2),ge=d(a(se),2),J=a(ge);P(J);var Ee=d(J,2);{var Ve=r=>{var l=xr();n(r,l)};p(Ee,r=>{e(_),e(b),u(()=>!e(_)&&e(b).length>0)&&r(Ve)})}t(ge),t(se);var oe=d(se,2),fe=d(a(oe),2),K=a(fe);P(K);var Be=d(K,2);{var Ne=r=>{var l=hr();n(r,l)};p(Be,r=>{e(z),e(h),u(()=>!e(z)&&e(h).length>0)&&r(Ne)})}t(fe),t(oe);var ie=d(oe,2),xe=d(a(ie),2),Q=a(xe);P(Q);var Se=d(Q,2);{var je=r=>{var l=yr();n(r,l)};p(Se,r=>{e(w),e(c),u(()=>!e(w)&&e(c).length>0)&&r(je)})}t(xe),t(ie);var ne=d(ie,2),he=d(a(ne),2),X=a(he);P(X);var Fe=d(X,2);{var De=r=>{var l=kr();n(r,l)};p(Fe,r=>{e($),e(x),u(()=>!e($)&&e(x).length>0)&&r(De)})}t(he),t(ne);var ve=d(ne,2),ye=a(ve);ze(ye,{type:"button",variant:"ghost",size:"sm",$$events:{click:()=>s(T,!e(T))},children:(r,l)=>{var g=_r(),v=or(g);L(),re(()=>N(v,0,`w-4 h-4 mr-2 transition-transform ${e(T)?"rotate-90":""}`)),n(r,g)},$$slots:{default:!0}});var We=d(ye,2);{var He=r=>{var l=wr(),g=a(l),v=a(g),M=d(a(v),2),G=a(M);P(G),L(2),t(M),t(v);var B=d(v,2),Y=d(a(B),2),F=a(Y);P(F),L(2),t(Y),t(B);var Z=d(B,2),D=d(a(Z),2),ee=a(D);P(ee),L(2),t(D),t(Z),t(g),t(l),q(G,()=>e(E),R=>s(E,R)),q(F,()=>e(I),R=>s(I,R)),q(ee,()=>e(V),R=>s(V,R)),n(r,l)};p(We,r=>{e(T)&&r(He)})}t(ve);var ke=d(ve,2);{var Te=r=>{var l=Ar(),g=a(l),v=d(a(g),2),M=d(a(v),2),G=a(M),B=a(G);{var Y=o=>{var k=$r();n(o,k)};p(B,o=>{e(U)||o(Y)})}var F=d(B,2);{var Z=o=>{var k=Ur();n(o,k)};p(F,o=>{e(_)||o(Z)})}var D=d(F,2);{var ee=o=>{var k=zr();n(o,k)};p(D,o=>{e(z)||o(ee)})}var R=d(D,2);{var Ke=o=>{var k=Mr();n(o,k)};p(R,o=>{e(w)||o(Ke)})}var Qe=d(R,2);{var Xe=o=>{var k=Rr();n(o,k)};p(Qe,o=>{e($)||o(Xe)})}t(G),t(M),t(v),t(g),t(l),n(r,l)};p(ke,r=>{e(S),e(f),e(b),e(h),e(c),e(x),u(()=>!e(S)&&(e(f).length>0||e(b).length>0||e(h).length>0||e(c).length>0||e(x).length>0))&&r(Te)})}var _e=d(ke,2);{var Oe=r=>{var l=Pr(),g=a(l),v=d(a(g),2),M=a(v),G=a(M,!0);t(M),t(v),t(g),t(l),re(()=>Ue(G,e(H))),n(r,l)};p(_e,r=>{e(H)&&r(Oe)})}var we=d(_e,2),Je=a(we);{let r=nr(()=>!e(S)||e(j));ze(Je,{type:"submit",variant:"primary",size:"lg",fullWidth:!0,get loading(){return e(j)},get disabled(){return e(r)},children:(l,g)=>{L();var v=ir();re(()=>Ue(v,e(j)?"Initializing...":"Initialize GARM")),n(l,v)},$$slots:{default:!0}})}t(we),t(de),L(2),t(pe),t(ue),t(ae),re((r,l)=>{Me(ce,"src",r),Me(Ge,"src",l),N(O,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(U),e(f),u(()=>!e(U)&&e(f).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(J,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(_),e(b),u(()=>!e(_)&&e(b).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(K,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(z),e(h),u(()=>!e(z)&&e(h).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(Q,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(w),e(c),u(()=>!e(w)&&e(c).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(X,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e($),e(x),u(()=>!e($)&&e(x).length>0?"border-red-300 dark:border-red-600":"")??""}`)},[()=>($e(y),u(()=>y("/assets/garm-light.svg"))),()=>($e(y),u(()=>y("/assets/garm-dark.svg")))]),q(O,()=>e(f),r=>s(f,r)),q(J,()=>e(b),r=>s(b,r)),q(K,()=>e(h),r=>s(h,r)),q(Q,()=>e(c),r=>s(c,r)),q(X,()=>e(x),r=>s(x,r)),tr("submit",de,cr(Ce)),n(Re,ae),dr(),qe()}export{Dr as component}; diff --git a/webapp/assets/_app/immutable/nodes/7.VnEcY_XD.js b/webapp/assets/_app/immutable/nodes/7.VnEcY_XD.js deleted file mode 100644 index c496304c..00000000 --- a/webapp/assets/_app/immutable/nodes/7.VnEcY_XD.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Ye}from"../chunks/DT0EGONV.js";import{p as Ze,o as er,l as A,a as rr,f as m,h as ar,t as re,g as e,e as tr,c as n,d as dr,m as i,$ as lr,j as a,u,n as $e,k as d,s,r as t,z as L,C as sr,b as or,D as ir,v as Ue,q as nr}from"../chunks/CRKWEg6v.js";import{i as p,s as vr,a as mr}from"../chunks/e1m7WRO5.js";import{B as ze,d as y,c as Me,s as N,r as P}from"../chunks/-esynYXT.js";import{b as q}from"../chunks/B3a35v7J.js";import{p as cr}from"../chunks/D4Caz1gY.js";import{g as W}from"../chunks/Dkb9lSSG.js";import{a as ur,b as pr}from"../chunks/D9uxtZe_.js";import{t as br}from"../chunks/D6DjlyIQ.js";import{e as gr}from"../chunks/BZiHL9L3.js";var fr=m('

    Username is required

    '),xr=m('

    Please enter a valid email address

    '),hr=m('

    Full name is required

    '),yr=m('

    Password must be at least 8 characters long

    '),kr=m('

    Passwords do not match

    '),_r=sr(' Advanced Configuration (Optional)',1),wr=m('

    URL where runners can fetch metadata and setup information.

    URL where runners send status updates and lifecycle events.

    URL where GitHub/Gitea will send webhook events for job notifications.

    '),$r=m("
  • Enter a username
  • "),Ur=m("
  • Enter a valid email address
  • "),zr=m("
  • Enter your full name
  • "),Mr=m("
  • Enter a password with at least 8 characters
  • "),Rr=m("
  • Confirm your password
  • "),Ar=m('

    Please complete all required fields

    '),Pr=m('

    '),qr=m('
    GARM

    Welcome to GARM

    Complete the first-run setup to get started

    First-Run Initialization

    GARM needs to be initialized before first use. This will create the admin user and generate a unique controller ID for this installation.

    This will create the admin user, generate a unique controller ID, and configure the required URLs for your GARM installation.
    Make sure to remember these credentials as they cannot be recovered.

    ');function Dr(Re,Ae){Ze(Ae,!1);const[Pe,qe]=vr(),C=()=>mr(ur,"$authStore",Pe),_=i(),w=i(),$=i(),U=i(),z=i(),S=i();let f=i("admin"),b=i("admin@garm.local"),c=i(""),x=i(""),h=i("Administrator"),j=i(!1),H=i(""),T=i(!1),I=i(""),E=i(""),V=i("");async function Ce(){if(e(S))try{s(j,!0),s(H,""),await pr.initialize(e(f).trim(),e(b).trim(),e(c),e(h).trim(),{callbackUrl:e(I).trim()||void 0,metadataUrl:e(E).trim()||void 0,webhookUrl:e(V).trim()||void 0}),br.success("GARM Initialized","GARM has been successfully initialized. Welcome!"),W(y("/"))}catch(r){s(H,gr(r))}finally{s(j,!1)}}er(()=>{if(C().isAuthenticated){W(y("/"));return}!C().needsInitialization&&!C().loading&&W(y("/login"))}),A(()=>(e(I),e(E),e(V)),()=>{if(typeof window<"u"){const r=window.location.origin;e(I)||s(I,`${r}/api/v1/callbacks`),e(E)||s(E,`${r}/api/v1/metadata`),e(V)||s(V,`${r}/webhooks`)}}),A(()=>e(b),()=>{s(_,e(b).trim()!==""&&e(b).includes("@"))}),A(()=>e(c),()=>{s(w,e(c).length>=8)}),A(()=>(e(x),e(c)),()=>{s($,e(x).length>0&&e(c)===e(x))}),A(()=>e(f),()=>{s(U,e(f).trim()!=="")}),A(()=>e(h),()=>{s(z,e(h).trim()!=="")}),A(()=>(e(U),e(_),e(z),e(w),e($)),()=>{s(S,e(U)&&e(_)&&e(z)&&e(w)&&e($))}),A(()=>(C(),y),()=>{C().isAuthenticated?W(y("/")):!C().needsInitialization&&!C().loading&&W(y("/login"))}),rr(),Ye();var ae=qr();ar(r=>{lr.title="Initialize GARM - First Run Setup"});var te=a(ae),me=a(te),ce=a(me),Ge=d(ce,2);t(me),L(4),t(te);var ue=d(te,2),pe=d(a(ue),2),de=a(pe),le=a(de),be=d(a(le),2),O=a(be);P(O);var Le=d(O,2);{var Ie=r=>{var l=fr();n(r,l)};p(Le,r=>{e(U),e(f),u(()=>!e(U)&&e(f).length>0)&&r(Ie)})}t(be),t(le);var se=d(le,2),ge=d(a(se),2),J=a(ge);P(J);var Ee=d(J,2);{var Ve=r=>{var l=xr();n(r,l)};p(Ee,r=>{e(_),e(b),u(()=>!e(_)&&e(b).length>0)&&r(Ve)})}t(ge),t(se);var oe=d(se,2),fe=d(a(oe),2),K=a(fe);P(K);var Be=d(K,2);{var Ne=r=>{var l=hr();n(r,l)};p(Be,r=>{e(z),e(h),u(()=>!e(z)&&e(h).length>0)&&r(Ne)})}t(fe),t(oe);var ie=d(oe,2),xe=d(a(ie),2),Q=a(xe);P(Q);var Se=d(Q,2);{var je=r=>{var l=yr();n(r,l)};p(Se,r=>{e(w),e(c),u(()=>!e(w)&&e(c).length>0)&&r(je)})}t(xe),t(ie);var ne=d(ie,2),he=d(a(ne),2),X=a(he);P(X);var Fe=d(X,2);{var De=r=>{var l=kr();n(r,l)};p(Fe,r=>{e($),e(x),u(()=>!e($)&&e(x).length>0)&&r(De)})}t(he),t(ne);var ve=d(ne,2),ye=a(ve);ze(ye,{type:"button",variant:"ghost",size:"sm",$$events:{click:()=>s(T,!e(T))},children:(r,l)=>{var g=_r(),v=or(g);L(),re(()=>N(v,0,`w-4 h-4 mr-2 transition-transform ${e(T)?"rotate-90":""}`)),n(r,g)},$$slots:{default:!0}});var We=d(ye,2);{var He=r=>{var l=wr(),g=a(l),v=a(g),M=d(a(v),2),G=a(M);P(G),L(2),t(M),t(v);var B=d(v,2),Y=d(a(B),2),F=a(Y);P(F),L(2),t(Y),t(B);var Z=d(B,2),D=d(a(Z),2),ee=a(D);P(ee),L(2),t(D),t(Z),t(g),t(l),q(G,()=>e(E),R=>s(E,R)),q(F,()=>e(I),R=>s(I,R)),q(ee,()=>e(V),R=>s(V,R)),n(r,l)};p(We,r=>{e(T)&&r(He)})}t(ve);var ke=d(ve,2);{var Te=r=>{var l=Ar(),g=a(l),v=d(a(g),2),M=d(a(v),2),G=a(M),B=a(G);{var Y=o=>{var k=$r();n(o,k)};p(B,o=>{e(U)||o(Y)})}var F=d(B,2);{var Z=o=>{var k=Ur();n(o,k)};p(F,o=>{e(_)||o(Z)})}var D=d(F,2);{var ee=o=>{var k=zr();n(o,k)};p(D,o=>{e(z)||o(ee)})}var R=d(D,2);{var Ke=o=>{var k=Mr();n(o,k)};p(R,o=>{e(w)||o(Ke)})}var Qe=d(R,2);{var Xe=o=>{var k=Rr();n(o,k)};p(Qe,o=>{e($)||o(Xe)})}t(G),t(M),t(v),t(g),t(l),n(r,l)};p(ke,r=>{e(S),e(f),e(b),e(h),e(c),e(x),u(()=>!e(S)&&(e(f).length>0||e(b).length>0||e(h).length>0||e(c).length>0||e(x).length>0))&&r(Te)})}var _e=d(ke,2);{var Oe=r=>{var l=Pr(),g=a(l),v=d(a(g),2),M=a(v),G=a(M,!0);t(M),t(v),t(g),t(l),re(()=>Ue(G,e(H))),n(r,l)};p(_e,r=>{e(H)&&r(Oe)})}var we=d(_e,2),Je=a(we);{let r=nr(()=>!e(S)||e(j));ze(Je,{type:"submit",variant:"primary",size:"lg",fullWidth:!0,get loading(){return e(j)},get disabled(){return e(r)},children:(l,g)=>{L();var v=ir();re(()=>Ue(v,e(j)?"Initializing...":"Initialize GARM")),n(l,v)},$$slots:{default:!0}})}t(we),t(de),L(2),t(pe),t(ue),t(ae),re((r,l)=>{Me(ce,"src",r),Me(Ge,"src",l),N(O,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(U),e(f),u(()=>!e(U)&&e(f).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(J,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(_),e(b),u(()=>!e(_)&&e(b).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(K,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(z),e(h),u(()=>!e(z)&&e(h).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(Q,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e(w),e(c),u(()=>!e(w)&&e(c).length>0?"border-red-300 dark:border-red-600":"")??""}`),N(X,1,`appearance-none block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white sm:text-sm ${e($),e(x),u(()=>!e($)&&e(x).length>0?"border-red-300 dark:border-red-600":"")??""}`)},[()=>($e(y),u(()=>y("/assets/garm-light.svg"))),()=>($e(y),u(()=>y("/assets/garm-dark.svg")))]),q(O,()=>e(f),r=>s(f,r)),q(J,()=>e(b),r=>s(b,r)),q(K,()=>e(h),r=>s(h,r)),q(Q,()=>e(c),r=>s(c,r)),q(X,()=>e(x),r=>s(x,r)),tr("submit",de,cr(Ce)),n(Re,ae),dr(),qe()}export{Dr as component}; diff --git a/webapp/assets/_app/immutable/nodes/8.D4Evg3dB.js b/webapp/assets/_app/immutable/nodes/8.D4Evg3dB.js deleted file mode 100644 index 8b86a1ec..00000000 --- a/webapp/assets/_app/immutable/nodes/8.D4Evg3dB.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as z}from"../chunks/DT0EGONV.js";import{p as J,f as C,c as x,d as K,j as y,n as f,u as g,r as b,t as M,v as R,B as ce,b as O,o as de,A as ue,l as w,a as me,h as pe,g as e,m as u,$ as fe,q as ge,k as T,s}from"../chunks/CRKWEg6v.js";import{p as ve,i as A}from"../chunks/e1m7WRO5.js";import{d as D,c as $,g as H}from"../chunks/-esynYXT.js";import{D as he}from"../chunks/BXdh0O4_.js";import{P as _e}from"../chunks/BAnDfGwP.js";import{w as ye}from"../chunks/C73ZVvpW.js";import{t as be}from"../chunks/D6DjlyIQ.js";import{D as xe,G as Ce,a as Pe}from"../chunks/B1coRVG4.js";import{e as ke}from"../chunks/BZiHL9L3.js";import{E as Ie}from"../chunks/DF8ZTWYj.js";import"../chunks/D0m048VH.js";import{S as W}from"../chunks/B0Y2gXDu.js";var Se=C(' '),we=C(' '),Te=C('-'),De=C('
    ');function $e(E,k){J(k,!1);let a=ve(k,"item",8);z();var m=De(),I=y(m);{var i=r=>{var p=Se(),h=y(p);b(p),M(n=>{$(p,"href",n),$(p,"title",`Pool: ${f(a()),g(()=>a().pool_id)??""}`),R(h,`Pool: ${f(a()),g(()=>a().pool_id)??""}`)},[()=>(f(D),f(a()),g(()=>D(`/pools/${a().pool_id}`)))]),x(r,p)},P=r=>{var p=ce(),h=O(p);{var n=l=>{var o=we(),c=y(o);b(o),M(S=>{$(o,"href",S),$(o,"title",`Scale Set: ${f(a()),g(()=>a().scale_set_id)??""}`),R(c,`Scale Set: ${f(a()),g(()=>a().scale_set_id)??""}`)},[()=>(f(D),f(a()),g(()=>D(`/scalesets/${a().scale_set_id}`)))]),x(l,o)},v=l=>{var o=Te();x(l,o)};A(h,l=>{f(a()),g(()=>a()?.scale_set_id)?l(n):l(v,!1)},!0)}x(r,p)};A(I,r=>{f(a()),g(()=>a()?.pool_id)?r(i):r(P,!1)})}b(m),x(E,m),K()}var Ae=C('

    Error

    '),Ee=C('
    ',1);function Oe(E,k){J(k,!1);const a=u(),m=u(),I=u();let i=u([]),P=u(!0),r=u(""),p="",h=null,n=u(1),v=u(25),l=u(""),o=u(!1),c=u(null);async function S(){try{s(P,!0),s(r,""),s(i,await H.listInstances())}catch(t){s(r,t instanceof Error?t.message:"Failed to load instances")}finally{s(P,!1)}}function F(t){s(c,t),s(o,!0)}async function Q(){if(e(c))try{await H.deleteInstance(e(c).name),be.success("Instance Deleted",`Instance ${e(c).name} has been deleted successfully.`)}catch(t){s(r,ke(t))}finally{s(o,!1),s(c,null)}}const U=[{key:"name",title:"Name",cellComponent:Ie,cellProps:{entityType:"instance",showId:!0}},{key:"pool_scale_set",title:"Pool/Scale Set",flexible:!0,cellComponent:$e},{key:"created",title:"Created",cellComponent:Ce,cellProps:{field:"created_at",type:"date"}},{key:"status",title:"Status",cellComponent:W,cellProps:{statusType:"instance",statusField:"status"}},{key:"runner_status",title:"Runner Status",cellComponent:W,cellProps:{statusType:"instance",statusField:"runner_status"}},{key:"actions",title:"Actions",align:"right",cellComponent:Pe,cellProps:{actions:[{type:"delete",title:"Delete",ariaLabel:"Delete instance",action:"delete"}]}}],V={entityType:"instance",primaryText:{field:"name",isClickable:!0,href:"/instances/{name}"},secondaryText:{field:"provider_id"},badges:[{type:"status",field:"status"},{type:"status",field:"runner_status"}],actions:[{type:"delete",handler:t=>F(t)}]};function X(t){s(l,t.detail.term),s(n,1)}function Y(t){s(n,t.detail.page)}function Z(t){s(v,t.detail.perPage),s(n,1)}async function ee(){try{await S()}catch(t){console.error("Retry failed:",t)}}function te(t){}function ae(t){F(t.detail.item)}function se(t){if(t.operation==="create"){const d=t.payload;s(i,[...e(i),d])}else if(t.operation==="update"){const d=t.payload;s(i,e(i).map(_=>_.name===d.name?d:_))}else if(t.operation==="delete"){const d=t.payload.name||t.payload;s(i,e(i).filter(_=>_.name!==d))}}de(()=>{S(),h=ye.subscribeToEntity("instance",["create","update","delete"],se)}),ue(()=>{h&&(h(),h=null)}),w(()=>(e(i),e(l)),()=>{s(a,e(i).filter(t=>(e(l)===""||t.name?.toLowerCase().includes(e(l).toLowerCase())||t.provider_id?.toLowerCase().includes(e(l).toLowerCase()))&&p===""))}),w(()=>(e(a),e(v)),()=>{s(m,Math.ceil(e(a).length/e(v)))}),w(()=>(e(n),e(m)),()=>{e(n)>e(m)&&e(m)>0&&s(n,e(m))}),w(()=>(e(a),e(n),e(v)),()=>{s(I,e(a).slice((e(n)-1)*e(v),e(n)*e(v)))}),me(),z();var N=Ee();pe(t=>{fe.title="Instances - GARM"});var L=O(N),G=y(L);_e(G,{title:"Runner Instances",description:"Monitor your running instances",showAction:!1});var q=T(G,2);{var re=t=>{var d=Ae(),_=y(d),j=y(_),B=T(y(j),2),ie=y(B,!0);b(B),b(j),b(_),b(d),M(()=>R(ie,e(r))),x(t,d)};A(q,t=>{e(r)&&t(re)})}var ne=T(q,2);{let t=ge(()=>!!e(r));xe(ne,{get columns(){return U},get data(){return e(I)},get loading(){return e(P)},get error(){return e(r)},get searchTerm(){return e(l)},searchPlaceholder:"Search instances...",get currentPage(){return e(n)},get perPage(){return e(v)},get totalPages(){return e(m)},get totalItems(){return e(a),g(()=>e(a).length)},itemName:"instances",emptyIconType:"cog",get showRetry(){return e(t)},get mobileCardConfig(){return V},$$events:{search:X,pageChange:Y,perPageChange:Z,retry:ee,edit:te,delete:ae}})}b(L);var le=T(L,2);{var oe=t=>{he(t,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(c),g(()=>e(c).name)},$$events:{close:()=>{s(o,!1),s(c,null)},confirm:Q}})};A(le,t=>{e(o)&&e(c)&&t(oe)})}x(E,N),K()}export{Oe as component}; diff --git a/webapp/assets/_app/immutable/nodes/8.DVlwXnoT.js b/webapp/assets/_app/immutable/nodes/8.DVlwXnoT.js new file mode 100644 index 00000000..4c2130da --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/8.DVlwXnoT.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as z}from"../chunks/C7KraPli.js";import{p as J,f as C,b as x,c as K,d as y,q as f,u as g,r as b,t as M,e as R,B as ce,a as O,o as de,A as ue,l as w,h as me,j as pe,g as e,m as u,$ as fe,v as ge,s as T,k as s}from"../chunks/cPTQ2Ibn.js";import{p as ve,i as A}from"../chunks/DqFqoVWr.js";import{d as D,c as $,g as H}from"../chunks/DqbUkQgD.js";import{D as he}from"../chunks/91PQ6UtW.js";import{P as _e}from"../chunks/U3V4g_hv.js";import{w as ye}from"../chunks/BV_mDmfH.js";import{t as be}from"../chunks/Bgbd8SZ5.js";import{D as xe,G as Ce,A as Pe}from"../chunks/Du50aAe5.js";import{e as ke}from"../chunks/BZiHL9L3.js";import{E as Ie}from"../chunks/CPFytHjx.js";import"../chunks/D7e9zx6w.js";import{S as W}from"../chunks/BZ2WxPPD.js";var Se=C(' '),we=C(' '),Te=C('-'),De=C('
    ');function $e(E,k){J(k,!1);let a=ve(k,"item",8);z();var m=De(),I=y(m);{var i=r=>{var p=Se(),h=y(p);b(p),M(n=>{$(p,"href",n),$(p,"title",`Pool: ${f(a()),g(()=>a().pool_id)??""}`),R(h,`Pool: ${f(a()),g(()=>a().pool_id)??""}`)},[()=>(f(D),f(a()),g(()=>D(`/pools/${a().pool_id}`)))]),x(r,p)},P=r=>{var p=ce(),h=O(p);{var n=l=>{var o=we(),c=y(o);b(o),M(S=>{$(o,"href",S),$(o,"title",`Scale Set: ${f(a()),g(()=>a().scale_set_id)??""}`),R(c,`Scale Set: ${f(a()),g(()=>a().scale_set_id)??""}`)},[()=>(f(D),f(a()),g(()=>D(`/scalesets/${a().scale_set_id}`)))]),x(l,o)},v=l=>{var o=Te();x(l,o)};A(h,l=>{f(a()),g(()=>a()?.scale_set_id)?l(n):l(v,!1)},!0)}x(r,p)};A(I,r=>{f(a()),g(()=>a()?.pool_id)?r(i):r(P,!1)})}b(m),x(E,m),K()}var Ae=C('

    Error

    '),Ee=C('
    ',1);function Oe(E,k){J(k,!1);const a=u(),m=u(),I=u();let i=u([]),P=u(!0),r=u(""),p="",h=null,n=u(1),v=u(25),l=u(""),o=u(!1),c=u(null);async function S(){try{s(P,!0),s(r,""),s(i,await H.listInstances())}catch(t){s(r,t instanceof Error?t.message:"Failed to load instances")}finally{s(P,!1)}}function F(t){s(c,t),s(o,!0)}async function Q(){if(e(c))try{await H.deleteInstance(e(c).name),be.success("Instance Deleted",`Instance ${e(c).name} has been deleted successfully.`)}catch(t){s(r,ke(t))}finally{s(o,!1),s(c,null)}}const U=[{key:"name",title:"Name",cellComponent:Ie,cellProps:{entityType:"instance",showId:!0}},{key:"pool_scale_set",title:"Pool/Scale Set",flexible:!0,cellComponent:$e},{key:"created",title:"Created",cellComponent:Ce,cellProps:{field:"created_at",type:"date"}},{key:"status",title:"Status",cellComponent:W,cellProps:{statusType:"instance",statusField:"status"}},{key:"runner_status",title:"Runner Status",cellComponent:W,cellProps:{statusType:"instance",statusField:"runner_status"}},{key:"actions",title:"Actions",align:"right",cellComponent:Pe,cellProps:{actions:[{type:"delete",title:"Delete",ariaLabel:"Delete instance",action:"delete"}]}}],V={entityType:"instance",primaryText:{field:"name",isClickable:!0,href:"/instances/{name}"},secondaryText:{field:"provider_id"},badges:[{type:"status",field:"status"},{type:"status",field:"runner_status"}],actions:[{type:"delete",handler:t=>F(t)}]};function X(t){s(l,t.detail.term),s(n,1)}function Y(t){s(n,t.detail.page)}function Z(t){s(v,t.detail.perPage),s(n,1)}async function ee(){try{await S()}catch(t){console.error("Retry failed:",t)}}function te(t){}function ae(t){F(t.detail.item)}function se(t){if(t.operation==="create"){const d=t.payload;s(i,[...e(i),d])}else if(t.operation==="update"){const d=t.payload;s(i,e(i).map(_=>_.name===d.name?d:_))}else if(t.operation==="delete"){const d=t.payload.name||t.payload;s(i,e(i).filter(_=>_.name!==d))}}de(()=>{S(),h=ye.subscribeToEntity("instance",["create","update","delete"],se)}),ue(()=>{h&&(h(),h=null)}),w(()=>(e(i),e(l)),()=>{s(a,e(i).filter(t=>(e(l)===""||t.name?.toLowerCase().includes(e(l).toLowerCase())||t.provider_id?.toLowerCase().includes(e(l).toLowerCase()))&&p===""))}),w(()=>(e(a),e(v)),()=>{s(m,Math.ceil(e(a).length/e(v)))}),w(()=>(e(n),e(m)),()=>{e(n)>e(m)&&e(m)>0&&s(n,e(m))}),w(()=>(e(a),e(n),e(v)),()=>{s(I,e(a).slice((e(n)-1)*e(v),e(n)*e(v)))}),me(),z();var N=Ee();pe(t=>{fe.title="Instances - GARM"});var L=O(N),G=y(L);_e(G,{title:"Runner Instances",description:"Monitor your running instances",showAction:!1});var q=T(G,2);{var re=t=>{var d=Ae(),_=y(d),j=y(_),B=T(y(j),2),ie=y(B,!0);b(B),b(j),b(_),b(d),M(()=>R(ie,e(r))),x(t,d)};A(q,t=>{e(r)&&t(re)})}var ne=T(q,2);{let t=ge(()=>!!e(r));xe(ne,{get columns(){return U},get data(){return e(I)},get loading(){return e(P)},get error(){return e(r)},get searchTerm(){return e(l)},searchPlaceholder:"Search instances...",get currentPage(){return e(n)},get perPage(){return e(v)},get totalPages(){return e(m)},get totalItems(){return e(a),g(()=>e(a).length)},itemName:"instances",emptyIconType:"cog",get showRetry(){return e(t)},get mobileCardConfig(){return V},$$events:{search:X,pageChange:Y,perPageChange:Z,retry:ee,edit:te,delete:ae}})}b(L);var le=T(L,2);{var oe=t=>{he(t,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return e(c),g(()=>e(c).name)},$$events:{close:()=>{s(o,!1),s(c,null)},confirm:Q}})};A(le,t=>{e(o)&&e(c)&&t(oe)})}x(E,N),K()}export{Oe as component}; diff --git a/webapp/assets/_app/immutable/nodes/9.BqnVeyTj.js b/webapp/assets/_app/immutable/nodes/9.BqnVeyTj.js deleted file mode 100644 index bde9f541..00000000 --- a/webapp/assets/_app/immutable/nodes/9.BqnVeyTj.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as $e}from"../chunks/DT0EGONV.js";import{p as Ue,o as Le,A as Oe,l as Pe,a as Ve,f as u,h as ze,b as P,t as f,c as v,d as Re,u as r,n as p,v as m,g as t,m as A,j as s,k as d,s as h,$ as qe,r as a,B as Tt,e as Fe,q as $t,D as Ut}from"../chunks/CRKWEg6v.js";import{i as g,s as Ge,a as He}from"../chunks/e1m7WRO5.js";import{w as We,e as Lt,i as Ot}from"../chunks/C73ZVvpW.js";import{d as j,c as nt,g as Pt,s as Vt}from"../chunks/-esynYXT.js";import{b as Je}from"../chunks/b5SBTec5.js";import{p as Ke}from"../chunks/B0m3rqSR.js";import{g as zt}from"../chunks/Dkb9lSSG.js";import{D as Qe}from"../chunks/BXdh0O4_.js";import{g as V,f as z}from"../chunks/ow_oMtSd.js";import{s as Rt,b as B,B as qt,d as Ft}from"../chunks/c_t0vA9G.js";import{e as Xe}from"../chunks/BZiHL9L3.js";var Ye=u('

    Error

    '),Ze=u('

    Loading instance details...

    '),ta=u(' '),ea=u(' '),aa=u('-'),sa=u('
    Updated At:
    '),ra=u('
    '),da=u('
    Network Addresses:
    '),ia=u('
    Network Addresses:
    No addresses available
    '),na=u('
    OS Type:
    '),la=u('
    OS Name:
    '),oa=u('
    OS Version:
    '),va=u('
    OS Architecture:
    '),xa=u('

    '),ca=u('

    Status Messages

    '),ma=u('

    Status Messages

    No status messages available

    '),ua=u('

    Instance Information

    ID:
    Name:
    Provider ID:
    Provider:
    Pool/Scale Set:
    Agent ID:
    Created At:

    Status & Network

    Instance Status:
    Runner Status:
    ',1),ga=u('
    Instance not found.
    '),_a=u(' ',1);function Ba(Gt,Ht){Ue(Ht,!1);const[Wt,Jt]=Ge(),lt=()=>He(Ke,"$page",Wt),R=A();let e=A(null),q=A(!0),N=A(""),E=A(!1),T=null,$=A();async function Kt(){if(t(R))try{h(q,!0),h(N,""),h(e,await Pt.getInstance(t(R)))}catch(l){h(N,l instanceof Error?l.message:"Failed to load instance")}finally{h(q,!1)}}async function Qt(){if(t(e)){try{await Pt.deleteInstance(t(e).name),zt(j("/instances"))}catch(l){h(N,Xe(l))}h(E,!1)}}function Xt(l){if(t(e))if(l.operation==="update"&&l.payload.id===t(e).id){const b=t(e).status_messages?.length||0,D={...t(e),...l.payload},M=D.status_messages?.length||0;h(e,D),M>b&&setTimeout(()=>{Rt(t($))},100)}else l.operation==="delete"&&(l.payload.id||l.payload)===t(e).id&&zt(j("/instances"))}Le(()=>{Kt().then(()=>{t(e)?.status_messages?.length&&setTimeout(()=>{Rt(t($))},100)}),T=We.subscribeToEntity("instance",["update","delete"],Xt)}),Oe(()=>{T&&(T(),T=null)}),Pe(()=>lt(),()=>{h(R,decodeURIComponent(lt().params.id||""))}),Ve(),$e();var ot=_a();ze(l=>{f(()=>qe.title=`${t(e),r(()=>t(e)?`${t(e).name} - Instance Details`:"Instance Details")??""} - GARM`)});var F=P(ot),G=s(F),vt=s(G),H=s(vt),Yt=s(H);a(H);var xt=d(H,2),ct=s(xt),mt=d(s(ct),2),Zt=s(mt,!0);a(mt),a(ct),a(xt),a(vt),a(G);var ut=d(G,2);{var te=l=>{var b=Ye(),D=s(b),M=s(D),U=d(s(M),2),I=s(U,!0);a(U),a(M),a(D),a(b),f(()=>m(I,t(N))),v(l,b)};g(ut,l=>{t(N)&&l(te)})}var ee=d(ut,2);{var ae=l=>{var b=Ze();v(l,b)},se=l=>{var b=Tt(),D=P(b);{var M=I=>{var L=ua(),W=P(L),J=s(W),K=s(J),gt=d(s(K),2),ie=s(gt);a(gt),a(K);var _t=d(K,2),Q=s(_t),ft=d(s(Q),2),ne=s(ft,!0);a(ft),a(Q);var X=d(Q,2),yt=d(s(X),2),le=s(yt,!0);a(yt),a(X);var Y=d(X,2),pt=d(s(Y),2),oe=s(pt,!0);a(pt),a(Y);var Z=d(Y,2),ht=d(s(Z),2),ve=s(ht,!0);a(ht),a(Z);var tt=d(Z,2),bt=d(s(tt),2),xe=s(bt);{var ce=i=>{var n=ta(),o=s(n,!0);a(n),f(x=>{nt(n,"href",x),m(o,(t(e),r(()=>t(e).pool_id)))},[()=>(p(j),t(e),r(()=>j(`/pools/${t(e).pool_id}`)))]),v(i,n)},me=i=>{var n=Tt(),o=P(n);{var x=_=>{var y=ea(),S=s(y,!0);a(y),f(C=>{nt(y,"href",C),m(S,(t(e),r(()=>t(e).scale_set_id)))},[()=>(p(j),t(e),r(()=>j(`/scalesets/${t(e).scale_set_id}`)))]),v(_,y)},c=_=>{var y=aa();v(_,y)};g(o,_=>{t(e),r(()=>t(e).scale_set_id)?_(x):_(c,!1)},!0)}v(i,n)};g(xe,i=>{t(e),r(()=>t(e).pool_id)?i(ce):i(me,!1)})}a(bt),a(tt);var et=d(tt,2),kt=d(s(et),2),ue=s(kt,!0);a(kt),a(et);var at=d(et,2),wt=d(s(at),2),ge=s(wt,!0);a(wt),a(at);var _e=d(at,2);{var fe=i=>{var n=sa(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(c=>m(x,c),[()=>(p(B),t(e),r(()=>B(t(e).updated_at)))]),v(i,n)};g(_e,i=>{t(e),r(()=>t(e).updated_at&&t(e).updated_at!==t(e).created_at)&&i(fe)})}a(_t),a(J);var It=d(J,2),jt=d(s(It),2),st=s(jt),Dt=d(s(st),2),rt=s(Dt),ye=s(rt,!0);a(rt),a(Dt),a(st);var dt=d(st,2),St=d(s(dt),2),it=s(St),pe=s(it,!0);a(it),a(St),a(dt);var Mt=d(dt,2);{var he=i=>{var n=da(),o=d(s(n),2);Lt(o,5,()=>(t(e),r(()=>t(e).addresses)),Ot,(x,c)=>{var _=ra(),y=s(_),S=s(y,!0);a(y);var C=d(y,2);{let O=$t(()=>(t(c),r(()=>t(c).type||"Unknown")));qt(C,{variant:"info",get text(){return t(O)}})}a(_),f(()=>m(S,(t(c),r(()=>t(c).address)))),v(x,_)}),a(o),a(n),v(i,n)},be=i=>{var n=ia();v(i,n)};g(Mt,i=>{t(e),r(()=>t(e).addresses&&t(e).addresses.length>0)?i(he):i(be,!1)})}var At=d(Mt,2);{var ke=i=>{var n=na(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_type)))),v(i,n)};g(At,i=>{t(e),r(()=>t(e).os_type)&&i(ke)})}var Bt=d(At,2);{var we=i=>{var n=la(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_name)))),v(i,n)};g(Bt,i=>{t(e),r(()=>t(e).os_name)&&i(we)})}var Nt=d(Bt,2);{var Ie=i=>{var n=oa(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_version)))),v(i,n)};g(Nt,i=>{t(e),r(()=>t(e).os_version)&&i(Ie)})}var je=d(Nt,2);{var De=i=>{var n=va(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_arch)))),v(i,n)};g(je,i=>{t(e),r(()=>t(e).os_arch)&&i(De)})}a(jt),a(It),a(W);var Se=d(W,2);{var Me=i=>{var n=ca(),o=d(s(n),2);Lt(o,5,()=>(t(e),r(()=>t(e).status_messages)),Ot,(x,c)=>{var _=xa(),y=s(_),S=s(y),C=s(S,!0);a(S);var O=d(S,2),Ct=s(O);{var Be=k=>{const w=$t(()=>(p(Ft),t(c),r(()=>Ft(t(c).event_level))));qt(k,{get variant(){return p(t(w)),r(()=>t(w).variant)},get text(){return p(t(w)),r(()=>t(w).text)}})};g(Ct,k=>{t(c),r(()=>t(c).event_level)&&k(Be)})}var Et=d(Ct,2),Ne=s(Et);{var Ce=k=>{var w=Ut();f(Te=>m(w,Te),[()=>(p(B),t(c),r(()=>B(t(c).created_at)))]),v(k,w)},Ee=k=>{var w=Ut("Unknown date");v(k,w)};g(Ne,k=>{t(c),r(()=>t(c).created_at)?k(Ce):k(Ee,!1)})}a(Et),a(O),a(y),a(_),f(()=>m(C,(t(c),r(()=>t(c).message)))),v(x,_)}),a(o),Je(o,x=>h($,x),()=>t($)),a(n),v(i,n)},Ae=i=>{var n=ma();v(i,n)};g(Se,i=>{t(e),r(()=>t(e).status_messages&&t(e).status_messages.length>0)?i(Me):i(Ae,!1)})}f((i,n,o,x,c)=>{m(ne,(t(e),r(()=>t(e).id))),m(le,(t(e),r(()=>t(e).name))),m(oe,(t(e),r(()=>t(e).provider_id))),m(ve,(t(e),r(()=>t(e).provider_name||"Unknown"))),m(ue,(t(e),r(()=>t(e).agent_id||"Not assigned"))),m(ge,i),Vt(rt,1,`inline-flex px-2 py-1 text-xs font-semibold rounded-full ring-1 ring-inset ${n??""}`),m(ye,o),Vt(it,1,`inline-flex px-2 py-1 text-xs font-semibold rounded-full ring-1 ring-inset ${x??""}`),m(pe,c)},[()=>(p(B),t(e),r(()=>B(t(e).created_at))),()=>(p(V),t(e),r(()=>V(t(e).status||"unknown"))),()=>(p(z),t(e),r(()=>z(t(e).status||"unknown"))),()=>(p(V),t(e),r(()=>V(t(e).runner_status||"unknown"))),()=>(p(z),t(e),r(()=>z(t(e).runner_status||"unknown")))]),Fe("click",ie,()=>h(E,!0)),v(I,L)},U=I=>{var L=ga();v(I,L)};g(D,I=>{t(e)?I(M):I(U,!1)},!0)}v(l,b)};g(ee,l=>{t(q)?l(ae):l(se,!1)})}a(F);var re=d(F,2);{var de=l=>{Qe(l,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return t(e),r(()=>t(e).name)},$$events:{close:()=>h(E,!1),confirm:Qt}})};g(re,l=>{t(E)&&t(e)&&l(de)})}f(l=>{nt(Yt,"href",l),m(Zt,(t(e),r(()=>t(e)?t(e).name:"Instance Details")))},[()=>(p(j),r(()=>j("/instances")))]),v(Gt,ot),Re(),Jt()}export{Ba as component}; diff --git a/webapp/assets/_app/immutable/nodes/9.el4sTgm4.js b/webapp/assets/_app/immutable/nodes/9.el4sTgm4.js new file mode 100644 index 00000000..a2253f7e --- /dev/null +++ b/webapp/assets/_app/immutable/nodes/9.el4sTgm4.js @@ -0,0 +1 @@ +import"../chunks/DsnmJJEf.js";import{i as $e}from"../chunks/C7KraPli.js";import{p as Ue,o as Le,A as Oe,l as Pe,h as Ve,f as u,j as ze,a as P,t as f,b as v,c as Re,u as r,q as p,e as m,g as t,m as A,d as s,s as d,k as h,$ as qe,r as a,B as Tt,i as Fe,v as $t,D as Ut}from"../chunks/cPTQ2Ibn.js";import{i as g,s as Ge,a as He}from"../chunks/DqFqoVWr.js";import{e as Lt,i as Ot}from"../chunks/CiWDXYQd.js";import{d as j,c as nt,g as Pt,s as Vt}from"../chunks/DqbUkQgD.js";import{b as We}from"../chunks/Cwu7L3Xf.js";import{p as Je}from"../chunks/DVsSf1wv.js";import{g as zt}from"../chunks/CTvJf3dP.js";import{D as Ke}from"../chunks/91PQ6UtW.js";import{w as Qe}from"../chunks/BV_mDmfH.js";import{g as V,f as z}from"../chunks/ow_oMtSd.js";import{s as Rt,b as B,B as qt,d as Ft}from"../chunks/DJsB5Z5V.js";import{e as Xe}from"../chunks/BZiHL9L3.js";var Ye=u('

    Error

    '),Ze=u('

    Loading instance details...

    '),ta=u(' '),ea=u(' '),aa=u('-'),sa=u('
    Updated At:
    '),ra=u('
    '),da=u('
    Network Addresses:
    '),ia=u('
    Network Addresses:
    No addresses available
    '),na=u('
    OS Type:
    '),la=u('
    OS Name:
    '),oa=u('
    OS Version:
    '),va=u('
    OS Architecture:
    '),xa=u('

    '),ca=u('

    Status Messages

    '),ma=u('

    Status Messages

    No status messages available

    '),ua=u('

    Instance Information

    ID:
    Name:
    Provider ID:
    Provider:
    Pool/Scale Set:
    Agent ID:
    Created At:

    Status & Network

    Instance Status:
    Runner Status:
    ',1),ga=u('
    Instance not found.
    '),_a=u(' ',1);function Na(Gt,Ht){Ue(Ht,!1);const[Wt,Jt]=Ge(),lt=()=>He(Je,"$page",Wt),R=A();let e=A(null),q=A(!0),N=A(""),E=A(!1),T=null,$=A();async function Kt(){if(t(R))try{h(q,!0),h(N,""),h(e,await Pt.getInstance(t(R)))}catch(l){h(N,l instanceof Error?l.message:"Failed to load instance")}finally{h(q,!1)}}async function Qt(){if(t(e)){try{await Pt.deleteInstance(t(e).name),zt(j("/instances"))}catch(l){h(N,Xe(l))}h(E,!1)}}function Xt(l){if(t(e))if(l.operation==="update"&&l.payload.id===t(e).id){const b=t(e).status_messages?.length||0,D={...t(e),...l.payload},M=D.status_messages?.length||0;h(e,D),M>b&&setTimeout(()=>{Rt(t($))},100)}else l.operation==="delete"&&(l.payload.id||l.payload)===t(e).id&&zt(j("/instances"))}Le(()=>{Kt().then(()=>{t(e)?.status_messages?.length&&setTimeout(()=>{Rt(t($))},100)}),T=Qe.subscribeToEntity("instance",["update","delete"],Xt)}),Oe(()=>{T&&(T(),T=null)}),Pe(()=>lt(),()=>{h(R,decodeURIComponent(lt().params.id||""))}),Ve(),$e();var ot=_a();ze(l=>{f(()=>qe.title=`${t(e),r(()=>t(e)?`${t(e).name} - Instance Details`:"Instance Details")??""} - GARM`)});var F=P(ot),G=s(F),vt=s(G),H=s(vt),Yt=s(H);a(H);var xt=d(H,2),ct=s(xt),mt=d(s(ct),2),Zt=s(mt,!0);a(mt),a(ct),a(xt),a(vt),a(G);var ut=d(G,2);{var te=l=>{var b=Ye(),D=s(b),M=s(D),U=d(s(M),2),I=s(U,!0);a(U),a(M),a(D),a(b),f(()=>m(I,t(N))),v(l,b)};g(ut,l=>{t(N)&&l(te)})}var ee=d(ut,2);{var ae=l=>{var b=Ze();v(l,b)},se=l=>{var b=Tt(),D=P(b);{var M=I=>{var L=ua(),W=P(L),J=s(W),K=s(J),gt=d(s(K),2),ie=s(gt);a(gt),a(K);var _t=d(K,2),Q=s(_t),ft=d(s(Q),2),ne=s(ft,!0);a(ft),a(Q);var X=d(Q,2),yt=d(s(X),2),le=s(yt,!0);a(yt),a(X);var Y=d(X,2),pt=d(s(Y),2),oe=s(pt,!0);a(pt),a(Y);var Z=d(Y,2),ht=d(s(Z),2),ve=s(ht,!0);a(ht),a(Z);var tt=d(Z,2),bt=d(s(tt),2),xe=s(bt);{var ce=i=>{var n=ta(),o=s(n,!0);a(n),f(x=>{nt(n,"href",x),m(o,(t(e),r(()=>t(e).pool_id)))},[()=>(p(j),t(e),r(()=>j(`/pools/${t(e).pool_id}`)))]),v(i,n)},me=i=>{var n=Tt(),o=P(n);{var x=_=>{var y=ea(),S=s(y,!0);a(y),f(C=>{nt(y,"href",C),m(S,(t(e),r(()=>t(e).scale_set_id)))},[()=>(p(j),t(e),r(()=>j(`/scalesets/${t(e).scale_set_id}`)))]),v(_,y)},c=_=>{var y=aa();v(_,y)};g(o,_=>{t(e),r(()=>t(e).scale_set_id)?_(x):_(c,!1)},!0)}v(i,n)};g(xe,i=>{t(e),r(()=>t(e).pool_id)?i(ce):i(me,!1)})}a(bt),a(tt);var et=d(tt,2),kt=d(s(et),2),ue=s(kt,!0);a(kt),a(et);var at=d(et,2),wt=d(s(at),2),ge=s(wt,!0);a(wt),a(at);var _e=d(at,2);{var fe=i=>{var n=sa(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(c=>m(x,c),[()=>(p(B),t(e),r(()=>B(t(e).updated_at)))]),v(i,n)};g(_e,i=>{t(e),r(()=>t(e).updated_at&&t(e).updated_at!==t(e).created_at)&&i(fe)})}a(_t),a(J);var It=d(J,2),jt=d(s(It),2),st=s(jt),Dt=d(s(st),2),rt=s(Dt),ye=s(rt,!0);a(rt),a(Dt),a(st);var dt=d(st,2),St=d(s(dt),2),it=s(St),pe=s(it,!0);a(it),a(St),a(dt);var Mt=d(dt,2);{var he=i=>{var n=da(),o=d(s(n),2);Lt(o,5,()=>(t(e),r(()=>t(e).addresses)),Ot,(x,c)=>{var _=ra(),y=s(_),S=s(y,!0);a(y);var C=d(y,2);{let O=$t(()=>(t(c),r(()=>t(c).type||"Unknown")));qt(C,{variant:"info",get text(){return t(O)}})}a(_),f(()=>m(S,(t(c),r(()=>t(c).address)))),v(x,_)}),a(o),a(n),v(i,n)},be=i=>{var n=ia();v(i,n)};g(Mt,i=>{t(e),r(()=>t(e).addresses&&t(e).addresses.length>0)?i(he):i(be,!1)})}var At=d(Mt,2);{var ke=i=>{var n=na(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_type)))),v(i,n)};g(At,i=>{t(e),r(()=>t(e).os_type)&&i(ke)})}var Bt=d(At,2);{var we=i=>{var n=la(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_name)))),v(i,n)};g(Bt,i=>{t(e),r(()=>t(e).os_name)&&i(we)})}var Nt=d(Bt,2);{var Ie=i=>{var n=oa(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_version)))),v(i,n)};g(Nt,i=>{t(e),r(()=>t(e).os_version)&&i(Ie)})}var je=d(Nt,2);{var De=i=>{var n=va(),o=d(s(n),2),x=s(o,!0);a(o),a(n),f(()=>m(x,(t(e),r(()=>t(e).os_arch)))),v(i,n)};g(je,i=>{t(e),r(()=>t(e).os_arch)&&i(De)})}a(jt),a(It),a(W);var Se=d(W,2);{var Me=i=>{var n=ca(),o=d(s(n),2);Lt(o,5,()=>(t(e),r(()=>t(e).status_messages)),Ot,(x,c)=>{var _=xa(),y=s(_),S=s(y),C=s(S,!0);a(S);var O=d(S,2),Ct=s(O);{var Be=k=>{const w=$t(()=>(p(Ft),t(c),r(()=>Ft(t(c).event_level))));qt(k,{get variant(){return p(t(w)),r(()=>t(w).variant)},get text(){return p(t(w)),r(()=>t(w).text)}})};g(Ct,k=>{t(c),r(()=>t(c).event_level)&&k(Be)})}var Et=d(Ct,2),Ne=s(Et);{var Ce=k=>{var w=Ut();f(Te=>m(w,Te),[()=>(p(B),t(c),r(()=>B(t(c).created_at)))]),v(k,w)},Ee=k=>{var w=Ut("Unknown date");v(k,w)};g(Ne,k=>{t(c),r(()=>t(c).created_at)?k(Ce):k(Ee,!1)})}a(Et),a(O),a(y),a(_),f(()=>m(C,(t(c),r(()=>t(c).message)))),v(x,_)}),a(o),We(o,x=>h($,x),()=>t($)),a(n),v(i,n)},Ae=i=>{var n=ma();v(i,n)};g(Se,i=>{t(e),r(()=>t(e).status_messages&&t(e).status_messages.length>0)?i(Me):i(Ae,!1)})}f((i,n,o,x,c)=>{m(ne,(t(e),r(()=>t(e).id))),m(le,(t(e),r(()=>t(e).name))),m(oe,(t(e),r(()=>t(e).provider_id))),m(ve,(t(e),r(()=>t(e).provider_name||"Unknown"))),m(ue,(t(e),r(()=>t(e).agent_id||"Not assigned"))),m(ge,i),Vt(rt,1,`inline-flex px-2 py-1 text-xs font-semibold rounded-full ring-1 ring-inset ${n??""}`),m(ye,o),Vt(it,1,`inline-flex px-2 py-1 text-xs font-semibold rounded-full ring-1 ring-inset ${x??""}`),m(pe,c)},[()=>(p(B),t(e),r(()=>B(t(e).created_at))),()=>(p(V),t(e),r(()=>V(t(e).status||"unknown"))),()=>(p(z),t(e),r(()=>z(t(e).status||"unknown"))),()=>(p(V),t(e),r(()=>V(t(e).runner_status||"unknown"))),()=>(p(z),t(e),r(()=>z(t(e).runner_status||"unknown")))]),Fe("click",ie,()=>h(E,!0)),v(I,L)},U=I=>{var L=ga();v(I,L)};g(D,I=>{t(e)?I(M):I(U,!1)},!0)}v(l,b)};g(ee,l=>{t(q)?l(ae):l(se,!1)})}a(F);var re=d(F,2);{var de=l=>{Ke(l,{title:"Delete Instance",message:"Are you sure you want to delete this instance? This action cannot be undone.",get itemName(){return t(e),r(()=>t(e).name)},$$events:{close:()=>h(E,!1),confirm:Qt}})};g(re,l=>{t(E)&&t(e)&&l(de)})}f(l=>{nt(Yt,"href",l),m(Zt,(t(e),r(()=>t(e)?t(e).name:"Instance Details")))},[()=>(p(j),r(()=>j("/instances")))]),v(Gt,ot),Re(),Jt()}export{Na as component}; diff --git a/webapp/assets/_app/version.json b/webapp/assets/_app/version.json index fa30a894..0e32609e 100644 --- a/webapp/assets/_app/version.json +++ b/webapp/assets/_app/version.json @@ -1 +1 @@ -{"version":"1757451970280"} \ No newline at end of file +{"version":"1758549499990"} \ No newline at end of file diff --git a/webapp/assets/index.html b/webapp/assets/index.html index 83556c4a..67fe18d6 100644 --- a/webapp/assets/index.html +++ b/webapp/assets/index.html @@ -71,21 +71,21 @@ })(); - - - - - + + + + + - - - + + +
    + +
    \ No newline at end of file diff --git a/webapp/src/lib/components/ConfirmationModal.svelte b/webapp/src/lib/components/ConfirmationModal.svelte new file mode 100644 index 00000000..724ed09c --- /dev/null +++ b/webapp/src/lib/components/ConfirmationModal.svelte @@ -0,0 +1,74 @@ + + + dispatch('close')}> +
    +
    + {#if variant === 'danger'} + + + + {:else if variant === 'warning'} + + + + {:else} + + + + {/if} +
    + +
    +

    {title}

    +
    +

    {message}

    +
    +
    + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/webapp/src/lib/components/CreatePoolModal.svelte b/webapp/src/lib/components/CreatePoolModal.svelte index daf21f0a..e3028f04 100644 --- a/webapp/src/lib/components/CreatePoolModal.svelte +++ b/webapp/src/lib/components/CreatePoolModal.svelte @@ -1,12 +1,14 @@ @@ -31,20 +37,22 @@
    {#if onEdit} {/if} {#if onDelete} diff --git a/webapp/src/lib/components/InstancesSection.svelte b/webapp/src/lib/components/InstancesSection.svelte index 82e5ebfb..e72e2423 100644 --- a/webapp/src/lib/components/InstancesSection.svelte +++ b/webapp/src/lib/components/InstancesSection.svelte @@ -5,7 +5,7 @@ import { EntityCell, StatusCell, GenericCell, ActionsCell } from './cells'; export let instances: Instance[]; - export let entityType: 'repository' | 'organization' | 'enterprise' | 'scaleset'; + export let entityType: 'repository' | 'organization' | 'enterprise' | 'scaleset' | 'pool'; export let onDeleteInstance: (instance: Instance) => void; // DataTable configuration for instances section diff --git a/webapp/src/lib/components/MobileCard.svelte b/webapp/src/lib/components/MobileCard.svelte index 4610ee0f..9d59b144 100644 --- a/webapp/src/lib/components/MobileCard.svelte +++ b/webapp/src/lib/components/MobileCard.svelte @@ -8,12 +8,13 @@ const dispatch = createEventDispatcher<{ edit: { item: any }; delete: { item: any }; + clone: { item: any }; action: { type: string; item: any }; }>(); export let item: any; export let config: { - entityType: 'repository' | 'organization' | 'enterprise' | 'instance' | 'pool' | 'scaleset' | 'credential' | 'endpoint'; + entityType: 'repository' | 'organization' | 'enterprise' | 'instance' | 'pool' | 'scaleset' | 'credential' | 'endpoint' | 'template'; primaryText: { field: string; isClickable?: boolean; @@ -33,7 +34,7 @@ icon?: boolean; }>; actions?: Array<{ - type: 'edit' | 'delete'; + type: 'edit' | 'delete' | 'clone'; handler: (item: any) => void; }>; customInfo?: Array<{ @@ -86,7 +87,7 @@ href = href.replace('{id}', item.id || ''); href = href.replace('{name}', encodeURIComponent(item.name || '')); - return resolve(href); + return resolve(href as any); } function handleAction(actionType: string) { @@ -102,6 +103,8 @@ dispatch('edit', { item }); } else if (actionType === 'delete') { dispatch('delete', { item }); + } else if (actionType === 'clone') { + dispatch('clone', { item }); } else { dispatch('action', { type: actionType, item }); } @@ -237,10 +240,10 @@
    {#each config.actions as action} handleAction(action.type)} /> {/each} diff --git a/webapp/src/lib/components/Navigation.svelte b/webapp/src/lib/components/Navigation.svelte index d4d9a721..60180574 100644 --- a/webapp/src/lib/components/Navigation.svelte +++ b/webapp/src/lib/components/Navigation.svelte @@ -3,63 +3,34 @@ import { resolve } from '$app/paths'; import { auth, authStore } from '$lib/stores/auth.js'; import { websocketStore } from '$lib/stores/websocket.js'; + import { themeStore } from '$lib/stores/theme.js'; import { onMount } from 'svelte'; let mobileMenuOpen = false; let userMenuOpen = false; - let darkMode = false; // WebSocket connection status $: wsState = $websocketStore; + $: darkMode = $themeStore; // Close mobile menu when route changes $: $page.url.pathname && (mobileMenuOpen = false); onMount(() => { - // Initialize theme preference - initializeTheme(); - - // Listen for system theme changes + // Listen for system theme changes - theme store handles initialization const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); mediaQuery.addEventListener('change', handleSystemThemeChange); }); - function initializeTheme() { - const savedTheme = localStorage.getItem('theme'); - - if (savedTheme === 'dark') { - darkMode = true; - } else if (savedTheme === 'light') { - darkMode = false; - } else { - // No saved preference or 'system' - use system preference - darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; - } - - updateDarkMode(); - } - function handleSystemThemeChange(e: MediaQueryListEvent) { // Only update if user hasn't set a manual preference if (!localStorage.getItem('theme') || localStorage.getItem('theme') === 'system') { - darkMode = e.matches; - updateDarkMode(); + themeStore.set(e.matches); } } function toggleDarkMode() { - darkMode = !darkMode; - // Save explicit preference - localStorage.setItem('theme', darkMode ? 'dark' : 'light'); - updateDarkMode(); - } - - function updateDarkMode() { - if (darkMode) { - document.documentElement.classList.add('dark'); - } else { - document.documentElement.classList.remove('dark'); - } + themeStore.toggle(); } function handleLogout() { @@ -116,6 +87,11 @@ href: resolve('/endpoints'), label: 'Endpoints', icon: 'M13 10V3L4 14h7v7l9-11h-7z' + }, + { + href: resolve('/templates'), + label: 'Runner Install Templates', + icon: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z' } ]; @@ -131,12 +107,12 @@
    GARM @@ -268,12 +244,12 @@
    GARM GARM diff --git a/webapp/src/lib/components/UpdatePoolModal.svelte b/webapp/src/lib/components/UpdatePoolModal.svelte index 8da84670..ed1546c0 100644 --- a/webapp/src/lib/components/UpdatePoolModal.svelte +++ b/webapp/src/lib/components/UpdatePoolModal.svelte @@ -1,10 +1,12 @@ diff --git a/webapp/src/routes/init/+page.svelte b/webapp/src/routes/init/+page.svelte index 848beba6..3c7d041d 100644 --- a/webapp/src/routes/init/+page.svelte +++ b/webapp/src/routes/init/+page.svelte @@ -107,12 +107,12 @@
    GARM diff --git a/webapp/src/routes/login/+page.svelte b/webapp/src/routes/login/+page.svelte index 6fdfac81..fb79ab8c 100644 --- a/webapp/src/routes/login/+page.svelte +++ b/webapp/src/routes/login/+page.svelte @@ -76,12 +76,12 @@
    GARM diff --git a/webapp/src/routes/pools/[id]/+page.svelte b/webapp/src/routes/pools/[id]/+page.svelte index 6469afcf..ab8107e5 100644 --- a/webapp/src/routes/pools/[id]/+page.svelte +++ b/webapp/src/routes/pools/[id]/+page.svelte @@ -1,6 +1,6 @@ + + + Runner Install Templates - GARM + + + + +{#if (error || cacheError) && !loading} +
    +
    +
    + + + +
    +
    +

    + Error loading templates +

    +
    + {error || cacheError} +
    +
    + + Try Again + +
    +
    +
    +
    +{/if} + + { searchTerm = e.detail.term; currentPage = 1; }} + on:pageChange={(e) => currentPage = e.detail.page} + on:perPageChange={(e) => { perPage = e.detail.perPage; currentPage = 1; }} + on:clone={(e) => openCloneModal(e.detail.item)} + on:edit={(e) => goto(resolve(`/templates/${e.detail.item.id}?edit=true`))} + on:delete={(e) => openDeleteModal(e.detail.item)} + emptyMessage="No templates found" +> + + {#if column.key === 'forge_type'} + {@const badgeInfo = getForgeTypeBadge(item.forge_type)} + + {:else if column.key === 'os_type'} + {@const badgeInfo = getOSTypeBadge(item.os_type)} + + {:else if column.key === 'owner_id'} + {item.owner_id === 'system' ? 'System' : (item.owner_id || 'Unknown')} + {/if} + + + + + +{#if showDeleteModal && selectedTemplate} + { showDeleteModal = false; selectedTemplate = null; }} + on:confirm={handleDeleteTemplate} + /> +{/if} \ No newline at end of file diff --git a/webapp/src/routes/templates/[id]/+page.svelte b/webapp/src/routes/templates/[id]/+page.svelte new file mode 100644 index 00000000..8afbed06 --- /dev/null +++ b/webapp/src/routes/templates/[id]/+page.svelte @@ -0,0 +1,723 @@ + + + + {template?.name || 'Template'} - GARM + + +{#if loading} +
    +
    + Loading template... +
    +{:else if error && !template} +
    +
    +
    + + + +
    +
    +

    + Error loading template +

    +
    + {error} +
    +
    + + Try Again + + + Back to Templates + +
    +
    +
    +
    +{:else if template} + {@const isAdmin = isCurrentUserAdmin()} + {@const isSystemTemplate = template.owner_id === 'system'} + {@const canEdit = isAdmin || !isSystemTemplate} + {@const canDelete = isAdmin || !isSystemTemplate} + + + showDeleteModal = true : null)} + editLabel={editMode ? 'Close' : 'Edit'} + deleteLabel={editMode ? 'Save Changes' : 'Delete'} + editVariant={editMode ? 'secondary' : 'secondary'} + deleteVariant={editMode ? 'primary' : 'danger'} + deleteDisabled={editMode ? !canSave : false} + editIcon={editMode ? "" : ""} + deleteIcon={editMode ? "" : ""} + /> + + +
    + +
    +
    +

    + Template Information +

    + + {#if editMode} +
    +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    + + Forge Type + + {#if template.forge_type} + {@const badgeInfo = getForgeTypeBadge(template.forge_type)} + + {/if} +

    Cannot be changed

    +
    + +
    + + OS Type + + {#if template.os_type} + {@const badgeInfo = getOSTypeBadge(template.os_type)} + + {/if} +

    Cannot be changed

    +
    +
    +
    + {:else} +
    +
    +
    Name
    +
    {template.name || 'Unnamed Template'}
    +
    + +
    +
    Description
    +
    {template.description || 'No description'}
    +
    + +
    +
    Forge Type
    +
    + {#if template.forge_type} + {@const badgeInfo = getForgeTypeBadge(template.forge_type)} + + {/if} +
    +
    + +
    +
    OS Type
    +
    + {#if template.os_type} + {@const badgeInfo = getOSTypeBadge(template.os_type)} + + {/if} +
    +
    + +
    +
    Owner
    +
    + {template.owner_id === 'system' ? 'System' : (template.owner_id || 'Unknown')} +
    +
    + +
    +
    Template ID
    +
    {template.id}
    +
    + + {#if template.created_at} +
    +
    Created
    +
    + {new Date(template.created_at).toLocaleDateString()} +
    +
    + {/if} + + {#if template.updated_at} +
    +
    Last Updated
    +
    + {new Date(template.updated_at).toLocaleDateString()} +
    +
    + {/if} +
    + {/if} +
    +
    + + +
    +
    +
    +

    + Template Content +

    + {#if editMode} +
    + + +
    + {/if} +
    + + {#if editMode} + +
    +

    + Available Template Variables +

    +

    + Your template can use the following variables using Go template syntax (e.g., {'{{ .RunnerName }}'}): +

    +
    +
    +
    Runner Info
    +
      +
    • .RunnerName - Runner name
    • +
    • .RunnerLabels - Comma separated labels
    • +
    • .RunnerUsername - Runner service username
    • +
    • .RunnerGroup - Runner service group
    • +
    • .GitHubRunnerGroup - GitHub runner group
    • +
    +
    +
    +
    Download & Install
    +
      +
    • .FileName - Download file name
    • +
    • .DownloadURL - Runner download URL
    • +
    • .TempDownloadToken - Download token
    • +
    • .RepoURL - Repository URL
    • +
    +
    +
    +
    Configuration
    +
      +
    • .MetadataURL - Instance metadata URL
    • +
    • .CallbackURL - Status callback URL
    • +
    • .CallbackToken - Callback token
    • +
    • .CABundle - CA certificate bundle
    • +
    • .EnableBootDebug - Enable debug mode
    • +
    • .UseJITConfig - Use JIT configuration
    • +
    • .ExtraContext - Additional context map
    • +
    +
    +
    +

    + 💡 Tip: Use {'{{if .CABundle}}...{{end}}'} for conditional content, or {'{{range $key, $value := .ExtraContext}}{{$key}}: {{$value}}{{end}}'} to iterate over extra context. +

    +
    + {/if} + + {#if editMode} +
    + editTemplateContent = e.detail.value} + /> +

    + Template content should be a {template.os_type === 'windows' ? 'PowerShell' : 'bash'} script for runner installation and configuration on {template.os_type}. +

    +
    + {:else} +
    +
    + +
    +
    + +
    + {/if} +
    +
    +
    +{/if} + + +{#if showDeleteModal && template} +
    +
    +
    +
    + + + +
    +

    + Delete Template +

    +
    +

    + Are you sure you want to delete the template "{template.name}"? This action cannot be undone. +

    +
    +
    + showDeleteModal = false} + > + Cancel + + + Delete + +
    +
    +
    +
    +{/if} + + +{#if showUnsavedChangesModal} + showUnsavedChangesModal = false} + on:confirm={discardChanges} + /> +{/if} \ No newline at end of file diff --git a/webapp/src/routes/templates/create/+page.svelte b/webapp/src/routes/templates/create/+page.svelte new file mode 100644 index 00000000..54a6ae7f --- /dev/null +++ b/webapp/src/routes/templates/create/+page.svelte @@ -0,0 +1,513 @@ + + + + {cloneTemplate ? `Clone ${cloneTemplate.name}` : 'Create Template'} - GARM + + +{#if loading} +
    +
    + Loading... +
    +{:else} + + + +
    + +
    +
    +

    + Template Information +

    + +
    +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +

    + Template Content +

    +
    + + + +
    +
    + + + + + +
    +

    + Available Template Variables +

    +

    + Your template can use the following variables using Go template syntax (e.g., {'{{ .RunnerName }}'}): +

    +
    +
    +
    Runner Info
    +
      +
    • .RunnerName - Runner name
    • +
    • .RunnerLabels - Comma separated labels
    • +
    • .RunnerUsername - Runner service username
    • +
    • .RunnerGroup - Runner service group
    • +
    • .GitHubRunnerGroup - GitHub runner group
    • +
    +
    +
    +
    Download & Install
    +
      +
    • .FileName - Download file name
    • +
    • .DownloadURL - Runner download URL
    • +
    • .TempDownloadToken - Download token
    • +
    • .RepoURL - Repository URL
    • +
    +
    +
    +
    Configuration
    +
      +
    • .MetadataURL - Instance metadata URL
    • +
    • .CallbackURL - Status callback URL
    • +
    • .CallbackToken - Callback token
    • +
    • .CABundle - CA certificate bundle
    • +
    • .EnableBootDebug - Enable debug mode
    • +
    • .UseJITConfig - Use JIT configuration
    • +
    • .ExtraContext - Additional context map
    • +
    +
    +
    +

    + 💡 Tip: Use {'{{if .CABundle}}...{{end}}'} for conditional content, or {'{{range $key, $value := .ExtraContext}}{{$key}}: {{$value}}{{end}}'} to iterate over extra context. +

    +
    + +
    + createTemplateContent = e.detail.value} + /> +

    + Template content should be a {createForm.os_type === 'windows' ? 'PowerShell' : 'bash'} script for runner installation and configuration on {createForm.os_type}. +

    +
    +
    +
    +
    +{/if} + + +{#if showUnsavedChangesModal} + showUnsavedChangesModal = false} + on:confirm={discardChanges} + /> +{/if} \ No newline at end of file diff --git a/webapp/src/test/factories.ts b/webapp/src/test/factories.ts index db340b71..ca282158 100644 --- a/webapp/src/test/factories.ts +++ b/webapp/src/test/factories.ts @@ -1,4 +1,4 @@ -import type { Repository, Organization, Enterprise, Instance, Pool, ScaleSet, ForgeCredentials, EndpointType, ForgeEndpoint } from '$lib/api/generated/api.js'; +import type { Repository, Organization, Enterprise, Instance, Pool, ScaleSet, ForgeCredentials, ForgeEndpoint, Tag } from '$lib/api/generated/api.js'; export function createMockRepository(overrides: Partial = {}): Repository { return { @@ -12,18 +12,18 @@ export function createMockRepository(overrides: Partial = {}): Repos credentials: createMockCredentials(), endpoint: { name: 'github.com', - endpoint_type: 'github' as EndpointType, + endpoint_type: 'github', description: 'GitHub endpoint', api_base_url: 'https://api.github.com', base_url: 'https://github.com', upload_base_url: 'https://uploads.github.com', - ca_cert_bundle: null, + ca_cert_bundle: undefined, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z' }, pool_manager_status: { running: true, - failure_reason: null + failure_reason: undefined }, ...overrides }; @@ -34,7 +34,6 @@ export function createMockCredentials(overrides: Partial = {}) id: Math.floor(Math.random() * 10000), name: 'test-credentials', description: 'Test credentials', - endpoint_name: 'github.com', created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z', ...overrides @@ -45,12 +44,12 @@ export function createMockGiteaRepository(overrides: Partial = {}): return createMockRepository({ endpoint: { name: 'gitea.example.com', - endpoint_type: 'gitea' as EndpointType, + endpoint_type: 'gitea', description: 'Gitea endpoint', api_base_url: 'https://gitea.example.com/api/v1', base_url: 'https://gitea.example.com', - upload_base_url: null, - ca_cert_bundle: null, + upload_base_url: undefined, + ca_cert_bundle: undefined, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z' }, @@ -69,18 +68,18 @@ export function createMockOrganization(overrides: Partial = {}): O credentials: createMockCredentials(), endpoint: { name: 'github.com', - endpoint_type: 'github' as EndpointType, + endpoint_type: 'github', description: 'GitHub endpoint', api_base_url: 'https://api.github.com', base_url: 'https://github.com', upload_base_url: 'https://uploads.github.com', - ca_cert_bundle: null, + ca_cert_bundle: undefined, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z' }, pool_manager_status: { running: true, - failure_reason: null + failure_reason: undefined }, ...overrides }; @@ -90,12 +89,12 @@ export function createMockGiteaOrganization(overrides: Partial = { return createMockOrganization({ endpoint: { name: 'gitea.example.com', - endpoint_type: 'gitea' as EndpointType, + endpoint_type: 'gitea', description: 'Gitea endpoint', api_base_url: 'https://gitea.example.com/api/v1', base_url: 'https://gitea.example.com', - upload_base_url: null, - ca_cert_bundle: null, + upload_base_url: undefined, + ca_cert_bundle: undefined, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z' }, @@ -114,18 +113,18 @@ export function createMockEnterprise(overrides: Partial = {}): Enter credentials: createMockCredentials(), endpoint: { name: 'github.com', - endpoint_type: 'github' as EndpointType, + endpoint_type: 'github', description: 'GitHub endpoint', api_base_url: 'https://api.github.com', base_url: 'https://github.com', upload_base_url: 'https://uploads.github.com', - ca_cert_bundle: null, + ca_cert_bundle: undefined, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z' }, pool_manager_status: { running: true, - failure_reason: null + failure_reason: undefined }, ...overrides }; @@ -147,7 +146,7 @@ export function createMockPool(overrides: Partial = {}): Pool { provider_name: 'test-provider', runner_bootstrap_timeout: 20, runner_prefix: 'garm', - tags: ['ubuntu', 'test'], + tags: [{ id: 'ubuntu', name: 'ubuntu' }, { id: 'test', name: 'test' }] as Tag[], repo_id: 'repo-123', ...overrides }; @@ -182,7 +181,7 @@ export function createMockForgeEndpoint(overrides: Partial = {}): base_url: 'https://github.com', api_base_url: 'https://api.github.com', upload_base_url: 'https://uploads.github.com', - ca_cert_bundle: null, + ca_cert_bundle: undefined, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z', ...overrides @@ -196,7 +195,7 @@ export function createMockGiteaEndpoint(overrides: Partial = {}): endpoint_type: 'gitea', base_url: 'https://gitea.example.com', api_base_url: 'https://gitea.example.com/api/v1', - upload_base_url: null, + upload_base_url: undefined, ...overrides }); } @@ -245,12 +244,12 @@ export function createMockScaleSet(overrides: Partial = {}): ScaleSet extra_specs: {}, endpoint: { name: 'github.com', - endpoint_type: 'github' as EndpointType, + endpoint_type: 'github', description: 'GitHub endpoint', api_base_url: 'https://api.github.com', base_url: 'https://github.com', upload_base_url: 'https://uploads.github.com', - ca_cert_bundle: null, + ca_cert_bundle: undefined, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z' }, diff --git a/webapp/swagger.yaml b/webapp/swagger.yaml index 5cba229e..6b3d69bd 100644 --- a/webapp/swagger.yaml +++ b/webapp/swagger.yaml @@ -263,6 +263,10 @@ definitions: type: string type: array x-go-name: Tags + template_id: + format: uint64 + type: integer + x-go-name: TemplateID type: object x-go-package: github.com/cloudbase/garm/params CreateRepoParams: @@ -343,6 +347,30 @@ definitions: type: string type: array x-go-name: Tags + template_id: + format: uint64 + type: integer + x-go-name: TemplateID + type: object + x-go-package: github.com/cloudbase/garm/params + CreateTemplateParams: + properties: + data: + items: + format: uint8 + type: integer + type: array + x-go-name: Data + description: + type: string + x-go-name: Description + forge_type: + $ref: '#/definitions/EndpointType' + name: + type: string + x-go-name: Name + os_type: + $ref: '#/definitions/OSType' type: object x-go-package: github.com/cloudbase/garm/params Credentials: @@ -1045,6 +1073,13 @@ definitions: $ref: '#/definitions/Tag' type: array x-go-name: Tags + template_id: + format: uint64 + type: integer + x-go-name: TemplateID + template_name: + type: string + x-go-name: TemplateName updated_at: format: date-time type: string @@ -1262,6 +1297,13 @@ definitions: $ref: '#/definitions/StatusMessage' type: array x-go-name: StatusMessages + template_id: + format: uint64 + type: integer + x-go-name: TemplateID + template_name: + type: string + x-go-name: TemplateName updated_at: format: date-time type: string @@ -1302,6 +1344,47 @@ definitions: x-go-name: Name type: object x-go-package: github.com/cloudbase/garm/params + Template: + properties: + created_at: + format: date-time + type: string + x-go-name: CreatedAt + data: + items: + format: uint8 + type: integer + type: array + x-go-name: Data + description: + type: string + x-go-name: Description + forge_type: + $ref: '#/definitions/EndpointType' + id: + format: uint64 + type: integer + x-go-name: ID + name: + type: string + x-go-name: Name + os_type: + $ref: '#/definitions/OSType' + owner_id: + type: string + x-go-name: Owner + updated_at: + format: date-time + type: string + x-go-name: UpdatedAt + type: object + x-go-package: github.com/cloudbase/garm/params + Templates: + description: used by swagger client generated code + items: + $ref: '#/definitions/Template' + type: array + x-go-package: github.com/cloudbase/garm/params UpdateControllerParams: properties: callback_url: @@ -1447,6 +1530,10 @@ definitions: type: string type: array x-go-name: Tags + template_id: + format: uint64 + type: integer + x-go-name: TemplateID type: object x-go-package: github.com/cloudbase/garm/params UpdateScaleSetParams: @@ -1497,6 +1584,26 @@ definitions: x-go-name: Prefix state: $ref: '#/definitions/ScaleSetState' + template_id: + format: uint64 + type: integer + x-go-name: TemplateID + type: object + x-go-package: github.com/cloudbase/garm/params + UpdateTemplateParams: + properties: + data: + items: + format: uint8 + type: integer + type: array + x-go-name: Data + description: + type: string + x-go-name: Description + name: + type: string + x-go-name: Name type: object x-go-package: github.com/cloudbase/garm/params User: @@ -3456,6 +3563,122 @@ paths: summary: List runner instances in a scale set. tags: - instances + /templates: + get: + operationId: ListTemplates + parameters: + - description: OS type of the templates. + in: query + name: osType + type: string + - description: Partial or full name of the template. + in: query + name: partialName + type: string + - description: Forge type of the templates. + in: query + name: forgeType + type: string + responses: + "200": + description: Templates + schema: + $ref: '#/definitions/Templates' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: List templates. + tags: + - templates + post: + operationId: CreateTemplate + parameters: + - description: Parameters used when creating the template. + in: body + name: Body + required: true + schema: + $ref: '#/definitions/CreateTemplateParams' + description: Parameters used when creating the template. + type: object + responses: + "200": + description: Template + schema: + $ref: '#/definitions/Template' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Create template with the parameters given. + tags: + - templates + /templates/{templateID}: + delete: + operationId: DeleteTemplate + parameters: + - description: ID of the template to delete. + in: path + name: templateID + required: true + type: number + responses: + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Get template by ID. + tags: + - templates + get: + operationId: GetTemplate + parameters: + - description: ID of the template to fetch. + in: path + name: templateID + required: true + type: number + responses: + "200": + description: Template + schema: + $ref: '#/definitions/Template' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Get template by ID. + tags: + - templates + put: + operationId: UpdateTemplate + parameters: + - description: ID of the template to update. + in: path + name: templateID + required: true + type: string + - description: Parameters used when updating the template. + in: body + name: Body + required: true + schema: + $ref: '#/definitions/UpdateTemplateParams' + description: Parameters used when updating the template. + type: object + responses: + "200": + description: Template + schema: + $ref: '#/definitions/Template' + default: + description: APIErrorResponse + schema: + $ref: '#/definitions/APIErrorResponse' + summary: Update template with the parameters given. + tags: + - templates produces: - application/json security: diff --git a/workers/cache/cache.go b/workers/cache/cache.go index 3b387f50..be994194 100644 --- a/workers/cache/cache.go +++ b/workers/cache/cache.go @@ -207,6 +207,15 @@ func (w *Worker) Start() error { g, _ := errgroup.WithContext(w.ctx) + g.Go(func() error { + ctrlInfo, err := w.store.ControllerInfo() + if err != nil { + return fmt.Errorf("failed to get controller info: %w", err) + } + cache.SetControllerCache(ctrlInfo) + return nil + }) + g.Go(func() error { if err := w.loadAllGithubCredentials(); err != nil { return fmt.Errorf("loading all github credentials: %w", err) @@ -391,6 +400,20 @@ func (w *Worker) handleInstanceEvent(event common.ChangePayload) { } } +func (w *Worker) handleTemplateEvent(event common.ChangePayload) { + template, ok := event.Payload.(params.Template) + if !ok { + slog.DebugContext(w.ctx, "invalid payload type for template event", "payload", event.Payload) + return + } + switch event.Operation { + case common.CreateOperation, common.UpdateOperation: + cache.SetTemplateCache(template) + case common.DeleteOperation: + cache.DeleteTemplate(template.ID) + } +} + func (w *Worker) handleCredentialsEvent(event common.ChangePayload) { credentials, ok := event.Payload.(params.ForgeCredentials) if !ok { @@ -420,6 +443,15 @@ func (w *Worker) handleCredentialsEvent(event common.ChangePayload) { } } +func (w *Worker) handleControllerInfoEvent(event common.ChangePayload) { + ctrlInfo, ok := event.Payload.(params.ControllerInfo) + if !ok { + slog.DebugContext(w.ctx, "invalid payload type for controller info event event", "payload", event.Payload) + return + } + cache.SetControllerCache(ctrlInfo) +} + func (w *Worker) handleEvent(event common.ChangePayload) { slog.DebugContext(w.ctx, "handling event", "event_entity_type", event.EntityType, "event_operation", event.Operation) switch event.EntityType { @@ -437,6 +469,10 @@ func (w *Worker) handleEvent(event common.ChangePayload) { w.handleEnterpriseEvent(event) case common.GithubCredentialsEntityType, common.GiteaCredentialsEntityType: w.handleCredentialsEvent(event) + case common.ControllerEntityType: + w.handleControllerInfoEvent(event) + case common.TemplateEntityType: + w.handleTemplateEvent(event) default: slog.DebugContext(w.ctx, "unknown entity type", "entity_type", event.EntityType) } diff --git a/workers/provider/instance_manager.go b/workers/provider/instance_manager.go index a77192f5..e3da0979 100644 --- a/workers/provider/instance_manager.go +++ b/workers/provider/instance_manager.go @@ -166,6 +166,17 @@ func (i *instanceManager) handleCreateInstanceInProvider(instance params.Instanc return fmt.Errorf("tools not found in cache for entity %s: %w", entity.String(), err) } + if i.scaleSet.TemplateID == 0 { + cloudConfigSpecs, err := garmUtil.GetCloudConfigSpecFromExtraSpecs(i.scaleSet.ExtraSpecs) + if err != nil { + return fmt.Errorf("pool has no template set and extra specs are invalid: %w", err) + } + if len(cloudConfigSpecs.RunnerInstallTemplate) == 0 { + return fmt.Errorf("pool has no template set and extra specs has no runner_install_template set") + } + } + specs := garmUtil.MaybeAddWrapperToExtraSpecs(i.ctx, i.scaleSet.ExtraSpecs, i.scaleSet.OSType, instance.MetadataURL, token) + bootstrapArgs := commonParams.BootstrapInstance{ Name: instance.Name, Tools: tools, @@ -177,7 +188,7 @@ func (i *instanceManager) handleCreateInstanceInProvider(instance params.Instanc OSType: i.scaleSet.OSType, Flavor: i.scaleSet.Flavor, Image: i.scaleSet.Image, - ExtraSpecs: i.scaleSet.ExtraSpecs, + ExtraSpecs: specs, // This is temporary. We need to extend providers to know about scale sets. PoolID: i.pseudoPoolID(), CACertBundle: entity.Credentials.CABundle, diff --git a/workers/websocket/events/params.go b/workers/websocket/events/params.go index a2b996a9..fb93f7db 100644 --- a/workers/websocket/events/params.go +++ b/workers/websocket/events/params.go @@ -27,7 +27,8 @@ func (f Filter) Validate() error { case common.RepositoryEntityType, common.OrganizationEntityType, common.EnterpriseEntityType, common.PoolEntityType, common.UserEntityType, common.InstanceEntityType, common.JobEntityType, common.ControllerEntityType, common.GithubCredentialsEntityType, - common.GiteaCredentialsEntityType, common.ScaleSetEntityType, common.GithubEndpointEntityType: + common.GiteaCredentialsEntityType, common.ScaleSetEntityType, common.GithubEndpointEntityType, + common.TemplateEntityType: default: return common.ErrInvalidEntityType }